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

--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
(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

Reply via email to