Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r69180:4346099d1d4f Date: 2014-02-16 19:32 +0100 http://bitbucket.org/pypy/pypy/changeset/4346099d1d4f/
Log: hg merge optimize-int-and (by squeaky_pl) Optimize away INT_AND with constant mask of 1s that fully cover the bitrange of other operand. diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst --- a/pypy/doc/whatsnew-head.rst +++ b/pypy/doc/whatsnew-head.rst @@ -74,3 +74,7 @@ .. branch: array-propagate-len Kill some guards and operations in JIT traces by adding integer bounds propagation for getfield_(raw|gc) and getarrayitem_(raw|gc). + +.. branch: optimize-int-and: +Optimize away INT_AND with constant mask of 1s that fully cover the bitrange +of other operand. 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 @@ -342,7 +342,7 @@ if descr.is_integer_bounded(): v1 = self.getvalue(op.result) v1.intbound.make_ge(IntLowerBound(descr.get_integer_min())) - v1.intbound.make_lt(IntUpperBound(descr.get_integer_max() + 1)) + v1.intbound.make_le(IntUpperBound(descr.get_integer_max())) optimize_GETFIELD_GC = optimize_GETFIELD_RAW @@ -354,8 +354,7 @@ if descr and descr.is_item_integer_bounded(): v1 = self.getvalue(op.result) v1.intbound.make_ge(IntLowerBound(descr.get_item_integer_min())) - v1.intbound.make_lt( - IntUpperBound(descr.get_item_integer_max() + 1)) + v1.intbound.make_le(IntUpperBound(descr.get_item_integer_max())) optimize_GETARRAYITEM_GC = optimize_GETARRAYITEM_RAW 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 @@ -86,8 +86,21 @@ v2 = self.getvalue(op.getarg(1)) if v1.is_null() or v2.is_null(): self.make_constant_int(op.result, 0) - else: - self.emit_operation(op) + return + elif v2.is_constant(): + val = v2.box.getint() + if val == -1 or v1.intbound.lower >= 0 \ + and v1.intbound.upper <= val & ~(val + 1): + self.make_equal_to(op.result, v1) + return + elif v1.is_constant(): + val = v1.box.getint() + if val == -1 or v2.intbound.lower >= 0 \ + and v2.intbound.upper <= val & ~(val + 1): + self.make_equal_to(op.result, v2) + return + + self.emit_operation(op) def optimize_INT_OR(self, op): v1 = self.getvalue(op.getarg(0)) 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 @@ -5298,6 +5298,34 @@ """ self.optimize_loop(ops, expected) + def test_intand_1mask_covering_bitrange(self): + ops = """ + [p0] + i0 = getarrayitem_gc(p0, 0, descr=chararraydescr) + i1 = int_and(i0, 255) + i2 = int_and(i1, -1) + i3 = int_and(511, i2) + jump(i3) + """ + + expected = """ + [p0] + i0 = getarrayitem_gc(p0, 0, descr=chararraydescr) + jump(i0) + """ + self.optimize_loop(ops, expected) + + def test_intand_maskwith0_in_bitrange(self): + ops = """ + [p0] + i0 = getarrayitem_gc(p0, 0, descr=chararraydescr) + i1 = int_and(i0, 257) + i2 = getarrayitem_gc(p0, 1, descr=chararraydescr) + i3 = int_and(259, i2) + jump(i1, i3) + """ + self.optimize_loop(ops, ops) + class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin): pass 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 @@ -4753,7 +4753,8 @@ def test_bound_and(self): ops = """ - [i0] + [] + i0 = escape() i1 = int_and(i0, 255) i2 = int_lt(i1, 500) guard_true(i2) [] @@ -4779,10 +4780,11 @@ guard_true(i14) [] i15 = int_ge(i1, 20) guard_true(i15) [] - jump(i1) - """ - expected = """ - [i0] + jump() + """ + expected = """ + [] + i0 = escape() i1 = int_and(i0, 255) i12 = int_lt(i1, 100) guard_true(i12) [] @@ -4792,7 +4794,7 @@ guard_true(i14) [] i15 = int_ge(i1, 20) guard_true(i15) [] - jump(i1) + jump() """ self.optimize_loop(ops, expected) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit