Author: Carl Friedrich Bolz <[email protected]>
Branch: guard-compatible
Changeset: r84513:95044f550bbb
Date: 2016-05-18 13:00 +0200
http://bitbucket.org/pypy/pypy/changeset/95044f550bbb/
Log: Backed out changeset 81d72bf4ea82
this will be done in a more principled way later
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -80,7 +80,6 @@
class Jump(Exception):
def __init__(self, jump_target, args):
- assert isinstance(jump_target[0], LLTrace)
self.jump_target = jump_target
self.args = args
@@ -471,18 +470,11 @@
assert deadframe._saved_data is not None
return deadframe._saved_data
- def grow_guard_compatible_switch(self, compiled_loop_token, descr, ref,
faildescr_prev=None):
- assert descr.is_first
+ def grow_guard_compatible_switch(self, compiled_loop_token, descr, ref):
assert isinstance(compiled_loop_token, model.CompiledLoopToken)
if not hasattr(descr, '_guard_compatible_llgraph_lst'):
descr._guard_compatible_llgraph_lst = []
- if faildescr_prev is None:
- target = None
- else:
- target = faildescr_prev._llgraph_bridge
- assert target is None or isinstance(target, LLTrace)
- descr._guard_compatible_llgraph_lst.append((ref, target))
- descr._guard_compatible_llgraph_lst.sort()
+ descr._guard_compatible_llgraph_lst.append(ref)
# ------------------------------------------------------------
@@ -1154,22 +1146,18 @@
values[i] = value
info = info.next()
- def _collect_failarg_values(self, descr, current_op):
+ def fail_guard(self, descr, saved_data=None, extra_value=None,
+ propagate_exception=False):
+ if not propagate_exception:
+ assert self.last_exception is None
values = []
- for box in current_op.getfailargs():
+ for box in self.current_op.getfailargs():
if box is not None:
value = self.env[box]
else:
value = None
values.append(value)
- self._accumulate(descr, current_op.getfailargs(), values)
- return values
-
- def fail_guard(self, descr, saved_data=None, extra_value=None,
- propagate_exception=False):
- if not propagate_exception:
- assert self.last_exception is None
- values = self._collect_failarg_values(descr, self.current_op)
+ self._accumulate(descr, self.current_op.getfailargs(), values)
if hasattr(descr, '_llgraph_bridge'):
if propagate_exception:
assert (descr._llgraph_bridge.operations[0].opnum in
@@ -1301,28 +1289,13 @@
self.fail_guard(descr)
def execute_guard_compatible(self, descr, arg1, arg2):
- # only need to execute the first operation, the others are checked
- # implicitly and should never grow
- # XXX this is a mess and should be done much more nicely
- if not descr.is_first:
- return
if arg1 != arg2:
- for attempt in range(2):
- # XXX binary search
- lst = getattr(descr, '_guard_compatible_llgraph_lst', [])
- for ref, target in lst:
+ if hasattr(descr, '_guard_compatible_llgraph_lst'):
+ lst = descr._guard_compatible_llgraph_lst
+ for ref in lst:
if ref == arg1:
- if target:
- values = self._collect_failarg_values(descr,
self.current_op)
- target = (target, -1)
- values = [value for value in values if value is
not None]
- raise Jump(target, values)
return
- assert not attempt == 1
- worked = descr._try_extend(arg1, self.cpu)
- if not worked:
- return self.fail_guard(descr, extra_value=arg1)
- # try the above again, it will now work
+ self.fail_guard(descr, extra_value=arg1)
def execute_int_add_ovf(self, _, x, y):
try:
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
@@ -800,10 +800,10 @@
self._debug_subinputargs = new_loop.inputargs
self._debug_suboperations = new_loop.operations
propagate_original_jitcell_token(new_loop)
- return send_bridge_to_backend(metainterp.jitdriver_sd,
metainterp.staticdata,
- self, inputargs, new_loop.operations,
- new_loop.original_jitcell_token,
- metainterp.box_names_memo)
+ send_bridge_to_backend(metainterp.jitdriver_sd, metainterp.staticdata,
+ self, inputargs, new_loop.operations,
+ new_loop.original_jitcell_token,
+ metainterp.box_names_memo)
def make_a_counter_per_value(self, guard_value_op, index):
assert guard_value_op.getopnum() in (rop.GUARD_VALUE,
rop.GUARD_COMPATIBLE)
@@ -1087,32 +1087,23 @@
# list of descrs about the same variable, potentially shared with
# subsequent guards in bridges
self.guard_descrs_list = [self]
- self.is_first = True
- def _try_extend(self, refval, cpu):
- # need to do the checking oldest to newest, to check the most specific
- # condition first
- prev = None
- # grow the switch on the first guard always
- # all others are useless
- assert self.is_first
- for curr in self.guard_descrs_list:
- if curr.is_compatible(cpu, refval):
- from rpython.jit.metainterp.blackhole import
resume_in_blackhole
- # XXX explain the prev hack
- cpu.grow_guard_compatible_switch(
- self.rd_loop_token, self, refval, prev)
- return True
- prev = curr
- return False
-
- def Xhandle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
+ def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
index = intmask(self.status >> self.ST_SHIFT)
typetag = intmask(self.status & self.ST_TYPE_MASK)
assert typetag == self.TY_REF # for now
refval = metainterp_sd.cpu.get_value_direct(deadframe, 'r', index)
if not we_are_translated():
assert self in self.guard_descrs_list
+ # need to do the checking oldest to newest, to check the most specific
+ # condition first
+ for curr in self.guard_descrs_list:
+ if curr.is_compatible(metainterp_sd.cpu, refval):
+ from rpython.jit.metainterp.blackhole import
resume_in_blackhole
+ metainterp_sd.cpu.grow_guard_compatible_switch(
+ curr.rd_loop_token, curr, refval)
+ resume_in_blackhole(metainterp_sd, jitdriver_sd, self,
deadframe)
+ return
# a real failure
return ResumeGuardDescr.handle_fail(self, deadframe, metainterp_sd,
jitdriver_sd)
@@ -1132,35 +1123,15 @@
assert self.failarg_index != -1
arg = new_loop.inputargs[self.failarg_index]
firstop = new_loop.operations[0]
- first = None
if (firstop.getopnum() == rop.GUARD_COMPATIBLE and
firstop.getarg(0) is arg):
- if new_loop.inputargs != firstop.getfailargs():
- # this should be true by construction, but let's be sure
- import pdb; pdb.set_trace()
- else:
- # a guard_compatible about the same box
- newdescr = firstop.getdescr()
- assert isinstance(newdescr, GuardCompatibleDescr)
- newdescr.is_first = False
- # share the guard_descrs_list of the guard_compatibles that
- # switch on the same object, starting from the same original
guard
- guard_descrs_list = newdescr.guard_descrs_list =
self.guard_descrs_list
- # this is slightly weird: we fish the last descr, which we
- # conceptionally attach the trace to (otherwise all traces
- # would be attached to the first one, which makes no sense)
- self = guard_descrs_list[-1]
- guard_descrs_list.append(newdescr)
- first = self.guard_descrs_list[0]
- result = ResumeGuardDescr.compile_and_attach(
+ # a guard_compatible about the same box
+ newdescr = firstop.getdescr()
+ assert isinstance(newdescr, GuardCompatibleDescr)
+ newdescr.guard_descrs_list = self.guard_descrs_list
+ self.guard_descrs_list.append(newdescr)
+ ResumeGuardDescr.compile_and_attach(
self, metainterp, new_loop, orig_inputargs)
- if first:
- refval = firstop.getarg(1).getref_base()
- # grow the first guard to immediately jump to the new place
- metainterp_sd = metainterp.staticdata
- metainterp_sd.cpu.grow_guard_compatible_switch(
- first.rd_loop_token, first, refval, self)
- return result
def make_a_counter_per_value(self, guard_value_op, index):
self.failarg_index = guard_value_op.getfailargs().index(
diff --git a/rpython/jit/metainterp/test/test_compatible.py
b/rpython/jit/metainterp/test/test_compatible.py
--- a/rpython/jit/metainterp/test/test_compatible.py
+++ b/rpython/jit/metainterp/test/test_compatible.py
@@ -14,9 +14,6 @@
p3 = lltype.malloc(S)
p3.x = 6
-
- p4 = lltype.malloc(S)
- p4.x = 6
driver = jit.JitDriver(greens = [], reds = ['n', 'x'])
class A(object):
@@ -40,14 +37,13 @@
f(100, p1)
f(100, p2)
f(100, p3)
- f(100, p4)
return c.count
x = self.meta_interp(main, [])
- assert x < 35
- # trace, two bridges, two finish bridges
- self.check_trace_count(5)
+ assert x < 25
+ # trace, two bridges, a finish bridge
+ self.check_trace_count(4)
def test_exception(self):
S = lltype.GcStruct('S', ('x', lltype.Signed))
@@ -59,9 +55,6 @@
p3 = lltype.malloc(S)
p3.x = 6
-
- p4 = lltype.malloc(S)
- p4.x = 6
driver = jit.JitDriver(greens = [], reds = ['n', 'x'])
@jit.elidable_compatible()
def g(s):
@@ -82,11 +75,9 @@
f(100, p1)
f(100, p2)
f(100, p3)
- f(100, p4)
self.meta_interp(main, [])
- # trace, two bridges, two finish bridges
- self.check_trace_count(5)
+ # XXX check number of bridges
def test_quasi_immutable(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit