tree-ssa-dce.c (remove_dead_statement): When removing a dead control statement...

* tree-ssa-dce.c (remove_dead_statement): When removing a dead
        control statement, handle all three special cases in the same
        manner as they all have the same desired solution.  No longer
        special case edge flag updating when the post dominator is
        the exit block.

From-SVN: r110784
This commit is contained in:
Jeff Law 2006-02-08 19:18:59 -07:00 committed by Jeff Law
parent 1349c68851
commit 0a180c0ee8
2 changed files with 30 additions and 23 deletions

View file

@ -1,3 +1,11 @@
2006-02-08 Jeff Law <law@redhat.com>
* tree-ssa-dce.c (remove_dead_statement): When removing a dead
control statement, handle all three special cases in the same
manner as they all have the same desired solution. No longer
special case edge flag updating when the post dominator is
the exit block.
2006-02-08 Roger Sayle <roger@eyesopen.com>
* tree.def (CHAR_TYPE): Remove.

View file

@ -734,23 +734,27 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
gcc_assert (dom_computed[CDI_POST_DOMINATORS] == DOM_OK);
/* Get the immediate post dominator of bb. */
post_dom_bb = get_immediate_dominator (CDI_POST_DOMINATORS, bb);
/* Some blocks don't have an immediate post dominator. This can happen
for example with infinite loops. Removing an infinite loop is an
inappropriate transformation anyway... */
if (! post_dom_bb)
{
bsi_next (i);
return;
}
/* 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;
/* There are three particularly problematical cases.
1. Blocks that do not have an immediate post dominator. This
can happen with infinite loops.
2. Blocks that are only post dominated by the exit block. These
can also happen for infinite loops as we create fake edges
in the dominator tree.
3. If the post dominator has PHI nodes we may be able to compute
the right PHI args for them.
In each of these cases we must remove the control statement
as it may reference SSA_NAMEs which are going to be removed and
we remove all but one outgoing edge from the block. */
if (! post_dom_bb
|| post_dom_bb == EXIT_BLOCK_PTR
|| phi_nodes (post_dom_bb))
;
else
{
/* Redirect the first edge out of BB to reach POST_DOM_BB. */
@ -764,13 +768,8 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
not have TRUE/FALSE flags. */
EDGE_SUCC (bb, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
/* If the edge reaches any block other than the exit, then it is a
fallthru edge; if it reaches the exit, then it is not a fallthru
edge. */
if (post_dom_bb != EXIT_BLOCK_PTR)
/* The lone outgoing edge from BB will be a fallthru edge. */
EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
else
EDGE_SUCC (bb, 0)->flags &= ~EDGE_FALLTHRU;
/* Remove the remaining the outgoing edges. */
while (!single_succ_p (bb))