Author: Armin Rigo <[email protected]>
Branch: shadowstack-perf-2
Changeset: r84456:cc83118e5d56
Date: 2016-05-15 12:41 +0200
http://bitbucket.org/pypy/pypy/changeset/cc83118e5d56/

Log:    Renames, step 2

diff --git a/rpython/memory/gctransform/shadowcolor.py 
b/rpython/memory/gctransform/shadowcolor.py
--- a/rpython/memory/gctransform/shadowcolor.py
+++ b/rpython/memory/gctransform/shadowcolor.py
@@ -253,7 +253,6 @@
                         if w2 in succ:
                             continue
                         succ.add(w2)
-                        # XXX renaming
                         for op2 in block2.operations:
                             if op2.opname in ('gc_save_root', 'gc_pop_roots'):
                                 break
@@ -264,8 +263,7 @@
 
         G = defaultdict(set)
         for block in graph.iterblocks():
-            for op in block.operations:
-                # XXX handle renames
+            for opindex, op in enumerate(block.operations):
                 if op.opname == 'gc_save_root' and op.args[0].value == index:
                     break
             else:
@@ -273,21 +271,29 @@
 
             key = (block, op)
             pred = set()
-            pending_pred = [(block, op.args[1])]
+            pending_pred = [(block, op.args[1], opindex)]
             while pending_pred:
-                block1, v1 = pending_pred.pop()
-                if v1 not in block1.inputargs:
-                    # XXX handle renames
-                    pass
+                block1, v1, opindex1 = pending_pred.pop()
+                for i in range(opindex1-1, -1, -1):
+                    op1 = block1.operations[i]
+                    if op1.opname == 'gc_pop_roots':
+                        break    # stop
+                    if op1.result is v1:
+                        if not is_trivial_rewrite(op1):
+                            break   # stop
+                        v1 = op1.args[0]
                 else:
+                    varindex = block1.inputargs.index(v1)
+                    if v1 in pred:
+                        continue    # already done
                     pred.add(v1)
-                    varindex = block1.inputargs.index(v1)
                     for link1 in entrymap[block1]:
                         prevblock1 = link1.prevblock
                         if prevblock1 is not None:
                             w1 = link1.args[varindex]
                             if w1 not in pred:
-                                pending_pred.append((prevblock1, w1))
+                                pending_pred.append((prevblock1, w1,
+                                                len(prevblock1.operations)))
             U.union_list(list(pred))
             for v1 in pred:
                 G[v1].add(key)
diff --git a/rpython/memory/gctransform/test/test_shadowcolor.py 
b/rpython/memory/gctransform/test/test_shadowcolor.py
--- a/rpython/memory/gctransform/test/test_shadowcolor.py
+++ b/rpython/memory/gctransform/test/test_shadowcolor.py
@@ -415,3 +415,32 @@
         'int_sub': 1,
         'direct_call': 2,
         }
+
+def test_move_pushes_earlier_rename_2():
+    def g(a):
+        pass
+    def f(a, b):
+        llop.gc_push_roots(lltype.Void, b)
+        g(a)
+        llop.gc_pop_roots(lltype.Void, b)
+        while a > 10:
+            a -= 2
+        c = lltype.cast_opaque_ptr(PSTRUCT, b)
+        llop.gc_push_roots(lltype.Void, c)
+        g(a)
+        llop.gc_pop_roots(lltype.Void, c)
+        return c
+
+    graph = make_graph(f, [int, llmemory.GCREF])
+    regalloc = allocate_registers(graph)
+    expand_push_roots(graph, regalloc)
+    move_pushes_earlier(graph, regalloc)
+    expand_pop_roots(graph, regalloc)
+    assert graphmodel.summary(graph) == {
+        'gc_save_root': 1,
+        'gc_restore_root': 2,
+        'cast_opaque_ptr': 1,
+        'int_gt': 1,
+        'int_sub': 1,
+        'direct_call': 2,
+        }
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to