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 <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)