[pypy-commit] pypy dead-code-optimization: implement dead ops removal

fijal noreply at buildbot.pypy.org
Tue Feb 28 01:50:33 CET 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: dead-code-optimization
Changeset: r52945:58bcd5dd0b05
Date: 2012-02-27 16:50 -0800
http://bitbucket.org/pypy/pypy/changeset/58bcd5dd0b05/

Log:	implement dead ops removal

diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py b/pypy/jit/metainterp/optimizeopt/__init__.py
--- a/pypy/jit/metainterp/optimizeopt/__init__.py
+++ b/pypy/jit/metainterp/optimizeopt/__init__.py
@@ -9,6 +9,7 @@
 from pypy.jit.metainterp.optimizeopt.simplify import OptSimplify
 from pypy.jit.metainterp.optimizeopt.pure import OptPure
 from pypy.jit.metainterp.optimizeopt.earlyforce import OptEarlyForce
+from pypy.jit.metainterp.optimizeopt.deadops import remove_dead_ops
 from pypy.rlib.jit import PARAMETERS
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.rlib.debug import debug_start, debug_stop, debug_print
@@ -65,6 +66,7 @@
         else:
             optimizer = Optimizer(metainterp_sd, loop, optimizations)
             optimizer.propagate_all_forward()
+        remove_dead_ops(loop)
     finally:
         debug_stop("jit-optimize")
         
diff --git a/pypy/jit/metainterp/optimizeopt/deadops.py b/pypy/jit/metainterp/optimizeopt/deadops.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/metainterp/optimizeopt/deadops.py
@@ -0,0 +1,16 @@
+
+def remove_dead_ops(loop):
+    newops = []
+    seen = {}
+    for i in range(len(loop.operations) -1, -1, -1):
+        op = loop.operations[i]
+        if op.has_no_side_effect() and op.result not in seen:
+            continue
+        for arg in op.getarglist():
+            seen[arg] = None
+        if op.getfailargs():
+            for arg in op.getfailargs():
+                seen[arg] = None
+        newops.append(op)
+    newops.reverse()
+    loop.operations[:] = newops
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_deadops.py b/pypy/jit/metainterp/optimizeopt/test/test_deadops.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/metainterp/optimizeopt/test/test_deadops.py
@@ -0,0 +1,57 @@
+
+from pypy.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin
+from pypy.jit.metainterp.optimizeopt.test.test_optimizebasic import BaseTestBasic
+
+class TestRemoveDeadOps(BaseTestBasic, LLtypeMixin):
+    def test_deadops(self):
+        ops = """
+        [i0]
+        i1 = int_add(i0, 1)
+        jump()
+        """
+        expected = """
+        [i0]
+        jump()
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_not_deadops(self):
+        ops = """
+        [i0]
+        i1 = int_add(i0, 1)
+        jump(i1)
+        """
+        expected = """
+        [i0]
+        i1 = int_add(i0, 1)
+        jump(i1)
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_not_deadops_1(self):
+        ops = """
+        [i0]
+        i1 = int_add(i0, 1)
+        guard_true(i0) [i1]
+        jump()
+        """
+        expected = """
+        [i0] 
+        i1 = int_add(i0, 1)
+        guard_true(i0) [i1]
+        jump()
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_not_deadops_2(self):
+        ops = """
+        [p0, i0]
+        setfield_gc(p0, i0)
+        jump()
+        """
+        expected = """
+        [p0, i0]
+        setfield_gc(p0, i0)
+        jump()
+        """
+        self.optimize_loop(ops, expected)


More information about the pypy-commit mailing list