<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Sep 24, 2015 at 1:53 PM, 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF"><div><div>
    <br>
    <br>
    <div>On 09/24/2015 01:47 PM, Akira Hatanaka
      wrote:<br>
    </div>
    <blockquote type="cite">
      <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> <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"></a><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>
                  <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>
                  <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><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><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> <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>
          </div>
        </div>
      </div>
    </blockquote></div></div>
    I think you're going to want to have the same dichotomy between (1)
    and (2) at the source level as in the IR.  The same issues apply in
    both cases.  <br></div></blockquote><div><br></div><div>I think you were suggesting we always annotate the call site rather than the function. Are you suggesting we do the same thing at the source level, i.e. allow marking the call site but not the function? I have to confirm, but I believe the people who requested this feature wanted to use a function attribute rather than marking each call site that calls the target function.<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF"><div><div>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <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>
                    <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"></a><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"></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><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>
    </blockquote>
    <br>
  </div></div></div>

</blockquote></div><br></div></div>