<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> <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> <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><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> <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><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>