[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