forked from OSchip/llvm-project
[AMDGPU][NFC] Organize code around reserving VGPR32 for AGPR copy.
This is an NFC patch in preparation to fix a bug related to always reserving VGPR32 for AGPR copy. Reviewed By: rampitec Differential Revision: https://reviews.llvm.org/D123651
This commit is contained in:
parent
35ea326047
commit
ea47373af4
|
@ -614,7 +614,8 @@ static void indirectCopyToAGPR(const SIInstrInfo &TII,
|
|||
// Registers in the sequence are allocated contiguously so we can just
|
||||
// use register number to pick one of three round-robin temps.
|
||||
unsigned RegNo = DestReg % 3;
|
||||
Register Tmp = AMDGPU::VGPR32;
|
||||
Register Tmp =
|
||||
MBB.getParent()->getInfo<SIMachineFunctionInfo>()->getVGPRForAGPRCopy();
|
||||
assert(MBB.getParent()->getRegInfo().isReserved(Tmp) &&
|
||||
"VGPR used for an intermediate copy should have been reserved.");
|
||||
|
||||
|
|
|
@ -187,6 +187,12 @@ SIMachineFunctionInfo::SIMachineFunctionInfo(const MachineFunction &MF)
|
|||
S = F.getFnAttribute("amdgpu-gds-size").getValueAsString();
|
||||
if (!S.empty())
|
||||
S.consumeInteger(0, GDSSize);
|
||||
|
||||
// On GFX908, in order to guarantee copying between AGPRs, we need a scratch
|
||||
// VGPR available at all times.
|
||||
if (ST.hasMAIInsts() && !ST.hasGFX90AInsts()) {
|
||||
VGPRForAGPRCopy = AMDGPU::VGPR_32RegClass.getRegister(32);
|
||||
}
|
||||
}
|
||||
|
||||
void SIMachineFunctionInfo::limitOccupancy(const MachineFunction &MF) {
|
||||
|
|
|
@ -493,6 +493,16 @@ private:
|
|||
// frame, so save it here and add it to the RegScavenger later.
|
||||
Optional<int> ScavengeFI;
|
||||
|
||||
private:
|
||||
Register VGPRForAGPRCopy;
|
||||
|
||||
public:
|
||||
Register getVGPRForAGPRCopy() const {
|
||||
assert(VGPRForAGPRCopy &&
|
||||
"Valid VGPR for AGPR copy must have been identified by now");
|
||||
return VGPRForAGPRCopy;
|
||||
}
|
||||
|
||||
public: // FIXME
|
||||
/// If this is set, an SGPR used for save/restore of the register used for the
|
||||
/// frame pointer.
|
||||
|
|
|
@ -698,7 +698,7 @@ BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
|||
// On GFX908, in order to guarantee copying between AGPRs, we need a scratch
|
||||
// VGPR available at all times.
|
||||
if (ST.hasMAIInsts() && !ST.hasGFX90AInsts()) {
|
||||
reserveRegisterTuples(Reserved, AMDGPU::VGPR32);
|
||||
reserveRegisterTuples(Reserved, MFI->getVGPRForAGPRCopy());
|
||||
}
|
||||
|
||||
for (auto Reg : MFI->WWMReservedRegs) {
|
||||
|
@ -1553,8 +1553,8 @@ void SIRegisterInfo::buildSpillLoadStore(
|
|||
assert(EltSize == 4);
|
||||
|
||||
if (!TmpIntermediateVGPR) {
|
||||
assert(MF->getRegInfo().isReserved(AMDGPU::VGPR32));
|
||||
TmpIntermediateVGPR = AMDGPU::VGPR32;
|
||||
TmpIntermediateVGPR = FuncInfo->getVGPRForAGPRCopy();
|
||||
assert(MF->getRegInfo().isReserved(TmpIntermediateVGPR));
|
||||
}
|
||||
if (IsStore) {
|
||||
auto AccRead = BuildMI(MBB, MI, DL,
|
||||
|
|
Loading…
Reference in New Issue