On Mon, Jun 15, 2026 at 9:36 PM Robin Dapp <[email protected]> wrote:
>
> Hi,
>
> This patch fixes a mistake in gather/scatter discovery.  In the third
> "phase" we check for a larger offset type for the needed scaling but
> fail to let the vectorizer know it.  The patch just sets
> supported_offset_vectype and also skips costing an instruction in case
> the necessary conversion is a nop.
>
> Bootstrapped and regtested on x86, power10, and aarch64.
> Regtested on riscv64.

OK.

Thanks,
Richard.

> Regards
>  Robin
>
>         PR tree-optimization/125516
>
> gcc/ChangeLog:
>
>         * tree-vect-data-refs.cc (vect_gather_scatter_fn_p): Set
>         supported_offset_vectype.
>         * tree-vect-stmts.cc (vectorizable_store): Skip nop conversions
>         when costing scatters.
>         (vectorizable_load): Ditto for gathers.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.target/riscv/rvv/autovec/pr125516.c: New test.
> ---
>  .../gcc.target/riscv/rvv/autovec/pr125516.c   | 24 +++++++++++++++++++
>  gcc/tree-vect-data-refs.cc                    |  5 ++++
>  gcc/tree-vect-stmts.cc                        |  8 +++++--
>  3 files changed, 35 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125516.c
>
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125516.c 
> b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125516.c
> new file mode 100644
> index 00000000000..d9215a77320
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125516.c
> @@ -0,0 +1,24 @@
> +/* { dg-do run { target riscv_v } } */
> +/* { dg-additional-options "-fdump-tree-optimized" } */
> +
> +char a;
> +long long b;
> +short d[18][18][18][18];
> +short (*e)[18][18][18] = d;
> +
> +int main ()
> +{
> +  for (long h = 0; h < 4; ++h)
> +    for (long i = 0; i < 18; ++i)
> +      for (long j = 0; j < 18; ++j)
> +       for (long k = 0; k < 18; ++k)
> +         d[h][i][j][k] = j;
> +
> +  for (short i = 0; i < 8; i++)
> +    for (unsigned char j = 0; j < 18; j++)
> +      a = e[3][i][i][j] ? e[j][i][i][3] : 0;
> +
> +  b = (int) a;
> +  if (b != 0)
> +    __builtin_abort ();
> +}
> diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc
> index 0e57e1068d6..6a6e6f767e6 100644
> --- a/gcc/tree-vect-data-refs.cc
> +++ b/gcc/tree-vect-data-refs.cc
> @@ -4727,6 +4727,11 @@ vect_gather_scatter_fn_p (vec_info *vinfo, bool 
> read_p, bool masked_p,
>           *ifn_out = configs[i].ifn;
>           *offset_vectype_out = configs[i].offset_vectype;
>           *supported_scale = configs[i].scale;
> +         /* Only set SUPPORTED_OFFSET_VECTYPE if this is a real
> +            conversion.  */
> +         if (!useless_type_conversion_p (offset_vectype,
> +                                         configs[i].offset_vectype))
> +           *supported_offset_vectype = configs[i].offset_vectype;
>           if (elsvals)
>             *elsvals = configs[i].elsvals;
>           return true;
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 7687c107a6a..87ce2067728 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -8981,7 +8981,9 @@ vectorizable_store (vec_info *vinfo,
>             {
>               if (costing_p)
>                 {
> -                 if (ls.supported_offset_vectype)
> +                 if (ls.supported_offset_vectype
> +                     && !tree_nop_conversion_p (ls.supported_offset_vectype,
> +                                                vec_offset))
>                     inside_cost
>                       += record_stmt_cost (cost_vec, 1, vector_stmt,
>                                            slp_node, 0, vect_body);
> @@ -10953,7 +10955,9 @@ vectorizable_load (vec_info *vinfo,
>             {
>               if (costing_p)
>                 {
> -                 if (ls.supported_offset_vectype)
> +                 if (ls.supported_offset_vectype
> +                     && !tree_nop_conversion_p (ls.supported_offset_vectype,
> +                                                vec_offset))
>                     inside_cost
>                       += record_stmt_cost (cost_vec, 1, vector_stmt,
>                                            slp_node, 0, vect_body);
> --
> 2.54.0

Reply via email to