On Thu, 6 Nov 2025, Avinash Jayakar wrote:

> Hi,
> 
> Based on the approach mentioned by Andrew, below is a patch to fix PR122126.
> Bootstrapped and regtested on powerpc64le and x86 with no regressions. Kindly
> review.
> 
> 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.

I think this is somewhat fragile since if we ever get sth like

 _1 = 1345677;
 _2 = ... the access ...

the variable bound will not be checked but TER might pull in the constant
definition.  I think targets should not ICE on UB here?

I'm also missing a testcase here.

Thanks,
Richard.

> 2025-11-06  Avinash Jayakar  <[email protected]>
> 
> gcc/ChangeLog:
>       PR tree-optimization/122126
>         * gimple-isel.cc (gimple_expand_vec_set_extract_expr): Add bound 
> check.
> ---
>  gcc/gimple-isel.cc | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc
> index b5dc579ff46..2593cae1aad 100644
> --- a/gcc/gimple-isel.cc
> +++ b/gcc/gimple-isel.cc
> @@ -102,6 +102,20 @@ gimple_expand_vec_set_extract_expr (struct function *fun,
>        tree pos = TREE_OPERAND (ref, 1);
>  
>        tree view_op0 = TREE_OPERAND (op0, 0);
> +
> +      tree idx = TREE_OPERAND (ref, 1);
> +      // if index is a constant, then check the bounds
> +      if (TREE_CODE (idx) == INTEGER_CST)
> +     {
> +       poly_uint64 nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (view_op0));
> +       // cannot analyse further if nelts is not known
> +       if (!nelts.is_constant ())
> +         return false;
> +
> +       if (!tree_fits_uhwi_p (idx)
> +           || tree_to_uhwi (idx) > nelts.to_constant ())
> +         return false;
> +     }
>        machine_mode outermode = TYPE_MODE (TREE_TYPE (view_op0));
>        machine_mode extract_mode = TYPE_MODE (TREE_TYPE (ref));
>  
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to