From 429268fc04441a4a6e31bc9e3c303a8f355f7c43 Mon Sep 17 00:00:00 2001
From: Dorit Nuzman <dorit@il.ibm.com>
Date: Sun, 21 Aug 2005 06:38:27 +0000
Subject: [PATCH] tree-vect-transform.c (get_initial_def_for_reduction): Set
 need_epilog_adjust back to false for MIN/MAX case.

        * tree-vect-transform.c (get_initial_def_for_reduction): Set
        need_epilog_adjust back to false for MIN/MAX case. Set *scalar_def to
        NULL if need_epilog_adjust is false.
        (vect_create_epilog_for_reduction): Variable adjust_in_epilog removed.
        Case 3 always peels first itration, not just for PLUS case, and no need
        to use scalar_initial_def here. Create an epilog adjustment only if
        scalar_initial_def is not NULL.

        (vectorizable_reduction): Remove assert.

From-SVN: r103314
---
 gcc/ChangeLog             | 12 ++++++++
 gcc/tree-vect-transform.c | 63 +++++++++++++--------------------------
 2 files changed, 33 insertions(+), 42 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 122fa33b0b0c..29c53163ef6e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2005-08-21  Dorit Nuzman  <dorit@il.ibm.com>
+
+	* tree-vect-transform.c (get_initial_def_for_reduction): Set
+	need_epilog_adjust back to false for MIN/MAX case. Set *scalar_def to
+	NULL if need_epilog_adjust is false.
+	(vect_create_epilog_for_reduction): Variable adjust_in_epilog removed.
+	Case 3 always peels first itration, not just for PLUS case, and no need
+	to use scalar_initial_def here. Create an epilog adjustment only if
+	scalar_initial_def is not NULL.
+
+	(vectorizable_reduction): Remove assert. 
+
 2005-08-20  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR target/23485
diff --git a/gcc/tree-vect-transform.c b/gcc/tree-vect-transform.c
index be5b77943649..7c247b1cd246 100644
--- a/gcc/tree-vect-transform.c
+++ b/gcc/tree-vect-transform.c
@@ -751,7 +751,7 @@ get_initial_def_for_reduction (tree stmt, tree init_val, tree *scalar_def)
   case MAX_EXPR:
     def = init_val;
     nelements = nunits;
-    need_epilog_adjust = true;
+    need_epilog_adjust = false;
     break;
 
   default:
@@ -775,13 +775,9 @@ get_initial_def_for_reduction (tree stmt, tree init_val, tree *scalar_def)
     vec = build_constructor_from_list (vectype, t);
     
   if (!need_epilog_adjust)
-    {
-      if (INTEGRAL_TYPE_P (type))
-	init_val = build_int_cst (type, 0);
-      else
-	init_val = build_real (type, dconst0);
-    }
-  *scalar_def = init_val;
+    *scalar_def = NULL_TREE;
+  else
+    *scalar_def = init_val;
 
   return vect_init_vector (stmt, vec);
 }
@@ -862,7 +858,6 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
   imm_use_iterator imm_iter;
   use_operand_p use_p;
   bool extract_scalar_result;
-  bool adjust_in_epilog;
   
   /*** 1. Create the reduction def-use cycle  ***/
   
@@ -921,7 +916,6 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
       bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
 
       extract_scalar_result = true;
-      adjust_in_epilog = true;
     }
   else
     {
@@ -997,13 +991,15 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
 	    }
 
 	  extract_scalar_result = true;
-	  adjust_in_epilog = true;
 	}
       else
         {
+	  tree rhs;
+
 	  /*** Case 3:
-	     Create:  s = init; 
-	     for (offset=0; offset<vector_size; offset+=element_size;)
+	     Create:  
+	     s = extract_field <v_out2, 0>
+	     for (offset=element_size; offset<vector_size; offset+=element_size;)
 	       {
 	         Create:  s' = extract_field <v_out2, offset>
 	         Create:  s = op <s, s'>
@@ -1015,33 +1011,19 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
 	  vec_temp = PHI_RESULT (new_phi);
 	  vec_size_in_bits = tree_low_cst (TYPE_SIZE (vectype), 1);
 
-	  /* first iteration is peeled out when possible to minimize
-	     the number of operations we generate:  */
-	  if (code == PLUS_EXPR 
-	     && (integer_zerop (scalar_initial_def) 
-		 || real_zerop (scalar_initial_def)))
-	    {
-	      tree rhs = build3 (BIT_FIELD_REF, scalar_type, vec_temp, bitsize,
-				 bitsize_zero_node);
+	  rhs = build3 (BIT_FIELD_REF, scalar_type, vec_temp, bitsize,
+			 bitsize_zero_node);
 
-	      BIT_FIELD_REF_UNSIGNED (rhs) = TYPE_UNSIGNED (scalar_type);
-	      epilog_stmt = build2 (MODIFY_EXPR, scalar_type, new_scalar_dest, 
-				    rhs);
-              new_temp = make_ssa_name (new_scalar_dest, epilog_stmt);
-              TREE_OPERAND (epilog_stmt, 0) = new_temp;
-              bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
-              if (vect_print_dump_info (REPORT_DETAILS))
-                print_generic_expr (vect_dump, epilog_stmt, TDF_SLIM);
+	  BIT_FIELD_REF_UNSIGNED (rhs) = TYPE_UNSIGNED (scalar_type);
+	  epilog_stmt = build2 (MODIFY_EXPR, scalar_type, new_scalar_dest, 
+			        rhs);
+	  new_temp = make_ssa_name (new_scalar_dest, epilog_stmt);
+	  TREE_OPERAND (epilog_stmt, 0) = new_temp;
+	  bsi_insert_after (&exit_bsi, epilog_stmt, BSI_NEW_STMT);
+	  if (vect_print_dump_info (REPORT_DETAILS))
+	    print_generic_expr (vect_dump, epilog_stmt, TDF_SLIM);
 	      
-	      bit_offset = element_bitsize;
-	    }
-	  else
-	    {
-	      new_temp = scalar_initial_def;
-	      bit_offset = 0;
-	    }
-
-	  for (;
+	  for (bit_offset = element_bitsize;
 	       bit_offset < vec_size_in_bits;
 	       bit_offset += element_bitsize)
 	    { 
@@ -1069,7 +1051,6 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
 	    }
 
 	  extract_scalar_result = false;
-	  adjust_in_epilog = false;
 	}
     }
 
@@ -1110,7 +1091,7 @@ vect_create_epilog_for_reduction (tree vect_def, tree stmt, tree reduction_op,
 	 Create: 
 	 s_out = scalar_expr <s_out, scalar_initial_def>  */
   
-  if (adjust_in_epilog)
+  if (scalar_initial_def)
     {
       epilog_stmt = build2 (MODIFY_EXPR, scalar_type, new_scalar_dest,
                       build2 (code, scalar_type, new_temp, scalar_initial_def));
@@ -1291,8 +1272,6 @@ vectorizable_reduction (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
 
   /* Prepare the operand that is defined inside the loop body  */
   loop_vec_def = vect_get_vec_def_for_operand (op0, stmt, NULL);
-  gcc_assert (VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (loop_vec_def))));
-
 
   /* Create the vectorized operation that computes the partial results  */
   *vec_stmt = build2 (MODIFY_EXPR, vectype, vec_dest,
-- 
GitLab