Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r83414:bd677c5dd9b8
Date: 2016-03-29 10:50 +0200
http://bitbucket.org/pypy/pypy/changeset/bd677c5dd9b8/

Log:    Test and fix: we could get in obscure cases an AssertionError that
        should really be just an InvalidLoop

diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py 
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -7,6 +7,7 @@
 from rpython.jit.metainterp.resoperation import rop, AbstractResOp, 
GuardResOp,\
      OpHelpers, ResOperation
 from rpython.jit.metainterp.optimizeopt import info
+from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.typesystem import llhelper
 from rpython.rlib.objectmodel import specialize, we_are_translated
 from rpython.rlib.debug import debug_print
@@ -411,11 +412,14 @@
     def make_constant(self, box, constbox):
         assert isinstance(constbox, Const)
         box = self.get_box_replacement(box)
-        if not we_are_translated():    # safety-check
-            if (box.get_forwarded() is not None and
-                isinstance(constbox, ConstInt) and
-                not isinstance(box.get_forwarded(), info.AbstractRawPtrInfo)):
-                assert box.get_forwarded().contains(constbox.getint())
+        # safety-check: if the constant is outside the bounds for the
+        # box, then it is an invalid loop
+        if (box.get_forwarded() is not None and
+            isinstance(constbox, ConstInt) and
+            not isinstance(box.get_forwarded(), info.AbstractRawPtrInfo)):
+            if not box.get_forwarded().contains(constbox.getint()):
+                raise InvalidLoop("a box is turned into constant that is "
+                                  "outside the range allowed for that box")
         if box.is_constant():
             return
         if box.type == 'r' and box.get_forwarded() is not None:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -3072,6 +3072,16 @@
         """
         self.raises(InvalidLoop, self.optimize_loop, ops, ops)
 
+    def test_invalid_guard_value_after_bounds(self):
+        ops = """
+        [i0]
+        i1 = int_gt(i0, 5)
+        guard_true(i1) []
+        guard_value(i0, 2) []
+        jump()
+        """
+        self.raises(InvalidLoop, self.optimize_loop, ops, ops)
+
     def test_guard_class_oois(self):
         ops = """
         [p1]
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to