[llvm] 59e07f3 - [AMDGPU][GlobaISel] wrap the load-splitting code in RegBank selection with condition (#98966)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 24 12:04:28 PDT 2024
Author: Gang Chen
Date: 2024-07-24T12:04:25-07:00
New Revision: 59e07f34bdbd463254b0b2744bd0a587d2cd6438
URL: https://github.com/llvm/llvm-project/commit/59e07f34bdbd463254b0b2744bd0a587d2cd6438
DIFF: https://github.com/llvm/llvm-project/commit/59e07f34bdbd463254b0b2744bd0a587d2cd6438.diff
LOG: [AMDGPU][GlobaISel] wrap the load-splitting code in RegBank selection with condition (#98966)
The load-splitting code in RegBank selection is only relevant to those
listed address-spaces because there are cases in those address-spaces in
which we are not sure how far to split during legalization
---------
Signed-off-by: gangc <gangc at amd.com>
Added:
Modified:
llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp
index 4a3f327e4c591..8da8c94b4d665 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp
@@ -1059,6 +1059,7 @@ bool AMDGPURegisterBankInfo::applyMappingLoad(
Register DstReg = MI.getOperand(0).getReg();
const LLT LoadTy = MRI.getType(DstReg);
unsigned LoadSize = LoadTy.getSizeInBits();
+ MachineMemOperand *MMO = *MI.memoperands_begin();
const unsigned MaxNonSmrdLoadSize = 128;
const RegisterBank *DstBank =
@@ -1069,7 +1070,6 @@ bool AMDGPURegisterBankInfo::applyMappingLoad(
if (LoadSize != 32 && (LoadSize != 96 || Subtarget.hasScalarDwordx3Loads()))
return false;
- MachineMemOperand *MMO = *MI.memoperands_begin();
const unsigned MemSize = 8 * MMO->getSize().getValue();
// Scalar loads of size 8 or 16 bit with proper alignment may be widened to
// 32 bit. Check to see if we need to widen the memory access, 8 or 16 bit
@@ -1141,25 +1141,29 @@ bool AMDGPURegisterBankInfo::applyMappingLoad(
if (SrcRegs.empty())
SrcRegs.push_back(MI.getOperand(1).getReg());
- assert(LoadSize % MaxNonSmrdLoadSize == 0);
-
// RegBankSelect only emits scalar types, so we need to reset the pointer
// operand to a pointer type.
Register BasePtrReg = SrcRegs[0];
LLT PtrTy = MRI.getType(MI.getOperand(1).getReg());
MRI.setType(BasePtrReg, PtrTy);
- unsigned NumSplitParts = LoadTy.getSizeInBits() / MaxNonSmrdLoadSize;
- const LLT LoadSplitTy = LoadTy.divide(NumSplitParts);
- ApplyRegBankMapping O(B, *this, MRI, &AMDGPU::VGPRRegBank);
- LegalizerHelper Helper(B.getMF(), O, B);
-
- if (LoadTy.isVector()) {
- if (Helper.fewerElementsVector(MI, 0, LoadSplitTy) != LegalizerHelper::Legalized)
- return false;
- } else {
- if (Helper.narrowScalar(MI, 0, LoadSplitTy) != LegalizerHelper::Legalized)
- return false;
+ // The following are the loads not splitted enough during legalization
+ // because it was not clear they are smem-load or vmem-load
+ if (AMDGPU::isExtendedGlobalAddrSpace(MMO->getAddrSpace()) ||
+ MMO->getAddrSpace() == AMDGPUAS::BUFFER_RESOURCE) {
+ assert(LoadSize % MaxNonSmrdLoadSize == 0);
+ unsigned NumSplitParts = LoadTy.getSizeInBits() / MaxNonSmrdLoadSize;
+ const LLT LoadSplitTy = LoadTy.divide(NumSplitParts);
+ ApplyRegBankMapping O(B, *this, MRI, &AMDGPU::VGPRRegBank);
+ LegalizerHelper Helper(B.getMF(), O, B);
+ if (LoadTy.isVector()) {
+ if (Helper.fewerElementsVector(MI, 0, LoadSplitTy) !=
+ LegalizerHelper::Legalized)
+ return false;
+ } else {
+ if (Helper.narrowScalar(MI, 0, LoadSplitTy) != LegalizerHelper::Legalized)
+ return false;
+ }
}
MRI.setRegBank(DstReg, AMDGPU::VGPRRegBank);
More information about the llvm-commits
mailing list