[pypy-svn] r52583 - in pypy/branch/jit-hotpath/pypy/jit: rainbow rainbow/test timeshifter

arigo at codespeak.net arigo at codespeak.net
Sun Mar 16 12:30:04 CET 2008


Author: arigo
Date: Sun Mar 16 12:30:04 2008
New Revision: 52583

Modified:
   pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py
   pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py
   pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py
Log:
Better test coverage for simple structs and arrays.
Also fixed green_getfield to not rely on constant-folding of red boxes.


Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py	Sun Mar 16 12:30:04 2008
@@ -1198,7 +1198,7 @@
             assert op.args[1].value != 'vable_access'
 
         # non virtual case                
-        index = self.serialize_oparg("red", args[0])
+        index = self.serialize_oparg(color, args[0])
         fieldname = args[1].value
         s_struct = self.hannotator.binding(args[0])
         deepfrozen = s_struct.deepfrozen
@@ -1206,8 +1206,9 @@
         fielddescindex = self.fielddesc_position(PTRTYPE.TO, fieldname)
         if fielddescindex == -1:   # Void field
             return
-        self.emit("%s_getfield" % (color, ), index, fielddescindex, deepfrozen)
+        self.emit("%s_getfield" % (color, ), index, fielddescindex)
         if color == "red":
+            self.emit(deepfrozen)
             self.register_redvar(op.result)
         else:
             self.register_greenvar(op.result)
@@ -1239,17 +1240,22 @@
         self.emit("red_setfield", destboxindex, fielddescindex, valboxindex)
 
     def serialize_op_getarrayitem(self, op):
+        color = self.opcolor(op)
         arrayvar, indexvar = op.args
         PTRTYPE = arrayvar.concretetype
         if PTRTYPE.TO.OF is lltype.Void:
             return
         deepfrozen = self.hannotator.binding(arrayvar).deepfrozen
         fielddescindex = self.arrayfielddesc_position(PTRTYPE.TO)
-        arrayindex = self.serialize_oparg("red", arrayvar)
-        index = self.serialize_oparg("red", indexvar)
-        self.emit("red_getarrayitem", arrayindex, fielddescindex, index,
-                  deepfrozen)
-        self.register_redvar(op.result)
+        arrayindex = self.serialize_oparg(color, arrayvar)
+        index = self.serialize_oparg(color, indexvar)
+        self.emit("%s_getarrayitem" % (color, ))
+        self.emit(arrayindex, fielddescindex, index)
+        if color == "red":
+            self.emit(deepfrozen)
+            self.register_redvar(op.result)
+        else:
+            self.register_greenvar(op.result)
 
     def serialize_op_setarrayitem(self, op):
         args = op.args
@@ -1273,7 +1279,7 @@
         if PTRTYPE.TO.OF is lltype.Void:
             return
         fielddescindex = self.arrayfielddesc_position(PTRTYPE.TO)
-        arrayindex = self.serialize_oparg("red", arrayvar)
+        arrayindex = self.serialize_oparg(color, arrayvar)
         self.emit("%s_getarraysize" % (color, ), arrayindex, fielddescindex)
         if color == "red":
             self.register_redvar(op.result)

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py	Sun Mar 16 12:30:04 2008
@@ -386,8 +386,8 @@
         assert gv_res is not None, "segfault!"
         return gv_res
 
-    @arguments("red", "fielddesc", "bool", returns="green_from_red")
-    def opimpl_green_getfield(self, gv_struct, fielddesc, deepfrozen):
+    @arguments("green", "fielddesc", returns="green")
+    def opimpl_green_getfield(self, gv_struct, fielddesc):
         gv_res = fielddesc.getfield_if_non_null(self.rgenop, gv_struct)
         assert gv_res is not None, "segfault!"
         return gv_res
@@ -398,7 +398,10 @@
 
     @arguments("red", "arraydesc", "red", "bool", returns="red")
     def opimpl_red_getarrayitem(self, gv_array, fielddesc, gv_index, deepfrozen):
-        Xxx("red_getarrayitem")
+        gv_res = fielddesc.getarrayitem_if_non_null(self.rgenop,
+                                                    gv_array, gv_index)
+        assert gv_res is not None, "segfault!"
+        return gv_res
 
     @arguments("red", "arraydesc", "red", "red")
     def opimpl_red_setarrayitem(self, gv_dest, fielddesc, gv_index, gv_value):
@@ -406,11 +409,22 @@
 
     @arguments("red", "arraydesc", returns="red")
     def opimpl_red_getarraysize(self, gv_array, fielddesc):
-        Xxx("red_getarraysize")
+        gv_res = fielddesc.getarraysize_if_non_null(self.rgenop, gv_array)
+        assert gv_res is not None, "segfault!"
+        return gv_res
 
-    @arguments("red", "arraydesc", returns="green_from_red")
+    @arguments("green", "arraydesc", "green", returns="green")
+    def opimpl_green_getarrayitem(self, gv_array, fielddesc, gv_index):
+        gv_res = fielddesc.getarrayitem_if_non_null(self.rgenop,
+                                                    gv_array, gv_index)
+        assert gv_res is not None, "segfault!"
+        return gv_res
+
+    @arguments("green", "arraydesc", returns="green")
     def opimpl_green_getarraysize(self, gv_array, fielddesc):
-        Xxx("green_getarraysize")
+        gv_res = fielddesc.getarraysize_if_non_null(self.rgenop, gv_array)
+        assert gv_res is not None, "segfault!"
+        return gv_res
 
     @arguments("red", "interiordesc", "bool", "red_varargs", returns="red")
     def opimpl_red_getinteriorfield(self, gv_struct, interiordesc, deepfrozen,

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py	Sun Mar 16 12:30:04 2008
@@ -4,6 +4,7 @@
 from pypy.rlib.debug import debug_print
 from pypy.jit.timeshifter import rtimeshift, rcontainer, rvalue
 from pypy.jit.timeshifter.greenkey import empty_key, GreenKey, newgreendict
+from pypy.jit.timeshifter.oop import SegfaultException
 from pypy.jit.rainbow import rhotpath
 from pypy.rpython.lltypesystem import lltype, llmemory
 
@@ -789,10 +790,12 @@
         return rtimeshift.gengetfield(self.jitstate, deepfrozen, fielddesc,
                                       structbox)
 
-    @arguments("red", "fielddesc", "bool", returns="green_from_red")
-    def opimpl_green_getfield(self, structbox, fielddesc, deepfrozen):
-        return rtimeshift.gengetfield(self.jitstate, deepfrozen, fielddesc,
-                                      structbox)
+    @arguments("green", "fielddesc", returns="green")
+    def opimpl_green_getfield(self, gv_struct, fielddesc):
+        gv_res = fielddesc.getfield_if_non_null(self.rgenop, gv_struct)
+        if gv_res is None:
+            raise SegfaultException
+        return gv_res
 
     @arguments("red", "fielddesc", "red")
     def opimpl_red_setfield(self, destbox, fielddesc, valuebox):
@@ -813,9 +816,21 @@
     def opimpl_red_getarraysize(self, arraybox, fielddesc):
         return rtimeshift.gengetarraysize(self.jitstate, fielddesc, arraybox)
 
-    @arguments("red", "arraydesc", returns="green_from_red")
-    def opimpl_green_getarraysize(self, arraybox, fielddesc):
-        return rtimeshift.gengetarraysize(self.jitstate, fielddesc, arraybox)
+    @arguments("green", "arraydesc", "green", returns="green")
+    def opimpl_green_getarrayitem(self, gv_array, fielddesc, gv_index):
+        gv_res = fielddesc.getarrayitem_if_non_null(self.rgenop,
+                                                    gv_array, gv_index)
+        if gv_res is None:
+            raise SegfaultException   # XXX should probably just raise it
+                                      # from fielddesc.getarrayitem()
+        return gv_res
+
+    @arguments("green", "arraydesc", returns="green")
+    def opimpl_green_getarraysize(self, gv_array, fielddesc):
+        gv_res = fielddesc.getarraysize_if_non_null(self.rgenop, gv_array)
+        if gv_res is None:
+            raise SegfaultException
+        return gv_res
 
     @arguments("red", "interiordesc", "bool", "red_varargs", returns="red")
     def opimpl_red_getinteriorfield(self, structbox, interiordesc, deepfrozen,

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py	Sun Mar 16 12:30:04 2008
@@ -432,45 +432,102 @@
                             hints={'immutable': True})
         
         def ll_function(s):
-            return s.hello * s.world
+            i = 1024
+            while i > 0:
+                i >>= 1
+                s1 = s
+                if MyJitDriver.case >= 2:
+                    hint(s1, concrete=True)     # green
+                    if MyJitDriver.case == 3:
+                        s1 = hint(s1, variable=True)    # constant redbox
+                #
+                res = s1.hello * s1.world
+                #
+                MyJitDriver.jit_merge_point(s=s, i=i, res=res)
+                MyJitDriver.can_enter_jit(s=s, i=i, res=res)
+            return res
 
-        def struct_S(string):
-            items = string.split(',')
-            assert len(items) == 2
+        def main(x, y):
             s1 = lltype.malloc(S)
-            s1.hello = int(items[0])
-            s1.world = int(items[1])
-            return s1
-        ll_function.convert_arguments = [struct_S]
+            s1.hello = x
+            s1.world = y
+            return ll_function(s1)
 
-        res = self.interpret(ll_function, ["6,7"], [])
+        class MyJitDriver(JitDriver):
+            greens = []
+            reds = ['s', 'i', 'res']
+            case = 1
+        res = self.run(main, [6, 7], threshold=2)
         assert res == 42
-        self.check_insns({'getfield': 2, 'int_mul': 1})
-        res = self.interpret(ll_function, ["8,9"], [0])
+        self.check_insns_in_loops({'getfield': 2, 'int_mul': 1,
+                                   'int_gt': 1, 'int_rshift': 1})
+
+        class MyJitDriver(JitDriver):
+            greens = ['s']
+            reds = ['i', 'res']
+            case = 2
+        res = self.run(main, [8, 9], threshold=2)
         assert res == 72
-        self.check_insns({})
+        self.check_insns_in_loops({'int_gt': 1, 'int_rshift': 1})
+
+        class MyJitDriver(JitDriver):
+            greens = ['s']
+            reds = ['i', 'res']
+            case = 3
+        res = self.run(main, [10, 11], threshold=2)
+        assert res == 110
+        self.check_insns_in_loops({'int_gt': 1, 'int_rshift': 1})
 
     def test_simple_array(self):
         A = lltype.GcArray(lltype.Signed, 
                             hints={'immutable': True})
         def ll_function(a):
-            return a[0] * a[1]
+            i = 1024
+            while i > 0:
+                i >>= 1
+                a1 = a
+                if MyJitDriver.case >= 2:
+                    hint(a1, concrete=True)     # green
+                    if MyJitDriver.case == 3:
+                        a1 = hint(a1, variable=True)    # constant redbox
+                #
+                res = a1[0] * a1[1] + len(a1)
+                #
+                MyJitDriver.jit_merge_point(a=a, i=i, res=res)
+                MyJitDriver.can_enter_jit(a=a, i=i, res=res)
+            return res
 
-        def int_array(string):
-            items = [int(x) for x in string.split(',')]
-            n = len(items)
-            a1 = lltype.malloc(A, n)
-            for i in range(n):
-                a1[i] = items[i]
-            return a1
-        ll_function.convert_arguments = [int_array]
+        def main(x, y):
+            a = lltype.malloc(A, 2)
+            a[0] = x
+            a[1] = y
+            return ll_function(a)
 
-        res = self.interpret(ll_function, ["6,7"], [])
-        assert res == 42
-        self.check_insns({'getarrayitem': 2, 'int_mul': 1})
-        res = self.interpret(ll_function, ["8,3"], [0])
-        assert res == 24
-        self.check_insns({})
+        class MyJitDriver(JitDriver):
+            greens = []
+            reds = ['a', 'i', 'res']
+            case = 1
+        res = self.run(main, [6, 7], threshold=2)
+        assert res == 44
+        self.check_insns_in_loops({'getarrayitem': 2, 'int_mul': 1,
+                                   'getarraysize': 1, 'int_add': 1,
+                                   'int_gt': 1, 'int_rshift': 1})
+
+        class MyJitDriver(JitDriver):
+            greens = ['a']
+            reds = ['i', 'res']
+            case = 2
+        res = self.run(main, [8, 9], threshold=2)
+        assert res == 74
+        self.check_insns_in_loops({'int_gt': 1, 'int_rshift': 1})
+
+        class MyJitDriver(JitDriver):
+            greens = ['a']
+            reds = ['i', 'res']
+            case = 3
+        res = self.run(main, [10, 11], threshold=2)
+        assert res == 112
+        self.check_insns_in_loops({'int_gt': 1, 'int_rshift': 1})
 
     def test_arraysize(self):
         A = lltype.GcArray(lltype.Signed)
@@ -1740,3 +1797,7 @@
             return f(space, x, y)
         res = self.interpret(main2, [5, 6], policy=StopAtXPolicy(g))
         assert res == 11
+
+
+    #def test_handle_SegfaultException(self):
+    #    ...

Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py	Sun Mar 16 12:30:04 2008
@@ -618,18 +618,18 @@
         self.varsizealloctoken = RGenOp.varsizeAllocToken(TYPE)
         self.indexkind = RGenOp.kindToken(lltype.Signed)
 
-        def getarrayitem_if_non_null(jitstate, genvar, gv_index):
+        def getarrayitem_if_non_null(rgenop, genvar, gv_index):
             array = genvar.revealconst(self.PTRTYPE)
             index = gv_index.revealconst(lltype.Signed)
             if array and 0 <= index < len(array):  # else don't constant-fold
                 res = array[index]
-                return rvalue.ll_gv_fromvalue(jitstate, res)
+                return rgenop.genconst(res)
         self.getarrayitem_if_non_null = getarrayitem_if_non_null
-        def getarraysize_if_non_null(jitstate, genvar):
+        def getarraysize_if_non_null(rgenop, genvar):
             array = genvar.revealconst(self.PTRTYPE)
             if array:  # else don't constant-fold
                 res = len(array)
-                return rvalue.ll_gv_fromvalue(jitstate, res)
+                return rgenop.genconst(res)
         self.getarraysize_if_non_null = getarraysize_if_non_null
 # ____________________________________________________________
 

Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py	Sun Mar 16 12:30:04 2008
@@ -167,7 +167,7 @@
     if ((fielddesc.immutable or deepfrozen) and argbox.is_constant()
                                             and indexbox.is_constant()):
         resgv = fielddesc.getarrayitem_if_non_null(
-                jitstate, argbox.getgenvar(jitstate),
+                jitstate.curbuilder.rgenop, argbox.getgenvar(jitstate),
                 indexbox.getgenvar(jitstate))
         if resgv is not None:
             return fielddesc.makebox(jitstate, resgv)
@@ -204,7 +204,7 @@
 def gengetarraysize(jitstate, fielddesc, argbox):
     if argbox.is_constant():
         resgv = fielddesc.getarraysize_if_non_null(
-                jitstate, argbox.getgenvar(jitstate))
+                jitstate.curbuilder.rgenop, argbox.getgenvar(jitstate))
         if resgv is not None:
             return rvalue.redboxbuilder_int(fielddesc.indexkind, resgv)
     genvar = jitstate.curbuilder.genop_getarraysize(



More information about the Pypy-commit mailing list