[pypy-svn] r74952 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test
arigo at codespeak.net
arigo at codespeak.net
Mon May 31 01:48:36 CEST 2010
Author: arigo
Date: Mon May 31 01:48:35 2010
New Revision: 74952
Added:
pypy/branch/blackhole-improvement/pypy/jit/codewriter/opt.py (contents, props changed)
pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_opt.py (contents, props changed)
Modified:
pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py
Log:
Just for the fun of it (will be removed, too much complexity).
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py Mon May 31 01:48:35 2010
@@ -4,6 +4,7 @@
from pypy.jit.codewriter.assembler import Assembler, JitCode
from pypy.jit.codewriter.jtransform import transform_graph
from pypy.jit.codewriter.format import format_assembler
+from pypy.jit.codewriter.opt import optimize_ssarepr
from pypy.jit.codewriter.liveness import compute_liveness
from pypy.jit.codewriter.call import CallControl
from pypy.jit.codewriter.policy import log
@@ -48,6 +49,7 @@
# inserting jumps or conditional jumps. This is a list of tuples
# of the shape ("opname", arg1, ..., argN) or (Label(...),).
ssarepr = flatten_graph(graph, regallocs)
+ optimize_ssarepr(ssarepr)
#
# step 3b: compute the liveness around certain operations
compute_liveness(ssarepr)
Added: pypy/branch/blackhole-improvement/pypy/jit/codewriter/opt.py
==============================================================================
--- (empty file)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/opt.py Mon May 31 01:48:35 2010
@@ -0,0 +1,24 @@
+from pypy.jit.codewriter.flatten import Label
+
+def optimize_ssarepr(ssarepr):
+ # For now, just optimize "L2: goto L1" by moving the label L2
+ # at the same place as L1, and possibly killing the "goto L1"
+ # if it becomes unreachable.
+ i = 0
+ insns = ssarepr.insns
+ while i < len(insns):
+ if (isinstance(insns[i][0], Label) and
+ insns[i+1][0] == 'goto'):
+ movinglabelinsn = insns[i]
+ targettlabel = insns[i+1][1]
+ if movinglabelinsn[0].name != targettlabel.name:
+ del insns[i]
+ if i > 0:
+ if insns[i-1][0] == '---':
+ del insns[i]
+ else:
+ i -= 1
+ targetindex = insns.index((Label(targettlabel.name),))
+ insns.insert(targetindex, movinglabelinsn)
+ continue
+ i += 1
Added: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_opt.py
==============================================================================
--- (empty file)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_opt.py Mon May 31 01:48:35 2010
@@ -0,0 +1,130 @@
+from pypy.jit.codewriter.opt import optimize_ssarepr
+from pypy.jit.codewriter.format import assert_format, unformat_assembler
+
+
+def test_opt_noop():
+ test = """
+ int_add %i0, %i1 -> %i2
+ int_return %i2
+ """
+ ssarepr = unformat_assembler(test)
+ optimize_ssarepr(ssarepr)
+ assert_format(ssarepr, """
+ int_add %i0, %i1 -> %i2
+ int_return %i2
+ """)
+
+def test_goto_1():
+ test = """
+ goto L2
+ ---
+ L3:
+ int_return %i0
+ ---
+ L2:
+ goto L3
+ """
+ ssarepr = unformat_assembler(test)
+ optimize_ssarepr(ssarepr)
+ assert_format(ssarepr, """
+ goto L1
+ ---
+ L1:
+ int_return %i0
+ """)
+
+def test_goto_1bis():
+ test = """
+ goto L2
+ ---
+ L2:
+ goto L3
+ ---
+ L3:
+ int_return %i0
+ """
+ ssarepr = unformat_assembler(test)
+ optimize_ssarepr(ssarepr)
+ assert_format(ssarepr, """
+ goto L1
+ ---
+ ---
+ L1:
+ int_return %i0
+ """)
+
+def test_goto_2():
+ test = """
+ goto L2
+ ---
+ L3:
+ foobar
+ L2:
+ goto L3
+ """
+ ssarepr = unformat_assembler(test)
+ optimize_ssarepr(ssarepr)
+ assert_format(ssarepr, """
+ goto L1
+ ---
+ L1:
+ L2:
+ foobar
+ goto L2
+ """)
+
+def test_goto_3():
+ test = """
+ foobar
+ L1:
+ goto L1
+ """
+ ssarepr = unformat_assembler(test)
+ optimize_ssarepr(ssarepr)
+ assert_format(ssarepr, """
+ foobar
+ L1:
+ goto L1
+ """)
+
+def test_goto_4():
+ test = """
+ foobar
+ L1:
+ goto L2
+ ---
+ L2:
+ goto L1
+ """
+ ssarepr = unformat_assembler(test)
+ optimize_ssarepr(ssarepr)
+ assert_format(ssarepr, """
+ foobar
+ goto L1
+ ---
+ L1:
+ L2:
+ goto L2
+ """)
+
+def test_goto_5():
+ test = """
+ goto_if_some_condition L2
+ foobar
+ L2:
+ goto L3
+ ---
+ L3:
+ int_return %i0
+ """
+ ssarepr = unformat_assembler(test)
+ optimize_ssarepr(ssarepr)
+ assert_format(ssarepr, """
+ goto_if_some_condition L1
+ foobar
+ goto L2
+ ---
+ L1:
+ L2:
+ int_return %i0
+ """)
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_regalloc.py Mon May 31 01:48:35 2010
@@ -17,7 +17,8 @@
self.rtyper = support.annotate(func, values, type_system=type_system)
return self.rtyper.annotator.translator.graphs
- def check_assembler(self, graph, expected, transform=False):
+ def check_assembler(self, graph, expected, transform=False,
+ optimize_ssarepr=False):
# 'transform' can be False only for simple graphs. More complex
# graphs must first be transformed by jtransform.py before they can be
# subjected to register allocation and flattening.
@@ -26,6 +27,9 @@
transform_graph(graph)
regalloc = perform_register_allocation(graph, 'int')
ssarepr = flatten_graph(graph, {'int': regalloc})
+ if optimize_ssarepr:
+ from pypy.jit.codewriter.opt import optimize_ssarepr
+ optimize_ssarepr(ssarepr)
asm = format_assembler(ssarepr)
assert asm == str(py.code.Source(expected).strip()) + '\n'
@@ -240,3 +244,21 @@
L1:
int_return %i2
""", transform=True)
+
+ def test_regalloc_if(self):
+ def f(n):
+ if n > 0:
+ n -= 3
+ return n + 1
+ graph = self.make_graphs(f, [10])[0]
+ # this also checks that "L2: goto L1" is optimized
+ self.check_assembler(graph, """
+ int_gt %i0, $0 -> %i1
+ goto_if_not %i1, L1
+ -live- L1
+ int_sub %i0, $3 -> %i0
+ L1:
+ int_add %i0, $1 -> %i1
+ int_return %i1
+ ---
+ """, optimize_ssarepr=True)
More information about the Pypy-commit
mailing list