mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-26 02:20:33 +08:00
re PR tree-optimization/61221 (ICE on valid code at -O1 and above on x86_64-linux-gnu)
2014-05-19 Richard Biener <rguenther@suse.de> PR tree-optimization/61221 * tree-ssa-pre.c (eliminate_dom_walker::before_dom_children): Do nothing for unreachable blocks. * tree-ssa-sccvn.c (cond_dom_walker::before_dom_children): Improve unreachability detection. * gcc.dg/torture/pr61221.c: New testcase. From-SVN: r210614
This commit is contained in:
parent
051351362b
commit
1d44def2c2
@ -1,3 +1,11 @@
|
||||
2014-05-19 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/61221
|
||||
* tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
|
||||
Do nothing for unreachable blocks.
|
||||
* tree-ssa-sccvn.c (cond_dom_walker::before_dom_children):
|
||||
Improve unreachability detection.
|
||||
|
||||
2014-05-19 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/61209
|
||||
|
@ -1,3 +1,8 @@
|
||||
2014-05-19 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/61221
|
||||
* gcc.dg/torture/pr61221.c: New testcase.
|
||||
|
||||
2014-05-19 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/61209
|
||||
|
32
gcc/testsuite/gcc.dg/torture/pr61221.c
Normal file
32
gcc/testsuite/gcc.dg/torture/pr61221.c
Normal file
@ -0,0 +1,32 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
void __assert_fail (void);
|
||||
|
||||
int **a, b, c, e, *j;
|
||||
short *d, **f;
|
||||
|
||||
int *
|
||||
foo ()
|
||||
{
|
||||
*a = j;
|
||||
if (!(1 & e))
|
||||
__assert_fail ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
bar ()
|
||||
{
|
||||
int *g = &b;
|
||||
short **h = &d;
|
||||
if ((f = &d) != h)
|
||||
for (; b;)
|
||||
{
|
||||
int i = 1;
|
||||
if (i)
|
||||
g = foo ();
|
||||
c = 0;
|
||||
}
|
||||
if (!g)
|
||||
__assert_fail ();
|
||||
}
|
@ -4010,6 +4010,15 @@ eliminate_dom_walker::before_dom_children (basic_block b)
|
||||
/* Mark new bb. */
|
||||
el_avail_stack.safe_push (NULL_TREE);
|
||||
|
||||
/* If this block is not reachable do nothing. */
|
||||
edge_iterator ei;
|
||||
edge e;
|
||||
FOR_EACH_EDGE (e, ei, b->preds)
|
||||
if (e->flags & EDGE_EXECUTABLE)
|
||||
break;
|
||||
if (!e)
|
||||
return;
|
||||
|
||||
for (gsi = gsi_start_phis (b); !gsi_end_p (gsi);)
|
||||
{
|
||||
gimple stmt, phi = gsi_stmt (gsi);
|
||||
|
@ -4177,11 +4177,13 @@ cond_dom_walker::before_dom_children (basic_block bb)
|
||||
if (fail)
|
||||
return;
|
||||
|
||||
/* If any of the predecessor edges are still marked as possibly
|
||||
executable consider this block reachable. */
|
||||
/* If any of the predecessor edges that do not come from blocks dominated
|
||||
by us are still marked as possibly executable consider this block
|
||||
reachable. */
|
||||
bool reachable = bb == ENTRY_BLOCK_PTR_FOR_FN (cfun);
|
||||
FOR_EACH_EDGE (e, ei, bb->preds)
|
||||
reachable |= (e->flags & EDGE_EXECUTABLE);
|
||||
if (!dominated_by_p (CDI_DOMINATORS, e->src, bb))
|
||||
reachable |= (e->flags & EDGE_EXECUTABLE);
|
||||
|
||||
/* If the block is not reachable all outgoing edges are not
|
||||
executable. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user