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

arigo at codespeak.net arigo at codespeak.net
Fri Mar 31 19:25:59 CEST 2006


Author: arigo
Date: Fri Mar 31 19:25:58 2006
New Revision: 25196

Modified:
   pypy/dist/pypy/jit/hintmodel.py
   pypy/dist/pypy/jit/rtimeshift.py
   pypy/dist/pypy/jit/test/test_hint_timeshift.py
   pypy/dist/pypy/jit/test/test_llabstractinterp.py
Log:
(pedronis, arre, arigo)

Pass the next test: propagation of VirtualRedBoxes across links.


Modified: pypy/dist/pypy/jit/hintmodel.py
==============================================================================
--- pypy/dist/pypy/jit/hintmodel.py	(original)
+++ pypy/dist/pypy/jit/hintmodel.py	Fri Mar 31 19:25:58 2006
@@ -168,6 +168,11 @@
     def setfield(hs_v1, hs_fieldname, hs_value):
         pass
 
+    def getsubstruct(hs_v1, hs_fieldname):
+        S = hs_v1.concretetype.TO
+        FIELD_TYPE = getattr(S, hs_fieldname.const)
+        return SomeLLAbstractVariable(lltype.Ptr(FIELD_TYPE))
+
 class __extend__(SomeLLAbstractConstant):
 
     def hint(hs_c1, hs_flags):

Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/rtimeshift.py	Fri Mar 31 19:25:58 2006
@@ -32,6 +32,9 @@
     def same_constant(self, other):
         return False
 
+    def getallvariables(self, result_gv):
+        pass
+
     # generic implementation of some operations
     def op_getfield(self, jitstate, fielddesc):
         op_args = lltype.malloc(VARLIST.TO, 2)
@@ -59,6 +62,14 @@
     def getgenvar(self, jitstate):
         return self.genvar
 
+    def getallvariables(self, result_gv):
+        result_gv.append(self.genvar)
+
+    def copybox(self, newblock, gv_type):
+        newgenvar = rgenop.geninputarg(newblock, gv_type)
+        return VarRedBox(newgenvar)
+
+
 VCONTAINER = lltype.GcStruct("vcontainer")
 
 class ContainerRedBox(RedBox):
@@ -116,6 +127,25 @@
                                    boxes[i])
         return self.genvar
 
+    def getallvariables(self, result_gv):
+        if self.genvar:
+            result_gv.append(self.genvar)
+        else:
+            for smallbox in self.content_boxes:
+                smallbox.getallvariables(result_gv)
+
+    def copybox(self, newblock, gv_type):
+        if self.genvar:
+            newgenvar = rgenop.geninputarg(newblock, gv_type)
+            return VarRedBox(newgenvar)
+        bigbox = VirtualRedBox(self.typedesc)
+        for i in range(len(bigbox.content_boxes)):
+            # XXX need a memo for sharing
+            gv_fldtype = self.typedesc.fielddescs[i].gv_resulttype
+            bigbox.content_boxes[i] = self.content_boxes[i].copybox(newblock,
+                                                                    gv_fldtype)
+        return bigbox
+
     def op_getfield(self, jitstate, fielddesc):
         if self.content_boxes is None:
             return RedBox.op_getfield(self, jitstate, fielddesc)
@@ -137,6 +167,9 @@
     def getgenvar(self, jitstate):
         return self.genvar
 
+    def copybox(self, newblock, gv_type):
+        return self
+
     def ll_fromvalue(value):
         T = lltype.typeOf(value)
         gv = rgenop.genconst(value)
@@ -435,15 +468,13 @@
     return jitstate
 retrieve_jitstate_for_merge._annspecialcase_ = "specialize:arglltype(2)"
     
-def enter_block(jitstate, redboxes, TYPES):
+def enter_block(jitstate, redboxes, types_gv):
     newblock = rgenop.newblock()
     incoming = []
     for i in range(len(redboxes)):
         redbox = redboxes[i]
-        if isinstance(redbox, VarRedBox):
-            incoming.append(redbox.genvar)
-            newgenvar = rgenop.geninputarg(newblock, TYPES[i])
-            redboxes[i] = VarRedBox(newgenvar)
+        redbox.getallvariables(incoming)
+        redboxes[i] = redbox.copybox(newblock, types_gv[i])
     rgenop.closelink(jitstate.curoutgoinglink, incoming, newblock)
     jitstate.curblock = newblock
     jitstate.curoutgoinglink = lltype.nullptr(rgenop.LINK.TO)

Modified: pypy/dist/pypy/jit/test/test_hint_timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/test/test_hint_timeshift.py	(original)
+++ pypy/dist/pypy/jit/test/test_hint_timeshift.py	Fri Mar 31 19:25:58 2006
@@ -372,3 +372,30 @@
     insns, res = timeshift(ll_function, [42], [], policy=P_NOVIRTUAL)
     assert res == 42
     assert insns == {}
+
+def test_red_propagate():
+    S = lltype.GcStruct('S', ('n', lltype.Signed))
+    def ll_function(n, k):
+        s = lltype.malloc(S)
+        s.n = n
+        if k < 0:
+            return -123
+        return s.n * k
+    insns, res = timeshift(ll_function, [3, 8], [], policy=P_NOVIRTUAL)
+    assert res == 24
+    assert insns == {'int_lt': 1, 'int_mul': 1}
+
+def test_red_subcontainer():
+    py.test.skip("in-progress")
+    S = lltype.Struct('S', ('n', lltype.Signed))
+    T = lltype.GcStruct('T', ('s', S), ('n', lltype.Float))
+    def ll_function(k):
+        t = lltype.malloc(T)
+        s = t.s
+        s.n = k
+        if k > 0:
+            k -= 1
+        return s.n * k
+    insns, res = timeshift(ll_function, [7], [], policy=P_NOVIRTUAL)
+    assert res == 42
+    #assert insns == ...   in-progress

Modified: pypy/dist/pypy/jit/test/test_llabstractinterp.py
==============================================================================
--- pypy/dist/pypy/jit/test/test_llabstractinterp.py	(original)
+++ pypy/dist/pypy/jit/test/test_llabstractinterp.py	Fri Mar 31 19:25:58 2006
@@ -66,7 +66,8 @@
         graph = graphs.pop()
         for block in graph.iterblocks():
             for op in block.operations:
-                insns[op.opname] = insns.get(op.opname, 0) + 1
+                if op.opname != 'same_as':
+                    insns[op.opname] = insns.get(op.opname, 0) + 1
                 for arg in op.args:
                     if isinstance(arg, flowmodel.Constant):
                         if (isinstance(arg.concretetype, lltype.Ptr) and



More information about the Pypy-commit mailing list