[pypy-svn] r17570 - in pypy/dist/pypy/translator/backendopt: . test
arigo at codespeak.net
arigo at codespeak.net
Wed Sep 14 18:10:18 CEST 2005
Author: arigo
Date: Wed Sep 14 18:10:17 2005
New Revision: 17570
Modified:
pypy/dist/pypy/translator/backendopt/malloc.py
pypy/dist/pypy/translator/backendopt/removenoops.py
pypy/dist/pypy/translator/backendopt/test/test_removenoops.py
Log:
Bug, test and fix of remove_same_as().
Modified: pypy/dist/pypy/translator/backendopt/malloc.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/malloc.py (original)
+++ pypy/dist/pypy/translator/backendopt/malloc.py Wed Sep 14 18:10:17 2005
@@ -60,6 +60,8 @@
if isinstance(op.args[i], Variable):
set_use_point(node, op.args[i], "op", node, op, i)
set_creation_point(node, op.result, "op", node, op)
+ if isinstance(node.exitswitch, Variable):
+ set_use_point(node, node.exitswitch, "exitswitch", node)
if isinstance(node, Link):
if isinstance(node.last_exception, Variable):
@@ -168,6 +170,7 @@
else:
newops.append(op)
block.operations[:] = newops
+ assert block.exitswitch not in vars
for link in block.exits:
newargs = []
Modified: pypy/dist/pypy/translator/backendopt/removenoops.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/removenoops.py (original)
+++ pypy/dist/pypy/translator/backendopt/removenoops.py Wed Sep 14 18:10:17 2005
@@ -1,4 +1,4 @@
-from pypy.objspace.flow.model import Block
+from pypy.objspace.flow.model import Block, Variable, Constant
from pypy.objspace.flow.model import traverse
from pypy.rpython.lltype import Void
@@ -28,7 +28,18 @@
if link.args[i] == same_as_result:
link.args[i] = same_as_arg
if block.exitswitch == same_as_result:
- block.exitswitch = same_as_arg
+ if isinstance(same_as_arg, Variable):
+ block.exitswitch = same_as_arg
+ else:
+ assert isinstance(same_as_arg, Constant)
+ newexits = [link for link in block.exits
+ if link.exitcase == same_as_arg.value]
+ assert len(newexits) == 1
+ newexits[0].exitcase = None
+ if hasattr(newexits[0], 'llexitcase'):
+ newexits[0].llexitcase = None
+ block.exitswitch = None
+ block.recloseblock(*newexits)
block.operations[index] = None
# remove all same_as operations
Modified: pypy/dist/pypy/translator/backendopt/test/test_removenoops.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/test/test_removenoops.py (original)
+++ pypy/dist/pypy/translator/backendopt/test/test_removenoops.py Wed Sep 14 18:10:17 2005
@@ -1,7 +1,8 @@
-from pypy.translator.backendopt.removenoops import remove_void
+from pypy.translator.backendopt.removenoops import remove_void, remove_same_as
+from pypy.translator.backendopt.inline import inline_function
from pypy.translator.translator import Translator
from pypy.translator.test.snippet import simple_method
-from pypy.objspace.flow.model import checkgraph
+from pypy.objspace.flow.model import checkgraph, flatten, Block
from pypy.rpython.lltype import Void
from pypy.rpython.llinterp import LLInterpreter
@@ -41,3 +42,29 @@
# assert _type is not Void
#interp = LLInterpreter(t.flowgraphs, t.rtyper)
#assert interp.eval_function(f, [0]) == 1
+
+def test_remove_same_as():
+ def nothing(x):
+ return x
+ def f():
+ nothing(False)
+ if nothing(True):
+ return 42
+ else:
+ return 666
+ t = Translator(f)
+ a = t.annotate([])
+ t.specialize()
+ # now we make the 'if True' appear
+ inline_function(t, nothing, t.flowgraphs[f])
+ # here, the graph looks like v21=same_as(True); exitswitch: v21
+ remove_same_as(t.flowgraphs[f])
+ t.checkgraphs()
+ # only one path should be left
+ for node in flatten(t.flowgraphs[f]):
+ if isinstance(node, Block):
+ assert len(node.exits) <= 1
+
+ interp = LLInterpreter(t.flowgraphs, t.rtyper)
+ result = interp.eval_function(f, [])
+ assert result == 42
More information about the Pypy-commit
mailing list