Author: Carl Friedrich Bolz <[email protected]>
Branch: guard-compatible
Changeset: r83188:bf997c3bade6
Date: 2016-03-20 13:11 +0100
http://bitbucket.org/pypy/pypy/changeset/bf997c3bade6/
Log: it can actually happen that there are two guard_compatibles with
inconsistent constants. raise InvalidLoop instead of crashing.
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py
b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -220,10 +220,15 @@
else:
self.make_nonnull(arg0)
info = self.getptrinfo(arg0)
- if info._compatibility_conditions:
+ ccond = info._compatibility_conditions
+ if ccond:
# seen a previous guard_compatible
# check that it's the same previous constant
- assert
info._compatibility_conditions.known_valid.same_constant(op.getarg(1))
+ if not ccond.known_valid.same_constant(op.getarg(1)):
+ r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(
+ op)
+ raise InvalidLoop('A GUARD_VALUE (%s) '
+ 'was proven to always fail' % r)
return
else:
info._compatibility_conditions = CompatibilityCondition(
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_compatible.py
b/rpython/jit/metainterp/optimizeopt/test/test_compatible.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_compatible.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_compatible.py
@@ -1,8 +1,10 @@
+import pytest
from rpython.jit.metainterp.optimizeopt.test.test_util import (
LLtypeMixin)
from rpython.jit.metainterp.optimizeopt.test.test_optimizebasic import (
BaseTestBasic)
from rpython.jit.metainterp.history import ConstInt, ConstPtr
+from rpython.jit.metainterp.optimize import InvalidLoop
class TestCompatible(BaseTestBasic, LLtypeMixin):
@@ -60,6 +62,15 @@
"""
self.optimize_loop(ops, expected)
+ def test_guard_compatible_inconsistent(self):
+ ops = """
+ [p1]
+ guard_compatible(p1, ConstPtr(myptr)) []
+ guard_compatible(p1, ConstPtr(myptrb)) []
+ jump(ConstPtr(myptr))
+ """
+ pytest.raises(InvalidLoop, self.optimize_loop, ops, ops)
+
def test_guard_compatible_call_pure(self):
call_pure_results = {
(ConstInt(123), ConstPtr(self.myptr)): ConstInt(5),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit