This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [lno] [patch] vectorization with unknown loop bound


Hello,

I have commited the following cleanup that moves the vectorizer
non-specific part of the patch to tree-ssa-loop-manip.c.

Zdenek

Index: ChangeLog.lno
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/ChangeLog.lno,v
retrieving revision 1.1.2.161
diff -c -3 -p -r1.1.2.161 ChangeLog.lno
*** ChangeLog.lno	20 May 2004 13:41:20 -0000	1.1.2.161
--- ChangeLog.lno	21 May 2004 19:07:37 -0000
***************
*** 1,3 ****
--- 1,19 ----
+ 2004-05-21  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+ 
+ 	* Makefile.in (tree-ssa-loop-manip.o): Add cfglayout.h dependency.
+ 	* tree-flow.h (collect_defs, rename_variables_in_bb, rename_op,
+ 	allocate_new_names, free_new_names): Declaration removed.
+ 	(tree_duplicate_loop_to_exit): Declare.
+ 	* tree-ssa-loop-manip.c: Include cfglayout.h.
+ 	(collect_defs, rename_variables_in_bb, rename_op,
+ 	allocate_new_names, free_new_names): Made static.
+ 	(tdlte_rename_variables_in_loop, tdlte_copy_phi_nodes,
+ 	tree_duplicate_loop_to_exit_cfg, tree_duplicate_loop_to_exit):
+ 	Moved from tree-vectorizer.c.
+ 	* tree-vectorizer.c (vect_duplicate_loopm vect_copy_phi_nodes,
+ 	vect_rename_variables_in_loop, vect_tree_duplicate_loop): Moved
+ 	to tree-ssa-loop-manip.c and renamed.
+ 
  2004-05-20  Olga Golovanevsky  <olga@il.ibm.com>
              Dorit Naishlos <dorit@il.ibm.com>
  
Index: Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Makefile.in,v
retrieving revision 1.903.2.158.2.27
diff -c -3 -p -r1.903.2.158.2.27 Makefile.in
*** Makefile.in	30 Apr 2004 23:38:48 -0000	1.903.2.158.2.27
--- Makefile.in	21 May 2004 19:07:37 -0000
*************** tree-ssa-loop-ivopts.o : tree-ssa-loop-i
*** 1668,1674 ****
  tree-ssa-loop-manip.o : tree-ssa-loop-manip.c $(TREE_FLOW_H) $(CONFIG_H) \
     $(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) cfgloop.h \
     output.h diagnostic.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
!    tree-pass.h
  tree-ssa-loop-niter.o : tree-ssa-loop-niter.c $(TREE_FLOW_H) $(CONFIG_H) \
     $(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) cfgloop.h $(PARAMS_H) tree-inline.h \
     output.h diagnostic.h $(TM_H) coretypes.h $(TREE_DUMP_H) flags.h \
--- 1668,1674 ----
  tree-ssa-loop-manip.o : tree-ssa-loop-manip.c $(TREE_FLOW_H) $(CONFIG_H) \
     $(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) cfgloop.h \
     output.h diagnostic.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
!    tree-pass.h cfglayout.h
  tree-ssa-loop-niter.o : tree-ssa-loop-niter.c $(TREE_FLOW_H) $(CONFIG_H) \
     $(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) cfgloop.h $(PARAMS_H) tree-inline.h \
     output.h diagnostic.h $(TM_H) coretypes.h $(TREE_DUMP_H) flags.h \
Index: tree-flow.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-flow.h,v
retrieving revision 1.1.4.177.2.28
diff -c -3 -p -r1.1.4.177.2.28 tree-flow.h
*** tree-flow.h	20 May 2004 13:41:20 -0000	1.1.4.177.2.28
--- tree-flow.h	21 May 2004 19:07:37 -0000
*************** void tree_ssa_lim (struct loops *loops);
*** 617,631 ****
  void tree_ssa_iv_optimize (struct loops *);
  void canonicalize_induction_variables (struct loops *loops);
  void test_unrolling_and_peeling (struct loops *loops);
- tree collect_defs (struct loop *loop);
- void rename_variables_in_bb (basic_block bb);
- void rename_op (tree *op_p, bool def, tree stmt, unsigned n_copy);
- void allocate_new_names (tree definitions, unsigned ndupl, bool origin);
- void free_new_names (tree definitions, bool origin);
  bool tree_duplicate_loop_to_header_edge (struct loop *, edge, struct loops *,
  					 unsigned int, sbitmap,
  					 edge, edge *,
  					 unsigned int *, int);
  void create_iv (tree, tree, tree, struct loop *, block_stmt_iterator *, bool,
  		tree *, tree *);
  void test_loop_versioning (struct loops *loops);
--- 617,627 ----
  void tree_ssa_iv_optimize (struct loops *);
  void canonicalize_induction_variables (struct loops *loops);
  void test_unrolling_and_peeling (struct loops *loops);
  bool tree_duplicate_loop_to_header_edge (struct loop *, edge, struct loops *,
  					 unsigned int, sbitmap,
  					 edge, edge *,
  					 unsigned int *, int);
+ bool tree_duplicate_loop_to_exit (struct loop *loop, struct loops *loops);
  void create_iv (tree, tree, tree, struct loop *, block_stmt_iterator *, bool,
  		tree *, tree *);
  void test_loop_versioning (struct loops *loops);
Index: tree-ssa-loop-manip.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/tree-ssa-loop-manip.c,v
retrieving revision 1.1.2.15
diff -c -3 -p -r1.1.2.15 tree-ssa-loop-manip.c
*** tree-ssa-loop-manip.c	20 May 2004 13:41:20 -0000	1.1.2.15
--- tree-ssa-loop-manip.c	21 May 2004 19:07:37 -0000
*************** Software Foundation, 59 Temple Place - S
*** 34,39 ****
--- 34,40 ----
  #include "timevar.h"
  #include "cfgloop.h"
  #include "tree-pass.h"
+ #include "cfglayout.h"
  
  static basic_block lv_adjust_loop_entry_edge (basic_block, basic_block, edge, 
  					      tree); 
*************** copy_phi_nodes (struct loop *loop, unsig
*** 106,112 ****
  
  /* Constructs list of all ssa names defined inside LOOP.  */
  
! tree
  collect_defs (struct loop *loop)
  {
    basic_block *body = get_loop_body (loop);
--- 107,113 ----
  
  /* Constructs list of all ssa names defined inside LOOP.  */
  
! static tree
  collect_defs (struct loop *loop)
  {
    basic_block *body = get_loop_body (loop);
*************** collect_defs (struct loop *loop)
*** 150,156 ****
     If ORIGIN is true, additional set of DEFINITIONS 
     is allocated for initial loop copy. */
  
! void
  allocate_new_names (tree definitions, unsigned ndupl, bool origin)
  {
    tree def;
--- 151,157 ----
     If ORIGIN is true, additional set of DEFINITIONS 
     is allocated for initial loop copy. */
  
! static void
  allocate_new_names (tree definitions, unsigned ndupl, bool origin)
  {
    tree def;
*************** allocate_new_names (tree definitions, un
*** 179,185 ****
     *OP_P is defined by the statement.  N_COPY is the number of the
     copy of the loop body we are renaming.  */
  
! void
  rename_op (tree *op_p, bool def, tree stmt, unsigned n_copy)
  {
    ssa_name_ann_t ann;
--- 180,186 ----
     *OP_P is defined by the statement.  N_COPY is the number of the
     copy of the loop body we are renaming.  */
  
! static void
  rename_op (tree *op_p, bool def, tree stmt, unsigned n_copy)
  {
    ssa_name_ann_t ann;
*************** rename_op (tree *op_p, bool def, tree st
*** 207,213 ****
  
  /* Renames the variables in basic block BB.  */
  
! void
  rename_variables_in_bb (basic_block bb)
  {
    tree phi;
--- 208,214 ----
  
  /* Renames the variables in basic block BB.  */
  
! static void
  rename_variables_in_bb (basic_block bb)
  {
    tree phi;
*************** rename_variables (unsigned first_new_blo
*** 279,285 ****
     The original ssa names are released if ORIGIN is true.
     Otherwise they are saved for initial loop copy.  */
  
! void
  free_new_names (tree definitions, bool origin)
  {
    tree def;
--- 280,286 ----
     The original ssa names are released if ORIGIN is true.
     Otherwise they are saved for initial loop copy.  */
  
! static void
  free_new_names (tree definitions, bool origin)
  {
    tree def;
*************** verify_loop_closed_ssa (void)
*** 1029,1031 ****
--- 1030,1253 ----
  	check_loop_closed_ssa_stmt (bb, bsi_stmt (bsi));
      }
  }
+ 
+ /* Renames variables in new generated LOOP.  */
+ 
+ static void
+ tdlte_rename_variables_in_loop (struct loop *loop)
+ {
+   unsigned i;
+   basic_block *bbs;
+ 
+   bbs = get_loop_body (loop);
+ 
+   for (i = 0; i < loop->num_nodes; i++)
+     {
+       rename_variables_in_bb (bbs[i]);
+     }
+ 
+   free (bbs);
+ }
+ 
+ /* This function copies phis from loop to new_loop 
+    as they were not generated by duplication of bbs.  */
+ 
+ static void
+ tdlte_copy_phi_nodes (struct loop *loop, struct loop *new_loop)
+ {
+   tree phi, new_phi, def;
+   edge new_e;
+   edge latch = loop_latch_edge (loop);
+   tree nlist;
+ 
+      
+   for (phi = phi_nodes (loop->header); phi; phi = TREE_CHAIN (phi))
+     {
+       new_phi = create_phi_node (PHI_RESULT (phi), new_loop->header);
+       new_e = new_loop->header->pred;
+       def = phi_element_for_edge (phi, latch)->def;
+       add_phi_arg (&new_phi, def, new_e);
+     }
+ 
+   /* neverse phi nodes to keep them in original order.  */
+   nlist = nreverse (phi_nodes (new_loop->header));
+   set_phi_nodes (new_loop->header, nlist);
+ 
+ }
+ 
+ /* This function: 
+    - copies basic blocks of the loop LOOP;
+    - locate them at the only exit of LOOP; 
+    - redirect edges so that two loops are produced: 
+              initial LOOP and newly generated;
+    - update dominators;
+    - returns pointer to new loop in NEW_LOOP_P.
+ 
+    FORNOW: only innermost loops with 
+            1 exit are handled. 
+ */
+ 
+ static bool
+ tree_duplicate_loop_to_exit_cfg (struct loop *loop, struct loops *loops,
+ 				 struct loop **new_loop_p)
+ {
+   struct loop *target;
+   basic_block latch = loop->latch; 
+   basic_block *new_bbs, *bbs;
+   edge latch_edge;
+ 
+   unsigned i; 
+   unsigned  n = loop->num_nodes;
+   struct loop *new_loop;
+   basic_block exit_dest; 
+ 
+   bbs = get_loop_body (loop);
+ 
+   /* Check whether duplication is possible.  */
+   if (!can_copy_bbs_p (bbs, loop->num_nodes))
+     {
+       free (bbs);
+       return false;
+     }
+   new_bbs = xmalloc (sizeof (basic_block) * loop->num_nodes);
+ 
+   /* Find edge from latch.  */
+   latch_edge = loop_latch_edge (loop);
+ 
+   /* We duplicate only innermost loops */
+   if(loop->inner)
+     {
+       if (dump_file && (dump_flags & TDF_DETAILS))
+ 	  fprintf (dump_file,
+ 		   "Loop duplication failed. Loop is not innermost.\n");
+       free (bbs);
+       return false;
+     }
+ 
+   /* FORNOW: only loops with 1 exit. */
+   if(loop->num_exits != 1)
+     {
+       if (dump_file && (dump_flags & TDF_DETAILS))
+ 	  fprintf (dump_file,
+ 		   "More than one exit from loop.\n");
+       return false;
+     }    
+ 
+   /* Loop the new bbs will belong to.  */
+   target = loop->outer;
+   if(!target)
+     {
+       if (dump_file && (dump_flags & TDF_DETAILS))
+ 	  fprintf (dump_file,
+ 		   "Loop is outer-most loop.\n");
+       return false;
+     }    
+     
+   /* Generate new loop structure. */
+   new_loop = duplicate_loop (loops, loop, target); 
+   if(!new_loop)
+     {
+       if (dump_file && (dump_flags & TDF_DETAILS))
+ 	  fprintf (dump_file,
+ 		   "duplicate_loop returns NULL.\n");
+       return false;
+ 
+     }
+   /* FIXME: Should we copy contents of the loop structure
+      to the new loop?  */
+ 
+   copy_bbs (bbs, n, new_bbs, NULL, 0, NULL, NULL);
+   for (i = 0; i < n; i++)
+     new_bbs[i]->rbi->copy_number = 1;
+ 
+   /* Redirect the special edges.  */
+   exit_dest = loop->exit_edges[0]->dest;
+   if(!exit_dest)
+     {
+       if (dump_file && (dump_flags & TDF_DETAILS))
+ 	  fprintf (dump_file,
+ 		   "First exit basic block of loop is NULL.\n");
+       return false;
+     }
+     
+   
+   redirect_edge_and_branch_force (loop->exit_edges[0],
+ 				  new_bbs[0]);
+   set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], latch);
+   set_immediate_dominator (CDI_DOMINATORS, exit_dest, new_loop->latch);
+   
+   free (new_bbs);
+   free (bbs);
+ 
+ 
+   *new_loop_p = new_loop;
+   return true;
+ }
+ 
+ /* This funtion generate pure copy of LOOP 
+    and locate it immediately after given LOOP.
+    It fixes phis of copy loop so that they inherite 
+    one of thier values from exit edge of initil LOOP.  */
+ 
+ bool
+ tree_duplicate_loop_to_exit (struct loop *loop, struct loops *loops)
+ {
+   struct loop *new_loop = NULL;
+   tree definitions;
+   edge pred;
+   tree *new_names, new_var;
+   tree phi, def;
+   unsigned first_new_block;
+   ssa_name_ann_t ann;
+ 
+   definitions = collect_defs (loop);
+ 
+   first_new_block = last_basic_block;
+   if(!tree_duplicate_loop_to_exit_cfg (loop, loops, &new_loop))
+     {
+       if (dump_file && (dump_flags & TDF_DETAILS))
+ 	fprintf (dump_file,
+ 		 "tree_duplicate_loop_to_exit failed.\n");
+       return false;
+     }
+ 
+   if(!new_loop)
+     abort();
+ 
+ 
+   allocate_new_names (definitions, 1, false);
+ 
+   /* Copy phis from loop->header to new_loop->header.  */
+   tdlte_copy_phi_nodes (loop, new_loop);
+ 
+   /* Rename the variables.  */
+   tdlte_rename_variables_in_loop (new_loop);
+ 
+   /* Fix phis to inherit values from loop exit edge.  */
+   for (phi = phi_nodes (new_loop->header); phi; phi = TREE_CHAIN (phi))
+     {
+       pred = new_loop->header->pred;
+       def = phi_element_for_edge (phi, pred)->def;
+ 
+       if (TREE_CODE (def) != SSA_NAME)
+ 	continue;
+ 
+       ann = ssa_name_ann (def);
+       new_names = ann ? ann->common.aux : NULL;
+ 
+       /* Something defined outside of the loop.  */
+       if (!new_names)
+ 	continue;
+ 
+       /* An ordinary ssa name defined in the loop.  */
+       new_var = new_names[new_loop->header->rbi->copy_number];
+       
+       add_phi_arg (&phi, new_var, loop_latch_edge(new_loop));
+     }
+ 
+ 
+   free_new_names (definitions, false);
+ 
+   return true;
+ }
+ 
Index: tree-vectorizer.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/tree-vectorizer.c,v
retrieving revision 1.1.2.31
diff -c -3 -p -r1.1.2.31 tree-vectorizer.c
*** tree-vectorizer.c	20 May 2004 13:41:20 -0000	1.1.2.31
--- tree-vectorizer.c	21 May 2004 19:07:38 -0000
*************** static tree vect_get_vec_def_for_operand
*** 206,217 ****
  static tree vect_init_vector (tree, tree);
  
  /* Utility functions for loop duplication.  */
- static bool vect_duplicate_loop (struct loop *loop, struct loops *loops, struct loop **new_loop_p);
- static void vect_copy_phi_nodes (struct loop *loop, struct loop *new_loop);
- static void vect_rename_variables_in_loop (struct loop *loop);
  static basic_block vect_tree_split_edge (edge);
  static void vect_update_initial_conditions_of_duplicated_loop (loop_vec_info, tree);
- static bool vect_tree_duplicate_loop (struct loop *loop, struct loops *loops);
  
  /* General untility functions (CHECKME: where do they belong).  */
  static tree get_array_base (tree);
--- 206,213 ----
*************** vect_transform_loop (loop_vec_info loop_
*** 1596,1602 ****
        basic_block new_bb;
        tree stmt, ni;
  
!       vect_tree_duplicate_loop (loop, loops);
  
        /* FORNOW: Only loops with one exit are handled. */
        ee = loop->exit_edges[0];
--- 1592,1598 ----
        basic_block new_bb;
        tree stmt, ni;
  
!       tree_duplicate_loop_to_exit (loop, loops);
  
        /* FORNOW: Only loops with one exit are handled. */
        ee = loop->exit_edges[0];
*************** static bool
*** 3727,3952 ****
  need_imm_uses_for (tree var)
  {
    return is_gimple_reg (var);
- }
- 
- /* Renames variables in new generated LOOP.  */
- 
- static void
- vect_rename_variables_in_loop (struct loop *loop)
- {
-   unsigned i;
-   basic_block *bbs;
- 
-   bbs = get_loop_body (loop);
- 
-   for (i = 0; i < loop->num_nodes; i++)
-     {
-       rename_variables_in_bb (bbs[i]);
-     }
- 
-   free (bbs);
- }
- 
- /* This function copies phis from loop to new_loop 
-    as they were not generated by duplication of bbs.  */
- 
- static void
- vect_copy_phi_nodes (struct loop *loop, struct loop *new_loop)
- {
-   tree phi, new_phi, def;
-   edge new_e;
-   edge latch = loop_latch_edge (loop);
-   tree nlist;
- 
-      
-   for (phi = phi_nodes (loop->header); phi; phi = TREE_CHAIN (phi))
-     {
-       new_phi = create_phi_node (PHI_RESULT (phi), new_loop->header);
-       new_e = new_loop->header->pred;
-       def = phi_element_for_edge (phi, latch)->def;
-       add_phi_arg (&new_phi, def, new_e);
-     }
- 
-   /* neverse phi nodes to keep them in original order.  */
-   nlist = nreverse (phi_nodes (new_loop->header));
-   set_phi_nodes (new_loop->header, nlist);
- 
- }
- 
- /* This funtion generate pure copy of LOOP 
-    and locate it immediately after given LOOP.
-    It fixes phis of copy loop so that they inherite 
-    one of thier values from exit edge of initil LOOP.  */
- 
- static bool
- vect_tree_duplicate_loop (struct loop *loop, struct loops *loops)
- {
-   struct loop *new_loop = NULL;
-   tree definitions;
-   edge pred;
-   tree *new_names, new_var;
-   tree phi, def;
-   unsigned first_new_block;
-   ssa_name_ann_t ann;
- 
-   definitions = collect_defs (loop);
- 
-   first_new_block = last_basic_block;
-   if(!vect_duplicate_loop (loop, loops, &new_loop))
-     {
-       if (dump_file && (dump_flags & TDF_DETAILS))
- 	fprintf (dump_file,
- 		 "vect_duplicate_loop is failed.\n");
-       return false;
-     }
- 
-   if(!new_loop)
-     abort();
- 
- 
-   allocate_new_names (definitions, 1, false);
- 
-   /* Copy phis from loop->header to new_loop->header.  */
-   vect_copy_phi_nodes (loop, new_loop);
- 
-   /* Rename the variables.  */
-   vect_rename_variables_in_loop (new_loop);
- 
-   /* Fix phis to inherit values from loop exit edge.  */
-   for (phi = phi_nodes (new_loop->header); phi; phi = TREE_CHAIN (phi))
-     {
-       pred = new_loop->header->pred;
-       def = phi_element_for_edge (phi, pred)->def;
- 
-       if (TREE_CODE (def) != SSA_NAME)
- 	continue;
- 
-       ann = ssa_name_ann (def);
-       new_names = ann ? ann->common.aux : NULL;
- 
-       /* Something defined outside of the loop.  */
-       if (!new_names)
- 	continue;
- 
-       /* An ordinary ssa name defined in the loop.  */
-       new_var = new_names[new_loop->header->rbi->copy_number];
-       
-       add_phi_arg (&phi, new_var, loop_latch_edge(new_loop));
-     }
- 
- 
-   free_new_names (definitions, false);
- 
-   return true;
- }
- 
- /* This function: 
-    - copies basic blocks of the loop LOOP;
-    - locate them at the only exit of LOOP; 
-    - redirect edges so that two loops are produced: 
-              initial LOOP and newly generated;
-    - update dominators;
-    - returns pointer to new loop in NEW_LOOP_P.
- 
-    FORNOW: only innermost loops with 
-            1 exit are handled. 
- */
- 
- static bool
- vect_duplicate_loop (struct loop *loop, struct loops *loops, struct loop **new_loop_p)
- {
-   struct loop *target;
-   basic_block latch = loop->latch; 
-   basic_block *new_bbs, *bbs;
-   edge latch_edge;
- 
-   unsigned i; 
-   unsigned  n = loop->num_nodes;
-   struct loop *new_loop;
-   basic_block exit_dest; 
- 
-   bbs = get_loop_body (loop);
- 
-   /* Check whether duplication is possible.  */
-   if (!can_copy_bbs_p (bbs, loop->num_nodes))
-     {
-       free (bbs);
-       return false;
-     }
-   new_bbs = xmalloc (sizeof (basic_block) * loop->num_nodes);
- 
-   /* Find edge from latch.  */
-   latch_edge = loop_latch_edge (loop);
- 
-   /* We duplicate only innermost loops */
-   if(loop->inner)
-     {
-       if (dump_file && (dump_flags & TDF_DETAILS))
- 	  fprintf (dump_file,
- 		   "Loop duplication failed. Loop is not innermost.\n");
-       free (bbs);
-       return false;
-     }
- 
-   /* FORNOW: only loops with 1 exit. */
-   if(loop->num_exits != 1)
-     {
-       if (dump_file && (dump_flags & TDF_DETAILS))
- 	  fprintf (dump_file,
- 		   "More than one exit from loop.\n");
-       return false;
-     }    
- 
-   /* Loop the new bbs will belong to.  */
-   target = loop->outer;
-   if(!target)
-     {
-       if (dump_file && (dump_flags & TDF_DETAILS))
- 	  fprintf (dump_file,
- 		   "Loop is outer-most loop.\n");
-       return false;
-     }    
-     
-   /* Generate new loop structure. */
-   new_loop = duplicate_loop (loops, loop, target); 
-   if(!new_loop)
-     {
-       if (dump_file && (dump_flags & TDF_DETAILS))
- 	  fprintf (dump_file,
- 		   "duplicate_loop returns NULL.\n");
-       return false;
- 
-     }
-   /* FIXME: Should we copy contents of the loop structure
-      to the new loop?  */
- 
-   copy_bbs (bbs, n, new_bbs, NULL, 0, NULL, NULL);
-   for (i = 0; i < n; i++)
-     new_bbs[i]->rbi->copy_number = 1;
- 
-   /* Redirect the special edges.  */
-   exit_dest = loop->exit_edges[0]->dest;
-   if(!exit_dest)
-     {
-       if (dump_file && (dump_flags & TDF_DETAILS))
- 	  fprintf (dump_file,
- 		   "First exit basic block of loop is NULL.\n");
-       return false;
-     }
-     
-   
-   redirect_edge_and_branch_force (loop->exit_edges[0],
- 				  new_bbs[0]);
-   set_immediate_dominator (CDI_DOMINATORS, new_bbs[0], latch);
-   set_immediate_dominator (CDI_DOMINATORS, exit_dest, new_loop->latch);
-   
-   free (new_bbs);
-   free (bbs);
- 
- 
-   *new_loop_p = new_loop;
-   return true;
- 
  }
  
  /* Function vectorize_loops.
--- 3723,3728 ----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]