[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