aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2006-11-12 19:20:03 +0100
committerZdenek Dvorak <rakdver@gcc.gnu.org>2006-11-12 18:20:03 +0000
commitc0493b13fb859a27d5554c18ff11db2c1ebb7241 (patch)
tree8d48fdb7d07dc37f4d2f16a51dc3192fbda851c1
parent8a492e2cbfd97bce61c007d99fa459af68e038d2 (diff)
downloadgcc-c0493b13fb859a27d5554c18ff11db2c1ebb7241.zip
gcc-c0493b13fb859a27d5554c18ff11db2c1ebb7241.tar.gz
gcc-c0493b13fb859a27d5554c18ff11db2c1ebb7241.tar.bz2
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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cfgloopmanip.c43
-rw-r--r--gcc/tree-ssa-loop-manip.c2
3 files changed, 54 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1b41084..081c6cf 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 1ef6514..8c5a0f1 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 0b29c5e..dde0e8d 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
}