forked from OSchip/llvm-project
Note in PPCFunctionInfo VRSAVE spills
In preparation for using the new register scavenger capability for providing more than one register simultaneously, specifically note functions that have spilled VRSAVE (currently, this can happen only in functions that use the setjmp intrinsic). As with CR spilling, such functions will need to provide two emergency spill slots to the scavenger. No functionality change intended. llvm-svn: 177832
This commit is contained in:
parent
c2bdf1973b
commit
cc1eeda16d
|
@ -188,6 +188,11 @@ static bool spillsCR(const MachineFunction &MF) {
|
|||
return FuncInfo->isCRSpilled();
|
||||
}
|
||||
|
||||
static bool spillsVRSAVE(const MachineFunction &MF) {
|
||||
const PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
return FuncInfo->isVRSAVESpilled();
|
||||
}
|
||||
|
||||
static bool hasSpills(const MachineFunction &MF) {
|
||||
const PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
return FuncInfo->hasSpills();
|
||||
|
@ -1081,8 +1086,8 @@ PPCFrameLowering::addScavengingSpillSlot(MachineFunction &MF,
|
|||
// needed alignment padding.
|
||||
unsigned StackSize = determineFrameLayout(MF, false, true);
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
if (MFI->hasVarSizedObjects() || spillsCR(MF) || hasNonRISpills(MF) ||
|
||||
(hasSpills(MF) && !isInt<16>(StackSize))) {
|
||||
if (MFI->hasVarSizedObjects() || spillsCR(MF) || spillsVRSAVE(MF) ||
|
||||
hasNonRISpills(MF) || (hasSpills(MF) && !isInt<16>(StackSize))) {
|
||||
const TargetRegisterClass *GPRC = &PPC::GPRCRegClass;
|
||||
const TargetRegisterClass *G8RC = &PPC::G8RCRegClass;
|
||||
const TargetRegisterClass *RC = Subtarget.isPPC64() ? G8RC : GPRC;
|
||||
|
|
|
@ -440,7 +440,7 @@ PPCInstrInfo::StoreRegToStackSlot(MachineFunction &MF,
|
|||
int FrameIdx,
|
||||
const TargetRegisterClass *RC,
|
||||
SmallVectorImpl<MachineInstr*> &NewMIs,
|
||||
bool &NonRI) const{
|
||||
bool &NonRI, bool &SpillsVRS) const{
|
||||
DebugLoc DL;
|
||||
if (PPC::GPRCRegClass.hasSubClassEq(RC)) {
|
||||
NewMIs.push_back(addFrameReference(BuildMI(MF, DL, get(PPC::STW))
|
||||
|
@ -500,7 +500,7 @@ PPCInstrInfo::StoreRegToStackSlot(MachineFunction &MF,
|
|||
Reg = PPC::CR7;
|
||||
|
||||
return StoreRegToStackSlot(MF, Reg, isKill, FrameIdx,
|
||||
&PPC::CRRCRegClass, NewMIs, NonRI);
|
||||
&PPC::CRRCRegClass, NewMIs, NonRI, SpillsVRS);
|
||||
|
||||
} else if (PPC::VRRCRegClass.hasSubClassEq(RC)) {
|
||||
NewMIs.push_back(addFrameReference(BuildMI(MF, DL, get(PPC::STVX))
|
||||
|
@ -513,7 +513,7 @@ PPCInstrInfo::StoreRegToStackSlot(MachineFunction &MF,
|
|||
.addReg(SrcReg,
|
||||
getKillRegState(isKill)),
|
||||
FrameIdx));
|
||||
NonRI = true;
|
||||
SpillsVRS = true;
|
||||
} else {
|
||||
llvm_unreachable("Unknown regclass!");
|
||||
}
|
||||
|
@ -533,10 +533,14 @@ PPCInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
|
|||
PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
FuncInfo->setHasSpills();
|
||||
|
||||
bool NonRI = false;
|
||||
if (StoreRegToStackSlot(MF, SrcReg, isKill, FrameIdx, RC, NewMIs, NonRI))
|
||||
bool NonRI = false, SpillsVRS = false;
|
||||
if (StoreRegToStackSlot(MF, SrcReg, isKill, FrameIdx, RC, NewMIs,
|
||||
NonRI, SpillsVRS))
|
||||
FuncInfo->setSpillsCR();
|
||||
|
||||
if (SpillsVRS)
|
||||
FuncInfo->setSpillsVRSAVE();
|
||||
|
||||
if (NonRI)
|
||||
FuncInfo->setHasNonRISpills();
|
||||
|
||||
|
@ -557,7 +561,7 @@ PPCInstrInfo::LoadRegFromStackSlot(MachineFunction &MF, DebugLoc DL,
|
|||
unsigned DestReg, int FrameIdx,
|
||||
const TargetRegisterClass *RC,
|
||||
SmallVectorImpl<MachineInstr*> &NewMIs,
|
||||
bool &NonRI) const{
|
||||
bool &NonRI, bool &SpillsVRS) const{
|
||||
if (PPC::GPRCRegClass.hasSubClassEq(RC)) {
|
||||
if (DestReg != PPC::LR) {
|
||||
NewMIs.push_back(addFrameReference(BuildMI(MF, DL, get(PPC::LWZ),
|
||||
|
@ -616,7 +620,7 @@ PPCInstrInfo::LoadRegFromStackSlot(MachineFunction &MF, DebugLoc DL,
|
|||
Reg = PPC::CR7;
|
||||
|
||||
return LoadRegFromStackSlot(MF, DL, Reg, FrameIdx,
|
||||
&PPC::CRRCRegClass, NewMIs, NonRI);
|
||||
&PPC::CRRCRegClass, NewMIs, NonRI, SpillsVRS);
|
||||
|
||||
} else if (PPC::VRRCRegClass.hasSubClassEq(RC)) {
|
||||
NewMIs.push_back(addFrameReference(BuildMI(MF, DL, get(PPC::LVX), DestReg),
|
||||
|
@ -627,7 +631,7 @@ PPCInstrInfo::LoadRegFromStackSlot(MachineFunction &MF, DebugLoc DL,
|
|||
get(PPC::RESTORE_VRSAVE),
|
||||
DestReg),
|
||||
FrameIdx));
|
||||
NonRI = true;
|
||||
SpillsVRS = true;
|
||||
} else {
|
||||
llvm_unreachable("Unknown regclass!");
|
||||
}
|
||||
|
@ -649,10 +653,14 @@ PPCInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
|
|||
PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
FuncInfo->setHasSpills();
|
||||
|
||||
bool NonRI = false;
|
||||
if (LoadRegFromStackSlot(MF, DL, DestReg, FrameIdx, RC, NewMIs, NonRI))
|
||||
bool NonRI = false, SpillsVRS = false;
|
||||
if (LoadRegFromStackSlot(MF, DL, DestReg, FrameIdx, RC, NewMIs,
|
||||
NonRI, SpillsVRS))
|
||||
FuncInfo->setSpillsCR();
|
||||
|
||||
if (SpillsVRS)
|
||||
FuncInfo->setSpillsVRSAVE();
|
||||
|
||||
if (NonRI)
|
||||
FuncInfo->setHasNonRISpills();
|
||||
|
||||
|
|
|
@ -72,12 +72,12 @@ class PPCInstrInfo : public PPCGenInstrInfo {
|
|||
unsigned SrcReg, bool isKill, int FrameIdx,
|
||||
const TargetRegisterClass *RC,
|
||||
SmallVectorImpl<MachineInstr*> &NewMIs,
|
||||
bool &NonRI) const;
|
||||
bool &NonRI, bool &SpillsVRS) const;
|
||||
bool LoadRegFromStackSlot(MachineFunction &MF, DebugLoc DL,
|
||||
unsigned DestReg, int FrameIdx,
|
||||
const TargetRegisterClass *RC,
|
||||
SmallVectorImpl<MachineInstr*> &NewMIs,
|
||||
bool &NonRI) const;
|
||||
bool &NonRI, bool &SpillsVRS) const;
|
||||
public:
|
||||
explicit PPCInstrInfo(PPCTargetMachine &TM);
|
||||
|
||||
|
|
|
@ -47,6 +47,9 @@ class PPCFunctionInfo : public MachineFunctionInfo {
|
|||
/// SpillsCR - Indicates whether CR is spilled in the current function.
|
||||
bool SpillsCR;
|
||||
|
||||
/// Indicates whether VRSAVE is spilled in the current function.
|
||||
bool SpillsVRSAVE;
|
||||
|
||||
/// LRStoreRequired - The bool indicates whether there is some explicit use of
|
||||
/// the LR/LR8 stack slot that is not obvious from scanning the code. This
|
||||
/// requires that the code generator produce a store of LR to the stack on
|
||||
|
@ -88,6 +91,7 @@ public:
|
|||
HasSpills(false),
|
||||
HasNonRISpills(false),
|
||||
SpillsCR(false),
|
||||
SpillsVRSAVE(false),
|
||||
LRStoreRequired(false),
|
||||
MinReservedArea(0),
|
||||
TailCallSPDelta(0),
|
||||
|
@ -127,6 +131,9 @@ public:
|
|||
void setSpillsCR() { SpillsCR = true; }
|
||||
bool isCRSpilled() const { return SpillsCR; }
|
||||
|
||||
void setSpillsVRSAVE() { SpillsVRSAVE = true; }
|
||||
bool isVRSAVESpilled() const { return SpillsVRSAVE; }
|
||||
|
||||
void setLRStoreRequired() { LRStoreRequired = true; }
|
||||
bool isLRStoreRequired() const { return LRStoreRequired; }
|
||||
|
||||
|
|
Loading…
Reference in New Issue