diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2021-02-19 08:57:14 -0500 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2021-02-24 14:49:37 -0500 |
commit | 78b6d73a93fc6085d2a2fc84bdce1bbde740cf16 (patch) | |
tree | 8a29dfc5a447685c330c9709481deb0f08a82a6a /llvm/lib/Target/AMDGPU/SILoadStoreOptimizer.cpp | |
parent | e79cd47e1620045562960ddfe17ab0c4f6e6628f (diff) | |
download | llvm-78b6d73a93fc6085d2a2fc84bdce1bbde740cf16.zip llvm-78b6d73a93fc6085d2a2fc84bdce1bbde740cf16.tar.gz llvm-78b6d73a93fc6085d2a2fc84bdce1bbde740cf16.tar.bz2 |
AMDGPU: Add even aligned VGPR/AGPR register classes
gfx90a operations require even aligned registers, but this was
previously achieved by reserving registers inside the full class.
Ideally this would be captured in the static instruction definitions
for the operands, and we would have different instructions per
subtarget. The hackiest part of this is we need to manually reassign
AGPR register classes after instruction selection (we get away without
this for VGPRs since those types are actually registered for legal
types).
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SILoadStoreOptimizer.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SILoadStoreOptimizer.cpp | 23 |
1 files changed, 4 insertions, 19 deletions
diff --git a/llvm/lib/Target/AMDGPU/SILoadStoreOptimizer.cpp b/llvm/lib/Target/AMDGPU/SILoadStoreOptimizer.cpp index 2bdf622..8f970a9 100644 --- a/llvm/lib/Target/AMDGPU/SILoadStoreOptimizer.cpp +++ b/llvm/lib/Target/AMDGPU/SILoadStoreOptimizer.cpp @@ -1612,26 +1612,11 @@ SILoadStoreOptimizer::getTargetRegisterClass(const CombineInfo &CI, return &AMDGPU::SGPR_512RegClass; } } - const TargetRegisterClass *RC = nullptr; - switch (CI.Width + Paired.Width) { - default: - return nullptr; - case 2: - RC = &AMDGPU::VReg_64RegClass; - break; - case 3: - RC = &AMDGPU::VReg_96RegClass; - break; - case 4: - RC = &AMDGPU::VReg_128RegClass; - break; - } - - if (TRI->hasAGPRs(getDataRegClass(*CI.I))) - return TRI->getEquivalentAGPRClass(RC); - - return RC; + unsigned BitWidth = 32 * (CI.Width + Paired.Width); + return TRI->hasAGPRs(getDataRegClass(*CI.I)) + ? TRI->getAGPRClassForBitWidth(BitWidth) + : TRI->getVGPRClassForBitWidth(BitWidth); } MachineBasicBlock::iterator SILoadStoreOptimizer::mergeBufferStorePair( |