[pypy-svn] r25015 - pypy/dist/pypy/translator/backendopt

cfbolz at codespeak.net cfbolz at codespeak.net
Sun Mar 26 16:10:48 CEST 2006


Author: cfbolz
Date: Sun Mar 26 16:10:46 2006
New Revision: 25015

Added:
   pypy/dist/pypy/translator/backendopt/stat.py
Modified:
   pypy/dist/pypy/translator/backendopt/all.py
Log:
some minimal (and by default disable) statistic printing


Modified: pypy/dist/pypy/translator/backendopt/all.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/all.py	(original)
+++ pypy/dist/pypy/translator/backendopt/all.py	Sun Mar 26 16:10:46 2006
@@ -4,11 +4,14 @@
 from pypy.translator.backendopt.malloc import remove_simple_mallocs
 from pypy.translator.backendopt.ssa import SSI_to_SSA
 from pypy.translator.backendopt.propagate import propagate_all
+from pypy.translator.backendopt.stat import print_statistics
 from pypy.translator.backendopt.merge_if_blocks import merge_if_blocks
 from pypy.translator import simplify
 from pypy.translator.backendopt.escape import malloc_to_stack
 from pypy.translator.backendopt.support import log
 
+PRINT_STATISTICS = False
+
 def backend_optimizations(translator, raisingop2direct_call_all=False,
                                       inline_threshold=1,
                                       mallocs=True,
@@ -17,6 +20,10 @@
                                       propagate=False,
                                       heap2stack=False):
 
+    if PRINT_STATISTICS:
+        print "before optimizations:"
+        print_statistics(translator.graphs[0], translator)
+
     if raisingop2direct_call_all:
         raisingop2direct_call(translator)
 
@@ -26,6 +33,10 @@
         simplify.eliminate_empty_blocks(graph)
         simplify.transform_dead_op_vars(graph, translator)
 
+    if PRINT_STATISTICS:
+        print "after no-op removal:"
+        print_statistics(translator.graphs[0], translator)
+
     # ...
     if propagate:
         propagate_all(translator)
@@ -34,6 +45,10 @@
     if inline_threshold:
         auto_inlining(translator, inline_threshold)
 
+    if PRINT_STATISTICS:
+        print "after inlining:"
+        print_statistics(translator.graphs[0], translator)
+
     # vaporize mallocs
     if mallocs:
         tot = 0
@@ -46,6 +61,11 @@
                 simplify.transform_dead_op_vars(graph, translator)
                 tot += count
         log.malloc("removed %d simple mallocs in total" % tot)
+
+    if PRINT_STATISTICS:
+        print "after malloc removal:"
+        print_statistics(translator.graphs[0], translator)
+
     if propagate:
         propagate_all(translator)
 
@@ -55,7 +75,11 @@
     if merge_if_blocks_to_switch:
         for graph in translator.graphs:
             merge_if_blocks(graph)
-   
+
+    if PRINT_STATISTICS:
+        print "after if-to-switch:"
+        print_statistics(translator.graphs[0], translator)
+
     if ssa_form:
         for graph in translator.graphs:
             SSI_to_SSA(graph)

Added: pypy/dist/pypy/translator/backendopt/stat.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/backendopt/stat.py	Sun Mar 26 16:10:46 2006
@@ -0,0 +1,33 @@
+from pypy.translator.simplify import get_graph
+
+def get_statistics(graph, translator):
+    seen_graphs = {}
+    stack = [graph]
+    num_graphs = 0
+    num_blocks = 0
+    num_ops = 0
+    while stack:
+        graph = stack.pop()
+        if graph in seen_graphs:
+            continue
+        seen_graphs[graph] = True
+        num_graphs += 1
+        for block in graph.iterblocks():
+            num_blocks += 1
+            for op in block.operations:
+                if op.opname == "direct_call":
+                    called_graph = get_graph(op.args[0], translator)
+                    if called_graph is not None:
+                        stack.append(called_graph)
+                elif op.opname == "indirect_call":
+                    called_graphs = op.args[-1].value
+                    if called_graphs is not None:
+                        stack.extend(called_graphs)
+                num_ops += 1
+    return num_graphs, num_blocks, num_ops
+
+def print_statistics(graph, translator):
+    num_graphs, num_blocks, num_ops = get_statistics(graph, translator)
+    print ("Statistics:\nnumber of graphs %s\n"
+           "number of blocks %s\n"
+           "number of operations %s\n") % (num_graphs, num_blocks, num_ops)



More information about the Pypy-commit mailing list