[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