[pypy-svn] r25460 - in pypy/dist/pypy/translator: backendopt c
cfbolz at codespeak.net
cfbolz at codespeak.net
Thu Apr 6 19:14:27 CEST 2006
Author: cfbolz
Date: Thu Apr 6 19:14:26 2006
New Revision: 25460
Modified:
pypy/dist/pypy/translator/backendopt/inline.py
pypy/dist/pypy/translator/backendopt/support.py
pypy/dist/pypy/translator/c/exceptiontransform.py
Log:
(pedronis, cfbolz):
factor out the logic that inserts keepalives. use the same logic in
exceptionstransformer
Modified: pypy/dist/pypy/translator/backendopt/inline.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/inline.py (original)
+++ pypy/dist/pypy/translator/backendopt/inline.py Thu Apr 6 19:14:26 2006
@@ -9,7 +9,7 @@
from pypy.rpython.lltypesystem.lltype import Bool, typeOf, Void
from pypy.rpython import rmodel
from pypy.tool.algo import sparsemat
-from pypy.translator.backendopt.support import log, needs_conservative_livevar_calculation, var_needsgc
+from pypy.translator.backendopt.support import log, split_block_with_keepalive, generate_keepalive
BASE_INLINE_THRESHOLD = 32.4 # just enough to inline add__Int_Int()
# and just small enough to prevend inlining of some rlist functions.
@@ -217,17 +217,6 @@
newlink.llexitcase = link.llexitcase
return newlink
- def generate_keepalive(self, vars):
- keepalive_ops = []
- for v in vars:
- if isinstance(v, Constant):
- continue
- if v.concretetype._is_atomic():
- continue
- v_keepalive = Variable()
- v_keepalive.concretetype = Void
- keepalive_ops.append(SpaceOperation('keepalive', [v], v_keepalive))
- return keepalive_ops
def find_args_in_exceptional_case(self, link, block, etype, evalue, afterblock, passon_vars):
linkargs = []
@@ -297,7 +286,7 @@
for exceptionlink in afterblock.exits[1:]:
if exc_match(eclass, exceptionlink.llexitcase):
passon_vars = self.passon_vars(link.prevblock)
- copiedblock.operations += self.generate_keepalive(passon_vars)
+ copiedblock.operations += generate_keepalive(passon_vars)
copiedlink.target = exceptionlink.target
linkargs = self.find_args_in_exceptional_case(
exceptionlink, link.prevblock, etype, evalue, afterblock, passon_vars)
@@ -346,29 +335,12 @@
del blocks[-1].exits[0].llexitcase
linkargs = copiedexceptblock.inputargs
copiedexceptblock.closeblock(Link(linkargs, blocks[0]))
- copiedexceptblock.operations += self.generate_keepalive(linkargs)
+ copiedexceptblock.operations += generate_keepalive(linkargs)
def do_inline(self, block, index_operation):
- afterblock = split_block(self.translator, self.graph, block, index_operation)
- conservative_keepalives = needs_conservative_livevar_calculation(block)
- if conservative_keepalives:
- keep_alive_vars = [var for var in block.getvariables()
- if var_needsgc(var)]
- # XXX you could maybe remove more, if the variables are kept
- # alive by something else. but this is sometimes hard to know
- for i, var in enumerate(keep_alive_vars):
- try:
- index = block.exits[0].args.index(var)
- newvar = afterblock.inputargs[index]
- except ValueError:
- block.exits[0].args.append(var)
- newvar = copyvar(self.translator, var)
- afterblock.inputargs.append(newvar)
- keep_alive_vars[i] = newvar
- else:
- keep_alive_vars = [var for var in afterblock.operations[0].args
- if var_needsgc(var)]
+ afterblock = split_block_with_keepalive(
+ self.translator, self.graph, block, index_operation)
# these variables have to be passed along all the links in the inlined
# graph because the original function needs them in the blocks after
# the inlined function
@@ -404,7 +376,6 @@
assert afterblock.exits[0].exitcase is None
afterblock.exits = [afterblock.exits[0]]
afterblock.exitswitch = None
- afterblock.operations.extend(self.generate_keepalive(keep_alive_vars))
self.search_for_calls(afterblock)
self.search_for_calls(block)
Modified: pypy/dist/pypy/translator/backendopt/support.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/support.py (original)
+++ pypy/dist/pypy/translator/backendopt/support.py Thu Apr 6 19:14:26 2006
@@ -2,6 +2,9 @@
from pypy.rpython.lltypesystem import lltype
from pypy.rpython.rmodel import inputconst
from pypy.tool.ansi_print import ansi_log
+from pypy.translator.unsimplify import split_block, copyvar
+from pypy.objspace.flow.model import Constant, Variable, SpaceOperation
+from pypy.rpython.lltypesystem import lltype
log = py.log.Producer("backendopt")
py.log.setconsumer("backendopt", ansi_log)
@@ -45,6 +48,44 @@
else:
return False
+def generate_keepalive(vars):
+ keepalive_ops = []
+ for v in vars:
+ if isinstance(v, Constant):
+ continue
+ if v.concretetype._is_atomic():
+ continue
+ v_keepalive = Variable()
+ v_keepalive.concretetype = lltype.Void
+ keepalive_ops.append(SpaceOperation('keepalive', [v], v_keepalive))
+ return keepalive_ops
+
+def split_block_with_keepalive(translator, graph, block, index_operation,
+ keep_alive_op_args=True):
+ afterblock = split_block(translator, graph, block, index_operation)
+ conservative_keepalives = needs_conservative_livevar_calculation(block)
+ if conservative_keepalives:
+ keep_alive_vars = [var for var in block.getvariables()
+ if var_needsgc(var)]
+ # XXX you could maybe remove more, if the variables are kept
+ # alive by something else. but this is sometimes hard to know
+ for i, var in enumerate(keep_alive_vars):
+ try:
+ index = block.exits[0].args.index(var)
+ newvar = afterblock.inputargs[index]
+ except ValueError:
+ block.exits[0].args.append(var)
+ newvar = copyvar(translator, var)
+ afterblock.inputargs.append(newvar)
+ keep_alive_vars[i] = newvar
+ elif keep_alive_op_args:
+ keep_alive_vars = [var for var in afterblock.operations[0].args
+ if var_needsgc(var)]
+ else:
+ keep_alive_vars = []
+ afterblock.operations.extend(generate_keepalive(keep_alive_vars))
+ return afterblock
+
def md5digest(translator):
import md5
m = md5.new()
Modified: pypy/dist/pypy/translator/c/exceptiontransform.py
==============================================================================
--- pypy/dist/pypy/translator/c/exceptiontransform.py (original)
+++ pypy/dist/pypy/translator/c/exceptiontransform.py Thu Apr 6 19:14:26 2006
@@ -1,11 +1,11 @@
from pypy.translator.simplify import join_blocks, cleanup_graph
from pypy.translator.unsimplify import copyvar, split_block
-from pypy.translator.backendopt import canraise, inline
+from pypy.translator.backendopt import canraise, inline, support
from pypy.objspace.flow.model import Block, Constant, Variable, Link, \
c_last_exception, SpaceOperation, checkgraph, FunctionGraph
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.rpython.memory.lladdress import NULL
-from pypy.rpython.memory.gctransform import varoftype, var_needsgc
+from pypy.rpython.memory.gctransform import varoftype
from pypy.rpython import rclass
from pypy.rpython.rarithmetic import r_uint, r_longlong, r_ulonglong
from pypy.annotation import model as annmodel
@@ -29,20 +29,6 @@
return Constant(lltype.nullptr(T.TO), T)
assert 0, "not implemented yet"
-def insert_keepalives_along(translator, link, vars):
- vars = [v for v in vars if v not in link.args]
- link.args.extend(vars)
- newvars = [copyvar(translator, v) for v in vars]
- block = link.target
- block.inputargs.extend(newvars)
- block.operations[0:0] = [SpaceOperation('keepalive', [v],
- varoftype(lltype.Void))
- for v in newvars]
-
-def vars_to_keepalive(block):
- # XXX make cleverer
- return [v for v in block.getvariables() if var_needsgc(v)]
-
class ExceptionTransformer(object):
def __init__(self, translator):
self.translator = translator
@@ -163,13 +149,11 @@
if not self.raise_analyzer.can_raise(op):
continue
- afterblock = split_block(self.translator, graph, block, i+1)
+ afterblock = support.split_block_with_keepalive(
+ self.translator, graph, block, i+1, False)
if lastblock is block:
lastblock = afterblock
- insert_keepalives_along(self.translator, block.exits[0],
- vars_to_keepalive(block))
-
self.gen_exc_check(block, graph.returnblock)
#non-exception case
More information about the Pypy-commit
mailing list