diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h --- a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h +++ b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h @@ -560,8 +560,9 @@ MAX_OPR_NUM = DST_NUM + MAX_SRC_NUM }; -// Number of VGPR banks per VOPD component operand. -constexpr unsigned BANKS_NUM[] = {2, 4, 4, 2}; +// LSB mask for VGPR banks per VOPD component operand. +// 4 banks result in a mask 3, setting 2 lower bits. +constexpr unsigned VOPD_VGPR_BANK_MASKS[] = {1, 3, 3, 1}; enum ComponentIndex : unsigned { X = 0, Y = 1 }; constexpr unsigned COMPONENTS[] = {ComponentIndex::X, ComponentIndex::Y}; diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp --- a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp +++ b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp @@ -577,9 +577,10 @@ unsigned CompOprIdx; for (CompOprIdx = 0; CompOprIdx < Component::MAX_OPR_NUM; ++CompOprIdx) { - unsigned BanksNum = BANKS_NUM[CompOprIdx]; + unsigned BanksMasks = VOPD_VGPR_BANK_MASKS[CompOprIdx]; if (OpXRegs[CompOprIdx] && OpYRegs[CompOprIdx] && - (OpXRegs[CompOprIdx] % BanksNum == OpYRegs[CompOprIdx] % BanksNum)) + ((OpXRegs[CompOprIdx] & BanksMasks) == + (OpYRegs[CompOprIdx] & BanksMasks))) return CompOprIdx; }