diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp @@ -647,29 +647,6 @@ return CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, DL, VT, Ops); } -static unsigned selectSGPRVectorRegClassID(unsigned NumVectorElts) { - switch (NumVectorElts) { - case 1: - return AMDGPU::SReg_32RegClassID; - case 2: - return AMDGPU::SReg_64RegClassID; - case 3: - return AMDGPU::SGPR_96RegClassID; - case 4: - return AMDGPU::SGPR_128RegClassID; - case 5: - return AMDGPU::SGPR_160RegClassID; - case 8: - return AMDGPU::SReg_256RegClassID; - case 16: - return AMDGPU::SReg_512RegClassID; - case 32: - return AMDGPU::SReg_1024RegClassID; - } - - llvm_unreachable("invalid vector size"); -} - void AMDGPUDAGToDAGISel::SelectBuildVector(SDNode *N, unsigned RegClassID) { EVT VT = N->getValueType(0); unsigned NumVectorElts = VT.getVectorNumElements(); @@ -797,7 +774,8 @@ } assert(VT.getVectorElementType().bitsEq(MVT::i32)); - unsigned RegClassID = selectSGPRVectorRegClassID(NumVectorElts); + unsigned RegClassID = + SIRegisterInfo::getSGPRClassForBitWidth(NumVectorElts * 32)->getID(); SelectBuildVector(N, RegClassID); return; } diff --git a/llvm/lib/Target/AMDGPU/SIRegisterInfo.h b/llvm/lib/Target/AMDGPU/SIRegisterInfo.h --- a/llvm/lib/Target/AMDGPU/SIRegisterInfo.h +++ b/llvm/lib/Target/AMDGPU/SIRegisterInfo.h @@ -116,6 +116,10 @@ return getEncodingValue(Reg) & 0xff; } + static const TargetRegisterClass *getVGPRClassForBitWidth(unsigned BitWidth); + static const TargetRegisterClass *getAGPRClassForBitWidth(unsigned BitWidth); + static const TargetRegisterClass *getSGPRClassForBitWidth(unsigned BitWidth); + /// Return the 'base' register class for this register. /// e.g. SGPR0 => SReg_32, VGPR => VGPR_32 SGPR0_SGPR1 -> SReg_32, etc. const TargetRegisterClass *getPhysRegClass(MCRegister Reg) const; diff --git a/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp b/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp --- a/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp @@ -1274,7 +1274,8 @@ return AMDGPUInstPrinter::getRegisterName(Reg); } -static const TargetRegisterClass *getVGPRClassForBitWidth(unsigned BitWidth) { +const TargetRegisterClass * +SIRegisterInfo::getVGPRClassForBitWidth(unsigned BitWidth) { switch (BitWidth) { case 1: return &AMDGPU::VReg_1RegClass; @@ -1301,7 +1302,8 @@ } } -static const TargetRegisterClass *getAGPRClassForBitWidth(unsigned BitWidth) { +const TargetRegisterClass * +SIRegisterInfo::getAGPRClassForBitWidth(unsigned BitWidth) { switch (BitWidth) { case 32: return &AMDGPU::AGPR_32RegClass; @@ -1318,7 +1320,8 @@ } } -static const TargetRegisterClass *getSGPRClassForBitWidth(unsigned BitWidth) { +const TargetRegisterClass * +SIRegisterInfo::getSGPRClassForBitWidth(unsigned BitWidth) { switch (BitWidth) { case 16: return &AMDGPU::SGPR_LO16RegClass;