On Sep 2, 2024, at 4:23 PM, Andi Kleen <a...@linux.intel.com> wrote: > > Andi Kleen <a...@linux.intel.com> writes: > > PING^3
Ok. >> Andi Kleen <a...@linux.intel.com> writes: >> >> PING^2 for https://gcc.gnu.org/pipermail/gcc-patches/2024-July/658602.html >> >> This fixes some musttail related test suite failures that cause noise on >> various targets. >> >>> Andi Kleen <a...@linux.intel.com> writes: >>> >>> I wanted to ping this patch. It fixes test suite noise on various >>> targets. >>> >>> https://gcc.gnu.org/pipermail/gcc-patches/2024-July/658602.html >>> >>> >>>> From: Andi Kleen <a...@gcc.gnu.org> >>>> >>>> This is a new attempt to fix PR116080. The previous try was reverted >>>> because it just broke a bunch of tests, hiding the problem. >>>> >>>> - musttail behaves differently than tailcall at -O0. Some of the test >>>> run at -O0, so add separate effective target tests for musttail. >>>> - New effective target tests need to use unique file names >>>> to make dejagnu caching work >>>> - Change the tests to use new targets >>>> - Add a external_musttail test to check for target's ability >>>> to do tail calls between translation units. This covers some powerpc >>>> ABIs. >>>> >>>> gcc/testsuite/ChangeLog: >>>> >>>> PR testsuite/116080 >>>> * c-c++-common/musttail1.c: Use musttail target. >>>> * c-c++-common/musttail12.c: Use struct_musttail target. >>>> * c-c++-common/musttail2.c: Use musttail target. >>>> * c-c++-common/musttail3.c: Likewise. >>>> * c-c++-common/musttail4.c: Likewise. >>>> * c-c++-common/musttail7.c: Likewise. >>>> * c-c++-common/musttail8.c: Likewise. >>>> * g++.dg/musttail10.C: Likewise. Replace powerpc checks with >>>> external_musttail. >>>> * g++.dg/musttail11.C: Use musttail target. >>>> * g++.dg/musttail6.C: Use musttail target. Replace powerpc >>>> checks with external_musttail. >>>> * g++.dg/musttail9.C: Use musttail target. >>>> * lib/target-supports.exp: Add musttail, struct_musttail, >>>> external_musttail targets. Remove optimization for musttail. >>>> Use unique file names for musttail. >>>> --- >>>> gcc/testsuite/c-c++-common/musttail1.c | 2 +- >>>> gcc/testsuite/c-c++-common/musttail12.c | 2 +- >>>> gcc/testsuite/c-c++-common/musttail2.c | 2 +- >>>> gcc/testsuite/c-c++-common/musttail3.c | 2 +- >>>> gcc/testsuite/c-c++-common/musttail4.c | 2 +- >>>> gcc/testsuite/c-c++-common/musttail7.c | 2 +- >>>> gcc/testsuite/c-c++-common/musttail8.c | 2 +- >>>> gcc/testsuite/g++.dg/musttail10.C | 4 ++-- >>>> gcc/testsuite/g++.dg/musttail11.C | 2 +- >>>> gcc/testsuite/g++.dg/musttail6.C | 4 ++-- >>>> gcc/testsuite/g++.dg/musttail9.C | 2 +- >>>> gcc/testsuite/lib/target-supports.exp | 30 ++++++++++++++++++++----- >>>> 12 files changed, 37 insertions(+), 19 deletions(-) >>>> >>>> diff --git a/gcc/testsuite/c-c++-common/musttail1.c >>>> b/gcc/testsuite/c-c++-common/musttail1.c >>>> index 74efcc2a0bc6..51549672e02a 100644 >>>> --- a/gcc/testsuite/c-c++-common/musttail1.c >>>> +++ b/gcc/testsuite/c-c++-common/musttail1.c >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { tail_call && { c || c++11 } } } } */ >>>> +/* { dg-do compile { target { musttail && { c || c++11 } } } } */ >>>> /* { dg-additional-options "-fdelayed-branch" { target sparc*-*-* } } */ >>>> >>>> int __attribute__((noinline,noclone,noipa)) >>>> diff --git a/gcc/testsuite/c-c++-common/musttail12.c >>>> b/gcc/testsuite/c-c++-common/musttail12.c >>>> index 4140bcd00950..475afc5af3f3 100644 >>>> --- a/gcc/testsuite/c-c++-common/musttail12.c >>>> +++ b/gcc/testsuite/c-c++-common/musttail12.c >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { struct_tail_call && { c || c++11 } } } } */ >>>> +/* { dg-do compile { target { struct_musttail && { c || c++11 } } } } */ >>>> /* { dg-additional-options "-fdelayed-branch" { target sparc*-*-* } } */ >>>> >>>> struct str >>>> diff --git a/gcc/testsuite/c-c++-common/musttail2.c >>>> b/gcc/testsuite/c-c++-common/musttail2.c >>>> index 86f2c3d77404..1970c4edd670 100644 >>>> --- a/gcc/testsuite/c-c++-common/musttail2.c >>>> +++ b/gcc/testsuite/c-c++-common/musttail2.c >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { tail_call && { c || c++11 } } } } */ >>>> +/* { dg-do compile { target { musttail && { c || c++11 } } } } */ >>>> >>>> struct box { char field[256]; int i; }; >>>> >>>> diff --git a/gcc/testsuite/c-c++-common/musttail3.c >>>> b/gcc/testsuite/c-c++-common/musttail3.c >>>> index ea9589c59ef2..7499fd6460b4 100644 >>>> --- a/gcc/testsuite/c-c++-common/musttail3.c >>>> +++ b/gcc/testsuite/c-c++-common/musttail3.c >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { tail_call && { c || c++11 } } } } */ >>>> +/* { dg-do compile { target { struct_musttail && { c || c++11 } } } } */ >>>> >>>> extern int foo2 (int x, ...); >>>> >>>> diff --git a/gcc/testsuite/c-c++-common/musttail4.c >>>> b/gcc/testsuite/c-c++-common/musttail4.c >>>> index 23f4b5e1cd68..bd6effa4b931 100644 >>>> --- a/gcc/testsuite/c-c++-common/musttail4.c >>>> +++ b/gcc/testsuite/c-c++-common/musttail4.c >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { tail_call && { c || c++11 } } } } */ >>>> +/* { dg-do compile { target { musttail && { c || c++11 } } } } */ >>>> >>>> struct box { char field[64]; int i; }; >>>> >>>> diff --git a/gcc/testsuite/c-c++-common/musttail7.c >>>> b/gcc/testsuite/c-c++-common/musttail7.c >>>> index c753a3fe9b2a..d17cb71256d7 100644 >>>> --- a/gcc/testsuite/c-c++-common/musttail7.c >>>> +++ b/gcc/testsuite/c-c++-common/musttail7.c >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { tail_call && { c || c++11 } } } } */ >>>> +/* { dg-do compile { target { musttail && { c || c++11 } } } } */ >>>> /* { dg-additional-options "-fdelayed-branch" { target sparc*-*-* } } */ >>>> >>>> void __attribute__((noipa)) f() {} >>>> diff --git a/gcc/testsuite/c-c++-common/musttail8.c >>>> b/gcc/testsuite/c-c++-common/musttail8.c >>>> index 9fa10e0b54c4..50ca1ac0dd48 100644 >>>> --- a/gcc/testsuite/c-c++-common/musttail8.c >>>> +++ b/gcc/testsuite/c-c++-common/musttail8.c >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { tail_call && { c || c++11 } } } } */ >>>> +/* { dg-do compile { target { musttail && { c || c++11 } } } } */ >>>> >>>> float f1(void); >>>> >>>> diff --git a/gcc/testsuite/g++.dg/musttail10.C >>>> b/gcc/testsuite/g++.dg/musttail10.C >>>> index ff7fcc7d8755..49430b1263a5 100644 >>>> --- a/gcc/testsuite/g++.dg/musttail10.C >>>> +++ b/gcc/testsuite/g++.dg/musttail10.C >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { tail_call } } } */ >>>> +/* { dg-do compile { target { musttail } } } */ >>>> /* { dg-options "-std=gnu++11" } */ >>>> /* { dg-additional-options "-fdelayed-branch" { target sparc*-*-* } } */ >>>> >>>> @@ -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_musttail } } } */ >>>> >>>> template <class T> >>>> __attribute__((noinline, noclone, noipa)) >>>> diff --git a/gcc/testsuite/g++.dg/musttail11.C >>>> b/gcc/testsuite/g++.dg/musttail11.C >>>> index 1779e3287a93..dca87247d504 100644 >>>> --- a/gcc/testsuite/g++.dg/musttail11.C >>>> +++ b/gcc/testsuite/g++.dg/musttail11.C >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { tail_call } } } */ >>>> +/* { dg-do compile { target { musttail } } } */ >>>> /* { dg-options "-std=gnu++11" } */ >>>> /* { dg-additional-options "-fdelayed-branch" { target sparc*-*-* } } */ >>>> >>>> diff --git a/gcc/testsuite/g++.dg/musttail6.C >>>> b/gcc/testsuite/g++.dg/musttail6.C >>>> index 5c6f69407ddb..5dcf302139ae 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-do compile { target { struct_musttail } } } */ >>>> +/* { dg-require-effective-target external_musttail } */ >>>> /* 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/g++.dg/musttail9.C >>>> b/gcc/testsuite/g++.dg/musttail9.C >>>> index fb0262e751be..85937dcdcd31 100644 >>>> --- a/gcc/testsuite/g++.dg/musttail9.C >>>> +++ b/gcc/testsuite/g++.dg/musttail9.C >>>> @@ -1,4 +1,4 @@ >>>> -/* { dg-do compile { target { tail_call } } } */ >>>> +/* { dg-do compile { target { musttail } } } */ >>>> /* { 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..10b2969f747a 100644 >>>> --- a/gcc/testsuite/lib/target-supports.exp >>>> +++ b/gcc/testsuite/lib/target-supports.exp >>>> @@ -12744,16 +12744,34 @@ proc check_effective_target_tail_call { } { >>>> } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a >>>> detailed dump. >>>> } >>>> >>>> -# Return 1 if the target can perform tail-call optimizations for >>>> structures >>>> +# Return 1 if the target can perform musttail optimizations of the >>>> +# most trivial type. This is separate from tail_call because musttail >>>> +# is supported at -O0. >>>> +proc check_effective_target_musttail { } { >>>> + return [check_no_messages_and_pattern musttail ",SIBCALL" rtl-expand { >>>> + __attribute__((__noipa__)) void foo (void) { } >>>> + __attribute__((__noipa__)) void bar (void) { [[gnu::musttail]] return >>>> foo(); } >>>> + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed >>>> dump. >>>> +} >>>> + >>>> +# Return 1 if the target can perform musttail for externals >>>> +proc check_effective_target_external_musttail { } { >>>> + return [check_no_messages_and_pattern external_musttail ",SIBCALL" >>>> rtl-expand { >>>> + extern __attribute__((__noipa__)) void foo (void); >>>> + __attribute__((__noipa__)) void bar (void) { [[gnu::musttail]] return >>>> foo(); } >>>> + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed >>>> dump. >>>> +} >>>> + >>>> +# Return 1 if the target can perform musttail optimizations for structures >>>> # checking with C++ because the C++ compiler has less tail call ability >>>> # due to PR115606 on some targets >>>> -proc check_effective_target_struct_tail_call { } { >>>> - return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand >>>> { >>>> +proc check_effective_target_struct_musttail { } { >>>> + return [check_no_messages_and_pattern struct_musttail ",SIBCALL" >>>> rtl-expand { >>>> // C++ >>>> struct foo { int a, b; }; >>>> - __attribute__((__noipa__)) struct foo foo (void) { return {}; } >>>> - __attribute__((__noipa__)) struct foo bar (void) { return foo(); } >>>> - } {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a >>>> detailed dump. >>>> + extern __attribute__((__noipa__)) struct foo foo (void); >>>> + __attribute__((__noipa__)) struct foo bar (void) { [[gnu::musttail]] >>>> return foo(); } >>>> + } {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed >>>> dump. >>>> } >>>> >>>> # Return 1 if the target's calling sequence or its ABI