[pypy-svn] pypy jit-short_from_state: short preamble will need key boxes aswell since they are used in the snapshots
hakanardo
commits-noreply at bitbucket.org
Fri Apr 22 15:10:18 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r43535:89f55c6c0db4
Date: 2011-04-22 15:08 +0200
http://bitbucket.org/pypy/pypy/changeset/89f55c6c0db4/
Log: short preamble will need key boxes aswell since they are used in the
snapshots
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
@@ -175,7 +175,7 @@
initial_inputargs_len = len(inputargs)
- inputargs, short = self.inline(self.cloned_operations,
+ inputargs, short_inputargs, short = self.inline(self.cloned_operations,
loop.inputargs, jump_args,
virtual_state)
#except KeyError:
@@ -225,9 +225,10 @@
short[i] = op
short_loop = TreeLoop('short preamble')
- short_loop.inputargs = loop.inputargs[:initial_inputargs_len]
+ short_loop.inputargs = short_inputargs
short_loop.operations = short
+
# Clone ops and boxes to get private versions and
newargs = [a.clonebox() for a in short_loop.inputargs]
inliner = Inliner(short_loop.inputargs, newargs)
@@ -261,6 +262,7 @@
values = [self.getvalue(arg) for arg in jump_args]
inputargs = virtual_state.make_inputargs(values)
short_jumpargs = inputargs[:]
+ short_inputargs = virtual_state.make_inputargs(values, keyboxes=True)
# This loop is equivalent to the main optimization loop in
# Optimizer.propagate_all_forward
@@ -268,19 +270,21 @@
for newop in loop_operations:
newop = inliner.inline_op(newop, clone=False)
if newop.getopnum() == rop.JUMP:
- values = [self.getvalue(arg) for arg in newop.getarglist()]
- newop.initarglist(virtual_state.make_inputargs(values))
jumpop = newop
break
#self.optimizer.first_optimization.propagate_forward(newop)
self.optimizer.send_extra_operation(newop)
- assert jumpop
self.boxes_created_this_iteration = {}
- jumpargs = jumpop.getarglist()
- self.short_inliner = Inliner(inputargs, jumpargs)
+ assert jumpop
+ values = [self.getvalue(arg) for arg in jumpop.getarglist()]
+ jumpargs = virtual_state.make_inputargs(values)
+ newop.initarglist(jumpargs)
+ jmp_to_short_args = virtual_state.make_inputargs(values, keyboxes=True)
+ self.short_inliner = Inliner(short_inputargs, jmp_to_short_args)
+
short = []
short_seen = {}
for box, const in self.constant_inputargs.items():
@@ -316,7 +320,7 @@
jumpop.initarglist(jumpargs)
self.optimizer.send_extra_operation(jumpop)
short.append(ResOperation(rop.JUMP, short_jumpargs, None))
- return inputargs, short
+ return inputargs, short_inputargs, short
def add_op_to_short(self, op, short, short_seen):
if op is None:
@@ -640,8 +644,11 @@
#if self.inline(sh.operations, sh.inputargs,
# op.getarglist(), dryrun=True):
try:
- self.inline(sh.operations, sh.inputargs,
- op.getarglist())
+ values = [self.getvalue(arg)
+ for arg in op.getarglist()]
+ args = virtual_state.make_inputargs(values,
+ keyboxes=True)
+ self.inline(sh.operations, sh.inputargs, args)
except InvalidLoop:
debug_print("Inlining failed unexpectedly",
"jumping to preamble instead")
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
@@ -1703,7 +1703,7 @@
res = self.meta_interp(g, [6, 14])
assert res == g(6, 14)
self.check_loop_count(9)
- self.check_loops(getarrayitem_gc=6, everywhere=True)
+ self.check_loops(getarrayitem_gc=8, everywhere=True)
def test_multiple_specialied_versions_bridge(self):
myjitdriver = JitDriver(greens = [], reds = ['y', 'x', 'z', 'res'])
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -5,7 +5,7 @@
LEVEL_NONNULL, \
LEVEL_UNKNOWN, \
MININT, MAXINT
-from pypy.jit.metainterp.history import BoxInt, ConstInt, BoxPtr
+from pypy.jit.metainterp.history import BoxInt, ConstInt, BoxPtr, Const
from pypy.jit.metainterp.optimizeutil import InvalidLoop
from pypy.jit.metainterp.optimizeopt.intutils import IntBound
from pypy.jit.metainterp.resoperation import rop, ResOperation
@@ -222,13 +222,20 @@
self.state[i].generate_guards(other.state[i], args[i],
cpu, extra_guards)
- def make_inputargs(self, values):
+ def make_inputargs(self, values, keyboxes=False):
assert len(values) == len(self.state)
inputargs = []
seen_inputargs = {}
for i in range(len(values)):
self.state[i].enum_forced_boxes(inputargs, seen_inputargs,
values[i])
+
+ if keyboxes:
+ for value in values:
+ box = value.get_key_box()
+ if box not in inputargs and not isinstance(box, Const):
+ inputargs.append(box)
+
return inputargs
More information about the Pypy-commit
mailing list