[pypy-svn] r22242 - pypy/dist/pypy/translator/backendopt
cfbolz at codespeak.net
cfbolz at codespeak.net
Mon Jan 16 23:31:42 CET 2006
Author: cfbolz
Date: Mon Jan 16 23:31:41 2006
New Revision: 22242
Modified:
pypy/dist/pypy/translator/backendopt/escape.py
Log:
* comment out most debug prints as they take a lot of time
* actually use the functionargs cache (thanks samuele)
* finish the analysis _before_ changing something -- duh
Modified: pypy/dist/pypy/translator/backendopt/escape.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/escape.py (original)
+++ pypy/dist/pypy/translator/backendopt/escape.py Mon Jan 16 23:31:41 2006
@@ -110,7 +110,7 @@
return crep
def schedule_function(self, graph):
- print "scheduling function:", graph.name
+ #print "scheduling function:", graph.name
startblock = graph.startblock
if graph in self.functionargs:
args = self.functionargs[graph]
@@ -125,6 +125,7 @@
self.setstate(var, varstate)
args.append(varstate)
self.scheduled[startblock] = graph
+ self.functionargs[graph] = args
resultstate = self.getstate(graph.returnblock.inputargs[0])
return resultstate, args
@@ -146,42 +147,42 @@
return
self.curr_block = block
self.curr_graph = graph
- print "inputargs", self.getstates(block.inputargs)
+ #print "inputargs", self.getstates(block.inputargs)
for op in block.operations:
self.flow_operation(op)
- print "checking exits..."
+ #print "checking exits..."
for exit in block.exits:
- print "exit", exit
+ #print "exit", exit
args = self.getstates(exit.args)
targetargs = self.getstates(exit.target.inputargs)
- print " newargs", args
- print " targetargs", targetargs
+ #print " newargs", args
+ #print " targetargs", targetargs
# flow every block at least once:
if (multicontains(targetargs, args) and
exit.target in self.flown_blocks):
- print " not necessary"
+ #print " not necessary"
continue
- else:
- print " scheduling for flowin"
+ #else:
+ #print " scheduling for flowin"
for prevstate, origstate, var in zip(args, targetargs,
exit.target.inputargs):
if not isonheap(var):
continue
newstate = prevstate.merge(origstate)
self.setstate(var, newstate)
- print " args", self.getstates(exit.target.inputargs)
+ #print " args", self.getstates(exit.target.inputargs)
self.scheduled[exit.target] = graph
def flow_operation(self, op):
- print "handling", op
+ #print "handling", op
args = self.getstates(op.args)
- print "args:", args
+ #print "args:", args
opimpl = getattr(self, 'op_'+op.opname, None)
if opimpl is None:
if isonheap(op.result) or filter(None, args):
raise NotImplementedError("can't handle %s" % (op.opname, ))
- print "assuming that '%s' is irrelevant" % op
+ #print "assuming that '%s' is irrelevant" % op
return
res = opimpl(op, *args)
self.setstate(op.result, res)
@@ -207,7 +208,7 @@
def register_state_dependency(self, state1, state2):
"state1 depends on state2: if state2 does escape/change, so does state1"
# change state1 according to how state2 is now
- print "registering dependency of %s on %s" % (state1, state2)
+ #print "registering dependency of %s on %s" % (state1, state2)
escapes = state2.does_escape()
if escapes and not state1.does_escape():
changed = state1.setescapes()
@@ -409,17 +410,21 @@
def malloc_to_stack(t):
aib = AbstractDataFlowInterpreter(t)
for graph in t.graphs:
+ if graph.startblock not in aib.flown_blocks:
+ aib.schedule_function(graph)
+ aib.complete()
+ for graph in t.graphs:
loop_blocks = find_loop_blocks(graph)
for block in graph.iterblocks():
for op in block.operations:
if op.opname == 'malloc':
- if graph.startblock not in aib.flown_blocks:
- aib.schedule_function(graph)
- aib.complete()
varstate = aib.getstate(op.result)
assert len(varstate.creation_points) == 1
crep = varstate.creation_points.keys()[0]
- if not crep.escapes and block not in loop_blocks:
- print "moving object from heap to stack %s in %s" % (op, graph.name)
- op.opname = 'flavored_malloc'
- op.args.insert(0, inputconst(lltype.Void, 'stack'))
+ if not crep.escapes:
+ if block not in loop_blocks:
+ print "moving object from heap to stack %s in %s" % (op, graph.name)
+ op.opname = 'flavored_malloc'
+ op.args.insert(0, inputconst(lltype.Void, 'stack'))
+ else:
+ print "%s in %s is a non-escaping malloc in a loop" % (op, graph.name)
More information about the Pypy-commit
mailing list