forked from OSchip/llvm-project
Switch extendInBlock() to take a kill slot instead of the last use slot.
Three out of four clients prefer this interface which is consistent with extendIntervalEndTo() and LiveRangeCalc::extend(). llvm-svn: 139604
This commit is contained in:
parent
054984d75b
commit
0494c5c35d
|
@ -452,10 +452,10 @@ namespace llvm {
|
|||
addRangeFrom(LR, ranges.begin());
|
||||
}
|
||||
|
||||
/// extendInBlock - If this interval is live before UseIdx in the basic
|
||||
/// block that starts at StartIdx, extend it to be live at UseIdx and return
|
||||
/// the value. If there is no live range before UseIdx, return NULL.
|
||||
VNInfo *extendInBlock(SlotIndex StartIdx, SlotIndex UseIdx);
|
||||
/// extendInBlock - If this interval is live before Kill in the basic block
|
||||
/// that starts at StartIdx, extend it to be live up to Kill, and return
|
||||
/// the value. If there is no live range before Kill, return NULL.
|
||||
VNInfo *extendInBlock(SlotIndex StartIdx, SlotIndex Kill);
|
||||
|
||||
/// join - Join two live intervals (this, and other) together. This applies
|
||||
/// mappings to the value numbers in the LHS/RHS intervals as specified. If
|
||||
|
|
|
@ -294,20 +294,20 @@ LiveInterval::addRangeFrom(LiveRange LR, iterator From) {
|
|||
return ranges.insert(it, LR);
|
||||
}
|
||||
|
||||
/// extendInBlock - If this interval is live before UseIdx in the basic
|
||||
/// block that starts at StartIdx, extend it to be live at UseIdx and return
|
||||
/// the value. If there is no live range before UseIdx, return NULL.
|
||||
VNInfo *LiveInterval::extendInBlock(SlotIndex StartIdx, SlotIndex UseIdx) {
|
||||
/// extendInBlock - If this interval is live before Kill in the basic
|
||||
/// block that starts at StartIdx, extend it to be live up to Kill and return
|
||||
/// the value. If there is no live range before Kill, return NULL.
|
||||
VNInfo *LiveInterval::extendInBlock(SlotIndex StartIdx, SlotIndex Kill) {
|
||||
if (empty())
|
||||
return 0;
|
||||
iterator I = std::upper_bound(begin(), end(), UseIdx);
|
||||
iterator I = std::upper_bound(begin(), end(), Kill.getPrevSlot());
|
||||
if (I == begin())
|
||||
return 0;
|
||||
--I;
|
||||
if (I->end <= StartIdx)
|
||||
return 0;
|
||||
if (I->end <= UseIdx)
|
||||
extendIntervalEndTo(I, UseIdx.getNextSlot());
|
||||
if (I->end < Kill)
|
||||
extendIntervalEndTo(I, Kill);
|
||||
return I->valno;
|
||||
}
|
||||
|
||||
|
|
|
@ -804,7 +804,7 @@ bool LiveIntervals::shrinkToUses(LiveInterval *li,
|
|||
SlotIndex BlockStart = getMBBStartIdx(MBB);
|
||||
|
||||
// Extend the live range for VNI to be live at Idx.
|
||||
if (VNInfo *ExtVNI = NewLI.extendInBlock(BlockStart, Idx)) {
|
||||
if (VNInfo *ExtVNI = NewLI.extendInBlock(BlockStart, Idx.getNextSlot())) {
|
||||
(void)ExtVNI;
|
||||
assert(ExtVNI == VNI && "Unexpected existing value number");
|
||||
// Is this a PHIDef we haven't seen before?
|
||||
|
|
|
@ -63,13 +63,12 @@ void LiveRangeCalc::extend(LiveInterval *LI,
|
|||
assert(Kill.isValid() && "Invalid SlotIndex");
|
||||
assert(Indexes && "Missing SlotIndexes");
|
||||
assert(DomTree && "Missing dominator tree");
|
||||
SlotIndex LastUse = Kill.getPrevSlot();
|
||||
|
||||
MachineBasicBlock *KillMBB = Indexes->getMBBFromIndex(LastUse);
|
||||
MachineBasicBlock *KillMBB = Indexes->getMBBFromIndex(Kill.getPrevSlot());
|
||||
assert(Kill && "No MBB at Kill");
|
||||
|
||||
// Is there a def in the same MBB we can extend?
|
||||
if (LI->extendInBlock(Indexes->getMBBStartIdx(KillMBB), LastUse))
|
||||
if (LI->extendInBlock(Indexes->getMBBStartIdx(KillMBB), Kill))
|
||||
return;
|
||||
|
||||
// Find the single reaching def, or determine if Kill is jointly dominated by
|
||||
|
@ -134,7 +133,7 @@ VNInfo *LiveRangeCalc::findReachingDefs(LiveInterval *LI,
|
|||
|
||||
// First time we see Pred. Try to determine the live-out value, but set
|
||||
// it as null if Pred is live-through with an unknown value.
|
||||
VNInfo *VNI = LI->extendInBlock(Start, End.getPrevSlot());
|
||||
VNInfo *VNI = LI->extendInBlock(Start, End);
|
||||
setLiveOutValue(Pred, VNI);
|
||||
if (VNI) {
|
||||
if (TheVNI && TheVNI != VNI)
|
||||
|
|
|
@ -648,8 +648,7 @@ bool SplitEditor::transferValues() {
|
|||
|
||||
// The first block may be live-in, or it may have its own def.
|
||||
if (Start != BlockStart) {
|
||||
VNInfo *VNI = LI->extendInBlock(BlockStart,
|
||||
std::min(BlockEnd, End).getPrevSlot());
|
||||
VNInfo *VNI = LI->extendInBlock(BlockStart, std::min(BlockEnd, End));
|
||||
assert(VNI && "Missing def for complex mapped value");
|
||||
DEBUG(dbgs() << ':' << VNI->id << "*BB#" << MBB->getNumber());
|
||||
// MBB has its own def. Is it also live-out?
|
||||
|
@ -669,8 +668,7 @@ bool SplitEditor::transferValues() {
|
|||
if (BlockStart == ParentVNI->def) {
|
||||
// This block has the def of a parent PHI, so it isn't live-in.
|
||||
assert(ParentVNI->isPHIDef() && "Non-phi defined at block start?");
|
||||
VNInfo *VNI = LI->extendInBlock(BlockStart,
|
||||
std::min(BlockEnd, End).getPrevSlot());
|
||||
VNInfo *VNI = LI->extendInBlock(BlockStart, std::min(BlockEnd, End));
|
||||
assert(VNI && "Missing def for complex mapped parent PHI");
|
||||
if (End >= BlockEnd)
|
||||
LRC.setLiveOutValue(MBB, VNI); // Live-out as well.
|
||||
|
|
Loading…
Reference in New Issue