[pypy-commit] pypy result-in-resops: stop just short of starting to implement virtuals

fijal noreply at buildbot.pypy.org
Sat Oct 27 12:05:44 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r58500:b3ef852cc2fa
Date: 2012-10-27 12:05 +0200
http://bitbucket.org/pypy/pypy/changeset/b3ef852cc2fa/

Log:	stop just short of starting to implement virtuals

diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -213,13 +213,16 @@
         self.postprocess_guard(op, CONST_0)
 
     def optimize_GUARD_ISNULL(self, op):
-        value = self.getvalue(op.getarg(0))
+        value = self.getforwarded(op.getarg(0))
         if value.is_null():
             return
         elif value.is_nonnull():
             raise InvalidLoop('A GUARD_ISNULL was proven to always fail')
-        self.emit_operation(op)
-        value.make_constant(self.optimizer.cpu.ts.CONST_NULL)
+        return op
+
+    def postprocess_GUARD_ISNULL(self, op):
+        self.optimizer.make_constant(op.getarg(0),
+                                     self.optimizer.cpu.ts.CONST_NULL)
 
     def optimize_GUARD_NONNULL(self, op):
         value = self.getforwarded(op.getarg(0))
@@ -228,7 +231,7 @@
         elif value.is_null():
             raise InvalidLoop('A GUARD_NONNULL was proven to always fail')
         value.setknownnonnull(True)
-        value.setlastguardpos(self.optimizer.getpos())
+        value.setlastguardpos(self.optimizer.get_pos())
         return op
 
     def optimize_GUARD_VALUE(self, op):
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -433,13 +433,13 @@
     def test_ooisnull_on_null_ptr_1(self):
         ops = """
         [p0, p1]
-        guard_isnull(p0) []
-        guard_isnull(p0) []
+        guard_isnull(p0)
+        guard_isnull(p0)
         jump(p1, p1)
         """
         expected = """
         [p0, p1]
-        guard_isnull(p0) []
+        guard_isnull(p0)
         jump(p1, p1)
         """
         self.optimize_loop(ops, expected)
@@ -449,14 +449,14 @@
         [p0]
         pv = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(pv, p0, descr=valuedescr)
-        guard_nonnull(p0) []
+        guard_nonnull(p0)
         p1 = getfield_gc_r(pv, descr=valuedescr)
-        guard_nonnull(p1) []
+        guard_nonnull(p1)
         jump(p0)
         """
         expected = """
         [p0]
-        guard_nonnull(p0) []
+        guard_nonnull(p0)
         jump(p0)
         """
         self.optimize_loop(ops, expected)
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
@@ -453,14 +453,16 @@
     optimize_GETFIELD_GC_PURE_f = optimize_GETFIELD_GC_i
 
     def optimize_SETFIELD_GC(self, op):
-        value = self.getvalue(op.getarg(0))
+        value = self.getforwarded(op.getarg(0))
 
         if value.is_virtual():
-            fieldvalue = self.getvalue(op.getarg(1))
+            fieldvalue = self.getforwarded(op.getarg(1))
+            xxx
             value.setfield(op.getdescr(), fieldvalue)
         else:
+            xxx
             value.ensure_nonnull()
-            self.emit_operation(op)
+            return op
 
     def optimize_NEW_WITH_VTABLE(self, op):
         value = self.getforwarded(op)
diff --git a/pypy/jit/metainterp/optmodel.py b/pypy/jit/metainterp/optmodel.py
--- a/pypy/jit/metainterp/optmodel.py
+++ b/pypy/jit/metainterp/optmodel.py
@@ -75,11 +75,17 @@
 
                 if cls.getopnum() in (rop.NEW_WITH_VTABLE, rop.NEW):
                     def force(self, optimizer):
-                        optimizer.emit_operation(self)
+                        if not self._isforced:
+                            optimizer.emit_operation(self)
+                            self._isforced = True
                         return self
+                    def is_virtual(self):
+                        return not self._isforced
                 else:
                     def force(self, _):
                         return self
+                    def is_virtual(self):
+                        return False
             if cls.is_guard() or cls.getopnum() == rop.FINISH:
                 addattr(Mutable, 'failargs')
             if cls.is_guard():
@@ -95,6 +101,8 @@
                 addattr(Mutable, 'knownnonnull', False)
                 Mutable.is_nonnull = ref_is_nonnull
                 Mutable.is_null = ref_is_null
+            if cls.getopnum() in (rop.NEW_WITH_VTABLE, rop.NEW):
+                addattr(Mutable, 'isforced', False)
             # for tracking last guard and merging GUARD_VALUE with
             # GUARD_NONNULL etc
             addattr(Mutable, 'lastguardpos', -1)


More information about the pypy-commit mailing list