[pypy-commit] pypy jit-short_from_state: emit guards needed to match virtalstates before inlining the short preamble as the short preamble might relay on boxes belogning to the classes enforced by those gurads
hakanardo
noreply at buildbot.pypy.org
Tue Jun 7 21:54:55 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r44819:f6a6bbb43c28
Date: 2011-06-07 21:55 +0200
http://bitbucket.org/pypy/pypy/changeset/f6a6bbb43c28/
Log: emit guards needed to match virtalstates before inlining the short
preamble as the short preamble might relay on boxes belogning to the
classes enforced by those gurads
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
@@ -632,8 +632,6 @@
class OptInlineShortPreamble(Optimization):
def __init__(self, retraced):
self.retraced = retraced
- self.inliner = None
-
def reconstruct_for_next_iteration(self, short_boxes, surviving_boxes,
optimizer, valuemap):
@@ -680,30 +678,28 @@
if ok:
debug_stop('jit-log-virtualstate')
- # FIXME: Do we still need the dry run
- #if self.inline(sh.operations, sh.inputargs,
- # op.getarglist(), dryrun=True):
+
+ values = [self.getvalue(arg)
+ for arg in op.getarglist()]
+ args = sh.virtual_state.make_inputargs(values,
+ keyboxes=True)
+ inliner = Inliner(sh.inputargs, args)
+
+ for guard in extra_guards:
+ if guard.is_guard():
+ descr = sh.start_resumedescr.clone_if_mutable()
+ inliner.inline_descr_inplace(descr)
+ guard.setdescr(descr)
+ self.emit_operation(guard)
+
try:
- values = [self.getvalue(arg)
- for arg in op.getarglist()]
- args = sh.virtual_state.make_inputargs(values,
- keyboxes=True)
- self.inline(sh.operations, sh.inputargs, args)
+ for shop in sh.operations:
+ newop = inliner.inline_op(shop)
+ self.emit_operation(newop)
except InvalidLoop:
debug_print("Inlining failed unexpectedly",
"jumping to preamble instead")
self.emit_operation(op)
- else:
- jumpop = self.optimizer.newoperations.pop()
- assert jumpop.getopnum() == rop.JUMP
- for guard in extra_guards:
- if guard.is_guard():
- descr = sh.start_resumedescr.clone_if_mutable()
- self.inliner.inline_descr_inplace(descr)
- guard.setdescr(descr)
-
- self.emit_operation(guard)
- self.optimizer.newoperations.append(jumpop)
return
debug_stop('jit-log-virtualstate')
retraced_count = loop_token.retraced_count
@@ -728,23 +724,3 @@
else:
loop_token.failed_states.append(virtual_state)
self.emit_operation(op)
-
-
-
- def inline(self, loop_operations, loop_args, jump_args, dryrun=False):
- self.inliner = inliner = Inliner(loop_args, jump_args)
-
- for op in loop_operations:
- newop = inliner.inline_op(op)
- if not dryrun:
- self.emit_operation(newop)
- else:
- if not self.is_emittable(newop):
- return False
-
- return True
-
- #def inline_arg(self, arg):
- # if isinstance(arg, Const):
- # return arg
- # return self.argmap[arg]
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
@@ -2499,7 +2499,7 @@
i += 1
return sa
assert self.meta_interp(f, [20]) == f(20)
- self.check_loops(int_gt=1, int_lt=3, int_ge=3, int_le=1)
+ self.check_loops(int_gt=1, int_lt=3, int_ge=2, int_le=1)
def test_intbounds_not_generalized2(self):
myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa', 'node'])
More information about the pypy-commit
mailing list