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]

Cleanup for linear transform: use standard_iv_increment_position


Hello,

The following patch for mainline rewrites a part of the code in linear
loop transform for using standard_iv_increment_position.

Bootstrapped and tested on i686.

	* lambda-code.c (lambda_loopnest_to_gcc_loopnest, perfect_nestify): 
	Use standard_iv_increment_position for computing the bsi position
	for create_iv.
	* tree-ssa-loop-manip.c (standard_iv_increment_position): Ensure 
	that the statement is not inserted after a condition expression: 
	i.e. the inserted code should not be the last statement in a
	basic block.

Index: lambda-code.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/lambda-code.c,v
retrieving revision 2.23
diff -d -u -p -r2.23 lambda-code.c
--- lambda-code.c	19 Dec 2004 19:00:35 -0000	2.23
+++ lambda-code.c	31 Jan 2005 18:31:44 -0000
@@ -1873,6 +1873,7 @@ lambda_loopnest_to_gcc_loopnest (struct 
       tree newupperbound, newlowerbound;
       lambda_linear_expression offset;
       tree type;
+      bool insert_after;
 
       oldiv = VEC_index (tree, old_ivs, i);
       type = TREE_TYPE (oldiv);
@@ -1915,14 +1916,12 @@ lambda_loopnest_to_gcc_loopnest (struct 
       bsi = bsi_start (bb);
       bsi_insert_after (&bsi, stmts, BSI_NEW_STMT);
 
-      /* Create the new iv, and insert it's increment on the latch
-         block.  */
+      /* Create the new iv.  */
 
-      bb = EDGE_PRED (temp->latch, 0)->src;
-      bsi = bsi_last (bb);
+      standard_iv_increment_position (temp, &bsi, &insert_after);
       create_iv (newlowerbound,
 		 build_int_cst (type, LL_STEP (newloop)),
-		 ivvar, temp, &bsi, false, &ivvar,
+		 ivvar, temp, &bsi, insert_after, &ivvar,
 		 &ivvarinced);
 
       /* Replace the exit condition with the new upper bound
@@ -2297,6 +2296,7 @@ perfect_nestify (struct loops *loops,
   basic_block preheaderbb, headerbb, bodybb, latchbb, olddest;
   size_t i;
   block_stmt_iterator bsi;
+  bool insert_after;
   edge e;
   struct loop *newloop;
   tree phi;
@@ -2377,10 +2377,10 @@ perfect_nestify (struct loops *loops,
   /* Create the new iv.  */
   ivvar = create_tmp_var (integer_type_node, "perfectiv");
   add_referenced_tmp_var (ivvar);
-  bsi = bsi_last (EDGE_PRED (newloop->latch, 0)->src);
+  standard_iv_increment_position (newloop, &bsi, &insert_after);
   create_iv (VEC_index (tree, lbounds, 0),
 	     build_int_cst (integer_type_node, VEC_index (int, steps, 0)),
-	     ivvar, newloop, &bsi, false, &ivvar, &ivvarinced);	     
+	     ivvar, newloop, &bsi, insert_after, &ivvar, &ivvarinced);	     
 
   /* Create the new upper bound.  This may be not just a variable, so we copy
      it to one just in case.  */
@@ -2392,7 +2392,12 @@ perfect_nestify (struct loops *loops,
 		VEC_index (tree, ubounds, 0));
   uboundvar = make_ssa_name (uboundvar, stmt);
   TREE_OPERAND (stmt, 0) = uboundvar;
-  bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
+
+  if (insert_after)
+    bsi_insert_after (&bsi, stmt, BSI_SAME_STMT);
+  else
+    bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
+
   COND_EXPR_COND (exit_condition) = build (GE_EXPR, 
 					   boolean_type_node,
 					   uboundvar,
Index: tree-ssa-loop-manip.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-loop-manip.c,v
retrieving revision 2.21
diff -d -u -p -r2.21 tree-ssa-loop-manip.c
--- tree-ssa-loop-manip.c	29 Nov 2004 17:53:47 -0000	2.21
+++ tree-ssa-loop-manip.c	31 Jan 2005 18:31:44 -0000
@@ -41,7 +41,8 @@ Software Foundation, 59 Temple Place - S
    It is expected that neither BASE nor STEP are shared with other expressions
    (unless the sharing rules allow this).  Use VAR as a base var_decl for it
    (if NULL, a new temporary will be created).  The increment will occur at
-   INCR_POS (after it if AFTER is true, before it otherwise).  The ssa versions
+   INCR_POS (after it if AFTER is true, before it otherwise).  INCR_POS and 
+   AFTER can be computed using standard_iv_increment_position.  The ssa versions
    of the variable before and after increment will be stored in VAR_BEFORE and
    VAR_AFTER (unless they are NULL).  */
 
@@ -504,7 +505,7 @@ standard_iv_increment_position (struct l
       || (last && TREE_CODE (last) != LABEL_EXPR))
     {
       *bsi = bsi_last (latch);
-      *insert_after = true;
+      *insert_after = !last || !stmt_ends_bb_p (last);
     }
   else
     {


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