[pypy-svn] r74530 - in pypy/trunk/pypy/jit/metainterp: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Mon May 17 16:41:47 CEST 2010


Author: cfbolz
Date: Mon May 17 16:41:46 2010
New Revision: 74530

Modified:
   pypy/trunk/pypy/jit/metainterp/optimizeopt.py
   pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
an optimization for int_and and int_or: a & 0 = 0, a | 0 = a


Modified: pypy/trunk/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/optimizeopt.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/optimizeopt.py	Mon May 17 16:41:46 2010
@@ -954,7 +954,25 @@
         self.optimize_default(op)
         resvalue = self.getvalue(op.result)
         self.loop_invariant_results[op.args[0].getint()] = resvalue
-            
+
+    def optimize_INT_AND(self, op):
+        v1 = self.getvalue(op.args[0])
+        v2 = self.getvalue(op.args[1])
+        if v1.is_null() or v2.is_null():
+            self.make_constant_int(op.result, 0)
+        else:
+            self.optimize_default(op)
+
+    def optimize_INT_OR(self, op):
+        v1 = self.getvalue(op.args[0])
+        v2 = self.getvalue(op.args[1])
+        if v1.is_null():
+            self.make_equal_to(op.result, v2)
+        elif v2.is_null():
+            self.make_equal_to(op.result, v1)
+        else:
+            self.optimize_default(op)
+
 
 optimize_ops = _findall(Optimizer, 'optimize_')
 

Modified: pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py	Mon May 17 16:41:46 2010
@@ -1999,6 +1999,22 @@
         """
         self.optimize_loop(ops, 'Not', expected)
 
+    def test_int_and_or_with_zero(self):
+        ops = """
+        [i0, i1]
+        i2 = int_and(i0, 0)
+        i3 = int_and(0, i2)
+        i4 = int_or(i2, i1)
+        i5 = int_or(i0, i3)
+        jump(i4, i5)
+        """
+        expected = """
+        [i0, i1]
+        jump(i1, i0)
+        """
+        self.optimize_loop(ops, 'Not, Not', expected)
+
+
     # ----------
 
     def make_fail_descr(self):



More information about the Pypy-commit mailing list