Author: Hakan Ardo <[email protected]>
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'])
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit