> Am 26.07.2024 um 11:40 schrieb Tamar Christina <tamar.christ...@arm.com>:
>
> Hi All,
>
> For historical reasons AArch64 has TI mode vector types but does not consider
> TImode a vector mode.
>
> What's happening in the PR is that get_vectype_for_scalar_type is returning
> vector(1) TImode for a TImode scalar. This then fails when we call
> targetm.vectorize.get_mask_mode (vecmode).exists (&) on the TYPE_MODE.
>
> I've checked other usages of get_mask_mode and none of them have anything that
> would prevent this same issue from happening. It only happens that normally
> the vectorizer rejects the vector(1) type early, but in this case we get
> further because the COND_EXPR hasn't been analyzed yet for a type.
>
> I believe get_mask_mode shouldn't fault, and so this adds the check for vector
> mode in the hook and returns nothing if it's not. I did not add this to the
> generic function because I believe this is an AArch64 quirk.
>
> However the AArch64 maintainer does not agree, as such this fixes the PR.
> I still don't think it's reasonable to have to force the caller to check
> this. And the target is doing something quite weird and unexpected to
> future users of the hook.
>
> Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
>
> Ok for master?
Ok
Richard
> Thanks,
> Tamar
>
> gcc/ChangeLog:
>
> PR target/116074
> * tree-vect-patterns.cc (vect_recog_cond_store_pattern): Check vector mode.
>
> gcc/testsuite/ChangeLog:
>
> PR target/116074
> * g++.target/aarch64/pr116074.C: New test.
>
> ---
> diff --git a/gcc/testsuite/g++.target/aarch64/pr116074.C
> b/gcc/testsuite/g++.target/aarch64/pr116074.C
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..54cf561510c460499a816ab6a84603fc20a5f1e5
> --- /dev/null
> +++ b/gcc/testsuite/g++.target/aarch64/pr116074.C
> @@ -0,0 +1,24 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-O3" } */
> +
> +int m[40];
> +
> +template <typename k> struct j {
> + int length;
> + k *e;
> + void operator[](int) {
> + if (length)
> + __builtin___memcpy_chk(m, m+3, sizeof (k), -1);
> + }
> +};
> +
> +j<j<int>> o;
> +
> +int *q;
> +
> +void ao(int i) {
> + for (; i > 0; i--) {
> + o[1];
> + *q = 1;
> + }
> +}
> diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
> index
> 53af5e38b539159084846caac5da2ef4daaab4cb..82aeb8132a91e8cfc512a7ce9cb8be73ef28cab9
> 100644
> --- a/gcc/tree-vect-patterns.cc
> +++ b/gcc/tree-vect-patterns.cc
> @@ -6637,7 +6637,8 @@ vect_recog_cond_store_pattern (vec_info *vinfo,
>
> machine_mode mask_mode;
> machine_mode vecmode = TYPE_MODE (vectype);
> - if (targetm.vectorize.conditional_operation_is_expensive (IFN_MASK_STORE)
> + if (!VECTOR_MODE_P (vecmode)
> + || targetm.vectorize.conditional_operation_is_expensive
> (IFN_MASK_STORE)
> || !targetm.vectorize.get_mask_mode (vecmode).exists (&mask_mode)
> || !can_vec_mask_load_store_p (vecmode, mask_mode, false))
> return NULL;
>
>
>
>
> --
> <rb18681.patch>