Commit e18d4a19 by Alexandre Oliva Committed by Alexandre Oliva

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
parent bbe37912
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
* final.c (alter_subreg): Don't call subreg_regno for a non-REG.
......
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
* gcc.c-torture/execute/loop-ivopts-2.c: New.
......
/* 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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment