[PATCH] D12923: Add support for function attribute "notail"

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 22 08:31:53 PDT 2015

To be clear, this is a debuging aid only?  It's not something required 
for correctness?  I'm somewhat bothered by that because it seems like it 
would be a useful implementation tool for higher level languages.

A couple of thoughts in no particular order:
1) Can we always annotate the call site rather than the function? That 
removes the unpredictability due to optimization.
2) Calling it something like "no-direct-tail-call" or "prefer-no-tail" 
would remove some of the confusion value.  When I see "notail", I expect 
that to always be respected; the best effort semantics come as a bit of 
a surprise.
3) This seems analogous to the "tail" marker in that it indicates a 
preference/option.  Whatever we end up with, it needs to be a verifier 
option to have a "tail" or "musttail" call site which is also "notail".  
It also needs to be an error to have a mustail callsite to a notail 
function (if such ends up existing.)
4) It somewhat feels like there are two concepts being intermixed here.  
1) A call site which will never be a tail call.  2) A function which we 
prefer not to tail call to.  Does it make sense to separate them?


On 09/21/2015 06:22 PM, Akira Hatanaka wrote:
> Several users have been asking for this function attribute to prevent 
> losing the calling functions's information in the backtrace. If we 
> attach the attribute to a function, ideally we would want to prevent 
> tail call optimization on all call sites that call the function. 
> However, the compiler cannot always tell which function is called from 
> a call site if it's an indirect call, so it's fine if an indirect call 
> to the marked function ends up being tail-call optimized. For direct 
> calls, we want the function attribute to prevent tail call 100% of the 
> time.
> We can also use a "notail" marker on the call instruction instead of 
> using a function attribute. The only downside of using a marker is 
> that we probably will never be able to prevent tail call optimization 
> on indirect calls even when the compiler can turn it into a direct 
> call (for example, via inlining). I'm not sure at the moment how 
> important this is.
> On Thu, Sep 17, 2015 at 9:47 AM, Philip Reames via llvm-commits 
> <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
>     +llvm-dev
>     Can you give a bit of background on what you're trying to address
>     here?  After reading through the discussion and seeing that this
>     is a best effort flag, I'm not sure that a function attribute is
>     the best way to describe this.  I'm open to being convinced it is,
>     but I'd like to hear a bit more about the use case and get broader
>     visibility on the proposal first.
>     Philip
>     On 09/16/2015 07:27 PM, Akira Hatanaka via llvm-commits wrote:
>>     ahatanak created this revision.
>>     ahatanak added a subscriber: llvm-commits.
>>     This patch adds support for a new IR function attribute "notail". The attribute is used to disable tail call optimization on calls to functions marked with the attribute.
>>     This attribute is different from the existing attribute "disable-tail-calls", which disables tail call optimizations on all call sites within the marked function.
>>     The patch to add support for the corresponding source-level function attribute is here:
>>     http://reviews.llvm.org/D12922
>>     http://reviews.llvm.org/D12923
>>     Files:
>>        docs/LangRef.rst
>>        include/llvm/Bitcode/LLVMBitCodes.h
>>        include/llvm/IR/Attributes.h
>>        include/llvm/IR/Instructions.h
>>        lib/AsmParser/LLLexer.cpp
>>        lib/AsmParser/LLParser.cpp
>>        lib/AsmParser/LLToken.h
>>        lib/Bitcode/Reader/BitcodeReader.cpp
>>        lib/Bitcode/Writer/BitcodeWriter.cpp
>>        lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>>        lib/IR/Attributes.cpp
>>        lib/IR/Verifier.cpp
>>        lib/Transforms/Scalar/TailRecursionElimination.cpp
>>        test/Bindings/llvm-c/Inputs/invalid.ll.bc
>>        test/Bindings/llvm-c/invalid-bitcode.test
>>        test/Bitcode/attributes.ll
>>        test/Bitcode/invalid.ll
>>        test/Bitcode/invalid.ll.bc
>>        test/CodeGen/X86/attr-notail.ll
>>        test/Transforms/TailCallElim/notail.ll
>>     _______________________________________________
>>     llvm-commits mailing list
>>     llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>>     http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>     _______________________________________________
>     llvm-commits mailing list
>     llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>     http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150922/23634da1/attachment.html>

More information about the llvm-commits mailing list