[pypy-commit] pypy bounds-int-add-or: merge OR and XOR optimization into one

squeaky noreply at buildbot.pypy.org
Mon Feb 17 23:59:07 CET 2014


Author: Squeaky <squeaky_pl at gmx.com>
Branch: bounds-int-add-or
Changeset: r69197:d091b8c6f8e8
Date: 2014-02-17 20:26 +0100
http://bitbucket.org/pypy/pypy/changeset/d091b8c6f8e8/

Log:	merge OR and XOR optimization into one

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
@@ -68,25 +68,14 @@
     optimize_GUARD_FALSE = optimize_GUARD_TRUE
     optimize_GUARD_VALUE = optimize_GUARD_TRUE
 
-    def optimize_INT_OR(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        self.emit_operation(op)
-        r = self.getvalue(op.result)
-
-        if v1.intbound.known_ge(IntBound(0, 0)) and \
-           v2.intbound.known_ge(IntBound(0, 0)):
-            mostsignificant = v1.intbound.upper | v2.intbound.upper
-            # check if next_power2 won't overflow
-            if mostsignificant < (1 << ((symbolic.WORD - 1) << 3)):
-                r.intbound.intersect(
-                    IntBound(0, next_power2(mostsignificant) - 1))
-
-    def optimize_INT_XOR(self, op):
+    def optimize_INT_OR_or_XOR(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
         if v1 is v2:
-            self.make_constant_int(op.result, 0)
+            if op.getopnum() == rop.INT_OR:
+                self.make_equal_to(op.result, v1)
+            else:
+                self.make_constant_int(op.result, 0)
             return
         self.emit_operation(op)
         if v1.intbound.known_ge(IntBound(0, 0)) and \
@@ -99,6 +88,8 @@
             if mostsignificant < (1 << ((symbolic.WORD - 1) << 3)):
                 r.intbound.make_lt(IntUpperBound(next_power2(mostsignificant)))
 
+    optimize_INT_OR = optimize_INT_OR_or_XOR
+    optimize_INT_XOR = optimize_INT_OR_or_XOR
 
     def optimize_INT_AND(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
@@ -5422,6 +5422,18 @@
         """
         self.optimize_loop(ops, ops)
 
+    def test_or_same_arg(self):
+        ops = """
+        [i0]
+        i1 = int_or(i0, i0)
+        jump(i1)
+        """
+        expected = """
+        [i0]
+        jump(i0)
+        """
+        self.optimize_loop(ops, expected)
+
 
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass


More information about the pypy-commit mailing list