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

Reply via email to