]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
loop-unswitch.c (unswitch_loop): Update arguments of duplicate_loop_to_header_edge...
authorZdenek Dvorak <dvorakz@suse.cz>
Wed, 20 Dec 2006 14:15:53 +0000 (15:15 +0100)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Wed, 20 Dec 2006 14:15:53 +0000 (14:15 +0000)
* loop-unswitch.c (unswitch_loop): Update arguments of
duplicate_loop_to_header_edge call.
* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Ditto.
* loop-unroll.c (peel_loop_completely, unroll_loop_constant_iterations,
unroll_loop_runtime_iterations, peel_loop_simple, unroll_loop_stupid):
Ditto.
* cfgloopmanip.c (loop_version): Ditto.
(duplicate_loop_to_header_edge): Change
type of to_remove to VEC(edge), remove n_to_remove argument.
* tree-ssa-loop-manip.c (tree_duplicate_loop_to_header_edge):
Change type of to_remove to VEC(edge), remove n_to_remove argument.
(tree_unroll_loop): Update arguments of
tree_duplicate_loop_to_header_edge call.
* cfghooks.c (cfg_hook_duplicate_loop_to_header_edge):
Change type of to_remove to VEC(edge), remove n_to_remove argument.
* cfghooks.h (struct cfg_hooks): Type of
cfg_hook_duplicate_loop_to_header_edge changed.
(cfg_hook_duplicate_loop_to_header_edge): Declaration changed.
* cfgloop.h (duplicate_loop_to_header_edge): Ditto.
* tree-flow.h (tree_duplicate_loop_to_header_edge): Ditto.

From-SVN: r120074

gcc/ChangeLog
gcc/cfghooks.c
gcc/cfghooks.h
gcc/cfgloop.h
gcc/cfgloopmanip.c
gcc/loop-unroll.c
gcc/loop-unswitch.c
gcc/tree-flow.h
gcc/tree-ssa-loop-ivcanon.c
gcc/tree-ssa-loop-manip.c

index 611093f2b74e48154cedcbae5b9da93343f92728..f991a4d066d09078c13f633d206b3c48df2073ca 100644 (file)
@@ -1,3 +1,26 @@
+2006-12-20  Zdenek Dvorak <dvorakz@suse.cz>
+
+       * loop-unswitch.c (unswitch_loop): Update arguments of
+       duplicate_loop_to_header_edge call.
+       * tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Ditto.
+       * loop-unroll.c (peel_loop_completely, unroll_loop_constant_iterations,
+       unroll_loop_runtime_iterations, peel_loop_simple, unroll_loop_stupid):
+       Ditto.
+       * cfgloopmanip.c (loop_version): Ditto.
+       (duplicate_loop_to_header_edge): Change
+       type of to_remove to VEC(edge), remove n_to_remove argument.
+       * tree-ssa-loop-manip.c (tree_duplicate_loop_to_header_edge):
+       Change type of to_remove to VEC(edge), remove n_to_remove argument.
+       (tree_unroll_loop): Update arguments of
+       tree_duplicate_loop_to_header_edge call.
+       * cfghooks.c (cfg_hook_duplicate_loop_to_header_edge):
+       Change type of to_remove to VEC(edge), remove n_to_remove argument.
+       * cfghooks.h (struct cfg_hooks): Type of
+       cfg_hook_duplicate_loop_to_header_edge changed.
+       (cfg_hook_duplicate_loop_to_header_edge): Declaration changed.
+       * cfgloop.h (duplicate_loop_to_header_edge): Ditto.
+       * tree-flow.h (tree_duplicate_loop_to_header_edge): Ditto.
+
 2006-12-20  Dorit Nuzman  <dorit@il.ibm.com>
 
        * config/spu/spu.md (vec_widen_umult_hi_v8hi): New.
index 89df3e54ea31033e28005e26634a0a24893eb75c..50aca9f1b6929f61f5be19af00e5cbee0afdcb14 100644 (file)
@@ -939,14 +939,14 @@ bool
 cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge e,
                                        unsigned int ndupl,
                                        sbitmap wont_exit, edge orig,
-                                       edge *to_remove,
-                                       unsigned int *n_to_remove, int flags)
+                                       VEC (edge, heap) **to_remove,
+                                       int flags)
 {
   gcc_assert (cfg_hooks->cfg_hook_duplicate_loop_to_header_edge);
   return cfg_hooks->cfg_hook_duplicate_loop_to_header_edge (loop, e,
                                                            ndupl, wont_exit,
                                                            orig, to_remove,
-                                                           n_to_remove, flags);
+                                                           flags);
 }
 
 /* Conditional jumps are represented differently in trees and RTL,
index 008072df3f15e519ac94eea46abcb6f21f826242..fb6264df7038b8b68456bad5d68557e74d289f47 100644 (file)
@@ -111,12 +111,10 @@ struct cfg_hooks
 
   /* A hook for duplicating loop in CFG, currently this is used
      in loop versioning.  */
-  bool (*cfg_hook_duplicate_loop_to_header_edge) (struct loop *loop, edge e,
-                                                 unsigned int ndupl,
-                                                 sbitmap wont_exit,
-                                                 edge orig, edge *to_remove,
-                                                 unsigned int *n_to_remove,
-                                                 int flags);
+  bool (*cfg_hook_duplicate_loop_to_header_edge) (struct loop *, edge,
+                                                 unsigned, sbitmap,
+                                                 edge, VEC (edge, heap) **,
+                                                 int);
 
   /* Add condition to new basic block and update CFG used in loop
      versioning.  */
@@ -165,8 +163,8 @@ extern void execute_on_shrinking_pred (edge);
 extern bool cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge,
                                                    unsigned int ndupl,
                                                    sbitmap wont_exit,
-                                                   edge orig, edge *to_remove,
-                                                   unsigned int *n_to_remove,
+                                                   edge orig,
+                                                   VEC (edge, heap) **to_remove,
                                                    int flags);
 
 extern void lv_flush_pending_stmts (edge);
index 4a13a6ac06bca2459282bb3ed32a0f4e2770610b..aa12dbf3ed0e904756fb7a4a22b76f3cb9be760a 100644 (file)
@@ -251,8 +251,8 @@ extern bool can_duplicate_loop_p (struct loop *loop);
 
 extern struct loop * duplicate_loop (struct loop *, struct loop *);
 extern bool duplicate_loop_to_header_edge (struct loop *, edge, 
-                                          unsigned, sbitmap, edge, edge *,
-                                          unsigned *, int);
+                                          unsigned, sbitmap, edge,
+                                          VEC (edge, heap) **, int);
 extern struct loop *loopify (edge, edge,
                             basic_block, edge, edge, bool);
 struct loop * loop_version (struct loop *, void *,
index 83d4e4c0e135e8df45a8f5c184535a80b132068e..9021fbafd4e14059ccae9a3ac04dfe6e75b2f9de 100644 (file)
@@ -814,11 +814,12 @@ update_single_exit_for_duplicated_loops (struct loop *orig_loops[], unsigned n)
    original LOOP body, the other copies are numbered in order given by control
    flow through them) into TO_REMOVE array.  Returns false if duplication is
    impossible.  */
+
 bool
 duplicate_loop_to_header_edge (struct loop *loop, edge e,
                               unsigned int ndupl, sbitmap wont_exit,
-                              edge orig, edge *to_remove,
-                              unsigned int *n_to_remove, int flags)
+                              edge orig, VEC (edge, heap) **to_remove,
+                              int flags)
 {
   struct loop *target, *aloop;
   struct loop **orig_loops;
@@ -966,10 +967,6 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e,
   if (current_loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
     update_single_exits_after_duplication (bbs, n, target);
 
-  /* Record exit edge in original loop body.  */
-  if (orig && TEST_BIT (wont_exit, 0))
-    to_remove[(*n_to_remove)++] = orig;
-
   spec_edges[SE_ORIG] = orig;
   spec_edges[SE_LATCH] = latch_edge;
 
@@ -1043,7 +1040,10 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e,
 
       /* Record exit edge in this copy.  */
       if (orig && TEST_BIT (wont_exit, j + 1))
-       to_remove[(*n_to_remove)++] = new_spec_edges[SE_ORIG];
+       {
+         if (to_remove)
+           VEC_safe_push (edge, heap, *to_remove, new_spec_edges[SE_ORIG]);
+       }
 
       /* Record the first copy in the control flow order if it is not
         the original loop (i.e. in case of peeling).  */
@@ -1063,6 +1063,13 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e,
   free (new_bbs);
   free (orig_loops);
 
+  /* Record the exit edge in the original loop body, and update the frequencies.  */
+  if (orig && TEST_BIT (wont_exit, 0))
+    {
+      if (to_remove)
+       VEC_safe_push (edge, heap, *to_remove, orig);
+    }
+
   /* Update the original loop.  */
   if (!is_latch)
     set_immediate_dominator (CDI_DOMINATORS, e->dest, e->src);
@@ -1302,7 +1309,7 @@ loop_version (struct loop *loop,
 
   /* Duplicate loop.  */
   if (!cfg_hook_duplicate_loop_to_header_edge (loop, entry, 1,
-                                              NULL, NULL, NULL, NULL, 0))
+                                              NULL, NULL, NULL, 0))
     return NULL;
 
   /* After duplication entry edge now points to new loop head block.
index 3a79dcca94337c52d916def2da02b77715c6b343..63eebed31830e3677637e3db700cc54b224c338c 100644 (file)
@@ -446,8 +446,9 @@ peel_loop_completely (struct loop *loop)
 {
   sbitmap wont_exit;
   unsigned HOST_WIDE_INT npeel;
-  unsigned n_remove_edges, i;
-  edge *remove_edges, ein;
+  unsigned i;
+  VEC (edge, heap) *remove_edges;
+  edge ein;
   struct niter_desc *desc = get_simple_loop_desc (loop);
   struct opt_info *opt_info = NULL;
   
@@ -463,8 +464,7 @@ peel_loop_completely (struct loop *loop)
       if (desc->noloop_assumptions)
        RESET_BIT (wont_exit, 1);
 
-      remove_edges = XCNEWVEC (edge, npeel);
-      n_remove_edges = 0;
+      remove_edges = NULL;
 
       if (flag_split_ivs_in_unroller)
         opt_info = analyze_insns_in_loop (loop);
@@ -473,7 +473,7 @@ peel_loop_completely (struct loop *loop)
       ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
                                          npeel,
                                          wont_exit, desc->out_edge,
-                                         remove_edges, &n_remove_edges,
+                                         &remove_edges,
                                          DLTHE_FLAG_UPDATE_FREQ
                                          | DLTHE_FLAG_COMPLETTE_PEEL
                                          | (opt_info
@@ -489,9 +489,9 @@ peel_loop_completely (struct loop *loop)
        }
 
       /* Remove the exit edges.  */
-      for (i = 0; i < n_remove_edges; i++)
-       remove_path (remove_edges[i]);
-      free (remove_edges);
+      for (i = 0; VEC_iterate (edge, remove_edges, i, ein); i++)
+       remove_path (ein);
+      VEC_free (edge, heap, remove_edges);
     }
 
   ein = desc->in_edge;
@@ -630,8 +630,9 @@ unroll_loop_constant_iterations (struct loop *loop)
   unsigned HOST_WIDE_INT niter;
   unsigned exit_mod;
   sbitmap wont_exit;
-  unsigned n_remove_edges, i;
-  edge *remove_edges;
+  unsigned i;
+  VEC (edge, heap) *remove_edges;
+  edge e;
   unsigned max_unroll = loop->lpt_decision.times;
   struct niter_desc *desc = get_simple_loop_desc (loop);
   bool exit_at_end = loop_exit_at_end_p (loop);
@@ -648,8 +649,7 @@ unroll_loop_constant_iterations (struct loop *loop)
   wont_exit = sbitmap_alloc (max_unroll + 1);
   sbitmap_ones (wont_exit);
 
-  remove_edges = XCNEWVEC (edge, max_unroll + exit_mod + 1);
-  n_remove_edges = 0;
+  remove_edges = NULL;
   if (flag_split_ivs_in_unroller 
       || flag_variable_expansion_in_unroller)
     opt_info = analyze_insns_in_loop (loop);
@@ -674,7 +674,7 @@ unroll_loop_constant_iterations (struct loop *loop)
           ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
                                              exit_mod,
                                              wont_exit, desc->out_edge,
-                                             remove_edges, &n_remove_edges,
+                                             &remove_edges,
                                              DLTHE_FLAG_UPDATE_FREQ
                                              | (opt_info && exit_mod > 1
                                                 ? DLTHE_RECORD_COPY_NUMBER
@@ -713,7 +713,7 @@ unroll_loop_constant_iterations (struct loop *loop)
          ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
                                              exit_mod + 1,
                                              wont_exit, desc->out_edge,
-                                             remove_edges, &n_remove_edges,
+                                             &remove_edges,
                                              DLTHE_FLAG_UPDATE_FREQ
                                              | (opt_info && exit_mod > 0
                                                 ? DLTHE_RECORD_COPY_NUMBER
@@ -740,7 +740,7 @@ unroll_loop_constant_iterations (struct loop *loop)
   ok = duplicate_loop_to_header_edge (loop, loop_latch_edge (loop),
                                      max_unroll,
                                      wont_exit, desc->out_edge,
-                                     remove_edges, &n_remove_edges,
+                                     &remove_edges,
                                      DLTHE_FLAG_UPDATE_FREQ
                                      | (opt_info
                                         ? DLTHE_RECORD_COPY_NUMBER
@@ -777,9 +777,9 @@ unroll_loop_constant_iterations (struct loop *loop)
   desc->niter_expr = GEN_INT (desc->niter);
 
   /* Remove the edges.  */
-  for (i = 0; i < n_remove_edges; i++)
-    remove_path (remove_edges[i]);
-  free (remove_edges);
+  for (i = 0; VEC_iterate (edge, remove_edges, i, e); i++)
+    remove_path (e);
+  VEC_free (edge, heap, remove_edges);
 
   if (dump_file)
     fprintf (dump_file,
@@ -923,8 +923,9 @@ unroll_loop_runtime_iterations (struct loop *loop)
   unsigned n_dom_bbs;
   sbitmap wont_exit;
   int may_exit_copy;
-  unsigned n_peel, n_remove_edges;
-  edge *remove_edges, e;
+  unsigned n_peel;
+  VEC (edge, heap) *remove_edges;
+  edge e;
   bool extra_zero_check, last_may_exit;
   unsigned max_unroll = loop->lpt_decision.times;
   struct niter_desc *desc = get_simple_loop_desc (loop);
@@ -995,8 +996,7 @@ unroll_loop_runtime_iterations (struct loop *loop)
   /* Precondition the loop.  */
   split_edge_and_insert (loop_preheader_edge (loop), init_code);
 
-  remove_edges = XCNEWVEC (edge, max_unroll + n_peel + 1);
-  n_remove_edges = 0;
+  remove_edges = NULL;
 
   wont_exit = sbitmap_alloc (max_unroll + 2);
 
@@ -1011,7 +1011,7 @@ unroll_loop_runtime_iterations (struct loop *loop)
   ezc_swtch = loop_preheader_edge (loop)->src;
   ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
                                      1, wont_exit, desc->out_edge,
-                                     remove_edges, &n_remove_edges,
+                                     &remove_edges,
                                      DLTHE_FLAG_UPDATE_FREQ);
   gcc_assert (ok);
 
@@ -1026,7 +1026,7 @@ unroll_loop_runtime_iterations (struct loop *loop)
        SET_BIT (wont_exit, 1);
       ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
                                          1, wont_exit, desc->out_edge,
-                                         remove_edges, &n_remove_edges,
+                                         &remove_edges,
                                          DLTHE_FLAG_UPDATE_FREQ);
       gcc_assert (ok);
 
@@ -1082,7 +1082,7 @@ unroll_loop_runtime_iterations (struct loop *loop)
   ok = duplicate_loop_to_header_edge (loop, loop_latch_edge (loop),
                                      max_unroll,
                                      wont_exit, desc->out_edge,
-                                     remove_edges, &n_remove_edges,
+                                     &remove_edges,
                                      DLTHE_FLAG_UPDATE_FREQ
                                      | (opt_info
                                         ? DLTHE_RECORD_COPY_NUMBER
@@ -1116,9 +1116,9 @@ unroll_loop_runtime_iterations (struct loop *loop)
     }
 
   /* Remove the edges.  */
-  for (i = 0; i < n_remove_edges; i++)
-    remove_path (remove_edges[i]);
-  free (remove_edges);
+  for (i = 0; VEC_iterate (edge, remove_edges, i, e); i++)
+    remove_path (e);
+  VEC_free (edge, heap, remove_edges);
 
   /* We must be careful when updating the number of iterations due to
      preconditioning and the fact that the value must be valid at entry
@@ -1264,8 +1264,7 @@ peel_loop_simple (struct loop *loop)
   opt_info_start_duplication (opt_info);
   
   ok = duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
-                                     npeel, wont_exit,
-                                     NULL, NULL,
+                                     npeel, wont_exit, NULL,
                                      NULL, DLTHE_FLAG_UPDATE_FREQ
                                      | (opt_info
                                         ? DLTHE_RECORD_COPY_NUMBER
@@ -1416,7 +1415,7 @@ unroll_loop_stupid (struct loop *loop)
   
   ok = duplicate_loop_to_header_edge (loop, loop_latch_edge (loop),
                                      nunroll, wont_exit,
-                                     NULL, NULL, NULL,
+                                     NULL, NULL,
                                      DLTHE_FLAG_UPDATE_FREQ
                                      | (opt_info
                                         ? DLTHE_RECORD_COPY_NUMBER
index 82cf1eaeeebebf1bd82a6c533db4166a1c4d2613..38706d174d87da9270f64f9f7c058a967fdb85b6 100644 (file)
@@ -410,14 +410,9 @@ unswitch_loop (struct loop *loop, basic_block unswitch_on, rtx cond, rtx cinsn)
   irred_flag = entry->flags & EDGE_IRREDUCIBLE_LOOP;
   entry->flags &= ~EDGE_IRREDUCIBLE_LOOP;
   zero_bitmap = sbitmap_alloc (2);
-  sbitmap_zero (zero_bitmap);
   if (!duplicate_loop_to_header_edge (loop, entry, 1,
-       zero_bitmap, NULL, NULL, NULL, 0))
-    {
-      sbitmap_free (zero_bitmap);
-      return NULL;
-    }
-  sbitmap_free (zero_bitmap);
+                                     NULL, NULL, NULL, 0))
+    return NULL;
   entry->flags |= irred_flag;
 
   /* Record the block with condition we unswitch on.  */
index a85d732aa7dcdc41329458f79a41cdd422fef1ed..5f63ba93b01571cd8cbfe452dea7491e3c19ab81 100644 (file)
@@ -882,8 +882,8 @@ basic_block ip_end_pos (struct loop *);
 basic_block ip_normal_pos (struct loop *);
 bool tree_duplicate_loop_to_header_edge (struct loop *, edge,
                                         unsigned int, sbitmap,
-                                        edge, edge *,
-                                        unsigned int *, int);
+                                        edge, VEC (edge, heap) **,
+                                        int);
 struct loop *tree_ssa_loop_version (struct loop *, tree,
                                    basic_block *);
 tree expand_simple_operations (tree);
index c26727a808decf35dd3241f303b807dd73bd910f..fa92a6898093a0948aa121f234907995f5e42dfe 100644 (file)
@@ -223,8 +223,6 @@ try_unroll_loop_completely (struct loop *loop,
   if (n_unroll)
     {
       sbitmap wont_exit;
-      edge *edges_to_remove = XNEWVEC (edge, n_unroll);
-      unsigned int n_to_remove = 0;
 
       old_cond = COND_EXPR_COND (cond);
       COND_EXPR_COND (cond) = dont_exit;
@@ -237,8 +235,7 @@ try_unroll_loop_completely (struct loop *loop,
 
       if (!tree_duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
                                               n_unroll, wont_exit,
-                                              exit, edges_to_remove,
-                                              &n_to_remove,
+                                              exit, NULL,
                                               DLTHE_FLAG_UPDATE_FREQ
                                               | DLTHE_FLAG_COMPLETTE_PEEL))
        {
@@ -246,11 +243,9 @@ try_unroll_loop_completely (struct loop *loop,
          update_stmt (cond);
           free_original_copy_tables ();
          free (wont_exit);
-         free (edges_to_remove);
          return false;
        }
       free (wont_exit);
-      free (edges_to_remove);
       free_original_copy_tables ();
     }
   
index 22e5847b2f32abcf0780ad782dd98ac230510ee9..e68ca555166b5a06d96d200a7b9b1529f49dc229 100644 (file)
@@ -562,8 +562,8 @@ copy_phi_node_args (unsigned first_new_block)
 bool
 tree_duplicate_loop_to_header_edge (struct loop *loop, edge e,
                                    unsigned int ndupl, sbitmap wont_exit,
-                                   edge orig, edge *to_remove,
-                                   unsigned int *n_to_remove, int flags)
+                                   edge orig, VEC (edge, heap) **to_remove,
+                                   int flags)
 {
   unsigned first_new_block;
 
@@ -578,7 +578,7 @@ tree_duplicate_loop_to_header_edge (struct loop *loop, edge e,
 
   first_new_block = last_basic_block;
   if (!duplicate_loop_to_header_edge (loop, e, ndupl, wont_exit,
-                                     orig, to_remove, n_to_remove, flags))
+                                     orig, to_remove, flags))
     return false;
 
   /* Readd the removed phi args for e.  */
@@ -853,7 +853,7 @@ tree_unroll_loop (struct loop *loop, unsigned factor,
   sbitmap_ones (wont_exit);
   ok = tree_duplicate_loop_to_header_edge
          (loop, loop_latch_edge (loop), factor - 1,
-          wont_exit, NULL, NULL, NULL, DLTHE_FLAG_UPDATE_FREQ);
+          wont_exit, exit, NULL, DLTHE_FLAG_UPDATE_FREQ);
   free (wont_exit);
   gcc_assert (ok);
   update_ssa (TODO_update_ssa);