summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-10 14:31:31 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-10 14:31:31 +0000
commit42dd613317e881cfb529657ba821105d172dc768 (patch)
tree20f32df32a4f47a07217a74ff76fa1b250698b0e /gcc/tree-ssa-pre.c
parentec4d2c3d71e53c1a84c520b4761c9df6a52ab73b (diff)
downloadgcc-42dd613317e881cfb529657ba821105d172dc768.tar.gz
2014-11-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/63800 * tree-ssa-pre.c (eliminate_push_avail): Push in a way so we can restore the previous availability in after_dom_children. (eliminate_dom_walker::after_dom_children): Restore previous availability. * gcc.dg/torture/pr63800.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217288 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r--gcc/tree-ssa-pre.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 776dacf206b..ea991989267 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -3906,8 +3906,11 @@ eliminate_push_avail (tree op)
{
if (el_avail.length () <= SSA_NAME_VERSION (valnum))
el_avail.safe_grow_cleared (SSA_NAME_VERSION (valnum) + 1);
+ tree pushop = op;
+ if (el_avail[SSA_NAME_VERSION (valnum)])
+ pushop = el_avail[SSA_NAME_VERSION (valnum)];
+ el_avail_stack.safe_push (pushop);
el_avail[SSA_NAME_VERSION (valnum)] = op;
- el_avail_stack.safe_push (op);
}
}
@@ -4451,7 +4454,14 @@ eliminate_dom_walker::after_dom_children (basic_block)
{
tree entry;
while ((entry = el_avail_stack.pop ()) != NULL_TREE)
- el_avail[SSA_NAME_VERSION (VN_INFO (entry)->valnum)] = NULL_TREE;
+ {
+ tree valnum = VN_INFO (entry)->valnum;
+ tree old = el_avail[SSA_NAME_VERSION (valnum)];
+ if (old == entry)
+ el_avail[SSA_NAME_VERSION (valnum)] = NULL_TREE;
+ else
+ el_avail[SSA_NAME_VERSION (valnum)] = entry;
+ }
}
/* Eliminate fully redundant computations. */