Author: Hakan Ardo <[email protected]>
Branch: jit-targets
Changeset: r50173:9f840860f2cb
Date: 2011-12-05 17:35 +0100
http://bitbucket.org/pypy/pypy/changeset/9f840860f2cb/
Log: dont crash if two equal virtuals become not equal
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_multilabel.py
b/pypy/jit/metainterp/optimizeopt/test/test_multilabel.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_multilabel.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_multilabel.py
@@ -172,6 +172,27 @@
with raises(InvalidLoop):
self.optimize_loop(ops, ops)
+ def test_virtual_turns_constant(self):
+ ops = """
+ [p1]
+ p3 = new_with_vtable(ConstClass(node_vtable))
+ label(p3)
+ guard_value(p3, ConstPtr(myptr)) []
+ jump(p3)
+ """
+ with raises(InvalidLoop):
+ self.optimize_loop(ops, ops)
+
+ def test_virtuals_turns_not_equal(self):
+ ops = """
+ [p1, p2]
+ p3 = new_with_vtable(ConstClass(node_vtable))
+ label(p3, p3)
+ p4 = new_with_vtable(ConstClass(node_vtable))
+ jump(p3, p4)
+ """
+ with raises(InvalidLoop):
+ self.optimize_loop(ops, ops)
class TestLLtype(BaseTestMultiLabel, LLtypeMixin):
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
@@ -281,6 +281,13 @@
# Inline the short preamble at the end of the loop
jmp_to_short_args = virtual_state.make_inputargs(values,
self.optimizer, keyboxes=True)
+ assert len(short_inputargs) == len(jmp_to_short_args)
+ args = {}
+ for i in range(len(short_inputargs)):
+ if short_inputargs[i] in args:
+ if args[short_inputargs[i]] != jmp_to_short_args[i]:
+ raise InvalidLoop
+ args[short_inputargs[i]] = jmp_to_short_args[i]
self.short_inliner = Inliner(short_inputargs, jmp_to_short_args)
for box, const in constant_inputargs.items():
self.short_inliner.argmap[box] = const
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit