[pypy-svn] r34810 - in pypy/dist/pypy/jit/timeshifter: . test

pedronis at codespeak.net pedronis at codespeak.net
Mon Nov 20 21:13:44 CET 2006


Author: pedronis
Date: Mon Nov 20 21:13:39 2006
New Revision: 34810

Modified:
   pypy/dist/pypy/jit/timeshifter/hrtyper.py
   pypy/dist/pypy/jit/timeshifter/rtimeshift.py
   pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py
Log:
(arigo, pedronis)

implement support for deepfrozen in the timeshifter, fix the folding of getfield and getarrayitem,
support for pointer equality ops.

=> the strange test passes (but slow..ly)



Modified: pypy/dist/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/hrtyper.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/hrtyper.py	Mon Nov 20 21:13:39 2006
@@ -460,9 +460,9 @@
                     del link.args[0]    # Void
                 link.args = [v_jitstate] + link.args
 
-    def generic_translate_operation(self, hop, force=False):
+    def generic_translate_operation(self, hop):
         # detect constant-foldable all-green operations
-        if not force and hop.spaceop.opname not in rtimeshift.FOLDABLE_OPS:
+        if hop.spaceop.opname not in rtimeshift.FOLDABLE_GREEN_OPS:
             return None
         green = True
         for r_arg in hop.args_r:
@@ -526,49 +526,39 @@
                                                    ts.s_RedBox)
         # non virtual case        
         PTRTYPE = originalconcretetype(hop.args_s[0])
-        if PTRTYPE.TO._hints.get('immutable', False): # foldable if all green
-            res = self.generic_translate_operation(hop, force=True)
-            if res is not None:
-                return res
-            
         v_argbox, c_fieldname = hop.inputargs(self.getredrepr(PTRTYPE),
                                               green_void_repr)
         v_argbox = hop.llops.as_ptrredbox(v_argbox)
+        c_deepfrozen = inputconst(lltype.Bool, hop.args_s[0].deepfrozen)
         structdesc = rcontainer.StructTypeDesc(self.RGenOp, PTRTYPE.TO)
         fielddesc = structdesc.getfielddesc(c_fieldname.value)
         c_fielddesc = inputconst(lltype.Void, fielddesc)
         s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
         v_jitstate = hop.llops.getjitstate()
         return hop.llops.genmixlevelhelpercall(rtimeshift.ll_gengetfield,
-            [ts.s_JITState, s_fielddesc, ts.s_PtrRedBox],
-            [v_jitstate,    c_fielddesc, v_argbox      ],
+            [ts.s_JITState, annmodel.s_Bool, s_fielddesc, ts.s_PtrRedBox],
+            [v_jitstate   , c_deepfrozen   , c_fielddesc, v_argbox      ],
             ts.s_RedBox)
 
     def translate_op_getarrayitem(self, hop):
         PTRTYPE = originalconcretetype(hop.args_s[0])
-        if PTRTYPE.TO._hints.get('immutable', False): # foldable if all green
-            res = self.generic_translate_operation(hop, force=True)
-            if res is not None:
-                return res
-
         ts = self
         v_argbox, v_index = hop.inputargs(self.getredrepr(PTRTYPE),
                                           self.getredrepr(lltype.Signed))
+        c_deepfrozen = inputconst(lltype.Bool, hop.args_s[0].deepfrozen)
         fielddesc = rcontainer.ArrayFieldDesc(self.RGenOp, PTRTYPE.TO)
         c_fielddesc = inputconst(lltype.Void, fielddesc)
         s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
         v_jitstate = hop.llops.getjitstate()
         return hop.llops.genmixlevelhelpercall(
             rtimeshift.ll_gengetarrayitem,
-            [ts.s_JITState, s_fielddesc, ts.s_RedBox, ts.s_RedBox],
-            [v_jitstate,    c_fielddesc, v_argbox,    v_index    ],
+            [ts.s_JITState, annmodel.s_Bool, s_fielddesc,
+                                ts.s_RedBox, ts.s_RedBox],
+            [v_jitstate,       c_deepfrozen, c_fielddesc,
+                                   v_argbox,    v_index ],
             ts.s_RedBox)
 
     def translate_op_getarraysize(self, hop):
-        res = self.generic_translate_operation(hop, force=True)
-        if res is not None:
-            return res
-        
         PTRTYPE = originalconcretetype(hop.args_s[0])
         ts = self
         [v_argbox] = hop.inputargs(self.getredrepr(PTRTYPE))
@@ -658,11 +648,6 @@
 
     def translate_op_getarraysubstruct(self, hop):
         PTRTYPE = originalconcretetype(hop.args_s[0])
-        if PTRTYPE.TO._hints.get('immutable', False): # foldable if all green
-            res = self.generic_translate_operation(hop, force=True)
-            if res is not None:
-                return res
-
         ts = self
         v_argbox, v_index = hop.inputargs(self.getredrepr(PTRTYPE),
                                           self.getredrepr(lltype.Signed))
@@ -710,20 +695,37 @@
         ts = self
         PTRTYPE = originalconcretetype(hop.args_s[0])
         v_argbox, = hop.inputargs(self.getredrepr(PTRTYPE))
+        v_argbox = hop.llops.as_ptrredbox(v_argbox)
         v_jitstate = hop.llops.getjitstate()
         c_reverse = hop.inputconst(lltype.Bool, reverse)
         return hop.llops.genmixlevelhelpercall(rtimeshift.ll_genptrnonzero,
-            [ts.s_JITState, ts.s_RedBox, annmodel.SomeBool()],
-            [v_jitstate,    v_argbox,    c_reverse          ],
+            [ts.s_JITState, ts.s_PtrRedBox, annmodel.s_Bool],
+            [v_jitstate   , v_argbox      , c_reverse      ],
             ts.s_RedBox)
 
     def translate_op_ptr_iszero(self, hop):
         return self.translate_op_ptr_nonzero(hop, reverse=True)
 
+    def translate_op_ptr_eq(self, hop, reverse=False):
+        ts = self
+        PTRTYPE = originalconcretetype(hop.args_s[0])
+        r_ptr = self.getredrepr(PTRTYPE)
+        v_argbox0, v_argbox1 = hop.inputargs(r_ptr, r_ptr)
+        v_argbox0 = hop.llops.as_ptrredbox(v_argbox0)
+        v_argbox1 = hop.llops.as_ptrredbox(v_argbox1)
+        v_jitstate = hop.llops.getjitstate()
+        c_reverse = hop.inputconst(lltype.Bool, reverse)
+        return hop.llops.genmixlevelhelpercall(rtimeshift.ll_genptreq,
+            [ts.s_JITState, ts.s_PtrRedBox, ts.s_PtrRedBox, annmodel.s_Bool],
+            [v_jitstate   , v_argbox0     , v_argbox1     , c_reverse      ],
+            ts.s_RedBox)
 
-    # special operations inserted by the HintGraphTransformer
+    def translate_op_ptr_ne(self, hop):
+        return self.translate_op_ptr_eq(hop, reverse=True)
 
 
+    # special operations inserted by the HintGraphTransformer
+
     def translate_op_ensure_queue(self, hop, prefix=''):
         mpfamily = hop.args_v[0].value
         subclass = self.get_dispatch_subclass(mpfamily)

Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py	Mon Nov 20 21:13:39 2006
@@ -10,6 +10,10 @@
 
 FOLDABLE_OPS = dict.fromkeys(lloperation.enum_foldable_ops())
 
+FOLDABLE_GREEN_OPS = FOLDABLE_OPS.copy()
+FOLDABLE_GREEN_OPS['getfield'] = None
+FOLDABLE_GREEN_OPS['getarrayitem'] = None
+
 debug_view = lloperation.llop.debug_view
 debug_print = lloperation.llop.debug_print
 
@@ -96,8 +100,8 @@
     genvar = jitstate.curbuilder.genop_malloc_varsize(alloctoken, gv_size)
     return rvalue.PtrRedBox(contdesc.ptrkind, genvar)
 
-def ll_gengetfield(jitstate, fielddesc, argbox):
-    if fielddesc.immutable and argbox.is_constant():
+def ll_gengetfield(jitstate, deepfrozen, fielddesc, argbox):
+    if (fielddesc.immutable or deepfrozen) and argbox.is_constant():
         res = getattr(rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE),
                       fielddesc.fieldname)
         return rvalue.ll_fromvalue(jitstate, res)
@@ -113,8 +117,9 @@
         return rvalue.ll_fromvalue(jitstate, res)
     return argbox.op_getsubstruct(jitstate, fielddesc)
 
-def ll_gengetarrayitem(jitstate, fielddesc, argbox, indexbox):
-    if fielddesc.immutable and argbox.is_constant() and indexbox.is_constant():
+def ll_gengetarrayitem(jitstate, deepfrozen, fielddesc, argbox, indexbox):
+    if ((fielddesc.immutable or deepfrozen) and argbox.is_constant()
+                                            and indexbox.is_constant()):
         array = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
         res = array[rvalue.ll_getvalue(indexbox, lltype.Signed)]
         return rvalue.ll_fromvalue(jitstate, res)
@@ -126,7 +131,7 @@
     return fielddesc.redboxcls(fielddesc.kind, genvar)
 
 def ll_gengetarraysubstruct(jitstate, fielddesc, argbox, indexbox):
-    if fielddesc.immutable and argbox.is_constant() and indexbox.is_constant():
+    if argbox.is_constant() and indexbox.is_constant():
         array = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
         res = array[rvalue.ll_getvalue(indexbox, lltype.Signed)]
         return rvalue.ll_fromvalue(jitstate, res)
@@ -162,7 +167,6 @@
     if argbox.is_constant():
         addr = rvalue.ll_getvalue(argbox, llmemory.Address)
         return rvalue.ll_fromvalue(jitstate, bool(addr) ^ reverse)
-    assert isinstance(argbox, rvalue.PtrRedBox)
     builder = jitstate.curbuilder
     if argbox.content is None:
         gv_addr = argbox.getgenvar(builder)
@@ -174,6 +178,23 @@
         gv_res = builder.rgenop.genconst(True ^ reverse)
     return rvalue.IntRedBox(builder.rgenop.kindToken(lltype.Bool), gv_res)
 
+def ll_genptreq(jitstate, argbox0, argbox1, reverse):
+    builder = jitstate.curbuilder
+    if argbox0.content is not None or argbox1.content is not None:
+        equal = argbox0.content is argbox1.content
+        return rvalue.ll_fromvalue(jitstate, equal ^ reverse)
+    elif argbox0.is_constant() and argbox1.is_constant():
+        addr0 = rvalue.ll_getvalue(argbox0, llmemory.Address)
+        addr1 = rvalue.ll_getvalue(argbox1, llmemory.Address)
+        return rvalue.ll_fromvalue(jitstate, (addr0 == addr1) ^ reverse)
+    gv_addr0 = argbox0.getgenvar(builder)
+    gv_addr1 = argbox1.getgenvar(builder)
+    if reverse:
+        gv_res = builder.genop2("ptr_ne", gv_addr0, gv_addr1)
+    else:
+        gv_res = builder.genop2("ptr_eq", gv_addr0, gv_addr1)
+    return rvalue.IntRedBox(builder.rgenop.kindToken(lltype.Bool), gv_res)
+
 # ____________________________________________________________
 # other jitstate/graph level operations
 

Modified: pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py	Mon Nov 20 21:13:39 2006
@@ -1069,13 +1069,12 @@
         assert res == 42
         self.check_insns({})
 
-    def test_green_tuple(self):
-        py.test.skip("WIP")
+    def test_compile_time_const_tuple(self):
         d = {(4, 5): 42, (6, 7): 12}
         def f(a, b):
             d1 = hint(d, deepfreeze=True)
             return d1[a, b]
 
-        res = self.timeshift(f, [0, 4, 5], [0, 1, 2], policy=P_NOVIRTUAL)
+        res = self.timeshift(f, [4, 5], [0, 1], policy=P_NOVIRTUAL)
         assert res == 42
         self.check_insns({})



More information about the Pypy-commit mailing list