diff --git a/llvm/include/llvm/CodeGen/MachineBasicBlock.h b/llvm/include/llvm/CodeGen/MachineBasicBlock.h --- a/llvm/include/llvm/CodeGen/MachineBasicBlock.h +++ b/llvm/include/llvm/CodeGen/MachineBasicBlock.h @@ -1061,6 +1061,35 @@ return It; } +/// Increment \p It, then continue incrementing it while it points to a debug +/// instruction. A replacement for std::next. +template inline IterT next_nodbg(IterT It, IterT End) { + return skipDebugInstructionsForward(std::next(It), End); +} + +/// Decrement \p It, then continue decrementing it while it points to a debug +/// instruction. A replacement for std::prev. +template inline IterT prev_nodbg(IterT It, IterT Begin) { + return skipDebugInstructionsBackward(std::prev(It), Begin); +} + +/// Construct a range iterator which begins at \p It and moves forwards until +/// \p End is reached, skipping any debug instructions. +template +inline auto instructionsWithoutDebug(IterT It, IterT End) { + return make_filter_range(make_range(It, End), [](const MachineInstr &MI) { + return !MI.isDebugInstr(); + }); +} + +/// Construct a range iterator which begins at \p It and moves backwards until +/// \p Begin is reached, skipping any debug instructions. +template +inline auto reversedInstructionsWithoutDebug(IterT It, IterT Begin) { + return instructionsWithoutDebug(make_reverse_iterator(It), + make_reverse_iterator(Begin)); +} + } // end namespace llvm #endif // LLVM_CODEGEN_MACHINEBASICBLOCK_H diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp --- a/llvm/lib/CodeGen/BranchFolding.cpp +++ b/llvm/lib/CodeGen/BranchFolding.cpp @@ -1840,8 +1840,7 @@ // The terminator is probably a conditional branch, try not to separate the // branch from condition setting instruction. - MachineBasicBlock::iterator PI = - skipDebugInstructionsBackward(std::prev(Loc), MBB->begin()); + MachineBasicBlock::iterator PI = prev_nodbg(Loc, MBB->begin()); bool IsDef = false; for (const MachineOperand &MO : PI->operands()) { diff --git a/llvm/lib/CodeGen/MachineBasicBlock.cpp b/llvm/lib/CodeGen/MachineBasicBlock.cpp --- a/llvm/lib/CodeGen/MachineBasicBlock.cpp +++ b/llvm/lib/CodeGen/MachineBasicBlock.cpp @@ -1329,8 +1329,8 @@ /// instructions. Return UnknownLoc if there is none. DebugLoc MachineBasicBlock::findPrevDebugLoc(instr_iterator MBBI) { if (MBBI == instr_begin()) return {}; - // Skip debug declarations, we don't want a DebugLoc from them. - MBBI = skipDebugInstructionsBackward(std::prev(MBBI), instr_begin()); + // Skip debug instructions, we don't want a DebugLoc from them. + MBBI = prev_nodbg(MBBI, instr_begin()); if (!MBBI->isDebugInstr()) return MBBI->getDebugLoc(); return {}; } diff --git a/llvm/lib/CodeGen/RegisterPressure.cpp b/llvm/lib/CodeGen/RegisterPressure.cpp --- a/llvm/lib/CodeGen/RegisterPressure.cpp +++ b/llvm/lib/CodeGen/RegisterPressure.cpp @@ -858,7 +858,7 @@ static_cast(P).openTop(CurrPos); // Find the previous instruction. - CurrPos = skipDebugInstructionsBackward(std::prev(CurrPos), MBB->begin()); + CurrPos = prev_nodbg(CurrPos, MBB->begin()); SlotIndex SlotIdx; if (RequireIntervals && !CurrPos->isDebugInstr()) @@ -940,7 +940,7 @@ bumpDeadDefs(RegOpers.DeadDefs); // Find the next instruction. - CurrPos = skipDebugInstructionsForward(std::next(CurrPos), MBB->end()); + CurrPos = next_nodbg(CurrPos, MBB->end()); } void RegPressureTracker::advance() { diff --git a/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp b/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp --- a/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp +++ b/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp @@ -411,9 +411,8 @@ // If the load and store are consecutive, use the loadInst location to // reduce register pressure. MachineInstr *StInst = StoreInst; - auto PrevInstrIt = skipDebugInstructionsBackward( - std::prev(MachineBasicBlock::instr_iterator(StoreInst)), - MBB->instr_begin()); + auto PrevInstrIt = prev_nodbg(MachineBasicBlock::instr_iterator(StoreInst), + MBB->instr_begin()); if (PrevInstrIt.getNodePtr() == LoadInst) StInst = LoadInst; MachineInstr *NewStore = @@ -499,9 +498,10 @@ static void updateKillStatus(MachineInstr *LoadInst, MachineInstr *StoreInst) { MachineOperand &LoadBase = getBaseOperand(LoadInst); MachineOperand &StoreBase = getBaseOperand(StoreInst); - auto StorePrevNonDbgInstr = skipDebugInstructionsBackward( - std::prev(MachineBasicBlock::instr_iterator(StoreInst)), - LoadInst->getParent()->instr_begin()).getNodePtr(); + auto StorePrevNonDbgInstr = + prev_nodbg(MachineBasicBlock::instr_iterator(StoreInst), + LoadInst->getParent()->instr_begin()) + .getNodePtr(); if (LoadBase.isReg()) { MachineInstr *LastLoad = LoadInst->getPrevNode(); // If the original load and store to xmm/ymm were consecutive diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -31494,8 +31494,7 @@ (NextMIIt->getOperand(3).getImm() == CC || NextMIIt->getOperand(3).getImm() == OppCC)) { LastCMOV = &*NextMIIt; - ++NextMIIt; - NextMIIt = skipDebugInstructionsForward(NextMIIt, ThisMBB->end()); + NextMIIt = next_nodbg(NextMIIt, ThisMBB->end()); } }