mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-03 01:12:53 +00:00
TRI: Add hook to pass scavenger during frame elimination
The scavenger was not passed if requiresFrameIndexScavenging was enabled. I need to be able to test for the availability of an unallocatable register here, so I can't create a virtual register for it. It might be better to just always use the scavenger and stop creating virtual registers. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287843 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f18de36554
commit
1cb6ce6960
@ -87,7 +87,7 @@ public:
|
||||
|
||||
/// Return the number of registers in this class.
|
||||
unsigned getNumRegs() const { return MC->getNumRegs(); }
|
||||
|
||||
|
||||
iterator_range<SmallVectorImpl<MCPhysReg>::const_iterator>
|
||||
getRegisters() const {
|
||||
return make_range(MC->begin(), MC->end());
|
||||
@ -813,6 +813,13 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Returns true if the target requires using the RegScavenger directly for
|
||||
/// frame elimination despite using requiresFrameIndexScavenging.
|
||||
virtual bool requiresFrameIndexReplacementScavenging(
|
||||
const MachineFunction &MF) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Returns true if the target wants the LocalStackAllocation pass to be run
|
||||
/// and virtual base registers used for more efficient stack access.
|
||||
virtual bool requiresVirtualBaseRegisters(const MachineFunction &MF) const {
|
||||
|
@ -117,6 +117,10 @@ private:
|
||||
// TRI->requiresFrameIndexScavenging() for the current function.
|
||||
bool FrameIndexVirtualScavenging;
|
||||
|
||||
// Flag to control whether the scavenger should be passed even though
|
||||
// FrameIndexVirtualScavenging is used.
|
||||
bool FrameIndexEliminationScavenging;
|
||||
|
||||
void calculateCallFrameInfo(MachineFunction &Fn);
|
||||
void calculateSaveRestoreBlocks(MachineFunction &Fn);
|
||||
|
||||
@ -176,6 +180,8 @@ bool PEI::runOnMachineFunction(MachineFunction &Fn) {
|
||||
|
||||
RS = TRI->requiresRegisterScavenging(Fn) ? new RegScavenger() : nullptr;
|
||||
FrameIndexVirtualScavenging = TRI->requiresFrameIndexScavenging(Fn);
|
||||
FrameIndexEliminationScavenging = (RS && !FrameIndexVirtualScavenging) ||
|
||||
TRI->requiresFrameIndexReplacementScavenging(Fn);
|
||||
|
||||
// Calculate the MaxCallFrameSize and AdjustsStack variables for the
|
||||
// function's frame information. Also eliminates call frame pseudo
|
||||
@ -1046,7 +1052,8 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn,
|
||||
unsigned FrameSetupOpcode = TII.getCallFrameSetupOpcode();
|
||||
unsigned FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
|
||||
|
||||
if (RS && !FrameIndexVirtualScavenging) RS->enterBasicBlock(*BB);
|
||||
if (RS && FrameIndexEliminationScavenging)
|
||||
RS->enterBasicBlock(*BB);
|
||||
|
||||
bool InsideCallSequence = false;
|
||||
|
||||
@ -1115,7 +1122,7 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn,
|
||||
// use that target machine register info object to eliminate
|
||||
// it.
|
||||
TRI.eliminateFrameIndex(MI, SPAdj, i,
|
||||
FrameIndexVirtualScavenging ? nullptr : RS);
|
||||
FrameIndexEliminationScavenging ? RS : nullptr);
|
||||
|
||||
// Reset the iterator if we were at the beginning of the BB.
|
||||
if (AtBeginning) {
|
||||
@ -1131,7 +1138,7 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn,
|
||||
// the SP adjustment made by each instruction in the sequence.
|
||||
// This includes both the frame setup/destroy pseudos (handled above),
|
||||
// as well as other instructions that have side effects w.r.t the SP.
|
||||
// Note that this must come after eliminateFrameIndex, because
|
||||
// Note that this must come after eliminateFrameIndex, because
|
||||
// if I itself referred to a frame index, we shouldn't count its own
|
||||
// adjustment.
|
||||
if (DidFinishLoop && InsideCallSequence)
|
||||
@ -1140,7 +1147,7 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn,
|
||||
if (DoIncr && I != BB->end()) ++I;
|
||||
|
||||
// Update register states.
|
||||
if (RS && !FrameIndexVirtualScavenging && DidFinishLoop)
|
||||
if (RS && FrameIndexEliminationScavenging && DidFinishLoop)
|
||||
RS->forward(MI);
|
||||
}
|
||||
}
|
||||
|
@ -182,6 +182,16 @@ SIRegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF) const {
|
||||
return MF.getFrameInfo().hasStackObjects();
|
||||
}
|
||||
|
||||
bool SIRegisterInfo::requiresFrameIndexReplacementScavenging(
|
||||
const MachineFunction &MF) const {
|
||||
// m0 is needed for the scalar store offset. m0 is unallocatable, so we can't
|
||||
// create a virtual register for it during frame index elimination, so the
|
||||
// scavenger is directly needed.
|
||||
return MF.getFrameInfo().hasStackObjects() &&
|
||||
MF.getSubtarget<SISubtarget>().hasScalarStores() &&
|
||||
MF.getInfo<SIMachineFunctionInfo>()->hasSpilledSGPRs();
|
||||
}
|
||||
|
||||
bool SIRegisterInfo::requiresVirtualBaseRegisters(
|
||||
const MachineFunction &) const {
|
||||
// There are no special dedicated stack or frame pointers.
|
||||
|
@ -50,8 +50,9 @@ public:
|
||||
|
||||
bool requiresRegisterScavenging(const MachineFunction &Fn) const override;
|
||||
|
||||
|
||||
bool requiresFrameIndexScavenging(const MachineFunction &MF) const override;
|
||||
bool requiresFrameIndexReplacementScavenging(
|
||||
const MachineFunction &MF) const override;
|
||||
bool requiresVirtualBaseRegisters(const MachineFunction &Fn) const override;
|
||||
bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user