[pypy-commit] pypy slim-down-resumedescr: yet another attempt - dont allocate descrs for not emitted guards at all
fijal
noreply at buildbot.pypy.org
Thu Dec 25 13:28:03 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: slim-down-resumedescr
Changeset: r75111:cd94f2a8fe4a
Date: 2014-12-25 14:27 +0200
http://bitbucket.org/pypy/pypy/changeset/cd94f2a8fe4a/
Log: yet another attempt - dont allocate descrs for not emitted guards at
all (this nicely solves some nasty optimizeopt test questions in
addition to being slightly better)
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -130,8 +130,8 @@
[ResOperation(rop.LABEL, jumpargs, None, descr=jitcell_token)]
try:
- start_state = optimize_trace(metainterp_sd, part, enable_opts,
- export_state=True)
+ start_state = optimize_trace(metainterp_sd, jitdriver_sd, part,
+ enable_opts, export_state=True)
except InvalidLoop:
return None
target_token = part.operations[0].getdescr()
@@ -158,7 +158,7 @@
jumpargs = part.operations[-1].getarglist()
try:
- optimize_trace(metainterp_sd, part, enable_opts,
+ optimize_trace(metainterp_sd, jitdriver_sd, part, enable_opts,
start_state=start_state, export_state=False)
except InvalidLoop:
return None
@@ -211,7 +211,8 @@
orignial_label = label.clone()
assert label.getopnum() == rop.LABEL
try:
- optimize_trace(metainterp_sd, part, jitdriver_sd.warmstate.enable_opts,
+ optimize_trace(metainterp_sd, jitdriver_sd, part,
+ jitdriver_sd.warmstate.enable_opts,
start_state=start_state, export_state=False)
except InvalidLoop:
# Fall back on jumping to preamble
@@ -221,7 +222,7 @@
[ResOperation(rop.JUMP, inputargs[:],
None, descr=loop_jitcell_token)]
try:
- optimize_trace(metainterp_sd, part,
+ optimize_trace(metainterp_sd, jitdriver_sd, part,
jitdriver_sd.warmstate.enable_opts,
inline_short_preamble=False, start_state=start_state,
export_state=False)
@@ -496,11 +497,6 @@
status = r_uint(0)
- def clone(self):
- new = self.__class__()
- new.rd_frame_info_list = self.rd_frame_info_list
- return new
-
def copy_all_attributes_from(self, other):
assert isinstance(other, ResumeGuardDescr)
self.rd_count = other.rd_count
@@ -712,12 +708,6 @@
self.metainterp_sd = metainterp_sd
self.jitdriver_sd = jitdriver_sd
- def clone(self):
- new = ResumeGuardForcedDescr()
- new._init(self.metainterp_sd, self.jitdriver_sd)
- new.rd_frame_info_list = self.rd_frame_info_list
- return new
-
def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
# Failures of a GUARD_NOT_FORCED are never compiled, but
# always just blackholed. First fish for the data saved when
@@ -775,6 +765,41 @@
hidden_all_virtuals = obj.hide(metainterp_sd.cpu)
metainterp_sd.cpu.set_savedata_ref(deadframe, hidden_all_virtuals)
+def invent_fail_descr_for_op(op, optimizer):
+ opnum = op.getopnum()
+ if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2:
+ resumedescr = ResumeGuardForcedDescr()
+ resumedescr._init(optimizer.metainterp_sd, optimizer.jitdriver_sd)
+ elif opnum == rop.GUARD_NOT_INVALIDATED:
+ resumedescr = ResumeGuardNotInvalidated()
+ elif opnum == rop.GUARD_FUTURE_CONDITION:
+ resumedescr = ResumeAtPositionDescr()
+ elif opnum == rop.GUARD_VALUE:
+ resumedescr = ResumeGuardValueDescr()
+ elif opnum == rop.GUARD_NONNULL:
+ resumedescr = ResumeGuardNonnullDescr()
+ elif opnum == rop.GUARD_ISNULL:
+ resumedescr = ResumeGuardIsnullDescr()
+ elif opnum == rop.GUARD_NONNULL_CLASS:
+ resumedescr = ResumeGuardNonnullClassDescr()
+ elif opnum == rop.GUARD_CLASS:
+ resumedescr = ResumeGuardClassDescr()
+ elif opnum == rop.GUARD_TRUE:
+ resumedescr = ResumeGuardTrueDescr()
+ elif opnum == rop.GUARD_FALSE:
+ resumedescr = ResumeGuardFalseDescr()
+ elif opnum == rop.GUARD_EXCEPTION:
+ resumedescr = ResumeGuardExceptionDescr()
+ elif opnum == rop.GUARD_NO_EXCEPTION:
+ resumedescr = ResumeGuardNoExceptionDescr()
+ elif opnum == rop.GUARD_OVERFLOW:
+ resumedescr = ResumeGuardOverflowDescr()
+ elif opnum == rop.GUARD_NO_OVERFLOW:
+ resumedescr = ResumeGuardNoOverflowDescr()
+ else:
+ assert False
+ return resumedescr
+
class ResumeFromInterpDescr(ResumeDescr):
def __init__(self, original_greenkey):
self.original_greenkey = original_greenkey
@@ -813,13 +838,15 @@
new_trace.operations = [op.clone() for op in metainterp.history.operations]
metainterp_sd = metainterp.staticdata
- state = metainterp.jitdriver_sd.warmstate
+ jitdriver_sd = metainterp.jitdriver_sd
+ state = jitdriver_sd.warmstate
if isinstance(resumekey, ResumeAtPositionDescr):
inline_short_preamble = False
else:
inline_short_preamble = True
try:
- state = optimize_trace(metainterp_sd, new_trace, state.enable_opts,
+ state = optimize_trace(metainterp_sd, jitdriver_sd, new_trace,
+ state.enable_opts,
inline_short_preamble, export_state=True)
except InvalidLoop:
debug_print("compile_new_bridge: got an InvalidLoop")
diff --git a/rpython/jit/metainterp/jitexc.py b/rpython/jit/metainterp/jitexc.py
--- a/rpython/jit/metainterp/jitexc.py
+++ b/rpython/jit/metainterp/jitexc.py
@@ -41,6 +41,8 @@
class ExitFrameWithExceptionRef(JitException):
def __init__(self, cpu, value):
+ import pdb
+ pdb.set_trace()
assert lltype.typeOf(value) == cpu.ts.BASETYPE
self.value = value
def __str__(self):
diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py b/rpython/jit/metainterp/optimizeopt/__init__.py
--- a/rpython/jit/metainterp/optimizeopt/__init__.py
+++ b/rpython/jit/metainterp/optimizeopt/__init__.py
@@ -47,7 +47,7 @@
return optimizations, unroll
-def optimize_trace(metainterp_sd, loop, enable_opts,
+def optimize_trace(metainterp_sd, jitdriver_sd, loop, enable_opts,
inline_short_preamble=True, start_state=None,
export_state=True):
"""Optimize loop.operations to remove internal overheadish operations.
@@ -59,11 +59,13 @@
loop.operations)
optimizations, unroll = build_opt_chain(metainterp_sd, enable_opts)
if unroll:
- return optimize_unroll(metainterp_sd, loop, optimizations,
+ return optimize_unroll(metainterp_sd, jitdriver_sd, loop,
+ optimizations,
inline_short_preamble, start_state,
export_state)
else:
- optimizer = Optimizer(metainterp_sd, loop, optimizations)
+ optimizer = Optimizer(metainterp_sd, jitdriver_sd, loop,
+ optimizations)
optimizer.propagate_all_forward()
finally:
debug_stop("jit-optimize")
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -502,8 +502,9 @@
class Optimizer(Optimization):
- def __init__(self, metainterp_sd, loop, optimizations=None):
+ def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations=None):
self.metainterp_sd = metainterp_sd
+ self.jitdriver_sd = jitdriver_sd
self.cpu = metainterp_sd.cpu
self.loop = loop
self.values = {}
@@ -748,7 +749,12 @@
def store_final_boxes_in_guard(self, op, pendingfields):
assert pendingfields is not None
- descr = op.getdescr()
+ if op.getdescr() is not None:
+ descr = op.getdescr()
+ assert isinstance(descr, compile.ResumeAtPositionDescr)
+ else:
+ descr = compile.invent_fail_descr_for_op(op, self)
+ op.setdescr(descr)
assert isinstance(descr, compile.ResumeGuardDescr)
assert isinstance(op, GuardResOp)
modifier = resume.ResumeDataVirtualAdder(descr, op,
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -17,16 +17,16 @@
b0 = BoxInt()
b1 = BoxInt()
opt = optimizeopt.Optimizer(FakeMetaInterpStaticData(LLtypeMixin.cpu),
- None)
- fdescr = ResumeGuardDescr()
- op = ResOperation(rop.GUARD_TRUE, ['dummy'], None, descr=fdescr)
+ None, None)
+ op = ResOperation(rop.GUARD_TRUE, ['dummy'], None)
# setup rd data
fi0 = resume.FrameInfo(None, "code0", 11)
- fdescr.rd_frame_info_list = resume.FrameInfo(fi0, "code1", 33)
snapshot0 = resume.Snapshot(None, [b0])
op.rd_snapshot = resume.Snapshot(snapshot0, [b1])
+ op.rd_frame_info_list = resume.FrameInfo(fi0, "code1", 33)
#
opt.store_final_boxes_in_guard(op, [])
+ fdescr = op.getdescr()
if op.getfailargs() == [b0, b1]:
assert list(fdescr.rd_numb.nums) == [tag(1, TAGBOX)]
assert list(fdescr.rd_numb.prev.nums) == [tag(0, TAGBOX)]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -361,36 +361,23 @@
class BaseTest(object):
def parse(self, s, boxkinds=None, want_fail_descr=True, postprocess=None):
- if want_fail_descr:
- invent_fail_descr = self.invent_fail_descr
- else:
- invent_fail_descr = lambda *args: None
self.oparse = OpParser(s, self.cpu, self.namespace, 'lltype',
boxkinds,
- invent_fail_descr, False, postprocess)
+ None, False, postprocess)
return self.oparse.parse()
def postprocess(self, op):
if op.is_guard():
op.rd_snapshot = resume.Snapshot(None, op.getfailargs())
- op.getdescr().rd_frame_info_list = resume.FrameInfo(None, "code", 11)
+ op.rd_frame_info_list = resume.FrameInfo(None, "code", 11)
def add_guard_future_condition(self, res):
# invent a GUARD_FUTURE_CONDITION to not have to change all tests
if res.operations[-1].getopnum() == rop.JUMP:
- guard = ResOperation(rop.GUARD_FUTURE_CONDITION, [], None, descr=self.invent_fail_descr(None, rop.GUARD_FUTURE_CONDITION, []))
+ guard = ResOperation(rop.GUARD_FUTURE_CONDITION, [], None)
guard.rd_snapshot = resume.Snapshot(None, [])
res.operations.insert(-1, guard)
- def invent_fail_descr(self, model, opnum, fail_args):
- if rop._GUARD_FIRST <= opnum <= rop._GUARD_LAST:
- descr = Storage()
- descr.guard_opnum = opnum
- descr.rd_frame_info_list = resume.FrameInfo(None, "code", 11)
- else:
- descr = final_descr
- return descr
-
def assert_equal(self, optimized, expected, text_right=None):
from rpython.jit.metainterp.optimizeopt.util import equaloplists
assert len(optimized.inputargs) == len(expected.inputargs)
@@ -417,7 +404,8 @@
if hasattr(self, 'callinfocollection'):
metainterp_sd.callinfocollection = self.callinfocollection
#
- return optimize_trace(metainterp_sd, loop, self.enable_opts,
+ return optimize_trace(metainterp_sd, None, loop,
+ self.enable_opts,
start_state=start_state,
export_state=export_state)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -799,7 +799,7 @@
if hasattr(self, 'callinfocollection'):
metainterp_sd.callinfocollection = self.callinfocollection
#
- optimize_trace(metainterp_sd, bridge, self.enable_opts)
+ optimize_trace(metainterp_sd, None, bridge, self.enable_opts)
def optimize_bridge(self, loops, bridge, expected, expected_target='Loop', **boxvalues):
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -9,15 +9,16 @@
ShortBoxes, BadVirtualState, VirtualStatesCantMatch)
from rpython.jit.metainterp.resoperation import rop, ResOperation, GuardResOp
from rpython.jit.metainterp.resume import Snapshot
+from rpython.jit.metainterp import compile
from rpython.rlib.debug import debug_print, debug_start, debug_stop
# FIXME: Introduce some VirtualOptimizer super class instead
-def optimize_unroll(metainterp_sd, loop, optimizations,
+def optimize_unroll(metainterp_sd, jitdriver_sd, loop, optimizations,
inline_short_preamble=True, start_state=None,
export_state=True):
- opt = UnrollOptimizer(metainterp_sd, loop, optimizations)
+ opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, loop, optimizations)
opt.inline_short_preamble = inline_short_preamble
return opt.propagate_all_forward(start_state, export_state)
@@ -51,8 +52,9 @@
inline_short_preamble = True
- def __init__(self, metainterp_sd, loop, optimizations):
- self.optimizer = UnrollableOptimizer(metainterp_sd, loop, optimizations)
+ def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations):
+ self.optimizer = UnrollableOptimizer(metainterp_sd, jitdriver_sd,
+ loop, optimizations)
self.boxes_created_this_iteration = None
def get_virtual_state(self, args):
@@ -559,11 +561,10 @@
for guard in extra_guards:
if guard.is_guard():
- descr = patchguardop.getdescr().clone()
- assert isinstance(guard, GuardResOp)
assert isinstance(patchguardop, GuardResOp)
guard.rd_snapshot = patchguardop.rd_snapshot
- guard.setdescr(descr)
+ guard.rd_frame_info_list = patchguardop.rd_frame_info_list
+ guard.setdescr(compile.ResumeAtPositionDescr())
self.optimizer.send_extra_operation(guard)
try:
@@ -592,11 +593,11 @@
if newop.is_guard():
if not patchguardop:
raise InvalidLoop("would like to have short preamble, but it has a guard and there's no guard_future_condition")
- descr = patchguardop.getdescr().clone()
assert isinstance(newop, GuardResOp)
assert isinstance(patchguardop, GuardResOp)
newop.rd_snapshot = patchguardop.rd_snapshot
- newop.setdescr(descr)
+ newop.rd_frame_info_list = patchguardop.rd_frame_info_list
+ newop.setdescr(compile.ResumeAtPositionDescr())
self.optimizer.send_extra_operation(newop)
if shop.result in assumed_classes:
classbox = self.getvalue(newop.result).get_constant_class(self.optimizer.cpu)
diff --git a/rpython/jit/metainterp/optimizeopt/util.py b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -164,8 +164,6 @@
assert op1.result.same_box(remap[op2.result])
else:
remap[op2.result] = op1.result
- if op1.getopnum() not in (rop.JUMP, rop.LABEL): # xxx obscure
- assert op1.getdescr() == op2.getdescr()
if op1.getfailargs() or op2.getfailargs():
assert len(op1.getfailargs()) == len(op2.getfailargs())
if strict_fail_args:
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1874,46 +1874,15 @@
moreargs = [box] + extraargs
else:
moreargs = list(extraargs)
- if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2:
- resumedescr = compile.ResumeGuardForcedDescr()
- resumedescr._init(self.staticdata, self.jitdriver_sd)
- elif opnum == rop.GUARD_NOT_INVALIDATED:
- resumedescr = compile.ResumeGuardNotInvalidated()
- elif opnum == rop.GUARD_FUTURE_CONDITION:
- resumedescr = compile.ResumeAtPositionDescr()
- elif opnum == rop.GUARD_VALUE:
- resumedescr = compile.ResumeGuardValueDescr()
- elif opnum == rop.GUARD_NONNULL:
- resumedescr = compile.ResumeGuardNonnullDescr()
- elif opnum == rop.GUARD_ISNULL:
- resumedescr = compile.ResumeGuardIsnullDescr()
- elif opnum == rop.GUARD_NONNULL_CLASS:
- resumedescr = compile.ResumeGuardNonnullClassDescr()
- elif opnum == rop.GUARD_CLASS:
- resumedescr = compile.ResumeGuardClassDescr()
- elif opnum == rop.GUARD_TRUE:
- resumedescr = compile.ResumeGuardTrueDescr()
- elif opnum == rop.GUARD_FALSE:
- resumedescr = compile.ResumeGuardFalseDescr()
- elif opnum == rop.GUARD_EXCEPTION:
- resumedescr = compile.ResumeGuardExceptionDescr()
- elif opnum == rop.GUARD_NO_EXCEPTION:
- resumedescr = compile.ResumeGuardNoExceptionDescr()
- elif opnum == rop.GUARD_OVERFLOW:
- resumedescr = compile.ResumeGuardOverflowDescr()
- elif opnum == rop.GUARD_NO_OVERFLOW:
- resumedescr = compile.ResumeGuardNoOverflowDescr()
- else:
- assert False
- guard_op = self.history.record(opnum, moreargs, None, descr=resumedescr)
+ guard_op = self.history.record(opnum, moreargs, None)
assert isinstance(guard_op, GuardResOp)
- self.capture_resumedata(guard_op, resumedescr, resumepc)
+ self.capture_resumedata(guard_op, resumepc)
self.staticdata.profiler.count_ops(opnum, Counters.GUARDS)
# count
self.attach_debug_info(guard_op)
return guard_op
- def capture_resumedata(self, guard_op, resumedescr, resumepc=-1):
+ def capture_resumedata(self, guard_op, resumepc=-1):
virtualizable_boxes = None
if (self.jitdriver_sd.virtualizable_info is not None or
self.jitdriver_sd.greenfield_info is not None):
@@ -1925,7 +1894,7 @@
if resumepc >= 0:
frame.pc = resumepc
resume.capture_resumedata(self.framestack, virtualizable_boxes,
- self.virtualref_boxes, resumedescr, guard_op)
+ self.virtualref_boxes, guard_op)
if self.framestack:
self.framestack[-1].pc = saved_pc
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -216,6 +216,7 @@
_fail_args = None
rd_snapshot = None
+ rd_frame_info_list = None
def getfailargs(self):
return self._fail_args
@@ -228,6 +229,7 @@
assert isinstance(newop, GuardResOp)
newop.setfailargs(self.getfailargs())
newop.rd_snapshot = self.rd_snapshot
+ newop.rd_frame_info_list = self.rd_frame_info_list
return newop
def clone(self):
@@ -235,10 +237,7 @@
assert isinstance(newop, GuardResOp)
newop.setfailargs(self.getfailargs())
newop.rd_snapshot = self.rd_snapshot
- descr = self.getdescr()
- if descr is not None: # for short preamble which is a mess
- newdescr = descr.clone()
- newop.setdescr(newdescr)
+ newop.rd_frame_info_list = self.rd_frame_info_list
return newop
# ============
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -55,7 +55,7 @@
back.get_list_of_active_boxes(True))
def capture_resumedata(framestack, virtualizable_boxes, virtualref_boxes,
- storage, snapshot_storage):
+ snapshot_storage):
n = len(framestack) - 1
if virtualizable_boxes is not None:
boxes = virtualref_boxes + virtualizable_boxes
@@ -66,13 +66,13 @@
_ensure_parent_resumedata(framestack, n)
frame_info_list = FrameInfo(top.parent_resumedata_frame_info_list,
top.jitcode, top.pc)
- storage.rd_frame_info_list = frame_info_list
+ snapshot_storage.rd_frame_info_list = frame_info_list
snapshot = Snapshot(top.parent_resumedata_snapshot,
top.get_list_of_active_boxes(False))
snapshot = Snapshot(snapshot, boxes)
snapshot_storage.rd_snapshot = snapshot
else:
- storage.rd_frame_info_list = None
+ snapshot_storage.rd_frame_info_list = None
snapshot_storage.rd_snapshot = Snapshot(None, boxes)
#
@@ -365,6 +365,7 @@
self.liveboxes = {}
storage.rd_numb = numb
self.snapshot_storage.rd_snapshot = None
+ storage.rd_frame_info_list = self.snapshot_storage.rd_frame_info_list
# collect liveboxes and virtuals
n = len(liveboxes_from_env) - v
diff --git a/rpython/jit/metainterp/test/test_ajit.py b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -2764,7 +2764,8 @@
return i
#
seen = []
- def my_optimize_trace(metainterp_sd, loop, enable_opts, *args, **kwds):
+ def my_optimize_trace(metainterp_sd, jitdriver_sd, loop, enable_opts,
+ *args, **kwds):
seen.append('unroll' in enable_opts)
raise InvalidLoop
old_optimize_trace = optimizeopt.optimize_trace
More information about the pypy-commit
mailing list