diff options
author | Richard Biener <rguenther@suse.de> | 2014-11-10 14:31:31 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-11-10 14:31:31 +0000 |
commit | 6be4c4ece59c3ee69e38acf065d2b760587f6eb0 (patch) | |
tree | 20f32df32a4f47a07217a74ff76fa1b250698b0e /gcc/tree-ssa-pre.c | |
parent | 3090fa556b469453c5dcddf6617443d26365d9d0 (diff) | |
download | gcc-6be4c4ece59c3ee69e38acf065d2b760587f6eb0.zip gcc-6be4c4ece59c3ee69e38acf065d2b760587f6eb0.tar.gz gcc-6be4c4ece59c3ee69e38acf065d2b760587f6eb0.tar.bz2 |
re PR tree-optimization/63800 (ICE on valid code at -O3 on x86_64-linux-gnu)
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.
From-SVN: r217288
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 776dacf..ea99198 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. */ |