summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/AMDGPU/SIFormMemoryClauses.cpp
diff options
context:
space:
mode:
authorStanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com>2021-02-17 13:37:46 -0800
committerStanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com>2021-02-17 16:01:32 -0800
commita8d9d50762c42d726274d3f1126ec97ff96e2a22 (patch)
tree3ba3e3cfde488e025fa7acfde11ca08b69cc1572 /llvm/lib/Target/AMDGPU/SIFormMemoryClauses.cpp
parent0252e6ead192f7c61e5a02ceea420bee28a2f251 (diff)
[AMDGPU] gfx90a support
Differential Revision: https://reviews.llvm.org/D96906
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIFormMemoryClauses.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/SIFormMemoryClauses.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIFormMemoryClauses.cpp b/llvm/lib/Target/AMDGPU/SIFormMemoryClauses.cpp
index b0ec5ac4a5b9..d874aa143f27 100644
--- a/llvm/lib/Target/AMDGPU/SIFormMemoryClauses.cpp
+++ b/llvm/lib/Target/AMDGPU/SIFormMemoryClauses.cpp
@@ -188,11 +188,24 @@ void SIFormMemoryClauses::forAllLanes(Register Reg, LaneBitmask LaneMask,
return MaskA.getHighestLane() > MaskB.getHighestLane();
});
+ MCRegister RepReg;
+ for (MCRegister R : *MRI->getRegClass(Reg)) {
+ if (!MRI->isReserved(R)) {
+ RepReg = R;
+ break;
+ }
+ }
+ if (!RepReg)
+ llvm_unreachable("Failed to find required allocatable register");
+
for (unsigned Idx : CoveringSubregs) {
LaneBitmask SubRegMask = TRI->getSubRegIndexLaneMask(Idx);
if ((SubRegMask & ~LaneMask).any() || (SubRegMask & LaneMask).none())
continue;
+ if (MRI->isReserved(TRI->getSubReg(RepReg, Idx)))
+ continue;
+
Func(Idx);
LaneMask &= ~SubRegMask;
if (LaneMask.none())
@@ -261,7 +274,7 @@ bool SIFormMemoryClauses::checkPressure(const MachineInstr &MI,
// tracking does not account for the alignment requirements for SGPRs, or the
// fragmentation of registers the allocator will need to satisfy.
if (Occupancy >= MFI->getMinAllowedOccupancy() &&
- MaxPressure.getVGPRNum() <= MaxVGPRs / 2 &&
+ MaxPressure.getVGPRNum(ST->hasGFX90AInsts()) <= MaxVGPRs / 2 &&
MaxPressure.getSGPRNum() <= MaxSGPRs / 2) {
LastRecordedOccupancy = Occupancy;
return true;