diff mbox series

[v1,1/2] PR116080: Fix tail call dejagnu checks

Message ID 20240725225502.1550809-1-ak@linux.intel.com
State New
Headers show
Series [v1,1/2] PR116080: Fix tail call dejagnu checks | expand

Commit Message

Andi Kleen July 25, 2024, 10:55 p.m. UTC
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(-)

Comments

Sam James July 25, 2024, 11:08 p.m. UTC | #1
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
Andrew Pinski July 25, 2024, 11:14 p.m. UTC | #2
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
Richard Biener July 26, 2024, 11:34 a.m. UTC | #3
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
>
Thomas Schwinge July 29, 2024, 10:22 a.m. UTC | #4
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
Andi Kleen July 29, 2024, 4:03 p.m. UTC | #5
> ..., 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
Andi Kleen July 29, 2024, 5:14 p.m. UTC | #6
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 mbox series

Patch

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