[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