<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Wed, Mar 8, 2017 at 1:52 PM Matthias Braun <<a href="mailto:mbraun@apple.com">mbraun@apple.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg">PPC doesn't seem to have an TII::isTailCall() overload. You have to mark call and return instructions in llvm, even if the function is not called "call" or "return" in the instruction set. For example if you look up all those instructions that X86InstrInfo::isTailCall checks for, they are all marked with isReturn=1 and isCall=1 in the tablegen files.</div><div class="gmail_msg"><br class="gmail_msg"></div></div></blockquote><div><br></div><div>Ah, right -- I keep forgetting this is at the LLVM level.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"></div><div class="gmail_msg">The only thing I can find browsing around right now seems to be the Hexagon implementation os isTailCall() which looks suspicious to me. At the very least we should replace the default implementation of isTailCall() with "return MI.isReturn() && MI.isCall();" and state in the document that you only need to override this when your target is broken :) So people stop providing half-complete unnecessary implementations in their targets.</div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div></div></blockquote><div><br></div><div>Sounds good to me. Testing should iron out the bugs if there are any anyway if that default implementation doesn't quite do it.</div><div><br></div><div>Are you able to make that change, or can this wait?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"></div><div class="gmail_msg">- Matthias</div></div><div style="word-wrap:break-word" class="gmail_msg"><br class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Mar 7, 2017, at 6:47 PM, Dean Michael Berris <<a href="mailto:dberris@google.com" class="gmail_msg" target="_blank">dberris@google.com</a>> wrote:</div><br class="m_-5458638667421789377Apple-interchange-newline gmail_msg"><div class="gmail_msg"><div dir="ltr" class="gmail_msg">As far as I can tell, on PowerPC there are special instructions that indicate a tail call which is neither a call nor a return. On X86, it's a normal jmp instruction, so it's neither a call nor a return either.</div><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Wed, Mar 8, 2017 at 1:43 PM Matthias Braun <<a href="mailto:mbraun@apple.com" class="gmail_msg" target="_blank">mbraun@apple.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg">Do you have an example? Sounds more like some targets are broken and don't set the flags correctly to me...</div></div><div style="word-wrap:break-word" class="gmail_msg"><br class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Mar 7, 2017, at 6:42 PM, Dean Michael Berris <<a href="mailto:dberris@google.com" class="gmail_msg" target="_blank">dberris@google.com</a>> wrote:</div><br class="gmail_msg m_-5458638667421789377m_-8940148861675527518Apple-interchange-newline"><div class="gmail_msg"><div dir="ltr" class="gmail_msg">On some platforms, since they're special instructions, the check isn't as straight forward as that. At least I don't think it is. If it proves to be more efficient to do that instead of using something at a higher level to indicate the semantics then I'm fine with an alternative approach.</div><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Wed, Mar 8, 2017 at 12:59 PM Matthias Braun <<a href="mailto:mbraun@apple.com" class="gmail_msg" target="_blank">mbraun@apple.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Just came accross this function, are you sure we need it? Shouldn't MachineInstr::isReturn() && MachineInstr::isCall() be the same as isTailCall()?<br class="gmail_msg">
<br class="gmail_msg">
- Matthias<br class="gmail_msg">
<br class="gmail_msg">
> On Aug 31, 2016, at 6:03 PM, Dean Michael Berris via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg">
><br class="gmail_msg">
> Author: dberris<br class="gmail_msg">
> Date: Wed Aug 31 20:03:22 2016<br class="gmail_msg">
> New Revision: 280331<br class="gmail_msg">
><br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=280331&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=280331&view=rev</a><br class="gmail_msg">
> Log:<br class="gmail_msg">
> [XRay][NFC] Promote isTailCall() as virtual in TargetInstrInfo.<br class="gmail_msg">
><br class="gmail_msg">
> This change is broken out from D23986, where XRay detects tail call<br class="gmail_msg">
> exits.<br class="gmail_msg">
><br class="gmail_msg">
> Modified:<br class="gmail_msg">
>    llvm/trunk/include/llvm/Target/TargetInstrInfo.h<br class="gmail_msg">
>    llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h<br class="gmail_msg">
>    llvm/trunk/lib/Target/X86/X86InstrInfo.cpp<br class="gmail_msg">
>    llvm/trunk/lib/Target/X86/X86InstrInfo.h<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/Target/TargetInstrInfo.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetInstrInfo.h?rev=280331&r1=280330&r2=280331&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetInstrInfo.h?rev=280331&r1=280330&r2=280331&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/Target/TargetInstrInfo.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/Target/TargetInstrInfo.h Wed Aug 31 20:03:22 2016<br class="gmail_msg">
> @@ -1481,6 +1481,11 @@ public:<br class="gmail_msg">
>     return None;<br class="gmail_msg">
>   }<br class="gmail_msg">
><br class="gmail_msg">
> +  /// Determines whether |Inst| is a tail call instruction.<br class="gmail_msg">
> +  virtual bool isTailCall(const MachineInstr &Inst) const {<br class="gmail_msg">
> +    return false;<br class="gmail_msg">
> +  }<br class="gmail_msg">
> +<br class="gmail_msg">
> private:<br class="gmail_msg">
>   unsigned CallFrameSetupOpcode, CallFrameDestroyOpcode;<br class="gmail_msg">
>   unsigned CatchRetOpcode;<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h?rev=280331&r1=280330&r2=280331&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h?rev=280331&r1=280330&r2=280331&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h (original)<br class="gmail_msg">
> +++ llvm/trunk/lib/Target/Hexagon/HexagonInstrInfo.h Wed Aug 31 20:03:22 2016<br class="gmail_msg">
> @@ -340,7 +340,10 @@ public:<br class="gmail_msg">
>   bool isSignExtendingLoad(const MachineInstr &MI) const;<br class="gmail_msg">
>   bool isSolo(const MachineInstr &MI) const;<br class="gmail_msg">
>   bool isSpillPredRegOp(const MachineInstr &MI) const;<br class="gmail_msg">
> -  bool isTailCall(const MachineInstr &MI) const;<br class="gmail_msg">
> +<br class="gmail_msg">
> +  // Defined in Target.h.<br class="gmail_msg">
> +  bool isTailCall(const MachineInstr &MI) const override;<br class="gmail_msg">
> +<br class="gmail_msg">
>   bool isTC1(const MachineInstr &MI) const;<br class="gmail_msg">
>   bool isTC2(const MachineInstr &MI) const;<br class="gmail_msg">
>   bool isTC2Early(const MachineInstr &MI) const;<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=280331&r1=280330&r2=280331&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=280331&r1=280330&r2=280331&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original)<br class="gmail_msg">
> +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Wed Aug 31 20:03:22 2016<br class="gmail_msg">
> @@ -8061,6 +8061,29 @@ X86InstrInfo::getSerializableDirectMachi<br class="gmail_msg">
>   return makeArrayRef(TargetFlags);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> +bool X86InstrInfo::isTailCall(const MachineInstr &Inst) const {<br class="gmail_msg">
> +  switch (Inst.getOpcode()) {<br class="gmail_msg">
> +    case X86::TCRETURNdi:<br class="gmail_msg">
> +    case X86::TCRETURNmi:<br class="gmail_msg">
> +    case X86::TCRETURNri:<br class="gmail_msg">
> +    case X86::TCRETURNdi64:<br class="gmail_msg">
> +    case X86::TCRETURNmi64:<br class="gmail_msg">
> +    case X86::TCRETURNri64:<br class="gmail_msg">
> +    case X86::TAILJMPd:<br class="gmail_msg">
> +    case X86::TAILJMPm:<br class="gmail_msg">
> +    case X86::TAILJMPr:<br class="gmail_msg">
> +    case X86::TAILJMPd64:<br class="gmail_msg">
> +    case X86::TAILJMPm64:<br class="gmail_msg">
> +    case X86::TAILJMPr64:<br class="gmail_msg">
> +    case X86::TAILJMPd64_REX:<br class="gmail_msg">
> +    case X86::TAILJMPm64_REX:<br class="gmail_msg">
> +    case X86::TAILJMPr64_REX:<br class="gmail_msg">
> +      return true;<br class="gmail_msg">
> +    default:<br class="gmail_msg">
> +      return false;<br class="gmail_msg">
> +  }<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> namespace {<br class="gmail_msg">
>   /// Create Global Base Reg pass. This initializes the PIC<br class="gmail_msg">
>   /// global base register for x86-32.<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.h?rev=280331&r1=280330&r2=280331&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.h?rev=280331&r1=280330&r2=280331&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/lib/Target/X86/X86InstrInfo.h (original)<br class="gmail_msg">
> +++ llvm/trunk/lib/Target/X86/X86InstrInfo.h Wed Aug 31 20:03:22 2016<br class="gmail_msg">
> @@ -541,6 +541,8 @@ public:<br class="gmail_msg">
>   ArrayRef<std::pair<unsigned, const char *>><br class="gmail_msg">
>   getSerializableDirectMachineOperandTargetFlags() const override;<br class="gmail_msg">
><br class="gmail_msg">
> +  bool isTailCall(const MachineInstr &Inst) const override;<br class="gmail_msg">
> +<br class="gmail_msg">
> protected:<br class="gmail_msg">
>   /// Commutes the operands in the given instruction by changing the operands<br class="gmail_msg">
>   /// order and/or changing the instruction's opcode and/or the immediate value<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> _______________________________________________<br class="gmail_msg">
> llvm-commits mailing list<br class="gmail_msg">
> <a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div>
</div></blockquote></div><br class="gmail_msg"></div></blockquote></div>
</div></blockquote></div><br class="gmail_msg"></div></blockquote></div></div>