[pypy-commit] pypy release-pypy2.7-5.x: Another case where we read .upper without checking .has_upper
arigo
pypy.commits at gmail.com
Wed Apr 5 06:41:47 EDT 2017
Author: Armin Rigo <arigo at tunes.org>
Branch: release-pypy2.7-5.x
Changeset: r90962:9ca2794aed92
Date: 2017-04-04 20:47 +0200
http://bitbucket.org/pypy/pypy/changeset/9ca2794aed92/
Log: Another case where we read .upper without checking .has_upper
(grafted from e691a4f66264ec4b5a9cfa7c53c5cc079713e274)
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -94,8 +94,11 @@
if b1.known_ge(IntBound(0, 0)) and \
b2.known_ge(IntBound(0, 0)):
r = self.getintbound(op)
- mostsignificant = b1.upper | b2.upper
- r.intersect(IntBound(0, next_pow2_m1(mostsignificant)))
+ if b1.has_upper and b2.has_upper:
+ mostsignificant = b1.upper | b2.upper
+ r.intersect(IntBound(0, next_pow2_m1(mostsignificant)))
+ else:
+ r.make_ge(IntBound(0, 0))
optimize_INT_OR = optimize_INT_OR_or_XOR
optimize_INT_XOR = optimize_INT_OR_or_XOR
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5643,6 +5643,51 @@
"""
self.optimize_loop(ops, ops)
+ def test_bug_int_or(self):
+ ops = """
+ [p0, p1]
+ i51 = arraylen_gc(p0, descr=arraydescr)
+ i52 = arraylen_gc(p1, descr=arraydescr)
+ i57 = int_or(i51, i52)
+ i62 = int_eq(i57, 0)
+ guard_false(i62) []
+ """
+ self.optimize_loop(ops, ops)
+
+ def test_int_and_positive(self):
+ ops = """
+ [p0, p1]
+ i51 = arraylen_gc(p0, descr=arraydescr)
+ i52 = arraylen_gc(p1, descr=arraydescr)
+ i57 = int_and(i51, i52)
+ i62 = int_lt(i57, 0)
+ guard_false(i62) []
+ """
+ expected = """
+ [p0, p1]
+ i51 = arraylen_gc(p0, descr=arraydescr)
+ i52 = arraylen_gc(p1, descr=arraydescr)
+ i57 = int_and(i51, i52)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_int_or_positive(self):
+ ops = """
+ [p0, p1]
+ i51 = arraylen_gc(p0, descr=arraydescr)
+ i52 = arraylen_gc(p1, descr=arraydescr)
+ i57 = int_or(i51, i52)
+ i62 = int_lt(i57, 0)
+ guard_false(i62) []
+ """
+ expected = """
+ [p0, p1]
+ i51 = arraylen_gc(p0, descr=arraydescr)
+ i52 = arraylen_gc(p1, descr=arraydescr)
+ i57 = int_or(i51, i52)
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
pass
More information about the pypy-commit
mailing list