[pypy-svn] rev 1515 - in pypy/trunk/src/pypy/translator: . test

hpk at codespeak.net hpk at codespeak.net
Wed Oct 1 22:12:18 CEST 2003


Author: hpk
Date: Wed Oct  1 22:12:17 2003
New Revision: 1515

Modified:
   pypy/trunk/src/pypy/translator/flowmodel.py
   pypy/trunk/src/pypy/translator/genpyrex.py
   pypy/trunk/src/pypy/translator/simplify.py
   pypy/trunk/src/pypy/translator/test/test_pyrextrans.py
Log:
- remove empty blocks before EndBranches

- remove identity assignments while generating pyrex-code



Modified: pypy/trunk/src/pypy/translator/flowmodel.py
==============================================================================
--- pypy/trunk/src/pypy/translator/flowmodel.py	(original)
+++ pypy/trunk/src/pypy/translator/flowmodel.py	Wed Oct  1 22:12:17 2003
@@ -31,6 +31,10 @@
     def getedges(self):
         return [self.branch]
 
+    def replace_branch(self, one, another):
+        assert self.branch is one
+        self.branch = another
+
     def closeblock(self, branch):
         self.operations = tuple(self.operations)  # should no longer change
         self.branch = branch
@@ -97,6 +101,15 @@
         self.ifbranch = ifbranch
         self.elsebranch = elsebranch
 
+    def replace_branch(self, one, another):
+        assert self.ifbranch is not self.elsebranch, "please enhance flowobjspace"
+        if one is self.ifbranch:
+            self.ifbranch = another
+        elif one is self.elsebranch:
+            self.elsebranch = another
+        else:
+            raise ValueError, "Don't have this branch %r" % one
+
 class EndBranch(FlowNode):
     def __init__(self, returnvalue):
         self.returnvalue = returnvalue

Modified: pypy/trunk/src/pypy/translator/genpyrex.py
==============================================================================
--- pypy/trunk/src/pypy/translator/genpyrex.py	(original)
+++ pypy/trunk/src/pypy/translator/genpyrex.py	Wed Oct  1 22:12:17 2003
@@ -156,8 +156,14 @@
         sourceargs = [_str(arg, prevblock) for arg in branch.args]       
         targetargs = [_str(arg, branch.target) for arg in block.input_args]
         assert(len(sourceargs) == len(targetargs))
-        if sourceargs and sourceargs != targetargs: 
-            self.putline("%s = %s" % (", ".join(targetargs), ", ".join(sourceargs)))
+        # get rid of identity-assignments 
+        sargs, targs = [], []
+        for s,t in zip(sourceargs, targetargs):
+            if s != t:
+                sargs.append(s) 
+                targs.append(t)
+        if sargs:
+            self.putline("%s = %s" % (", ".join(targs), ", ".join(sargs)))
 
         self.gen_BasicBlock(block)    
 

Modified: pypy/trunk/src/pypy/translator/simplify.py
==============================================================================
--- pypy/trunk/src/pypy/translator/simplify.py	(original)
+++ pypy/trunk/src/pypy/translator/simplify.py	Wed Oct  1 22:12:17 2003
@@ -7,6 +7,9 @@
 from pypy.interpreter.baseobjspace import ObjSpace
 from pypy.translator.flowmodel import *
 
+# debug
+from pypy.translator.genpyrex import GenPyrex
+
 
 def eliminate_empty_blocks(graph):
     """simplify_vars()
@@ -34,15 +37,24 @@
                     continue
                 prevbranch = prevnodes[0]
                 nextbranch = node.branch
-                if not isinstance(prevbranch, Branch) or isinstance(nextbranch, EndBranch):
+                if not isinstance(prevbranch, Branch):
                    continue 
-                # renaming ... (figure it out yourself :-)
-                if len(prevbranch.args) > len(nextbranch.args):
-                    prevbranch.args = prevbranch.args[:len(nextbranch.args)]
+                if isinstance(nextbranch, EndBranch):
+                    var = nextbranch.returnvalue
+                    prevprevnode = entrymap[prevbranch]
+                    assert len(prevprevnode) == 1 
+                    if var in node.input_args:
+                        i = node.input_args.index(var)
+                        nextbranch.returnvalue = prevbranch.args[i]
+                    prevprevnode[0].replace_branch(prevbranch, nextbranch)
                 else:
-                    prevbranch.args.extend(nextbranch.args[len(prevbranch.args):])
-                prevbranch.target = nextbranch.target
-                print "eliminated", node, nextbranch
+                    # renaming ... (figure it out yourself :-)
+                    if len(prevbranch.args) > len(nextbranch.args):
+                        prevbranch.args = prevbranch.args[:len(nextbranch.args)]
+                    else:
+                        prevbranch.args.extend(nextbranch.args[len(prevbranch.args):])
+                    prevbranch.target = nextbranch.target
+                #print "eliminated", node, nextbranch
                 victims = True
                 break
     return graph

Modified: pypy/trunk/src/pypy/translator/test/test_pyrextrans.py
==============================================================================
--- pypy/trunk/src/pypy/translator/test/test_pyrextrans.py	(original)
+++ pypy/trunk/src/pypy/translator/test/test_pyrextrans.py	Wed Oct  1 22:12:17 2003
@@ -27,7 +27,7 @@
         name = func.func_name
         funcgraph = self.space.build_flow(func)
         from pypy.translator.simplify import eliminate_empty_blocks
-        #eliminate_empty_blocks(funcgraph)
+        eliminate_empty_blocks(funcgraph)
         funcgraph.source = inspect.getsource(func)
         result = GenPyrex(funcgraph).emitcode()
         make_dot(funcgraph, udir, 'ps')


More information about the Pypy-commit mailing list