Author: Armin Rigo <[email protected]>
Branch: shadowstack-perf-2
Changeset: r84819:f76ae8307de9
Date: 2016-05-29 19:27 +0200
http://bitbucket.org/pypy/pypy/changeset/f76ae8307de9/
Log: add a test for _fix_graph_after_inlining
diff --git a/rpython/memory/gctransform/shadowcolor.py
b/rpython/memory/gctransform/shadowcolor.py
--- a/rpython/memory/gctransform/shadowcolor.py
+++ b/rpython/memory/gctransform/shadowcolor.py
@@ -687,6 +687,7 @@
if op.opname == 'gc_push_roots':
_fix_graph_after_inlining(graph, block, i)
break
+ checkgraph(graph)
def _fix_graph_after_inlining(graph, initial_block, initial_index):
op = initial_block.operations.pop(initial_index)
@@ -704,8 +705,8 @@
for i in range(start_index, len(block.operations)):
op = block.operations[i]
if op.opname == 'gc_push_roots':
- raise Exception("%r: seems to have inlined another graph "
- "which also uses GC roots" % (graph,))
+ raise Exception("%r: seems to have inlined inside it another "
+ "graph which also uses GC roots" % (graph,))
if op.opname == 'gc_pop_roots':
# end of the inlined graph, drop gc_pop_roots, keep the tail
new_operations += block.operations[i + 1:]
diff --git a/rpython/memory/gctransform/test/test_shadowcolor.py
b/rpython/memory/gctransform/test/test_shadowcolor.py
--- a/rpython/memory/gctransform/test/test_shadowcolor.py
+++ b/rpython/memory/gctransform/test/test_shadowcolor.py
@@ -4,7 +4,7 @@
from rpython.conftest import option
from rpython.memory.gctransform.shadowcolor import *
from rpython.flowspace import model as graphmodel
-from rpython.translator.simplify import join_blocks
+from rpython.translator.simplify import join_blocks, cleanup_graph
from hypothesis import given, strategies
@@ -669,3 +669,32 @@
add_leave_roots_frame(graph, regalloc)
join_blocks(graph)
postprocess_double_check(graph, force_frame=True)
+
+def test_fix_graph_after_inlining():
+ # the graph of f looks like it inlined another graph, which itself
+ # would be "if x > 100: foobar()". The foobar() function is supposed
+ # to be the big slow-path.
+ def foobar():
+ print 42
+ def f(x):
+ llop.gc_push_roots(lltype.Void, x)
+ if x > 100: # slow-path
+ foobar()
+ llop.gc_pop_roots(lltype.Void, x)
+ return x
+ graph = make_graph(f, [int])
+ postprocess_inlining(graph)
+ cleanup_graph(graph)
+ assert [op.opname for op in graph.startblock.operations] == [
+ 'int_gt', 'same_as']
+ [fastpath, slowpath] = graph.startblock.exits
+ assert fastpath.target is graph.returnblock
+ block2 = slowpath.target
+ [v] = block2.inputargs
+ assert block2.operations[0].opname == 'gc_push_roots'
+ assert block2.operations[0].args == [v]
+ assert block2.operations[1].opname == 'direct_call' # -> foobar
+ assert block2.operations[2].opname == 'gc_pop_roots'
+ assert block2.operations[2].args == [v]
+ assert len(block2.exits) == 1
+ assert block2.exits[0].target is graph.returnblock
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit