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
>

Reply via email to