Author: Armin Rigo <ar...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit