[pypy-commit] pypy guard-compatible: a new CPU interface for guard_compatible, a test for it and an llgraph

cfbolz pypy.commits at gmail.com
Sun Mar 13 08:44:52 EDT 2016


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: guard-compatible
Changeset: r83008:8969fdd0d8d4
Date: 2016-03-13 13:43 +0100
http://bitbucket.org/pypy/pypy/changeset/8969fdd0d8d4/

Log:	a new CPU interface for guard_compatible, a test for it and an
	llgraph implementation

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
@@ -470,6 +470,12 @@
         assert deadframe._saved_data is not None
         return deadframe._saved_data
 
+    def grow_guard_compatible_switch(self, descr, ref):
+        if not hasattr(descr, '_guard_compatible_llgraph_lst'):
+            descr._guard_compatible_llgraph_lst = []
+        descr._guard_compatible_llgraph_lst.append(ref)
+
+
     # ------------------------------------------------------------
 
     def calldescrof(self, FUNC, ARGS, RESULT, effect_info):
@@ -1273,8 +1279,11 @@
 
     def execute_guard_compatible(self, descr, arg1, arg2):
         if arg1 != arg2:
-            if descr.fake_check_against_list(self.cpu, arg1):
-                return
+            if hasattr(descr, '_guard_compatible_llgraph_lst'):
+                lst = descr._guard_compatible_llgraph_lst
+                for ref in lst:
+                    if ref == arg1:
+                        return
             self.fail_guard(descr, extra_value=arg1)
 
     def execute_int_add_ovf(self, _, x, y):
diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py
--- a/rpython/jit/backend/model.py
+++ b/rpython/jit/backend/model.py
@@ -158,6 +158,14 @@
         """
         pass
 
+    def grow_guard_compatible_switch(self, guarddescr, gcref):
+        """ This method is called to add another case to a guard_compatible.
+        guard_compatible starts like a guard_value, but can grow to check more
+        cases. The guard should only fail if the argument is unequal to all the
+        cases added so far.
+        """
+        raise NotImplementedError
+
     def sizeof(self, S):
         raise NotImplementedError
 
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
@@ -5,7 +5,7 @@
                                          BasicFinalDescr,
                                          JitCellToken, TargetToken,
                                          ConstInt, ConstPtr,
-                                         ConstFloat, Const)
+                                         ConstFloat, Const, newconst)
 from rpython.jit.metainterp.resoperation import ResOperation, rop, InputArgInt,\
      InputArgFloat, opname, InputArgRef
 from rpython.jit.metainterp.typesystem import deref
@@ -190,6 +190,36 @@
         res = self.cpu.get_int_value(deadframe, 0)
         assert res == 10
 
+    def test_extend_guard_compatible(self):
+        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)
+        loop = parse("""
+        [p0]
+        guard_compatible(p0, ConstPtr(t1), descr=faildescr1) []
+        finish(p0, descr=fdescr)
+        """, namespace={'fdescr': BasicFinalDescr(2),
+                        'faildescr1': faildescr1,
+                        't1': t1_box._resref})
+        looptoken = JitCellToken()
+        self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
+        deadframe = self.cpu.execute_token(looptoken,
+                                           t1_box._resref)
+        fail = self.cpu.get_latest_descr(deadframe)
+        assert fail.identifier == 2
+
+        deadframe = self.cpu.execute_token(looptoken,
+                                           t2_box._resref)
+        fail = self.cpu.get_latest_descr(deadframe)
+        assert fail.identifier == 1
+
+        self.cpu.grow_guard_compatible_switch(faildescr1, t2_box._resref)
+        deadframe = self.cpu.execute_token(looptoken,
+                                           t2_box._resref)
+        fail = self.cpu.get_latest_descr(deadframe)
+        assert fail.identifier == 2
+
     def test_compile_with_holes_in_fail_args(self):
         targettoken = TargetToken()
         loop = parse("""


More information about the pypy-commit mailing list