diff --git a/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h b/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h index c837e13cb43..19d17036585 100644 --- a/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h +++ b/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h @@ -216,6 +216,14 @@ public: iterator_range::iterator> getVRegsMem(unsigned OpIdx); + /// Get the end iterator for a range starting at \p StartIdx and + /// spannig \p NumVal in NewVRegs. + /// \pre StartIdx + NumVal <= NewVRegs.size() + SmallVectorImpl::const_iterator + getNewVRegsEnd(unsigned StartIdx, unsigned NumVal) const; + SmallVectorImpl::iterator getNewVRegsEnd(unsigned StartIdx, + unsigned NumVal); + public: /// Create an OperandsMapper that will hold the information to apply \p /// InstrMapping to \p MI. diff --git a/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp b/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp index f945a087e60..6173369f9cc 100644 --- a/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp +++ b/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp @@ -538,13 +538,26 @@ RegisterBankInfo::OperandsMapper::getVRegsMem(unsigned OpIdx) { NewVRegs.push_back(0); } SmallVectorImpl::iterator End = - NewVRegs.size() <= StartIdx + NumPartialVal + 1 - ? NewVRegs.end() - : &NewVRegs[StartIdx + NumPartialVal + 1]; + getNewVRegsEnd(StartIdx, NumPartialVal); return make_range(&NewVRegs[StartIdx], End); } +SmallVectorImpl::const_iterator +RegisterBankInfo::OperandsMapper::getNewVRegsEnd(unsigned StartIdx, + unsigned NumVal) const { + return const_cast(this)->getNewVRegsEnd(StartIdx, NumVal); +} +SmallVectorImpl::iterator +RegisterBankInfo::OperandsMapper::getNewVRegsEnd(unsigned StartIdx, + unsigned NumVal) { + assert((NewVRegs.size() == StartIdx + NumVal || + NewVRegs.size() > StartIdx + NumVal) && + "NewVRegs too small to contain all the partial mapping"); + return NewVRegs.size() <= StartIdx + NumVal ? NewVRegs.end() + : &NewVRegs[StartIdx + NumVal]; +} + void RegisterBankInfo::OperandsMapper::createVRegs(unsigned OpIdx) { assert(OpIdx < getMI().getNumOperands() && "Out-of-bound access"); iterator_range::iterator> NewVRegsForOpIdx = @@ -588,9 +601,7 @@ RegisterBankInfo::OperandsMapper::getVRegs(unsigned OpIdx, unsigned PartMapSize = getInstrMapping().getOperandMapping(OpIdx).BreakDown.size(); SmallVectorImpl::const_iterator End = - NewVRegs.size() <= StartIdx + PartMapSize + 1 - ? NewVRegs.end() - : &NewVRegs[StartIdx + PartMapSize + 1]; + getNewVRegsEnd(StartIdx, PartMapSize); iterator_range::const_iterator> Res = make_range(&NewVRegs[StartIdx], End); #ifndef NDEBUG