diff --git a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp --- a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp +++ b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp @@ -143,10 +143,9 @@ "Unexpected basic block number."); // Count number of non-debug instructions for end of block adjustment. - int NumInsts = 0; - for (const MachineInstr &MI : *MBB) - if (!MI.isDebugInstr()) - NumInsts++; + auto NonDbgInsts = + instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end()); + int NumInsts = std::distance(NonDbgInsts.begin(), NonDbgInsts.end()); // When reprocessing a block, the only thing we need to do is check whether // there is now a more recent incoming reaching definition from a predecessor. @@ -197,10 +196,9 @@ } enterBasicBlock(MBB); - for (MachineInstr &MI : *MBB) { - if (!MI.isDebugInstr()) - processDefs(&MI); - } + for (MachineInstr &MI : + instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end())) + processDefs(&MI); leaveBasicBlock(MBB); } @@ -345,9 +343,8 @@ bool ReachingDefAnalysis::getLiveInUses(MachineBasicBlock *MBB, int PhysReg, InstSet &Uses) const { - for (auto &MI : *MBB) { - if (MI.isDebugInstr()) - continue; + for (MachineInstr &MI : + instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end())) { for (auto &MO : MI.operands()) { if (!isValidRegUseOf(MO, PhysReg)) continue; @@ -356,7 +353,8 @@ Uses.insert(&MI); } } - return isReachingDefLiveOut(&MBB->back(), PhysReg); + MachineInstr *Last = &*MBB->getLastNonDebugInstr(); + return isReachingDefLiveOut(Last, PhysReg); } void @@ -459,10 +457,11 @@ // Walk backwards through the block to see if the register is live at some // point. - for (auto Last = MBB->rbegin(), End = MBB->rend(); Last != End; ++Last) { - LiveRegs.stepBackward(*Last); + for (MachineInstr &Last : + instructionsWithoutDebug(MBB->instr_rbegin(), MBB->instr_rend())) { + LiveRegs.stepBackward(Last); if (LiveRegs.contains(PhysReg)) - return InstIds.lookup(&*Last) > InstIds.lookup(MI); + return InstIds.lookup(&Last) > InstIds.lookup(MI); } return false; } @@ -470,7 +469,8 @@ bool ReachingDefAnalysis::isRegDefinedAfter(MachineInstr *MI, int PhysReg) const { MachineBasicBlock *MBB = MI->getParent(); - if (getReachingDef(MI, PhysReg) != getReachingDef(&MBB->back(), PhysReg)) + MachineInstr *Last = &*MBB->getLastNonDebugInstr(); + if (getReachingDef(MI, PhysReg) != getReachingDef(Last, PhysReg)) return true; if (auto *Def = getLocalLiveOutMIDef(MBB, PhysReg)) @@ -487,7 +487,7 @@ if (!LiveRegs.contains(PhysReg)) return false; - MachineInstr *Last = &MBB->back(); + MachineInstr *Last = &*MBB->getLastNonDebugInstr(); int Def = getReachingDef(MI, PhysReg); if (getReachingDef(Last, PhysReg) != Def) return false; @@ -507,7 +507,7 @@ if (!LiveRegs.contains(PhysReg)) return nullptr; - MachineInstr *Last = &MBB->back(); + MachineInstr *Last = &*MBB->getLastNonDebugInstr(); int Def = getReachingDef(Last, PhysReg); for (auto &MO : Last->operands()) if (isValidRegDefOf(MO, PhysReg))