tree-vectorizer.c (slpeel_tree_peel_loop_to_edge): New name for function previously...
authorDorit Naishlos <dorit@il.ibm.com>
Fri, 19 Nov 2004 18:58:55 +0000 (18:58 +0000)
committerDorit Nuzman <dorit@gcc.gnu.org>
Fri, 19 Nov 2004 18:58:55 +0000 (18:58 +0000)
        * tree-vectorizer.c (slpeel_tree_peel_loop_to_edge): New name for
        function previously called tree_duplicate_loop_to_edge.
        (slpeel_tree_duplicate_loop_to_edge_cfg): New name for function
        previously called tree_duplicate_loop_to_edge_cfg.
        (slpeel_update_phis_for_duplicate_loop): Prefix 'slpeel' added to
        function name.
        (slpeel_update_phi_nodes_for_guard): Likewise.
        (slpeel_make_loop_iterate_ntimes): Likewise.
        (slpeel_add_loop_guard): Likewise.
        (allocate_new_names, free_new_names): Function declaration moved to top
        of file.
        (rename_use_op, rename_def_op): Likewise.
        (rename_variables_in_bb, rename_variables_in_loop): Likewise.
        (vect_generate_tmps_on_preheader): Function declaration moved.
        (vect_transform_for_unknown_loop_bound): Added missing function
        declaration.

From-SVN: r90929

gcc/ChangeLog
gcc/tree-vectorizer.c

index c4002cd..30c3781 100644 (file)
@@ -1,3 +1,22 @@
+2004-11-19  Dorit Naishlos  <dorit@il.ibm.com>
+
+       * tree-vectorizer.c (slpeel_tree_peel_loop_to_edge): New name for
+       function previously called tree_duplicate_loop_to_edge.
+       (slpeel_tree_duplicate_loop_to_edge_cfg): New name for function
+       previously called tree_duplicate_loop_to_edge_cfg.
+       (slpeel_update_phis_for_duplicate_loop): Prefix 'slpeel' added to
+       function name.
+       (slpeel_update_phi_nodes_for_guard): Likewise.
+       (slpeel_make_loop_iterate_ntimes): Likewise.
+       (slpeel_add_loop_guard): Likewise.
+       (allocate_new_names, free_new_names): Function declaration moved to top
+       of file.
+       (rename_use_op, rename_def_op): Likewise.
+       (rename_variables_in_bb, rename_variables_in_loop): Likewise.
+       (vect_generate_tmps_on_preheader): Function declaration moved.
+       (vect_transform_for_unknown_loop_bound): Added missing function
+       declaration.
+
 2004-11-19  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR tree-opt/18507
index f258e46..6ad9186 100644 (file)
@@ -146,6 +146,39 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "tree-vectorizer.h"
 #include "tree-pass.h"
 
+
+/*************************************************************************
+  Simple Loop Peeling Utilities
+ *************************************************************************/
+   
+/* Entry point for peeling of simple loops.
+   Peel the first/last iterations of a loop.
+   It can be used outside of the vectorizer for loops that are simple enough
+   (see function documentation).  In the vectorizer it is used to peel the
+   last few iterations when the loop bound is unknown or does not evenly
+   divide by the vectorization factor, and to peel the first few iterations
+   to force the alignment of data references in the loop.  */
+struct loop *slpeel_tree_peel_loop_to_edge 
+  (struct loop *, struct loops *, edge, tree, tree, bool);
+static struct loop *slpeel_tree_duplicate_loop_to_edge_cfg 
+  (struct loop *, struct loops *, edge);
+static void slpeel_update_phis_for_duplicate_loop 
+  (struct loop *, struct loop *, bool after);
+static void slpeel_update_phi_nodes_for_guard (edge, struct loop *);
+static void slpeel_make_loop_iterate_ntimes (struct loop *, tree, tree, tree);
+static edge slpeel_add_loop_guard (basic_block, tree, basic_block);
+static void allocate_new_names (bitmap);
+static void rename_use_op (use_operand_p);
+static void rename_def_op (def_operand_p, tree);
+static void rename_variables_in_bb (basic_block);
+static void free_new_names (bitmap);
+static void rename_variables_in_loop (struct loop *);
+
+
+/*************************************************************************
+  Vectorization Utilities. 
+ *************************************************************************/
+
 /* Main analysis functions.  */
 static loop_vec_info vect_analyze_loop (struct loop *);
 static loop_vec_info vect_analyze_loop_form (struct loop *);
@@ -184,8 +217,8 @@ static bool vect_get_first_index (tree, tree *);
 static bool vect_can_force_dr_alignment_p (tree, unsigned int);
 static struct data_reference * vect_analyze_pointer_ref_access 
   (tree, tree, bool);
-static bool vect_analyze_loop_with_symbolic_num_of_iters (tree niters, 
-                                                         struct loop *loop);
+static bool vect_analyze_loop_with_symbolic_num_of_iters 
+  (tree niters, struct loop *loop);
 static tree vect_get_base_and_bit_offset
   (struct data_reference *, tree, tree, loop_vec_info, tree *, bool*);
 static struct data_reference * vect_analyze_pointer_ref_access
@@ -212,47 +245,19 @@ static tree vect_build_symbol_bound (tree, int, struct loop *);
 static void vect_finish_stmt_generation 
   (tree stmt, tree vec_stmt, block_stmt_iterator *bsi);
 
-static void vect_generate_tmps_on_preheader (loop_vec_info, 
-                                            tree *, tree *, 
-                                            tree *);
+/* Utility function dealing with loop peeling (not peeling itself).  */
+static void vect_generate_tmps_on_preheader 
+  (loop_vec_info, tree *, tree *, tree *);
 static tree vect_build_loop_niters (loop_vec_info);
 static void vect_update_ivs_after_vectorizer (struct loop *, tree); 
-
-/* Loop transformations prior to vectorization.  */
-
-/* Loop transformations entry point function. 
-   It can be used outside of the vectorizer 
-   in case the loop to be manipulated answers conditions specified
-   in function documentation.  */
-struct loop *tree_duplicate_loop_to_edge (struct loop *, 
-                                         struct loops *, edge, 
-                                         tree, tree, bool);
-
-static void allocate_new_names (bitmap);
-static void rename_use_op (use_operand_p);
-static void rename_def_op (def_operand_p, tree);
-static void rename_variables_in_bb (basic_block);
-static void free_new_names (bitmap);
-static void rename_variables_in_loop (struct loop *);
-static void copy_phi_nodes (struct loop *, struct loop *, bool);
-static void update_phis_for_duplicate_loop (struct loop *,
-                                           struct loop *, 
-                                           bool after);
-static void update_phi_nodes_for_guard (edge, struct loop *);  
-static void make_loop_iterate_ntimes (struct loop *, tree, tree, tree);
-static struct loop *tree_duplicate_loop_to_edge_cfg (struct loop *, 
-                                                    struct loops *, 
-                                                    edge);
-static edge add_loop_guard (basic_block, tree, basic_block);
-static bool verify_loop_for_duplication (struct loop *, bool, edge);
-
-/* Utilities dealing with loop peeling (not peeling itself).  */
 static tree vect_gen_niters_for_prolog_loop (loop_vec_info, tree);
 static void vect_update_niters_after_peeling (loop_vec_info, tree);
-static void vect_update_inits_of_dr (struct data_reference *, struct loop *, 
-                                    tree niters);
+static void vect_update_inits_of_dr 
+  (struct data_reference *, struct loop *, tree niters);
 static void vect_update_inits_of_drs (loop_vec_info, tree);
 static void vect_do_peeling_for_alignment (loop_vec_info, struct loops *);
+static void vect_transform_for_unknown_loop_bound 
+  (loop_vec_info, tree *, struct loops *);
 
 /* Utilities for creation and deletion of vec_info structs.  */
 loop_vec_info new_loop_vec_info (struct loop *loop);
@@ -263,7 +268,11 @@ static bool vect_debug_stats (struct loop *loop);
 static bool vect_debug_details (struct loop *loop);
 
 \f
-/* Utilities to support loop peeling for vectorization purposes.  */
+/*************************************************************************
+  Simple Loop Peeling Utilities
+
+  Utilities to support loop peeling for vectorization purposes.
+ *************************************************************************/
 
 
 /* For each definition in DEFINITIONS this function allocates 
@@ -463,8 +472,8 @@ copy_phi_nodes (struct loop *loop, struct loop *new_loop,
    executes after LOOP, and false if it executes before it.  */
 
 static void
-update_phis_for_duplicate_loop (struct loop *loop,
-                                struct loop *new_loop, bool after)
+slpeel_update_phis_for_duplicate_loop (struct loop *loop,
+                                      struct loop *new_loop, bool after)
 {
   edge old_latch;
   tree *new_name_ptr, new_ssa_name;
@@ -553,7 +562,7 @@ update_phis_for_duplicate_loop (struct loop *loop,
    new edge from bb0 to bb4.  */
 
 static void
-update_phi_nodes_for_guard (edge guard_true_edge, struct loop * loop)
+slpeel_update_phi_nodes_for_guard (edge guard_true_edge, struct loop * loop)
 {
   tree phi, phi1;
   basic_block bb = loop->exit_edges[0]->dest;
@@ -599,8 +608,8 @@ update_phi_nodes_for_guard (edge guard_true_edge, struct loop * loop)
    that starts at zero, increases by one and its limit is NITERS.  */
 
 static void
-make_loop_iterate_ntimes (struct loop *loop, tree niters,
-                         tree begin_label, tree exit_label)
+slpeel_make_loop_iterate_ntimes (struct loop *loop, tree niters,
+                                tree begin_label, tree exit_label)
 {
   tree indx_before_incr, indx_after_incr, cond_stmt, cond;
   tree orig_cond;
@@ -645,8 +654,8 @@ make_loop_iterate_ntimes (struct loop *loop, tree niters,
    on E which is either the entry or exit of LOOP.  */
 
 static struct loop *
-tree_duplicate_loop_to_edge_cfg (struct loop *loop, struct loops *loops, 
-                                edge e)
+slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *loop, struct loops *loops, 
+                                       edge e)
 {
   struct loop *new_loop;
   basic_block *new_bbs, *bbs;
@@ -765,7 +774,7 @@ tree_duplicate_loop_to_edge_cfg (struct loop *loop, struct loops *loops,
    Returns the skip edge.  */
 
 static edge
-add_loop_guard (basic_block guard_bb, tree cond, basic_block exit_bb)
+slpeel_add_loop_guard (basic_block guard_bb, tree cond, basic_block exit_bb)
 {
   block_stmt_iterator bsi;
   edge new_e, enter_e;
@@ -793,8 +802,8 @@ add_loop_guard (basic_block guard_bb, tree cond, basic_block exit_bb)
 /* This function verifies that certain restrictions apply to LOOP.  */
 
 static bool
-verify_loop_for_duplication (struct loop *loop,
-                            bool update_first_loop_count, edge e)
+slpeel_verify_loop_for_duplication (struct loop *loop,
+                                   bool update_first_loop_count, edge e)
 {
   edge exit_e = loop->exit_edges [0];
   edge entry_e = loop_preheader_edge (loop);
@@ -928,9 +937,9 @@ verify_loop_for_duplication (struct loop *loop,
    transformations failed.  */
    
 struct loop*
-tree_duplicate_loop_to_edge (struct loop *loop, struct loops *loops, 
-                            edge e, tree first_niters, 
-                            tree niters, bool update_first_loop_count)
+slpeel_tree_peel_loop_to_edge (struct loop *loop, struct loops *loops, 
+                              edge e, tree first_niters, 
+                              tree niters, bool update_first_loop_count)
 {
   struct loop *new_loop = NULL, *first_loop, *second_loop;
   edge skip_e;
@@ -942,7 +951,7 @@ tree_duplicate_loop_to_edge (struct loop *loop, struct loops *loops,
 
   gcc_assert (!any_marked_for_rewrite_p ());
 
-  if (!verify_loop_for_duplication (loop, update_first_loop_count, e))
+  if (!slpeel_verify_loop_for_duplication (loop, update_first_loop_count, e))
       return NULL;
 
   /* We have to initialize cfg_hooks. Then, when calling 
@@ -952,7 +961,7 @@ tree_duplicate_loop_to_edge (struct loop *loop, struct loops *loops,
   tree_register_cfg_hooks ();
 
   /* 1. Generate a copy of LOOP and put it on E (entry or exit).  */
-  if (!(new_loop = tree_duplicate_loop_to_edge_cfg (loop, loops, e)))
+  if (!(new_loop = slpeel_tree_duplicate_loop_to_edge_cfg (loop, loops, e)))
     {
       if (vect_debug_stats (loop) || vect_debug_details (loop))        
        fprintf (dump_file,
@@ -962,7 +971,7 @@ tree_duplicate_loop_to_edge (struct loop *loop, struct loops *loops,
 
   definitions = marked_ssa_names ();
   allocate_new_names (definitions);
-  update_phis_for_duplicate_loop (loop, new_loop, e == exit_e);
+  slpeel_update_phis_for_duplicate_loop (loop, new_loop, e == exit_e);
   /* Here, using assumption (5), we do not propagate new names further 
      than on phis of the exit from the second loop.  */
   rename_variables_in_loop (new_loop);
@@ -994,7 +1003,7 @@ tree_duplicate_loop_to_edge (struct loop *loop, struct loops *loops,
       tree first_loop_latch_lbl = tree_block_label (first_loop->latch);
       tree first_loop_exit_lbl = tree_block_label (first_exit_bb);
 
-      make_loop_iterate_ntimes (first_loop, first_niters,
+      slpeel_make_loop_iterate_ntimes (first_loop, first_niters,
                                first_loop_latch_lbl,
                                first_loop_exit_lbl);
     }
@@ -1018,11 +1027,11 @@ tree_duplicate_loop_to_edge (struct loop *loop, struct loops *loops,
                           first_niters, integer_zero_node);
 
   /* 4c. Add condition at the end of preheader bb.  */
-  skip_e = add_loop_guard (pre_header_bb, pre_condition, first_exit_bb);
+  skip_e = slpeel_add_loop_guard (pre_header_bb, pre_condition, first_exit_bb);
 
   /* 4d. Update phis at first loop exit and propagate changes 
      to the phis of second loop.  */
-  update_phi_nodes_for_guard (skip_e, first_loop);
+  slpeel_update_phi_nodes_for_guard (skip_e, first_loop);
 
   /* 5. Add the guard before second loop:
 
@@ -1043,8 +1052,8 @@ tree_duplicate_loop_to_edge (struct loop *loop, struct loops *loops,
                           first_niters, niters);
 
   /* 5c. Add condition at the end of preheader bb.  */
-  skip_e = add_loop_guard (first_exit_bb, pre_condition, second_exit_bb);
-  update_phi_nodes_for_guard (skip_e, second_loop);
+  skip_e = slpeel_add_loop_guard (first_exit_bb, pre_condition, second_exit_bb);
+  slpeel_update_phi_nodes_for_guard (skip_e, second_loop);
 
   BITMAP_XFREE (definitions);
   unmark_all_for_rewrite ();
@@ -1056,6 +1065,10 @@ tree_duplicate_loop_to_edge (struct loop *loop, struct loops *loops,
 \f
 /* Here the proper Vectorizer starts.  */
 
+/*************************************************************************
+  Vectorization Utilities.
+ *************************************************************************/
+
 /* Function new_stmt_vec_info.
 
    Create and initialize a new stmt_vec_info struct for STMT.  */
@@ -3042,8 +3055,8 @@ vect_transform_for_unknown_loop_bound (loop_vec_info loop_vinfo, tree * ratio,
 #ifdef ENABLE_CHECKING
   loop_num  = loop->num; 
 #endif
-  new_loop = tree_duplicate_loop_to_edge (loop, loops, loop->exit_edges[0],
-                                         ratio_mult_vf_name, ni_name, true); 
+  new_loop = slpeel_tree_peel_loop_to_edge (loop, loops, loop->exit_edges[0],
+                                           ratio_mult_vf_name, ni_name, true); 
 #ifdef ENABLE_CHECKING
   gcc_assert (new_loop);
   gcc_assert (loop_num == loop->num);
@@ -3227,8 +3240,8 @@ vect_do_peeling_for_alignment (loop_vec_info loop_vinfo, struct loops *loops)
   
 
   /* Peel the prolog loop and iterate it niters_of_prolog_loop.  */
-  tree_duplicate_loop_to_edge (loop, loops, loop_preheader_edge(loop), 
-                                 niters_of_prolog_loop, ni_name, false); 
+  slpeel_tree_peel_loop_to_edge (loop, loops, loop_preheader_edge(loop), 
+                                niters_of_prolog_loop, ni_name, false); 
 
   /* Update number of times loop executes.  */
   vect_update_niters_after_peeling (loop_vinfo, niters_of_prolog_loop);