<div dir="ltr">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><div class="gmail_quote"><div dir="ltr">On Wed, Mar 8, 2017 at 1:43 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">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="m_-8940148861675527518Apple-interchange-newline gmail_msg"><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>