diff options
author | Richard Biener <rguenther@suse.de> | 2024-07-11 10:18:55 +0200 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2024-07-12 07:41:50 +0200 |
commit | 4f4478f0f31263997bfdc4159f90e58dd79b38f9 (patch) | |
tree | 3176857af6d3ae0e2bb57d5ce1618f03ee4baeff /gcc | |
parent | a91c51c187a78e4164bc4039ebdb543848e379d2 (diff) | |
download | gcc-4f4478f0f31263997bfdc4159f90e58dd79b38f9.zip gcc-4f4478f0f31263997bfdc4159f90e58dd79b38f9.tar.gz gcc-4f4478f0f31263997bfdc4159f90e58dd79b38f9.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/tree-vect-stmts.cc | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index fdcda0d..2e4d500 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -4748,7 +4748,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++) { |