[pypy-svn] r51266 - in pypy/branch/jit-refactoring/pypy/jit: rainbow rainbow/test timeshifter

cfbolz at codespeak.net cfbolz at codespeak.net
Mon Feb 4 21:10:18 CET 2008


Author: cfbolz
Date: Mon Feb  4 21:10:16 2008
New Revision: 51266

Modified:
   pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
   pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
Log:
simple virtual container test passes


Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py	Mon Feb  4 21:10:16 2008
@@ -144,7 +144,21 @@
                 linkfalse, linktrue = linktrue, linkfalse
             color = self.varcolor(block.exitswitch)
             index = self.serialize_oparg(color, block.exitswitch)
-            self.emit("%s_goto_iftrue" % color)
+            srcopname, srcargs = self.trace_back_bool_var(
+                block, block.exitswitch)
+            if color == "red" and srcopname is not None:
+                if srcopname == 'ptr_nonzero':
+                    reverse = False
+                    split_extras = srcargs
+                elif srcopname == 'ptr_iszero':
+                    reverse = True
+                    split_extras = srcargs
+                ptrindex = self.serialize_oparg("red", srcargs[0])
+                self.emit("red_goto_ifptrnonzero")
+                self.emit(reverse)
+                self.emit(ptrindex)
+            else:
+                self.emit("%s_goto_iftrue" % color)
             self.emit(index)
             self.emit(tlabel(linktrue))
             self.insert_renaming(linkfalse)
@@ -192,7 +206,10 @@
     def serialize_op(self, op):
         specialcase = getattr(self, "serialize_op_%s" % (op.opname, ), None)
         if specialcase is not None:
-            return specialcase(op)
+            try:
+                return specialcase(op)
+            except NotImplementedError:
+                pass
         color = self.opcolor(op)
         args = []
         for arg in op.args:
@@ -445,6 +462,14 @@
     def serialize_op_indirect_call(self, op):
         XXX
 
+    def serialize_op_malloc(self, op):
+        index = self.structtypedesc_position(op.args[0].value)
+        self.emit("red_malloc", index)
+        self.register_redvar(op.result)
+
+    def serialize_op_zero_gc_pointers_inside(self, op):
+        pass # XXX is that right?
+
     def serialize_op_getfield(self, op):
         assert self.opcolor(op) == "red"
         args = op.args
@@ -478,6 +503,33 @@
         self.register_redvar(op.result)
 
 
+    def serialize_op_setfield(self, op):
+        args = op.args
+        PTRTYPE = args[0].concretetype
+        VALUETYPE = args[2].concretetype
+        if VALUETYPE is lltype.Void:
+            return
+        if args[0] == self.exceptiondesc.cexcdata:
+            # reading one of the exception boxes (exc_type or exc_value)
+            fieldname = args[1].value
+            val = self.serialize_oparg("red", args[2])
+            if fieldname == 'exc_type':
+                self.emit("write_exctype", val)
+            elif fieldname == 'exc_value':
+                self.emit("write_excvalue", val)
+            else:
+                raise Exception("getfield(exc_data, %r)" % (fieldname,))
+            return
+        # non virtual case                
+        destboxindex = self.serialize_oparg("red", args[0])
+        valboxindex = self.serialize_oparg("red", args[2])
+        fieldname = args[1].value
+        fielddescindex = self.fielddesc_position(PTRTYPE.TO, fieldname)
+        if fielddescindex == -1:   # Void field
+            return
+        self.emit("red_setfield", destboxindex, fielddescindex, valboxindex)
+
+
     # call handling
 
     def graphs_from(self, spaceop):
@@ -505,6 +557,29 @@
             tsgraph = self.specialized_graph_of(graph, args_v, spaceop.result)
             yield graph, tsgraph
 
+    def trace_back_bool_var(self, block, v):
+        """Return the (opname, arguments) that created the exitswitch of
+        the block.  The opname is None if not found.
+        """
+        inverted = False
+        for i in range(len(block.operations)-1, -1, -1):
+            op = block.operations[i]
+            if op.result is v:
+                if op.opname == 'bool_not':
+                    inverted = not inverted
+                    [v] = op.args
+                elif op.opname == 'same_as':
+                    [v] = op.args
+                else:
+                    opname = op.opname
+                    opargs = op.args
+                    if inverted:
+                        opname = {'ptr_nonzero': 'ptr_iszero',
+                                  'ptr_iszero' : 'ptr_nonzero'}.get(opname)
+                    return opname, opargs    # found
+        # not found, comes from earlier block - give up
+        return None, None
+
     def guess_call_kind(self, spaceop):
         if spaceop.opname == 'direct_call':
             c_func = spaceop.args[0]

Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py	Mon Feb  4 21:10:16 2008
@@ -1,6 +1,6 @@
 from pypy.rlib.rarithmetic import intmask
 from pypy.rlib.unroll import unrolling_iterable
-from pypy.jit.timeshifter import rtimeshift
+from pypy.jit.timeshifter import rtimeshift, rcontainer
 from pypy.jit.timeshifter.greenkey import empty_key, GreenKey
 from pypy.rpython.lltypesystem import lltype
 
@@ -201,6 +201,35 @@
         if descision:
             self.frame.pc = target
 
+    def opimpl_red_goto_ifptrnonzero(self):
+        reverse = self.load_bool()
+        ptrbox = self.get_redarg()
+        switchbox = self.get_redarg()
+        target = self.load_4byte()
+        # XXX not sure about passing no green vars
+        descision = rtimeshift.split_ptr_nonzero(self.jitstate, switchbox,
+                                                 self.frame.pc, ptrbox, reverse)
+        if descision:
+            self.frame.pc = target
+
+    def opimpl_red_ptr_nonzero(self, reverse=False):
+        ptrbox = self.get_redarg()
+        resultbox = rtimeshift.genptrnonzero(self.jitstate, ptrbox, reverse)
+        self.red_result(resultbox)
+
+    def opimpl_red_ptr_iszero(self):
+        self.opimpl_red_ptr_nonzero(reverse=True)
+
+    def opimpl_red_ptr_eq(self, reverse=False):
+        ptrbox1 = self.get_redarg()
+        ptrbox2 = self.get_redarg()
+        resultbox = rtimeshift.genptreq(self.jitstate, ptrbox1,
+                                        ptrbox2, reverse)
+        self.red_result(resultbox)
+
+    def opimpl_red_ptr_ne(self):
+        self.opimpl_red_ptr_eq(reverse=True)
+
     def opimpl_red_return(self):
         rtimeshift.save_return(self.jitstate)
         return self.dispatch()
@@ -296,8 +325,21 @@
     def opimpl_read_excvalue(self):
         XXX
 
+    def opimpl_write_exctype(self):
+        typebox = self.get_redarg()
+        rtimeshift.setexctypebox(self.jitstate, typebox)
+
+    def opimpl_write_excvalue(self):
+        valuebox = self.get_redarg()
+        rtimeshift.setexcvaluebox(self.jitstate, valuebox)
+
     # structs and arrays
 
+    def opimpl_red_malloc(self):
+        structtypedesc = self.frame.bytecode.structtypedescs[self.load_2byte()]
+        redbox = rcontainer.create(self.jitstate, structtypedesc)
+        self.red_result(redbox)
+
     def opimpl_red_getfield(self):
         structbox = self.get_redarg()
         fielddesc = self.frame.bytecode.fielddescs[self.load_2byte()]
@@ -306,6 +348,12 @@
                                         structbox)
         self.red_result(resbox)
 
+    def opimpl_red_setfield(self):
+        destbox = self.get_redarg()
+        fielddesc = self.frame.bytecode.fielddescs[self.load_2byte()]
+        valuebox = self.get_redarg()
+        resbox = rtimeshift.gensetfield(self.jitstate, fielddesc, destbox,
+                valuebox)
 
     # ____________________________________________________________
     # construction-time interface

Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py	Mon Feb  4 21:10:16 2008
@@ -708,7 +708,6 @@
         self.check_insns({'int_add': 2, 'int_sub': 1})
 
     def test_red_virtual_container(self):
-        py.test.skip("arrays and structs are not working")
         # this checks that red boxes are able to be virtualized dynamically by
         # the compiler (the P_NOVIRTUAL policy prevents the hint-annotator from
         # marking variables in blue)
@@ -717,7 +716,7 @@
             s = lltype.malloc(S)
             s.n = n
             return s.n
-        res = self.interpret(ll_function, [42], [], policy=P_NOVIRTUAL)
+        res = self.interpret(ll_function, [42], [])
         assert res == 42
         self.check_insns({})
 

Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py	Mon Feb  4 21:10:16 2008
@@ -222,7 +222,7 @@
     return interiordesc.gengetinteriorarraysize(jitstate, argbox, *indexboxes)
 
 
-def ll_genptrnonzero(jitstate, argbox, reverse):
+def genptrnonzero(jitstate, argbox, reverse):
     if argbox.is_constant():
         addr = rvalue.ll_getvalue(argbox, llmemory.Address)
         return rvalue.ll_fromvalue(jitstate, bool(addr) ^ reverse)
@@ -237,7 +237,7 @@
             gv_res = builder.genop_ptr_nonzero(argbox.kind, gv_addr)
     return rvalue.IntRedBox(builder.rgenop.kindToken(lltype.Bool), gv_res)
 
-def ll_genptreq(jitstate, argbox0, argbox1, reverse):
+def genptreq(jitstate, argbox0, argbox1, reverse):
     builder = jitstate.curbuilder
     if argbox0.is_constant() and argbox1.is_constant():
         addr0 = rvalue.ll_getvalue(argbox0, llmemory.Address)



More information about the Pypy-commit mailing list