forked from OSchip/llvm-project
[AMDGPU] Implement register pressure callbacks
Implement getRegPressureLimit and getRegPressureSetLimit callbacks in SIRegisterInfo. This makes standard converge scheduler to behave almost the same as GCNScheduler, sometime slightly better sometimes a bit worse. In gerenal that is also possible to switch GCNScheduler to use these callbacks instead of getMaxWaves(), which also makes GCNScheduler slightly better on some tests and slightly worse on another. A big win is behavior with converge scheduler. Note, these are used not only by scheduling, but in places like MachineLICM. Differential Revision: https://reviews.llvm.org/D29700 llvm-svn: 294518
This commit is contained in:
parent
401d369328
commit
4a24705dd6
|
@ -1298,3 +1298,34 @@ bool SIRegisterInfo::shouldCoalesce(MachineInstr *MI,
|
|||
|
||||
return NewSize <= DstSize || NewSize <= SrcSize;
|
||||
}
|
||||
|
||||
unsigned SIRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const {
|
||||
|
||||
const SISubtarget &ST = MF.getSubtarget<SISubtarget>();
|
||||
const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
|
||||
|
||||
unsigned Occupancy = ST.getOccupancyWithLocalMemSize(MFI->getLDSSize(),
|
||||
*MF.getFunction());
|
||||
switch (RC->getID()) {
|
||||
default:
|
||||
return AMDGPURegisterInfo::getRegPressureLimit(RC, MF);
|
||||
case AMDGPU::VGPR_32RegClassID:
|
||||
return std::min(ST.getMaxNumVGPRs(Occupancy), ST.getMaxNumVGPRs(MF));
|
||||
case AMDGPU::SGPR_32RegClassID:
|
||||
return std::min(ST.getMaxNumSGPRs(Occupancy, true), ST.getMaxNumSGPRs(MF));
|
||||
}
|
||||
}
|
||||
|
||||
unsigned SIRegisterInfo::getRegPressureSetLimit(const MachineFunction &MF,
|
||||
unsigned Idx) const {
|
||||
if (Idx == getVGPRPressureSet())
|
||||
return getRegPressureLimit(&AMDGPU::VGPR_32RegClass,
|
||||
const_cast<MachineFunction &>(MF));
|
||||
|
||||
if (Idx == getSGPRPressureSet())
|
||||
return getRegPressureLimit(&AMDGPU::SGPR_32RegClass,
|
||||
const_cast<MachineFunction &>(MF));
|
||||
|
||||
return AMDGPURegisterInfo::getRegPressureSetLimit(MF, Idx);
|
||||
}
|
||||
|
|
|
@ -205,6 +205,12 @@ public:
|
|||
unsigned DstSubReg,
|
||||
const TargetRegisterClass *NewRC) const override;
|
||||
|
||||
unsigned getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
MachineFunction &MF) const override;
|
||||
|
||||
unsigned getRegPressureSetLimit(const MachineFunction &MF,
|
||||
unsigned Idx) const override;
|
||||
|
||||
private:
|
||||
void buildSpillLoadStore(MachineBasicBlock::iterator MI,
|
||||
unsigned LoadStoreOp,
|
||||
|
|
Loading…
Reference in New Issue