================ @@ -69,6 +81,241 @@ FunctionPass *llvm::createAMDGPURBLegalizePass() { using namespace AMDGPU; +const RegBankLegalizeRules &getRules(const GCNSubtarget &ST, + MachineRegisterInfo &MRI) { + static std::mutex GlobalMutex; + static SmallDenseMap<unsigned, std::unique_ptr<RegBankLegalizeRules>> + CacheForRuleSet; + std::lock_guard<std::mutex> Lock(GlobalMutex); + if (!CacheForRuleSet.contains(ST.getGeneration())) { + auto Rules = std::make_unique<RegBankLegalizeRules>(ST, MRI); + CacheForRuleSet[ST.getGeneration()] = std::move(Rules); + } else { + CacheForRuleSet[ST.getGeneration()]->refreshRefs(ST, MRI); + } + return *CacheForRuleSet[ST.getGeneration()]; +} + bool AMDGPURBLegalize::runOnMachineFunction(MachineFunction &MF) { + + const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); + MachineRegisterInfo &MRI = MF.getRegInfo(); + + // Setup the instruction builder with CSE. + std::unique_ptr<MachineIRBuilder> MIRBuilder; + const TargetPassConfig &TPC = getAnalysis<TargetPassConfig>(); + GISelCSEAnalysisWrapper &Wrapper = + getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper(); + GISelCSEInfo *CSEInfo = nullptr; + GISelObserverWrapper Observer; + + if (TPC.isGISelCSEEnabled()) { + MIRBuilder = std::make_unique<CSEMIRBuilder>(); + CSEInfo = &Wrapper.get(TPC.getCSEConfig()); + MIRBuilder->setCSEInfo(CSEInfo); + Observer.addObserver(CSEInfo); + MIRBuilder->setChangeObserver(Observer); + } else { + MIRBuilder = std::make_unique<MachineIRBuilder>(); + } + MIRBuilder->setMF(MF); + + RAIIDelegateInstaller DelegateInstaller(MF, &Observer); + RAIIMFObserverInstaller MFObserverInstaller(MF, Observer); + + const MachineUniformityInfo &MUI = + getAnalysis<MachineUniformityAnalysisPass>().getUniformityInfo(); + const RegisterBankInfo &RBI = *MF.getSubtarget().getRegBankInfo(); + + // RegBankLegalizeRules is initialized with assigning sets of IDs to opcodes. + const RegBankLegalizeRules &RBLRules = getRules(ST, MRI); + + // Logic that does legalization based on IDs assigned to Opcode. + RegBankLegalizeHelper RBLegalizeHelper(*MIRBuilder, MRI, MUI, RBI, RBLRules); + + SmallVector<MachineInstr *> AllInst; + + for (auto &MBB : MF) { + for (MachineInstr &MI : MBB) { + AllInst.push_back(&MI); + } + } + + for (auto &MI : AllInst) { ---------------- arsenm wrote:
no auto https://github.com/llvm/llvm-project/pull/112864 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits