<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <br>
    <br>
    <div class="moz-cite-prefix">On 09/23/2015 08:48 AM, Akira Hatanaka
      wrote:<br>
    </div>
    <blockquote
cite="mid:CAB297QyuL+wv-85iEBsbyibPLKNbv_dbrPh1SLMVtKG2eABLmg@mail.gmail.com"
      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 moz-do-not-send="true"
                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>
    If it's not simply best effort, that constrains our choices.  <br>
    <blockquote
cite="mid:CAB297QyuL+wv-85iEBsbyibPLKNbv_dbrPh1SLMVtKG2eABLmg@mail.gmail.com"
      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>
    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>
    <blockquote
cite="mid:CAB297QyuL+wv-85iEBsbyibPLKNbv_dbrPh1SLMVtKG2eABLmg@mail.gmail.com"
      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>
    (This only applies if we're talking about a function annotation. 
    The call site annotation applies to both direct and indirect calls.)<br>
    <blockquote
cite="mid:CAB297QyuL+wv-85iEBsbyibPLKNbv_dbrPh1SLMVtKG2eABLmg@mail.gmail.com"
      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>
    Yep.<br>
    <blockquote
cite="mid:CAB297QyuL+wv-85iEBsbyibPLKNbv_dbrPh1SLMVtKG2eABLmg@mail.gmail.com"
      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>
    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>
    <br>
    <blockquote
cite="mid:CAB297QyuL+wv-85iEBsbyibPLKNbv_dbrPh1SLMVtKG2eABLmg@mail.gmail.com"
      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
                                      moz-do-not-send="true"
                                      href="mailto:llvm-commits@lists.llvm.org"
                                      target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a></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 moz-do-not-send="true" href="http://reviews.llvm.org/D12922" target="_blank">http://reviews.llvm.org/D12922</a>

<a moz-do-not-send="true" 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 moz-do-not-send="true" href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>
<a moz-do-not-send="true" 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 moz-do-not-send="true"
                                      href="mailto:llvm-commits@lists.llvm.org"
                                      target="_blank">llvm-commits@lists.llvm.org</a><br>
                                    <a moz-do-not-send="true"
                                      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>
  </body>
</html>