diff --git a/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp b/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp --- a/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp +++ b/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp @@ -336,23 +336,39 @@ assert(SI.isValid()); // Remove dead registers or mask bits. - for (auto &It : LiveRegs) { - const LiveInterval &LI = LIS.getInterval(It.first); + SmallVector SeenRegs; + for (auto &MO : LastTrackedMI->operands()) { + if (!MO.isReg() || !MO.getReg().isVirtual()) + continue; + if (MO.isUse() && !MO.readsReg()) + continue; + if (SeenRegs.end() != find(SeenRegs, MO.getReg())) + continue; + SeenRegs.push_back(MO.getReg()); + const LiveInterval &LI = LIS.getInterval(MO.getReg()); if (LI.hasSubRanges()) { + auto It = LiveRegs.end(); for (const auto &S : LI.subranges()) { if (!S.liveAt(SI)) { - auto PrevMask = It.second; - It.second &= ~S.LaneMask; - CurPressure.inc(It.first, PrevMask, It.second, *MRI); + if (It == LiveRegs.end()) { + It = LiveRegs.find(MO.getReg()); + if (It == LiveRegs.end()) + llvm_unreachable("register isn't live"); + } + auto PrevMask = It->second; + It->second &= ~S.LaneMask; + CurPressure.inc(MO.getReg(), PrevMask, It->second, *MRI); } } + if (It != LiveRegs.end() && It->second.none()) + LiveRegs.erase(It); } else if (!LI.liveAt(SI)) { - auto PrevMask = It.second; - It.second = LaneBitmask::getNone(); - CurPressure.inc(It.first, PrevMask, It.second, *MRI); + auto It = LiveRegs.find(MO.getReg()); + if (It == LiveRegs.end()) + llvm_unreachable("register isn't live"); + CurPressure.inc(MO.getReg(), It->second, LaneBitmask::getNone(), *MRI); + LiveRegs.erase(It); } - if (It.second.none()) - LiveRegs.erase(It.first); } MaxPressure = max(MaxPressure, CurPressure);