[pypy-svn] r25530 - in pypy/dist/pypy/translator/backendopt: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Fri Apr 7 23:49:28 CEST 2006
Author: cfbolz
Date: Fri Apr 7 23:49:27 2006
New Revision: 25530
Modified:
pypy/dist/pypy/translator/backendopt/escape.py
pypy/dist/pypy/translator/backendopt/support.py
pypy/dist/pypy/translator/backendopt/test/test_canraise.py
pypy/dist/pypy/translator/backendopt/test/test_escape.py
Log:
move find_backedges etc to support
Modified: pypy/dist/pypy/translator/backendopt/escape.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/escape.py (original)
+++ pypy/dist/pypy/translator/backendopt/escape.py Fri Apr 7 23:49:27 2006
@@ -3,6 +3,7 @@
from pypy.rpython.lltypesystem import lltype
from pypy.translator.simplify import get_graph
from pypy.rpython.rmodel import inputconst
+from pypy.translator.backendopt import support
class CreationPoint(object):
def __init__(self, creation_method="?"):
@@ -360,59 +361,6 @@
return False
return True
-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 malloc_to_stack(t):
aib = AbstractDataFlowInterpreter(t)
for graph in t.graphs:
@@ -420,7 +368,7 @@
aib.schedule_function(graph)
aib.complete()
for graph in t.graphs:
- loop_blocks = find_loop_blocks(graph)
+ loop_blocks = support.find_loop_blocks(graph)
for block in graph.iterblocks():
for op in block.operations:
if op.opname == 'malloc':
Modified: pypy/dist/pypy/translator/backendopt/support.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/support.py (original)
+++ pypy/dist/pypy/translator/backendopt/support.py Fri Apr 7 23:49:27 2006
@@ -3,6 +3,7 @@
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
@@ -114,6 +115,59 @@
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()
Modified: pypy/dist/pypy/translator/backendopt/test/test_canraise.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/test/test_canraise.py (original)
+++ pypy/dist/pypy/translator/backendopt/test/test_canraise.py Fri Apr 7 23:49:27 2006
@@ -22,6 +22,7 @@
assert not result
def test_can_raise_recursive():
+ from pypy.translator.transform import insert_ll_stackcheck
def g(x):
return f(x)
@@ -30,8 +31,9 @@
return g(x - 1)
return 1
t, ra = translate(f, [int])
+ insert_ll_stackcheck(t)
ggraph = graphof(t, g)
- result = ra.can_raise(ggraph.startblock.operations[1])
+ result = ra.can_raise(ggraph.startblock.operations[-1])
assert result # due to stack check every recursive function can raise
def test_can_raise_exception():
Modified: pypy/dist/pypy/translator/backendopt/test/test_escape.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/test/test_escape.py (original)
+++ pypy/dist/pypy/translator/backendopt/test/test_escape.py Fri Apr 7 23:49:27 2006
@@ -1,6 +1,6 @@
from pypy.translator.translator import TranslationContext, graphof
from pypy.translator.backendopt.escape import AbstractDataFlowInterpreter, malloc_to_stack
-from pypy.translator.backendopt.escape import find_backedges, find_loop_blocks
+from pypy.translator.backendopt.support import find_backedges, find_loop_blocks
from pypy.rpython.llinterp import LLInterpreter
from pypy.rpython.objectmodel import instantiate
More information about the Pypy-commit
mailing list