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

cfbolz at codespeak.net cfbolz at codespeak.net
Wed Jan 27 11:43:53 CET 2010


Author: cfbolz
Date: Wed Jan 27 11:43:52 2010
New Revision: 70907

Modified:
   pypy/trunk/pypy/jit/metainterp/optimizeopt.py
   pypy/trunk/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
Also remove duplicate pure ops that have a descr, e.g. arraylen_gc.


Modified: pypy/trunk/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/optimizeopt.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/optimizeopt.py	Wed Jan 27 11:43:52 2010
@@ -573,21 +573,20 @@
                 self.make_constant(op.result, resbox.constbox())
                 return
 
-            if op.descr is None:
-                # did we do the exact same operation already?
-                args = op.args[:]
-                for i in range(len(args)):
-                    arg = args[i]
-                    if arg in self.values:
-                        args[i] = self.values[arg].get_key_box()
-                args.append(ConstInt(op.opnum))
-                oldop = self.pure_operations.get(args, None)
-                if oldop is not None:
-                    assert oldop.opnum == op.opnum
-                    self.make_equal_to(op.result, self.getvalue(oldop.result))
-                    return
-                else:
-                    self.pure_operations[args] = op
+            # did we do the exact same operation already?
+            args = op.args[:]
+            for i in range(len(args)):
+                arg = args[i]
+                if arg in self.values:
+                    args[i] = self.values[arg].get_key_box()
+            args.append(ConstInt(op.opnum))
+            oldop = self.pure_operations.get(args, None)
+            if oldop is not None and oldop.descr is op.descr:
+                assert oldop.opnum == op.opnum
+                self.make_equal_to(op.result, self.getvalue(oldop.result))
+                return
+            else:
+                self.pure_operations[args] = op
 
         # otherwise, the operation remains
         self.emit_operation(op)

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	Wed Jan 27 11:43:52 2010
@@ -1891,6 +1891,26 @@
         """
         self.optimize_loop(ops, "Not, Not", expected)
 
+    def test_remove_duplicate_pure_op_with_descr(self):
+        ops = """
+        [p1]
+        i0 = arraylen_gc(p1, descr=arraydescr)
+        i1 = int_gt(i0, 0)
+        guard_true(i1) []
+        i2 = arraylen_gc(p1, descr=arraydescr)
+        i3 = int_gt(i0, 0)
+        guard_true(i3) []
+        jump(p1)
+        """
+        expected = """
+        [p1]
+        i0 = arraylen_gc(p1, descr=arraydescr)
+        i1 = int_gt(i0, 0)
+        guard_true(i1) []
+        jump(p1)
+        """
+        self.optimize_loop(ops, 'Not', expected)
+
     # ----------
 
     def make_fail_descr(self):



More information about the Pypy-commit mailing list