On Sun, Mar 16, 2025 at 10:10 AM Jeff Law <jeffreya...@gmail.com> wrote:
>
>
>
> On 2/19/25 9:13 PM, Andrew Pinski wrote:
> > So gcc.target/aarch64/rev16_2.c started to fail after 
> > r15-268-g9dbff9c05520a7,
> > the problem is combine now rejects the instruction combine. This happens 
> > because
> > after a different combine which uses a define_split and that define_split 
> > creates
> > a new pseudo register. That new pseudo register is dead after the last 
> > instruction
> > in the stream BUT combine never creates a REG_DEAD for it. So combine 
> > thinks it is
> > still needed after and now with the i2 not changing, combine rejects the 
> > combine.
> >
> > Now combine should be creating a REG_DEAD for the new pseudo registers for 
> > the last
> > instruction of the split. This fixes rev16_2.c and also improves the 
> > situtation in
> > other cases by removing other dead instructions.
> >
> > Bootstrapped and tested on aarch64-linux-gnu and x86_64-linux-gnu.
> >
> > gcc/ChangeLog:
> >
> >       PR rtl-optimization/118914
> >       * combine.cc (recog_for_combine): Add old_nregs and new_nregs
> >       argument (defaulting to 0). Update call to recog_for_combine_1.
> >       (combine_split_insns): Add old_nregs and new_nregs arguments,
> >       store the old and new max registers to them.
> >       (try_combine): Update calls to combine_split_insns and
> >       pass old_nregs and new_nregs for the i3 call to recog_for_combine.
> >       (find_split_point): Update call to combine_split_insns; ignoring
> >       the values there.
> >       (recog_for_combine_1): Add old_nregs and new_nregs arguments,
> >       if the insn was recognized (and not to no-op move), add the
> >       REG_DEAD notes to pnotes argument.
> So not a complete review, but a concern.
>
> What happens if the final pattern doesn't reference the newly created
> pseduo?  Don't we end up with a REG_DEAD note anyway?  And are there
> negative implications of having a REG_DEAD note for a pseudo that isn't
> actually referenced in the pattern?
>
> I could easily see splitters asking for new regs, then not needing them
> in some cases.  Or multiple split attempts before hitting one that
> matches.  In both cases ISTM like we can run into the situation noted above.

I had that concern too originally; I looked into it and found
distribute_notes is called with the new notes afterwards and will not
place the REG_DEAD note on an instruction if the register is no longer
referenced and place the REG_DEAD on the correct insn otherwise.

Thanks,
Andrew Pinski

>
> jeff

Reply via email to