mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-22 15:11:15 +08:00
re PR tree-optimization/20640 (ICE on NULL PHI_ARG_DEF)
gcc/ChangeLog: PR tree-optimization/20640 * tree-ssa-dce.c (remove_dead_stmt): Don't redirect edge to post-dominator if it has phi nodes. (eliminate_unnecessary_stmts): Remove dead phis in all blocks before dead statements. gcc/testsuite/ChangeLog: PR tree-optimization/20640 * gcc.dg/torture/tree-loop-1.c: New. From-SVN: r97446
This commit is contained in:
parent
bbe3791247
commit
e18d4a1904
@ -1,3 +1,11 @@
|
||||
2005-04-02 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR tree-optimization/20640
|
||||
* tree-ssa-dce.c (remove_dead_stmt): Don't redirect edge to
|
||||
post-dominator if it has phi nodes.
|
||||
(eliminate_unnecessary_stmts): Remove dead phis in all blocks
|
||||
before dead statements.
|
||||
|
||||
2005-04-02 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR middle-end/20491
|
||||
|
@ -1,3 +1,8 @@
|
||||
2005-04-02 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR tree-optimization/20640
|
||||
* gcc.dg/torture/tree-loop-1.c: New.
|
||||
|
||||
2005-04-02 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR rtl-optimization/20290
|
||||
|
21
gcc/testsuite/gcc.dg/torture/tree-loop-1.c
Normal file
21
gcc/testsuite/gcc.dg/torture/tree-loop-1.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* PR tree-optimization/20640 */
|
||||
|
||||
/* After unrolling the loop, we'd turn some conditional branches into
|
||||
unconditional ones, but branch redirection would fail to compute
|
||||
the PHI args for the PHI nodes in the replacement edge
|
||||
destination, so they'd remain NULL causing crashes later on. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
|
||||
static int a = 0;
|
||||
extern int foo (void);
|
||||
extern int *bar (void) __attribute__ ((__const__));
|
||||
|
||||
void
|
||||
test (int x)
|
||||
{
|
||||
int b = 10;
|
||||
while (foo () == -1 && *bar () == 4 && b > 0)
|
||||
--b;
|
||||
a = x;
|
||||
}
|
@ -637,7 +637,10 @@ eliminate_unnecessary_stmts (void)
|
||||
{
|
||||
/* Remove dead PHI nodes. */
|
||||
remove_dead_phis (bb);
|
||||
}
|
||||
|
||||
FOR_EACH_BB (bb)
|
||||
{
|
||||
/* Remove dead statements. */
|
||||
for (i = bsi_start (bb); ! bsi_end_p (i) ; )
|
||||
{
|
||||
@ -724,6 +727,7 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
|
||||
if (is_ctrl_stmt (t))
|
||||
{
|
||||
basic_block post_dom_bb;
|
||||
|
||||
/* The post dominance info has to be up-to-date. */
|
||||
gcc_assert (dom_computed[CDI_POST_DOMINATORS] == DOM_OK);
|
||||
/* Get the immediate post dominator of bb. */
|
||||
@ -737,9 +741,20 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Redirect the first edge out of BB to reach POST_DOM_BB. */
|
||||
redirect_edge_and_branch (EDGE_SUCC (bb, 0), post_dom_bb);
|
||||
PENDING_STMT (EDGE_SUCC (bb, 0)) = NULL;
|
||||
/* If the post dominator block has PHI nodes, we might be unable
|
||||
to compute the right PHI args for them. Since the control
|
||||
statement is unnecessary, all edges can be regarded as
|
||||
equivalent, but we have to get rid of the condition, since it
|
||||
might reference a variable that was determined to be
|
||||
unnecessary and thus removed. */
|
||||
if (phi_nodes (post_dom_bb))
|
||||
post_dom_bb = EDGE_SUCC (bb, 0)->dest;
|
||||
else
|
||||
{
|
||||
/* Redirect the first edge out of BB to reach POST_DOM_BB. */
|
||||
redirect_edge_and_branch (EDGE_SUCC (bb, 0), post_dom_bb);
|
||||
PENDING_STMT (EDGE_SUCC (bb, 0)) = NULL;
|
||||
}
|
||||
EDGE_SUCC (bb, 0)->probability = REG_BR_PROB_BASE;
|
||||
EDGE_SUCC (bb, 0)->count = bb->count;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user