Commit 0a180c0e by Jeff Law Committed by Jeff Law

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
parent 1349c688
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> 2006-02-08 Roger Sayle <roger@eyesopen.com>
* tree.def (CHAR_TYPE): Remove. * tree.def (CHAR_TYPE): Remove.
......
...@@ -734,23 +734,27 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb) ...@@ -734,23 +734,27 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
gcc_assert (dom_computed[CDI_POST_DOMINATORS] == DOM_OK); gcc_assert (dom_computed[CDI_POST_DOMINATORS] == DOM_OK);
/* Get the immediate post dominator of bb. */ /* Get the immediate post dominator of bb. */
post_dom_bb = get_immediate_dominator (CDI_POST_DOMINATORS, 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 /* There are three particularly problematical cases.
to compute the right PHI args for them. Since the control
statement is unnecessary, all edges can be regarded as 1. Blocks that do not have an immediate post dominator. This
equivalent, but we have to get rid of the condition, since it can happen with infinite loops.
might reference a variable that was determined to be
unnecessary and thus removed. */ 2. Blocks that are only post dominated by the exit block. These
if (phi_nodes (post_dom_bb)) can also happen for infinite loops as we create fake edges
post_dom_bb = EDGE_SUCC (bb, 0)->dest; 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 else
{ {
/* Redirect the first edge out of BB to reach POST_DOM_BB. */ /* 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) ...@@ -764,13 +768,8 @@ remove_dead_stmt (block_stmt_iterator *i, basic_block bb)
not have TRUE/FALSE flags. */ not have TRUE/FALSE flags. */
EDGE_SUCC (bb, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE); 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 /* The lone outgoing edge from BB will be a fallthru edge. */
fallthru edge; if it reaches the exit, then it is not a fallthru EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
edge. */
if (post_dom_bb != EXIT_BLOCK_PTR)
EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
else
EDGE_SUCC (bb, 0)->flags &= ~EDGE_FALLTHRU;
/* Remove the remaining the outgoing edges. */ /* Remove the remaining the outgoing edges. */
while (!single_succ_p (bb)) while (!single_succ_p (bb))
......
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