[pypy-commit] pypy optresult-unroll: test and a fix

fijal noreply at buildbot.pypy.org
Fri Aug 28 16:59:24 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79280:c3486c27afbd
Date: 2015-08-28 16:59 +0200
http://bitbucket.org/pypy/pypy/changeset/c3486c27afbd/

Log:	test and a fix

diff --git a/rpython/jit/metainterp/optimizeopt/earlyforce.py b/rpython/jit/metainterp/optimizeopt/earlyforce.py
--- a/rpython/jit/metainterp/optimizeopt/earlyforce.py
+++ b/rpython/jit/metainterp/optimizeopt/earlyforce.py
@@ -26,7 +26,7 @@
             not is_raw_free(op, opnum)):
 
             for arg in op.getarglist():
-                self.optimizer.force_box(arg)
+                self.optimizer.force_box(arg, self)
         self.emit_operation(op)
 
     def setup(self):
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -146,8 +146,8 @@
     def getlastop(self):
         return self.optimizer.getlastop()
 
-    def force_box(self, box):
-        return self.optimizer.force_box(box)
+    def force_box(self, box, optforce=None):
+        return self.optimizer.force_box(box, optforce)
 
     def replace_op_with(self, op, newopnum, args=None, descr=None):
         return self.optimizer.replace_op_with(op, newopnum, args, descr)
@@ -336,8 +336,10 @@
             return op
         return op.get_box_replacement(not_const)
 
-    def force_box(self, op):
+    def force_box(self, op, optforce=None):
         op = self.get_box_replacement(op)
+        if optforce is None:
+            optforce = self
         info = op.get_forwarded()
         if self.optunroll and self.optunroll.potential_extra_ops:
             # XXX hack
@@ -351,7 +353,7 @@
         if info is not None:
             if op.type == 'i' and info.is_constant():
                 return ConstInt(info.getint())
-            return info.force_box(op, self)
+            return info.force_box(op, optforce)
         return op
 
     def is_inputarg(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -579,9 +579,9 @@
         i3 = getfield_gc_i(p3, descr=valuedescr)
         escape_n(i3)
         p1 = new_with_vtable(descr=nodesize)
-        setfield_gc(p1, i1, descr=valuedescr)
         p1sub = new_with_vtable(descr=nodesize2)
         setfield_gc(p1sub, i1, descr=valuedescr)
+        setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p1, p1sub, descr=nextdescr)
         jump(i1, p1, p2)
         """
@@ -5785,5 +5785,25 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_force_virtual_write(self):
+        ops = """
+        [i1, i2]
+        p1 = new(descr=ssize)
+        setfield_gc(p1, i1, descr=adescr)
+        setfield_gc(p1, i2, descr=bdescr)
+        call_n(123, p1, descr=writeadescr)
+        i3 = getfield_gc_i(p1, descr=bdescr)
+        finish(i3)
+        """
+        expected = """
+        [i1, i2]
+        p1 = new(descr=ssize)
+        setfield_gc(p1, i1, descr=adescr)
+        call_n(123, p1, descr=writeadescr)
+        setfield_gc(p1, i2, descr=bdescr)
+        finish(i2)
+        """
+        self.optimize_loop(ops, expected)
+
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass


More information about the pypy-commit mailing list