<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Sep 23, 2015 at 11:13 AM, Philip Reames <span dir="ltr"><<a href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"><span class="">
<br>
<br>
<div>On 09/23/2015 08:48 AM, Akira Hatanaka
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">On Tue, Sep 22, 2015 at 8:31 AM,
Philip Reames <span dir="ltr"><<a href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> 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. <br>
<br>
</div>
</blockquote>
<div><br>
</div>
<div>It's not purely a debugging aid that helps when you are
using the debugger. There are projects (that are not
debuggers) that rely on not missing frames to produce
results that are useful.</div>
</div>
</div>
</div>
</blockquote></span>
If it's not simply best effort, that constrains our choices. <br><span class="">
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div> <br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> A couple of
thoughts in no particular order:<br>
1) Can we always annotate the call site rather than the
function? That removes the unpredictability due to
optimization.<br>
</div>
</blockquote>
<div><br>
</div>
<div>Annotating the call site should be fine. For the use
cases that we care about, it probably isn't important to
prevent tail calls on indirect calls.</div>
</div>
</div>
</div>
</blockquote></span>
Given this, I would lean towards a notail value being added as an
alternative to "tail" and "musttail". This seems to fit the
existing uses, doesn't have any obvious loop holes or best effort
semantics, and solves the problem at hand. <br><span class="">
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div> <br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> 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.</div>
</blockquote>
<div><br>
</div>
<div>I agree. A name that indicates it's only a best effort
option or it's an option that affects only direct calls
would be good.</div>
</div>
</div>
</div>
</blockquote></span>
(This only applies if we're talking about a function annotation.
The call site annotation applies to both direct and indirect calls.)<span class=""><br>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> <br>
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.)<br>
</div>
</blockquote>
<div><br>
</div>
<div>If we are going to annotate the function, I think we
should have the verifier catch incompatibilities between
the markers on the call sites and the function attribute
on the called functions.</div>
<div><br>
</div>
<div>If we are annotating the call site, the verifier check
isn't needed since the tail-call related markers are enums
that are mutually exclusive.</div>
</div>
</div>
</div>
</blockquote></span>
Yep.<span class=""><br>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div> <br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> 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?<span><font color="#888888"><br>
<br>
</font></span></div>
</blockquote>
<div><br>
</div>
<div>Yes, it makes sense to separate them. For the use case
we care about, either 1) or 2) will do. We don't have to
have support for both.</div>
</div>
</div>
</div>
</blockquote></span>
I would lean toward doing (1) for now. We can come back and
implement (2) at a later time if we find it's needed. After (1),
each call site will have four states:<br>
- "notail" - Can not be a tail call.<br>
- "" - May be a tail call if analysis finds it legal, profitable,
and desirable*<br>
- "tail" - May be a tail call, profitability hinted<br>
- "musttail" - Must be a tail call.<br>
<br>
* (2) would basically just change the desirability of moving from ""
to "tail". <br><div><div class="h5">
<br></div></div></div></blockquote><div><br></div><div>OK. I'm considering changing the direction of this patch and marking the call site instead of the called function.</div><div><br></div><div>We should also discuss what kinds of source level attributes we'll need. My plan is to attach an attribute that indicates notail (something like no_direct_tail) to the called function declaration and definition and then mark all the direct call sites in the IR that call the function as notaill. In addition to that, it seems like we want to have a way to attach the attribute directly to the call site:</div><div><br></div><div>void (*indirectCall)(int, int, int);</div><div><br></div><div>void foo1(int a, int b) {</div><div> (*indirectCall)(a, b, c) __attribute__((notail));<br></div><div>}</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF"><div><div class="h5">
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div><br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"><span><font color="#888888"> Philip</font></span>
<div>
<div><br>
<br>
<div>On 09/21/2015 06:22 PM, Akira Hatanaka wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>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.</div>
<div><br>
</div>
<div>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.</div>
<div><br>
</div>
<div>
<div>
<div>
<div class="gmail_extra">
<div class="gmail_quote">On Thu, Sep 17,
2015 at 9:47 AM, Philip Reames via
llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank"></a><a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
<div>+llvm-dev<br>
<br>
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.<br>
<br>
Philip
<div>
<div><br>
<br>
On 09/16/2015 07:27 PM,
Akira Hatanaka via
llvm-commits wrote:<br>
</div>
</div>
</div>
<blockquote type="cite">
<div>
<div>
<pre>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:
<a href="http://reviews.llvm.org/D12922" target="_blank">http://reviews.llvm.org/D12922</a>
<a href="http://reviews.llvm.org/D12923" target="_blank">http://reviews.llvm.org/D12923</a>
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
</pre>
<br>
<fieldset></fieldset>
<br>
</div>
</div>
<pre>_______________________________________________
llvm-commits mailing list
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a>
</pre>
</blockquote>
<br>
</div>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</blockquote>
<br>
</div></div></div>
</blockquote></div><br></div></div>