[pypy-commit] pypy result-in-resops: first real virtual test

fijal noreply at buildbot.pypy.org
Sun Oct 28 18:41:43 CET 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r58535:a08cae4bda5b
Date: 2012-10-28 18:21 +0100
http://bitbucket.org/pypy/pypy/changeset/a08cae4bda5b/

Log:	first real virtual test

diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -368,21 +368,29 @@
         return pendingfields
 
     def optimize_GETFIELD_GC_i(self, op):
-        structvalue = self.getvalue(op.getarg(0))
+        structvalue = self.getforwarded(op.getarg(0))
         cf = self.field_cache(op.getdescr())
         fieldvalue = cf.getfield_from_cache(self, structvalue)
         if fieldvalue is not None:
             self.replace(op, fieldvalue.op)
             return
         # default case: produce the operation
-        structvalue.ensure_nonnull()
-        self.emit_operation(op)
-        # then remember the result of reading the field
-        fieldvalue = self.getvalue(op)
-        cf.remember_field_value(structvalue, fieldvalue, op)
+        structvalue.setknownnonnull(True)
+        return op
+
     optimize_GETFIELD_GC_r = optimize_GETFIELD_GC_i
     optimize_GETFIELD_GC_f = optimize_GETFIELD_GC_i
 
+    def postprocess_GETFIELD_GC_i(self, op):
+        # then remember the result of reading the field
+        structvalue = self.getforwarded(op.getarg(0))
+        fieldvalue = self.getforwarded(op)
+        cf = self.field_cache(op.getdescr())
+        cf.remember_field_value(structvalue, fieldvalue, op)
+
+    postprocess_GETFIELD_GC_r = postprocess_GETFIELD_GC_i
+    postprocess_GETFIELD_GC_f = postprocess_GETFIELD_GC_i
+
     def optimize_GETFIELD_GC_PURE_i(self, op):
         structvalue = self.getvalue(op.getarg(0))
         cf = self.field_cache(op.getdescr())
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -561,6 +561,7 @@
 
     def store_final_boxes_in_guard(self, op):
         return op # XXX we disable it for tests
+        xxxx
         assert op.getdescr() is None
         descr = op.invent_descr(self.jitdriver_sd, self.metainterp_sd)
         op.setdescr(descr)
@@ -573,29 +574,6 @@
             raise compile.giveup()
         descr.store_final_boxes(op, newboxes)
         #
-        xxx
-        if op.getopnum() == rop.GUARD_VALUE:
-            xxx
-            if self.getvalue(op.getarg(0)).is_bool_box:
-                # Hack: turn guard_value(bool) into guard_true/guard_false.
-                # This is done after the operation is emitted to let
-                # store_final_boxes_in_guard set the guard_opnum field of the
-                # descr to the original rop.GUARD_VALUE.
-                constvalue = op.getarg(1).getint()
-                if constvalue == 0:
-                    newop = create_resop_1(rop.GUARD_FALSE, None,
-                                           op.getarg(0))
-                elif constvalue == 1: 
-                    newop = create_resop_1(rop.GUARD_TRUE, None,
-                                           op.getarg(0))
-                else:
-                    raise AssertionError("uh?")
-                newop.set_extra("failargs", op.get_extra("failargs"))
-                self.replace(op, newop)
-                return newop
-            else:
-                # a real GUARD_VALUE.  Make it use one counter per value.
-                descr.make_a_counter_per_value(op)
         return op
 
     def optimize_default(self, op):
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -440,8 +440,8 @@
                 fieldvalue = self.optimizer.new_const(op.getdescr())
             self.optimizer.replace(op, fieldvalue)
         else:
-            value.ensure_nonnull()
-            self.emit_operation(op)
+            value.setknownnonnull(True)
+            return op
     optimize_GETFIELD_GC_r = optimize_GETFIELD_GC_i
     optimize_GETFIELD_GC_f = optimize_GETFIELD_GC_i
 
diff --git a/pypy/jit/metainterp/virtualmodel.py b/pypy/jit/metainterp/virtualmodel.py
--- a/pypy/jit/metainterp/virtualmodel.py
+++ b/pypy/jit/metainterp/virtualmodel.py
@@ -1,5 +1,6 @@
 
-from pypy.jit.metainterp.resoperation import rop, opclasses
+from pypy.jit.metainterp.resoperation import rop, opclasses, create_resop_2
+from pypy.rlib.objectmodel import we_are_translated
 
 NEW_WITH_VTABLE = opclasses[rop.NEW_WITH_VTABLE]
 
@@ -34,8 +35,19 @@
     
     def force(self, optimizer):
         if not self._is_forced:
+            self._is_forced = True
             optimizer.emit_operation(self)
-            self._is_forced = True
+            iteritems = self._fields.iteritems()
+            if not we_are_translated(): #random order is fine, except for tests
+                iteritems = list(iteritems)
+                iteritems.sort(key = lambda (x,y): x.sort_key())
+            for ofs, value in iteritems:
+                if value.is_null():
+                    continue
+                subbox = value.force(optimizer)
+                op = create_resop_2(rop.SETFIELD_GC, None, self, subbox,
+                                    descr=ofs)
+                optimizer.emit_operation(op)
         return self
 
     def is_virtual(self):


More information about the pypy-commit mailing list