[pypy-commit] pypy llvm-translation-backend: Put gc_reload_possibly_moved transformation in its own method.
mjacob
pypy.commits at gmail.com
Sat Jan 9 12:48:36 EST 2016
Author: Manuel Jacob <me at manueljacob.de>
Branch: llvm-translation-backend
Changeset: r81641:ded16e205ad2
Date: 2016-01-05 07:14 +0100
http://bitbucket.org/pypy/pypy/changeset/ded16e205ad2/
Log: Put gc_reload_possibly_moved transformation in its own method.
diff --git a/rpython/translator/llvm/genllvm.py b/rpython/translator/llvm/genllvm.py
--- a/rpython/translator/llvm/genllvm.py
+++ b/rpython/translator/llvm/genllvm.py
@@ -943,27 +943,7 @@
def write_graph(self, ptr_type, name, graph, export):
genllvm = database.genllvm
genllvm.gcpolicy.gctransformer.inline_helpers(graph)
- # the 'gc_reload_possibly_moved' operations make the graph not
- # really SSA. Fix them now.
- for block in graph.iterblocks():
- rename = {}
- for op in block.operations:
- if rename:
- op.args = [rename.get(v, v) for v in op.args]
- if op.opname == 'gc_reload_possibly_moved':
- v_newaddr, v_targetvar = op.args
- assert isinstance(v_targetvar.concretetype, lltype.Ptr)
- v_newptr = Variable()
- v_newptr.concretetype = v_targetvar.concretetype
- op.opname = 'cast_adr_to_ptr'
- op.args = [v_newaddr]
- op.result = v_newptr
- rename[v_targetvar] = v_newptr
- if rename:
- block.exitswitch = rename.get(block.exitswitch,
- block.exitswitch)
- for link in block.exits:
- link.args = [rename.get(v, v) for v in link.args]
+ self.transform_gc_reload_possibly_moved(graph)
remove_double_links(graph)
no_links_to_startblock(graph)
@@ -1008,6 +988,27 @@
self.w('unreachable')
self.w('}', '')
+ def transform_gc_reload_possibly_moved(self, graph):
+ for block in graph.iterblocks():
+ rename = {}
+ for op in block.operations:
+ if rename:
+ op.args = [rename.get(v, v) for v in op.args]
+ if op.opname == 'gc_reload_possibly_moved':
+ v_newaddr, v_targetvar = op.args
+ assert isinstance(v_targetvar.concretetype, lltype.Ptr)
+ v_newptr = Variable()
+ v_newptr.concretetype = v_targetvar.concretetype
+ op.opname = 'cast_adr_to_ptr'
+ op.args = [v_newaddr]
+ op.result = v_newptr
+ rename[v_targetvar] = v_newptr
+ if rename:
+ block.exitswitch = rename.get(block.exitswitch,
+ block.exitswitch)
+ for link in block.exits:
+ link.args = [rename.get(v, v) for v in link.args]
+
def write_phi_nodes(self, block):
for i, arg in enumerate(block.inputargs):
if (arg.concretetype == lltype.Void or
More information about the pypy-commit
mailing list