From: Zdenek Dvorak Date: Thu, 29 Jul 2004 17:47:31 +0000 (+0200) Subject: cfgloop.c (update_latch_info): Update dominator of the new block. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e7bd94ccb8ab37c75b42a735cbd99a05f5f3e890;p=gcc.git cfgloop.c (update_latch_info): Update dominator of the new block. * cfgloop.c (update_latch_info): Update dominator of the new block. (canonicalize_loop_headers, flow_loops_find): Do not free dominance info. * dominance.c (verify_dominators): Check that the dominance tree is connected. (recount_dominator): Ignore unreachable blocks. (iterate_fix_dominators): Cleanup old dominance information before recomputing it. From-SVN: r85307 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1d178751163..c66a8d0ab87 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2004-07-29 Zdenek Dvorak + + * cfgloop.c (update_latch_info): Update dominator of the new block. + (canonicalize_loop_headers, flow_loops_find): Do not free dominance + info. + * dominance.c (verify_dominators): Check that the dominance tree is + connected. + (recount_dominator): Ignore unreachable blocks. + (iterate_fix_dominators): Cleanup old dominance information before + recomputing it. + 2004-07-29 Diego Novillo * tree-ssa-operands.c (get_expr_operands): Revert changes diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c index 50f31e67e23..58d9dd08dba 100644 --- a/gcc/cfgloop.c +++ b/gcc/cfgloop.c @@ -575,6 +575,7 @@ update_latch_info (basic_block jump) HEADER_BLOCK (jump) = 0; alloc_aux_for_edge (jump->pred, sizeof (int)); LATCH_EDGE (jump->pred) = 0; + set_immediate_dominator (CDI_DOMINATORS, jump, jump->pred->src); } /* A callback for make_forwarder block, to redirect all edges except for @@ -606,9 +607,6 @@ canonicalize_loop_headers (void) basic_block header; edge e; - /* Compute the dominators. */ - calculate_dominance_info (CDI_DOMINATORS); - alloc_aux_for_blocks (sizeof (int)); alloc_aux_for_edges (sizeof (int)); @@ -638,8 +636,6 @@ canonicalize_loop_headers (void) HEADER_BLOCK (header) = num_latches; } - free_dominance_info (CDI_DOMINATORS); - if (HEADER_BLOCK (ENTRY_BLOCK_PTR->succ->dest)) { basic_block bb; @@ -711,6 +707,10 @@ canonicalize_loop_headers (void) free_aux_for_blocks (); free_aux_for_edges (); + +#ifdef ENABLE_CHECKING + verify_dominators (CDI_DOMINATORS); +#endif } /* Find all the natural loops in the function and save in LOOPS structure and @@ -747,12 +747,12 @@ flow_loops_find (struct loops *loops, int flags) dfs_order = NULL; rc_order = NULL; + /* Ensure that the dominators are computed. */ + calculate_dominance_info (CDI_DOMINATORS); + /* Join loops with shared headers. */ canonicalize_loop_headers (); - /* Compute the dominators. */ - calculate_dominance_info (CDI_DOMINATORS); - /* Count the number of loop headers. This should be the same as the number of natural loops. */ headers = sbitmap_alloc (last_basic_block); @@ -880,10 +880,6 @@ flow_loops_find (struct loops *loops, int flags) loops->num = num_loops; } - else - { - free_dominance_info (CDI_DOMINATORS); - } sbitmap_free (headers); diff --git a/gcc/dominance.c b/gcc/dominance.c index 156fc98b6e0..d46d8f56ecd 100644 --- a/gcc/dominance.c +++ b/gcc/dominance.c @@ -824,6 +824,20 @@ verify_dominators (enum cdi_direction dir) err = 1; } } + + if (dir == CDI_DOMINATORS + && dom_computed[dir] >= DOM_NO_FAST_QUERY) + { + FOR_EACH_BB (bb) + { + if (!dominated_by_p (dir, bb, ENTRY_BLOCK_PTR)) + { + error ("ENTRY does not dominate bb %d", bb->index); + err = 1; + } + } + } + if (err) abort (); } @@ -846,6 +860,11 @@ recount_dominator (enum cdi_direction dir, basic_block bb) { for (e = bb->pred; e; e = e->pred_next) { + /* Ignore the predecessors that either are not reachable from + the entry block, or whose dominator was not determined yet. */ + if (!dominated_by_p (dir, e->src, ENTRY_BLOCK_PTR)) + continue; + if (!dominated_by_p (dir, e->src, bb)) dom_bb = nearest_common_dominator (dir, dom_bb, e->src); } @@ -873,6 +892,9 @@ iterate_fix_dominators (enum cdi_direction dir, basic_block *bbs, int n) if (!dom_computed[dir]) abort (); + for (i = 0; i < n; i++) + set_immediate_dominator (dir, bbs[i], NULL); + while (changed) { changed = 0; @@ -887,6 +909,10 @@ iterate_fix_dominators (enum cdi_direction dir, basic_block *bbs, int n) } } } + + for (i = 0; i < n; i++) + if (!get_immediate_dominator (dir, bbs[i])) + abort (); } void