Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r44086:ca94dec594aa
Date: 2011-05-11 19:34 +0200
http://bitbucket.org/pypy/pypy/changeset/ca94dec594aa/
Log: retrace tests
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
@@ -606,14 +606,14 @@
def propagate_forward(self, op):
if op.getopnum() == rop.JUMP:
- descr = op.getdescr()
- assert isinstance(descr, LoopToken)
+ loop_token = op.getdescr()
+ assert isinstance(loop_token, LoopToken)
# FIXME: Use a tree, similar to the tree formed by the full
# preamble and it's bridges, instead of a list to save time and
# memory. This should also allow better behaviour in
# situations that the is_emittable() chain currently cant
# handle and the inlining fails unexpectedly belwo.
- short = descr.short_preamble
+ short = loop_token.short_preamble
if short:
args = op.getarglist()
modifier = VirtualStateAdder(self.optimizer)
@@ -654,22 +654,22 @@
assert jumpop.getopnum() == rop.JUMP
for guard in extra_guards:
if guard.is_guard():
- d = sh.start_resumedescr.clone_if_mutable()
- self.inliner.inline_descr_inplace(d)
- guard.setdescr(d)
+ 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
- # FIXME: rename descr => loop_token, d => descr
- retraced_count = descr.retraced_count
- descr.retraced_count += 1
+ retraced_count = loop_token.retraced_count
+ loop_token.retraced_count += 1
limit =
self.optimizer.metainterp_sd.warmrunnerdesc.memory_manager.retrace_limit
if not self.retraced and retraced_count<limit:
- if not descr.failed_states:
+ if not loop_token.failed_states:
debug_print("Retracing (%d of %d)" % (retraced_count,
limit))
raise RetraceLoop
- for failed in descr.failed_states:
+ for failed in loop_token.failed_states:
if failed.generalization_of(virtual_state):
# Retracing once more will most likely fail again
break
@@ -678,10 +678,10 @@
limit))
raise RetraceLoop
else:
- if not descr.failed_states:
- descr.failed_states=[virtual_state]
+ if not loop_token.failed_states:
+ loop_token.failed_states=[virtual_state]
else:
- descr.failed_states.append(virtual_state)
+ loop_token.failed_states.append(virtual_state)
self.emit_operation(op)
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
@@ -2389,17 +2389,54 @@
assert self.meta_interp(f, [20]) == f(20)
self.check_loops(int_gt=1, int_lt=2, int_ge=0, int_le=0)
+ def test_intbounds_not_generalized(self):
+ # FIXME
+ assert False
+
def test_retrace_ending_up_retrazing_another_loop(self):
# FIXME
assert False
- def test_retrace_limit(self):
- # FIXME
- assert False
+ def test_retrace_limit1(self):
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa', 'a'])
+
+ def f(n, limit):
+ myjitdriver.set_param('retrace_limit', limit)
+ sa = i = a = 0
+ while i < n:
+ myjitdriver.jit_merge_point(n=n, i=i, sa=sa, a=a)
+ a = i/4
+ a = hint(a, promote=True)
+ sa += a
+ i += 1
+ return sa
+ assert self.meta_interp(f, [20, 2]) == f(20, 2)
+ self.check_tree_loop_count(4)
+ assert self.meta_interp(f, [20, 3]) == f(20, 3)
+ self.check_tree_loop_count(5)
+
def test_retrace_limit_with_extra_guards(self):
- # FIXME
- assert False
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa', 'a',
+ 'node'])
+ def f(n, limit):
+ myjitdriver.set_param('retrace_limit', limit)
+ sa = i = a = 0
+ node = [1, 2, 3]
+ node[1] = n
+ while i < n:
+ myjitdriver.jit_merge_point(n=n, i=i, sa=sa, a=a, node=node)
+ a = i/4
+ a = hint(a, promote=True)
+ if i&1 == 0:
+ sa += node[i%3]
+ sa += a
+ i += 1
+ return sa
+ assert self.meta_interp(f, [20, 2]) == f(20, 2)
+ self.check_tree_loop_count(4)
+ assert self.meta_interp(f, [20, 3]) == f(20, 3)
+ self.check_tree_loop_count(5)
class TestOOtype(BasicTests, OOJitMixin):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit