Skip to content

Commit fa78983

Browse files
committed
[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
1 parent 4fd186d commit fa78983

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

llvm/lib/CodeGen/PrologEpilogInserter.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,13 +1459,23 @@ void PEI::replaceFrameIndicesBackward(MachineBasicBlock *BB,
14591459
assert(MF.getSubtarget().getRegisterInfo() &&
14601460
"getRegisterInfo() must be implemented!");
14611461

1462+
const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
14621463
const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
1464+
const TargetFrameLowering &TFI = *MF.getSubtarget().getFrameLowering();
14631465

1464-
RS->enterBasicBlockEnd(*BB);
1466+
RegScavenger *LocalRS = FrameIndexEliminationScavenging ? RS : nullptr;
1467+
if (LocalRS)
1468+
LocalRS->enterBasicBlockEnd(*BB);
14651469

14661470
for (MachineInstr &MI : make_early_inc_range(reverse(*BB))) {
1471+
if (TII.isFrameInstr(MI)) {
1472+
TFI.eliminateCallFramePseudoInstr(MF, *BB, &MI);
1473+
continue;
1474+
}
1475+
14671476
// Step backwards to get the liveness state at (immedately after) MI.
1468-
RS->backward(MI);
1477+
if (LocalRS)
1478+
LocalRS->backward(MI);
14691479

14701480
for (unsigned i = 0; i != MI.getNumOperands(); ++i) {
14711481
if (!MI.getOperand(i).isFI())
@@ -1478,9 +1488,12 @@ void PEI::replaceFrameIndicesBackward(MachineBasicBlock *BB,
14781488
//
14791489
// Save and restore the scavenger's position around the call to
14801490
// eliminateFrameIndex in case it erases MI and invalidates the iterator.
1481-
MachineBasicBlock::iterator Save = std::next(RS->getCurrentPosition());
1491+
MachineBasicBlock::iterator Save;
1492+
if (LocalRS)
1493+
Save = std::next(LocalRS->getCurrentPosition());
14821494
bool Removed = TRI.eliminateFrameIndex(MI, SPAdj, i, RS);
1483-
RS->skipTo(std::prev(Save));
1495+
if (LocalRS)
1496+
LocalRS->skipTo(std::prev(Save));
14841497

14851498
if (Removed)
14861499
break;
@@ -1496,7 +1509,7 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &MF,
14961509
const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
14971510
const TargetFrameLowering *TFI = MF.getSubtarget().getFrameLowering();
14981511

1499-
if (RS && TRI.supportsBackwardScavenger())
1512+
if (TRI.supportsBackwardScavenger())
15001513
return replaceFrameIndicesBackward(BB, MF, SPAdj);
15011514

15021515
if (RS && FrameIndexEliminationScavenging)

llvm/lib/Target/Mips/MipsRegisterInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class MipsRegisterInfo : public MipsGenRegisterInfo {
7070
/// Return GPR register class.
7171
virtual const TargetRegisterClass *intRegClass(unsigned Size) const = 0;
7272

73+
bool supportsBackwardScavenger() const override { return true; }
74+
7375
private:
7476
virtual void eliminateFI(MachineBasicBlock::iterator II, unsigned OpNo,
7577
int FrameIndex, uint64_t StackSize,

0 commit comments

Comments
 (0)