[pypy-svn] r74281 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test

arigo at codespeak.net arigo at codespeak.net
Fri Apr 30 14:51:59 CEST 2010


Author: arigo
Date: Fri Apr 30 14:51:57 2010
New Revision: 74281

Added:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py   (contents, props changed)
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py   (contents, props changed)
Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/format.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
Log:
Add a liveness analysis step.  For now it works by inserting pseudo-operations
called '-live-' in the control flow graph.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/format.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/format.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/format.py	Fri Apr 30 14:51:57 2010
@@ -55,8 +55,30 @@
         else:
             print >> output, asm[0],
             if len(asm) > 1:
-                print >> output, ', '.join(map(repr, asm[1:]))
+                lst = map(repr, asm[1:])
+                if asm[0] == '-live-': lst.sort()
+                print >> output, ', '.join(lst)
             else:
                 print >> output
     res = output.getvalue()
     return res
+
+def assert_format(ssarepr, expected):
+    asm = format_assembler(ssarepr)
+    expected = str(py.code.Source(expected)).strip() + '\n'
+    asmlines = asm.split("\n")
+    explines = expected.split("\n")
+    for asm, exp in zip(asmlines, explines):
+        if asm != exp:
+            print
+            print "Got:      " + asm
+            print "Expected: " + exp
+            lgt = 0
+            for i in range(len(asm)):
+                if exp[i] == asm[i]:
+                    lgt += 1
+                else:
+                    break
+            print "          " + " " * lgt + "^^^^"
+            raise AssertionError
+    assert len(asmlines) == len(explines)

Added: pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py
==============================================================================
--- (empty file)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py	Fri Apr 30 14:51:57 2010
@@ -0,0 +1,30 @@
+from pypy.objspace.flow.model import Variable, SpaceOperation
+
+
+DEFAULT_OPNAMES_REQUIRING_LIVENESS = set([
+    ])
+
+def compute_liveness(graph, opnames_requiring_liveness=
+                                DEFAULT_OPNAMES_REQUIRING_LIVENESS):
+    for block in graph.iterblocks():
+        alive = set()
+        for link in block.exits:
+            for v in link.args:
+                alive.add(v)
+        if isinstance(block.exitswitch, tuple):
+            for v in block.exitswitch[1:]:
+                alive.add(v)
+        else:
+            alive.add(v)
+        for i in range(len(block.operations)-1, -1, -1):
+            op = block.operations[i]
+            try:
+                alive.remove(op.result)
+            except KeyError:
+                pass
+            if op.opname in opnames_requiring_liveness:
+                livevars = [v for v in alive if isinstance(v, Variable)]
+                block.operations.insert(i, SpaceOperation('-live-', livevars,
+                                                          None))
+            for v in op.args:
+                alive.add(v)

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	Fri Apr 30 14:51:57 2010
@@ -2,7 +2,7 @@
 from pypy.jit.codewriter import support
 from pypy.jit.codewriter.flatten import flatten_graph, reorder_renaming_list
 from pypy.jit.codewriter.flatten import GraphFlattener, ListOfKind, Register
-from pypy.jit.codewriter.format import format_assembler
+from pypy.jit.codewriter.format import assert_format
 from pypy.jit.codewriter.jitter import transform_graph
 from pypy.jit.metainterp.history import AbstractDescr
 from pypy.rpython.lltypesystem import lltype, rclass, rstr
@@ -77,27 +77,7 @@
         if transform:
             transform_graph(graphs[0], FakeCPU())
         ssarepr = flatten_graph(graphs[0], fake_regallocs())
-        self.assert_format(ssarepr, expected)
-
-    def assert_format(self, ssarepr, expected):
-        asm = format_assembler(ssarepr)
-        expected = str(py.code.Source(expected)).strip() + '\n'
-        asmlines = asm.split("\n")
-        explines = expected.split("\n")
-        for asm, exp in zip(asmlines, explines):
-            if asm != exp:
-                print
-                print "Got:      " + asm
-                print "Expected: " + exp
-                lgt = 0
-                for i in range(len(asm)):
-                    if exp[i] == asm[i]:
-                        lgt += 1
-                    else:
-                        break
-                print "          " + " " * lgt + "^^^^"
-                raise AssertionError
-        assert len(asmlines) == len(explines)
+        assert_format(ssarepr, expected)
 
     def test_simple(self):
         def f(n):
@@ -176,7 +156,7 @@
                             v5)                    # result
         flattener = GraphFlattener(None, fake_regallocs())
         flattener.serialize_op(op)
-        self.assert_format(flattener.ssarepr, """
+        assert_format(flattener.ssarepr, """
             residual_call_ir_f $12345, I[%i0, %i1], R[%r0, %r1], %f0
         """)
 
@@ -196,7 +176,7 @@
         op = SpaceOperation('foobar', [FooDescr()], None)
         flattener = GraphFlattener(None, fake_regallocs())
         flattener.serialize_op(op)
-        self.assert_format(flattener.ssarepr, """
+        assert_format(flattener.ssarepr, """
             foobar hi_there!
         """)
 

Added: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py
==============================================================================
--- (empty file)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py	Fri Apr 30 14:51:57 2010
@@ -0,0 +1,108 @@
+from pypy.jit.codewriter import support
+from pypy.jit.codewriter.liveness import compute_liveness
+from pypy.jit.codewriter.test.test_flatten import fake_regallocs
+from pypy.jit.codewriter.flatten import flatten_graph
+from pypy.jit.codewriter.format import assert_format
+
+
+class TestFlatten:
+
+    def make_graphs(self, func, values, type_system='lltype'):
+        self.rtyper = support.annotate(func, values, type_system=type_system)
+        return self.rtyper.annotator.translator.graphs
+
+    def encoding_test(self, func, args, expected):
+        graphs = self.make_graphs(func, args)
+        compute_liveness(graphs[0], ['int_add', 'int_mul'])
+        ssarepr = flatten_graph(graphs[0], fake_regallocs())
+        assert_format(ssarepr, expected)
+
+    def test_simple_no_live(self):
+        def f(n):
+            return n + 10
+        self.encoding_test(f, [5], """
+            -live-
+            int_add %i0, $10, %i1
+            int_return %i1
+        """)
+
+    def test_simple(self):
+        def f(n):
+            return (n + 10) * (n + 3) * (n + 6)
+        self.encoding_test(f, [5], """
+            -live- %i0
+            int_add %i0, $10, %i1
+            -live- %i0, %i1
+            int_add %i0, $3, %i2
+            -live- %i0
+            int_mul %i1, %i2, %i3
+            -live- %i3
+            int_add %i0, $6, %i4
+            -live-
+            int_mul %i3, %i4, %i5
+            int_return %i5
+        """)
+
+    def test_one_path(self):
+        def f(x, y):
+            if x+5:
+                return x+1
+            return y+2
+        self.encoding_test(f, [5, 6], """
+            -live- %i0, %i1
+            int_add %i0, $5, %i2
+            int_is_true %i2, %i3
+            goto_if_not L1, %i3
+            int_copy %i0, %i4
+            -live-
+            int_add %i4, $1, %i5
+            int_return %i5
+            L1:
+            int_copy %i1, %i6
+            -live-
+            int_add %i6, $2, %i7
+            int_return %i7
+        """)
+
+    def test_other_path(self):
+        def f(x, y):
+            if x+5:
+                return x+y
+            return x+2
+        self.encoding_test(f, [5, 6], """
+            -live- %i0, %i1
+            int_add %i0, $5, %i2
+            int_is_true %i2, %i3
+            goto_if_not L1, %i3
+            int_copy %i0, %i4
+            int_copy %i1, %i5
+            -live-
+            int_add %i4, %i5, %i6
+            int_return %i6
+            L1:
+            int_copy %i0, %i7
+            -live-
+            int_add %i7, $2, %i8
+            int_return %i8
+        """)
+
+    def test_no_path(self):
+        def f(x, y):
+            if x+y:
+                return x+5
+            return x+2
+        self.encoding_test(f, [5, 6], """
+            -live- %i0
+            int_add %i0, %i1, %i2
+            int_is_true %i2, %i3
+            goto_if_not L1, %i3
+            int_copy %i0, %i4
+            -live-
+            int_add %i4, $5, %i5
+            int_return %i5
+            L1:
+            int_copy %i0, %i6
+            -live-
+            int_add %i6, $2, %i7
+            int_return %i7
+        """)



More information about the Pypy-commit mailing list