tree-ssa-dce.c (remove_dead_statement): When removing a dead control statement...
authorJeff Law <law@redhat.com>
Thu, 9 Feb 2006 02:18:59 +0000 (19:18 -0700)
committerJeff Law <law@gcc.gnu.org>
Thu, 9 Feb 2006 02:18:59 +0000 (19:18 -0700)
        * 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

gcc/ChangeLog
gcc/tree-ssa-dce.c

index 232da90df2e01de20887a65d83c7dc965ea82edc..5f7e20ca1e28cedda9bae99d1148074fcbc5aa87 100644 (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.
index 1b25f271ab94e3e99571677715b272c387b5647f..c8a30a4024fb1f0b17753424537def826702aa46 100644 (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)
-       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))