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

Log:    Renames, step 1

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
@@ -227,7 +227,6 @@
         S = set()
         for block in graph.iterblocks():
             for op in reversed(block.operations):
-                # XXX handle renames
                 if op.opname == 'gc_pop_roots':
                     break
             else:
@@ -239,11 +238,16 @@
                 continue   # no variable goes into index i
 
             succ = set()
-            pending_succ = [(link1, v) for link1 in block.exits]
+            pending_succ = [(block, v)]
             while pending_succ:
-                link1, v1 = pending_succ.pop()
-                for i2, v2 in enumerate(link1.args):
-                    if v2 is v1:
+                block1, v1 = pending_succ.pop()
+                for op1 in block1.operations:
+                    if is_trivial_rewrite(op1) and op1.args[0] is v1:
+                        pending_succ.append((block1, op1.result))
+                for link1 in block1.exits:
+                    for i2, v2 in enumerate(link1.args):
+                        if v2 is not v1:
+                            continue
                         block2 = link1.target
                         w2 = block2.inputargs[i2]
                         if w2 in succ:
@@ -254,8 +258,7 @@
                             if op2.opname in ('gc_save_root', 'gc_pop_roots'):
                                 break
                         else:
-                            for link2 in block2.exits:
-                                pending_succ.append((link2, w2))
+                            pending_succ.append((block2, w2))
             U.union_list(list(succ))
             S.update(succ)
 
@@ -322,23 +325,21 @@
             block, varindex = inputvars[v]
             for link in entrymap[block]:
                 w = link.args[varindex]
-                maybe_found = True   # unless proven false
-                try:
-                    if regalloc.getcolor(w) != i:
-                        maybe_found = False
-                except KeyError:
-                    maybe_found = False
+                maybe_found = regalloc.checkcolor(w, i)  # unless proven false
                 if link.prevblock is None:
                     maybe_found = False
                 if maybe_found:
+                    search = set([w])
                     for op in reversed(link.prevblock.operations):
-                        # XXX handle renames
                         if op.opname == 'gc_pop_roots':
-                            if w in op.args:
+                            if search.intersection(op.args):
                                 success = True
                             else:
                                 maybe_found = False
                             break
+                        if (is_trivial_rewrite(op) and op.result in search
+                                and regalloc.checkcolor(op.args[0], i)):
+                            search.add(op.args[0])
                     else:
                         maybe_found = False
                 if not maybe_found:
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
@@ -384,3 +384,34 @@
         'gc_restore_root': 2,
         'direct_call': 2,
         }
+
+PSTRUCT = lltype.Ptr(lltype.GcStruct('S'))
+
+def test_move_pushes_earlier_rename_1():
+    def g(a):
+        pass
+    def f(a, b):
+        llop.gc_push_roots(lltype.Void, b)
+        g(a)
+        llop.gc_pop_roots(lltype.Void, b)
+        c = lltype.cast_opaque_ptr(PSTRUCT, b)
+        while a > 10:
+            a -= 2
+        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,
+        }
diff --git a/rpython/tool/algo/regalloc.py b/rpython/tool/algo/regalloc.py
--- a/rpython/tool/algo/regalloc.py
+++ b/rpython/tool/algo/regalloc.py
@@ -127,6 +127,12 @@
     def getcolor(self, v):
         return self._coloring[self._unionfind.find_rep(v)]
 
+    def checkcolor(self, v, color):
+        try:
+            return self.getcolor(v) == color
+        except KeyError:
+            return False
+
     def swapcolors(self, col1, col2):
         for key, value in self._coloring.items():
             if value == col1:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to