[pypy-svn] pypy jit-virtual_state: Testcase where the guards produced by VirtualState.generate_guards are needed
hakanardo
commits-noreply at bitbucket.org
Sat Feb 12 11:57:40 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-virtual_state
Changeset: r41836:fa157d2a410f
Date: 2011-02-12 11:20 +0100
http://bitbucket.org/pypy/pypy/changeset/fa157d2a410f/
Log: Testcase where the guards produced by VirtualState.generate_guards
are needed
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
@@ -644,7 +644,6 @@
modifier = VirtualStateAdder(self.optimizer)
virtual_state = modifier.get_virtual_state(args)
for sh in short:
- #import pdb; pdb.set_trace()
ok = False
extra_guards = []
if sh.virtual_state.generalization_of(virtual_state):
@@ -655,6 +654,7 @@
sh.virtual_state.generate_guards(virtual_state,
args, cpu,
extra_guards)
+
ok = True
except InvalidLoop:
pass
diff --git a/pypy/jit/metainterp/test/test_virtual.py b/pypy/jit/metainterp/test/test_virtual.py
--- a/pypy/jit/metainterp/test/test_virtual.py
+++ b/pypy/jit/metainterp/test/test_virtual.py
@@ -614,6 +614,45 @@
assert res == f(40, 3)
self.check_loop_count(3)
+ def test_forced_virtual_assigned_different_class_in_bridge(self):
+ myjitdriver = JitDriver(greens = [], reds = ['n', 's', 'node', 'node2'])
+ def externfn(node):
+ node.value += 1
+ class A(object):
+ def __init__(self, value):
+ self.value = value
+ def op(self, val):
+ return self.value + val
+ class B(A):
+ def op(self, val):
+ return self.value - val
+ def f(n, s, node2):
+ node = A(1)
+ while n > 0:
+ myjitdriver.can_enter_jit(n=n, s=s, node=node, node2=node2)
+ myjitdriver.jit_merge_point(n=n, s=s, node=node, node2=node2)
+ if (n>>s) & 1:
+ node2.value += node.value
+ node = node2
+ else:
+ node.value = node.op(1)
+ node = A(node.value + 7)
+ externfn(node)
+ n -= 1
+ return node.value
+ def g1(n, s):
+ return f(n, s, A(2)) + f(n, s, B(2))
+ def g2(n, s):
+ return f(n, s, B(2)) + f(n, s, A(2))
+ res = self.meta_interp(g1, [40, 3], policy=StopAtXPolicy(externfn))
+ assert res == g1(40, 3)
+ res = self.meta_interp(g1, [48, 3], policy=StopAtXPolicy(externfn))
+ assert res == g1(48, 3)
+ res = self.meta_interp(g2, [40, 3], policy=StopAtXPolicy(externfn))
+ assert res == g2(40, 3)
+ res = self.meta_interp(g2, [48, 3], policy=StopAtXPolicy(externfn))
+ assert res == g2(48, 3)
+
def test_empty_virtual_with_bridge(self):
myjitdriver = JitDriver(greens = [], reds = ['n', 's', 'sa', 'node'])
def f(n, s):
More information about the Pypy-commit
mailing list