diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 11 |
2 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 938d7e3b436..02bcdd2fb7f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 7622bf77190..be7ee56bdb4 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -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); |