[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