diff options
author | Andrew Trick <atrick@apple.com> | 2013-08-31 05:17:58 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2013-08-31 05:17:58 +0000 |
commit | 2c4f8b7ee87fb6f77688bee1dd00e10ae2707f00 (patch) | |
tree | 360132df785798bc89e46f469c35020e94a3127f /llvm/lib/CodeGen/MachineScheduler.cpp | |
parent | ad00e83ae4667d1ff6bcb2b632f34b30adfff948 (diff) | |
download | bcm5719-llvm-2c4f8b7ee87fb6f77688bee1dd00e10ae2707f00.tar.gz bcm5719-llvm-2c4f8b7ee87fb6f77688bee1dd00e10ae2707f00.zip |
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.
llvm-svn: 189717
Diffstat (limited to 'llvm/lib/CodeGen/MachineScheduler.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineScheduler.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp index a7a3bb80730..9e473de3378 100644 --- a/llvm/lib/CodeGen/MachineScheduler.cpp +++ b/llvm/lib/CodeGen/MachineScheduler.cpp @@ -177,8 +177,9 @@ priorNonDebug(MachineBasicBlock::iterator I, /// If this iterator is a debug value, increment until reaching the End or a /// non-debug instruction. -static MachineBasicBlock::iterator -nextIfDebug(MachineBasicBlock::iterator I, MachineBasicBlock::iterator End) { +static MachineBasicBlock::const_iterator +nextIfDebug(MachineBasicBlock::const_iterator I, + MachineBasicBlock::const_iterator End) { for(; I != End; ++I) { if (!I->isDebugValue()) break; @@ -186,6 +187,18 @@ nextIfDebug(MachineBasicBlock::iterator I, MachineBasicBlock::iterator End) { 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. /// /// 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. const LiveInterval &LI = LIS->getInterval(Reg); 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)); else { - LiveRangeQuery LRQ(LI, LIS->getInstructionIndex(BotRPTracker.getPos())); + LiveRangeQuery LRQ(LI, LIS->getInstructionIndex(I)); VNI = LRQ.valueIn(); } // RegisterPressureTracker guarantees that readsReg is true for LiveUses. |