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

Reply via email to