================ @@ -20,107 +20,181 @@ using namespace llvm; -static cl::opt<RegAllocPriorityAdvisorAnalysis::AdvisorMode> Mode( +static cl::opt<RegAllocPriorityAdvisorProvider::AdvisorMode> Mode( "regalloc-enable-priority-advisor", cl::Hidden, - cl::init(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default), + cl::init(RegAllocPriorityAdvisorProvider::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values( - clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default, + clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Default, "default", "Default"), - clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Release, + clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Release, "release", "precompiled"), - clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Development, + clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Development, "development", "for training"), clEnumValN( - RegAllocPriorityAdvisorAnalysis::AdvisorMode::Dummy, "dummy", + RegAllocPriorityAdvisorProvider::AdvisorMode::Dummy, "dummy", "prioritize low virtual register numbers for test and debug"))); -char RegAllocPriorityAdvisorAnalysis::ID = 0; -INITIALIZE_PASS(RegAllocPriorityAdvisorAnalysis, "regalloc-priority", +char RegAllocPriorityAdvisorAnalysisLegacy::ID = 0; +INITIALIZE_PASS(RegAllocPriorityAdvisorAnalysisLegacy, "regalloc-priority", "Regalloc priority policy", false, true) namespace { -class DefaultPriorityAdvisorAnalysis final - : public RegAllocPriorityAdvisorAnalysis { + +class DefaultPriorityAdvisorProvider final + : public RegAllocPriorityAdvisorProvider { +public: + DefaultPriorityAdvisorProvider(bool NotAsRequested, LLVMContext &Ctx) + : RegAllocPriorityAdvisorProvider(AdvisorMode::Default) { + if (NotAsRequested) + Ctx.emitError("Requested regalloc priority advisor analysis " + "could be created. Using default"); + } + + // support for isa<> and dyn_cast. + static bool classof(const RegAllocPriorityAdvisorProvider *R) { + return R->getAdvisorMode() == AdvisorMode::Default; + } + + std::unique_ptr<RegAllocPriorityAdvisor> + getAdvisor(const MachineFunction &MF, const RAGreedy &RA, + SlotIndexes &SI) override { + return std::make_unique<DefaultPriorityAdvisor>(MF, RA, &SI); + } +}; + +class DummyPriorityAdvisorProvider final + : public RegAllocPriorityAdvisorProvider { +public: + DummyPriorityAdvisorProvider() + : RegAllocPriorityAdvisorProvider(AdvisorMode::Dummy) {} + + static bool classof(const RegAllocPriorityAdvisorProvider *R) { + return R->getAdvisorMode() == AdvisorMode::Dummy; + } + + std::unique_ptr<RegAllocPriorityAdvisor> + getAdvisor(const MachineFunction &MF, const RAGreedy &RA, + SlotIndexes &SI) override { + return std::make_unique<DummyPriorityAdvisor>(MF, RA, &SI); + } +}; + +class DefaultPriorityAdvisorAnalysisLegacy final + : public RegAllocPriorityAdvisorAnalysisLegacy { public: - DefaultPriorityAdvisorAnalysis(bool NotAsRequested) - : RegAllocPriorityAdvisorAnalysis(AdvisorMode::Default), + DefaultPriorityAdvisorAnalysisLegacy(bool NotAsRequested) + : RegAllocPriorityAdvisorAnalysisLegacy(AdvisorMode::Default), NotAsRequested(NotAsRequested) {} // support for isa<> and dyn_cast. - static bool classof(const RegAllocPriorityAdvisorAnalysis *R) { + static bool classof(const RegAllocPriorityAdvisorAnalysisLegacy *R) { return R->getAdvisorMode() == AdvisorMode::Default; } private: void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequired<SlotIndexesWrapperPass>(); - RegAllocPriorityAdvisorAnalysis::getAnalysisUsage(AU); - } - std::unique_ptr<RegAllocPriorityAdvisor> - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { - return std::make_unique<DefaultPriorityAdvisor>( - MF, RA, &getAnalysis<SlotIndexesWrapperPass>().getSI()); + RegAllocPriorityAdvisorAnalysisLegacy::getAnalysisUsage(AU); } + bool doInitialization(Module &M) override { - if (NotAsRequested) - M.getContext().emitError("Requested regalloc priority advisor analysis " - "could be created. Using default"); - return RegAllocPriorityAdvisorAnalysis::doInitialization(M); + Provider.reset( + new DefaultPriorityAdvisorProvider(NotAsRequested, M.getContext())); + return false; } + const bool NotAsRequested; }; class DummyPriorityAdvisorAnalysis final - : public RegAllocPriorityAdvisorAnalysis { + : public RegAllocPriorityAdvisorAnalysisLegacy { public: + using RegAllocPriorityAdvisorAnalysisLegacy::AdvisorMode; DummyPriorityAdvisorAnalysis() - : RegAllocPriorityAdvisorAnalysis(AdvisorMode::Dummy) {} + : RegAllocPriorityAdvisorAnalysisLegacy(AdvisorMode::Dummy) {} // support for isa<> and dyn_cast. - static bool classof(const RegAllocPriorityAdvisorAnalysis *R) { + static bool classof(const RegAllocPriorityAdvisorAnalysisLegacy *R) { return R->getAdvisorMode() == AdvisorMode::Dummy; } private: void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequired<SlotIndexesWrapperPass>(); - RegAllocPriorityAdvisorAnalysis::getAnalysisUsage(AU); + RegAllocPriorityAdvisorAnalysisLegacy::getAnalysisUsage(AU); } - std::unique_ptr<RegAllocPriorityAdvisor> - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { - return std::make_unique<DummyPriorityAdvisor>( - MF, RA, &getAnalysis<SlotIndexesWrapperPass>().getSI()); + bool doInitialization(Module &M) override { + Provider.reset(new DummyPriorityAdvisorProvider()); + return false; } }; } // namespace -template <> Pass *llvm::callDefaultCtor<RegAllocPriorityAdvisorAnalysis>() { +void RegAllocPriorityAdvisorAnalysis::initializeProvider(LLVMContext &Ctx) { + if (Provider) + return; + switch (Mode) { + case RegAllocPriorityAdvisorProvider::AdvisorMode::Dummy: + Provider.reset(new DummyPriorityAdvisorProvider()); + return; + case RegAllocPriorityAdvisorProvider::AdvisorMode::Default: + Provider.reset( + new DefaultPriorityAdvisorProvider(/*NotAsRequested=*/false, Ctx)); + return; + case RegAllocPriorityAdvisorProvider::AdvisorMode::Development: +#if defined(LLVM_HAVE_TFLITE) + Provider.reset(createDevelopmentModePriorityAdvisorProvider(Ctx)); +#else + Provider.reset( + new DefaultPriorityAdvisorProvider(/*NotAsRequested=*/true, Ctx)); +#endif + assert(Provider && "PriorityAdvisorProvider cannot be null"); ---------------- optimisan wrote:
Right https://github.com/llvm/llvm-project/pull/118462 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits