[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