[pypy-svn] r21174 - in pypy/dist/pypy/translator/backendopt: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Thu Dec 15 15:21:57 CET 2005


Author: cfbolz
Date: Thu Dec 15 15:21:55 2005
New Revision: 21174

Modified:
   pypy/dist/pypy/translator/backendopt/merge_if_blocks.py
   pypy/dist/pypy/translator/backendopt/test/test_merge_if_blocks.py
Log:
oops! don't merge chains of ifs, only chains of one if and elifs.


Modified: pypy/dist/pypy/translator/backendopt/merge_if_blocks.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/merge_if_blocks.py	(original)
+++ pypy/dist/pypy/translator/backendopt/merge_if_blocks.py	Thu Dec 15 15:21:55 2005
@@ -1,4 +1,5 @@
-from pypy.objspace.flow.model import Block, Constant, Variable, flatten, checkgraph
+from pypy.objspace.flow.model import Block, Constant, Variable, flatten
+from pypy.objspace.flow.model import checkgraph, mkentrymap
 from pypy.translator.backendopt.support import log
 
 log = log.mergeifblocks
@@ -46,6 +47,7 @@
     """
     candidates = [block for block in graph.iterblocks()
                       if is_chain_block(block, first=True)]
+    entrymap = mkentrymap(graph)
     for firstblock in candidates:
         chain = []
         checkvars = []
@@ -72,11 +74,9 @@
             falseexit = current.exits[0]
             assert not falseexit.exitcase
             trueexit = current.exits[1]
-            for i, var in enumerate(trueexit.args):
-                add_to_varmap(var, trueexit.target.inputargs[i])
-            for i, var in enumerate(falseexit.args):
-                add_to_varmap(var, falseexit.target.inputargs[i])
             targetblock = falseexit.target
+            if len(entrymap[targetblock]) != 1:
+                break
             if checkvar not in falseexit.args:
                 break
             newcheckvar = targetblock.inputargs[falseexit.args.index(checkvar)]
@@ -84,6 +84,10 @@
                 break
             if newcheckvar not in targetblock.operations[0].args:
                 break
+            for i, var in enumerate(trueexit.args):
+                add_to_varmap(var, trueexit.target.inputargs[i])
+            for i, var in enumerate(falseexit.args):
+                add_to_varmap(var, falseexit.target.inputargs[i])
             current = targetblock
         if len(chain) > 1:
             break

Modified: pypy/dist/pypy/translator/backendopt/test/test_merge_if_blocks.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/test/test_merge_if_blocks.py	(original)
+++ pypy/dist/pypy/translator/backendopt/test/test_merge_if_blocks.py	Thu Dec 15 15:21:55 2005
@@ -71,4 +71,23 @@
     assert len(graph.startblock.exits) == 3
     assert len(list(graph.iterblocks())) == 3
 
-            
+def test_dont_merge():
+    def merge(n, m):
+        r = -1
+        if n == 0:
+            r += m
+        if n == 1:
+            r += 2 * m
+        else:
+            r += 6
+        return r
+    t = TranslationContext()
+    a = t.buildannotator()
+    a.build_types(merge, [int, int])
+    rtyper = t.buildrtyper()
+    rtyper.specialize()
+    graph = tgraphof(t, merge)
+    remove_same_as(graph)
+    blocknum = len(list(graph.iterblocks()))
+    merge_if_blocks(graph)
+    assert blocknum == len(list(graph.iterblocks()))



More information about the Pypy-commit mailing list