diff options
author | Jay Foad <jay.foad@amd.com> | 2023-06-08 09:50:47 +0100 |
---|---|---|
committer | Jay Foad <jay.foad@amd.com> | 2023-07-07 18:30:08 +0100 |
commit | fa78983bcb355bbe9a3cf40870a2378d03ffb591 (patch) | |
tree | 5ca03ecd4b6e706729dcb8e165c9f3bb936efaa1 /llvm/lib/CodeGen/PrologEpilogInserter.cpp | |
parent | 4fd186d804e76453f2be350a026e2759d104025c (diff) | |
download | llvm-fa78983bcb355bbe9a3cf40870a2378d03ffb591.zip llvm-fa78983bcb355bbe9a3cf40870a2378d03ffb591.tar.gz llvm-fa78983bcb355bbe9a3cf40870a2378d03ffb591.tar.bz2 |
[PEI][Mips] Switch to backwards frame index elimination
This adds support for running PEI::replaceFrameIndicesBackward with no
RegisterScavenger, and basic support for eliminating call frame pseudo
instructions.
Differential Revision: https://reviews.llvm.org/D154347
Diffstat (limited to 'llvm/lib/CodeGen/PrologEpilogInserter.cpp')
-rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index c062749..e323aaa 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -1459,13 +1459,23 @@ void PEI::replaceFrameIndicesBackward(MachineBasicBlock *BB, assert(MF.getSubtarget().getRegisterInfo() && "getRegisterInfo() must be implemented!"); + const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo(); const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo(); + const TargetFrameLowering &TFI = *MF.getSubtarget().getFrameLowering(); - RS->enterBasicBlockEnd(*BB); + RegScavenger *LocalRS = FrameIndexEliminationScavenging ? RS : nullptr; + if (LocalRS) + LocalRS->enterBasicBlockEnd(*BB); for (MachineInstr &MI : make_early_inc_range(reverse(*BB))) { + if (TII.isFrameInstr(MI)) { + TFI.eliminateCallFramePseudoInstr(MF, *BB, &MI); + continue; + } + // Step backwards to get the liveness state at (immedately after) MI. - RS->backward(MI); + if (LocalRS) + LocalRS->backward(MI); for (unsigned i = 0; i != MI.getNumOperands(); ++i) { if (!MI.getOperand(i).isFI()) @@ -1478,9 +1488,12 @@ void PEI::replaceFrameIndicesBackward(MachineBasicBlock *BB, // // Save and restore the scavenger's position around the call to // eliminateFrameIndex in case it erases MI and invalidates the iterator. - MachineBasicBlock::iterator Save = std::next(RS->getCurrentPosition()); + MachineBasicBlock::iterator Save; + if (LocalRS) + Save = std::next(LocalRS->getCurrentPosition()); bool Removed = TRI.eliminateFrameIndex(MI, SPAdj, i, RS); - RS->skipTo(std::prev(Save)); + if (LocalRS) + LocalRS->skipTo(std::prev(Save)); if (Removed) break; @@ -1496,7 +1509,7 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &MF, const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo(); const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering(); - if (RS && TRI.supportsBackwardScavenger()) + if (TRI.supportsBackwardScavenger()) return replaceFrameIndicesBackward(BB, MF, SPAdj); if (RS && FrameIndexEliminationScavenging) |