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