Author: Armin Rigo <[email protected]>
Branch:
Changeset: r63277:e56b02cf916b
Date: 2013-04-12 13:50 +0200
http://bitbucket.org/pypy/pypy/changeset/e56b02cf916b/
Log: annlowlevel.backend_optimize() should also enable inlining of pre-
existing graphs into the new graphs.
diff --git a/rpython/rtyper/annlowlevel.py b/rpython/rtyper/annlowlevel.py
--- a/rpython/rtyper/annlowlevel.py
+++ b/rpython/rtyper/annlowlevel.py
@@ -301,7 +301,8 @@
from rpython.translator.backendopt.all import backend_optimizations
translator = self.rtyper.annotator.translator
newgraphs = self.newgraphs.keys()
- backend_optimizations(translator, newgraphs, secondary=True, **flags)
+ backend_optimizations(translator, newgraphs, secondary=True,
+ inline_graph_from_anywhere=True, **flags)
self.newgraphs.clear()
# ____________________________________________________________
diff --git a/rpython/translator/backendopt/all.py
b/rpython/translator/backendopt/all.py
--- a/rpython/translator/backendopt/all.py
+++ b/rpython/translator/backendopt/all.py
@@ -31,7 +31,8 @@
return func
-def backend_optimizations(translator, graphs=None, secondary=False, **kwds):
+def backend_optimizations(translator, graphs=None, secondary=False,
+ inline_graph_from_anywhere=False, **kwds):
# sensible keywords are
# raisingop2direct_call, inline_threshold, mallocs
# merge_if_blocks, constfold, heap2stack
@@ -86,7 +87,8 @@
threshold = 0
inline_malloc_removal_phase(config, translator, graphs,
threshold,
- inline_heuristic=heuristic)
+ inline_heuristic=heuristic,
+ inline_graph_from_anywhere=inline_graph_from_anywhere)
constfold(config, graphs)
if config.clever_malloc_removal:
@@ -147,7 +149,8 @@
def inline_malloc_removal_phase(config, translator, graphs, inline_threshold,
inline_heuristic,
- call_count_pred=None):
+ call_count_pred=None,
+ inline_graph_from_anywhere=False):
type_system = translator.rtyper.type_system.name
# inline functions in each other
@@ -158,7 +161,8 @@
inline.auto_inline_graphs(translator, graphs, inline_threshold,
heuristic=inline_heuristic,
- call_count_pred=call_count_pred)
+ call_count_pred=call_count_pred,
+ inline_graph_from_anywhere=inline_graph_from_anywhere)
if config.print_statistics:
print "after inlining:"
diff --git a/rpython/translator/backendopt/inline.py
b/rpython/translator/backendopt/inline.py
--- a/rpython/translator/backendopt/inline.py
+++ b/rpython/translator/backendopt/inline.py
@@ -608,8 +608,9 @@
return (0.9999 * measure_median_execution_cost(graph) +
count), True
-def inlinable_static_callers(graphs, store_calls=False):
- ok_to_call = set(graphs)
+def inlinable_static_callers(graphs, store_calls=False, ok_to_call=None):
+ if ok_to_call is None:
+ ok_to_call = set(graphs)
result = []
def add(parentgraph, block, op, graph):
if store_calls:
@@ -773,11 +774,16 @@
return count
def auto_inline_graphs(translator, graphs, threshold, call_count_pred=None,
- heuristic=inlining_heuristic):
- callgraph = inlinable_static_callers(graphs)
- count = auto_inlining(translator, threshold, callgraph=callgraph,
- heuristic=heuristic,
- call_count_pred=call_count_pred)
- log.inlining('inlined %d callsites.' % (count,))
- for graph in graphs:
- removenoops.remove_duplicate_casts(graph, translator)
+ heuristic=inlining_heuristic,
+ inline_graph_from_anywhere=False):
+ if inline_graph_from_anywhere:
+ ok_to_call = set(translator.graphs)
+ else:
+ ok_to_call = None
+ callgraph = inlinable_static_callers(graphs, ok_to_call=ok_to_call)
+ count = auto_inlining(translator, threshold, callgraph=callgraph,
+ heuristic=heuristic,
+ call_count_pred=call_count_pred)
+ log.inlining('inlined %d callsites.' % (count,))
+ for graph in graphs:
+ removenoops.remove_duplicate_casts(graph, translator)
diff --git a/rpython/translator/backendopt/test/test_inline.py
b/rpython/translator/backendopt/test/test_inline.py
--- a/rpython/translator/backendopt/test/test_inline.py
+++ b/rpython/translator/backendopt/test/test_inline.py
@@ -9,6 +9,7 @@
from rpython.translator.backendopt.inline import collect_called_graphs
from rpython.translator.backendopt.inline import measure_median_execution_cost
from rpython.translator.backendopt.inline import instrument_inline_candidates
+from rpython.translator.backendopt.inline import auto_inline_graphs
from rpython.translator.backendopt.checkvirtual import check_virtual_methods
from rpython.translator.translator import TranslationContext, graphof
from rpython.rtyper.llinterp import LLInterpreter
@@ -625,6 +626,19 @@
res = eval_func([])
assert res == 5
+ def test_auto_inline_graphs_from_anywhere(self):
+ def leaf(n):
+ return n
+ def f(n):
+ return leaf(n)
+ t = self.translate(f, [int])
+ f_graph = graphof(t, f)
+ assert len(collect_called_graphs(f_graph, t)) == 1
+ auto_inline_graphs(t, [f_graph], 32)
+ assert len(collect_called_graphs(f_graph, t)) == 1
+ auto_inline_graphs(t, [f_graph], 32, inline_graph_from_anywhere=True)
+ assert len(collect_called_graphs(f_graph, t)) == 0
+
class TestInlineOOType(OORtypeMixin, BaseTestInline):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit