OSDN Git Service

* tree-cfg.c (cleanup_control_flow): If removal of a computed
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Mar 2005 02:42:46 +0000 (02:42 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Mar 2005 02:42:46 +0000 (02:42 +0000)
        goto results in the removal of edges in the CFG, then we need
        to recompute dominators.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@96160 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-cfg.c

index 938d7e3..02bcdd2 100644 (file)
@@ -1,3 +1,9 @@
+2005-03-08  Jeff Law  <law@redhat.com>
+
+       * tree-cfg.c (cleanup_control_flow): If removal of a computed
+       goto results in the removal of edges in the CFG, then we need
+       to recompute dominators.
+
 2005-03-09  Ben Elliston  <bje@au.ibm.com>
 
        * c-common.c (c_do_switch_warnings): Comment fix.
index 7622bf7..be7ee56 100644 (file)
@@ -2148,6 +2148,7 @@ cleanup_control_flow (void)
          tree label;
          edge_iterator ei;
          basic_block target_block;
+         bool removed_edge = false;
 
          /* First look at all the outgoing edges.  Delete any outgoing
             edges which do not go to the right block.  For the one
@@ -2157,7 +2158,10 @@ cleanup_control_flow (void)
          for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
            {
              if (e->dest != target_block)
-               remove_edge (e);
+               {
+                 removed_edge = true;
+                 remove_edge (e);
+               }
              else
                {
                  /* Turn off the EDGE_ABNORMAL flag.  */
@@ -2169,6 +2173,11 @@ cleanup_control_flow (void)
                }
            }
 
+         /* If we removed one or more edges, then we will need to fix the
+            dominators.  It may be possible to incrementally update them.  */
+         if (removed_edge)
+           free_dominance_info (CDI_DOMINATORS);
+
          /* Remove the GOTO_EXPR as it is not needed.  The CFG has all the
             relevant information we need.  */
          bsi_remove (&bsi);