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