[gcc r17-2982] Simplify vect_get_vec_defs API

Richard Biener via Gcc-cvs <[email protected]> Wed, 5 Aug 2026 12:48:06 +0000 (GMT)
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:28f2250ad1d37f49edb0efd1d88e3877257ab4a1

commit r17-2982-g28f2250ad1d37f49edb0efd1d88e3877257ab4a1
Author: Richard Biener <[email protected]>
Date:   Wed Aug 5 13:28:39 2026 +0200

    Simplify vect_get_vec_defs API
    
    The folowing simplifies vect_get_vec_defs to take a bool instead of
    a tree argument to indicate whether to fill the vector definitions
    vector for an operand.  This is a tiny step to avoid accessing
    scalar operands determined by vect_is_simple_use.  It also cleans
    up code a bit.
    
            * tree-vectorizer.h (vect_get_vec_defs): Adjust to take
            bool instead of tree arguments.
            * tree-vect-stmts.cc (vect_get_vec_defs): Likewise.
            (vectorizable_bswap): Simplify.
            (vectorizable_conversion): Likewise.
            (vectorizable_assignment): Likewise.
            (vectorizable_shift): Likewise.
            (vectorizable_operation): Likewise.
            (vectorizable_condition): Likewise.
            (vectorizable_comparison_1): Likewise.
            * tree-vect-loop.cc (vect_transform_lc_phi): Likewise.

Diff:
---
 gcc/tree-vect-loop.cc  |  3 +--
 gcc/tree-vect-stmts.cc | 52 +++++++++++++++++++-------------------------------
 gcc/tree-vectorizer.h  |  8 ++++----
 3 files changed, 25 insertions(+), 38 deletions(-)

diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 31de29c036be..0a09ce8bd85c 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -8557,8 +8557,7 @@ vect_transform_lc_phi (loop_vec_info loop_vinfo,
   edge e = single_pred_edge (bb);
   tree vec_dest = vect_create_destination_var (scalar_dest, vectype);
   auto_vec<tree> vec_oprnds;
-  vect_get_vec_defs (loop_vinfo, slp_node,
-		     gimple_phi_arg_def (stmt_info->stmt, 0), &vec_oprnds);
+  vect_get_vec_defs (loop_vinfo, slp_node, true, &vec_oprnds);
   for (unsigned i = 0; i < vec_oprnds.length (); i++)
     {
       /* Create the vectorized LC PHI node.  */
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index c5a86d3a1a43..a4937de4e8e5 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -1243,10 +1243,10 @@ vect_init_vector (vec_info *vinfo, stmt_vec_info stmt_info, tree val, tree type,
 
 void
 vect_get_vec_defs (vec_info *, slp_tree slp_node,
-		   tree op0, vec<tree> *vec_oprnds0,
-		   tree op1, vec<tree> *vec_oprnds1,
-		   tree op2, vec<tree> *vec_oprnds2,
-		   tree op3, vec<tree> *vec_oprnds3)
+		   bool op0, vec<tree> *vec_oprnds0,
+		   bool op1, vec<tree> *vec_oprnds1,
+		   bool op2, vec<tree> *vec_oprnds2,
+		   bool op3, vec<tree> *vec_oprnds3)
 {
   if (op0)
     vect_get_slp_defs (SLP_TREE_CHILDREN (slp_node)[0], vec_oprnds0);
@@ -3286,11 +3286,7 @@ vectorizable_bswap (vec_info *vinfo,
 		    slp_tree *slp_op,
 		    tree vectype_in, stmt_vector_for_cost *cost_vec)
 {
-  tree op, vectype;
-  gcall *stmt = as_a <gcall *> (stmt_info->stmt);
-
-  op = gimple_call_arg (stmt, 0);
-  vectype = SLP_TREE_VECTYPE (slp_node);
+  tree vectype = SLP_TREE_VECTYPE (slp_node);
   poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype);
 
   if (TYPE_SIZE (vectype_in) != TYPE_SIZE (vectype))
@@ -3346,7 +3342,7 @@ vectorizable_bswap (vec_info *vinfo,
 
   /* Transform.  */
   vec<tree> vec_oprnds = vNULL;
-  vect_get_vec_defs (vinfo, slp_node, op, &vec_oprnds);
+  vect_get_vec_defs (vinfo, slp_node, true, &vec_oprnds);
   /* Arguments are ready. create the new vector stmt.  */
   unsigned i;
   tree vop;
@@ -5772,7 +5768,7 @@ vectorizable_conversion (vec_info *vinfo,
   switch (modifier)
     {
     case NONE:
-      vect_get_vec_defs (vinfo, slp_node, op0, &vec_oprnds0);
+      vect_get_vec_defs (vinfo, slp_node, true, &vec_oprnds0);
       /* vec_dest is intermediate type operand when multi_step_cvt.  */
       if (multi_step_cvt)
 	{
@@ -5807,9 +5803,8 @@ vectorizable_conversion (vec_info *vinfo,
 	 of elements that we can fit in a vectype (nunits), we have to
 	 generate more than one vector stmt - i.e - we need to "unroll"
 	 the vector stmt by a factor VF/nunits.  */
-      vect_get_vec_defs (vinfo, slp_node, op0, &vec_oprnds0,
-			 code == WIDEN_LSHIFT_EXPR ? NULL_TREE : op1,
-			 &vec_oprnds1);
+      vect_get_vec_defs (vinfo, slp_node, true, &vec_oprnds0,
+			 code != WIDEN_LSHIFT_EXPR && slp_op1, &vec_oprnds1);
       if (code == WIDEN_LSHIFT_EXPR)
 	{
 	  int oprnds_size = vec_oprnds0.length ();
@@ -5860,7 +5855,7 @@ vectorizable_conversion (vec_info *vinfo,
 	 of elements that we can fit in a vectype (nunits), we have to
 	 generate more than one vector stmt - i.e - we need to "unroll"
 	 the vector stmt by a factor VF/nunits.  */
-      vect_get_vec_defs (vinfo, slp_node, op0, &vec_oprnds0);
+      vect_get_vec_defs (vinfo, slp_node, true, &vec_oprnds0);
       /* Arguments are ready.  Create the new vector stmts.  */
       if (cvt_type && modifier == NARROW_DST)
 	FOR_EACH_VEC_ELT (vec_oprnds0, i, vop0)
@@ -6065,7 +6060,7 @@ vectorizable_assignment (vec_info *vinfo,
   vec_dest = vect_create_destination_var (scalar_dest, vectype);
 
   /* Handle use.  */
-  vect_get_vec_defs (vinfo, slp_node, op, &vec_oprnds);
+  vect_get_vec_defs (vinfo, slp_node, true, &vec_oprnds);
 
   /* Arguments are ready. create the new vector stmt.  */
   FOR_EACH_VEC_ELT (vec_oprnds, i, vop)
@@ -6469,8 +6464,7 @@ vectorizable_shift (vec_info *vinfo,
      (a special case for certain kind of vector shifts); otherwise,
      operand 1 should be of a vector type (the usual case).  */
   vect_get_vec_defs (vinfo, slp_node,
-		     op0, &vec_oprnds0,
-		     vec_oprnd1 ? NULL_TREE : op1, &vec_oprnds1);
+		     true, &vec_oprnds0, !vec_oprnd1, &vec_oprnds1);
 
   /* Arguments are ready.  Create the new vector stmt.  */
   FOR_EACH_VEC_ELT (vec_oprnds0, i, vop0)
@@ -6897,8 +6891,8 @@ vectorizable_operation (vec_info *vinfo,
   else
     vec_dest = vect_create_destination_var (scalar_dest, vectype_out);
 
-  vect_get_vec_defs (vinfo, slp_node,
-		     op0, &vec_oprnds0, op1, &vec_oprnds1, op2, &vec_oprnds2);
+  vect_get_vec_defs (vinfo, slp_node, true, &vec_oprnds0,
+		     slp_op1, &vec_oprnds1, slp_op2, &vec_oprnds2);
   /* Arguments are ready.  Create the new vector stmt.  */
   FOR_EACH_VEC_ELT (vec_oprnds0, i, vop0)
     {
@@ -12420,18 +12414,12 @@ vectorizable_condition (vec_info *vinfo,
 
   /* Handle cond expr.  */
   if (masked)
-    vect_get_vec_defs (vinfo, slp_node,
-		       cond_expr, &vec_oprnds0,
-		       then_clause, &vec_oprnds2,
-		       reduction_type != EXTRACT_LAST_REDUCTION
-		       ? else_clause : NULL, &vec_oprnds3);
+    vect_get_vec_defs (vinfo, slp_node, true, &vec_oprnds0, true, &vec_oprnds2,
+		       reduction_type != EXTRACT_LAST_REDUCTION, &vec_oprnds3);
   else
-    vect_get_vec_defs (vinfo, slp_node,
-		       cond_expr0, &vec_oprnds0,
-		       cond_expr1, &vec_oprnds1,
-		       then_clause, &vec_oprnds2,
-		       reduction_type != EXTRACT_LAST_REDUCTION
-		       ? else_clause : NULL, &vec_oprnds3);
+    vect_get_vec_defs (vinfo, slp_node, true, &vec_oprnds0, true, &vec_oprnds1,
+		       true, &vec_oprnds2,
+		       reduction_type != EXTRACT_LAST_REDUCTION, &vec_oprnds3);
 
   if (reduction_type == EXTRACT_LAST_REDUCTION)
     vec_else_clause = else_clause;
@@ -12785,7 +12773,7 @@ vectorizable_comparison_1 (vec_info *vinfo, tree vectype,
   if (lhs)
     mask = vect_create_destination_var (lhs, mask_type);
 
-  vect_get_vec_defs (vinfo, slp_node, rhs1, &vec_oprnds0, rhs2, &vec_oprnds1);
+  vect_get_vec_defs (vinfo, slp_node, true, &vec_oprnds0, true, &vec_oprnds1);
   if (swap_p)
     std::swap (vec_oprnds0, vec_oprnds1);
 
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 94ef81383f42..54798649da7b 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -2590,10 +2590,10 @@ extern void vect_finish_stmt_generation (vec_info *, stmt_vec_info, gimple *,
 extern opt_result vect_mark_stmts_to_be_vectorized (loop_vec_info, bool *);
 extern tree vect_get_store_rhs (stmt_vec_info);
 void vect_get_vec_defs (vec_info *, slp_tree,
-			tree, vec<tree> *,
-			tree = NULL, vec<tree> * = NULL,
-			tree = NULL, vec<tree> * = NULL,
-			tree = NULL, vec<tree> * = NULL);
+			bool, vec<tree> *,
+			bool = false, vec<tree> * = NULL,
+			bool = false, vec<tree> * = NULL,
+			bool = false, vec<tree> * = NULL);
 extern tree vect_init_vector (vec_info *, stmt_vec_info, tree, tree,
                               gimple_stmt_iterator *);
 extern tree vect_get_slp_vect_def (slp_tree, unsigned);