From b0c32a738700b8d010d97cda9d6be3334b7d05a5 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 8 Mar 2005 19:42:46 -0700 Subject: [PATCH] tree-cfg.c (cleanup_control_flow): If removal of a computed goto results in the removal of edges in the CFG... * 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. From-SVN: r96160 --- gcc/ChangeLog | 6 ++++++ gcc/tree-cfg.c | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 938d7e3b436e..02bcdd2fb7f0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-03-08 Jeff Law + + * 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 * c-common.c (c_do_switch_warnings): Comment fix. diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 7622bf77190c..be7ee56bdb49 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);