diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 66d26bf5b11e2..529bffcae1319 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -1189,6 +1189,10 @@ bool RISCVVLOptimizer::isCandidate(const MachineInstr &MI) const { return false; } + assert(MI.getOperand(0).isReg() && + isVectorRegClass(MI.getOperand(0).getReg(), MRI) && + "All supported instructions produce a vector register result"); + LLVM_DEBUG(dbgs() << "Found a candidate for VL reduction: " << MI << "\n"); return true; } @@ -1295,9 +1299,6 @@ std::optional RISCVVLOptimizer::checkUsers(MachineInstr &MI) { bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) { LLVM_DEBUG(dbgs() << "Trying to reduce VL for " << MI << "\n"); - if (!isVectorRegClass(MI.getOperand(0).getReg(), MRI)) - return false; - auto CommonVL = checkUsers(MI); if (!CommonVL) return false; @@ -1347,14 +1348,11 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { auto PushOperands = [this, &Worklist](MachineInstr &MI, bool IgnoreSameBlock) { for (auto &Op : MI.operands()) { - if (!Op.isReg() || !Op.isUse() || !Op.getReg().isVirtual()) - continue; - - if (!isVectorRegClass(Op.getReg(), MRI)) + if (!Op.isReg() || !Op.isUse() || !Op.getReg().isVirtual() || + !isVectorRegClass(Op.getReg(), MRI)) continue; MachineInstr *DefMI = MRI->getVRegDef(Op.getReg()); - if (!isCandidate(*DefMI)) continue; @@ -1388,6 +1386,7 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { while (!Worklist.empty()) { assert(MadeChange); MachineInstr &MI = *Worklist.pop_back_val(); + assert(isCandidate(MI)); if (!tryReduceVL(MI)) continue; PushOperands(MI, /*IgnoreSameBlock*/ false);