On Thu, May 15, 2025 at 12:34 PM Dimitar Dimitrov <dimi...@dinux.eu> wrote:
>
> After r16-160-ge6f89d78c1a752, late_combine2 started transforming the
> following RTL for pru-unknown-elf:
>
>   (insn 3949 3948 3951 255 (set (reg:QI 56 r14.b0 [orig:1856 _619 ] [1856])
>           (and:QI (reg:QI 1 r0.b1 [orig:1855 _201 ] [1855])
>               (const_int 3 [0x3])))
>        (nil))
>   ...
>   (insn 3961 7067 3962 255 (set (reg:SI 56 r14.b0)
>           (zero_extend:SI (reg:QI 56 r14.b0 [orig:1856 _619 ] [1856])))
>        (nil))
>
> into:
>
>   (insn 3961 7067 3962 255 (set (reg:SI 56 r14.b0)
>           (and:SI (subreg:SI (reg:QI 1 r0.b1 [orig:1855 _201 ] [1855]) 0)
>               (const_int 3 [0x3])))
>        (nil))
>
> That caused libbacktrace build to break for pru-unknown-elf.  Register
> r0.b1 (regno 1) is not valid for SImode, which validate_subreg failed to
> reject.
>
> Fix by calling HARD_REGNO_MODE_OK to ensure that both inner and outer
> modes are valid for the hardware subreg.
>
> This patch fixes the broken PRU toolchain build.  It leaves only two
> test case regressions for PRU, caused by rnreg pass renaming a valid
> paradoxical subreg into an invalid one.
>   gcc.c-torture/execute/20040709-1.c
>   gcc.c-torture/execute/20040709-2.c
>
>         PR target/119966
>
> gcc/ChangeLog:
>
>         * emit-rtl.cc (validate_subreg): Validate inner
>         and outer mode for paradoxical hardware subregs.
>
> Co-authored-by: Andrew Pinski <pins...@gmail.com>

Note this should be `Andrew Pinski <quic_apin...@quicinc.com>` for
legal requirements.

Thanks,
Andrew

> Signed-off-by: Dimitar Dimitrov <dimi...@dinux.eu>
> ---
>  gcc/emit-rtl.cc | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc
> index e46b0f9eac4..6c5d9b55508 100644
> --- a/gcc/emit-rtl.cc
> +++ b/gcc/emit-rtl.cc
> @@ -983,6 +983,9 @@ validate_subreg (machine_mode omode, machine_mode imode,
>        if ((COMPLEX_MODE_P (imode) || VECTOR_MODE_P (imode))
>           && GET_MODE_INNER (imode) == omode)
>         ;
> +      else if (!targetm.hard_regno_mode_ok (regno, imode)
> +              || !targetm.hard_regno_mode_ok (regno, omode))
> +       return false;
>        else if (!REG_CAN_CHANGE_MODE_P (regno, imode, omode))
>         return false;
>
> --
> 2.49.0
>

Reply via email to