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.

llvm-svn: 287843
This commit is contained in:
Matt Arsenault 2016-11-24 00:26:47 +00:00
parent 5ee3325358
commit 94b32ffe8e
4 changed files with 31 additions and 6 deletions

View File

@ -87,7 +87,7 @@ public:
/// Return the number of registers in this class. /// Return the number of registers in this class.
unsigned getNumRegs() const { return MC->getNumRegs(); } unsigned getNumRegs() const { return MC->getNumRegs(); }
iterator_range<SmallVectorImpl<MCPhysReg>::const_iterator> iterator_range<SmallVectorImpl<MCPhysReg>::const_iterator>
getRegisters() const { getRegisters() const {
return make_range(MC->begin(), MC->end()); return make_range(MC->begin(), MC->end());
@ -813,6 +813,13 @@ public:
return false; 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 /// Returns true if the target wants the LocalStackAllocation pass to be run
/// and virtual base registers used for more efficient stack access. /// and virtual base registers used for more efficient stack access.
virtual bool requiresVirtualBaseRegisters(const MachineFunction &MF) const { virtual bool requiresVirtualBaseRegisters(const MachineFunction &MF) const {

View File

@ -117,6 +117,10 @@ private:
// TRI->requiresFrameIndexScavenging() for the current function. // TRI->requiresFrameIndexScavenging() for the current function.
bool FrameIndexVirtualScavenging; bool FrameIndexVirtualScavenging;
// Flag to control whether the scavenger should be passed even though
// FrameIndexVirtualScavenging is used.
bool FrameIndexEliminationScavenging;
void calculateCallFrameInfo(MachineFunction &Fn); void calculateCallFrameInfo(MachineFunction &Fn);
void calculateSaveRestoreBlocks(MachineFunction &Fn); void calculateSaveRestoreBlocks(MachineFunction &Fn);
@ -176,6 +180,8 @@ bool PEI::runOnMachineFunction(MachineFunction &Fn) {
RS = TRI->requiresRegisterScavenging(Fn) ? new RegScavenger() : nullptr; RS = TRI->requiresRegisterScavenging(Fn) ? new RegScavenger() : nullptr;
FrameIndexVirtualScavenging = TRI->requiresFrameIndexScavenging(Fn); FrameIndexVirtualScavenging = TRI->requiresFrameIndexScavenging(Fn);
FrameIndexEliminationScavenging = (RS && !FrameIndexVirtualScavenging) ||
TRI->requiresFrameIndexReplacementScavenging(Fn);
// Calculate the MaxCallFrameSize and AdjustsStack variables for the // Calculate the MaxCallFrameSize and AdjustsStack variables for the
// function's frame information. Also eliminates call frame pseudo // 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 FrameSetupOpcode = TII.getCallFrameSetupOpcode();
unsigned FrameDestroyOpcode = TII.getCallFrameDestroyOpcode(); unsigned FrameDestroyOpcode = TII.getCallFrameDestroyOpcode();
if (RS && !FrameIndexVirtualScavenging) RS->enterBasicBlock(*BB); if (RS && FrameIndexEliminationScavenging)
RS->enterBasicBlock(*BB);
bool InsideCallSequence = false; bool InsideCallSequence = false;
@ -1115,7 +1122,7 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn,
// use that target machine register info object to eliminate // use that target machine register info object to eliminate
// it. // it.
TRI.eliminateFrameIndex(MI, SPAdj, i, TRI.eliminateFrameIndex(MI, SPAdj, i,
FrameIndexVirtualScavenging ? nullptr : RS); FrameIndexEliminationScavenging ? RS : nullptr);
// Reset the iterator if we were at the beginning of the BB. // Reset the iterator if we were at the beginning of the BB.
if (AtBeginning) { if (AtBeginning) {
@ -1131,7 +1138,7 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn,
// the SP adjustment made by each instruction in the sequence. // the SP adjustment made by each instruction in the sequence.
// This includes both the frame setup/destroy pseudos (handled above), // This includes both the frame setup/destroy pseudos (handled above),
// as well as other instructions that have side effects w.r.t the SP. // 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 // if I itself referred to a frame index, we shouldn't count its own
// adjustment. // adjustment.
if (DidFinishLoop && InsideCallSequence) if (DidFinishLoop && InsideCallSequence)
@ -1140,7 +1147,7 @@ void PEI::replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn,
if (DoIncr && I != BB->end()) ++I; if (DoIncr && I != BB->end()) ++I;
// Update register states. // Update register states.
if (RS && !FrameIndexVirtualScavenging && DidFinishLoop) if (RS && FrameIndexEliminationScavenging && DidFinishLoop)
RS->forward(MI); RS->forward(MI);
} }
} }

View File

@ -182,6 +182,16 @@ SIRegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF) const {
return MF.getFrameInfo().hasStackObjects(); 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( bool SIRegisterInfo::requiresVirtualBaseRegisters(
const MachineFunction &) const { const MachineFunction &) const {
// There are no special dedicated stack or frame pointers. // There are no special dedicated stack or frame pointers.

View File

@ -50,8 +50,9 @@ public:
bool requiresRegisterScavenging(const MachineFunction &Fn) const override; bool requiresRegisterScavenging(const MachineFunction &Fn) const override;
bool requiresFrameIndexScavenging(const MachineFunction &MF) const override; bool requiresFrameIndexScavenging(const MachineFunction &MF) const override;
bool requiresFrameIndexReplacementScavenging(
const MachineFunction &MF) const override;
bool requiresVirtualBaseRegisters(const MachineFunction &Fn) const override; bool requiresVirtualBaseRegisters(const MachineFunction &Fn) const override;
bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override; bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const override;