Author: Carl Friedrich Bolz <cfb...@gmx.de> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit