diff --git a/llvm/include/llvm/CodeGen/TargetInstrInfo.h b/llvm/include/llvm/CodeGen/TargetInstrInfo.h index 96cca0257782b9..5d5a6efab22077 100644 --- a/llvm/include/llvm/CodeGen/TargetInstrInfo.h +++ b/llvm/include/llvm/CodeGen/TargetInstrInfo.h @@ -1399,8 +1399,13 @@ class TargetInstrInfo : public MCInstrInfo { /// If the specified instruction defines any predicate /// or condition code register(s) used for predication, returns true as well /// as the definition predicate(s) by reference. - virtual bool DefinesPredicate(MachineInstr &MI, - std::vector &Pred) const { + /// SkipDead should be set to false at any point that dead + /// predicate instructions should be considered as being defined. + /// A dead predicate instruction is one that is guaranteed to be removed + /// after a call to PredicateInstruction. + virtual bool ClobbersPredicate(MachineInstr &MI, + std::vector &Pred, + bool SkipDead) const { return false; } diff --git a/llvm/lib/CodeGen/IfConversion.cpp b/llvm/lib/CodeGen/IfConversion.cpp index 1a5c5d6850172d..d149f8c3a139e5 100644 --- a/llvm/lib/CodeGen/IfConversion.cpp +++ b/llvm/lib/CodeGen/IfConversion.cpp @@ -751,7 +751,7 @@ bool IfConverter::CountDuplicatedInstructions( // A pred-clobbering instruction in the shared portion prevents // if-conversion. std::vector PredDefs; - if (TII->DefinesPredicate(*TIB, PredDefs)) + if (TII->ClobbersPredicate(*TIB, PredDefs, false)) return false; // If we get all the way to the branch instructions, don't count them. if (!TIB->isBranch()) @@ -1146,7 +1146,7 @@ void IfConverter::ScanInstructions(BBInfo &BBI, // FIXME: Make use of PredDefs? e.g. ADDC, SUBC sets predicates but are // still potentially predicable. std::vector PredDefs; - if (TII->DefinesPredicate(MI, PredDefs)) + if (TII->ClobbersPredicate(MI, PredDefs, true)) BBI.ClobbersPred = true; if (!TII->isPredicable(MI)) { diff --git a/llvm/lib/Target/AMDGPU/R600InstrInfo.cpp b/llvm/lib/Target/AMDGPU/R600InstrInfo.cpp index cf5791f39e562a..e3439e6c9e8845 100644 --- a/llvm/lib/Target/AMDGPU/R600InstrInfo.cpp +++ b/llvm/lib/Target/AMDGPU/R600InstrInfo.cpp @@ -963,8 +963,9 @@ R600InstrInfo::reverseBranchCondition(SmallVectorImpl &Cond) con return false; } -bool R600InstrInfo::DefinesPredicate(MachineInstr &MI, - std::vector &Pred) const { +bool R600InstrInfo::ClobbersPredicate(MachineInstr &MI, + std::vector &Pred, + bool SkipDead) const { return isPredicateSetter(MI.getOpcode()); } diff --git a/llvm/lib/Target/AMDGPU/R600InstrInfo.h b/llvm/lib/Target/AMDGPU/R600InstrInfo.h index 873ee08470cb35..1e249c6348f148 100644 --- a/llvm/lib/Target/AMDGPU/R600InstrInfo.h +++ b/llvm/lib/Target/AMDGPU/R600InstrInfo.h @@ -194,8 +194,8 @@ class R600InstrInfo final : public R600GenInstrInfo { unsigned NumFCycles, unsigned ExtraFCycles, BranchProbability Probability) const override; - bool DefinesPredicate(MachineInstr &MI, - std::vector &Pred) const override; + bool ClobbersPredicate(MachineInstr &MI, std::vector &Pred, + bool SkipDead) const override; bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, MachineBasicBlock &FMBB) const override; diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp index d81c8efa1597df..3822f9057d949d 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -589,8 +589,9 @@ bool ARMBaseInstrInfo::SubsumesPredicate(ArrayRef Pred1, } } -bool ARMBaseInstrInfo::DefinesPredicate( - MachineInstr &MI, std::vector &Pred) const { +bool ARMBaseInstrInfo::ClobbersPredicate(MachineInstr &MI, + std::vector &Pred, + bool SkipDead) const { bool Found = false; for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) { const MachineOperand &MO = MI.getOperand(i); diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.h b/llvm/lib/Target/ARM/ARMBaseInstrInfo.h index 5bf6e880056def..f997322107afb3 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.h +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.h @@ -171,8 +171,8 @@ class ARMBaseInstrInfo : public ARMGenInstrInfo { bool SubsumesPredicate(ArrayRef Pred1, ArrayRef Pred2) const override; - bool DefinesPredicate(MachineInstr &MI, - std::vector &Pred) const override; + bool ClobbersPredicate(MachineInstr &MI, std::vector &Pred, + bool SkipDead) const override; bool isPredicable(const MachineInstr &MI) const override; diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp index 93215a4b61870b..26fc093d15a760 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp @@ -1639,8 +1639,9 @@ bool HexagonInstrInfo::SubsumesPredicate(ArrayRef Pred1, return false; } -bool HexagonInstrInfo::DefinesPredicate(MachineInstr &MI, - std::vector &Pred) const { +bool HexagonInstrInfo::ClobbersPredicate(MachineInstr &MI, + std::vector &Pred, + bool SkipDead) const { const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo(); for (unsigned oper = 0; oper < MI.getNumOperands(); ++oper) { diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.h b/llvm/lib/Target/Hexagon/HexagonInstrInfo.h index 847b9a67289162..11717996935d2a 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.h +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.h @@ -238,8 +238,8 @@ class HexagonInstrInfo : public HexagonGenInstrInfo { /// If the specified instruction defines any predicate /// or condition code register(s) used for predication, returns true as well /// as the definition predicate(s) by reference. - bool DefinesPredicate(MachineInstr &MI, - std::vector &Pred) const override; + bool ClobbersPredicate(MachineInstr &MI, std::vector &Pred, + bool SkipDead) const override; /// Return true if the specified instruction can be predicated. /// By default, this returns true for every instruction with a diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp index fd83b5b6d4b8ce..487bf925ac999d 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp @@ -1802,8 +1802,9 @@ bool PPCInstrInfo::SubsumesPredicate(ArrayRef Pred1, return false; } -bool PPCInstrInfo::DefinesPredicate(MachineInstr &MI, - std::vector &Pred) const { +bool PPCInstrInfo::ClobbersPredicate(MachineInstr &MI, + std::vector &Pred, + bool SkipDead) const { // Note: At the present time, the contents of Pred from this function is // unused by IfConversion. This implementation follows ARM by pushing the // CR-defining operand. Because the 'DZ' and 'DNZ' count as types of diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.h b/llvm/lib/Target/PowerPC/PPCInstrInfo.h index e3e87022e97c37..79b7bd4a1d38b3 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.h +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.h @@ -472,8 +472,8 @@ class PPCInstrInfo : public PPCGenInstrInfo { bool SubsumesPredicate(ArrayRef Pred1, ArrayRef Pred2) const override; - bool DefinesPredicate(MachineInstr &MI, - std::vector &Pred) const override; + bool ClobbersPredicate(MachineInstr &MI, std::vector &Pred, + bool SkipDead) const override; // Comparison optimization.