Hi, PR122126 had been fixed on trunk, gcc-14 and gcc-15. But not on gcc-13, I had backported commit 7d966cc35ad01d70cd9bfb6f531c938a7b6110b7 on gcc-13, but did not test it before pushing, therefore had to revert it.
I have made a minor change to the original commit that fixed PR122126 for the gcc-13 branch. Bootstrapped and regtested on releases/gcc-13 on powerpc64le with no regressions. Is this OK to merge to releases/gcc-13? Thanks and regards, Avinash Jayakar The function gimple_expand_vec_set_expr in the isel pass, converted VIEW_CONVERT_EXPR to VEC_SET_EXPR without checking the bounds on the index, which cause ICE on targets that supported VEC_SET_EXPR like x86 and powerpc. This patch adds a bound check on the index operand and rejects the conversion if index is out of bound. 2026-01-05 Avinash Jayakar <[email protected]> gcc/ChangeLog: PR tree-optimization/122126 * gimple-isel.cc (gimple_expand_vec_set_extract_expr): Add bound check. gcc/testsuite/ChangeLog: PR tree-optimization/122126 * gcc.dg/pr122126_vextr.c: New test. * gcc.dg/pr122126_vset.c: New test. --- gcc/gimple-isel.cc | 9 +++++++++ gcc/testsuite/gcc.dg/pr122126_vextr.c | 9 +++++++++ gcc/testsuite/gcc.dg/pr122126_vset.c | 9 +++++++++ 3 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr122126_vextr.c create mode 100644 gcc/testsuite/gcc.dg/pr122126_vset.c diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc index 760029d27c9..f7eabeca647 100644 --- a/gcc/gimple-isel.cc +++ b/gcc/gimple-isel.cc @@ -76,6 +76,15 @@ gimple_expand_vec_set_expr (struct function *fun, gimple_stmt_iterator *gsi) { tree pos = TREE_OPERAND (lhs, 1); tree view_op0 = TREE_OPERAND (op0, 0); + + // if index is a constant, then check the bounds + poly_uint64 idx_poly; + if (poly_int_tree_p (pos, &idx_poly)) + { + poly_uint64 nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (view_op0)); + if (known_gt (idx_poly, nelts)) + return false; + } machine_mode outermode = TYPE_MODE (TREE_TYPE (view_op0)); if ((auto_var_in_fn_p (view_op0, fun->decl) || (VAR_P (view_op0) && DECL_HARD_REGISTER (view_op0))) diff --git a/gcc/testsuite/gcc.dg/pr122126_vextr.c b/gcc/testsuite/gcc.dg/pr122126_vextr.c new file mode 100644 index 00000000000..b598aa01091 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr122126_vextr.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-additional-options "-mavx2" { target avx2 } } */ + +#define vect16 __attribute__((vector_size(16))) +void ub_set() { + volatile vect16 unsigned BS_VAR_0; + unsigned a = BS_VAR_0[12]; +} diff --git a/gcc/testsuite/gcc.dg/pr122126_vset.c b/gcc/testsuite/gcc.dg/pr122126_vset.c new file mode 100644 index 00000000000..85b2c68247b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr122126_vset.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-additional-options "-mavx2" { target avx2 } } */ + +#define vect16 __attribute__((vector_size(16))) +void ub_set() { + volatile vect16 unsigned BS_VAR_0; + BS_VAR_0[12] = 4; +} -- 2.51.0
