diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-04 15:32:15 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-04 15:32:15 +0000 |
commit | 6c8afd728eb02742ce320ecd39bcf3774d8423b7 (patch) | |
tree | c74771352059404cd652904e561e1b535316edef /lib | |
parent | 5c4c4d4b82a658643c8daefd5cc76d5c712285ed (diff) | |
download | external_llvm-6c8afd728eb02742ce320ecd39bcf3774d8423b7.zip external_llvm-6c8afd728eb02742ce320ecd39bcf3774d8423b7.tar.gz external_llvm-6c8afd728eb02742ce320ecd39bcf3774d8423b7.tar.bz2 |
Stop caching basic block index ranges now that SlotIndexes can keep up.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128821 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/RegAllocGreedy.cpp | 40 | ||||
-rw-r--r-- | lib/CodeGen/SplitKit.cpp | 21 | ||||
-rw-r--r-- | lib/CodeGen/SplitKit.h | 2 |
3 files changed, 33 insertions, 30 deletions
diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp index e64deafc..563c9bb 100644 --- a/lib/CodeGen/RegAllocGreedy.cpp +++ b/lib/CodeGen/RegAllocGreedy.cpp @@ -433,7 +433,7 @@ float RAGreedy::calcSplitConstraints(unsigned PhysReg) { // Interference for the live-in value. if (BI.LiveIn) { - if (Intf.first() <= BI.Start) + if (Intf.first() <= Indexes->getMBBStartIdx(BC.Number)) BC.Entry = SpillPlacement::MustSpill, Ins += BI.Uses; else if (!BI.Uses) BC.Entry = SpillPlacement::PrefSpill; @@ -525,17 +525,19 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, if (!BI.LiveOut || !RegOut) continue; + SlotIndex Start, Stop; + tie(Start, Stop) = Indexes->getMBBRange(BI.MBB); Intf.moveToBlock(BI.MBB->getNumber()); DEBUG(dbgs() << "BB#" << BI.MBB->getNumber() << " -> EB#" << Bundles->getBundle(BI.MBB->getNumber(), 1) - << " [" << BI.Start << ';' << BI.LastSplitPoint << '-' - << BI.Stop << ") intf [" << Intf.first() << ';' << Intf.last() + << " [" << Start << ';' << BI.LastSplitPoint << '-' + << Stop << ") intf [" << Intf.first() << ';' << Intf.last() << ')'); // The interference interval should either be invalid or overlap MBB. - assert((!Intf.hasInterference() || Intf.first() < BI.Stop) + assert((!Intf.hasInterference() || Intf.first() < Stop) && "Bad interference"); - assert((!Intf.hasInterference() || Intf.last() > BI.Start) + assert((!Intf.hasInterference() || Intf.last() > Start) && "Bad interference"); // Check interference leaving the block. @@ -553,14 +555,14 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, } if (!BI.LiveThrough) { DEBUG(dbgs() << ", not live-through.\n"); - SE->useIntv(SE->enterIntvBefore(BI.Def), BI.Stop); + SE->useIntv(SE->enterIntvBefore(BI.Def), Stop); continue; } if (!RegIn) { // Block is live-through, but entry bundle is on the stack. // Reload just before the first use. DEBUG(dbgs() << ", not live-in, enter before first use.\n"); - SE->useIntv(SE->enterIntvBefore(BI.FirstUse), BI.Stop); + SE->useIntv(SE->enterIntvBefore(BI.FirstUse), Stop); continue; } DEBUG(dbgs() << ", live-through.\n"); @@ -573,7 +575,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, if (!BI.LiveThrough && Intf.last() <= BI.Def) { // The interference doesn't reach the outgoing segment. DEBUG(dbgs() << " doesn't affect def from " << BI.Def << '\n'); - SE->useIntv(BI.Def, BI.Stop); + SE->useIntv(BI.Def, Stop); continue; } @@ -601,7 +603,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, SlotIndex SegStart = SE->enterIntvBefore(Use); assert(SegStart >= Intf.last() && "Couldn't avoid interference"); assert(SegStart < BI.LastSplitPoint && "Impossible split point"); - SE->useIntv(SegStart, BI.Stop); + SE->useIntv(SegStart, Stop); continue; } } @@ -623,10 +625,12 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, continue; // We have an incoming register. Check for interference. + SlotIndex Start, Stop; + tie(Start, Stop) = Indexes->getMBBRange(BI.MBB); Intf.moveToBlock(BI.MBB->getNumber()); DEBUG(dbgs() << "EB#" << Bundles->getBundle(BI.MBB->getNumber(), 0) - << " -> BB#" << BI.MBB->getNumber() << " [" << BI.Start << ';' - << BI.LastSplitPoint << '-' << BI.Stop << ')'); + << " -> BB#" << BI.MBB->getNumber() << " [" << Start << ';' + << BI.LastSplitPoint << '-' << Stop << ')'); // Check interference entering the block. if (!Intf.hasInterference()) { @@ -637,7 +641,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, // Block is live-through without interference. if (RegOut) { DEBUG(dbgs() << ", no uses, live-through.\n"); - SE->useIntv(BI.Start, BI.Stop); + SE->useIntv(Start, Stop); } else { DEBUG(dbgs() << ", no uses, stack-out.\n"); SE->leaveIntvAtTop(*BI.MBB); @@ -646,7 +650,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, } if (!BI.LiveThrough) { DEBUG(dbgs() << ", killed in block.\n"); - SE->useIntv(BI.Start, SE->leaveIntvAfter(BI.Kill)); + SE->useIntv(Start, SE->leaveIntvAfter(BI.Kill)); continue; } if (!RegOut) { @@ -654,7 +658,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, // Spill immediately after the last use. if (BI.LastUse < BI.LastSplitPoint) { DEBUG(dbgs() << ", uses, stack-out.\n"); - SE->useIntv(BI.Start, SE->leaveIntvAfter(BI.LastUse)); + SE->useIntv(Start, SE->leaveIntvAfter(BI.LastUse)); continue; } // The last use is after the last split point, it is probably an @@ -662,7 +666,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, DEBUG(dbgs() << ", uses at " << BI.LastUse << " after split point " << BI.LastSplitPoint << ", stack-out.\n"); SlotIndex SegEnd = SE->leaveIntvBefore(BI.LastSplitPoint); - SE->useIntv(BI.Start, SegEnd); + SE->useIntv(Start, SegEnd); // Run a double interval from the split to the last use. // This makes it possible to spill the complement without affecting the // indirect branch. @@ -671,7 +675,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, } // Register is live-through. DEBUG(dbgs() << ", uses, live-through.\n"); - SE->useIntv(BI.Start, BI.Stop); + SE->useIntv(Start, Stop); continue; } @@ -681,7 +685,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, if (!BI.LiveThrough && Intf.first() >= BI.Kill) { // The interference doesn't reach the outgoing segment. DEBUG(dbgs() << " doesn't affect kill at " << BI.Kill << '\n'); - SE->useIntv(BI.Start, BI.Kill); + SE->useIntv(Start, BI.Kill); continue; } @@ -703,7 +707,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, DEBUG(dbgs() << ", free use at " << *UI << ".\n"); SlotIndex SegEnd = SE->leaveIntvAfter(Use); assert(SegEnd <= Intf.first() && "Couldn't avoid interference"); - SE->useIntv(BI.Start, SegEnd); + SE->useIntv(Start, SegEnd); continue; } diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index 2c8066f..29f08a5 100644 --- a/lib/CodeGen/SplitKit.cpp +++ b/lib/CodeGen/SplitKit.cpp @@ -118,7 +118,8 @@ bool SplitAnalysis::calcLiveBlockInfo() { for (;;) { BlockInfo BI; BI.MBB = MFI; - tie(BI.Start, BI.Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB); + SlotIndex Start, Stop; + tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB); // The last split point is the latest possible insertion point that dominates // all successor blocks. If interference reaches LastSplitPoint, it is not @@ -126,12 +127,12 @@ bool SplitAnalysis::calcLiveBlockInfo() { // outgoing bundle. MachineBasicBlock::iterator LSP = LIS.getLastSplitPoint(*CurLI, BI.MBB); if (LSP == BI.MBB->end()) - BI.LastSplitPoint = BI.Stop; + BI.LastSplitPoint = Stop; else BI.LastSplitPoint = LIS.getInstructionIndex(LSP); // LVI is the first live segment overlapping MBB. - BI.LiveIn = LVI->start <= BI.Start; + BI.LiveIn = LVI->start <= Start; if (!BI.LiveIn) BI.Def = LVI->start; @@ -139,19 +140,19 @@ bool SplitAnalysis::calcLiveBlockInfo() { BI.Uses = hasUses(MFI); if (BI.Uses && UseI != UseE) { BI.FirstUse = *UseI; - assert(BI.FirstUse >= BI.Start); + assert(BI.FirstUse >= Start); do ++UseI; - while (UseI != UseE && *UseI < BI.Stop); + while (UseI != UseE && *UseI < Stop); BI.LastUse = UseI[-1]; - assert(BI.LastUse < BI.Stop); + assert(BI.LastUse < Stop); } // Look for gaps in the live range. bool hasGap = false; BI.LiveOut = true; - while (LVI->end < BI.Stop) { + while (LVI->end < Stop) { SlotIndex LastStop = LVI->end; - if (++LVI == LVE || LVI->start >= BI.Stop) { + if (++LVI == LVE || LVI->start >= Stop) { BI.Kill = LastStop; BI.LiveOut = false; break; @@ -177,11 +178,11 @@ bool SplitAnalysis::calcLiveBlockInfo() { break; // Live segment ends exactly at Stop. Move to the next segment. - if (LVI->end == BI.Stop && ++LVI == LVE) + if (LVI->end == Stop && ++LVI == LVE) break; // Pick the next basic block. - if (LVI->start < BI.Stop) + if (LVI->start < Stop) ++MFI; else MFI = LIS.getMBBFromIndex(LVI->start); diff --git a/lib/CodeGen/SplitKit.h b/lib/CodeGen/SplitKit.h index 4f853a0..d735f10 100644 --- a/lib/CodeGen/SplitKit.h +++ b/lib/CodeGen/SplitKit.h @@ -73,8 +73,6 @@ public: /// struct BlockInfo { MachineBasicBlock *MBB; - SlotIndex Start; ///< Beginining of block. - SlotIndex Stop; ///< End of block. SlotIndex FirstUse; ///< First instr using current reg. SlotIndex LastUse; ///< Last instr using current reg. SlotIndex Kill; ///< Interval end point inside block. |