Hi Richard,
On 17/05/2021 17:31, Richard Earnshaw wrote:
>
>
> On 30/04/2021 09:30, Alex Coplan via Gcc-patches wrote:
> > Hi,
> >
> > As the PR shows, we ICE shortly after expanding nonsecure calls for
> > Armv8.1-M. For Armv8.1-M, we have TARGET_HAVE_FPCXT_CMSE. As it stands,
> > the expander (arm.md:nonsecure_call_internal) moves the callee's address
> > to a register (with copy_to_suggested_reg) only if
> > !TARGET_HAVE_FPCXT_CMSE.
> >
> > However, looking at the pattern which the insn appears to be intended to
> > match (thumb2.md:*nonsecure_call_reg_thumb2_fpcxt), it requires the
> > callee's address to be in a register.
> >
> > This patch therefore just forces the callee's address into a register in
> > the expander.
> >
> > Testing:
> > * Regtested an arm-eabi cross configured with
> > --with-arch=armv8.1-m.main+mve.fp+fp.dp --with-float=hard. No regressions.
> > * Bootstrap and regtest on arm-linux-gnueabihf in progress.
> >
> > OK for trunk and backports as appropriate if bootstrap looks good?
> >
> > Thanks,
> > Alex
> >
> > gcc/ChangeLog:
> >
> > PR target/100333
> > * config/arm/arm.md (nonsecure_call_internal): Always ensure
> > callee's address is in a register.
> >
> > gcc/testsuite/ChangeLog:
> >
> > PR target/100333
> > * gcc.target/arm/cmse/pr100333.c: New test.
> >
>
>
> - "
> {
> - if (!TARGET_HAVE_FPCXT_CMSE)
> - {
> - rtx tmp =
> - copy_to_suggested_reg (XEXP (operands[0], 0),
> - gen_rtx_REG (SImode, R4_REGNUM),
> - SImode);
> + rtx tmp = NULL_RTX;
> + rtx addr = XEXP (operands[0], 0);
>
> - operands[0] = replace_equiv_address (operands[0], tmp);
> - }
> - }")
> + if (TARGET_HAVE_FPCXT_CMSE && !REG_P (addr))
> + tmp = force_reg (SImode, addr);
> + else if (!TARGET_HAVE_FPCXT_CMSE)
> + tmp = copy_to_suggested_reg (XEXP (operands[0], 0),
> + gen_rtx_REG (SImode, R4_REGNUM),
> + SImode);
>
>
> I think it might be better to handle the !TARGET_HAVE_FPCXT_CMSE case via a
> pseudo as well, then we don't end up generating a potentially non-trivial
> insn that directly writes a fixed hard reg - it's better to let later passes
> clean that up if they can.
Ah, I wasn't aware that was an issue.
>
> Also, you've extracted XEXP (operands[0], 0) into 'addr', but then continue
> to use the XEXP form in the existing path. Please be consistent use XEXP
> directly everywhere, or use 'addr' everywhere.
Fixed, thanks.
>
> So you want something like
>
> addr = XEXP (operands[0], 0);
> if (!REG_P (addr))
> addr = force_reg (SImode, addr);
>
> if (!T_H_F_C)
> addr = copy...(addr, gen(r4), SImode);
>
> operands[0] = replace_equiv_addr (operands[0], addr);
>
> R.
How about the attached? Regtested an armv8.1-m.main cross,
bootstrapped/regtested
on arm-linux-gnueabihf: no issues.
OK for trunk and eventual backports?
Thanks,
Alex