mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-14 14:24:05 +00:00
Rewrite RAGreedy::splitAroundRegion, now with cool ASCII art.
This function has to deal with a lot of special cases, and the old version got it wrong sometimes. In particular, it would sometimes leave multiple uses in the stack interval in a single block. That causes bad code with multiple reloads in the same basic block. The new version handles block entry and exit in a single pass. It first eliminates all the easy cases, and then goes on to create a local interval for the blocks with difficult interference. Previously, we would only create the local interval for completely isolated blocks. It can happen that the stack interval becomes completely empty because we could allocate a register in all edge bundles, and the new local intervals deal with the interference. The empty stack interval is harmless, but we need to remove a SplitKit assertion that checks for empty intervals. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134047 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -636,6 +636,7 @@ unsigned SplitEditor::openIntv() {
|
||||
void SplitEditor::selectIntv(unsigned Idx) {
|
||||
assert(Idx != 0 && "Cannot select the complement interval");
|
||||
assert(Idx < Edit->size() && "Can only select previously opened interval");
|
||||
DEBUG(dbgs() << " selectIntv " << OpenIdx << " -> " << Idx << '\n');
|
||||
OpenIdx = Idx;
|
||||
}
|
||||
|
||||
@ -656,6 +657,24 @@ SlotIndex SplitEditor::enterIntvBefore(SlotIndex Idx) {
|
||||
return VNI->def;
|
||||
}
|
||||
|
||||
SlotIndex SplitEditor::enterIntvAfter(SlotIndex Idx) {
|
||||
assert(OpenIdx && "openIntv not called before enterIntvAfter");
|
||||
DEBUG(dbgs() << " enterIntvAfter " << Idx);
|
||||
Idx = Idx.getBoundaryIndex();
|
||||
VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
|
||||
if (!ParentVNI) {
|
||||
DEBUG(dbgs() << ": not live\n");
|
||||
return Idx;
|
||||
}
|
||||
DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
|
||||
MachineInstr *MI = LIS.getInstructionFromIndex(Idx);
|
||||
assert(MI && "enterIntvAfter called with invalid index");
|
||||
|
||||
VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *MI->getParent(),
|
||||
llvm::next(MachineBasicBlock::iterator(MI)));
|
||||
return VNI->def;
|
||||
}
|
||||
|
||||
SlotIndex SplitEditor::enterIntvAtEnd(MachineBasicBlock &MBB) {
|
||||
assert(OpenIdx && "openIntv not called before enterIntvAtEnd");
|
||||
SlotIndex End = LIS.getMBBEndIdx(&MBB);
|
||||
@ -1007,12 +1026,6 @@ void SplitEditor::finish(SmallVectorImpl<unsigned> *LRMap) {
|
||||
markComplexMapped(i, ParentVNI);
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
// Every new interval must have a def by now, otherwise the split is bogus.
|
||||
for (LiveRangeEdit::iterator I = Edit->begin(), E = Edit->end(); I != E; ++I)
|
||||
assert((*I)->hasAtLeastOneValue() && "Split interval has no value");
|
||||
#endif
|
||||
|
||||
// Transfer the simply mapped values, check if any are skipped.
|
||||
bool Skipped = transferValues();
|
||||
if (Skipped)
|
||||
|
Reference in New Issue
Block a user