On Wed, 4 Dec 2024, Tamar Christina wrote: > Hi All, > > When issuing multiple calls to a simdclone in a vectorized loop, > TYPE_VECTOR_SUBPARTS(vectype) gives the incorrect number when compared > to the TYPE_VECTOR_SUBPARTS result we get from the mask type derived > from the relevant `rgroup_controls' entry within `vect_get_loop_mask'. > > By passing `masktype' instead, we are able to get the correct number of > vector subparts and thu eliminate the ICE in the call to > `vect_get_loop_mask' when the data type for which we retrieve the mask > is wider than the one used when defining the mask at mask registration > time. > > gcc/ChangeLog: > > PR target/96342 > * tree-vect-stmts.cc (vectorizable_simd_clone_call): > s/vectype/masktype/ in call to vect_get_loop_mask. > > > Bootstrapped Regtested on aarch64-none-linux-gnu, > arm-none-linux-gnueabihf, x86_64-pc-linux-gnu > -m32, -m64 and no issues. > > Ok for master?
Hmm, I think the corresponding vect_record_loop_mask is case SIMD_CLONE_ARG_TYPE_MASK: if (loop_vinfo && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)) { unsigned nmasks = exact_div (ncopies * bestn->simdclone->simdlen, TYPE_VECTOR_SUBPARTS (vectype)).to_constant (); vect_record_loop_mask (loop_vinfo, &LOOP_VINFO_MASKS (loop_vinfo), nmasks, vectype, op); } and that doesn't exactly match the bestn->simdclone->nargs - 1 mask use then unless bestn->simdclone->args[mask_i].vector_type == vectype? The patch looks OK, but I think we miss a corresponding vect_record_loop_mask case. I also wonder how we support a SIMD clone call where the result vector type subparts doesn't match the argument or loop mask number of subparts? > Thanks, > Tamar > > --- > diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc > index > 497a31322accba8672b82dee00f5403b40dca22b..be1139a423c85608755f10750bb68e70223a84ea > 100644 > --- a/gcc/tree-vect-stmts.cc > +++ b/gcc/tree-vect-stmts.cc > @@ -4964,7 +4964,7 @@ vectorizable_simd_clone_call (vec_info *vinfo, > stmt_vec_info stmt_info, > { > vec_loop_masks *loop_masks = &LOOP_VINFO_MASKS (loop_vinfo); > mask = vect_get_loop_mask (loop_vinfo, gsi, loop_masks, > - ncopies, vectype, j); > + ncopies, masktype, j); > } > else > mask = vect_build_all_ones_mask (vinfo, stmt_info, masktype); > > > > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)