Message ID | 20240505181458.2903045-5-ak@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | [v5,1/5] Improve must tail in RTL backend | expand |
On Sun, May 5, 2024 at 8:16 PM Andi Kleen <ak@linux.intel.com> wrote: > > gcc/ChangeLog: > > * doc/extend.texi: Document [[musttail]] > --- > gcc/doc/extend.texi | 22 ++++++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) > > diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi > index e290265d68d3..deb100ad93b6 100644 > --- a/gcc/doc/extend.texi > +++ b/gcc/doc/extend.texi > @@ -9839,7 +9839,7 @@ same manner as the @code{deprecated} attribute. > @section Statement Attributes > @cindex Statement Attributes > > -GCC allows attributes to be set on null statements. @xref{Attribute Syntax}, > +GCC allows attributes to be set on statements. @xref{Attribute Syntax}, > for details of the exact syntax for using attributes. Other attributes are > available for functions (@pxref{Function Attributes}), variables > (@pxref{Variable Attributes}), labels (@pxref{Label Attributes}), enumerators > @@ -9896,6 +9896,22 @@ foo (int x, int y) > @code{y} is not actually incremented and the compiler can but does not > have to optimize it to just @code{return 42 + 42;}. > > +@cindex @code{musttail} statement attribute > +@item musttail > + > +The @code{gnu::musttail} or @code{clang::musttail} attribute > +can be applied to a @code{return} statement with a return-value expression > +that is a function call. It asserts that the call must be a tail call that > +does not allocate extra stack space. > + > +@smallexample > +[[gnu::musttail]] return foo(); > +@end smallexample > + > +If the compiler cannot generate a tail call it generates > +an error. Tail calls generally require enabling optimization. > +On some targets they may not be supported. Looks generally OK though does this mean people can debug programs using [[gnu::musttail]] only with optimized builds? It seems to me we should try harder to make [[gnu::musttail]] work at -O0 and generally behave the same at all optimization levels? > + > @end table > > @node Attribute Syntax > @@ -10019,7 +10035,9 @@ the constant expression, if present. > > @subsubheading Statement Attributes > In GNU C, an attribute specifier list may appear as part of a null > -statement. The attribute goes before the semicolon. > +statement. The attribute goes before the semicolon. > +Some attributes in new style syntax are also supported > +on non-null statements. > > @subsubheading Type Attributes > > -- > 2.44.0 >
> Looks generally OK though does this mean people can debug > programs using [[gnu::musttail]] only with optimized builds? It > seems to me we should try harder to make [[gnu::musttail]] work > at -O0 and generally behave the same at all optimization levels? Yes that's a fair point. The problem is tree-tailcall failing, not the RTL backend. Have to see what it would take to fix. I would prefer to do this as a followon patch though. -Andi
On Tue, May 14, 2024 at 6:30 PM Andi Kleen <ak@linux.intel.com> wrote: > > > Looks generally OK though does this mean people can debug > > programs using [[gnu::musttail]] only with optimized builds? It > > seems to me we should try harder to make [[gnu::musttail]] work > > at -O0 and generally behave the same at all optimization levels? > > Yes that's a fair point. The problem is tree-tailcall failing, > not the RTL backend. Have to see what it would take to fix. I would > prefer to do this as a followon patch though. Btw, -Og also doesn't run the tail-calls pass. I think we should at least try to run the pass at -Og and -O0 somewhere before pass_expand and in find_tail_calls simply only consider the musttail annotated calls in this case? It should be reasonably cheap to walk the return stmts of each function. I'm not sure why we run pass_tail_calls so "early" and within the regular post-IPA optimization pipeline rather than in the pre-expand set of passes common to all optimization levels. Possibly simply moving the pass works out already. Richard. > > -Andi
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index e290265d68d3..deb100ad93b6 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -9839,7 +9839,7 @@ same manner as the @code{deprecated} attribute. @section Statement Attributes @cindex Statement Attributes -GCC allows attributes to be set on null statements. @xref{Attribute Syntax}, +GCC allows attributes to be set on statements. @xref{Attribute Syntax}, for details of the exact syntax for using attributes. Other attributes are available for functions (@pxref{Function Attributes}), variables (@pxref{Variable Attributes}), labels (@pxref{Label Attributes}), enumerators @@ -9896,6 +9896,22 @@ foo (int x, int y) @code{y} is not actually incremented and the compiler can but does not have to optimize it to just @code{return 42 + 42;}. +@cindex @code{musttail} statement attribute +@item musttail + +The @code{gnu::musttail} or @code{clang::musttail} attribute +can be applied to a @code{return} statement with a return-value expression +that is a function call. It asserts that the call must be a tail call that +does not allocate extra stack space. + +@smallexample +[[gnu::musttail]] return foo(); +@end smallexample + +If the compiler cannot generate a tail call it generates +an error. Tail calls generally require enabling optimization. +On some targets they may not be supported. + @end table @node Attribute Syntax @@ -10019,7 +10035,9 @@ the constant expression, if present. @subsubheading Statement Attributes In GNU C, an attribute specifier list may appear as part of a null -statement. The attribute goes before the semicolon. +statement. The attribute goes before the semicolon. +Some attributes in new style syntax are also supported +on non-null statements. @subsubheading Type Attributes