[pypy-commit] pypy default: Test and fix: we could get in obscure cases an AssertionError that
arigo
pypy.commits at gmail.com
Tue Mar 29 04:51:16 EDT 2016
Author: Armin Rigo <arigo at 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]
More information about the pypy-commit
mailing list