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

--- Comment #8 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
> I did a quick test by using instead
> 
> diff --git a/gcc/postreload.c b/gcc/postreload.c
> index dc67643384d..64297be2c45 100644
> --- a/gcc/postreload.c
> +++ b/gcc/postreload.c
> @@ -1732,12 +1732,7 @@ move2add_valid_value_p (int regno, scalar_int_mode
> mode)
>          (REG:reg_mode[regno] regno).  Now, for big endian, the starting
>          regno of the lowpart might be different.  */
>        poly_int64 s_off = subreg_lowpart_offset (mode, old_mode);
> -      s_off = subreg_regno_offset (regno, old_mode, s_off, mode);
> -      if (maybe_ne (s_off, 0))
> -       /* We could in principle adjust regno, check reg_mode[regno] to be
> -          BLKmode, and return s_off to the caller (vs. -1 for failure),
> -          but we currently have no callers that could make use of this
> -          information.  */
> +      if (simplify_subreg_regno (regno, old_mode, s_off, mode) < 0)
>         return false;
>      }
> 
> which works at least for the example (haven't done a bootstrap nor regtest
> yet). However, I'm still wondering whether subreg_get_info is supposed to
> return with a zero offset in cases like this? Any thoughts?

See the head comment of subreg_get_info, especially at the end.  We still need
to check that the regno offset is zero since we reuse the same reg, but we also
need to check targetm.hard_regno_mode_ok (regno, mode) here.

Reply via email to