cfgloopmanip.c (copy_loop_info): New function.
authorJan Hubicka <jh@suse.cz>
Wed, 17 Oct 2012 19:50:16 +0000 (21:50 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 17 Oct 2012 19:50:16 +0000 (19:50 +0000)
* cfgloopmanip.c (copy_loop_info): New function.
(duplicate_loop): Use it.
(loop_version): Use it.
* loop-unswitch.c (unswitch_loop): Use it.
* cfgloop.h (copy_loop_info): Declare.

From-SVN: r192543

gcc/ChangeLog
gcc/cfgloop.h
gcc/cfgloopmanip.c
gcc/loop-unswitch.c

index 63635b8f0199ecce21657c1502b37ca624cd861a..b5cde0396e7caa26ba98b9b498254e656bad7f3f 100644 (file)
@@ -1,3 +1,11 @@
+2012-10-17  Jan Hubicka  <jh@suse.cz>
+
+       * cfgloopmanip.c (copy_loop_info): New function.
+       (duplicate_loop): Use it.
+       (loop_version): Use it.
+       * loop-unswitch.c (unswitch_loop): Use it.
+       * cfgloop.h (copy_loop_info): Declare.
+
 2012-10-17  Jan Hubicka  <jh@suse.cz>
 
        * tree-ssa-loop-ivcanon.c (tree_estimate_loop_size): Add edge_to_cancel
index 976606637817d1d0ce51c8f981992ad238019802..a48550445a37e3cf4665e907adeecd4fd00f0814 100644 (file)
@@ -310,6 +310,7 @@ extern edge create_empty_if_region_on_edge (edge, tree);
 extern struct loop *create_empty_loop_on_edge (edge, tree, tree, tree, tree,
                                               tree *, tree *, struct loop *);
 extern struct loop * duplicate_loop (struct loop *, struct loop *);
+extern void copy_loop_info (struct loop *loop, struct loop *target);
 extern void duplicate_subloops (struct loop *, struct loop *);
 extern bool duplicate_loop_to_header_edge (struct loop *, edge,
                                           unsigned, sbitmap, edge,
index 98f359e086cf778a9d37a160dbbe31a12d317130..97a90bbff1d400f03cd047528c38ebc89074ccc1 100644 (file)
@@ -970,6 +970,20 @@ fix_loop_placements (struct loop *loop, bool *irred_invalidated)
     }
 }
 
+/* Duplicate loop bounds and other information we store about
+   the loop into its duplicate.  */
+
+void
+copy_loop_info (struct loop *loop, struct loop *target)
+{
+  gcc_checking_assert (!target->any_upper_bound && !target->any_estimate);
+  target->any_upper_bound = loop->any_upper_bound;
+  target->nb_iterations_upper_bound = loop->nb_iterations_upper_bound;
+  target->any_estimate = loop->any_estimate;
+  target->nb_iterations_estimate = loop->nb_iterations_estimate;
+  target->estimate_state = loop->estimate_state;
+}
+
 /* Copies copy of LOOP as subloop of TARGET loop, placing newly
    created loop into loops structure.  */
 struct loop *
@@ -978,6 +992,8 @@ duplicate_loop (struct loop *loop, struct loop *target)
   struct loop *cloop;
   cloop = alloc_loop ();
   place_new_loop (cloop);
+  copy_loop_info (loop, cloop);
 
   /* Mark the new loop as copy of LOOP.  */
   set_loop_copy (loop, cloop);
@@ -1686,6 +1702,8 @@ loop_version (struct loop *loop,
                   false /* Do not redirect all edges.  */,
                   then_scale, else_scale);
 
+  copy_loop_info (loop, nloop);
+
   /* loopify redirected latch_edge. Update its PENDING_STMTS.  */
   lv_flush_pending_stmts (latch_edge);
 
index 4107048de0192305e1dc3fec71bdd22f9108ce66..25d77dab22fda8455b92646c91edb02a4af7113c 100644 (file)
@@ -454,6 +454,7 @@ unswitch_loop (struct loop *loop, basic_block unswitch_on, rtx cond, rtx cinsn)
                   BRANCH_EDGE (switch_bb), FALLTHRU_EDGE (switch_bb), true,
                   prob, REG_BR_PROB_BASE - prob);
 
+  copy_loop_info (loop, nloop);
   /* Remove branches that are now unreachable in new loops.  */
   remove_path (true_edge);
   remove_path (false_edge);