[pypy-svn] r46006 - in pypy/branch/pypy-more-rtti-inprogress/translator/backendopt: . test

fijal at codespeak.net fijal at codespeak.net
Mon Aug 27 10:27:13 CEST 2007


Author: fijal
Date: Mon Aug 27 10:27:13 2007
New Revision: 46006

Modified:
   pypy/branch/pypy-more-rtti-inprogress/translator/backendopt/inline.py
   pypy/branch/pypy-more-rtti-inprogress/translator/backendopt/test/test_inline.py
Log:
Have _always_inline_ attribute, useful for externals


Modified: pypy/branch/pypy-more-rtti-inprogress/translator/backendopt/inline.py
==============================================================================
--- pypy/branch/pypy-more-rtti-inprogress/translator/backendopt/inline.py	(original)
+++ pypy/branch/pypy-more-rtti-inprogress/translator/backendopt/inline.py	Mon Aug 27 10:27:13 2007
@@ -694,7 +694,10 @@
     while heap:
         weight, _, graph = heap[0]
         if not valid_weight.get(graph):
-            weight, fixed = heuristic(graph)
+            if getattr(graph.func, '_always_inline_', None):
+                weight, fixed = 0.0, True
+            else:
+                weight, fixed = heuristic(graph)
             #print '  + cost %7.2f %50s' % (weight, graph.name)
             heapreplace(heap, (weight, -len(callers[graph]), graph))
             valid_weight[graph] = True

Modified: pypy/branch/pypy-more-rtti-inprogress/translator/backendopt/test/test_inline.py
==============================================================================
--- pypy/branch/pypy-more-rtti-inprogress/translator/backendopt/test/test_inline.py	(original)
+++ pypy/branch/pypy-more-rtti-inprogress/translator/backendopt/test/test_inline.py	Mon Aug 27 10:27:13 2007
@@ -18,6 +18,7 @@
 from pypy.translator.backendopt.all import INLINE_THRESHOLD_FOR_TEST
 from pypy.conftest import option
 from pypy.translator.backendopt import removenoops
+from pypy.objspace.flow.model import summary
 
 def no_missing_concretetype(node):
     if isinstance(node, Block):
@@ -194,6 +195,20 @@
         result = eval_func([42])
         assert result == g(42)
 
+    def test_always_inline(self):
+        def f(x, y, z, k):
+            p = (((x, y), z), k)
+            return p[0][0][0] + p[-1]
+        f._always_inline_ = True
+
+        def g(x, y, z, k):
+            a = f(x, y, z, k)
+            return a
+        eval_func, t = self.check_auto_inlining(g, [int, int, int, int], multiplier=0.1)
+        graph = graphof(t, g)
+        s = summary(graph)
+        assert len(s) > 3
+
     def test_inline_exceptions(self):
         def f(x):
             if x == 0:



More information about the Pypy-commit mailing list