diff options
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cfgloopmanip.c | 43 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-manip.c | 2 |
3 files changed, 54 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1b410840d40..081c6cfde3a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2006-11-12 Zdenek Dvorak <dvorakz@suse.cz> + + * cfgloopmanip.c (update_single_exit_for_duplicated_loop, + update_single_exit_for_duplicated_loops): New functions. + (duplicate_loop_to_header_edge): Use + update_single_exit_for_duplicated_loops. + * tree-ssa-loop-manip.c (tree_unroll_loop): Call verification + functions only with ENABLE_CHECKING. + 2006-11-12 Andreas Schwab <schwab@suse.de> * except.c (sjlj_emit_function_enter): Remove unused variable. diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 1ef65143d44..8c5a0f14a58 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -770,6 +770,40 @@ update_single_exits_after_duplication (basic_block *bbs, unsigned nbbs, bbs[i]->flags &= ~BB_DUPLICATED; } +/* Updates single exit information for the copy of LOOP. */ + +static void +update_single_exit_for_duplicated_loop (struct loop *loop) +{ + struct loop *copy = loop->copy; + basic_block src, dest; + edge exit = loop->single_exit; + + if (!exit) + return; + + src = get_bb_copy (exit->src); + dest = exit->dest; + if (dest->flags & BB_DUPLICATED) + dest = get_bb_copy (dest); + + exit = find_edge (src, dest); + gcc_assert (exit != NULL); + copy->single_exit = exit; +} + +/* Updates single exit information for copies of ORIG_LOOPS and their subloops. + N is the number of the loops in the ORIG_LOOPS array. */ + +static void +update_single_exit_for_duplicated_loops (struct loop *orig_loops[], unsigned n) +{ + unsigned i; + + for (i = 0; i < n; i++) + update_single_exit_for_duplicated_loop (orig_loops[i]); +} + /* Duplicates body of LOOP to given edge E NDUPL times. Takes care of updating LOOPS structure and dominators. E's destination must be LOOP header for this to work, i.e. it must be entry or latch edge of this loop; these are @@ -950,6 +984,15 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops, place_after); place_after = new_spec_edges[SE_LATCH]->src; + if (loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS) + { + for (i = 0; i < n; i++) + bbs[i]->flags |= BB_DUPLICATED; + update_single_exit_for_duplicated_loops (orig_loops, n_orig_loops); + for (i = 0; i < n; i++) + bbs[i]->flags &= ~BB_DUPLICATED; + } + if (flags & DLTHE_RECORD_COPY_NUMBER) for (i = 0; i < n; i++) { diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c index 0b29c5ee8b4..dde0e8d2a09 100644 --- a/gcc/tree-ssa-loop-manip.c +++ b/gcc/tree-ssa-loop-manip.c @@ -940,8 +940,10 @@ tree_unroll_loop (struct loops *loops, struct loop *loop, unsigned factor, tree_block_label (rest)); bsi_insert_after (&bsi, exit_if, BSI_NEW_STMT); +#ifdef ENABLE_CHECKING verify_flow_info (); verify_dominators (CDI_DOMINATORS); verify_loop_structure (loops); verify_loop_closed_ssa (); +#endif } |