From df0cc2478370fd0a626c68ab70ec077fe2f5862a Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Thu, 16 Mar 2017 20:02:30 +0000 Subject: [PATCH] TargetInstrInfo: Provide default implementation of isTailCall(). In fact this default implementation should be the only implementation, keep it virtual for now to accomodate targets that don't model flags correctly. Differential Revision: https://reviews.llvm.org/D30747 llvm-svn: 297980 --- include/llvm/Target/TargetInstrInfo.h | 6 ++++-- lib/Target/AArch64/AArch64InstrInfo.cpp | 11 ----------- lib/Target/AArch64/AArch64InstrInfo.h | 2 -- lib/Target/ARM/ARMBaseInstrInfo.cpp | 13 ------------- lib/Target/ARM/ARMBaseInstrInfo.h | 2 -- lib/Target/X86/X86InstrInfo.cpp | 22 ---------------------- lib/Target/X86/X86InstrInfo.h | 2 -- 7 files changed, 4 insertions(+), 54 deletions(-) diff --git a/include/llvm/Target/TargetInstrInfo.h b/include/llvm/Target/TargetInstrInfo.h index b47587b1e29..0beb6cddf5b 100644 --- a/include/llvm/Target/TargetInstrInfo.h +++ b/include/llvm/Target/TargetInstrInfo.h @@ -1503,9 +1503,11 @@ public: return None; } - /// Determines whether |Inst| is a tail call instruction. + /// Determines whether \p Inst is a tail call instruction. Override this + /// method on targets that do not properly set MCID::Return and MCID::Call on + /// tail call instructions." virtual bool isTailCall(const MachineInstr &Inst) const { - return false; + return Inst.isReturn() && Inst.isCall(); } /// True if the instruction is bound to the top of its basic block and no diff --git a/lib/Target/AArch64/AArch64InstrInfo.cpp b/lib/Target/AArch64/AArch64InstrInfo.cpp index 6adf9f28b83..3fdb68e6ce1 100644 --- a/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -1619,17 +1619,6 @@ bool AArch64InstrInfo::isUnscaledLdSt(MachineInstr &MI) const { return isUnscaledLdSt(MI.getOpcode()); } -bool AArch64InstrInfo::isTailCall(const MachineInstr &Inst) const -{ - switch (Inst.getOpcode()) { - case AArch64::TCRETURNdi: - case AArch64::TCRETURNri: - return true; - default: - return false; - } -} - // Is this a candidate for ld/st merging or pairing? For example, we don't // touch volatiles or load/stores that have a hint to avoid pair formation. bool AArch64InstrInfo::isCandidateToMergeOrPair(MachineInstr &MI) const { diff --git a/lib/Target/AArch64/AArch64InstrInfo.h b/lib/Target/AArch64/AArch64InstrInfo.h index b579882041d..f4c54a27699 100644 --- a/lib/Target/AArch64/AArch64InstrInfo.h +++ b/lib/Target/AArch64/AArch64InstrInfo.h @@ -87,8 +87,6 @@ public: /// Return true if this is an unscaled load/store. bool isUnscaledLdSt(MachineInstr &MI) const; - bool isTailCall(const MachineInstr &Inst) const override; - static bool isPairableLdStInst(const MachineInstr &MI) { switch (MI.getOpcode()) { default: diff --git a/lib/Target/ARM/ARMBaseInstrInfo.cpp b/lib/Target/ARM/ARMBaseInstrInfo.cpp index 0ff01e6b03e..4f5711ca9a7 100644 --- a/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -4711,19 +4711,6 @@ bool ARMBaseInstrInfo::hasNOP() const { return Subtarget.getFeatureBits()[ARM::HasV6KOps]; } -bool ARMBaseInstrInfo::isTailCall(const MachineInstr &Inst) const -{ - switch (Inst.getOpcode()) { - case ARM::TAILJMPd: - case ARM::TAILJMPr: - case ARM::TCRETURNdi: - case ARM::TCRETURNri: - return true; - default: - return false; - } -} - bool ARMBaseInstrInfo::isSwiftFastImmShift(const MachineInstr *MI) const { if (MI->getNumOperands() < 4) return true; diff --git a/lib/Target/ARM/ARMBaseInstrInfo.h b/lib/Target/ARM/ARMBaseInstrInfo.h index d917c09140b..23777b821f9 100644 --- a/lib/Target/ARM/ARMBaseInstrInfo.h +++ b/lib/Target/ARM/ARMBaseInstrInfo.h @@ -109,8 +109,6 @@ public: getNoopForMachoTarget(NopInst); } - bool isTailCall(const MachineInstr &Inst) const override; - // Return the non-pre/post incrementing version of 'Opc'. Return 0 // if there is not such an opcode. virtual unsigned getUnindexedOpcode(unsigned Opc) const = 0; diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index 14aae30eef5..36458591003 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -10177,28 +10177,6 @@ X86InstrInfo::getSerializableDirectMachineOperandTargetFlags() const { return makeArrayRef(TargetFlags); } -bool X86InstrInfo::isTailCall(const MachineInstr &Inst) const { - switch (Inst.getOpcode()) { - case X86::TCRETURNdi: - case X86::TCRETURNmi: - case X86::TCRETURNri: - case X86::TCRETURNdi64: - case X86::TCRETURNmi64: - case X86::TCRETURNri64: - case X86::TAILJMPd: - case X86::TAILJMPm: - case X86::TAILJMPr: - case X86::TAILJMPd64: - case X86::TAILJMPm64: - case X86::TAILJMPr64: - case X86::TAILJMPm64_REX: - case X86::TAILJMPr64_REX: - return true; - default: - return false; - } -} - namespace { /// Create Global Base Reg pass. This initializes the PIC /// global base register for x86-32. diff --git a/lib/Target/X86/X86InstrInfo.h b/lib/Target/X86/X86InstrInfo.h index 862bf90d1ca..582515dc115 100644 --- a/lib/Target/X86/X86InstrInfo.h +++ b/lib/Target/X86/X86InstrInfo.h @@ -543,8 +543,6 @@ public: ArrayRef> getSerializableDirectMachineOperandTargetFlags() const override; - bool isTailCall(const MachineInstr &Inst) const override; - unsigned getOutliningBenefit(size_t SequenceSize, size_t Occurrences, bool CanBeTailCall) const override;