Index: lib/CodeGen/MachineInstr.cpp =================================================================== --- lib/CodeGen/MachineInstr.cpp +++ lib/CodeGen/MachineInstr.cpp @@ -2080,14 +2080,28 @@ if (!MI.getOperand(0).isReg()) return; - MachineBasicBlock::iterator DI = MI; ++DI; - for (MachineBasicBlock::iterator DE = MI.getParent()->end(); - DI != DE; ++DI) { + auto *MRI = getRegInfo(); +#ifndef NDEBUG + // There are no guarantees on DBG_VALUE availability and ordering after + // regalloc, they must be sought manually. + auto *TRI = MRI->getTargetRegisterInfo(); + assert(!TRI->isPhysicalRegister(MI.getOperand(0).getReg())); +#endif + + for (auto &MO : MRI->use_operands(MI.getOperand(0).getReg())) { + auto *DI = MO.getParent(); if (!DI->isDebugValue()) - return; + continue; + // XXX XXX XXX numerous things explode if we "update" or move DBG_VALUEs + // from outside the current BB. These were previously ignored anyway by + // the prior implementation of collectDebugValues, so technically this + // isn't a regression... + if (DI->getParent() != getParent()) + continue; if (DI->getOperand(0).isReg() && - DI->getOperand(0).getReg() == MI.getOperand(0).getReg()) - DbgValues.push_back(&*DI); + DI->getOperand(0).getReg() == MI.getOperand(0).getReg()) { + DbgValues.push_back(DI); + } } } Index: lib/CodeGen/MachineSink.cpp =================================================================== --- lib/CodeGen/MachineSink.cpp +++ lib/CodeGen/MachineSink.cpp @@ -367,10 +367,13 @@ MachineInstr &MI = *I; // The instruction to sink. // Predecrement I (if it's not begin) so that it isn't invalidated by - // sinking. - ProcessedBegin = I == MBB.begin(); - if (!ProcessedBegin) - --I; + // sinking. Continue to decrement it past any debug insns, which might + // be sunk out of this BB. + do { + ProcessedBegin = I == MBB.begin(); + if (!ProcessedBegin) + --I; + } while (!ProcessedBegin && I->isDebugInstr()); if (MI.isDebugInstr()) continue;