[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