Index: include/llvm/CodeGen/GlobalISel/RegisterBank.h =================================================================== --- include/llvm/CodeGen/GlobalISel/RegisterBank.h +++ include/llvm/CodeGen/GlobalISel/RegisterBank.h @@ -47,11 +47,9 @@ friend RegisterBankInfo; public: - /// The default constructor will leave the object in - /// an invalid state. I.e. isValid() == false. - /// The fields must be updated to fix that and only - /// RegisterBankInfo instances are allowed to do that - RegisterBank(); + RegisterBank(const DataTy &Data); + + void finishInit(const TargetRegisterInfo &TRI); /// Get the identifier of this register bank. unsigned getID() const { return Data.ID; } Index: include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h =================================================================== --- include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h +++ include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h @@ -396,9 +396,6 @@ llvm_unreachable("This constructor should not be executed"); } - void setRegBankData(unsigned ID, const RegisterBank::DataTy &Data, - const TargetRegisterInfo &TRI); - /// Get the register bank identified by \p ID. RegisterBank &getRegBank(unsigned ID) { assert(ID < getNumRegBanks() && "Accessing an unknown register bank"); Index: lib/CodeGen/GlobalISel/RegisterBank.cpp =================================================================== --- lib/CodeGen/GlobalISel/RegisterBank.cpp +++ lib/CodeGen/GlobalISel/RegisterBank.cpp @@ -19,7 +19,15 @@ const RegisterBank::DataTy InvalidData = {UINT_MAX, nullptr, 0, 0}; -RegisterBank::RegisterBank() : Data(InvalidData) {} +RegisterBank::RegisterBank(const RegisterBank::DataTy &Data) : Data(Data) {} + +void RegisterBank::finishInit(const TargetRegisterInfo &TRI) { + // Populate ContainedRegClasses from the + uint32_t Mask[] = {(uint32_t)Data.CoveredClasses, + (uint32_t)(Data.CoveredClasses >> 32)}; + ContainedRegClasses.resize(TRI.getNumRegClasses()); + ContainedRegClasses.setBitsInMask(Mask); +} bool RegisterBank::verify(const TargetRegisterInfo &TRI) const { assert(isValid() && "Invalid register bank"); Index: lib/CodeGen/GlobalISel/RegisterBankInfo.cpp =================================================================== --- lib/CodeGen/GlobalISel/RegisterBankInfo.cpp +++ lib/CodeGen/GlobalISel/RegisterBankInfo.cpp @@ -80,18 +80,6 @@ return true; } -void RegisterBankInfo::setRegBankData(unsigned ID, - const RegisterBank::DataTy &Data, - const TargetRegisterInfo &TRI) { - RegisterBank &RB = getRegBank(ID); - RB.Data = Data; - - uint32_t Mask[] = {(uint32_t)Data.CoveredClasses, - (uint32_t)(Data.CoveredClasses >> 32)}; - RB.ContainedRegClasses.resize(TRI.getNumRegClasses()); - RB.ContainedRegClasses.setBitsInMask(Mask); -} - const RegisterBank * RegisterBankInfo::getRegBank(unsigned Reg, const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI) const { Index: lib/Target/AArch64/AArch64GenRegisterBankInfo.def =================================================================== --- lib/Target/AArch64/AArch64GenRegisterBankInfo.def +++ lib/Target/AArch64/AArch64GenRegisterBankInfo.def @@ -73,9 +73,9 @@ {AArch64::CCRRegBankID, "CCR", 32, 1ull << AArch64::CCRRegClassID}, }; -RegisterBank GPRRegBank; -RegisterBank FPRRegBank; -RegisterBank CCRRegBank; +RegisterBank GPRRegBank(RegisterBankData[GPRRegBankID]); +RegisterBank FPRRegBank(RegisterBankData[FPRRegBankID]); +RegisterBank CCRRegBank(RegisterBankData[CCRRegBankID]); RegisterBank *RegBanks[] = {&GPRRegBank, &FPRRegBank, &CCRRegBank}; Index: lib/Target/AArch64/AArch64RegisterBankInfo.cpp =================================================================== --- lib/Target/AArch64/AArch64RegisterBankInfo.cpp +++ lib/Target/AArch64/AArch64RegisterBankInfo.cpp @@ -41,10 +41,12 @@ if (AlreadyInit) return; AlreadyInit = true; + + for (auto &ID : {AArch64::GPRRegBankID, AArch64::FPRRegBankID, AArch64::CCRRegBankID}) + getRegBank(ID).finishInit(TRI); + // The GPR register bank is fully defined by all the registers in // GR64all + its subclasses. - setRegBankData(AArch64::GPRRegBankID, - AArch64::RegisterBankData[AArch64::GPRRegBankID], TRI); const RegisterBank &RBGPR = getRegBank(AArch64::GPRRegBankID); (void)RBGPR; assert(&AArch64::GPRRegBank == &RBGPR && @@ -55,8 +57,6 @@ // The FPR register bank is fully defined by all the registers in // GR64all + its subclasses. - setRegBankData(AArch64::FPRRegBankID, - AArch64::RegisterBankData[AArch64::FPRRegBankID], TRI); const RegisterBank &RBFPR = getRegBank(AArch64::FPRRegBankID); (void)RBFPR; assert(&AArch64::FPRRegBank == &RBFPR && @@ -68,8 +68,6 @@ assert(RBFPR.getSize() == 512 && "FPRs should hold up to 512-bit via QQQQ sequence"); - setRegBankData(AArch64::CCRRegBankID, - AArch64::RegisterBankData[AArch64::CCRRegBankID], TRI); const RegisterBank &RBCCR = getRegBank(AArch64::CCRRegBankID); (void)RBCCR; assert(&AArch64::CCRRegBank == &RBCCR &&