On Fri, 11 Aug 2023, Juzhe-Zhong wrote:

> This patch fixes bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110989
> 
> This ICE is caused because of this situation:
> 
> mask__49.21_99 = vect__17.19_96 == { 0.0, ... };
> ...
> vect__6.24_107 = .MASK_LEN_LOAD (vectp.22_105, 32B, mask__49.21_99, 
> POLY_INT_CST [2, 2], 0);
> 
> The MASK_LEN_LOAD is using real MASK which is produced by the EQ comparison 
> wheras the LEN
> is the dummy LEN which is the vectorization factor.
> 
> In this situation, we didn't enter 'vect_record_loop_len' since there is no 
> LEN loop control.
> Then 'LOOP_VINFO_RGROUP_IV_TYPE' is not suitable type for 'build_int_cst' 
> used for producing
> LEN argument for 'MASK_LEN_LOAD', so use sizetype instead which is perfectly 
> matching
> RVV length requirement.

Looks reasonable.  Note there is size_int (...) you could use to shorten
the code.

Thanks,
Richard.

>         PR middle-end/110989
> 
> gcc/ChangeLog:
> 
>         * tree-vect-stmts.cc (vectorizable_store): Replace iv_type with 
> sizetype.
>         (vectorizable_load): Ditto.
> 
> gcc/testsuite/ChangeLog:
> 
>         * gcc.target/riscv/rvv/autovec/pr110989.c: New test.
> 
> ---
>  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c | 11 +++++++++++
>  gcc/tree-vect-stmts.cc                                |  7 ++-----
>  2 files changed, 13 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c
> 
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c 
> b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c
> new file mode 100644
> index 00000000000..cf3b247e604
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-march=rv64gcv -mabi=lp64d 
> --param=riscv-autovec-preference=scalable -Ofast" } */
> +
> +int a, b, c;
> +double *d;
> +void e() {
> +  double f;
> +  for (; c; c++, d--)
> +    f = *d ?: *(&a + c);
> +  b = f;
> +}
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 398fbe945e5..e0e2083d022 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -9126,9 +9126,8 @@ vectorizable_store (vec_info *vinfo,
>                   {
>                     /* Pass VF value to 'len' argument of
>                        MASK_LEN_STORE if LOOP_LENS is invalid.  */
> -                   tree iv_type = LOOP_VINFO_RGROUP_IV_TYPE (loop_vinfo);
>                     final_len
> -                     = build_int_cst (iv_type,
> +                     = build_int_cst (sizetype,
>                                        TYPE_VECTOR_SUBPARTS (vectype));
>                   }
>                 if (!final_mask)
> @@ -10713,10 +10712,8 @@ vectorizable_load (vec_info *vinfo,
>                         {
>                           /* Pass VF value to 'len' argument of
>                              MASK_LEN_LOAD if LOOP_LENS is invalid.  */
> -                         tree iv_type
> -                           = LOOP_VINFO_RGROUP_IV_TYPE (loop_vinfo);
>                           final_len
> -                           = build_int_cst (iv_type,
> +                           = build_int_cst (sizetype,
>                                              TYPE_VECTOR_SUBPARTS (vectype));
>                         }
>                       if (!final_mask)
> 

-- 
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)

Reply via email to