[pypy-commit] pypy default: hg merge optimize-int-and (by squeaky_pl)
arigo
noreply at buildbot.pypy.org
Sun Feb 16 19:33:31 CET 2014
Author: Armin Rigo <arigo at 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)
More information about the pypy-commit
mailing list