[pypy-commit] pypy ssa-flow: create remove_trivial_links(): the SSA version of join_blocks()

rlamy noreply at buildbot.pypy.org
Fri Nov 14 00:50:25 CET 2014


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: ssa-flow
Changeset: r74514:273f7c704efb
Date: 2014-11-13 23:49 +0000
http://bitbucket.org/pypy/pypy/changeset/273f7c704efb/

Log:	create remove_trivial_links(): the SSA version of join_blocks()

diff --git a/rpython/translator/simplify.py b/rpython/translator/simplify.py
--- a/rpython/translator/simplify.py
+++ b/rpython/translator/simplify.py
@@ -246,6 +246,44 @@
             seen.append(case)
         block.recloseblock(*exits)
 
+def remove_trivial_links(graph):
+    """Remove trivial links by merging their source and target blocks
+
+    A link is trivial if it only renames variables, is the single exit of its
+    source and the single parent of its target.
+    """
+    entrymap = mkentrymap(graph)
+    block = graph.startblock
+    seen = set([block])
+    stack = list(block.exits)
+    renaming = {}
+    while stack:
+        link = stack.pop()
+        if link.target in seen:
+            continue
+        source = link.prevblock
+        target = link.target
+        if (source.exitswitch is None and len(entrymap[target]) == 1 and
+                target.exits):  # stop at the returnblock
+            assert len(source.exits) == 1
+            for vprev, vtarg in zip(link.args, target.inputargs):
+                while vprev in renaming:
+                    vprev = renaming[vprev]
+                renaming[vtarg] = vprev
+            target.renamevariables(renaming)
+            source.operations.extend(target.operations)
+            source.exitswitch = newexitswitch = target.exitswitch
+            exits = target.exits
+            source.recloseblock(*exits)
+            if isinstance(newexitswitch, Constant) and newexitswitch != c_last_exception:
+                exits = replace_exitswitch_by_constant(source, newexitswitch)
+            stack.extend(exits)
+        else:
+            target.renamevariables(renaming)
+            seen.add(target)
+            stack.extend(target.exits)
+
+
 def join_blocks(graph):
     """Links can be deleted if they are the single exit of a block and
     the single entry point of the next block.  When this happens, we can
@@ -962,9 +1000,9 @@
 
 all_passes = [
     eliminate_empty_blocks,
+    remove_assertion_errors,
+    remove_trivial_links,
     SSA_to_SSI,
-    remove_assertion_errors,
-    join_blocks,
     coalesce_bool,
     transform_dead_op_vars,
     remove_identical_vars,


More information about the pypy-commit mailing list