cfgloopmanip.c (update_single_exit_for_duplicated_loop, [...]): New functions.
authorZdenek Dvorak <dvorakz@suse.cz>
Sun, 12 Nov 2006 18:20:03 +0000 (19:20 +0100)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Sun, 12 Nov 2006 18:20:03 +0000 (18:20 +0000)
* 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
gcc/cfgloopmanip.c
gcc/tree-ssa-loop-manip.c

index 1b410840d406571ec7f391b6ce19f4aa02c74c43..081c6cfde3a2462f6d3ea4b6c1f667d9308d2938 100644 (file)
@@ -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.
index 1ef65143d442fe3c8316b95954c633438e0e47c8..8c5a0f14a58c0b32dd8fa6cb5504720ed5302956 100644 (file)
@@ -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++)
          {
index 0b29c5ee8b48012a71e5573d8f687864f563871e..dde0e8d2a09fc307a380505f76c866bebeaa0fd5 100644 (file)
@@ -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
 }