[pypy-svn] r25561 - pypy/branch/stacklesscfg/pypy/translator/backendopt
mwh at codespeak.net
mwh at codespeak.net
Sat Apr 8 17:49:57 CEST 2006
Author: mwh
Date: Sat Apr 8 17:49:56 2006
New Revision: 25561
Modified:
pypy/branch/stacklesscfg/pypy/translator/backendopt/support.py
Log:
merging of http://codespeak.net/svn/pypy/dist/pypy/translator/backendopt/support.py
revisions 25473 to 25557:
------------------------------------------------------------------------
r25555 | hpk | 2006-04-08 17:32:31 +0200 (Sat, 08 Apr 2006) | 2 lines
merge r25548 of stacklesscfg branch (split_block returns splitlink instead of afterblock)
------------------------------------------------------------------------
r25530 | cfbolz | 2006-04-07 23:49:27 +0200 (Fri, 07 Apr 2006) | 2 lines
move find_backedges etc to support
------------------------------------------------------------------------
r25523 | cfbolz | 2006-04-07 20:42:39 +0200 (Fri, 07 Apr 2006) | 5 lines
(pedronis, cfbolz):
do the (very indeterministic) stack check insertion as late as possible, just
before code generation.
------------------------------------------------------------------------
Modified: pypy/branch/stacklesscfg/pypy/translator/backendopt/support.py
==============================================================================
--- pypy/branch/stacklesscfg/pypy/translator/backendopt/support.py (original)
+++ pypy/branch/stacklesscfg/pypy/translator/backendopt/support.py Sat Apr 8 17:49:56 2006
@@ -1,7 +1,9 @@
import py
from pypy.rpython.lltypesystem import lltype
+from pypy.translator.simplify import get_graph
from pypy.rpython.rmodel import inputconst
from pypy.tool.ansi_print import ansi_log
+from pypy.annotation.model import setunion
from pypy.translator.unsimplify import split_block, copyvar, insert_empty_block
from pypy.objspace.flow.model import Constant, Variable, SpaceOperation, c_last_exception
from pypy.rpython.lltypesystem import lltype
@@ -95,6 +97,78 @@
afterblock.operations.extend(generate_keepalive(keep_alive_vars))
return splitlink
+def calculate_call_graph(translator):
+ calls = {}
+ for graph in translator.graphs:
+ if getattr(getattr(graph, "func", None), "suggested_primitive", False):
+ continue
+ calls[graph] = {}
+ for block in graph.iterblocks():
+ for op in block.operations:
+ if op.opname == "direct_call":
+ called_graph = get_graph(op.args[0], translator)
+ if called_graph is not None:
+ calls[graph][called_graph] = block
+ if op.opname == "indirect_call":
+ graphs = op.args[-1].value
+ if graphs is not None:
+ for called_graph in graphs:
+ calls[graph][called_graph] = block
+ return calls
+
+def find_backedges(graph):
+ """finds the backedges in the flow graph"""
+ scheduled = [graph.startblock]
+ seen = {}
+ backedges = []
+ while scheduled:
+ current = scheduled.pop()
+ seen[current] = True
+ for link in current.exits:
+ if link.target in seen:
+ backedges.append(link)
+ else:
+ scheduled.append(link.target)
+ return backedges
+
+def compute_reachability(graph):
+ reachable = {}
+ for block in graph.iterblocks():
+ reach = {}
+ scheduled = [block]
+ while scheduled:
+ current = scheduled.pop()
+ for link in current.exits:
+ if link.target in reachable:
+ reach = setunion(reach, reachable[link.target])
+ continue
+ if link.target not in reach:
+ reach[link.target] = True
+ reachable[block] = reach
+ return reachable
+
+def find_loop_blocks(graph):
+ """find the blocks in a graph that are part of a loop"""
+ loop = {}
+ reachable = compute_reachability(graph)
+ for backedge in find_backedges(graph):
+ start = backedge.target
+ end = backedge.prevblock
+ loop[start] = start
+ loop[end] = start
+ scheduled = [start]
+ seen = {}
+ while scheduled:
+ current = scheduled.pop()
+ connects = end in reachable[current]
+ seen[current] = True
+ if connects:
+ loop[current] = start
+ for link in current.exits:
+ if link.target not in seen:
+ scheduled.append(link.target)
+ return loop
+
def md5digest(translator):
import md5
m = md5.new()
More information about the Pypy-commit
mailing list