aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/PrologEpilogInserter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/PrologEpilogInserter.cpp')
-rw-r--r--llvm/lib/CodeGen/PrologEpilogInserter.cpp32
1 files changed, 17 insertions, 15 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp
index c2b2399..d97a0e7 100644
--- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp
+++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp
@@ -1486,7 +1486,9 @@ void PEI::replaceFrameIndicesBackward(MachineBasicBlock *BB,
if (LocalRS)
LocalRS->enterBasicBlockEnd(*BB);
- for (MachineInstr &MI : make_early_inc_range(reverse(*BB))) {
+ for (MachineBasicBlock::iterator I = BB->end(); I != BB->begin();) {
+ MachineInstr &MI = *std::prev(I);
+
if (TII.isFrameInstr(MI)) {
SPAdj -= TII.getSPAdjust(MI);
TFI.eliminateCallFramePseudoInstr(MF, *BB, &MI);
@@ -1497,27 +1499,27 @@ void PEI::replaceFrameIndicesBackward(MachineBasicBlock *BB,
if (LocalRS)
LocalRS->backward(MI);
- for (unsigned i = 0; i != MI.getNumOperands(); ++i) {
- if (!MI.getOperand(i).isFI())
+ bool RemovedMI = false;
+ for (const auto &[Idx, Op] : enumerate(MI.operands())) {
+ if (!Op.isFI())
continue;
- if (replaceFrameIndexDebugInstr(MF, MI, i, SPAdj))
+ if (replaceFrameIndexDebugInstr(MF, MI, Idx, SPAdj))
continue;
// Eliminate this FrameIndex operand.
- //
- // Save and restore the scavenger's position around the call to
- // eliminateFrameIndex in case it erases MI and invalidates the iterator.
- MachineBasicBlock::iterator Save;
- if (LocalRS)
- Save = std::next(LocalRS->getCurrentPosition());
- bool Removed = TRI.eliminateFrameIndex(MI, SPAdj, i, LocalRS);
- if (LocalRS)
- LocalRS->skipTo(std::prev(Save));
-
- if (Removed)
+ RemovedMI = TRI.eliminateFrameIndex(MI, SPAdj, Idx, LocalRS);
+ if (RemovedMI)
break;
}
+
+ // Refresh the scavenger's internal iterator in case MI was removed or more
+ // instructions were inserted after it.
+ if (LocalRS)
+ LocalRS->skipTo(std::prev(I));
+
+ if (!RemovedMI)
+ --I;
}
}