[pypy-svn] pypy jit-short-preamble: emit proper guards when inlining short preamble (work still in progress)

hakanardo commits-noreply at bitbucket.org
Fri Jan 21 12:16:24 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short-preamble
Changeset: r41115:dcd8e6a26bdd
Date: 2011-01-20 19:15 +0100
http://bitbucket.org/pypy/pypy/changeset/dcd8e6a26bdd/

Log:	emit proper guards when inlining short preamble (work still in
	progress)

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
@@ -172,7 +172,7 @@
                     # FIXME: This should save some memory but requires
                     # a lot of tests to be fixed...
                     loop.preamble.operations = short[:]
-                    
+
                 # Turn guards into conditional jumps to the preamble
                 for i in range(len(short)):
                     op = short[i]
@@ -180,7 +180,9 @@
                         op = op.clone()
                         #op.setfailargs(loop.preamble.inputargs)
                         #op.setjumptarget(loop.preamble.token)
-                        op.setdescr(loop.preamble.token.start_resumedescr)
+                        start_resumedescr = loop.preamble.token.start_resumedescr.clone_if_mutable()
+                        start_resumedescr.rd_snapshot.prev.boxes = loop.preamble.inputargs[:]
+                        op.setdescr(start_resumedescr)
                         short[i] = op
 
                 short_loop = TreeLoop('short preamble')

diff --git a/pypy/jit/metainterp/test/test_basic.py b/pypy/jit/metainterp/test/test_basic.py
--- a/pypy/jit/metainterp/test/test_basic.py
+++ b/pypy/jit/metainterp/test/test_basic.py
@@ -1908,17 +1908,20 @@
                     x = z
             return res
         def g(x, y):
-            a1 = f(A(x), y, A(x))
-            a2 = f(A(x), y, A(x))
-            b1 = f(B(x), y, B(x))
-            b2 = f(B(x), y, B(x))
+            #a1 = f(A(x), y, A(x))
+            #a2 = f(A(x), y, A(x))
+            #assert a1.val == a2.val
+            #return a1.val
+            #b1 = f(B(x), y, B(x))
+            #b2 = f(B(x), y, B(x))
+            #assert b1.val == b2.val
+            #return a1.val + b1.val
             c1 = f(B(x), y, A(x))
             c2 = f(B(x), y, A(x))
+            assert c1.val == c2.val
+            return c1.val
             d1 = f(A(x), y, B(x))
             d2 = f(A(x), y, B(x))
-            assert a1.val == a2.val
-            assert b1.val == b2.val
-            assert c1.val == c2.val
             assert d1.val == d2.val
             return a1.val + b1.val + c1.val + d1.val
         res = self.meta_interp(g, [3, 14])

diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -1796,7 +1796,7 @@
                     bridge_arg_boxes = self.retracing_loop_from.live_arg_boxes
                     self.compile_bridge_and_loop(original_boxes, \
                                                  live_arg_boxes, start,
-                                                 bridge_arg_boxes)
+                                                 bridge_arg_boxes, resumedescr)
                 else:
                     self.compile(original_boxes, live_arg_boxes, start, resumedescr)
                 # creation of the loop was cancelled!
@@ -1894,7 +1894,7 @@
             self.history.operations.pop()     # remove the JUMP
 
     def compile_bridge_and_loop(self, original_boxes, live_arg_boxes, start,
-                                bridge_arg_boxes):
+                                bridge_arg_boxes, start_resumedescr):
         num_green_args = self.jitdriver_sd.num_green_args
         original_inputargs = self.history.inputargs
         greenkey = original_boxes[:num_green_args]
@@ -1903,7 +1903,7 @@
         self.history.inputargs = original_boxes[num_green_args:]
         greenkey = original_boxes[:num_green_args]
         self.history.record(rop.JUMP, live_arg_boxes[num_green_args:], None)
-        loop_token = compile.compile_new_loop(self, [], greenkey, start)
+        loop_token = compile.compile_new_loop(self, [], greenkey, start, start_resumedescr)
         self.history.operations.pop()     # remove the JUMP
         if loop_token is None:
             return


More information about the Pypy-commit mailing list