Fix my previous checkin to updatePressureDiffs.

There was one case that we could hit a DebugValue where I didn't think
to check. DebugValues are evil. No checkinable test case, sorry. It's
an obvious fix.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189717 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Trick 2013-08-31 05:17:58 +00:00
parent cda04f9a0a
commit c94e7b50c3

View File

@ -177,8 +177,9 @@ priorNonDebug(MachineBasicBlock::iterator I,
/// If this iterator is a debug value, increment until reaching the End or a /// If this iterator is a debug value, increment until reaching the End or a
/// non-debug instruction. /// non-debug instruction.
static MachineBasicBlock::iterator static MachineBasicBlock::const_iterator
nextIfDebug(MachineBasicBlock::iterator I, MachineBasicBlock::iterator End) { nextIfDebug(MachineBasicBlock::const_iterator I,
MachineBasicBlock::const_iterator End) {
for(; I != End; ++I) { for(; I != End; ++I) {
if (!I->isDebugValue()) if (!I->isDebugValue())
break; break;
@ -186,6 +187,18 @@ nextIfDebug(MachineBasicBlock::iterator I, MachineBasicBlock::iterator End) {
return I; return I;
} }
/// Non-const version.
static MachineBasicBlock::iterator
nextIfDebug(MachineBasicBlock::iterator I,
MachineBasicBlock::const_iterator End) {
// Cast the return value to nonconst MachineInstr, then cast to an
// instr_iterator, which does not check for null, finally return a
// bundle_iterator.
return MachineBasicBlock::instr_iterator(
const_cast<MachineInstr*>(
&*nextIfDebug(MachineBasicBlock::const_iterator(I), End)));
}
/// Top-level MachineScheduler pass driver. /// Top-level MachineScheduler pass driver.
/// ///
/// Visit blocks in function order. Divide each block into scheduling regions /// Visit blocks in function order. Divide each block into scheduling regions
@ -565,10 +578,12 @@ void ScheduleDAGMI::updatePressureDiffs(ArrayRef<unsigned> LiveUses) {
// instruction's live-out. // instruction's live-out.
const LiveInterval &LI = LIS->getInterval(Reg); const LiveInterval &LI = LIS->getInterval(Reg);
VNInfo *VNI; VNInfo *VNI;
if (BotRPTracker.getPos() == BB->end()) MachineBasicBlock::const_iterator I =
nextIfDebug(BotRPTracker.getPos(), BB->end());
if (I == BB->end())
VNI = LI.getVNInfoBefore(LIS->getMBBEndIdx(BB)); VNI = LI.getVNInfoBefore(LIS->getMBBEndIdx(BB));
else { else {
LiveRangeQuery LRQ(LI, LIS->getInstructionIndex(BotRPTracker.getPos())); LiveRangeQuery LRQ(LI, LIS->getInstructionIndex(I));
VNI = LRQ.valueIn(); VNI = LRQ.valueIn();
} }
// RegisterPressureTracker guarantees that readsReg is true for LiveUses. // RegisterPressureTracker guarantees that readsReg is true for LiveUses.