diff --git a/lib/CodeGen/InlineSpiller.cpp b/lib/CodeGen/InlineSpiller.cpp index 1a62cad9cbb..dc55398d18b 100644 --- a/lib/CodeGen/InlineSpiller.cpp +++ b/lib/CodeGen/InlineSpiller.cpp @@ -1079,7 +1079,8 @@ bool HoistSpillHelper::rmFromMergeableSpills(MachineInstr *Spill, bool HoistSpillHelper::isSpillCandBB(unsigned OrigReg, VNInfo &OrigVNI, MachineBasicBlock &BB, unsigned &LiveReg) { SlotIndex Idx; - MachineBasicBlock::iterator MI = IPA.getLastInsertPointIter(BB); + LiveInterval &OrigLI = LIS.getInterval(OrigReg); + MachineBasicBlock::iterator MI = IPA.getLastInsertPointIter(OrigLI, BB); if (MI != BB.end()) Idx = LIS.getInstructionIndex(*MI); else @@ -1381,7 +1382,6 @@ void HoistSpillHelper::hoistAllSpills() { int Slot = Ent.first.first; unsigned OrigReg = SlotToOrigReg[Slot]; LiveInterval &OrigLI = LIS.getInterval(OrigReg); - IPA.setInterval(&OrigLI); VNInfo *OrigVNI = Ent.first.second; SmallPtrSet &EqValSpills = Ent.second; if (Ent.second.empty()) @@ -1422,7 +1422,7 @@ void HoistSpillHelper::hoistAllSpills() { for (auto const Insert : SpillsToIns) { MachineBasicBlock *BB = Insert.first; unsigned LiveReg = Insert.second; - MachineBasicBlock::iterator MI = IPA.getLastInsertPointIter(*BB); + MachineBasicBlock::iterator MI = IPA.getLastInsertPointIter(OrigLI, *BB); TII.storeRegToStackSlot(*BB, MI, LiveReg, false, Slot, MRI.getRegClass(LiveReg), &TRI); LIS.InsertMachineInstrRangeInMaps(std::prev(MI), MI); diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index b63fef8c87c..c309971d2c6 100644 --- a/lib/CodeGen/SplitKit.cpp +++ b/lib/CodeGen/SplitKit.cpp @@ -43,10 +43,11 @@ STATISTIC(NumRepairs, "Number of invalid live ranges repaired"); InsertPointAnalysis::InsertPointAnalysis(const LiveIntervals &lis, unsigned BBNum) - : LIS(lis), CurLI(nullptr), LastInsertPoint(BBNum) {} + : LIS(lis), LastInsertPoint(BBNum) {} SlotIndex -InsertPointAnalysis::computeLastInsertPoint(const MachineBasicBlock &MBB) { +InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI, + const MachineBasicBlock &MBB) { unsigned Num = MBB.getNumber(); std::pair &LIP = LastInsertPoint[Num]; SlotIndex MBBEnd = LIS.getMBBEndIdx(&MBB); @@ -85,14 +86,13 @@ InsertPointAnalysis::computeLastInsertPoint(const MachineBasicBlock &MBB) { if (!LIP.second) return LIP.first; - assert(CurLI && "CurLI not being set"); if (none_of(EHPadSucessors, [&](const MachineBasicBlock *EHPad) { - return LIS.isLiveInToMBB(*CurLI, EHPad); + return LIS.isLiveInToMBB(CurLI, EHPad); })) return LIP.first; // Find the value leaving MBB. - const VNInfo *VNI = CurLI->getVNInfoBefore(MBBEnd); + const VNInfo *VNI = CurLI.getVNInfoBefore(MBBEnd); if (!VNI) return LIP.first; @@ -109,8 +109,9 @@ InsertPointAnalysis::computeLastInsertPoint(const MachineBasicBlock &MBB) { } MachineBasicBlock::iterator -InsertPointAnalysis::getLastInsertPointIter(MachineBasicBlock &MBB) { - SlotIndex LIP = getLastInsertPoint(MBB); +InsertPointAnalysis::getLastInsertPointIter(const LiveInterval &CurLI, + MachineBasicBlock &MBB) { + SlotIndex LIP = getLastInsertPoint(CurLI, MBB); if (LIP == LIS.getMBBEndIdx(&MBB)) return MBB.end(); return LIS.getInstructionFromIndex(LIP); @@ -328,7 +329,6 @@ bool SplitAnalysis::isOriginalEndpoint(SlotIndex Idx) const { void SplitAnalysis::analyze(const LiveInterval *li) { clear(); CurLI = li; - IPA.setInterval(li); analyzeUses(); } diff --git a/lib/CodeGen/SplitKit.h b/lib/CodeGen/SplitKit.h index af97e4f8a9c..749019baeab 100644 --- a/lib/CodeGen/SplitKit.h +++ b/lib/CodeGen/SplitKit.h @@ -44,34 +44,32 @@ class LLVM_LIBRARY_VISIBILITY InsertPointAnalysis { private: const LiveIntervals &LIS; - /// Current LiveInterval for which to insert split or spill. - const LiveInterval *CurLI; - /// Last legal insert point in each basic block in the current function. /// The first entry is the first terminator, the second entry is the /// last valid point to insert a split or spill for a variable that is /// live into a landing pad successor. SmallVector, 8> LastInsertPoint; - SlotIndex computeLastInsertPoint(const MachineBasicBlock &MBB); + SlotIndex computeLastInsertPoint(const LiveInterval &CurLI, + const MachineBasicBlock &MBB); public: InsertPointAnalysis(const LiveIntervals &lis, unsigned BBNum); - void setInterval(const LiveInterval *LI) { CurLI = LI; } - - /// Return the base index of the last valid insert point in \pMBB. - SlotIndex getLastInsertPoint(const MachineBasicBlock &MBB) { + /// Return the base index of the last valid insert point for \pCurLI in \pMBB. + SlotIndex getLastInsertPoint(const LiveInterval &CurLI, + const MachineBasicBlock &MBB) { unsigned Num = MBB.getNumber(); // Inline the common simple case. if (LastInsertPoint[Num].first.isValid() && !LastInsertPoint[Num].second.isValid()) return LastInsertPoint[Num].first; - return computeLastInsertPoint(MBB); + return computeLastInsertPoint(CurLI, MBB); } - /// Returns the last insert point as an iterator. - MachineBasicBlock::iterator getLastInsertPointIter(MachineBasicBlock &); + /// Returns the last insert point as an iterator for \pCurLI in \pMBB. + MachineBasicBlock::iterator getLastInsertPointIter(const LiveInterval &CurLI, + MachineBasicBlock &MBB); }; /// SplitAnalysis - Analyze a LiveInterval, looking for live range splitting @@ -215,11 +213,11 @@ public: bool shouldSplitSingleBlock(const BlockInfo &BI, bool SingleInstrs) const; SlotIndex getLastSplitPoint(unsigned Num) { - return IPA.getLastInsertPoint(*MF.getBlockNumbered(Num)); + return IPA.getLastInsertPoint(*CurLI, *MF.getBlockNumbered(Num)); } MachineBasicBlock::iterator getLastSplitPointIter(MachineBasicBlock *BB) { - return IPA.getLastInsertPointIter(*BB); + return IPA.getLastInsertPointIter(*CurLI, *BB); } };