Author: Armin Rigo <ar...@tunes.org> Branch: release-pypy2.7-5.x Changeset: r90961:e0ad22c8f2c8 Date: 2017-04-04 20:37 +0200 http://bitbucket.org/pypy/pypy/changeset/e0ad22c8f2c8/
Log: Issue #2528: test and fix for int_and() propagating wrong bounds (grafted from 42ab42428685f84d22e980313ba1f4a1b357cafc) diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py --- a/rpython/jit/metainterp/optimizeopt/rewrite.py +++ b/rpython/jit/metainterp/optimizeopt/rewrite.py @@ -104,14 +104,14 @@ return elif b2.is_constant(): val = b2.lower - if val == -1 or b1.lower >= 0 \ - and b1.upper <= val & ~(val + 1): + if val == -1 or (b1.bounded() and b1.lower >= 0 + and b1.upper <= val & ~(val + 1)): self.make_equal_to(op, op.getarg(0)) return elif b1.is_constant(): val = b1.lower - if val == -1 or b2.lower >= 0 \ - and b2.upper <= val & ~(val + 1): + if val == -1 or (b2.bounded() and b2.lower >= 0 + and b2.upper <= val & ~(val + 1)): self.make_equal_to(op, op.getarg(1)) return 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 @@ -5623,6 +5623,26 @@ """ self.optimize_loop(ops, expected) + def test_bug_int_and_1(self): + ops = """ + [p0] + i51 = arraylen_gc(p0, descr=arraydescr) + i57 = int_and(i51, 1) + i62 = int_eq(i57, 0) + guard_false(i62) [] + """ + self.optimize_loop(ops, ops) + + def test_bug_int_and_2(self): + ops = """ + [p0] + i51 = arraylen_gc(p0, descr=arraydescr) + i57 = int_and(4, i51) + i62 = int_eq(i57, 0) + guard_false(i62) [] + """ + self.optimize_loop(ops, ops) + class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin): pass _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit