[pypy-commit] pypy jit-short_from_state: dont allow ops generated by value.make_guards() from ending up in optimizer.pure_operations

hakanardo noreply at buildbot.pypy.org
Sat Aug 6 12:58:34 CEST 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r46319:8a90da458db4
Date: 2011-08-06 09:54 +0200
http://bitbucket.org/pypy/pypy/changeset/8a90da458db4/

Log:	dont allow ops generated by value.make_guards() from ending up in
	optimizer.pure_operations

diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -6683,12 +6683,13 @@
         i2 = int_ge(i1, 8)
         guard_true(i2) []
         p2 = getarrayitem_gc(p1, 7, descr=<GcPtrArrayDescr>)
-        jump(p0, p2)
-        """
-        expected = """
-        [p0, p2]
+        jump(p0, p2, p1)
+        """
+        expected = """
+        [p0, p2, p1]
         call(p2, descr=nonwritedescr)
-        jump(p0, p2)
+        i3 = arraylen_gc(p1) # Should be killed by backend
+        jump(p0, p2, p1)
         """
         self.optimize_loop(ops, expected, expected_short=short)
 
@@ -6760,12 +6761,13 @@
         i2 = int_ge(i1, 8)
         guard_true(i2) []
         p2 = getarrayitem_gc_pure(p1, 7, descr=<GcPtrArrayDescr>)
-        jump(p0, p2)
-        """
-        expected = """
-        [p0, p2]
+        jump(p0, p2, p1)
+        """
+        expected = """
+        [p0, p2, p1]
         call(p2, descr=nonwritedescr)
-        jump(p0, p2)
+        i3 = arraylen_gc(p1) # Should be killed by backend
+        jump(p0, p2, p1)
         """
         self.optimize_loop(ops, expected, expected_short=short)
         
@@ -6790,12 +6792,13 @@
         guard_true(i8) []
         i9 = int_le(i22, 255)
         guard_true(i9) []
-        jump(p0, i22)
-        """
-        expected = """
-        [p0, i22]
+        jump(p0, i22, p1)
+        """
+        expected = """
+        [p0, i22, p1]
         call(i22, descr=nonwritedescr)
-        jump(p0, i22)
+        i3 = strlen(p1) # Should be killed by backend
+        jump(p0, i22, p1)
         """
         self.optimize_loop(ops, expected, expected_short=short)
 
@@ -6817,12 +6820,13 @@
         i22 = unicodegetitem(p1, 7, descr=<GcPtrArrayDescr>)
         i8 = int_ge(i22, 0)
         guard_true(i8) []
-        jump(p0, i22)
-        """
-        expected = """
-        [p0, i22]
+        jump(p0, i22, p1)
+        """
+        expected = """
+        [p0, i22, p1]
         call(i22, descr=nonwritedescr)
-        jump(p0, i22)
+        i3 = unicodelen(p1) # Should be killed by backend        
+        jump(p0, i22, p1)
         """
         self.optimize_loop(ops, expected, expected_short=short)
         
@@ -6878,7 +6882,26 @@
         call(p1, descr=writeadescr)
         jump(p1, p1)
         """
-        self.optimize_loop(ops, expected)        
+        self.optimize_loop(ops, expected)
+
+    def test_value_guard_arraylen_reused(self):
+        ops = """
+        [p0, p1]
+        p10 = getfield_gc(p0, descr=nextdescr)
+        p11 = getfield_gc(p1, descr=nextdescr)
+        i1 = arraylen_gc(p10, descr=arraydescr)
+        getarrayitem_gc(p11, 1, descr=arraydescr)
+        call(i1, descr=nonwritedescr)
+        jump(p1, p0)
+        """
+        expected = """
+        [p0, p1, p10, p11]
+        i1 = arraylen_gc(p10, descr=arraydescr)
+        getarrayitem_gc(p11, 1, descr=arraydescr)
+        call(i1, descr=nonwritedescr)        
+        jump(p1, p0, p11, p10)
+        """
+        self.optimize_loop(ops, expected)
 
 class TestLLtype(OptimizeOptTest, LLtypeMixin):
     pass
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -210,7 +210,7 @@
                 debug_print('inputargs:       ' + args)
                 args = ", ".join([logops.repr_of_arg(arg) for arg in short_inputargs])
                 debug_print('short inputargs: ' + args)
-                self.short_boxes.debug_print(logops)            
+                self.short_boxes.debug_print(logops)
 
             # Force virtuals amoung the jump_args of the preamble to get the
             # operations needed to setup the proper state of those virtuals
@@ -238,8 +238,6 @@
             self.optimizer.emitting_dissabled = True
             for op in inputarg_setup_ops:
                 self.optimizer.send_extra_operation(op)
-            # XXX Hack to prevent previos loop from updateing pure_operations
-            self.optimizer.pure_operations = args_dict()
             seen = {}
             for op in self.short_boxes.operations():
                 self.ensure_short_op_emitted(op, self.optimizer, seen)
@@ -254,6 +252,12 @@
             self.optimizer.flush()
             self.optimizer.emitting_dissabled = False
 
+            # XXX Hack to prevent the arraylen/strlen/unicodelen ops generated
+            #     by value.make_guards() from ending up in pure_operations
+            for key, op in self.optimizer.pure_operations.items():
+                if not self.short_boxes.has_producer(op.result):
+                    del self.optimizer.pure_operations[key]
+
             initial_inputargs_len = len(inputargs)
             self.inliner = Inliner(loop.inputargs, jump_args)
 
@@ -375,7 +379,6 @@
             self.optimizer.send_extra_operation(newop)
         
         self.optimizer.flush()
-                    
 
         i = j = 0
         while i < len(self.optimizer.newoperations) or j < len(jumpargs):
diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -2934,7 +2934,7 @@
                 i += 1
         res = self.meta_interp(f, [32])
         assert res == f(32)
-        self.check_loops(arraylen_gc=1)
+        self.check_loops(arraylen_gc=2)
         
 class TestOOtype(BasicTests, OOJitMixin):
 
@@ -3203,7 +3203,7 @@
             return sa
         res = self.meta_interp(f, [32])
         assert res == f(32)
-        self.check_loops(arraylen_gc=1, everywhere=True)
+        self.check_loops(arraylen_gc=2, everywhere=True)
         
     def test_release_gil_flush_heap_cache(self):
         T = rffi.CArrayPtr(rffi.TIME_T)


More information about the pypy-commit mailing list