mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[PEI] Separate saving and restoring CSRs into different functions. NFC
Split insertCSRSpillsAndRestores into insertCSRSaves + insertCSRRestores. This is mostly useful for future shrink-wrapping improvements where we want to save / restore a specific part of the CSRs in a specific block. Differential Revision: https://reviews.llvm.org/D35644 llvm-svn: 308573
This commit is contained in:
parent
316eb09c53
commit
867b822cb5
@ -455,76 +455,47 @@ static void updateLiveness(MachineFunction &MF) {
|
||||
}
|
||||
}
|
||||
|
||||
/// insertCSRSpillsAndRestores - Insert spill and restore code for
|
||||
/// callee saved registers used in the function.
|
||||
///
|
||||
static void insertCSRSpillsAndRestores(MachineFunction &Fn,
|
||||
const MBBVector &SaveBlocks,
|
||||
const MBBVector &RestoreBlocks) {
|
||||
// Get callee saved register information.
|
||||
MachineFrameInfo &MFI = Fn.getFrameInfo();
|
||||
const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
|
||||
|
||||
MFI.setCalleeSavedInfoValid(true);
|
||||
|
||||
// Early exit if no callee saved registers are modified!
|
||||
if (CSI.empty())
|
||||
return;
|
||||
|
||||
/// Insert restore code for the callee-saved registers used in the function.
|
||||
static void insertCSRSaves(MachineBasicBlock &SaveBlock,
|
||||
ArrayRef<CalleeSavedInfo> CSI) {
|
||||
MachineFunction &Fn = *SaveBlock.getParent();
|
||||
const TargetInstrInfo &TII = *Fn.getSubtarget().getInstrInfo();
|
||||
const TargetFrameLowering *TFI = Fn.getSubtarget().getFrameLowering();
|
||||
const TargetRegisterInfo *TRI = Fn.getSubtarget().getRegisterInfo();
|
||||
MachineBasicBlock::iterator I;
|
||||
|
||||
// Spill using target interface.
|
||||
for (MachineBasicBlock *SaveBlock : SaveBlocks) {
|
||||
I = SaveBlock->begin();
|
||||
if (!TFI->spillCalleeSavedRegisters(*SaveBlock, I, CSI, TRI)) {
|
||||
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
|
||||
MachineBasicBlock::iterator I = SaveBlock.begin();
|
||||
if (!TFI->spillCalleeSavedRegisters(SaveBlock, I, CSI, TRI)) {
|
||||
for (const CalleeSavedInfo &CS : CSI) {
|
||||
// Insert the spill to the stack frame.
|
||||
unsigned Reg = CSI[i].getReg();
|
||||
unsigned Reg = CS.getReg();
|
||||
const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg);
|
||||
TII.storeRegToStackSlot(*SaveBlock, I, Reg, true, CSI[i].getFrameIdx(),
|
||||
RC, TRI);
|
||||
TII.storeRegToStackSlot(SaveBlock, I, Reg, true, CS.getFrameIdx(), RC,
|
||||
TRI);
|
||||
}
|
||||
}
|
||||
// Update the live-in information of all the blocks up to the save point.
|
||||
updateLiveness(Fn);
|
||||
}
|
||||
}
|
||||
|
||||
// Restore using target interface.
|
||||
for (MachineBasicBlock *MBB : RestoreBlocks) {
|
||||
I = MBB->end();
|
||||
|
||||
// Skip over all terminator instructions, which are part of the return
|
||||
// sequence.
|
||||
MachineBasicBlock::iterator I2 = I;
|
||||
while (I2 != MBB->begin() && (--I2)->isTerminator())
|
||||
I = I2;
|
||||
|
||||
bool AtStart = I == MBB->begin();
|
||||
MachineBasicBlock::iterator BeforeI = I;
|
||||
if (!AtStart)
|
||||
--BeforeI;
|
||||
/// Insert restore code for the callee-saved registers used in the function.
|
||||
static void insertCSRRestores(MachineBasicBlock &RestoreBlock,
|
||||
ArrayRef<CalleeSavedInfo> CSI) {
|
||||
MachineFunction &Fn = *RestoreBlock.getParent();
|
||||
const TargetInstrInfo &TII = *Fn.getSubtarget().getInstrInfo();
|
||||
const TargetFrameLowering *TFI = Fn.getSubtarget().getFrameLowering();
|
||||
const TargetRegisterInfo *TRI = Fn.getSubtarget().getRegisterInfo();
|
||||
|
||||
// Restore all registers immediately before the return and any
|
||||
// terminators that precede it.
|
||||
if (!TFI->restoreCalleeSavedRegisters(*MBB, I, CSI, TRI)) {
|
||||
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
|
||||
unsigned Reg = CSI[i].getReg();
|
||||
MachineBasicBlock::iterator I = RestoreBlock.getFirstTerminator();
|
||||
|
||||
if (!TFI->restoreCalleeSavedRegisters(RestoreBlock, I, CSI, TRI)) {
|
||||
for (const CalleeSavedInfo &CI : reverse(CSI)) {
|
||||
unsigned Reg = CI.getReg();
|
||||
const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg);
|
||||
TII.loadRegFromStackSlot(*MBB, I, Reg, CSI[i].getFrameIdx(), RC, TRI);
|
||||
assert(I != MBB->begin() &&
|
||||
TII.loadRegFromStackSlot(RestoreBlock, I, Reg, CI.getFrameIdx(), RC, TRI);
|
||||
assert(I != RestoreBlock.begin() &&
|
||||
"loadRegFromStackSlot didn't insert any code!");
|
||||
// Insert in reverse order. loadRegFromStackSlot can insert
|
||||
// multiple instructions.
|
||||
if (AtStart)
|
||||
I = MBB->begin();
|
||||
else {
|
||||
I = BeforeI;
|
||||
++I;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -532,6 +503,7 @@ static void insertCSRSpillsAndRestores(MachineFunction &Fn,
|
||||
void PEI::doSpillCalleeSavedRegs(MachineFunction &Fn) {
|
||||
const Function *F = Fn.getFunction();
|
||||
const TargetFrameLowering *TFI = Fn.getSubtarget().getFrameLowering();
|
||||
MachineFrameInfo &MFI = Fn.getFrameInfo();
|
||||
MinCSFrameIndex = std::numeric_limits<unsigned>::max();
|
||||
MaxCSFrameIndex = 0;
|
||||
|
||||
@ -543,8 +515,21 @@ void PEI::doSpillCalleeSavedRegs(MachineFunction &Fn) {
|
||||
assignCalleeSavedSpillSlots(Fn, SavedRegs, MinCSFrameIndex, MaxCSFrameIndex);
|
||||
|
||||
// Add the code to save and restore the callee saved registers.
|
||||
if (!F->hasFnAttribute(Attribute::Naked))
|
||||
insertCSRSpillsAndRestores(Fn, SaveBlocks, RestoreBlocks);
|
||||
if (!F->hasFnAttribute(Attribute::Naked)) {
|
||||
MFI.setCalleeSavedInfoValid(true);
|
||||
|
||||
ArrayRef<CalleeSavedInfo> CSI = MFI.getCalleeSavedInfo();
|
||||
if (!CSI.empty()) {
|
||||
for (MachineBasicBlock *SaveBlock : SaveBlocks) {
|
||||
insertCSRSaves(*SaveBlock, CSI);
|
||||
// Update the live-in information of all the blocks up to the save
|
||||
// point.
|
||||
updateLiveness(Fn);
|
||||
}
|
||||
for (MachineBasicBlock *RestoreBlock : RestoreBlocks)
|
||||
insertCSRRestores(*RestoreBlock, CSI);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// AdjustStackOffset - Helper function used to adjust the stack frame offset.
|
||||
|
Loading…
Reference in New Issue
Block a user