[pypy-svn] pypy default: 2 failing and 1 passing test where inlining the short preamble causes wrong behaviour
hakanardo
commits-noreply at bitbucket.org
Wed Feb 2 08:20:52 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch:
Changeset: r41536:3318fd48d87b
Date: 2011-02-02 08:20 +0100
http://bitbucket.org/pypy/pypy/changeset/3318fd48d87b/
Log: 2 failing and 1 passing test where inlining the short preamble
causes wrong behaviour
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
@@ -394,6 +394,89 @@
# ENTER - compile the leaving path
self.check_enter_count(2)
+ def test_stored_reference_with_bridge1(self):
+ class RefNode(object):
+ def __init__(self, ref):
+ self.ref = ref
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'sa', 'node1', 'node2'])
+ def f(n):
+ node1 = self._new()
+ node1.value = 1
+ node2 = RefNode(node1)
+ sa = 0
+ while n > 0:
+ myjitdriver.can_enter_jit(n=n, sa=sa, node1=node1, node2=node2)
+ myjitdriver.jit_merge_point(n=n, sa=sa, node1=node1, node2=node2)
+ if n>10:
+ next = self._new()
+ next.value = 2
+ node1 = next
+ else:
+ node2.ref.value = 3
+ sa += node1.value
+ n -= 1
+ return sa
+ def g():
+ return f(20) * 100 + f(10)
+ assert f(20) == 20 * 2
+ assert self.meta_interp(f, [20]) == 20 * 2
+ assert f(10) == 10 * 3
+ assert self.meta_interp(f, [10]) == 10 * 3
+ assert g() == 4030
+ assert self.meta_interp(g, []) == 4030
+
+ def test_stored_reference_with_bridge2(self):
+ class RefNode(object):
+ def __init__(self, ref):
+ self.ref = ref
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'sa', 'node1', 'node2'])
+ def f(n):
+ node1 = self._new()
+ node1.value = 1
+ node2 = RefNode(node1)
+ sa = 0
+ while n > 0:
+ myjitdriver.can_enter_jit(n=n, sa=sa, node1=node1, node2=node2)
+ myjitdriver.jit_merge_point(n=n, sa=sa, node1=node1, node2=node2)
+ if n>10:
+ next = self._new()
+ next.value += 2
+ node1 = next
+ else:
+ node2.ref.value += 3
+ sa += node1.value
+ n -= 1
+ return sa
+ def g():
+ return f(20) * 100 + f(10)
+ assert self.meta_interp(g, []) == g()
+
+ def test_stored_reference_with_bridge3(self):
+ class RefNode(object):
+ def __init__(self, ref):
+ self.ref = ref
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'sa', 'node1', 'node2'])
+ def f(n):
+ node1 = self._new()
+ node1.value = 1
+ node2 = RefNode(node1)
+ sa = 0
+ while n > 0:
+ myjitdriver.can_enter_jit(n=n, sa=sa, node1=node1, node2=node2)
+ myjitdriver.jit_merge_point(n=n, sa=sa, node1=node1, node2=node2)
+ node2.ref.value += n
+ sa += node1.value
+ if n>10:
+ next = self._new()
+ next.value = node1.value + 1
+ node1 = next
+ else:
+ node1 = node2.ref
+ n -= 1
+ return sa
+ assert self.meta_interp(f, [20]) == f(20)
+
+
class VirtualMiscTests:
def test_guards_around_forcing(self):
More information about the Pypy-commit
mailing list