This removes the non-SLP paths from vectorizable_conversion and  in the process 
eliminates uses of 'ncopies' and removes 'get_initial_def_for_reduction'.  Not 
done anything about STMT_VINFO_VECTYPE as I'm not sure about its uses in 
vectorizable_reduction in relation to the vectype_in/out.
---
 gcc/tree-vect-loop.cc  | 127 +++++++----------------------------------
 gcc/tree-vect-stmts.cc |   4 +-
 gcc/tree-vectorizer.h  |   5 +-
 3 files changed, 25 insertions(+), 111 deletions(-)

diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 4ab7d227e42..c47ebc564c7 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -5470,76 +5470,6 @@ vect_emit_reduction_init_stmts (loop_vec_info loop_vinfo,
     }
 }
 
-/* Function get_initial_def_for_reduction
-
-   Input:
-   REDUC_INFO - the info_for_reduction
-   INIT_VAL - the initial value of the reduction variable
-   NEUTRAL_OP - a value that has no effect on the reduction, as per
-		neutral_op_for_reduction
-
-   Output:
-   Return a vector variable, initialized according to the operation that
-	STMT_VINFO performs. This vector will be used as the initial value
-	of the vector of partial results.
-
-   The value we need is a vector in which element 0 has value INIT_VAL
-   and every other element has value NEUTRAL_OP.  */
-
-static tree
-get_initial_def_for_reduction (loop_vec_info loop_vinfo,
-			       stmt_vec_info reduc_info,
-			       tree init_val, tree neutral_op)
-{
-  class loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
-  tree scalar_type = TREE_TYPE (init_val);
-  tree vectype = get_vectype_for_scalar_type (loop_vinfo, scalar_type);
-  tree init_def;
-  gimple_seq stmts = NULL;
-
-  gcc_assert (vectype);
-
-  gcc_assert (POINTER_TYPE_P (scalar_type) || INTEGRAL_TYPE_P (scalar_type)
-	      || SCALAR_FLOAT_TYPE_P (scalar_type));
-
-  gcc_assert (nested_in_vect_loop_p (loop, reduc_info)
-	      || loop == (gimple_bb (reduc_info->stmt))->loop_father);
-
-  if (operand_equal_p (init_val, neutral_op))
-    {
-      /* If both elements are equal then the vector described above is
-	 just a splat.  */
-      neutral_op = gimple_convert (&stmts, TREE_TYPE (vectype), neutral_op);
-      init_def = gimple_build_vector_from_val (&stmts, vectype, neutral_op);
-    }
-  else
-    {
-      neutral_op = gimple_convert (&stmts, TREE_TYPE (vectype), neutral_op);
-      init_val = gimple_convert (&stmts, TREE_TYPE (vectype), init_val);
-      if (!TYPE_VECTOR_SUBPARTS (vectype).is_constant ())
-	{
-	  /* Construct a splat of NEUTRAL_OP and insert INIT_VAL into
-	     element 0.  */
-	  init_def = gimple_build_vector_from_val (&stmts, vectype,
-						   neutral_op);
-	  init_def = gimple_build (&stmts, CFN_VEC_SHL_INSERT,
-				   vectype, init_def, init_val);
-	}
-      else
-	{
-	  /* Build {INIT_VAL, NEUTRAL_OP, NEUTRAL_OP, ...}.  */
-	  tree_vector_builder elts (vectype, 1, 2);
-	  elts.quick_push (init_val);
-	  elts.quick_push (neutral_op);
-	  init_def = gimple_build_vector (&stmts, &elts);
-	}
-    }
-
-  if (stmts)
-    vect_emit_reduction_init_stmts (loop_vinfo, reduc_info, stmts);
-  return init_def;
-}
-
 /* Get at the initial defs for the reduction PHIs for REDUC_INFO,
    which performs a reduction involving GROUP_SIZE scalar statements.
    NUMBER_OF_VECTORS is the number of vector defs to create.  If NEUTRAL_OP
@@ -5981,7 +5911,7 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo,
   auto_vec<tree> reduc_inputs;
   int j, i;
   vec<tree> &scalar_results = reduc_info->reduc_scalar_results;
-  unsigned int group_size = 1, k;
+  unsigned int group_size, k;
   /* SLP reduction without reduction chain, e.g.,
      # a1 = phi <a2, a0>
      # b1 = phi <b2, b0>
@@ -6024,7 +5954,6 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo,
 
   unsigned vec_num
     = SLP_TREE_VEC_DEFS (slp_node_instance->reduc_phis).length ();
-  int ncopies = 1;
 
   /* For cond reductions we want to create a new vector (INDEX_COND_EXPR)
      which is updated with the current index of the loop for every match of
@@ -6175,11 +6104,11 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo,
     {
       gimple_seq stmts = NULL;
       def = vect_get_slp_vect_def (slp_node, i);
-      for (j = 0; j < ncopies; j++)
+      for (j = 0; j < 1; j++)
 	{
 	  tree new_def = copy_ssa_name (def);
 	  phi = create_phi_node (new_def, exit_bb);
-	  if (j)
+	  if (0)
 	    def = gimple_get_lhs (STMT_VINFO_VEC_STMTS (rdef_info)[j]);
 	  if (LOOP_VINFO_IV_EXIT (loop_vinfo) == loop_exit)
 	    SET_PHI_ARG_DEF (phi, loop_exit->dest_idx, def);
@@ -6246,8 +6175,7 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo,
   if (REDUC_GROUP_FIRST_ELEMENT (STMT_VINFO_REDUC_DEF (reduc_info))
       || direct_slp_reduc
       || (slp_reduc
-	  && constant_multiple_p (TYPE_VECTOR_SUBPARTS (vectype), group_size))
-      || ncopies > 1)
+	  && constant_multiple_p (TYPE_VECTOR_SUBPARTS (vectype), group_size)))
     {
       gimple_seq stmts = NULL;
       tree single_input = reduc_inputs[0];
@@ -7050,10 +6978,10 @@ static bool
 vectorize_fold_left_reduction (loop_vec_info loop_vinfo,
 			       stmt_vec_info stmt_info,
 			       gimple_stmt_iterator *gsi,
-			       gimple **vec_stmt, slp_tree slp_node,
+			       slp_tree slp_node,
 			       gimple *reduc_def_stmt,
 			       code_helper code, internal_fn reduc_fn,
-			       tree *ops, int num_ops, tree vectype_in,
+			       int num_ops, tree vectype_in,
 			       int reduc_index, vec_loop_masks *masks,
 			       vec_loop_lens *lens)
 {
@@ -7061,10 +6989,7 @@ vectorize_fold_left_reduction (loop_vec_info loop_vinfo,
   tree vectype_out = STMT_VINFO_VECTYPE (stmt_info);
   internal_fn mask_reduc_fn = get_masked_reduction_fn (reduc_fn, vectype_in);
 
-  int ncopies = 1;
-
   gcc_assert (!nested_in_vect_loop_p (loop, stmt_info));
-  gcc_assert (ncopies == 1);
 
   bool is_cond_op = false;
   if (!code.is_tree_code ())
@@ -7102,7 +7027,6 @@ vectorize_fold_left_reduction (loop_vec_info loop_vinfo,
   tree reduc_var = gimple_phi_result (reduc_def_stmt);
 
   int vec_num = vec_oprnds0.length ();
-  gcc_assert (vec_num == 1);
   tree vec_elem_type = TREE_TYPE (vectype_out);
   gcc_checking_assert (useless_type_conversion_p (scalar_type, vec_elem_type));
 
@@ -8543,11 +8467,10 @@ vect_emulate_mixed_dot_prod (loop_vec_info loop_vinfo, stmt_vec_info stmt_info,
 bool
 vect_transform_reduction (loop_vec_info loop_vinfo,
 			  stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
-			  gimple **vec_stmt, slp_tree slp_node)
+			  slp_tree slp_node)
 {
   tree vectype_out = STMT_VINFO_VECTYPE (stmt_info);
   class loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
-  unsigned ncopies;
   unsigned vec_num;
 
   stmt_vec_info reduc_info = info_for_reduction (loop_vinfo, stmt_info);
@@ -8575,7 +8498,6 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
   if (!vectype_in)
     vectype_in = STMT_VINFO_VECTYPE (stmt_info);
 
-  ncopies = 1;
   vec_num = vect_get_num_copies (loop_vinfo, slp_node, vectype_in);
 
   code_helper code = canonicalize_code (op.code, op.type);
@@ -8592,10 +8514,6 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
   if (dump_enabled_p ())
     dump_printf_loc (MSG_NOTE, vect_location, "transform reduction.\n");
 
-  /* FORNOW: Multiple types are not supported for condition.  */
-  if (code == COND_EXPR)
-    gcc_assert (ncopies == 1);
-
   /* A binary COND_OP reduction must have the same definition and else
      value. */
   bool cond_fn_p = code.is_internal_fn ()
@@ -8619,8 +8537,8 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
       internal_fn reduc_fn = STMT_VINFO_REDUC_FN (reduc_info);
       gcc_assert (code.is_tree_code () || cond_fn_p);
       return vectorize_fold_left_reduction
-	  (loop_vinfo, stmt_info, gsi, vec_stmt, slp_node, reduc_def_phi,
-	   code, reduc_fn, op.ops, op.num_ops, vectype_in,
+	  (loop_vinfo, stmt_info, gsi, slp_node, reduc_def_phi,
+	   code, reduc_fn, op.num_ops, vectype_in,
 	   reduc_index, masks, lens);
     }
 
@@ -8643,7 +8561,7 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
   if (!cond_fn_p)
     {
       gcc_assert (reduc_index >= 0 && reduc_index <= 2);
-      vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, ncopies,
+      vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, 1,
 			 single_defuse_cycle && reduc_index == 0
 			 ? NULL_TREE : op.ops[0], &vec_oprnds[0],
 			 single_defuse_cycle && reduc_index == 1
@@ -8658,7 +8576,7 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
 	 vectype.  */
       gcc_assert (single_defuse_cycle
 		  && (reduc_index == 1 || reduc_index == 2));
-      vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, ncopies, op.ops[0],
+      vect_get_vec_defs (loop_vinfo, stmt_info, slp_node, 1, op.ops[0],
 			 truth_type_for (vectype_in), &vec_oprnds[0],
 			 reduc_index == 1 ? NULL_TREE : op.ops[1],
 			 NULL_TREE, &vec_oprnds[1],
@@ -8838,7 +8756,7 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
 	      std::swap (vop[0], vop[1]);
 	    }
 	  tree mask = vect_get_loop_mask (loop_vinfo, gsi, masks,
-					  vec_num * ncopies, vectype_in,
+					  vec_num, vectype_in,
 					  mask_index++);
 	  gcall *call = gimple_build_call_internal (cond_fn, 4, mask,
 						    vop[0], vop[1], vop[0]);
@@ -8856,7 +8774,7 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
 	  if (masked_loop_p && mask_by_cond_expr)
 	    {
 	      tree mask = vect_get_loop_mask (loop_vinfo, gsi, masks,
-					      vec_num * ncopies, vectype_in,
+					      vec_num, vectype_in,
 					      mask_index++);
 	      build_vect_cond_expr (code, vop, mask, gsi);
 	    }
@@ -8895,13 +8813,12 @@ vect_transform_reduction (loop_vec_info loop_vinfo,
 
 bool
 vect_transform_cycle_phi (loop_vec_info loop_vinfo,
-			  stmt_vec_info stmt_info, gimple **vec_stmt,
+			  stmt_vec_info stmt_info,
 			  slp_tree slp_node, slp_instance slp_node_instance)
 {
   tree vectype_out = STMT_VINFO_VECTYPE (stmt_info);
   class loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
   int i;
-  int ncopies;
   int j;
   bool nested_cycle = false;
   int vec_num;
@@ -8923,15 +8840,11 @@ vect_transform_cycle_phi (loop_vec_info loop_vinfo,
     return true;
 
   vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
-  ncopies = 1;
 
   /* Check whether we should use a single PHI node and accumulate
      vectors to one before the backedge.  */
   if (STMT_VINFO_FORCE_SINGLE_CYCLE (reduc_info))
-    {
-      ncopies = 1;
-      vec_num = 1;
-    }
+    vec_num = 1;
 
   /* Create the destination vector  */
   gphi *phi = as_a <gphi *> (stmt_info->stmt);
@@ -9019,8 +8932,8 @@ vect_transform_cycle_phi (loop_vec_info loop_vinfo,
 
   if (vec_initial_def)
     {
-      vec_initial_defs.create (ncopies);
-      for (i = 0; i < ncopies; ++i)
+      vec_initial_defs.create (1);
+      for (i = 0; i < 1; ++i)
 	vec_initial_defs.quick_push (vec_initial_def);
     }
 
@@ -9096,7 +9009,7 @@ vect_transform_cycle_phi (loop_vec_info loop_vinfo,
   for (i = 0; i < vec_num; i++)
     {
       tree vec_init_def = vec_initial_defs[i];
-      for (j = 0; j < ncopies; j++)
+      for (j = 0; j < 1; j++)
 	{
 	  /* Create the reduction-phi that defines the reduction
 	     operand.  */
@@ -11974,7 +11887,9 @@ update_epilogue_loop_vinfo (class loop *epilogue, tree advance)
 	      stmt_worklist.safe_push (stmt);
 	      /* Set BB such that the assert in
 		'get_initial_def_for_reduction' is able to determine that
-		the BB of the related stmt is inside this loop.  */
+		the BB of the related stmt is inside this loop.
+		TODO: Do we still need this now that
+		'get_initial_def_for_reduction' has been removed?  */
 	      gimple_set_bb (stmt,
 			     gimple_bb (new_stmt));
 	      related_vinfo = STMT_VINFO_RELATED_STMT (related_vinfo);
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 38612a16619..e99a1df2c96 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -14223,13 +14223,13 @@ vect_transform_stmt (vec_info *vinfo,
 
     case reduc_vec_info_type:
       done = vect_transform_reduction (as_a <loop_vec_info> (vinfo), stmt_info,
-				       gsi, &vec_stmt, slp_node);
+				       gsi, slp_node);
       gcc_assert (done);
       break;
 
     case cycle_phi_info_type:
       done = vect_transform_cycle_phi (as_a <loop_vec_info> (vinfo), stmt_info,
-				       &vec_stmt, slp_node, slp_node_instance);
+				       slp_node, slp_node_instance);
       gcc_assert (done);
       break;
 
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 01d19c77656..9f6ca01fd2a 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -2607,12 +2607,11 @@ extern bool vectorizable_induction (loop_vec_info, stmt_vec_info,
 				    stmt_vector_for_cost *);
 extern bool vect_transform_reduction (loop_vec_info, stmt_vec_info,
 				      gimple_stmt_iterator *,
-				      gimple **, slp_tree);
+				      slp_tree);
 extern bool vect_transform_cycle_phi (loop_vec_info, stmt_vec_info,
-				      gimple **,
 				      slp_tree, slp_instance);
 extern bool vectorizable_lc_phi (loop_vec_info, stmt_vec_info,
-				 gimple **, slp_tree);
+				 gimple**, slp_tree);
 extern bool vectorizable_phi (vec_info *, stmt_vec_info, gimple **, slp_tree,
 			      stmt_vector_for_cost *);
 extern bool vectorizable_recurr (loop_vec_info, stmt_vec_info,

Reply via email to