> -----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. 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