diff options
author | Andi Kleen <ak@gcc.gnu.org> | 2024-07-24 20:18:56 -0700 |
---|---|---|
committer | Andi Kleen <ak@gcc.gnu.org> | 2024-07-26 09:31:54 -0700 |
commit | ee41cd863b7c38ee3bc415ea7154954aa6facca3 (patch) | |
tree | cac06af19f6e5905ef4b5ee50efdc0584794a51c | |
parent | 7ad6b912d9ebd1f85afb725c8de05b27a97674ea (diff) | |
download | gcc-ee41cd863b7c38ee3bc415ea7154954aa6facca3.zip gcc-ee41cd863b7c38ee3bc415ea7154954aa6facca3.tar.gz gcc-ee41cd863b7c38ee3bc415ea7154954aa6facca3.tar.bz2 |
PR116080: Fix tail call dejagnu checks
- 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.
-rw-r--r-- | gcc/testsuite/g++.dg/musttail10.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/musttail6.C | 2 | ||||
-rw-r--r-- | 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 ff7fcc7..bd75aff 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 5c6f694..81f6d9f 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 d368251..0a3946e 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 |