On Mon, Jan 5, 2026 at 8:33 AM Avinash Jayakar <[email protected]> wrote: > > 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?
OK. > 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 >
