mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-04 17:56:53 +00:00
InsertPointAnalysis: Move current live interval from being a class member
to query interfaces argument; NFC Differential Revision: http://reviews.llvm.org/D20532 llvm-svn: 270481
This commit is contained in:
parent
57c7e1ac0c
commit
8e0a89d063
@ -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<MachineInstr *, 16> &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);
|
||||
|
@ -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<SlotIndex, SlotIndex> &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();
|
||||
}
|
||||
|
||||
|
@ -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<std::pair<SlotIndex, SlotIndex>, 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);
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user