[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