https://gcc.gnu.org/g:4470b9d14e0a2435fb44fef0c45891eea14dedc2
commit r17-1591-g4470b9d14e0a2435fb44fef0c45891eea14dedc2 Author: Robin Dapp <[email protected]> Date: Tue Jun 16 07:47:13 2026 -0600 [PATCH] vect: Fix gather supported vectype [PR125516].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. 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. Diff: --- .../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(-) 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 000000000000..d9215a773209 --- /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 f46627799764..3b27beb9c5b6 100644 --- a/gcc/tree-vect-data-refs.cc +++ b/gcc/tree-vect-data-refs.cc @@ -4752,6 +4752,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 7687c107a6af..87ce20677284 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);
