diff --git a/llvm/include/llvm/CodeGen/StackMaps.h b/llvm/include/llvm/CodeGen/StackMaps.h index ff5522376105..fdc1a9143ed2 100644 --- a/llvm/include/llvm/CodeGen/StackMaps.h +++ b/llvm/include/llvm/CodeGen/StackMaps.h @@ -152,13 +152,6 @@ public: unsigned short DwarfRegNum; unsigned short Size; - void MarkInvalid() { Reg = 0; } - - // Only sort by the dwarf register number. - bool operator<(const LiveOutReg &LO) const { - return DwarfRegNum < LO.DwarfRegNum; - } - static bool IsInvalid(const LiveOutReg &LO) { return LO.Reg == 0; } LiveOutReg() : Reg(0), DwarfRegNum(0), Size(0) {} LiveOutReg(unsigned short Reg, unsigned short DwarfRegNum, unsigned short Size) diff --git a/llvm/lib/CodeGen/StackMaps.cpp b/llvm/lib/CodeGen/StackMaps.cpp index 5fe17a1889b6..116eef66c580 100644 --- a/llvm/lib/CodeGen/StackMaps.cpp +++ b/llvm/lib/CodeGen/StackMaps.cpp @@ -248,10 +248,15 @@ StackMaps::parseRegisterLiveOutMask(const uint32_t *Mask) const { // We don't need to keep track of a register if its super-register is already // in the list. Merge entries that refer to the same dwarf register and use // the maximum size that needs to be spilled. - std::sort(LiveOuts.begin(), LiveOuts.end()); - for (LiveOutVec::iterator I = LiveOuts.begin(), E = LiveOuts.end(); I != E; - ++I) { - for (LiveOutVec::iterator II = std::next(I); II != E; ++II) { + + std::sort(LiveOuts.begin(), LiveOuts.end(), + [](const LiveOutReg &LHS, const LiveOutReg &RHS) { + // Only sort by the dwarf register number. + return LHS.DwarfRegNum < RHS.DwarfRegNum; + }); + + for (auto I = LiveOuts.begin(), E = LiveOuts.end(); I != E; ++I) { + for (auto II = std::next(I); II != E; ++II) { if (I->DwarfRegNum != II->DwarfRegNum) { // Skip all the now invalid entries. I = --II; @@ -260,12 +265,15 @@ StackMaps::parseRegisterLiveOutMask(const uint32_t *Mask) const { I->Size = std::max(I->Size, II->Size); if (TRI->isSuperRegister(I->Reg, II->Reg)) I->Reg = II->Reg; - II->MarkInvalid(); + II->Reg = 0; // mark for deletion. } } + LiveOuts.erase( - std::remove_if(LiveOuts.begin(), LiveOuts.end(), LiveOutReg::IsInvalid), + std::remove_if(LiveOuts.begin(), LiveOuts.end(), + [](const LiveOutReg &LO) { return LO.Reg == 0; }), LiveOuts.end()); + return LiveOuts; }