* cfgloopmanip.c (update_single_exit_for_duplicated_loop,
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 12 Nov 2006 18:20:03 +0000 (18:20 +0000)
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 12 Nov 2006 18:20:03 +0000 (18:20 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118726 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgloopmanip.c
gcc/tree-ssa-loop-manip.c

index 1b41084..081c6cf 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 1ef6514..8c5a0f1 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 0b29c5e..dde0e8d 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
 }