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

Reply via email to