Hi Jeff,

I sent a v2 that instead uses prev_nondebug_insn, preserving the
existing treatment of notes.
I also added a regression test with a NOTE_INSN_DELETED between the
return-value USE
and the trailing debug instruction.

The v2 is here:

https://inbox.sourceware.org/gcc-patches/[email protected]/

It was bootstrapped and regression tested on x86_64-pc-linux-gnu.  I
also rebuilt the mips-elf
compiler and ran the two targeted RTL tests, which produced 8 expected
passes and no failures.

Thanks a lot for your guidance. Really a great learning experience for me.

Thanks,
Yongqiang

On Sat, 10 Oct 2026 at 04:37, Jeff Law <[email protected]> wrote:
>
>
>
> On 10/8/26 9:14 PM, Yongqiang Tian wrote:
> > likely_spilled_retval_p uses BB_END to locate the USE of a
> > multi-register return value.  With debug information, BB_END can be a
> > DEBUG_INSN, causing the check to fail and allowing combine to merge into
> > a return-register copy that it rejects without debug information.
> >
> > Other CFG code already handles DEBUG_INSNs at BB_END.  Step backward
> > over trailing debug instructions and notes before inspecting the USE so
> > that this decision does not depend on debug information.
> >
> > Add a MIPS __RTL test that exercises the affected multi-register return
> > path directly.
> >
> > Assisted-by: OpenAI Codex 5.6 Sol, co-reviewed by Claude and Yongqiang Tian.
> >
> > gcc/ChangeLog:
> >
> >       * combine.cc (likely_spilled_retval_p): Skip trailing debug
> >       instructions when locating the return-value USE.
> >
> > gcc/testsuite/ChangeLog:
> >
> >       * gcc.dg/rtl/mips/combine-likely-spilled-retval.c: New test.
> >
> > Signed-off-by: Yongqiang Tian <[email protected]>
> > ---
> >   gcc/combine.cc                                |  9 +++-
> >   .../rtl/mips/combine-likely-spilled-retval.c  | 49 +++++++++++++++++++
> >   2 files changed, 57 insertions(+), 1 deletion(-)
> >   create mode 100644 
> > gcc/testsuite/gcc.dg/rtl/mips/combine-likely-spilled-retval.c
> >
> > diff --git a/gcc/combine.cc b/gcc/combine.cc
> > index 429530816..fd108f5a8 100644
> > --- a/gcc/combine.cc
> > +++ b/gcc/combine.cc
> > @@ -2315,7 +2315,14 @@ likely_spilled_retval_p (rtx_insn *insn)
> >     unsigned mask;
> >     struct likely_spilled_retval_info info;
> >
> > -  if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == 
> > use)
> > +  /* With -g, BB_END may be a DEBUG_INSN.  Step back so that this decision
> > +     does not depend on debug information.  */
> > +  if (use && DEBUG_INSN_P (use))
> > +    use = prev_nonnote_nondebug_insn_bb (use);
> I'm reasonably confident use can never be NULL here.  Otherwise the old
> code would have been triggering an ICE since NONJUMP_INSN_P
> unconditionally dereferences its argument to get the IL node's rtx code.
>
> I don't think this is correct though.  I think it introduces another
> potential compare-debug failure.
>
> Whether or not we walk backwards through a note becomes dependent on
> whether or not USE is a debug insn.
>
> jeff
>
>

Reply via email to