Author: Armin Rigo <ar...@tunes.org> Branch: guard-compatible Changeset: r84529:0717682946eb Date: 2016-05-20 17:28 +0200 http://bitbucket.org/pypy/pypy/changeset/0717682946eb/
Log: Finish llgraph support for guard_compatible, fix tests 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 @@ -1145,7 +1145,7 @@ info = info.next() def fail_guard(self, descr, saved_data=None, extra_value=None, - propagate_exception=False): + propagate_exception=False, force_bridge=None): if not propagate_exception: assert self.last_exception is None values = [] @@ -1156,12 +1156,14 @@ value = None values.append(value) self._accumulate(descr, self.current_op.getfailargs(), values) - if hasattr(descr, '_llgraph_bridge'): + if force_bridge is None: + force_bridge = getattr(descr, '_llgraph_bridge', None) + if force_bridge is not None: if propagate_exception: - assert (descr._llgraph_bridge.operations[0].opnum in + assert (force_bridge.operations[0].opnum in (rop.SAVE_EXC_CLASS, rop.GUARD_EXCEPTION, rop.GUARD_NO_EXCEPTION)) - target = (descr._llgraph_bridge, -1) + target = (force_bridge, -1) values = [value for value in values if value is not None] raise Jump(target, values) else: @@ -1288,22 +1290,25 @@ def execute_guard_compatible(self, descr, arg1, arg2): if arg1 != arg2: - if hasattr(descr, '_guard_compatible_llgraph_lst'): + assert not hasattr(descr, '_llgraph_bridge') + try: lst = descr._guard_compatible_llgraph_lst - for ref, target in lst: - if ref == arg1: - if target == -1: - return - XXX + except AttributeError: + lst = descr._guard_compatible_llgraph_lst = [] + for ref, target in lst: + if ref == arg1: + break else: - descr._guard_compatible_llgraph_lst = [] - target = descr.find_compatible(self.cpu, arg1) - if target: + target = descr.find_compatible(self.cpu, arg1) + if target == 0: + self.fail_guard(descr, extra_value=arg1) + assert 0, "fail_guard should raise" descr._guard_compatible_llgraph_lst.append((arg1, target)) - if target == -1: - return - XXX - self.fail_guard(descr, extra_value=arg1) + # + if target == -1: + return + else: + self.fail_guard(descr, force_bridge=target) def execute_int_add_ovf(self, _, x, y): try: diff --git a/rpython/jit/backend/test/runner_test.py b/rpython/jit/backend/test/runner_test.py --- a/rpython/jit/backend/test/runner_test.py +++ b/rpython/jit/backend/test/runner_test.py @@ -23,7 +23,11 @@ from rpython.jit.backend.llsupport import jitframe from rpython.jit.backend.llsupport.llmodel import AbstractLLCPU from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler - +from rpython.jit.metainterp.compile import GuardCompatibleDescr + + +class BasicCompatDescr(BasicFailDescr, GuardCompatibleDescr): + pass IS_32_BIT = sys.maxint < 2**32 IS_64_BIT = sys.maxint > 2**32 @@ -199,7 +203,7 @@ t1_box, T1_box, d1 = self.alloc_instance(self.T) t2_box, T2_box, d2 = self.alloc_instance(self.T) t3_box, T3_box, d3 = self.alloc_instance(self.T) - faildescr1 = BasicFailDescr(1) + faildescr1 = BasicCompatDescr(1) faildescr1.find_compatible = find_compatible loop = parse(""" [p0] @@ -240,7 +244,7 @@ t1_box, T1_box, d1 = self.alloc_instance(self.T) t2_box, T2_box, d2 = self.alloc_instance(self.T) t3_box, T3_box, d3 = self.alloc_instance(self.T) - faildescr1 = BasicFailDescr(1) + faildescr1 = BasicCompatDescr(1) faildescr1.find_compatible = find_compatible loop = parse(""" [p0] @@ -270,6 +274,7 @@ seen = [] def find_compatible(cpu, arg): assert cpu is self.cpu + seen.append(arg) if arg == t2_box._resref: return asminfo43.asmaddr if arg == t3_box._resref: @@ -278,11 +283,11 @@ t1_box, T1_box, d1 = self.alloc_instance(self.T) t2_box, T2_box, d2 = self.alloc_instance(self.T) t3_box, T3_box, d3 = self.alloc_instance(self.T) - faildescr1 = BasicFailDescr(1) + faildescr1 = BasicCompatDescr(1) faildescr1.find_compatible = find_compatible loop = parse(""" [p0] - guard_compatible(p0, ConstPtr(t1), descr=faildescr1) [] + guard_compatible(p0, ConstPtr(t1), descr=faildescr1) [p0] finish(p0, descr=fdescr) """, namespace={'fdescr': BasicFinalDescr(2), 'faildescr1': faildescr1, @@ -291,14 +296,14 @@ self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken) bridge43 = parse(""" - [] + [p0] finish(p0, descr=fdescr43) """, namespace={'fdescr43': BasicFinalDescr(43)}) asminfo43 = self.cpu.compile_bridge(faildescr1, bridge43.inputargs, bridge43.operations, looptoken) bridge44 = parse(""" - [] + [p0] finish(p0, descr=fdescr44) """, namespace={'fdescr44': BasicFinalDescr(44)}) asminfo44 = self.cpu.compile_bridge(faildescr1, bridge44.inputargs, @@ -311,6 +316,7 @@ for t in t_list * 2: # find_compatible() returns a bridge's address: switch goes there deadframe = self.cpu.execute_token(looptoken, t) + assert self.cpu.get_ref_value(deadframe, 0) == t fail = self.cpu.get_latest_descr(deadframe) if t == t1_box._resref: assert fail.identifier == 2 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit