https://gcc.gnu.org/g:b207d9d1836ea1d3bffea10dca4fe662fd9dcc4a

commit r16-5548-gb207d9d1836ea1d3bffea10dca4fe662fd9dcc4a
Author: Richard Biener <[email protected]>
Date:   Sun Nov 23 13:57:47 2025 +0100

    Move SIMD clone rejections to SIMD clone selection
    
    The following moves checks we used to reject SIMD clone vectorization
    to selection of the SIMD clone.  It also removes unnecessary
    restrictions on constant/external defs, vector types are already
    determined and constraints should be not special here.
    
            * tree-vect-stmts.cc (vectorizable_simd_clone_call): Move
            all SIMD clone validity checks to SIMD clone selection.
            Remove late constant/external def vector type setting and
            verification.

Diff:
---
 gcc/tree-vect-stmts.cc | 118 ++++++++++++-------------------------------------
 1 file changed, 29 insertions(+), 89 deletions(-)

diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 4a397cc1142e..a18772f5928e 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -4262,10 +4262,13 @@ vectorizable_simd_clone_call (vec_info *vinfo, 
stmt_vec_info stmt_info,
            switch (n->simdclone->args[i].arg_type)
              {
              case SIMD_CLONE_ARG_TYPE_VECTOR:
-               if (!useless_type_conversion_p
-                       (n->simdclone->args[i].orig_type,
-                        TREE_TYPE (gimple_call_arg (stmt,
-                                                    i + masked_call_offset))))
+               if (VECTOR_BOOLEAN_TYPE_P (n->simdclone->args[i].vector_type))
+                 /* Vector mask arguments are not supported.  */
+                 i = -1;
+               else if (!useless_type_conversion_p
+                        (n->simdclone->args[i].orig_type,
+                         TREE_TYPE (gimple_call_arg (stmt,
+                                                     i + masked_call_offset))))
                  i = -1;
                else if (arginfo[i].dt == vect_constant_def
                         || arginfo[i].dt == vect_external_def
@@ -4295,12 +4298,32 @@ vectorizable_simd_clone_call (vec_info *vinfo, 
stmt_vec_info stmt_info,
                i = -1;
                break;
              case SIMD_CLONE_ARG_TYPE_MASK:
+               if (!SCALAR_INT_MODE_P (n->simdclone->mask_mode)
+                   && n->simdclone->mask_mode != VOIDmode)
+                 i = -1;
                /* While we can create a traditional data vector from
                   an incoming integer mode mask we have no good way to
                   force generate an integer mode mask from a traditional
                   boolean vector input.  */
-               if (SCALAR_INT_MODE_P (n->simdclone->mask_mode)
-                   && !SCALAR_INT_MODE_P (TYPE_MODE (arginfo[i].vectype)))
+               else if (SCALAR_INT_MODE_P (n->simdclone->mask_mode)
+                        && !SCALAR_INT_MODE_P (TYPE_MODE (arginfo[i].vectype)))
+                 i = -1;
+               else if (n->simdclone->mask_mode == VOIDmode
+                        /* FORNOW we only have partial support for vector-type
+                           masks that can't hold all of simdlen. */
+                        && (maybe_ne (TYPE_VECTOR_SUBPARTS 
(n->simdclone->args[i].vector_type),
+                                      TYPE_VECTOR_SUBPARTS 
(arginfo[i].vectype))
+                            /* Verify we can compute the mask argument.  */
+                            || !expand_vec_cond_expr_p 
(n->simdclone->args[i].vector_type,
+                                                        arginfo[i].vectype)))
+                 i = -1;
+               else if (SCALAR_INT_MODE_P (n->simdclone->mask_mode)
+                        /* FORNOW we only have partial support for
+                           integer-type masks that represent the same number
+                           of lanes as the vectorized mask inputs.  */
+                        && maybe_ne (exact_div (n->simdclone->simdlen,
+                                                
n->simdclone->args[i].linear_step),
+                                     TYPE_VECTOR_SUBPARTS 
(arginfo[i].vectype)))
                  i = -1;
                else if (!SCALAR_INT_MODE_P (n->simdclone->mask_mode)
                         && SCALAR_INT_MODE_P (TYPE_MODE (arginfo[i].vectype)))
@@ -4341,89 +4364,6 @@ vectorizable_simd_clone_call (vec_info *vinfo, 
stmt_vec_info stmt_info,
   if (bestn == NULL)
     return false;
 
-  for (i = 0; i < nargs; i++)
-    {
-      if ((arginfo[i].dt == vect_constant_def
-          || arginfo[i].dt == vect_external_def)
-         && bestn->simdclone->args[i].arg_type == SIMD_CLONE_ARG_TYPE_VECTOR)
-       {
-         tree arg_type = TREE_TYPE (gimple_call_arg (stmt,
-                                                     i + masked_call_offset));
-         arginfo[i].vectype = get_vectype_for_scalar_type (vinfo, arg_type,
-                                                           slp_node);
-         if (arginfo[i].vectype == NULL
-             || !constant_multiple_p (bestn->simdclone->simdlen,
-                                      TYPE_VECTOR_SUBPARTS 
(arginfo[i].vectype)))
-           return false;
-       }
-
-      if (bestn->simdclone->args[i].arg_type == SIMD_CLONE_ARG_TYPE_VECTOR
-         && VECTOR_BOOLEAN_TYPE_P (bestn->simdclone->args[i].vector_type))
-       {
-         if (dump_enabled_p ())
-           dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
-                            "vector mask arguments are not supported.\n");
-         return false;
-       }
-
-      if (bestn->simdclone->args[i].arg_type == SIMD_CLONE_ARG_TYPE_MASK)
-       {
-         tree clone_arg_vectype = bestn->simdclone->args[i].vector_type;
-         if (bestn->simdclone->mask_mode == VOIDmode)
-           {
-             if (maybe_ne (TYPE_VECTOR_SUBPARTS (clone_arg_vectype),
-                           TYPE_VECTOR_SUBPARTS (arginfo[i].vectype)))
-               {
-                 /* FORNOW we only have partial support for vector-type masks
-                    that can't hold all of simdlen. */
-                 if (dump_enabled_p ())
-                   dump_printf_loc (MSG_MISSED_OPTIMIZATION,
-                                    vect_location,
-                                    "in-branch vector clones are not yet"
-                                    " supported for mismatched vector 
sizes.\n");
-                 return false;
-               }
-             if (!expand_vec_cond_expr_p (clone_arg_vectype,
-                                          arginfo[i].vectype))
-               {
-                 if (dump_enabled_p ())
-                   dump_printf_loc (MSG_MISSED_OPTIMIZATION,
-                                    vect_location,
-                                    "cannot compute mask argument for"
-                                    " in-branch vector clones.\n");
-                 return false;
-               }
-           }
-         else if (SCALAR_INT_MODE_P (bestn->simdclone->mask_mode))
-           {
-             if (!SCALAR_INT_MODE_P (TYPE_MODE (arginfo[i].vectype))
-                 || maybe_ne (exact_div (bestn->simdclone->simdlen,
-                                         
bestn->simdclone->args[i].linear_step),
-                              TYPE_VECTOR_SUBPARTS (arginfo[i].vectype)))
-               {
-                 /* FORNOW we only have partial support for integer-type masks
-                    that represent the same number of lanes as the
-                    vectorized mask inputs. */
-                 if (dump_enabled_p ())
-                   dump_printf_loc (MSG_MISSED_OPTIMIZATION,
-                                    vect_location,
-                                    "in-branch vector clones are not yet "
-                                    "supported for mismatched vector 
sizes.\n");
-                 return false;
-               }
-           }
-         else
-           {
-             if (dump_enabled_p ())
-               dump_printf_loc (MSG_MISSED_OPTIMIZATION,
-                                vect_location,
-                                "in-branch vector clones not supported"
-                                " on this target.\n");
-             return false;
-           }
-       }
-    }
-
   fndecl = bestn->decl;
   nunits = bestn->simdclone->simdlen;
   int ncopies = vector_unroll_factor (vf * group_size, nunits);

Reply via email to