diff --git a/llvm/include/llvm/CodeGen/TargetInstrInfo.h b/llvm/include/llvm/CodeGen/TargetInstrInfo.h --- a/llvm/include/llvm/CodeGen/TargetInstrInfo.h +++ b/llvm/include/llvm/CodeGen/TargetInstrInfo.h @@ -1464,6 +1464,13 @@ /// Returns true if the instruction is already predicated. virtual bool isPredicated(const MachineInstr &MI) const { return false; } + /// Assumes the instruction is already predicated and returns true if the + /// instruction can be predicated again. + virtual bool canPredicatePredicatedInstr(const MachineInstr &MI) const { + assert(isPredicated(MI) && "Instruction is not predicated"); + return false; + } + // Returns a MIRPrinter comment for this machine operand. virtual std::string createMIROperandComment(const MachineInstr &MI, const MachineOperand &Op, diff --git a/llvm/lib/CodeGen/EarlyIfConversion.cpp b/llvm/lib/CodeGen/EarlyIfConversion.cpp --- a/llvm/lib/CodeGen/EarlyIfConversion.cpp +++ b/llvm/lib/CodeGen/EarlyIfConversion.cpp @@ -321,9 +321,15 @@ return false; } - // Check that instruction is predicable and that it is not already - // predicated. - if (!TII->isPredicable(*I) || TII->isPredicated(*I)) { + // Check that instruction is predicable + if (!TII->isPredicable(*I)) { + LLVM_DEBUG(dbgs() << "Isn't predicable: " << *I); + return false; + } + + // Check that instruction is not already predicated. + if (TII->isPredicated(*I) && !TII->canPredicatePredicatedInstr(*I)) { + LLVM_DEBUG(dbgs() << "Is already predicated: " << *I); return false; }