mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-17 10:48:09 +00:00
[MachineBasicBlock] Add helpers for skipping debug instructions [1/14]
Summary: These helpers are exercised by follow-up commits in this patch series, which is all about removing CodeGen differences with vs. without debug info in the AArch64 backend. Reviewers: fhahn, aprantl, jpaquette, paquette Subscribers: kristof.beyls, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D78260
This commit is contained in:
parent
3358e53af8
commit
327d4464a3
@ -1061,6 +1061,35 @@ inline IterT skipDebugInstructionsBackward(IterT It, IterT Begin) {
|
||||
return It;
|
||||
}
|
||||
|
||||
/// Increment \p It, then continue incrementing it while it points to a debug
|
||||
/// instruction. A replacement for std::next.
|
||||
template <typename IterT> 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 <typename IterT> 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 <typename IterT>
|
||||
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 <typename IterT>
|
||||
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
|
||||
|
@ -1840,8 +1840,7 @@ MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB,
|
||||
|
||||
// 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()) {
|
||||
|
@ -1329,8 +1329,8 @@ MachineBasicBlock::findDebugLoc(instr_iterator MBBI) {
|
||||
/// 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 {};
|
||||
}
|
||||
|
@ -858,7 +858,7 @@ void RegPressureTracker::recedeSkipDebugValues() {
|
||||
static_cast<RegionPressure&>(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 @@ void RegPressureTracker::advance(const RegisterOperands &RegOpers) {
|
||||
bumpDeadDefs(RegOpers.DeadDefs);
|
||||
|
||||
// Find the next instruction.
|
||||
CurrPos = skipDebugInstructionsForward(std::next(CurrPos), MBB->end());
|
||||
CurrPos = next_nodbg(CurrPos, MBB->end());
|
||||
}
|
||||
|
||||
void RegPressureTracker::advance() {
|
||||
|
@ -411,9 +411,8 @@ void X86AvoidSFBPass::buildCopy(MachineInstr *LoadInst, unsigned NLoadOpcode,
|
||||
// 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 @@ void X86AvoidSFBPass::buildCopies(int Size, MachineInstr *LoadInst,
|
||||
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
|
||||
|
@ -31494,8 +31494,7 @@ X86TargetLowering::EmitLoweredSelect(MachineInstr &MI,
|
||||
(NextMIIt->getOperand(3).getImm() == CC ||
|
||||
NextMIIt->getOperand(3).getImm() == OppCC)) {
|
||||
LastCMOV = &*NextMIIt;
|
||||
++NextMIIt;
|
||||
NextMIIt = skipDebugInstructionsForward(NextMIIt, ThisMBB->end());
|
||||
NextMIIt = next_nodbg(NextMIIt, ThisMBB->end());
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user