On Wed, 29 Jul 2026, Jakub Jelinek wrote:

> On Wed, Jul 29, 2026 at 08:54:35AM +0200, Richard Biener wrote:
> > > Now that I look at the patch, I think the if (known_gt (idx_poly, nelts))
> > > above is wrong as well, I think it should be
> > > if (known_ge (idx_poly, nelts))
> > > because vector set is out of bounds even when accessing nelts index.
> > > If you agree, I can post an incremental patch.
> > 
> > I agree to that.
> > > @@ -114,6 +115,10 @@ gimple_expand_vec_set_extract_expr (stru
> > >     if (known_gt (idx_poly, nelts))
> > >       return false;
> > >   }
> > > +      else if (tree_fits_poly_int64_p (idx))
> > > + // if idx doesn't fit into poly_uint64, but fits into poly_int64,
> > > + // it must be negative
> > > + return false;
> > 
> > I'd say that iff poly_int_tree_p (idx, &idx_poly) checks it fits
> > poly_uint64 then if it is poly-int (like large uint128), it's
> > too large, so ...
> > 
> >    else if (poly_int_tree_p (idx))
> >      // if idx doesn't fit into poly_uint64 but is constant, it must
> >      //  be out of bounds
> >      return false;
> > 
> > ?
> 
> Ok.  Because GCC 16.2 rc is near, I'll commit separately the i386.cc +
> testcase right now (with IN_RANGE that Uros requested) and test
> separately:

LGTM.

Richard.

> 2026-07-29  Jakub Jelinek  <[email protected]>
> 
>       PR target/126446
>       * gimple-isel.cc (gimple_expand_vec_set_extract_expr): Punt if
>       idx doesn't fit into poly_uint64 but is poly_int_tree_p.  Use
>       known_ge rather than known_gt for out of bounds check.  Formatting
>       fixes.
> 
> --- gcc/gimple-isel.cc.jj     2026-07-28 21:02:44.114364489 +0200
> +++ gcc/gimple-isel.cc        2026-07-29 09:47:34.226093210 +0200
> @@ -96,10 +96,11 @@ gimple_expand_vec_set_extract_expr (stru
>      return false;
>  
>    tree op0 = TREE_OPERAND (ref, 0);
> -  if (TREE_CODE (op0) == VIEW_CONVERT_EXPR && DECL_P (TREE_OPERAND (op0, 0))
> +  if (TREE_CODE (op0) == VIEW_CONVERT_EXPR
> +      && DECL_P (TREE_OPERAND (op0, 0))
>        && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
> -      && TYPE_MODE (TREE_TYPE (ref))
> -        == TYPE_MODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))))
> +      && (TYPE_MODE (TREE_TYPE (ref))
> +       == TYPE_MODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0))))))
>      {
>        tree pos = TREE_OPERAND (ref, 1);
>  
> @@ -111,9 +112,13 @@ gimple_expand_vec_set_extract_expr (stru
>        if (poly_int_tree_p (idx, &idx_poly))
>       {
>         poly_uint64 nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (view_op0));
> -       if (known_gt (idx_poly, nelts))
> +       if (known_ge (idx_poly, nelts))
>           return false;
>       }
> +      else if (poly_int_tree_p (idx))
> +     // if idx doesn't fit into poly_uint64, but is constant, it
> +     // must be out of bounds
> +     return false;
>        machine_mode outermode = TYPE_MODE (TREE_TYPE (view_op0));
>        machine_mode extract_mode = TYPE_MODE (TREE_TYPE (ref));
>  
> 
>       Jakub
> 
> 

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

Reply via email to