[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