[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