> -----Original Message-----
> From: Andrew Pinski (QUIC) <quic_apin...@quicinc.com>
> Sent: Monday, June 23, 2025 11:39 AM
> To: Andrew Pinski (QUIC) <quic_apin...@quicinc.com>; gcc-
> patc...@gcc.gnu.org
> Subject: RE: [PATCH] expand: Allow sibcalling for return
> structures in some cases [PR71761]
> 
> > -----Original Message-----
> > From: Andrew Pinski (QUIC) <quic_apin...@quicinc.com>
> > Sent: Monday, June 23, 2025 8:01 AM
> > To: gcc-patches@gcc.gnu.org
> > Cc: Andrew Pinski (QUIC) <quic_apin...@quicinc.com>
> > Subject: [PATCH] expand: Allow sibcalling for return
> structures in
> > some cases [PR71761]
> >
> > In the case of tailing call with a return of a structure,
> currently
> > all large structures are rejected. We can allow the case were
> the
> > return of the "tail call" function is setting the return value of
> the
> > current function.  This allows for the musttail that is located
> in
> > pr71761-1.c.
> >
> > This should be safe as sibcalls here is RSO is always set for
> this
> > case so the current function no longer owns the space.
> >
> > Bootstrapped and tested on x86_64-linux-gnu with no
> regressions.
> 
> Looks like there is some issues with aarch64 which I will need
> to look into to see what is going wrong. Bootstrap fails on
> aarch64; looks like some wrong code happening while
> compiling gcc itself.
> 
> So right for now, this patch is withdrawn while I figure out
> what is going wrong.

Just a quick update on this and writing notes up on it. The following C parser 
functions seems to be mis-compiling:
c_parser_cast_expression
c_parser_unary_expression

c_parser_cast_expression tail calls into c_parser_unary_expression
and
c_parser_unary_expression tail calls into c_parser_postfix_expression

This is for the default cases in both.
I had looked at the resulting assembly and I could not spot what was going 
wrong at this point but still look further. 


> 
> Thanks,
> Andrew
> 
> >
> >     PR middle-end/71761
> >
> > gcc/ChangeLog:
> >
> >     * calls.cc (can_implement_as_sibling_call_p): Don't reject
> >     "structured" returns if the addr is the same as the current
> >     result decl's memory.
> >
> > gcc/testsuite/ChangeLog:
> >
> >     * c-c++-common/pr71761-1.c: New test.
> >
> > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> > ---
> >  gcc/calls.cc                           | 23 +++++++++++++++++------
> >  gcc/testsuite/c-c++-common/pr71761-1.c | 17
> > +++++++++++++++++
> >  2 files changed, 34 insertions(+), 6 deletions(-)  create mode
> > 100644 gcc/testsuite/c-c++-common/pr71761-1.c
> >
> > diff --git a/gcc/calls.cc b/gcc/calls.cc index
> > 1dcda20a06e..d1f3e17591f 100644
> > --- a/gcc/calls.cc
> > +++ b/gcc/calls.cc
> > @@ -2575,14 +2575,25 @@
> can_implement_as_sibling_call_p (tree exp,
> >        return false;
> >      }
> >
> > -  /* Doing sibling call optimization needs some work, since
> > -     structure_value_addr can be allocated on the stack.
> > -     It does not seem worth the effort since few optimizable
> > -     sibling calls will return a structure.  */
> > +  /* For sibling call optimization with a structure return,
> > +     the return value needs to be the same as the current
> > function,
> > +     otherwise the structure return will be allocated in the
> > stack.  */
> >    if (structure_value_addr != NULL_RTX)
> >      {
> > -      maybe_complain_about_tail_call (exp, _("callee returns
> a
> > structure"));
> > -      return false;
> > +      tree res = DECL_RESULT (current_function_decl);
> > +      bool ok = false;
> > +      if (res && DECL_RTL_SET_P (res))
> > +   {
> > +     rtx res_rtx = DECL_RTL (res);
> > +     if (MEM_P (res_rtx)
> > +         && XEXP (res_rtx, 0) == structure_value_addr)
> > +       ok = true;
> > +   }
> > +      if (!ok)
> > +   {
> > +     maybe_complain_about_tail_call (exp, _("callee returns a
> > structure"));
> > +     return false;
> > +   }
> >      }
> >
> >    /* Check whether the target is able to optimize the call diff
> --
> > git a/gcc/testsuite/c-c++-common/pr71761-1.c
> > b/gcc/testsuite/c-c++-common/pr71761-1.c
> > new file mode 100644
> > index 00000000000..41f4f834fc7
> > --- /dev/null
> > +++ b/gcc/testsuite/c-c++-common/pr71761-1.c
> > @@ -0,0 +1,17 @@
> > +/* PR middle-end/71761 */
> > +/* { dg-do compile { target musttail } } */
> > +/* { dg-options "-O2" } */
> > +
> > +typedef struct Foo {
> > +   int o[16];
> > +}Foo;
> > +
> > +Foo moo();
> > +
> > +Foo goo()
> > +{
> > +  [[gnu::musttail]]
> > +  return moo();
> > +}
> > +
> > +/* { dg-final { scan-assembler "jmp        moo" { target { { i?86-
> *-*
> > x86_64-*-* } && { ! ia32 } } } } } */
> > --
> > 2.34.1
> 

Reply via email to