Index: llvm/lib/Target/ARM/MVEVPTBlockPass.cpp =================================================================== --- llvm/lib/Target/ARM/MVEVPTBlockPass.cpp +++ llvm/lib/Target/ARM/MVEVPTBlockPass.cpp @@ -141,25 +141,24 @@ // be a VCMP, we check that after this loop. If we find another instruction // that reads cpsr, we return nullptr. MachineBasicBlock::iterator CmpMI = MI; + NewOpcode = 0; + while (CmpMI != MI->getParent()->begin()) { --CmpMI; - if (CmpMI->modifiesRegister(ARM::VPR, TRI)) - break; - if (CmpMI->readsRegister(ARM::VPR, TRI)) + if (CmpMI->modifiesRegister(ARM::VPR, TRI) || + CmpMI->readsRegister(ARM::VPR, TRI)) { + NewOpcode = VCMPOpcodeToVPT(CmpMI->getOpcode()); break; + } } - if (CmpMI == MI) - return nullptr; - NewOpcode = VCMPOpcodeToVPT(CmpMI->getOpcode()); - if (NewOpcode == 0) + if (!NewOpcode) return nullptr; // Search forward from CmpMI to MI, checking if either register was def'd if (registerDefinedBetween(CmpMI->getOperand(1).getReg(), std::next(CmpMI), - MI, TRI)) - return nullptr; - if (registerDefinedBetween(CmpMI->getOperand(2).getReg(), std::next(CmpMI), + MI, TRI) || + registerDefinedBetween(CmpMI->getOperand(2).getReg(), std::next(CmpMI), MI, TRI)) return nullptr; return &*CmpMI;