summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2006-02-09 02:18:59 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2006-02-09 02:18:59 +0000
commit39cdc6b4da09003cfc2f546f1802b9ef0311e836 (patch)
treea64f23c9c77ce31c8416c904d0b39f38e87380e2
parentfdcfb10d15004124c997452560fe5fe30c85618d (diff)
downloadppe42-gcc-39cdc6b4da09003cfc2f546f1802b9ef0311e836.tar.gz
ppe42-gcc-39cdc6b4da09003cfc2f546f1802b9ef0311e836.zip
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110784 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-ssa-dce.c45
2 files changed, 30 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 232da90df2e..5f7e20ca1e2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index 1b25f271ab9..c8a30a4024f 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -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)
- EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
- else
- EDGE_SUCC (bb, 0)->flags &= ~EDGE_FALLTHRU;
+ /* The lone outgoing edge from BB will be a fallthru edge. */
+ EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
/* Remove the remaining the outgoing edges. */
while (!single_succ_p (bb))
OpenPOWER on IntegriCloud