[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