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