Message ID | 20240725225502.1550809-1-ak@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | [v1,1/2] PR116080: Fix tail call dejagnu checks | expand |
Andi Kleen <ak@linux.intel.com> writes: > From: Andi Kleen <ak@gcc.gnu.org> > > - Run the target_effective tail_call checks without optimization to > match the actual test cases. > - Add an extra check for external tail calls to handle targets like > powerpc that cannot tail call between different object files. > This one will also cover templates. Two trivial comments below. > > gcc/testsuite/ChangeLog: > > PR testsuite/116080 > * g++.dg/musttail10.C: Use external tail call target check. > * g++.dg/musttail6.C: Dito. s/Dito/Ditto/ > * lib/target-supports.exp: Add external_tail_call. Disable > optimization for tail call checks. > --- > gcc/testsuite/g++.dg/musttail10.C | 2 +- > gcc/testsuite/g++.dg/musttail6.C | 2 +- > gcc/testsuite/lib/target-supports.exp | 14 +++++++++++--- > 3 files changed, 13 insertions(+), 5 deletions(-) > > diff --git a/gcc/testsuite/g++.dg/musttail10.C b/gcc/testsuite/g++.dg/musttail10.C > index ff7fcc7d8755..bd75affa2220 100644 > --- a/gcc/testsuite/g++.dg/musttail10.C > +++ b/gcc/testsuite/g++.dg/musttail10.C > @@ -8,7 +8,7 @@ double g() { [[gnu::musttail]] return f<int>(); } /* { dg-error "cannot tail-cal > > template <class T> > __attribute__((noinline, noclone, noipa)) > -T g1() { [[gnu::musttail]] return f<T>(); } /* { dg-error "target is not able" "" { target powerpc*-*-* } } */ > +T g1() { [[gnu::musttail]] return f<T>(); } /* { dg-error "target is not able" "" { target { external_tail_call } } } */ > > template <class T> > __attribute__((noinline, noclone, noipa)) > diff --git a/gcc/testsuite/g++.dg/musttail6.C b/gcc/testsuite/g++.dg/musttail6.C > index 5c6f69407ddb..81f6d9f3ca77 100644 > --- a/gcc/testsuite/g++.dg/musttail6.C > +++ b/gcc/testsuite/g++.dg/musttail6.C > @@ -1,6 +1,6 @@ > /* { dg-do compile { target { struct_tail_call } } } */ > +/* { dg-require-effective-target external_tail_call } */ > /* A lot of architectures will not build this due to PR115606 and PR115607 */ > -/* { dg-skip-if "powerpc does not support sibcall to templates" { powerpc*-*-* } } */ > /* { dg-options "-std=gnu++11" } */ > /* { dg-additional-options "-fdelayed-branch" { target sparc*-*-* } } */ > > diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp > index d368251ef9a4..0a3946e82d4b 100644 > --- a/gcc/testsuite/lib/target-supports.exp > +++ b/gcc/testsuite/lib/target-supports.exp > @@ -12741,7 +12741,15 @@ proc check_effective_target_tail_call { } { > return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > __attribute__((__noipa__)) void foo (void) { } > __attribute__((__noipa__)) void bar (void) { foo(); } > - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > +} > + > +# Return 1 if the target can perform tail-calls for externals > +proc check_effective_target_external_tail_call { } { > + return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > + extern __attribute__((__noipa__)) void foo (void); > + __attribute__((__noipa__)) void bar (void) { foo(); } There's far more instances of noipa in the testsuite than __noipa__. > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > } > > # Return 1 if the target can perform tail-call optimizations for structures > @@ -12751,9 +12759,9 @@ proc check_effective_target_struct_tail_call { } { > return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > // C++ > struct foo { int a, b; }; > - __attribute__((__noipa__)) struct foo foo (void) { return {}; } > + extern __attribute__((__noipa__)) struct foo foo (void); > __attribute__((__noipa__)) struct foo bar (void) { return foo(); } > - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > } > > # Return 1 if the target's calling sequence or its ABI
On Thu, Jul 25, 2024 at 4:09 PM Sam James <sam@gentoo.org> wrote: > > Andi Kleen <ak@linux.intel.com> writes: > > > From: Andi Kleen <ak@gcc.gnu.org> > > > > - Run the target_effective tail_call checks without optimization to > > match the actual test cases. > > - Add an extra check for external tail calls to handle targets like > > powerpc that cannot tail call between different object files. > > This one will also cover templates. > > Two trivial comments below. > > > > > gcc/testsuite/ChangeLog: > > > > PR testsuite/116080 > > * g++.dg/musttail10.C: Use external tail call target check. > > * g++.dg/musttail6.C: Dito. > > s/Dito/Ditto/ One extra nit, It is much (~5x) more common to use "Likewise" rather than Ditto in GCC's changelogs. [apinski@xeond2 gcc]$ git grep Ditto *{,/}ChangeLog*|wc -l 41565 [apinski@xeond2 gcc]$ git grep Likewise *{,/}ChangeLog*|wc -l 196587 Thanks, Andrew > > > * lib/target-supports.exp: Add external_tail_call. Disable > > optimization for tail call checks. > > --- > > gcc/testsuite/g++.dg/musttail10.C | 2 +- > > gcc/testsuite/g++.dg/musttail6.C | 2 +- > > gcc/testsuite/lib/target-supports.exp | 14 +++++++++++--- > > 3 files changed, 13 insertions(+), 5 deletions(-) > > > > diff --git a/gcc/testsuite/g++.dg/musttail10.C b/gcc/testsuite/g++.dg/musttail10.C > > index ff7fcc7d8755..bd75affa2220 100644 > > --- a/gcc/testsuite/g++.dg/musttail10.C > > +++ b/gcc/testsuite/g++.dg/musttail10.C > > @@ -8,7 +8,7 @@ double g() { [[gnu::musttail]] return f<int>(); } /* { dg-error "cannot tail-cal > > > > template <class T> > > __attribute__((noinline, noclone, noipa)) > > -T g1() { [[gnu::musttail]] return f<T>(); } /* { dg-error "target is not able" "" { target powerpc*-*-* } } */ > > +T g1() { [[gnu::musttail]] return f<T>(); } /* { dg-error "target is not able" "" { target { external_tail_call } } } */ > > > > template <class T> > > __attribute__((noinline, noclone, noipa)) > > diff --git a/gcc/testsuite/g++.dg/musttail6.C b/gcc/testsuite/g++.dg/musttail6.C > > index 5c6f69407ddb..81f6d9f3ca77 100644 > > --- a/gcc/testsuite/g++.dg/musttail6.C > > +++ b/gcc/testsuite/g++.dg/musttail6.C > > @@ -1,6 +1,6 @@ > > /* { dg-do compile { target { struct_tail_call } } } */ > > +/* { dg-require-effective-target external_tail_call } */ > > /* A lot of architectures will not build this due to PR115606 and PR115607 */ > > -/* { dg-skip-if "powerpc does not support sibcall to templates" { powerpc*-*-* } } */ > > /* { dg-options "-std=gnu++11" } */ > > /* { dg-additional-options "-fdelayed-branch" { target sparc*-*-* } } */ > > > > diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp > > index d368251ef9a4..0a3946e82d4b 100644 > > --- a/gcc/testsuite/lib/target-supports.exp > > +++ b/gcc/testsuite/lib/target-supports.exp > > @@ -12741,7 +12741,15 @@ proc check_effective_target_tail_call { } { > > return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > > __attribute__((__noipa__)) void foo (void) { } > > __attribute__((__noipa__)) void bar (void) { foo(); } > > - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > > +} > > + > > +# Return 1 if the target can perform tail-calls for externals > > +proc check_effective_target_external_tail_call { } { > > + return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > > + extern __attribute__((__noipa__)) void foo (void); > > + __attribute__((__noipa__)) void bar (void) { foo(); } > > There's far more instances of noipa in the testsuite than __noipa__. > > > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > > } > > > > # Return 1 if the target can perform tail-call optimizations for structures > > @@ -12751,9 +12759,9 @@ proc check_effective_target_struct_tail_call { } { > > return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > > // C++ > > struct foo { int a, b; }; > > - __attribute__((__noipa__)) struct foo foo (void) { return {}; } > > + extern __attribute__((__noipa__)) struct foo foo (void); > > __attribute__((__noipa__)) struct foo bar (void) { return foo(); } > > - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > > } > > > > # Return 1 if the target's calling sequence or its ABI
On Fri, Jul 26, 2024 at 12:55 AM Andi Kleen <ak@linux.intel.com> wrote: > > From: Andi Kleen <ak@gcc.gnu.org> > > - Run the target_effective tail_call checks without optimization to > match the actual test cases. > - Add an extra check for external tail calls to handle targets like > powerpc that cannot tail call between different object files. > This one will also cover templates. OK. Thanks, Richard. > gcc/testsuite/ChangeLog: > > PR testsuite/116080 > * g++.dg/musttail10.C: Use external tail call target check. > * g++.dg/musttail6.C: Dito. > * lib/target-supports.exp: Add external_tail_call. Disable > optimization for tail call checks. > --- > gcc/testsuite/g++.dg/musttail10.C | 2 +- > gcc/testsuite/g++.dg/musttail6.C | 2 +- > gcc/testsuite/lib/target-supports.exp | 14 +++++++++++--- > 3 files changed, 13 insertions(+), 5 deletions(-) > > diff --git a/gcc/testsuite/g++.dg/musttail10.C b/gcc/testsuite/g++.dg/musttail10.C > index ff7fcc7d8755..bd75affa2220 100644 > --- a/gcc/testsuite/g++.dg/musttail10.C > +++ b/gcc/testsuite/g++.dg/musttail10.C > @@ -8,7 +8,7 @@ double g() { [[gnu::musttail]] return f<int>(); } /* { dg-error "cannot tail-cal > > template <class T> > __attribute__((noinline, noclone, noipa)) > -T g1() { [[gnu::musttail]] return f<T>(); } /* { dg-error "target is not able" "" { target powerpc*-*-* } } */ > +T g1() { [[gnu::musttail]] return f<T>(); } /* { dg-error "target is not able" "" { target { external_tail_call } } } */ > > template <class T> > __attribute__((noinline, noclone, noipa)) > diff --git a/gcc/testsuite/g++.dg/musttail6.C b/gcc/testsuite/g++.dg/musttail6.C > index 5c6f69407ddb..81f6d9f3ca77 100644 > --- a/gcc/testsuite/g++.dg/musttail6.C > +++ b/gcc/testsuite/g++.dg/musttail6.C > @@ -1,6 +1,6 @@ > /* { dg-do compile { target { struct_tail_call } } } */ > +/* { dg-require-effective-target external_tail_call } */ > /* A lot of architectures will not build this due to PR115606 and PR115607 */ > -/* { dg-skip-if "powerpc does not support sibcall to templates" { powerpc*-*-* } } */ > /* { dg-options "-std=gnu++11" } */ > /* { dg-additional-options "-fdelayed-branch" { target sparc*-*-* } } */ > > diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp > index d368251ef9a4..0a3946e82d4b 100644 > --- a/gcc/testsuite/lib/target-supports.exp > +++ b/gcc/testsuite/lib/target-supports.exp > @@ -12741,7 +12741,15 @@ proc check_effective_target_tail_call { } { > return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > __attribute__((__noipa__)) void foo (void) { } > __attribute__((__noipa__)) void bar (void) { foo(); } > - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > +} > + > +# Return 1 if the target can perform tail-calls for externals > +proc check_effective_target_external_tail_call { } { > + return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > + extern __attribute__((__noipa__)) void foo (void); > + __attribute__((__noipa__)) void bar (void) { foo(); } > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > } > > # Return 1 if the target can perform tail-call optimizations for structures > @@ -12751,9 +12759,9 @@ proc check_effective_target_struct_tail_call { } { > return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > // C++ > struct foo { int a, b; }; > - __attribute__((__noipa__)) struct foo foo (void) { return {}; } > + extern __attribute__((__noipa__)) struct foo foo (void); > __attribute__((__noipa__)) struct foo bar (void) { return foo(); } > - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > } > > # Return 1 if the target's calling sequence or its ABI > -- > 2.45.2 >
Hi Andi! I'm lacking all possible context here, but I noticed: On 2024-07-25T15:55:01-0700, Andi Kleen <ak@linux.intel.com> wrote: > - Run the target_effective tail_call checks without optimization to > match the actual test cases. > --- a/gcc/testsuite/lib/target-supports.exp > +++ b/gcc/testsuite/lib/target-supports.exp > @@ -12741,7 +12741,15 @@ proc check_effective_target_tail_call { } { > return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { > __attribute__((__noipa__)) void foo (void) { } > __attribute__((__noipa__)) void bar (void) { foo(); } > - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > +} > +proc check_effective_target_external_tail_call { } { > + [...] > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > } > @@ -12751,9 +12759,9 @@ proc check_effective_target_struct_tail_call { } { > [...] > - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. > } ..., that means that a number of the new test cases are UNSUPPORTED, for example, x86_64 GNU/Linux: +UNSUPPORTED: c-c++-common/musttail1.c -Wc++-compat +UNSUPPORTED: c-c++-common/musttail12.c -Wc++-compat +PASS: c-c++-common/musttail13.c -Wc++-compat (test for errors, line 4) +PASS: c-c++-common/musttail13.c -Wc++-compat (test for excess errors) +UNSUPPORTED: c-c++-common/musttail2.c -Wc++-compat +UNSUPPORTED: c-c++-common/musttail3.c -Wc++-compat +UNSUPPORTED: c-c++-common/musttail4.c -Wc++-compat +PASS: c-c++-common/musttail5.c -Wc++-compat (test for errors, line 17) +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 10) +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 11) +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 12) +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 24) +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 25) +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 26) +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 5) +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 6) +PASS: c-c++-common/musttail5.c -Wc++-compat (test for excess errors) +UNSUPPORTED: c-c++-common/musttail7.c -Wc++-compat +UNSUPPORTED: c-c++-common/musttail8.c -Wc++-compat (Similarly for their C++ testing.) +UNSUPPORTED: g++.dg/musttail10.C +UNSUPPORTED: g++.dg/musttail11.C +UNSUPPORTED: g++.dg/musttail6.C +UNSUPPORTED: g++.dg/musttail9.C ..., and even a few existing test cases "regress" from PASS to UNSUPPORTED: [-PASS:-]{+UNSUPPORTED:+} gcc.dg/plugin/must-tail-call-1.c -fplugin=./must_tail_call_plugin.so[-(test for excess errors)-] [-PASS:-]{+UNSUPPORTED:+} gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so[-(test for errors, line 18)-] [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for errors, line 33)-] [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for errors, line 40)-] [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for errors, line 49)-] [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for errors, line 58)-] [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for excess errors)-] Similarly for ppc64le GNU/Linux. Is that intentional? Grüße Thomas
> ..., that means that a number of the new test cases are UNSUPPORTED, for > example, x86_64 GNU/Linux: > > +UNSUPPORTED: c-c++-common/musttail1.c -Wc++-compat > +UNSUPPORTED: c-c++-common/musttail12.c -Wc++-compat > +PASS: c-c++-common/musttail13.c -Wc++-compat (test for errors, line 4) > +PASS: c-c++-common/musttail13.c -Wc++-compat (test for excess errors) > +UNSUPPORTED: c-c++-common/musttail2.c -Wc++-compat > +UNSUPPORTED: c-c++-common/musttail3.c -Wc++-compat > +UNSUPPORTED: c-c++-common/musttail4.c -Wc++-compat > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for errors, line 17) > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 10) > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 11) > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 12) > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 24) > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 25) > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 26) > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 5) > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for warnings, line 6) > +PASS: c-c++-common/musttail5.c -Wc++-compat (test for excess errors) > +UNSUPPORTED: c-c++-common/musttail7.c -Wc++-compat > +UNSUPPORTED: c-c++-common/musttail8.c -Wc++-compat > > (Similarly for their C++ testing.) > > +UNSUPPORTED: g++.dg/musttail10.C > +UNSUPPORTED: g++.dg/musttail11.C > +UNSUPPORTED: g++.dg/musttail6.C > +UNSUPPORTED: g++.dg/musttail9.C > > ..., and even a few existing test cases "regress" from PASS to > UNSUPPORTED: > > [-PASS:-]{+UNSUPPORTED:+} gcc.dg/plugin/must-tail-call-1.c -fplugin=./must_tail_call_plugin.so[-(test for excess errors)-] > [-PASS:-]{+UNSUPPORTED:+} gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so[-(test for errors, line 18)-] > [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for errors, line 33)-] > [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for errors, line 40)-] > [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for errors, line 49)-] > [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for errors, line 58)-] > [-PASS: gcc.dg/plugin/must-tail-call-2.c -fplugin=./must_tail_call_plugin.so (test for excess errors)-] > > Similarly for ppc64le GNU/Linux. > > Is that intentional? Thanks. I will take a look. At least on x86_64-linux everything should be supported. On powerpc and ARM I expect some unsupported. But the previous test cases shouldn't have changed. Maybe we need more tail_call dejagnu tests that also enable -O2. The whole area is unfortunately somewhat of a mine field because of lots of varying restrictions on tail calls, both with frontends and targets. -Andi
I'm going to revert the patch for now. There are two problems: - The new tests don't have a unique name so the caching confuses the results. - To test with -O2 we need explicit musttail checks because tail call doesn't run with -O0 w/o musttail.
diff --git a/gcc/testsuite/g++.dg/musttail10.C b/gcc/testsuite/g++.dg/musttail10.C index ff7fcc7d8755..bd75affa2220 100644 --- a/gcc/testsuite/g++.dg/musttail10.C +++ b/gcc/testsuite/g++.dg/musttail10.C @@ -8,7 +8,7 @@ double g() { [[gnu::musttail]] return f<int>(); } /* { dg-error "cannot tail-cal template <class T> __attribute__((noinline, noclone, noipa)) -T g1() { [[gnu::musttail]] return f<T>(); } /* { dg-error "target is not able" "" { target powerpc*-*-* } } */ +T g1() { [[gnu::musttail]] return f<T>(); } /* { dg-error "target is not able" "" { target { external_tail_call } } } */ template <class T> __attribute__((noinline, noclone, noipa)) diff --git a/gcc/testsuite/g++.dg/musttail6.C b/gcc/testsuite/g++.dg/musttail6.C index 5c6f69407ddb..81f6d9f3ca77 100644 --- a/gcc/testsuite/g++.dg/musttail6.C +++ b/gcc/testsuite/g++.dg/musttail6.C @@ -1,6 +1,6 @@ /* { dg-do compile { target { struct_tail_call } } } */ +/* { dg-require-effective-target external_tail_call } */ /* A lot of architectures will not build this due to PR115606 and PR115607 */ -/* { dg-skip-if "powerpc does not support sibcall to templates" { powerpc*-*-* } } */ /* { dg-options "-std=gnu++11" } */ /* { dg-additional-options "-fdelayed-branch" { target sparc*-*-* } } */ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index d368251ef9a4..0a3946e82d4b 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -12741,7 +12741,15 @@ proc check_effective_target_tail_call { } { return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { __attribute__((__noipa__)) void foo (void) { } __attribute__((__noipa__)) void bar (void) { foo(); } - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. +} + +# Return 1 if the target can perform tail-calls for externals +proc check_effective_target_external_tail_call { } { + return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { + extern __attribute__((__noipa__)) void foo (void); + __attribute__((__noipa__)) void bar (void) { foo(); } + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. } # Return 1 if the target can perform tail-call optimizations for structures @@ -12751,9 +12759,9 @@ proc check_effective_target_struct_tail_call { } { return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand { // C++ struct foo { int a, b; }; - __attribute__((__noipa__)) struct foo foo (void) { return {}; } + extern __attribute__((__noipa__)) struct foo foo (void); __attribute__((__noipa__)) struct foo bar (void) { return foo(); } - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump. } # Return 1 if the target's calling sequence or its ABI
From: Andi Kleen <ak@gcc.gnu.org> - Run the target_effective tail_call checks without optimization to match the actual test cases. - Add an extra check for external tail calls to handle targets like powerpc that cannot tail call between different object files. This one will also cover templates. gcc/testsuite/ChangeLog: PR testsuite/116080 * g++.dg/musttail10.C: Use external tail call target check. * g++.dg/musttail6.C: Dito. * lib/target-supports.exp: Add external_tail_call. Disable optimization for tail call checks. --- gcc/testsuite/g++.dg/musttail10.C | 2 +- gcc/testsuite/g++.dg/musttail6.C | 2 +- gcc/testsuite/lib/target-supports.exp | 14 +++++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-)