From c0493b13fb859a27d5554c18ff11db2c1ebb7241 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Sun, 12 Nov 2006 19:20:03 +0100 Subject: [PATCH] cfgloopmanip.c (update_single_exit_for_duplicated_loop, [...]): New functions. * 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. From-SVN: r118726 --- gcc/ChangeLog | 9 ++++++++ gcc/cfgloopmanip.c | 43 +++++++++++++++++++++++++++++++++++++++ gcc/tree-ssa-loop-manip.c | 2 ++ 3 files changed, 54 insertions(+) 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 + + * 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 * 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 }