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

commit r14-10436-gca275b68ef11d7d70bff8d7426e45b37366664b3
Author: Richard Biener <rguent...@suse.de>
Date:   Thu Jul 11 10:18:55 2024 +0200

    tree-optimization/115867 - ICE with simdcall vectorization in masked loop
    
    When only a loop mask is to be supplied for the inbranch arg to a
    simd function we fail to handle integer mode masks correctly.  We
    need to guess the number of elements represented by it.  This assumes
    that excess arguments are all for masks, I wasn't able to create
    a simdclone with more than one integer mode mask argument.
    
    The gcc.dg/vect/vect-simd-clone-20.c exercises this with -mavx512vl
    
            PR tree-optimization/115867
            * tree-vect-stmts.cc (vectorizable_simd_clone_call): Properly
            guess the number of mask elements for integer mode masks.
    
    (cherry picked from commit 4f4478f0f31263997bfdc4159f90e58dd79b38f9)

Diff:
---
 gcc/tree-vect-stmts.cc | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 21e8fe98e44a..eed5c7d821cb 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -4716,7 +4716,12 @@ vectorizable_simd_clone_call (vec_info *vinfo, 
stmt_vec_info stmt_info,
                      SIMD_CLONE_ARG_TYPE_MASK);
 
          tree masktype = bestn->simdclone->args[mask_i].vector_type;
-         callee_nelements = TYPE_VECTOR_SUBPARTS (masktype);
+         if (SCALAR_INT_MODE_P (bestn->simdclone->mask_mode))
+           /* Guess the number of lanes represented by masktype.  */
+           callee_nelements = exact_div (bestn->simdclone->simdlen,
+                                         bestn->simdclone->nargs - nargs);
+         else
+           callee_nelements = TYPE_VECTOR_SUBPARTS (masktype);
          o = vector_unroll_factor (nunits, callee_nelements);
          for (m = j * o; m < (j + 1) * o; m++)
            {

Reply via email to