|
@@ -57,6 +57,7 @@ namespace {
|
|
|
const TargetRegisterInfo* TRI;
|
|
|
MachineFrameInfo *MFI;
|
|
|
MachineRegisterInfo *MRI;
|
|
|
+ SlotIndexes *SIs;
|
|
|
LiveIntervals *LIs;
|
|
|
LiveStacks *LSs;
|
|
|
VirtRegMap *VRM;
|
|
@@ -68,7 +69,7 @@ namespace {
|
|
|
MachineBasicBlock *BarrierMBB;
|
|
|
|
|
|
// Barrier - Current barrier index.
|
|
|
- LiveIndex BarrierIdx;
|
|
|
+ SlotIndex BarrierIdx;
|
|
|
|
|
|
// CurrLI - Current live interval being split.
|
|
|
LiveInterval *CurrLI;
|
|
@@ -83,16 +84,19 @@ namespace {
|
|
|
DenseMap<unsigned, int> IntervalSSMap;
|
|
|
|
|
|
// Def2SpillMap - A map from a def instruction index to spill index.
|
|
|
- DenseMap<LiveIndex, LiveIndex> Def2SpillMap;
|
|
|
+ DenseMap<SlotIndex, SlotIndex> Def2SpillMap;
|
|
|
|
|
|
public:
|
|
|
static char ID;
|
|
|
- PreAllocSplitting() : MachineFunctionPass(&ID) {}
|
|
|
+ PreAllocSplitting()
|
|
|
+ : MachineFunctionPass(&ID) {}
|
|
|
|
|
|
virtual bool runOnMachineFunction(MachineFunction &MF);
|
|
|
|
|
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
|
|
AU.setPreservesCFG();
|
|
|
+ AU.addRequired<SlotIndexes>();
|
|
|
+ AU.addPreserved<SlotIndexes>();
|
|
|
AU.addRequired<LiveIntervals>();
|
|
|
AU.addPreserved<LiveIntervals>();
|
|
|
AU.addRequired<LiveStacks>();
|
|
@@ -129,23 +133,23 @@ namespace {
|
|
|
private:
|
|
|
MachineBasicBlock::iterator
|
|
|
findNextEmptySlot(MachineBasicBlock*, MachineInstr*,
|
|
|
- LiveIndex&);
|
|
|
+ SlotIndex&);
|
|
|
|
|
|
MachineBasicBlock::iterator
|
|
|
findSpillPoint(MachineBasicBlock*, MachineInstr*, MachineInstr*,
|
|
|
- SmallPtrSet<MachineInstr*, 4>&, LiveIndex&);
|
|
|
+ SmallPtrSet<MachineInstr*, 4>&, SlotIndex&);
|
|
|
|
|
|
MachineBasicBlock::iterator
|
|
|
- findRestorePoint(MachineBasicBlock*, MachineInstr*, LiveIndex,
|
|
|
- SmallPtrSet<MachineInstr*, 4>&, LiveIndex&);
|
|
|
+ findRestorePoint(MachineBasicBlock*, MachineInstr*, SlotIndex,
|
|
|
+ SmallPtrSet<MachineInstr*, 4>&, SlotIndex&);
|
|
|
|
|
|
int CreateSpillStackSlot(unsigned, const TargetRegisterClass *);
|
|
|
|
|
|
bool IsAvailableInStack(MachineBasicBlock*, unsigned,
|
|
|
- LiveIndex, LiveIndex,
|
|
|
- LiveIndex&, int&) const;
|
|
|
+ SlotIndex, SlotIndex,
|
|
|
+ SlotIndex&, int&) const;
|
|
|
|
|
|
- void UpdateSpillSlotInterval(VNInfo*, LiveIndex, LiveIndex);
|
|
|
+ void UpdateSpillSlotInterval(VNInfo*, SlotIndex, SlotIndex);
|
|
|
|
|
|
bool SplitRegLiveInterval(LiveInterval*);
|
|
|
|
|
@@ -157,7 +161,7 @@ namespace {
|
|
|
bool Rematerialize(unsigned vreg, VNInfo* ValNo,
|
|
|
MachineInstr* DefMI,
|
|
|
MachineBasicBlock::iterator RestorePt,
|
|
|
- LiveIndex RestoreIdx,
|
|
|
+ SlotIndex RestoreIdx,
|
|
|
SmallPtrSet<MachineInstr*, 4>& RefsInMBB);
|
|
|
MachineInstr* FoldSpill(unsigned vreg, const TargetRegisterClass* RC,
|
|
|
MachineInstr* DefMI,
|
|
@@ -209,12 +213,12 @@ const PassInfo *const llvm::PreAllocSplittingID = &X;
|
|
|
/// instruction index map. If there isn't one, return end().
|
|
|
MachineBasicBlock::iterator
|
|
|
PreAllocSplitting::findNextEmptySlot(MachineBasicBlock *MBB, MachineInstr *MI,
|
|
|
- LiveIndex &SpotIndex) {
|
|
|
+ SlotIndex &SpotIndex) {
|
|
|
MachineBasicBlock::iterator MII = MI;
|
|
|
if (++MII != MBB->end()) {
|
|
|
- LiveIndex Index =
|
|
|
+ SlotIndex Index =
|
|
|
LIs->findGapBeforeInstr(LIs->getInstructionIndex(MII));
|
|
|
- if (Index != LiveIndex()) {
|
|
|
+ if (Index != SlotIndex()) {
|
|
|
SpotIndex = Index;
|
|
|
return MII;
|
|
|
}
|
|
@@ -230,7 +234,7 @@ MachineBasicBlock::iterator
|
|
|
PreAllocSplitting::findSpillPoint(MachineBasicBlock *MBB, MachineInstr *MI,
|
|
|
MachineInstr *DefMI,
|
|
|
SmallPtrSet<MachineInstr*, 4> &RefsInMBB,
|
|
|
- LiveIndex &SpillIndex) {
|
|
|
+ SlotIndex &SpillIndex) {
|
|
|
MachineBasicBlock::iterator Pt = MBB->begin();
|
|
|
|
|
|
MachineBasicBlock::iterator MII = MI;
|
|
@@ -243,7 +247,7 @@ PreAllocSplitting::findSpillPoint(MachineBasicBlock *MBB, MachineInstr *MI,
|
|
|
if (MII == EndPt || RefsInMBB.count(MII)) return Pt;
|
|
|
|
|
|
while (MII != EndPt && !RefsInMBB.count(MII)) {
|
|
|
- LiveIndex Index = LIs->getInstructionIndex(MII);
|
|
|
+ SlotIndex Index = LIs->getInstructionIndex(MII);
|
|
|
|
|
|
// We can't insert the spill between the barrier (a call), and its
|
|
|
// corresponding call frame setup.
|
|
@@ -276,9 +280,9 @@ PreAllocSplitting::findSpillPoint(MachineBasicBlock *MBB, MachineInstr *MI,
|
|
|
/// found.
|
|
|
MachineBasicBlock::iterator
|
|
|
PreAllocSplitting::findRestorePoint(MachineBasicBlock *MBB, MachineInstr *MI,
|
|
|
- LiveIndex LastIdx,
|
|
|
+ SlotIndex LastIdx,
|
|
|
SmallPtrSet<MachineInstr*, 4> &RefsInMBB,
|
|
|
- LiveIndex &RestoreIndex) {
|
|
|
+ SlotIndex &RestoreIndex) {
|
|
|
// FIXME: Allow spill to be inserted to the beginning of the mbb. Update mbb
|
|
|
// begin index accordingly.
|
|
|
MachineBasicBlock::iterator Pt = MBB->end();
|
|
@@ -299,10 +303,10 @@ PreAllocSplitting::findRestorePoint(MachineBasicBlock *MBB, MachineInstr *MI,
|
|
|
// FIXME: Limit the number of instructions to examine to reduce
|
|
|
// compile time?
|
|
|
while (MII != EndPt) {
|
|
|
- LiveIndex Index = LIs->getInstructionIndex(MII);
|
|
|
+ SlotIndex Index = LIs->getInstructionIndex(MII);
|
|
|
if (Index > LastIdx)
|
|
|
break;
|
|
|
- LiveIndex Gap = LIs->findGapBeforeInstr(Index);
|
|
|
+ SlotIndex Gap = LIs->findGapBeforeInstr(Index);
|
|
|
|
|
|
// We can't insert a restore between the barrier (a call) and its
|
|
|
// corresponding call frame teardown.
|
|
@@ -311,7 +315,7 @@ PreAllocSplitting::findRestorePoint(MachineBasicBlock *MBB, MachineInstr *MI,
|
|
|
if (MII == EndPt || RefsInMBB.count(MII)) return Pt;
|
|
|
++MII;
|
|
|
} while (MII->getOpcode() != TRI->getCallFrameDestroyOpcode());
|
|
|
- } else if (Gap != LiveIndex()) {
|
|
|
+ } else if (Gap != SlotIndex()) {
|
|
|
Pt = MII;
|
|
|
RestoreIndex = Gap;
|
|
|
}
|
|
@@ -344,7 +348,7 @@ int PreAllocSplitting::CreateSpillStackSlot(unsigned Reg,
|
|
|
if (CurrSLI->hasAtLeastOneValue())
|
|
|
CurrSValNo = CurrSLI->getValNumInfo(0);
|
|
|
else
|
|
|
- CurrSValNo = CurrSLI->getNextValue(LiveIndex(), 0, false,
|
|
|
+ CurrSValNo = CurrSLI->getNextValue(SlotIndex(), 0, false,
|
|
|
LSs->getVNInfoAllocator());
|
|
|
return SS;
|
|
|
}
|
|
@@ -353,9 +357,9 @@ int PreAllocSplitting::CreateSpillStackSlot(unsigned Reg,
|
|
|
/// slot at the specified index.
|
|
|
bool
|
|
|
PreAllocSplitting::IsAvailableInStack(MachineBasicBlock *DefMBB,
|
|
|
- unsigned Reg, LiveIndex DefIndex,
|
|
|
- LiveIndex RestoreIndex,
|
|
|
- LiveIndex &SpillIndex,
|
|
|
+ unsigned Reg, SlotIndex DefIndex,
|
|
|
+ SlotIndex RestoreIndex,
|
|
|
+ SlotIndex &SpillIndex,
|
|
|
int& SS) const {
|
|
|
if (!DefMBB)
|
|
|
return false;
|
|
@@ -363,7 +367,7 @@ PreAllocSplitting::IsAvailableInStack(MachineBasicBlock *DefMBB,
|
|
|
DenseMap<unsigned, int>::iterator I = IntervalSSMap.find(Reg);
|
|
|
if (I == IntervalSSMap.end())
|
|
|
return false;
|
|
|
- DenseMap<LiveIndex, LiveIndex>::iterator
|
|
|
+ DenseMap<SlotIndex, SlotIndex>::iterator
|
|
|
II = Def2SpillMap.find(DefIndex);
|
|
|
if (II == Def2SpillMap.end())
|
|
|
return false;
|
|
@@ -384,8 +388,8 @@ PreAllocSplitting::IsAvailableInStack(MachineBasicBlock *DefMBB,
|
|
|
/// interval being split, and the spill and restore indicies, update the live
|
|
|
/// interval of the spill stack slot.
|
|
|
void
|
|
|
-PreAllocSplitting::UpdateSpillSlotInterval(VNInfo *ValNo, LiveIndex SpillIndex,
|
|
|
- LiveIndex RestoreIndex) {
|
|
|
+PreAllocSplitting::UpdateSpillSlotInterval(VNInfo *ValNo, SlotIndex SpillIndex,
|
|
|
+ SlotIndex RestoreIndex) {
|
|
|
assert(LIs->getMBBFromIndex(RestoreIndex) == BarrierMBB &&
|
|
|
"Expect restore in the barrier mbb");
|
|
|
|
|
@@ -398,8 +402,8 @@ PreAllocSplitting::UpdateSpillSlotInterval(VNInfo *ValNo, LiveIndex SpillIndex,
|
|
|
}
|
|
|
|
|
|
SmallPtrSet<MachineBasicBlock*, 4> Processed;
|
|
|
- LiveIndex EndIdx = LIs->getMBBEndIdx(MBB);
|
|
|
- LiveRange SLR(SpillIndex, LIs->getNextSlot(EndIdx), CurrSValNo);
|
|
|
+ SlotIndex EndIdx = LIs->getMBBEndIdx(MBB);
|
|
|
+ LiveRange SLR(SpillIndex, EndIdx.getNextSlot(), CurrSValNo);
|
|
|
CurrSLI->addRange(SLR);
|
|
|
Processed.insert(MBB);
|
|
|
|
|
@@ -418,7 +422,7 @@ PreAllocSplitting::UpdateSpillSlotInterval(VNInfo *ValNo, LiveIndex SpillIndex,
|
|
|
WorkList.pop_back();
|
|
|
if (Processed.count(MBB))
|
|
|
continue;
|
|
|
- LiveIndex Idx = LIs->getMBBStartIdx(MBB);
|
|
|
+ SlotIndex Idx = LIs->getMBBStartIdx(MBB);
|
|
|
LR = CurrLI->getLiveRangeContaining(Idx);
|
|
|
if (LR && LR->valno == ValNo) {
|
|
|
EndIdx = LIs->getMBBEndIdx(MBB);
|
|
@@ -428,7 +432,7 @@ PreAllocSplitting::UpdateSpillSlotInterval(VNInfo *ValNo, LiveIndex SpillIndex,
|
|
|
CurrSLI->addRange(SLR);
|
|
|
} else if (LR->end > EndIdx) {
|
|
|
// Live range extends beyond end of mbb, process successors.
|
|
|
- LiveRange SLR(Idx, LIs->getNextIndex(EndIdx), CurrSValNo);
|
|
|
+ LiveRange SLR(Idx, EndIdx.getNextIndex(), CurrSValNo);
|
|
|
CurrSLI->addRange(SLR);
|
|
|
for (MachineBasicBlock::succ_iterator SI = MBB->succ_begin(),
|
|
|
SE = MBB->succ_end(); SI != SE; ++SI)
|
|
@@ -491,12 +495,12 @@ PreAllocSplitting::PerformPHIConstruction(MachineBasicBlock::iterator UseI,
|
|
|
}
|
|
|
|
|
|
// Once we've found it, extend its VNInfo to our instruction.
|
|
|
- LiveIndex DefIndex = LIs->getInstructionIndex(Walker);
|
|
|
- DefIndex = LIs->getDefIndex(DefIndex);
|
|
|
- LiveIndex EndIndex = LIs->getMBBEndIdx(MBB);
|
|
|
+ SlotIndex DefIndex = LIs->getInstructionIndex(Walker);
|
|
|
+ DefIndex = DefIndex.getDefIndex();
|
|
|
+ SlotIndex EndIndex = LIs->getMBBEndIdx(MBB);
|
|
|
|
|
|
RetVNI = NewVNs[Walker];
|
|
|
- LI->addRange(LiveRange(DefIndex, LIs->getNextSlot(EndIndex), RetVNI));
|
|
|
+ LI->addRange(LiveRange(DefIndex, EndIndex.getNextSlot(), RetVNI));
|
|
|
} else if (!ContainsDefs && ContainsUses) {
|
|
|
SmallPtrSet<MachineInstr*, 2>& BlockUses = Uses[MBB];
|
|
|
|
|
@@ -528,12 +532,12 @@ PreAllocSplitting::PerformPHIConstruction(MachineBasicBlock::iterator UseI,
|
|
|
IsTopLevel, IsIntraBlock);
|
|
|
}
|
|
|
|
|
|
- LiveIndex UseIndex = LIs->getInstructionIndex(Walker);
|
|
|
- UseIndex = LIs->getUseIndex(UseIndex);
|
|
|
- LiveIndex EndIndex;
|
|
|
+ SlotIndex UseIndex = LIs->getInstructionIndex(Walker);
|
|
|
+ UseIndex = UseIndex.getUseIndex();
|
|
|
+ SlotIndex EndIndex;
|
|
|
if (IsIntraBlock) {
|
|
|
EndIndex = LIs->getInstructionIndex(UseI);
|
|
|
- EndIndex = LIs->getUseIndex(EndIndex);
|
|
|
+ EndIndex = EndIndex.getUseIndex();
|
|
|
} else
|
|
|
EndIndex = LIs->getMBBEndIdx(MBB);
|
|
|
|
|
@@ -542,7 +546,7 @@ PreAllocSplitting::PerformPHIConstruction(MachineBasicBlock::iterator UseI,
|
|
|
RetVNI = PerformPHIConstruction(Walker, MBB, LI, Visited, Defs, Uses,
|
|
|
NewVNs, LiveOut, Phis, false, true);
|
|
|
|
|
|
- LI->addRange(LiveRange(UseIndex, LIs->getNextSlot(EndIndex), RetVNI));
|
|
|
+ LI->addRange(LiveRange(UseIndex, EndIndex.getNextSlot(), RetVNI));
|
|
|
|
|
|
// FIXME: Need to set kills properly for inter-block stuff.
|
|
|
if (RetVNI->isKill(UseIndex)) RetVNI->removeKill(UseIndex);
|
|
@@ -588,13 +592,12 @@ PreAllocSplitting::PerformPHIConstruction(MachineBasicBlock::iterator UseI,
|
|
|
IsTopLevel, IsIntraBlock);
|
|
|
}
|
|
|
|
|
|
- LiveIndex StartIndex = LIs->getInstructionIndex(Walker);
|
|
|
- StartIndex = foundDef ? LIs->getDefIndex(StartIndex) :
|
|
|
- LIs->getUseIndex(StartIndex);
|
|
|
- LiveIndex EndIndex;
|
|
|
+ SlotIndex StartIndex = LIs->getInstructionIndex(Walker);
|
|
|
+ StartIndex = foundDef ? StartIndex.getDefIndex() : StartIndex.getUseIndex();
|
|
|
+ SlotIndex EndIndex;
|
|
|
if (IsIntraBlock) {
|
|
|
EndIndex = LIs->getInstructionIndex(UseI);
|
|
|
- EndIndex = LIs->getUseIndex(EndIndex);
|
|
|
+ EndIndex = EndIndex.getUseIndex();
|
|
|
} else
|
|
|
EndIndex = LIs->getMBBEndIdx(MBB);
|
|
|
|
|
@@ -604,7 +607,7 @@ PreAllocSplitting::PerformPHIConstruction(MachineBasicBlock::iterator UseI,
|
|
|
RetVNI = PerformPHIConstruction(Walker, MBB, LI, Visited, Defs, Uses,
|
|
|
NewVNs, LiveOut, Phis, false, true);
|
|
|
|
|
|
- LI->addRange(LiveRange(StartIndex, LIs->getNextSlot(EndIndex), RetVNI));
|
|
|
+ LI->addRange(LiveRange(StartIndex, EndIndex.getNextSlot(), RetVNI));
|
|
|
|
|
|
if (foundUse && RetVNI->isKill(StartIndex))
|
|
|
RetVNI->removeKill(StartIndex);
|
|
@@ -640,9 +643,9 @@ PreAllocSplitting::PerformPHIConstructionFallBack(MachineBasicBlock::iterator Us
|
|
|
// assume that we are not intrablock here.
|
|
|
if (Phis.count(MBB)) return Phis[MBB];
|
|
|
|
|
|
- LiveIndex StartIndex = LIs->getMBBStartIdx(MBB);
|
|
|
+ SlotIndex StartIndex = LIs->getMBBStartIdx(MBB);
|
|
|
VNInfo *RetVNI = Phis[MBB] =
|
|
|
- LI->getNextValue(LiveIndex(), /*FIXME*/ 0, false,
|
|
|
+ LI->getNextValue(SlotIndex(), /*FIXME*/ 0, false,
|
|
|
LIs->getVNInfoAllocator());
|
|
|
|
|
|
if (!IsIntraBlock) LiveOut[MBB] = RetVNI;
|
|
@@ -685,19 +688,19 @@ PreAllocSplitting::PerformPHIConstructionFallBack(MachineBasicBlock::iterator Us
|
|
|
for (DenseMap<MachineBasicBlock*, VNInfo*>::iterator I =
|
|
|
IncomingVNs.begin(), E = IncomingVNs.end(); I != E; ++I) {
|
|
|
I->second->setHasPHIKill(true);
|
|
|
- LiveIndex KillIndex = LIs->getMBBEndIdx(I->first);
|
|
|
+ SlotIndex KillIndex = LIs->getMBBEndIdx(I->first);
|
|
|
if (!I->second->isKill(KillIndex))
|
|
|
I->second->addKill(KillIndex);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- LiveIndex EndIndex;
|
|
|
+ SlotIndex EndIndex;
|
|
|
if (IsIntraBlock) {
|
|
|
EndIndex = LIs->getInstructionIndex(UseI);
|
|
|
- EndIndex = LIs->getUseIndex(EndIndex);
|
|
|
+ EndIndex = EndIndex.getUseIndex();
|
|
|
} else
|
|
|
EndIndex = LIs->getMBBEndIdx(MBB);
|
|
|
- LI->addRange(LiveRange(StartIndex, LIs->getNextSlot(EndIndex), RetVNI));
|
|
|
+ LI->addRange(LiveRange(StartIndex, EndIndex.getNextSlot(), RetVNI));
|
|
|
if (IsIntraBlock)
|
|
|
RetVNI->addKill(EndIndex);
|
|
|
|
|
@@ -733,8 +736,8 @@ void PreAllocSplitting::ReconstructLiveInterval(LiveInterval* LI) {
|
|
|
DE = MRI->def_end(); DI != DE; ++DI) {
|
|
|
Defs[(*DI).getParent()].insert(&*DI);
|
|
|
|
|
|
- LiveIndex DefIdx = LIs->getInstructionIndex(&*DI);
|
|
|
- DefIdx = LIs->getDefIndex(DefIdx);
|
|
|
+ SlotIndex DefIdx = LIs->getInstructionIndex(&*DI);
|
|
|
+ DefIdx = DefIdx.getDefIndex();
|
|
|
|
|
|
assert(DI->getOpcode() != TargetInstrInfo::PHI &&
|
|
|
"Following NewVN isPHIDef flag incorrect. Fix me!");
|
|
@@ -769,13 +772,13 @@ void PreAllocSplitting::ReconstructLiveInterval(LiveInterval* LI) {
|
|
|
// Add ranges for dead defs
|
|
|
for (MachineRegisterInfo::def_iterator DI = MRI->def_begin(LI->reg),
|
|
|
DE = MRI->def_end(); DI != DE; ++DI) {
|
|
|
- LiveIndex DefIdx = LIs->getInstructionIndex(&*DI);
|
|
|
- DefIdx = LIs->getDefIndex(DefIdx);
|
|
|
+ SlotIndex DefIdx = LIs->getInstructionIndex(&*DI);
|
|
|
+ DefIdx = DefIdx.getDefIndex();
|
|
|
|
|
|
if (LI->liveAt(DefIdx)) continue;
|
|
|
|
|
|
VNInfo* DeadVN = NewVNs[&*DI];
|
|
|
- LI->addRange(LiveRange(DefIdx, LIs->getNextSlot(DefIdx), DeadVN));
|
|
|
+ LI->addRange(LiveRange(DefIdx, DefIdx.getNextSlot(), DeadVN));
|
|
|
DeadVN->addKill(DefIdx);
|
|
|
}
|
|
|
|
|
@@ -784,8 +787,8 @@ void PreAllocSplitting::ReconstructLiveInterval(LiveInterval* LI) {
|
|
|
VI != VE; ++VI) {
|
|
|
VNInfo* VNI = *VI;
|
|
|
for (unsigned i = 0, e = VNI->kills.size(); i != e; ++i) {
|
|
|
- LiveIndex KillIdx = VNI->kills[i];
|
|
|
- if (KillIdx.isPHIIndex())
|
|
|
+ SlotIndex KillIdx = VNI->kills[i];
|
|
|
+ if (KillIdx.isPHI())
|
|
|
continue;
|
|
|
MachineInstr *KillMI = LIs->getInstructionFromIndex(KillIdx);
|
|
|
if (KillMI) {
|
|
@@ -826,14 +829,14 @@ void PreAllocSplitting::RenumberValno(VNInfo* VN) {
|
|
|
// Locate two-address redefinitions
|
|
|
for (VNInfo::KillSet::iterator KI = OldVN->kills.begin(),
|
|
|
KE = OldVN->kills.end(); KI != KE; ++KI) {
|
|
|
- assert(!KI->isPHIIndex() &&
|
|
|
+ assert(!KI->isPHI() &&
|
|
|
"VN previously reported having no PHI kills.");
|
|
|
MachineInstr* MI = LIs->getInstructionFromIndex(*KI);
|
|
|
unsigned DefIdx = MI->findRegisterDefOperandIdx(CurrLI->reg);
|
|
|
if (DefIdx == ~0U) continue;
|
|
|
if (MI->isRegTiedToUseOperand(DefIdx)) {
|
|
|
VNInfo* NextVN =
|
|
|
- CurrLI->findDefinedVNInfoForRegInt(LIs->getDefIndex(*KI));
|
|
|
+ CurrLI->findDefinedVNInfoForRegInt(KI->getDefIndex());
|
|
|
if (NextVN == OldVN) continue;
|
|
|
Stack.push_back(NextVN);
|
|
|
}
|
|
@@ -865,10 +868,10 @@ void PreAllocSplitting::RenumberValno(VNInfo* VN) {
|
|
|
for (MachineRegisterInfo::reg_iterator I = MRI->reg_begin(CurrLI->reg),
|
|
|
E = MRI->reg_end(); I != E; ++I) {
|
|
|
MachineOperand& MO = I.getOperand();
|
|
|
- LiveIndex InstrIdx = LIs->getInstructionIndex(&*I);
|
|
|
+ SlotIndex InstrIdx = LIs->getInstructionIndex(&*I);
|
|
|
|
|
|
- if ((MO.isUse() && NewLI.liveAt(LIs->getUseIndex(InstrIdx))) ||
|
|
|
- (MO.isDef() && NewLI.liveAt(LIs->getDefIndex(InstrIdx))))
|
|
|
+ if ((MO.isUse() && NewLI.liveAt(InstrIdx.getUseIndex())) ||
|
|
|
+ (MO.isDef() && NewLI.liveAt(InstrIdx.getDefIndex())))
|
|
|
OpsToChange.push_back(std::make_pair(&*I, I.getOperandNo()));
|
|
|
}
|
|
|
|
|
@@ -893,12 +896,12 @@ void PreAllocSplitting::RenumberValno(VNInfo* VN) {
|
|
|
bool PreAllocSplitting::Rematerialize(unsigned VReg, VNInfo* ValNo,
|
|
|
MachineInstr* DefMI,
|
|
|
MachineBasicBlock::iterator RestorePt,
|
|
|
- LiveIndex RestoreIdx,
|
|
|
+ SlotIndex RestoreIdx,
|
|
|
SmallPtrSet<MachineInstr*, 4>& RefsInMBB) {
|
|
|
MachineBasicBlock& MBB = *RestorePt->getParent();
|
|
|
|
|
|
MachineBasicBlock::iterator KillPt = BarrierMBB->end();
|
|
|
- LiveIndex KillIdx;
|
|
|
+ SlotIndex KillIdx;
|
|
|
if (!ValNo->isDefAccurate() || DefMI->getParent() == BarrierMBB)
|
|
|
KillPt = findSpillPoint(BarrierMBB, Barrier, NULL, RefsInMBB, KillIdx);
|
|
|
else
|
|
@@ -911,8 +914,8 @@ bool PreAllocSplitting::Rematerialize(unsigned VReg, VNInfo* ValNo,
|
|
|
LIs->InsertMachineInstrInMaps(prior(RestorePt), RestoreIdx);
|
|
|
|
|
|
ReconstructLiveInterval(CurrLI);
|
|
|
- LiveIndex RematIdx = LIs->getInstructionIndex(prior(RestorePt));
|
|
|
- RematIdx = LIs->getDefIndex(RematIdx);
|
|
|
+ SlotIndex RematIdx = LIs->getInstructionIndex(prior(RestorePt));
|
|
|
+ RematIdx = RematIdx.getDefIndex();
|
|
|
RenumberValno(CurrLI->findDefinedVNInfoForRegInt(RematIdx));
|
|
|
|
|
|
++NumSplits;
|
|
@@ -968,7 +971,7 @@ MachineInstr* PreAllocSplitting::FoldSpill(unsigned vreg,
|
|
|
if (CurrSLI->hasAtLeastOneValue())
|
|
|
CurrSValNo = CurrSLI->getValNumInfo(0);
|
|
|
else
|
|
|
- CurrSValNo = CurrSLI->getNextValue(LiveIndex(), 0, false,
|
|
|
+ CurrSValNo = CurrSLI->getNextValue(SlotIndex(), 0, false,
|
|
|
LSs->getVNInfoAllocator());
|
|
|
}
|
|
|
|
|
@@ -1052,11 +1055,14 @@ MachineInstr* PreAllocSplitting::FoldRestore(unsigned vreg,
|
|
|
/// so it would not cross the barrier that's being processed. Shrink wrap
|
|
|
/// (minimize) the live interval to the last uses.
|
|
|
bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|
|
+ DEBUG(errs() << "Pre-alloc splitting " << LI->reg << " for " << *Barrier
|
|
|
+ << " result: ");
|
|
|
+
|
|
|
CurrLI = LI;
|
|
|
|
|
|
// Find live range where current interval cross the barrier.
|
|
|
LiveInterval::iterator LR =
|
|
|
- CurrLI->FindLiveRangeContaining(LIs->getUseIndex(BarrierIdx));
|
|
|
+ CurrLI->FindLiveRangeContaining(BarrierIdx.getUseIndex());
|
|
|
VNInfo *ValNo = LR->valno;
|
|
|
|
|
|
assert(!ValNo->isUnused() && "Val# is defined by a dead def?");
|
|
@@ -1065,8 +1071,10 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|
|
? LIs->getInstructionFromIndex(ValNo->def) : NULL;
|
|
|
|
|
|
// If this would create a new join point, do not split.
|
|
|
- if (DefMI && createsNewJoin(LR, DefMI->getParent(), Barrier->getParent()))
|
|
|
+ if (DefMI && createsNewJoin(LR, DefMI->getParent(), Barrier->getParent())) {
|
|
|
+ DEBUG(errs() << "FAILED (would create a new join point).\n");
|
|
|
return false;
|
|
|
+ }
|
|
|
|
|
|
// Find all references in the barrier mbb.
|
|
|
SmallPtrSet<MachineInstr*, 4> RefsInMBB;
|
|
@@ -1078,21 +1086,25 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|
|
}
|
|
|
|
|
|
// Find a point to restore the value after the barrier.
|
|
|
- LiveIndex RestoreIndex;
|
|
|
+ SlotIndex RestoreIndex;
|
|
|
MachineBasicBlock::iterator RestorePt =
|
|
|
findRestorePoint(BarrierMBB, Barrier, LR->end, RefsInMBB, RestoreIndex);
|
|
|
- if (RestorePt == BarrierMBB->end())
|
|
|
+ if (RestorePt == BarrierMBB->end()) {
|
|
|
+ DEBUG(errs() << "FAILED (could not find a suitable restore point).\n");
|
|
|
return false;
|
|
|
+ }
|
|
|
|
|
|
if (DefMI && LIs->isReMaterializable(*LI, ValNo, DefMI))
|
|
|
if (Rematerialize(LI->reg, ValNo, DefMI, RestorePt,
|
|
|
- RestoreIndex, RefsInMBB))
|
|
|
- return true;
|
|
|
+ RestoreIndex, RefsInMBB)) {
|
|
|
+ DEBUG(errs() << "success (remat).\n");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
|
|
|
// Add a spill either before the barrier or after the definition.
|
|
|
MachineBasicBlock *DefMBB = DefMI ? DefMI->getParent() : NULL;
|
|
|
const TargetRegisterClass *RC = MRI->getRegClass(CurrLI->reg);
|
|
|
- LiveIndex SpillIndex;
|
|
|
+ SlotIndex SpillIndex;
|
|
|
MachineInstr *SpillMI = NULL;
|
|
|
int SS = -1;
|
|
|
if (!ValNo->isDefAccurate()) {
|
|
@@ -1103,8 +1115,10 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|
|
} else {
|
|
|
MachineBasicBlock::iterator SpillPt =
|
|
|
findSpillPoint(BarrierMBB, Barrier, NULL, RefsInMBB, SpillIndex);
|
|
|
- if (SpillPt == BarrierMBB->begin())
|
|
|
+ if (SpillPt == BarrierMBB->begin()) {
|
|
|
+ DEBUG(errs() << "FAILED (could not find a suitable spill point).\n");
|
|
|
return false; // No gap to insert spill.
|
|
|
+ }
|
|
|
// Add spill.
|
|
|
|
|
|
SS = CreateSpillStackSlot(CurrLI->reg, RC);
|
|
@@ -1116,8 +1130,10 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|
|
RestoreIndex, SpillIndex, SS)) {
|
|
|
// If it's already split, just restore the value. There is no need to spill
|
|
|
// the def again.
|
|
|
- if (!DefMI)
|
|
|
+ if (!DefMI) {
|
|
|
+ DEBUG(errs() << "FAILED (def is dead).\n");
|
|
|
return false; // Def is dead. Do nothing.
|
|
|
+ }
|
|
|
|
|
|
if ((SpillMI = FoldSpill(LI->reg, RC, DefMI, Barrier,
|
|
|
BarrierMBB, SS, RefsInMBB))) {
|
|
@@ -1129,12 +1145,16 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|
|
// Add spill after the def and the last use before the barrier.
|
|
|
SpillPt = findSpillPoint(BarrierMBB, Barrier, DefMI,
|
|
|
RefsInMBB, SpillIndex);
|
|
|
- if (SpillPt == DefMBB->begin())
|
|
|
+ if (SpillPt == DefMBB->begin()) {
|
|
|
+ DEBUG(errs() << "FAILED (could not find a suitable spill point).\n");
|
|
|
return false; // No gap to insert spill.
|
|
|
+ }
|
|
|
} else {
|
|
|
SpillPt = findNextEmptySlot(DefMBB, DefMI, SpillIndex);
|
|
|
- if (SpillPt == DefMBB->end())
|
|
|
+ if (SpillPt == DefMBB->end()) {
|
|
|
+ DEBUG(errs() << "FAILED (could not find a suitable spill point).\n");
|
|
|
return false; // No gap to insert spill.
|
|
|
+ }
|
|
|
}
|
|
|
// Add spill.
|
|
|
SS = CreateSpillStackSlot(CurrLI->reg, RC);
|
|
@@ -1162,18 +1182,19 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
|
|
|
}
|
|
|
|
|
|
// Update spill stack slot live interval.
|
|
|
- UpdateSpillSlotInterval(ValNo, LIs->getNextSlot(LIs->getUseIndex(SpillIndex)),
|
|
|
- LIs->getDefIndex(RestoreIndex));
|
|
|
+ UpdateSpillSlotInterval(ValNo, SpillIndex.getUseIndex().getNextSlot(),
|
|
|
+ RestoreIndex.getDefIndex());
|
|
|
|
|
|
ReconstructLiveInterval(CurrLI);
|
|
|
|
|
|
if (!FoldedRestore) {
|
|
|
- LiveIndex RestoreIdx = LIs->getInstructionIndex(prior(RestorePt));
|
|
|
- RestoreIdx = LIs->getDefIndex(RestoreIdx);
|
|
|
+ SlotIndex RestoreIdx = LIs->getInstructionIndex(prior(RestorePt));
|
|
|
+ RestoreIdx = RestoreIdx.getDefIndex();
|
|
|
RenumberValno(CurrLI->findDefinedVNInfoForRegInt(RestoreIdx));
|
|
|
}
|
|
|
|
|
|
++NumSplits;
|
|
|
+ DEBUG(errs() << "success.\n");
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1254,8 +1275,8 @@ bool PreAllocSplitting::removeDeadSpills(SmallPtrSet<LiveInterval*, 8>& split) {
|
|
|
// reaching definition (VNInfo).
|
|
|
for (MachineRegisterInfo::use_iterator UI = MRI->use_begin((*LI)->reg),
|
|
|
UE = MRI->use_end(); UI != UE; ++UI) {
|
|
|
- LiveIndex index = LIs->getInstructionIndex(&*UI);
|
|
|
- index = LIs->getUseIndex(index);
|
|
|
+ SlotIndex index = LIs->getInstructionIndex(&*UI);
|
|
|
+ index = index.getUseIndex();
|
|
|
|
|
|
const LiveRange* LR = (*LI)->getLiveRangeContaining(index);
|
|
|
VNUseCount[LR->valno].insert(&*UI);
|
|
@@ -1404,7 +1425,7 @@ bool PreAllocSplitting::createsNewJoin(LiveRange* LR,
|
|
|
if (LR->valno->hasPHIKill())
|
|
|
return false;
|
|
|
|
|
|
- LiveIndex MBBEnd = LIs->getMBBEndIdx(BarrierMBB);
|
|
|
+ SlotIndex MBBEnd = LIs->getMBBEndIdx(BarrierMBB);
|
|
|
if (LR->end < MBBEnd)
|
|
|
return false;
|
|
|
|
|
@@ -1467,6 +1488,7 @@ bool PreAllocSplitting::runOnMachineFunction(MachineFunction &MF) {
|
|
|
TII = TM->getInstrInfo();
|
|
|
MFI = MF.getFrameInfo();
|
|
|
MRI = &MF.getRegInfo();
|
|
|
+ SIs = &getAnalysis<SlotIndexes>();
|
|
|
LIs = &getAnalysis<LiveIntervals>();
|
|
|
LSs = &getAnalysis<LiveStacks>();
|
|
|
VRM = &getAnalysis<VirtRegMap>();
|