Skip to content

Commit 805bc4f

Browse files
committed
[PrologEpilog] Fix RegScavenger crash when frame pseudo is last instruction
llvm#174251 The crash occurs when a basic block's last instruction is a call frame pseudo instruction. The RegScavenger::MBBI iterator becomes invalid after eliminateCallFramePseudoInstr erases the instruction
1 parent 5d986dc commit 805bc4f

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

llvm/lib/CodeGen/PrologEpilogInserter.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1468,14 +1468,21 @@ void PEI::replaceFrameIndicesBackward(MachineBasicBlock *BB,
14681468
LocalRS->enterBasicBlockEnd(*BB);
14691469

14701470
for (MachineInstr &MI : make_early_inc_range(reverse(*BB))) {
1471+
// Z80-FORK: Fix for llvm/llvm-project#174251 - must call backward(MI)
1472+
// before frame instruction check to avoid dangling MBBI when frame
1473+
// instructions are erased.
1474+
if (LocalRS)
1475+
LocalRS->backward(MI);
1476+
14711477
if (TII.isFrameInstr(MI)) {
1478+
// Z80-FORK: Step past the frame instruction before erasing it.
1479+
if (LocalRS)
1480+
LocalRS->backward();
14721481
TFI.eliminateCallFramePseudoInstr(MF, *BB, &MI);
14731482
continue;
14741483
}
14751484

1476-
// Step backwards to get the liveness state at (immedately after) MI.
1477-
if (LocalRS)
1478-
LocalRS->backward(MI);
1485+
14791486

14801487
for (unsigned i = 0; i != MI.getNumOperands(); ++i) {
14811488
if (!MI.getOperand(i).isFI())

0 commit comments

Comments
 (0)