[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