https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98255

--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #9)
> (In reply to Jakub Jelinek from comment #8)
> > 503                 poly_offset_int woffset
> > 504                   = wi::sext (wi::to_poly_offset (index)
> > 505                               - wi::to_poly_offset (low_bound),
> > 506                               TYPE_PRECISION (TREE_TYPE (index)));
> > in get_ref_base_and_extent indeed looks incorrect to me, for precisions
> > smaller than precision of pointer (or is that sizetype) I think we need to
> > sign or zero extend based on whether index has signed or unsigned type.
> > For arrays with zero low_bound I think what get_inner_reference does is
> > right, in particular:
> >             offset = size_binop (PLUS_EXPR, offset,
> >                                  size_binop (MULT_EXPR,
> >                                              fold_convert (sizetype, index),
> >                                              unit_size));
> > For non-zero low_bound, it does:
> >             if (! integer_zerop (low_bound))
> >               index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
> >                                    index, low_bound);
> > before that and I'm surprised that it assumes index and low_bound will be
> > compatible types.  But perhaps they are in the languages that do support
> > non-zero low bounds.
> 
> Note all the above "mess" is due to FEs behaving oddly, notably different
> from just interpreting the index as-is (appropriately sign or zero-extending
> it to sizetype for the sizetype offset compute).  The odd sign-extension
> is from gb48e22b2bd02

Possibly wi::sext(..., TYPE_PRECISION (sizetype)) is what we want.

Reply via email to