Author: Armin Rigo <[email protected]>
Branch: shadowstack-perf-2
Changeset: r84509:603170ddcaf7
Date: 2016-05-17 18:45 +0100
http://bitbucket.org/pypy/pypy/changeset/603170ddcaf7/
Log: Complicated test case that I didn't manage to reduce... The issue is
that we should only follow along one regalloc-designed color, and
not follow blindly changes of color
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
@@ -240,7 +240,7 @@
else:
continue # no gc_pop_roots in this block
for v in op.args:
- if isinstance(v, Variable) and regalloc.getcolor(v) == index:
+ if isinstance(v, Variable) and regalloc.checkcolor(v, index):
break
else:
continue # no variable goes into index i
@@ -249,16 +249,18 @@
pending_succ = [(block, v)]
while pending_succ:
block1, v1 = pending_succ.pop()
+ assert regalloc.checkcolor(v1, index)
for op1 in block1.operations:
if is_trivial_rewrite(op1) and op1.args[0] is v1:
- pending_succ.append((block1, op1.result))
+ if regalloc.checkcolor(op1.result, index):
+ 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:
+ if w2 in succ or not regalloc.checkcolor(w2, index):
continue
succ.add(w2)
for op2 in block2.operations:
@@ -288,6 +290,7 @@
pending_pred = [(block, op.args[1], opindex)]
while pending_pred:
block1, v1, opindex1 = pending_pred.pop()
+ assert regalloc.getcolor(v1) == index
for i in range(opindex1-1, -1, -1):
op1 = block1.operations[i]
if op1.opname == 'gc_pop_roots':
@@ -295,6 +298,8 @@
if op1.result is v1:
if not is_trivial_rewrite(op1):
break # stop
+ if not regalloc.checkcolor(op1.args[0], index):
+ break # stop
v1 = op1.args[0]
else:
varindex = block1.inputargs.index(v1)
@@ -306,7 +311,8 @@
if prevblock1 is not None:
w1 = link1.args[varindex]
if isinstance(w1, Variable) and w1 not in pred:
- pending_pred.append((prevblock1, w1,
+ if regalloc.checkcolor(w1, index):
+ pending_pred.append((prevblock1, w1,
len(prevblock1.operations)))
U.union_list(list(pred))
for v1 in pred:
@@ -337,6 +343,7 @@
return float(len(P)) / len(gcsaveroots)
Plist.sort(key=heuristic)
+ variables_along_changes = {}
live_at_start_of_block = set() # set of (block, index)
insert_gc_push_root = defaultdict(list)
@@ -347,6 +354,9 @@
continue
if any(op not in block.operations for block, op in gcsaveroots):
continue
+ for v in P:
+ assert regalloc.getcolor(v) == index
+ assert v not in variables_along_changes
success_count = 0
mark = []
@@ -372,7 +382,8 @@
mark.append((index, link, varindex))
break
if op.result is w:
- if is_trivial_rewrite(op):
+ if is_trivial_rewrite(op) and (
+ regalloc.checkcolor(op.args[0], index)):
w = op.args[0]
else:
mark.append((index, link, varindex))
@@ -387,14 +398,15 @@
newops.remove(op)
block.operations = newops
for index, link, varindex in mark:
- insert_gc_push_root[link].append((index, varindex))
+ insert_gc_push_root[link].append((index, link.args[varindex]))
for v in P:
block, varindex = inputvars[v]
+ variables_along_changes[v] = block, index
live_at_start_of_block.add((block, index))
for link in insert_gc_push_root:
- newops = [_gc_save_root(index, link.args[varindex])
- for index, varindex in sorted(insert_gc_push_root[link])]
+ newops = [_gc_save_root(index, v)
+ for index, v in sorted(insert_gc_push_root[link])]
insert_empty_block(link, newops=newops)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit