From c8870815d7fed09f87b45a548996a85f946ae931 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Fri, 22 Nov 2024 09:31:50 +0000 Subject: [PATCH 01/14] [CodeGen][NewPM] Port RegAllocEvictionAdvisor analysis to NPM --- .../llvm}/CodeGen/RegAllocEvictionAdvisor.h | 69 +++++++- llvm/include/llvm/InitializePasses.h | 2 +- llvm/include/llvm/Passes/CodeGenPassBuilder.h | 6 +- llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp | 167 +++++++++++++----- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 107 ++++++++--- llvm/lib/CodeGen/RegAllocGreedy.cpp | 9 +- llvm/lib/CodeGen/RegAllocGreedy.h | 1 - llvm/lib/CodeGen/RegAllocPriorityAdvisor.h | 2 +- llvm/lib/Passes/PassBuilder.cpp | 1 + llvm/lib/Passes/PassRegistry.def | 1 + 10 files changed, 284 insertions(+), 81 deletions(-) rename llvm/{lib => include/llvm}/CodeGen/RegAllocEvictionAdvisor.h (75%) diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h similarity index 75% rename from llvm/lib/CodeGen/RegAllocEvictionAdvisor.h rename to llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index 52dd946a68540..847bf032235c1 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -9,11 +9,13 @@ #ifndef LLVM_CODEGEN_REGALLOCEVICTIONADVISOR_H #define LLVM_CODEGEN_REGALLOCEVICTIONADVISOR_H +#include "llvm/ADT/Any.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/StringRef.h" #include "llvm/CodeGen/Register.h" #include "llvm/Config/llvm-config.h" +#include "llvm/IR/PassManager.h" #include "llvm/MC/MCRegister.h" #include "llvm/Pass.h" @@ -164,12 +166,12 @@ class RegAllocEvictionAdvisor { /// /// Because we need to offer additional services in 'development' mode, the /// implementations of this analysis need to implement RTTI support. -class RegAllocEvictionAdvisorAnalysis : public ImmutablePass { +class RegAllocEvictionAdvisorAnalysisLegacy : public ImmutablePass { public: enum class AdvisorMode : int { Default, Release, Development }; - RegAllocEvictionAdvisorAnalysis(AdvisorMode Mode) - : ImmutablePass(ID), Mode(Mode){}; + RegAllocEvictionAdvisorAnalysisLegacy(AdvisorMode Mode) + : ImmutablePass(ID), Mode(Mode) {}; static char ID; /// Get an advisor for the given context (i.e. machine function, etc) @@ -177,7 +179,7 @@ class RegAllocEvictionAdvisorAnalysis : public ImmutablePass { getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; AdvisorMode getAdvisorMode() const { return Mode; } virtual void logRewardIfNeeded(const MachineFunction &MF, - llvm::function_ref GetReward){}; + llvm::function_ref GetReward) {}; protected: // This analysis preserves everything, and subclasses may have additional @@ -191,13 +193,66 @@ class RegAllocEvictionAdvisorAnalysis : public ImmutablePass { const AdvisorMode Mode; }; +/// Common provider for legacy and new pass managers. +/// This keeps the state for logging, and sets up and holds the provider. +/// The legacy pass itself used to keep the logging state and provider, +/// so this extraction helps the NPM analysis to reuse the logic. +class RegAllocEvictionAdvisorProvider { +public: + enum class AdvisorMode : int { Default, Release, Development }; + RegAllocEvictionAdvisorProvider(AdvisorMode Mode) : Mode(Mode) {} + + virtual ~RegAllocEvictionAdvisorProvider() = default; + + virtual bool doInitialization(Module &M) { return false; } + + virtual void logRewardIfNeeded(const MachineFunction &MF, + llvm::function_ref GetReward) {} + + virtual std::unique_ptr + getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; + + /// Set the analyses that the advisor needs to use as they might not be + /// available before the advisor is created. + virtual void setAnalyses(std::initializer_list AnalysisP) {} + + AdvisorMode getAdvisorMode() const { return Mode; } + +private: + const AdvisorMode Mode; +}; + +RegAllocEvictionAdvisorProvider *createReleaseModeAdvisorProvider(); +RegAllocEvictionAdvisorProvider *createDevelopmentModeAdvisorProvider(); + +/// A Module analysis for fetching the Eviction Advisor. This is not a +/// MachineFunction analysis for two reasons: +/// - in the ML implementation case, the evaluator is stateless but (especially +/// in the development mode) expensive to set up. With a Module Analysis, we +/// `require` it and set it up once. +/// - in the 'development' mode ML case, we want to capture the training log +/// during allocation (this is a log of features encountered and decisions +/// made), and then measure a score, potentially a few steps after allocation +/// completes. So we need a Module analysis to keep the logger state around +/// until we can make that measurement. +class RegAllocEvictionAdvisorAnalysis + : public AnalysisInfoMixin { + static AnalysisKey Key; + friend AnalysisInfoMixin; + +public: + using Result = std::unique_ptr; + Result run(Module &MF, ModuleAnalysisManager &MAM); +}; + /// Specialization for the API used by the analysis infrastructure to create /// an instance of the eviction advisor. -template <> Pass *callDefaultCtor(); +template <> Pass *callDefaultCtor(); -RegAllocEvictionAdvisorAnalysis *createReleaseModeAdvisor(); +RegAllocEvictionAdvisorAnalysisLegacy *createReleaseModeAdvisorAnalysisLegacy(); -RegAllocEvictionAdvisorAnalysis *createDevelopmentModeAdvisor(); +RegAllocEvictionAdvisorAnalysisLegacy * +createDevelopmentModeAdvisorAnalysisLegacy(); // TODO: move to RegAllocEvictionAdvisor.cpp when we move implementation // out of RegAllocGreedy.cpp diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index da4ffcd83213a..81a602c8889d8 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -251,7 +251,7 @@ void initializePseudoProbeInserterPass(PassRegistry &); void initializeRAGreedyPass(PassRegistry &); void initializeReachingDefAnalysisPass(PassRegistry &); void initializeReassociateLegacyPassPass(PassRegistry &); -void initializeRegAllocEvictionAdvisorAnalysisPass(PassRegistry &); +void initializeRegAllocEvictionAdvisorAnalysisLegacyPass(PassRegistry &); void initializeRegAllocFastPass(PassRegistry &); void initializeRegAllocPriorityAdvisorAnalysisPass(PassRegistry &); void initializeRegAllocScoringPass(PassRegistry &); diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index 1458318ff021a..0e0644fc5e742 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -57,6 +57,7 @@ #include "llvm/CodeGen/PeepholeOptimizer.h" #include "llvm/CodeGen/PostRASchedulerList.h" #include "llvm/CodeGen/PreISelIntrinsicLowering.h" +#include "llvm/CodeGen/RegAllocEvictionAdvisor.h" #include "llvm/CodeGen/RegAllocFast.h" #include "llvm/CodeGen/RegUsageInfoCollector.h" #include "llvm/CodeGen/RegUsageInfoPropagate.h" @@ -1064,9 +1065,10 @@ void CodeGenPassBuilder::addMachineSSAOptimization( template void CodeGenPassBuilder::addTargetRegisterAllocator( AddMachinePass &addPass, bool Optimized) const { - if (Optimized) + if (Optimized) { + addPass(RequireAnalysis()); addPass(RAGreedyPass()); - else + } else addPass(RegAllocFastPass()); } diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp index 9656774c6eaae..ceef35dbebeae 100644 --- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp +++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp @@ -11,11 +11,11 @@ //===----------------------------------------------------------------------===// #include "AllocationOrder.h" -#include "RegAllocEvictionAdvisor.h" #include "RegAllocGreedy.h" #include "llvm/Analysis/InteractiveModelRunner.h" #include "llvm/Analysis/MLModelRunner.h" #include "llvm/Analysis/TensorSpec.h" +#include "llvm/CodeGen/RegAllocEvictionAdvisor.h" #if defined(LLVM_HAVE_TF_AOT_REGALLOCEVICTMODEL) || defined(LLVM_HAVE_TFLITE) #include "llvm/Analysis/ModelUnderTrainingRunner.h" #include "llvm/Analysis/NoInferenceModelRunner.h" @@ -115,7 +115,7 @@ class RegAllocScoring : public MachineFunctionPass { /// RegAllocReward analysis usage. void getAnalysisUsage(AnalysisUsage &AU) const override { AU.setPreservesAll(); - AU.addRequired(); + AU.addRequired(); AU.addRequired(); AU.addRequired(); MachineFunctionPass::getAnalysisUsage(AU); @@ -389,11 +389,12 @@ class MLEvictAdvisor : public RegAllocEvictionAdvisor { // =================================== // Release (AOT) - specifics // =================================== -class ReleaseModeEvictionAdvisorAnalysis final - : public RegAllocEvictionAdvisorAnalysis { +/// Common provider for legacy and new pass managers. +class ReleaseModeEvictionAdvisorProvider final + : public RegAllocEvictionAdvisorProvider { public: - ReleaseModeEvictionAdvisorAnalysis() - : RegAllocEvictionAdvisorAnalysis(AdvisorMode::Release) { + ReleaseModeEvictionAdvisorProvider() + : RegAllocEvictionAdvisorProvider(AdvisorMode::Release) { if (EnableDevelopmentFeatures) { InputFeatures = {RA_EVICT_FEATURES_LIST( _DECL_FEATURES) RA_EVICT_FIRST_DEVELOPMENT_FEATURE(_DECL_FEATURES) @@ -403,17 +404,17 @@ class ReleaseModeEvictionAdvisorAnalysis final } } // support for isa<> and dyn_cast. - static bool classof(const RegAllocEvictionAdvisorAnalysis *R) { + static bool classof(const RegAllocEvictionAdvisorProvider *R) { return R->getAdvisorMode() == AdvisorMode::Release; } -private: - std::vector InputFeatures; - - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.addRequired(); - AU.addRequired(); - RegAllocEvictionAdvisorAnalysis::getAnalysisUsage(AU); + void setAnalyses(std::initializer_list AnalysisList) override { + for (auto Analysis : AnalysisList) { + if (auto **MBFI = llvm::any_cast(&Analysis)) + this->MBFI = *MBFI; + if (auto **Loops = llvm::any_cast(&Analysis)) + this->Loops = *Loops; + } } std::unique_ptr @@ -428,12 +429,47 @@ class ReleaseModeEvictionAdvisorAnalysis final InteractiveChannelBaseName + ".out", InteractiveChannelBaseName + ".in"); } - return std::make_unique( - MF, RA, Runner.get(), - getAnalysis().getMBFI(), - getAnalysis().getLI()); + return std::make_unique(MF, RA, Runner.get(), *MBFI, + *Loops); } + +private: + std::vector InputFeatures; std::unique_ptr Runner; + MachineBlockFrequencyInfo *MBFI; + MachineLoopInfo *Loops; +}; + +class ReleaseModeEvictionAdvisorAnalysisLegacy final + : public RegAllocEvictionAdvisorAnalysisLegacy { +public: + ReleaseModeEvictionAdvisorAnalysisLegacy() + : RegAllocEvictionAdvisorAnalysisLegacy(AdvisorMode::Release) {} + + std::unique_ptr + getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + auto *MBFI = &getAnalysis().getMBFI(); + auto *Loops = &getAnalysis().getLI(); + Provider.setAnalyses({MBFI, Loops}); + return Provider.getAdvisor(MF, RA); + } + + bool doInitialization(Module &M) override { + return Provider.doInitialization(M); + } + + static bool classof(const RegAllocEvictionAdvisorAnalysisLegacy *R) { + return R->getAdvisorMode() == AdvisorMode::Release; + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.addRequired(); + AU.addRequired(); + RegAllocEvictionAdvisorAnalysisLegacy::getAnalysisUsage(AU); + } + +private: + ReleaseModeEvictionAdvisorProvider Provider; }; // =================================== @@ -468,11 +504,14 @@ class DevelopmentModeEvictAdvisor : public MLEvictAdvisor { Logger *const Log; }; -class DevelopmentModeEvictionAdvisorAnalysis final - : public RegAllocEvictionAdvisorAnalysis { +class DevelopmentModeEvictionAdvisorProvider final + : public RegAllocEvictionAdvisorProvider { public: - DevelopmentModeEvictionAdvisorAnalysis() - : RegAllocEvictionAdvisorAnalysis(AdvisorMode::Development) { + DevelopmentModeEvictionAdvisorProvider( + MachineBlockFrequencyInfo *MBFI = nullptr, + MachineLoopInfo *Loops = nullptr) + : RegAllocEvictionAdvisorProvider(AdvisorMode::Development), MBFI(MBFI), + Loops(Loops) { if (EnableDevelopmentFeatures) { InputFeatures = {RA_EVICT_FEATURES_LIST( _DECL_FEATURES) RA_EVICT_FIRST_DEVELOPMENT_FEATURE(_DECL_FEATURES) @@ -494,7 +533,7 @@ class DevelopmentModeEvictionAdvisorAnalysis final } } // support for isa<> and dyn_cast. - static bool classof(const RegAllocEvictionAdvisorAnalysis *R) { + static bool classof(const RegAllocEvictionAdvisorProvider *R) { return R->getAdvisorMode() == AdvisorMode::Development; } @@ -514,14 +553,13 @@ class DevelopmentModeEvictionAdvisorAnalysis final Log->logReward(GetReward()); } -private: - std::vector InputFeatures; - std::vector TrainingInputFeatures; - - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.addRequired(); - AU.addRequired(); - RegAllocEvictionAdvisorAnalysis::getAnalysisUsage(AU); + void setAnalyses(std::initializer_list AnalysisList) override { + for (auto Analysis : AnalysisList) { + if (auto **MBFI = llvm::any_cast(&Analysis)) + this->MBFI = *MBFI; + if (auto **Loops = llvm::any_cast(&Analysis)) + this->Loops = *Loops; + } } bool doInitialization(Module &M) override { @@ -567,14 +605,53 @@ class DevelopmentModeEvictionAdvisorAnalysis final return nullptr; if (Log) Log->switchContext(MF.getName()); + assert((MBFI && Loops) && + "Invalid provider state: must have analysis available"); return std::make_unique( - MF, RA, Runner.get(), - getAnalysis().getMBFI(), - getAnalysis().getLI(), Log.get()); + MF, RA, Runner.get(), *MBFI, *Loops, Log.get()); } +private: + std::vector InputFeatures; + std::vector TrainingInputFeatures; + std::unique_ptr Runner; std::unique_ptr Log; + const MachineBlockFrequencyInfo *MBFI; + const MachineLoopInfo *Loops; +}; + +class DevelopmentModeEvictionAdvisorAnalysisLegacy final + : public RegAllocEvictionAdvisorAnalysisLegacy { +public: + DevelopmentModeEvictionAdvisorAnalysisLegacy() + : RegAllocEvictionAdvisorAnalysisLegacy(AdvisorMode::Development) {} + + bool doInitialization(Module &M) override { + auto *MBFI = &getAnalysis().getMBFI(); + auto *Loops = &getAnalysis().getLI(); + Provider.setAnalyses({MBFI, Loops}); + return Provider.doInitialization(M); + } + + std::unique_ptr + getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + return Provider.getAdvisor(MF, RA); + } + + // support for isa<> and dyn_cast. + static bool classof(const RegAllocEvictionAdvisorAnalysisLegacy *R) { + return R->getAdvisorMode() == AdvisorMode::Development; + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.addRequired(); + AU.addRequired(); + RegAllocEvictionAdvisorAnalysisLegacy::getAnalysisUsage(AU); + } + +private: + DevelopmentModeEvictionAdvisorProvider Provider; }; #endif // #ifdef LLVM_HAVE_TFLITE @@ -1127,8 +1204,13 @@ void llvm::extractMBBFrequency( // Development mode-specific implementations #ifdef LLVM_HAVE_TFLITE -RegAllocEvictionAdvisorAnalysis *llvm::createDevelopmentModeAdvisor() { - return new DevelopmentModeEvictionAdvisorAnalysis(); +RegAllocEvictionAdvisorProvider *llvm::createDevelopmentModeAdvisorProvider() { + return new DevelopmentModeEvictionAdvisorProvider(); +} + +RegAllocEvictionAdvisorAnalysisLegacy * +llvm::createDevelopmentModeAdvisorAnalysisLegacy() { + return new DevelopmentModeEvictionAdvisorAnalysisLegacy(); } int64_t DevelopmentModeEvictAdvisor::tryFindEvictionCandidatePosition( @@ -1194,18 +1276,23 @@ bool RegAllocScoring::runOnMachineFunction(MachineFunction &MF) { return *CachedReward; }; - getAnalysis().logRewardIfNeeded(MF, - GetReward); + getAnalysis().logRewardIfNeeded( + MF, GetReward); getAnalysis().logRewardIfNeeded(MF, GetReward); return false; } #endif // #ifdef LLVM_HAVE_TFLITE -RegAllocEvictionAdvisorAnalysis *llvm::createReleaseModeAdvisor() { +RegAllocEvictionAdvisorProvider *llvm::createReleaseModeAdvisorProvider() { + return new ReleaseModeEvictionAdvisorProvider(); +} + +RegAllocEvictionAdvisorAnalysisLegacy * +llvm::createReleaseModeAdvisorAnalysisLegacy() { return llvm::isEmbeddedModelEvaluatorValid() || !InteractiveChannelBaseName.empty() - ? new ReleaseModeEvictionAdvisorAnalysis() + ? new ReleaseModeEvictionAdvisorAnalysisLegacy() : nullptr; } diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index a1f441ebd0d5e..09fb5df259a97 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -10,9 +10,10 @@ // //===----------------------------------------------------------------------===// -#include "RegAllocEvictionAdvisor.h" +#include "llvm/CodeGen/RegAllocEvictionAdvisor.h" #include "AllocationOrder.h" #include "RegAllocGreedy.h" +#include "RegAllocPriorityAdvisor.h" #include "llvm/CodeGen/LiveRegMatrix.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/RegisterClassInfo.h" @@ -26,17 +27,18 @@ using namespace llvm; -static cl::opt Mode( +static cl::opt Mode( "regalloc-enable-advisor", cl::Hidden, - cl::init(RegAllocEvictionAdvisorAnalysis::AdvisorMode::Default), + cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values( - clEnumValN(RegAllocEvictionAdvisorAnalysis::AdvisorMode::Default, + clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), - clEnumValN(RegAllocEvictionAdvisorAnalysis::AdvisorMode::Release, + clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), - clEnumValN(RegAllocEvictionAdvisorAnalysis::AdvisorMode::Development, - "development", "for training"))); + clEnumValN( + RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, + "development", "for training"))); static cl::opt EnableLocalReassignment( "enable-local-reassign", cl::Hidden, @@ -59,59 +61,114 @@ cl::opt EvictInterferenceCutoff( #define LLVM_HAVE_TF_AOT #endif -char RegAllocEvictionAdvisorAnalysis::ID = 0; -INITIALIZE_PASS(RegAllocEvictionAdvisorAnalysis, "regalloc-evict", +char RegAllocEvictionAdvisorAnalysisLegacy::ID = 0; +INITIALIZE_PASS(RegAllocEvictionAdvisorAnalysisLegacy, "regalloc-evict", "Regalloc eviction policy", false, true) namespace { -class DefaultEvictionAdvisorAnalysis final - : public RegAllocEvictionAdvisorAnalysis { +class DefaultEvictionAdvisorProvider final + : public RegAllocEvictionAdvisorProvider { public: - DefaultEvictionAdvisorAnalysis(bool NotAsRequested) - : RegAllocEvictionAdvisorAnalysis(AdvisorMode::Default), + DefaultEvictionAdvisorProvider(bool NotAsRequested) + : RegAllocEvictionAdvisorProvider(AdvisorMode::Default), NotAsRequested(NotAsRequested) {} // support for isa<> and dyn_cast. - static bool classof(const RegAllocEvictionAdvisorAnalysis *R) { + static bool classof(const RegAllocEvictionAdvisorProvider *R) { return R->getAdvisorMode() == AdvisorMode::Default; } -private: std::unique_ptr getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { return std::make_unique(MF, RA); } + bool doInitialization(Module &M) override { if (NotAsRequested) M.getContext().emitError("Requested regalloc eviction advisor analysis " "could not be created. Using default"); - return RegAllocEvictionAdvisorAnalysis::doInitialization(M); + return RegAllocEvictionAdvisorProvider::doInitialization(M); + } + +private: + const bool NotAsRequested; +}; + +class DefaultEvictionAdvisorAnalysisLegacy final + : public RegAllocEvictionAdvisorAnalysisLegacy { +public: + DefaultEvictionAdvisorAnalysisLegacy(bool NotAsRequested) + : RegAllocEvictionAdvisorAnalysisLegacy(AdvisorMode::Default), + NotAsRequested(NotAsRequested) {} + + std::unique_ptr + getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + return Provider->getAdvisor(MF, RA); + } + + bool doInitialization(Module &M) override { + Provider.reset(new DefaultEvictionAdvisorProvider(NotAsRequested)); + return Provider->doInitialization(M); } + + // support for isa<> and dyn_cast. + static bool classof(const RegAllocEvictionAdvisorAnalysisLegacy *R) { + return R->getAdvisorMode() == AdvisorMode::Default; + } + +private: + std::unique_ptr Provider; const bool NotAsRequested; }; } // namespace -template <> Pass *llvm::callDefaultCtor() { +AnalysisKey RegAllocEvictionAdvisorAnalysis::Key; + +RegAllocEvictionAdvisorAnalysis::Result +RegAllocEvictionAdvisorAnalysis::run(Module &M, ModuleAnalysisManager &MAM) { + std::unique_ptr Provider; + switch (Mode) { + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default: + Provider.reset( + new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ false)); + break; + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: +#if defined(LLVM_HAVE_TFLITE) + Provider.reset(createDevelopmentModeAdvisorProvider()); +#endif + break; + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: + Provider.reset(createReleaseModeAdvisorProvider()); + break; + } + if (!Provider) + Provider.reset(new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ true)); + Provider->doInitialization(M); + return Provider; +} + +template <> +Pass *llvm::callDefaultCtor() { Pass *Ret = nullptr; switch (Mode) { - case RegAllocEvictionAdvisorAnalysis::AdvisorMode::Default: - Ret = new DefaultEvictionAdvisorAnalysis(/*NotAsRequested*/ false); + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default: + Ret = new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested*/ false); break; - case RegAllocEvictionAdvisorAnalysis::AdvisorMode::Development: + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: #if defined(LLVM_HAVE_TFLITE) - Ret = createDevelopmentModeAdvisor(); + Ret = createDevelopmentModeAdvisorAnalysisLegacy(); #endif break; - case RegAllocEvictionAdvisorAnalysis::AdvisorMode::Release: - Ret = createReleaseModeAdvisor(); + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: + Ret = createReleaseModeAdvisorAnalysisLegacy(); break; } if (Ret) return Ret; - return new DefaultEvictionAdvisorAnalysis(/*NotAsRequested*/ true); + return new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested*/ true); } -StringRef RegAllocEvictionAdvisorAnalysis::getPassName() const { +StringRef RegAllocEvictionAdvisorAnalysisLegacy::getPassName() const { switch (getAdvisorMode()) { case AdvisorMode::Default: return "Default Regalloc Eviction Advisor"; diff --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp index 7c7eb2ad52b41..fe375048a6eef 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.cpp +++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp @@ -15,7 +15,6 @@ #include "AllocationOrder.h" #include "InterferenceCache.h" #include "RegAllocBase.h" -#include "RegAllocEvictionAdvisor.h" #include "RegAllocPriorityAdvisor.h" #include "SplitKit.h" #include "llvm/ADT/ArrayRef.h" @@ -46,6 +45,7 @@ #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" #include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/RegAllocEvictionAdvisor.h" #include "llvm/CodeGen/RegAllocRegistry.h" #include "llvm/CodeGen/RegisterClassInfo.h" #include "llvm/CodeGen/SlotIndexes.h" @@ -164,7 +164,7 @@ INITIALIZE_PASS_DEPENDENCY(LiveRegMatrixWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(EdgeBundlesWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(SpillPlacementWrapperLegacy) INITIALIZE_PASS_DEPENDENCY(MachineOptimizationRemarkEmitterPass) -INITIALIZE_PASS_DEPENDENCY(RegAllocEvictionAdvisorAnalysis) +INITIALIZE_PASS_DEPENDENCY(RegAllocEvictionAdvisorAnalysisLegacy) INITIALIZE_PASS_DEPENDENCY(RegAllocPriorityAdvisorAnalysis) INITIALIZE_PASS_END(RAGreedy, "greedy", "Greedy Register Allocator", false, false) @@ -219,7 +219,7 @@ void RAGreedy::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.addRequired(); AU.addRequired(); - AU.addRequired(); + AU.addRequired(); AU.addRequired(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -2766,7 +2766,8 @@ bool RAGreedy::runOnMachineFunction(MachineFunction &mf) { ExtraInfo.emplace(); EvictAdvisor = - getAnalysis().getAdvisor(*MF, *this); + getAnalysis().getAdvisor(*MF, + *this); PriorityAdvisor = getAnalysis().getAdvisor(*MF, *this); diff --git a/llvm/lib/CodeGen/RegAllocGreedy.h b/llvm/lib/CodeGen/RegAllocGreedy.h index e1ec63b4a5296..1d55a8241d760 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.h +++ b/llvm/lib/CodeGen/RegAllocGreedy.h @@ -14,7 +14,6 @@ #include "InterferenceCache.h" #include "RegAllocBase.h" -#include "RegAllocEvictionAdvisor.h" #include "RegAllocPriorityAdvisor.h" #include "SplitKit.h" #include "llvm/ADT/ArrayRef.h" diff --git a/llvm/lib/CodeGen/RegAllocPriorityAdvisor.h b/llvm/lib/CodeGen/RegAllocPriorityAdvisor.h index 32e4598b71539..0758743c2b140 100644 --- a/llvm/lib/CodeGen/RegAllocPriorityAdvisor.h +++ b/llvm/lib/CodeGen/RegAllocPriorityAdvisor.h @@ -9,7 +9,7 @@ #ifndef LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H #define LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H -#include "RegAllocEvictionAdvisor.h" +#include "llvm/CodeGen/RegAllocEvictionAdvisor.h" #include "llvm/CodeGen/SlotIndexes.h" #include "llvm/Pass.h" diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 8d5c0b3c13e01..96939f89279c6 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -127,6 +127,7 @@ #include "llvm/CodeGen/PeepholeOptimizer.h" #include "llvm/CodeGen/PostRASchedulerList.h" #include "llvm/CodeGen/PreISelIntrinsicLowering.h" +#include "llvm/CodeGen/RegAllocEvictionAdvisor.h" #include "llvm/CodeGen/RegAllocFast.h" #include "llvm/CodeGen/RegUsageInfoCollector.h" #include "llvm/CodeGen/RegUsageInfoPropagate.h" diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index a664d6fd7085f..e868040b07947 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -33,6 +33,7 @@ MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis()) MODULE_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC)) MODULE_ANALYSIS("profile-summary", ProfileSummaryAnalysis()) MODULE_ANALYSIS("reg-usage", PhysicalRegisterUsageAnalysis()) +MODULE_ANALYSIS("regalloc-evict", RegAllocEvictionAdvisorAnalysis()) MODULE_ANALYSIS("stack-safety", StackSafetyGlobalAnalysis()) MODULE_ANALYSIS("verify", VerifierAnalysis()) From 79d4fa4edda3ed29779a4932c54182936c18ee99 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Fri, 29 Nov 2024 09:18:59 +0000 Subject: [PATCH 02/14] Remove Provider::doInit, change to MF analysis init is in the constructor. The new MF analysis lazily intiailizes the provider. The (wrapped) provider is the analysis result. --- .../llvm/CodeGen/RegAllocEvictionAdvisor.h | 58 ++++++-- llvm/include/llvm/Passes/CodeGenPassBuilder.h | 5 +- .../llvm/Passes/MachinePassRegistry.def | 1 + llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp | 136 ++++++++---------- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 56 ++++---- llvm/lib/Passes/PassRegistry.def | 1 - 6 files changed, 143 insertions(+), 114 deletions(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index 847bf032235c1..8261f6d1cf0bb 100644 --- a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -13,6 +13,8 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/StringRef.h" +#include "llvm/CodeGen/MachineBlockFrequencyInfo.h" +#include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/Register.h" #include "llvm/Config/llvm-config.h" #include "llvm/IR/PassManager.h" @@ -200,33 +202,43 @@ class RegAllocEvictionAdvisorAnalysisLegacy : public ImmutablePass { class RegAllocEvictionAdvisorProvider { public: enum class AdvisorMode : int { Default, Release, Development }; - RegAllocEvictionAdvisorProvider(AdvisorMode Mode) : Mode(Mode) {} + RegAllocEvictionAdvisorProvider(AdvisorMode Mode, LLVMContext &Ctx) + : Ctx(Ctx), Mode(Mode) {} virtual ~RegAllocEvictionAdvisorProvider() = default; - virtual bool doInitialization(Module &M) { return false; } - virtual void logRewardIfNeeded(const MachineFunction &MF, llvm::function_ref GetReward) {} virtual std::unique_ptr getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; - /// Set the analyses that the advisor needs to use as they might not be - /// available before the advisor is created. - virtual void setAnalyses(std::initializer_list AnalysisP) {} + /// We create this provider in doInitialization which doesn't have these + /// analyses. For NPM, we do have them in run(MachineFunction&) + virtual void setAnalyses(MachineBlockFrequencyInfo *MBFI, + MachineLoopInfo *Loops) { + this->MBFI = MBFI; + this->Loops = Loops; + } AdvisorMode getAdvisorMode() const { return Mode; } +protected: + LLVMContext &Ctx; + MachineBlockFrequencyInfo *MBFI; + MachineLoopInfo *Loops; + private: const AdvisorMode Mode; }; -RegAllocEvictionAdvisorProvider *createReleaseModeAdvisorProvider(); -RegAllocEvictionAdvisorProvider *createDevelopmentModeAdvisorProvider(); +RegAllocEvictionAdvisorProvider * +createReleaseModeAdvisorProvider(LLVMContext &Ctx); +RegAllocEvictionAdvisorProvider * +createDevelopmentModeAdvisorProvider(LLVMContext &Ctx); -/// A Module analysis for fetching the Eviction Advisor. This is not a -/// MachineFunction analysis for two reasons: +/// A MachineFunction analysis for fetching the Eviction Advisor. +/// This sets up the Provider lazily and caches it. /// - in the ML implementation case, the evaluator is stateless but (especially /// in the development mode) expensive to set up. With a Module Analysis, we /// `require` it and set it up once. @@ -241,8 +253,30 @@ class RegAllocEvictionAdvisorAnalysis friend AnalysisInfoMixin; public: - using Result = std::unique_ptr; - Result run(Module &MF, ModuleAnalysisManager &MAM); + struct Result { + // owned by this analysis + RegAllocEvictionAdvisorProvider *Provider; + + bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, + MachineFunctionAnalysisManager::Invalidator &Inv) { + auto PAC = PA.getChecker(); + // If we are in default mode, the provider is always valid. + if (Provider->getAdvisorMode() == + RegAllocEvictionAdvisorProvider::AdvisorMode::Default) + return !PAC.preservedWhenStateless(); + // MBFI and Loops are used in release and development modes, so check + // those. + return !PAC.preservedWhenStateless() || + Inv.invalidate(MF, PA) || + Inv.invalidate(MF, PA); + } + }; + + Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MAM); + +private: + void initializeProvider(LLVMContext &Ctx); + std::unique_ptr Provider; }; /// Specialization for the API used by the analysis infrastructure to create diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index 0e0644fc5e742..12781e2b84623 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -1065,10 +1065,9 @@ void CodeGenPassBuilder::addMachineSSAOptimization( template void CodeGenPassBuilder::addTargetRegisterAllocator( AddMachinePass &addPass, bool Optimized) const { - if (Optimized) { - addPass(RequireAnalysis()); + if (Optimized) addPass(RAGreedyPass()); - } else + else addPass(RegAllocFastPass()); } diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def index 075ebcb829553..2b5e258682585 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -114,6 +114,7 @@ MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree", MachinePostDominatorTreeAnalysis()) MACHINE_FUNCTION_ANALYSIS("machine-trace-metrics", MachineTraceMetricsAnalysis()) MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC)) +MACHINE_FUNCTION_ANALYSIS("regalloc-evict", RegAllocEvictionAdvisorAnalysis()) MACHINE_FUNCTION_ANALYSIS("slot-indexes", SlotIndexesAnalysis()) MACHINE_FUNCTION_ANALYSIS("spill-code-placement", SpillPlacementAnalysis()) MACHINE_FUNCTION_ANALYSIS("virtregmap", VirtRegMapAnalysis()) diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp index ceef35dbebeae..05c00c1ed25e5 100644 --- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp +++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp @@ -393,8 +393,8 @@ class MLEvictAdvisor : public RegAllocEvictionAdvisor { class ReleaseModeEvictionAdvisorProvider final : public RegAllocEvictionAdvisorProvider { public: - ReleaseModeEvictionAdvisorProvider() - : RegAllocEvictionAdvisorProvider(AdvisorMode::Release) { + ReleaseModeEvictionAdvisorProvider(LLVMContext &Ctx) + : RegAllocEvictionAdvisorProvider(AdvisorMode::Release, Ctx) { if (EnableDevelopmentFeatures) { InputFeatures = {RA_EVICT_FEATURES_LIST( _DECL_FEATURES) RA_EVICT_FIRST_DEVELOPMENT_FEATURE(_DECL_FEATURES) @@ -408,15 +408,6 @@ class ReleaseModeEvictionAdvisorProvider final return R->getAdvisorMode() == AdvisorMode::Release; } - void setAnalyses(std::initializer_list AnalysisList) override { - for (auto Analysis : AnalysisList) { - if (auto **MBFI = llvm::any_cast(&Analysis)) - this->MBFI = *MBFI; - if (auto **Loops = llvm::any_cast(&Analysis)) - this->Loops = *Loops; - } - } - std::unique_ptr getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { if (!Runner) { @@ -429,6 +420,8 @@ class ReleaseModeEvictionAdvisorProvider final InteractiveChannelBaseName + ".out", InteractiveChannelBaseName + ".in"); } + assert((MBFI && Loops) && + "Invalid provider state: must have analysis available"); return std::make_unique(MF, RA, Runner.get(), *MBFI, *Loops); } @@ -436,8 +429,6 @@ class ReleaseModeEvictionAdvisorProvider final private: std::vector InputFeatures; std::unique_ptr Runner; - MachineBlockFrequencyInfo *MBFI; - MachineLoopInfo *Loops; }; class ReleaseModeEvictionAdvisorAnalysisLegacy final @@ -450,12 +441,19 @@ class ReleaseModeEvictionAdvisorAnalysisLegacy final getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { auto *MBFI = &getAnalysis().getMBFI(); auto *Loops = &getAnalysis().getLI(); - Provider.setAnalyses({MBFI, Loops}); - return Provider.getAdvisor(MF, RA); + Provider->setAnalyses(MBFI, Loops); + return Provider->getAdvisor(MF, RA); + } + + void logRewardIfNeeded(const MachineFunction &MF, + llvm::function_ref GetReward) override { + // No-op in release mode } bool doInitialization(Module &M) override { - return Provider.doInitialization(M); + Provider = + std::make_unique(M.getContext()); + return false; } static bool classof(const RegAllocEvictionAdvisorAnalysisLegacy *R) { @@ -469,7 +467,7 @@ class ReleaseModeEvictionAdvisorAnalysisLegacy final } private: - ReleaseModeEvictionAdvisorProvider Provider; + std::unique_ptr Provider; }; // =================================== @@ -507,11 +505,8 @@ class DevelopmentModeEvictAdvisor : public MLEvictAdvisor { class DevelopmentModeEvictionAdvisorProvider final : public RegAllocEvictionAdvisorProvider { public: - DevelopmentModeEvictionAdvisorProvider( - MachineBlockFrequencyInfo *MBFI = nullptr, - MachineLoopInfo *Loops = nullptr) - : RegAllocEvictionAdvisorProvider(AdvisorMode::Development), MBFI(MBFI), - Loops(Loops) { + DevelopmentModeEvictionAdvisorProvider(LLVMContext &Ctx) + : RegAllocEvictionAdvisorProvider(AdvisorMode::Development, Ctx) { if (EnableDevelopmentFeatures) { InputFeatures = {RA_EVICT_FEATURES_LIST( _DECL_FEATURES) RA_EVICT_FIRST_DEVELOPMENT_FEATURE(_DECL_FEATURES) @@ -531,43 +526,10 @@ class DevelopmentModeEvictionAdvisorProvider final TensorSpec::createSpec("action_step_type", {1}), TensorSpec::createSpec("action_reward", {1})}; } - } - // support for isa<> and dyn_cast. - static bool classof(const RegAllocEvictionAdvisorProvider *R) { - return R->getAdvisorMode() == AdvisorMode::Development; - } - - void logRewardIfNeeded(const MachineFunction &MF, - llvm::function_ref GetReward) override { - if (!Log || !Log->hasAnyObservationForContext(MF.getName())) - return; - // The function pass manager would run all the function passes for a - // function, so we assume the last context belongs to this function. If - // this invariant ever changes, we can implement at that time switching - // contexts. At this point, it'd be an error - if (Log->currentContext() != MF.getName()) { - MF.getFunction().getContext().emitError( - "The training log context shouldn't have had changed."); - } - if (Log->hasObservationInProgress()) - Log->logReward(GetReward()); - } - - void setAnalyses(std::initializer_list AnalysisList) override { - for (auto Analysis : AnalysisList) { - if (auto **MBFI = llvm::any_cast(&Analysis)) - this->MBFI = *MBFI; - if (auto **Loops = llvm::any_cast(&Analysis)) - this->Loops = *Loops; - } - } - - bool doInitialization(Module &M) override { - LLVMContext &Ctx = M.getContext(); if (ModelUnderTraining.empty() && TrainingLog.empty()) { Ctx.emitError("Regalloc development mode should be requested with at " "least logging enabled and/or a training model"); - return false; + return; } if (ModelUnderTraining.empty()) Runner = std::make_unique(Ctx, InputFeatures); @@ -576,15 +538,15 @@ class DevelopmentModeEvictionAdvisorProvider final Ctx, ModelUnderTraining, DecisionName, TrainingInputFeatures); if (!Runner) { Ctx.emitError("Regalloc: could not set up the model runner"); - return false; + return; } if (TrainingLog.empty()) - return false; + return; std::error_code EC; auto OS = std::make_unique(TrainingLog, EC); if (EC) { - M.getContext().emitError(EC.message() + ":" + TrainingLog); - return false; + Ctx.emitError(EC.message() + ":" + TrainingLog); + return; } std::vector LFS = InputFeatures; if (auto *MUTR = dyn_cast(Runner.get())) @@ -596,7 +558,28 @@ class DevelopmentModeEvictionAdvisorProvider final Log = std::make_unique(std::move(OS), LFS, Reward, /*IncludeReward*/ true); - return false; + return; + } + + // support for isa<> and dyn_cast. + static bool classof(const RegAllocEvictionAdvisorProvider *R) { + return R->getAdvisorMode() == AdvisorMode::Development; + } + + void logRewardIfNeeded(const MachineFunction &MF, + llvm::function_ref GetReward) override { + if (!Log || !Log->hasAnyObservationForContext(MF.getName())) + return; + // The function pass manager would run all the function passes for a + // function, so we assume the last context belongs to this function. If + // this invariant ever changes, we can implement at that time switching + // contexts. At this point, it'd be an error + if (Log->currentContext() != MF.getName()) { + MF.getFunction().getContext().emitError( + "The training log context shouldn't have had changed."); + } + if (Log->hasObservationInProgress()) + Log->logReward(GetReward()); } std::unique_ptr @@ -617,8 +600,6 @@ class DevelopmentModeEvictionAdvisorProvider final std::unique_ptr Runner; std::unique_ptr Log; - const MachineBlockFrequencyInfo *MBFI; - const MachineLoopInfo *Loops; }; class DevelopmentModeEvictionAdvisorAnalysisLegacy final @@ -628,15 +609,22 @@ class DevelopmentModeEvictionAdvisorAnalysisLegacy final : RegAllocEvictionAdvisorAnalysisLegacy(AdvisorMode::Development) {} bool doInitialization(Module &M) override { - auto *MBFI = &getAnalysis().getMBFI(); - auto *Loops = &getAnalysis().getLI(); - Provider.setAnalyses({MBFI, Loops}); - return Provider.doInitialization(M); + Provider = std::make_unique( + M.getContext()); + return false; + } + + void logRewardIfNeeded(const MachineFunction &MF, + llvm::function_ref GetReward) override { + Provider->logRewardIfNeeded(MF, GetReward); } std::unique_ptr getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { - return Provider.getAdvisor(MF, RA); + auto *MBFI = &getAnalysis().getMBFI(); + auto *Loops = &getAnalysis().getLI(); + Provider->setAnalyses(MBFI, Loops); + return Provider->getAdvisor(MF, RA); } // support for isa<> and dyn_cast. @@ -651,7 +639,7 @@ class DevelopmentModeEvictionAdvisorAnalysisLegacy final } private: - DevelopmentModeEvictionAdvisorProvider Provider; + std::unique_ptr Provider; }; #endif // #ifdef LLVM_HAVE_TFLITE @@ -1204,8 +1192,9 @@ void llvm::extractMBBFrequency( // Development mode-specific implementations #ifdef LLVM_HAVE_TFLITE -RegAllocEvictionAdvisorProvider *llvm::createDevelopmentModeAdvisorProvider() { - return new DevelopmentModeEvictionAdvisorProvider(); +RegAllocEvictionAdvisorProvider * +llvm::createDevelopmentModeAdvisorProvider(LLVMContext &Ctx) { + return new DevelopmentModeEvictionAdvisorProvider(Ctx); } RegAllocEvictionAdvisorAnalysisLegacy * @@ -1284,8 +1273,9 @@ bool RegAllocScoring::runOnMachineFunction(MachineFunction &MF) { } #endif // #ifdef LLVM_HAVE_TFLITE -RegAllocEvictionAdvisorProvider *llvm::createReleaseModeAdvisorProvider() { - return new ReleaseModeEvictionAdvisorProvider(); +RegAllocEvictionAdvisorProvider * +llvm::createReleaseModeAdvisorProvider(LLVMContext &Ctx) { + return new ReleaseModeEvictionAdvisorProvider(Ctx); } RegAllocEvictionAdvisorAnalysisLegacy * diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index 09fb5df259a97..4c7528ebffbfd 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -9,13 +9,14 @@ // Implementation of the default eviction advisor and of the Analysis pass. // //===----------------------------------------------------------------------===// - #include "llvm/CodeGen/RegAllocEvictionAdvisor.h" #include "AllocationOrder.h" #include "RegAllocGreedy.h" #include "RegAllocPriorityAdvisor.h" #include "llvm/CodeGen/LiveRegMatrix.h" +#include "llvm/CodeGen/MachineBlockFrequencyInfo.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/RegisterClassInfo.h" #include "llvm/CodeGen/VirtRegMap.h" #include "llvm/IR/Module.h" @@ -69,9 +70,12 @@ namespace { class DefaultEvictionAdvisorProvider final : public RegAllocEvictionAdvisorProvider { public: - DefaultEvictionAdvisorProvider(bool NotAsRequested) - : RegAllocEvictionAdvisorProvider(AdvisorMode::Default), - NotAsRequested(NotAsRequested) {} + DefaultEvictionAdvisorProvider(bool NotAsRequested, LLVMContext &Ctx) + : RegAllocEvictionAdvisorProvider(AdvisorMode::Default, Ctx) { + if (NotAsRequested) + Ctx.emitError("Requested regalloc eviction advisor analysis " + "could not be created. Using default"); + } // support for isa<> and dyn_cast. static bool classof(const RegAllocEvictionAdvisorProvider *R) { @@ -82,16 +86,6 @@ class DefaultEvictionAdvisorProvider final getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { return std::make_unique(MF, RA); } - - bool doInitialization(Module &M) override { - if (NotAsRequested) - M.getContext().emitError("Requested regalloc eviction advisor analysis " - "could not be created. Using default"); - return RegAllocEvictionAdvisorProvider::doInitialization(M); - } - -private: - const bool NotAsRequested; }; class DefaultEvictionAdvisorAnalysisLegacy final @@ -103,12 +97,14 @@ class DefaultEvictionAdvisorAnalysisLegacy final std::unique_ptr getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + // MBFI and Loops not required here. return Provider->getAdvisor(MF, RA); } bool doInitialization(Module &M) override { - Provider.reset(new DefaultEvictionAdvisorProvider(NotAsRequested)); - return Provider->doInitialization(M); + Provider.reset( + new DefaultEvictionAdvisorProvider(NotAsRequested, M.getContext())); + return false; } // support for isa<> and dyn_cast. @@ -124,27 +120,37 @@ class DefaultEvictionAdvisorAnalysisLegacy final AnalysisKey RegAllocEvictionAdvisorAnalysis::Key; -RegAllocEvictionAdvisorAnalysis::Result -RegAllocEvictionAdvisorAnalysis::run(Module &M, ModuleAnalysisManager &MAM) { - std::unique_ptr Provider; +void RegAllocEvictionAdvisorAnalysis::initializeProvider(LLVMContext &Ctx) { + if (Provider) + return; switch (Mode) { case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default: Provider.reset( - new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ false)); + new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ false, Ctx)); break; case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: #if defined(LLVM_HAVE_TFLITE) - Provider.reset(createDevelopmentModeAdvisorProvider()); + Provider.reset(createDevelopmentModeAdvisorProvider(Ctx)); #endif break; case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: - Provider.reset(createReleaseModeAdvisorProvider()); + Provider.reset(createReleaseModeAdvisorProvider(Ctx)); break; } if (!Provider) - Provider.reset(new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ true)); - Provider->doInitialization(M); - return Provider; + Provider.reset( + new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ true, Ctx)); +} + +RegAllocEvictionAdvisorAnalysis::Result +RegAllocEvictionAdvisorAnalysis::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + // Lazy initialization of the provider. + initializeProvider(MF.getFunction().getContext()); + auto *MBFI = &MFAM.getResult(MF); + auto *Loops = &MFAM.getResult(MF); + Provider->setAnalyses(MBFI, Loops); + return Result{Provider.get()}; } template <> diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index e868040b07947..a664d6fd7085f 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -33,7 +33,6 @@ MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis()) MODULE_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC)) MODULE_ANALYSIS("profile-summary", ProfileSummaryAnalysis()) MODULE_ANALYSIS("reg-usage", PhysicalRegisterUsageAnalysis()) -MODULE_ANALYSIS("regalloc-evict", RegAllocEvictionAdvisorAnalysis()) MODULE_ANALYSIS("stack-safety", StackSafetyGlobalAnalysis()) MODULE_ANALYSIS("verify", VerifierAnalysis()) From 900a84f20af15b2b9b6eecb28ba1f0bd9c1dd74c Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Tue, 3 Dec 2024 06:17:46 +0000 Subject: [PATCH 03/14] Remove parenthesis --- llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp index 05c00c1ed25e5..39523ee497fe5 100644 --- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp +++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp @@ -588,7 +588,7 @@ class DevelopmentModeEvictionAdvisorProvider final return nullptr; if (Log) Log->switchContext(MF.getName()); - assert((MBFI && Loops) && + assert(MBFI && Loops && "Invalid provider state: must have analysis available"); return std::make_unique( MF, RA, Runner.get(), *MBFI, *Loops, Log.get()); From 7949228e830783061e66dc8df4c8539833545794 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Wed, 4 Dec 2024 06:44:24 +0000 Subject: [PATCH 04/14] Add TODO to remove provider, remove paren --- llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h | 1 + llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index 8261f6d1cf0bb..9ebe5c22f4739 100644 --- a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -199,6 +199,7 @@ class RegAllocEvictionAdvisorAnalysisLegacy : public ImmutablePass { /// This keeps the state for logging, and sets up and holds the provider. /// The legacy pass itself used to keep the logging state and provider, /// so this extraction helps the NPM analysis to reuse the logic. +/// TODO: Coalesce this with the NPM analysis when legacy PM is removed. class RegAllocEvictionAdvisorProvider { public: enum class AdvisorMode : int { Default, Release, Development }; diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp index 39523ee497fe5..30ec12f950376 100644 --- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp +++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp @@ -420,7 +420,7 @@ class ReleaseModeEvictionAdvisorProvider final InteractiveChannelBaseName + ".out", InteractiveChannelBaseName + ".in"); } - assert((MBFI && Loops) && + assert(MBFI && Loops && "Invalid provider state: must have analysis available"); return std::make_unique(MF, RA, Runner.get(), *MBFI, *Loops); From 4b0b58fb469524cb0a2b34747f6764c64cf03ab8 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Mon, 9 Dec 2024 08:28:04 +0000 Subject: [PATCH 05/14] Remove createProvider*(), add new method in ML.cpp --- .../llvm/CodeGen/RegAllocEvictionAdvisor.h | 13 +++++----- llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp | 24 ++++++++++++------- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 20 +++++----------- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index 9ebe5c22f4739..3e6127351911b 100644 --- a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -233,11 +233,6 @@ class RegAllocEvictionAdvisorProvider { const AdvisorMode Mode; }; -RegAllocEvictionAdvisorProvider * -createReleaseModeAdvisorProvider(LLVMContext &Ctx); -RegAllocEvictionAdvisorProvider * -createDevelopmentModeAdvisorProvider(LLVMContext &Ctx); - /// A MachineFunction analysis for fetching the Eviction Advisor. /// This sets up the Provider lazily and caches it. /// - in the ML implementation case, the evaluator is stateless but (especially @@ -276,7 +271,13 @@ class RegAllocEvictionAdvisorAnalysis Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MAM); private: - void initializeProvider(LLVMContext &Ctx); + void + initializeProvider(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode Mode, + LLVMContext &Ctx); + void + initializeMLProvider(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode Mode, + LLVMContext &Ctx); + std::unique_ptr Provider; }; diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp index 30ec12f950376..8b9c118a38f9f 100644 --- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp +++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp @@ -1192,11 +1192,6 @@ void llvm::extractMBBFrequency( // Development mode-specific implementations #ifdef LLVM_HAVE_TFLITE -RegAllocEvictionAdvisorProvider * -llvm::createDevelopmentModeAdvisorProvider(LLVMContext &Ctx) { - return new DevelopmentModeEvictionAdvisorProvider(Ctx); -} - RegAllocEvictionAdvisorAnalysisLegacy * llvm::createDevelopmentModeAdvisorAnalysisLegacy() { return new DevelopmentModeEvictionAdvisorAnalysisLegacy(); @@ -1273,9 +1268,22 @@ bool RegAllocScoring::runOnMachineFunction(MachineFunction &MF) { } #endif // #ifdef LLVM_HAVE_TFLITE -RegAllocEvictionAdvisorProvider * -llvm::createReleaseModeAdvisorProvider(LLVMContext &Ctx) { - return new ReleaseModeEvictionAdvisorProvider(Ctx); +void RegAllocEvictionAdvisorAnalysis::initializeMLProvider( + RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode Mode, LLVMContext &Ctx) { + if (Provider) + return; + switch (Mode) { + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: +#if defined(LLVM_HAVE_TFLITE) + Provider.reset(new DevelopmentModeEvictionAdvisorProvider(Ctx)); +#endif + break; + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: + Provider.reset(new ReleaseModeEvictionAdvisorProvider(Ctx)); + break; + default: + break; + } } RegAllocEvictionAdvisorAnalysisLegacy * diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index 4c7528ebffbfd..1307ed2651a91 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -120,23 +120,15 @@ class DefaultEvictionAdvisorAnalysisLegacy final AnalysisKey RegAllocEvictionAdvisorAnalysis::Key; -void RegAllocEvictionAdvisorAnalysis::initializeProvider(LLVMContext &Ctx) { +void RegAllocEvictionAdvisorAnalysis::initializeProvider( + RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode Mode, LLVMContext &Ctx) { if (Provider) return; - switch (Mode) { - case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default: + if (Mode == RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default) Provider.reset( new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ false, Ctx)); - break; - case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: -#if defined(LLVM_HAVE_TFLITE) - Provider.reset(createDevelopmentModeAdvisorProvider(Ctx)); -#endif - break; - case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: - Provider.reset(createReleaseModeAdvisorProvider(Ctx)); - break; - } + else + initializeMLProvider(Mode, Ctx); if (!Provider) Provider.reset( new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ true, Ctx)); @@ -146,7 +138,7 @@ RegAllocEvictionAdvisorAnalysis::Result RegAllocEvictionAdvisorAnalysis::run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) { // Lazy initialization of the provider. - initializeProvider(MF.getFunction().getContext()); + initializeProvider(::Mode, MF.getFunction().getContext()); auto *MBFI = &MFAM.getResult(MF); auto *Loops = &MFAM.getResult(MF); Provider->setAnalyses(MBFI, Loops); From ef2ab437333b93a7b5eefb53777abc7149b264a7 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Wed, 11 Dec 2024 09:08:06 +0000 Subject: [PATCH 06/14] Use the provider as analysis result --- .../llvm/CodeGen/RegAllocEvictionAdvisor.h | 81 ++++++++++--------- llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp | 16 ++-- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 7 +- llvm/lib/CodeGen/RegAllocGreedy.cpp | 3 +- 4 files changed, 53 insertions(+), 54 deletions(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index 3e6127351911b..25df101ee512e 100644 --- a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -153,6 +153,44 @@ class RegAllocEvictionAdvisor { const bool EnableLocalReassign; }; +/// Common provider for legacy and new pass managers. +/// This keeps the state for logging, and sets up and holds the provider. +/// The legacy pass itself used to keep the logging state and provider, +/// so this extraction helps the NPM analysis to reuse the logic. +/// TODO: Coalesce this with the NPM analysis when legacy PM is removed. +class RegAllocEvictionAdvisorProvider { +public: + enum class AdvisorMode : int { Default, Release, Development }; + RegAllocEvictionAdvisorProvider(AdvisorMode Mode, LLVMContext &Ctx) + : Ctx(Ctx), Mode(Mode) {} + + virtual ~RegAllocEvictionAdvisorProvider() = default; + + virtual void logRewardIfNeeded(const MachineFunction &MF, + llvm::function_ref GetReward) {} + + virtual std::unique_ptr + getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; + + /// We create this provider in doInitialization which doesn't have these + /// analyses. For NPM, we do have them in run(MachineFunction&) + virtual void setAnalyses(MachineBlockFrequencyInfo *MBFI, + MachineLoopInfo *Loops) { + this->MBFI = MBFI; + this->Loops = Loops; + } + + AdvisorMode getAdvisorMode() const { return Mode; } + +protected: + LLVMContext &Ctx; + MachineBlockFrequencyInfo *MBFI; + MachineLoopInfo *Loops; + +private: + const AdvisorMode Mode; +}; + /// ImmutableAnalysis abstraction for fetching the Eviction Advisor. We model it /// as an analysis to decouple the user from the implementation insofar as /// dependencies on other analyses goes. The motivation for it being an @@ -177,8 +215,8 @@ class RegAllocEvictionAdvisorAnalysisLegacy : public ImmutablePass { static char ID; /// Get an advisor for the given context (i.e. machine function, etc) - virtual std::unique_ptr - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; + virtual std::unique_ptr& + getProvider() = 0; AdvisorMode getAdvisorMode() const { return Mode; } virtual void logRewardIfNeeded(const MachineFunction &MF, llvm::function_ref GetReward) {}; @@ -189,50 +227,13 @@ class RegAllocEvictionAdvisorAnalysisLegacy : public ImmutablePass { void getAnalysisUsage(AnalysisUsage &AU) const override { AU.setPreservesAll(); } + std::unique_ptr Provider; private: StringRef getPassName() const override; const AdvisorMode Mode; }; -/// Common provider for legacy and new pass managers. -/// This keeps the state for logging, and sets up and holds the provider. -/// The legacy pass itself used to keep the logging state and provider, -/// so this extraction helps the NPM analysis to reuse the logic. -/// TODO: Coalesce this with the NPM analysis when legacy PM is removed. -class RegAllocEvictionAdvisorProvider { -public: - enum class AdvisorMode : int { Default, Release, Development }; - RegAllocEvictionAdvisorProvider(AdvisorMode Mode, LLVMContext &Ctx) - : Ctx(Ctx), Mode(Mode) {} - - virtual ~RegAllocEvictionAdvisorProvider() = default; - - virtual void logRewardIfNeeded(const MachineFunction &MF, - llvm::function_ref GetReward) {} - - virtual std::unique_ptr - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; - - /// We create this provider in doInitialization which doesn't have these - /// analyses. For NPM, we do have them in run(MachineFunction&) - virtual void setAnalyses(MachineBlockFrequencyInfo *MBFI, - MachineLoopInfo *Loops) { - this->MBFI = MBFI; - this->Loops = Loops; - } - - AdvisorMode getAdvisorMode() const { return Mode; } - -protected: - LLVMContext &Ctx; - MachineBlockFrequencyInfo *MBFI; - MachineLoopInfo *Loops; - -private: - const AdvisorMode Mode; -}; - /// A MachineFunction analysis for fetching the Eviction Advisor. /// This sets up the Provider lazily and caches it. /// - in the ML implementation case, the evaluator is stateless but (especially diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp index 8b9c118a38f9f..409b6a0314680 100644 --- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp +++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp @@ -437,12 +437,12 @@ class ReleaseModeEvictionAdvisorAnalysisLegacy final ReleaseModeEvictionAdvisorAnalysisLegacy() : RegAllocEvictionAdvisorAnalysisLegacy(AdvisorMode::Release) {} - std::unique_ptr - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + std::unique_ptr& + getProvider() override { auto *MBFI = &getAnalysis().getMBFI(); auto *Loops = &getAnalysis().getLI(); Provider->setAnalyses(MBFI, Loops); - return Provider->getAdvisor(MF, RA); + return Provider; } void logRewardIfNeeded(const MachineFunction &MF, @@ -467,7 +467,7 @@ class ReleaseModeEvictionAdvisorAnalysisLegacy final } private: - std::unique_ptr Provider; + // std::unique_ptr Provider; }; // =================================== @@ -619,12 +619,12 @@ class DevelopmentModeEvictionAdvisorAnalysisLegacy final Provider->logRewardIfNeeded(MF, GetReward); } - std::unique_ptr - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + std::unique_ptr& + getProvider() override { auto *MBFI = &getAnalysis().getMBFI(); auto *Loops = &getAnalysis().getLI(); Provider->setAnalyses(MBFI, Loops); - return Provider->getAdvisor(MF, RA); + return Provider; } // support for isa<> and dyn_cast. @@ -639,7 +639,7 @@ class DevelopmentModeEvictionAdvisorAnalysisLegacy final } private: - std::unique_ptr Provider; + // std::unique_ptr Provider; }; #endif // #ifdef LLVM_HAVE_TFLITE diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index 1307ed2651a91..e00b81d8dcf61 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -95,10 +95,10 @@ class DefaultEvictionAdvisorAnalysisLegacy final : RegAllocEvictionAdvisorAnalysisLegacy(AdvisorMode::Default), NotAsRequested(NotAsRequested) {} - std::unique_ptr - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + std::unique_ptr& + getProvider() override { // MBFI and Loops not required here. - return Provider->getAdvisor(MF, RA); + return Provider; } bool doInitialization(Module &M) override { @@ -113,7 +113,6 @@ class DefaultEvictionAdvisorAnalysisLegacy final } private: - std::unique_ptr Provider; const bool NotAsRequested; }; } // namespace diff --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp index fe375048a6eef..4174d42892a4a 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.cpp +++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp @@ -2766,8 +2766,7 @@ bool RAGreedy::runOnMachineFunction(MachineFunction &mf) { ExtraInfo.emplace(); EvictAdvisor = - getAnalysis().getAdvisor(*MF, - *this); + getAnalysis().getProvider()->getAdvisor(*MF, *this); PriorityAdvisor = getAnalysis().getAdvisor(*MF, *this); From 27836836d030df3183b706bb0a23bd90e2af71ae Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Thu, 26 Dec 2024 08:25:11 +0000 Subject: [PATCH 07/14] Remove setAnalyses(); pass analysis in getAdvisor --- .../llvm/CodeGen/RegAllocEvictionAdvisor.h | 19 +++++--------- llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp | 25 +++---------------- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 16 +++--------- llvm/lib/CodeGen/RegAllocGreedy.cpp | 7 ++++-- 4 files changed, 19 insertions(+), 48 deletions(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index 25df101ee512e..781afbc571abb 100644 --- a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -170,22 +170,13 @@ class RegAllocEvictionAdvisorProvider { llvm::function_ref GetReward) {} virtual std::unique_ptr - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; - - /// We create this provider in doInitialization which doesn't have these - /// analyses. For NPM, we do have them in run(MachineFunction&) - virtual void setAnalyses(MachineBlockFrequencyInfo *MBFI, - MachineLoopInfo *Loops) { - this->MBFI = MBFI; - this->Loops = Loops; - } + getAdvisor(const MachineFunction &MF, const RAGreedy &RA, + MachineBlockFrequencyInfo *MBFI, MachineLoopInfo *Loops) = 0; AdvisorMode getAdvisorMode() const { return Mode; } protected: LLVMContext &Ctx; - MachineBlockFrequencyInfo *MBFI; - MachineLoopInfo *Loops; private: const AdvisorMode Mode; @@ -215,8 +206,10 @@ class RegAllocEvictionAdvisorAnalysisLegacy : public ImmutablePass { static char ID; /// Get an advisor for the given context (i.e. machine function, etc) - virtual std::unique_ptr& - getProvider() = 0; + std::unique_ptr &getProvider() { + return Provider; + } + AdvisorMode getAdvisorMode() const { return Mode; } virtual void logRewardIfNeeded(const MachineFunction &MF, llvm::function_ref GetReward) {}; diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp index 409b6a0314680..b1728aae7b1fd 100644 --- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp +++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp @@ -409,7 +409,8 @@ class ReleaseModeEvictionAdvisorProvider final } std::unique_ptr - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + getAdvisor(const MachineFunction &MF, const RAGreedy &RA, + MachineBlockFrequencyInfo *MBFI, MachineLoopInfo *Loops) override { if (!Runner) { if (InteractiveChannelBaseName.empty()) Runner = std::make_unique>( @@ -437,14 +438,6 @@ class ReleaseModeEvictionAdvisorAnalysisLegacy final ReleaseModeEvictionAdvisorAnalysisLegacy() : RegAllocEvictionAdvisorAnalysisLegacy(AdvisorMode::Release) {} - std::unique_ptr& - getProvider() override { - auto *MBFI = &getAnalysis().getMBFI(); - auto *Loops = &getAnalysis().getLI(); - Provider->setAnalyses(MBFI, Loops); - return Provider; - } - void logRewardIfNeeded(const MachineFunction &MF, llvm::function_ref GetReward) override { // No-op in release mode @@ -465,9 +458,6 @@ class ReleaseModeEvictionAdvisorAnalysisLegacy final AU.addRequired(); RegAllocEvictionAdvisorAnalysisLegacy::getAnalysisUsage(AU); } - -private: - // std::unique_ptr Provider; }; // =================================== @@ -583,7 +573,8 @@ class DevelopmentModeEvictionAdvisorProvider final } std::unique_ptr - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + getAdvisor(const MachineFunction &MF, const RAGreedy &RA, + MachineBlockFrequencyInfo *MBFI, MachineLoopInfo *Loops) override { if (!Runner) return nullptr; if (Log) @@ -619,14 +610,6 @@ class DevelopmentModeEvictionAdvisorAnalysisLegacy final Provider->logRewardIfNeeded(MF, GetReward); } - std::unique_ptr& - getProvider() override { - auto *MBFI = &getAnalysis().getMBFI(); - auto *Loops = &getAnalysis().getLI(); - Provider->setAnalyses(MBFI, Loops); - return Provider; - } - // support for isa<> and dyn_cast. static bool classof(const RegAllocEvictionAdvisorAnalysisLegacy *R) { return R->getAdvisorMode() == AdvisorMode::Development; diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index e00b81d8dcf61..73de74c5aad92 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -83,7 +83,8 @@ class DefaultEvictionAdvisorProvider final } std::unique_ptr - getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override { + getAdvisor(const MachineFunction &MF, const RAGreedy &RA, + MachineBlockFrequencyInfo *, MachineLoopInfo *) override { return std::make_unique(MF, RA); } }; @@ -95,12 +96,6 @@ class DefaultEvictionAdvisorAnalysisLegacy final : RegAllocEvictionAdvisorAnalysisLegacy(AdvisorMode::Default), NotAsRequested(NotAsRequested) {} - std::unique_ptr& - getProvider() override { - // MBFI and Loops not required here. - return Provider; - } - bool doInitialization(Module &M) override { Provider.reset( new DefaultEvictionAdvisorProvider(NotAsRequested, M.getContext())); @@ -125,12 +120,12 @@ void RegAllocEvictionAdvisorAnalysis::initializeProvider( return; if (Mode == RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default) Provider.reset( - new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ false, Ctx)); + new DefaultEvictionAdvisorProvider(/*NotAsRequested=*/false, Ctx)); else initializeMLProvider(Mode, Ctx); if (!Provider) Provider.reset( - new DefaultEvictionAdvisorProvider(/*NotAsRequested*/ true, Ctx)); + new DefaultEvictionAdvisorProvider(/*NotAsRequested=*/true, Ctx)); } RegAllocEvictionAdvisorAnalysis::Result @@ -138,9 +133,6 @@ RegAllocEvictionAdvisorAnalysis::run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) { // Lazy initialization of the provider. initializeProvider(::Mode, MF.getFunction().getContext()); - auto *MBFI = &MFAM.getResult(MF); - auto *Loops = &MFAM.getResult(MF); - Provider->setAnalyses(MBFI, Loops); return Result{Provider.get()}; } diff --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp index 4174d42892a4a..4e24b16a9c033 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.cpp +++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp @@ -2765,8 +2765,11 @@ bool RAGreedy::runOnMachineFunction(MachineFunction &mf) { : TRI->reverseLocalAssignment(); ExtraInfo.emplace(); - EvictAdvisor = - getAnalysis().getProvider()->getAdvisor(*MF, *this); + + auto &EvictAdvisorProvider = + getAnalysis().getProvider(); + EvictAdvisor = EvictAdvisorProvider->getAdvisor(*MF, *this, MBFI, Loops); + PriorityAdvisor = getAnalysis().getAdvisor(*MF, *this); From e54f2e511a9bc9e843c03ea0a164c4b36c5f65e6 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Tue, 7 Jan 2025 09:38:25 +0000 Subject: [PATCH 08/14] Apply suggestions --- llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h | 6 ++---- llvm/lib/CodeGen/RegAllocGreedy.cpp | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index 781afbc571abb..beb99ba2bc457 100644 --- a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -206,13 +206,11 @@ class RegAllocEvictionAdvisorAnalysisLegacy : public ImmutablePass { static char ID; /// Get an advisor for the given context (i.e. machine function, etc) - std::unique_ptr &getProvider() { - return Provider; - } + RegAllocEvictionAdvisorProvider &getProvider() { return *Provider; } AdvisorMode getAdvisorMode() const { return Mode; } virtual void logRewardIfNeeded(const MachineFunction &MF, - llvm::function_ref GetReward) {}; + function_ref GetReward) {}; protected: // This analysis preserves everything, and subclasses may have additional diff --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp index 4e24b16a9c033..9318c1df0b5e2 100644 --- a/llvm/lib/CodeGen/RegAllocGreedy.cpp +++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp @@ -2768,7 +2768,7 @@ bool RAGreedy::runOnMachineFunction(MachineFunction &mf) { auto &EvictAdvisorProvider = getAnalysis().getProvider(); - EvictAdvisor = EvictAdvisorProvider->getAdvisor(*MF, *this, MBFI, Loops); + EvictAdvisor = EvictAdvisorProvider.getAdvisor(*MF, *this, MBFI, Loops); PriorityAdvisor = getAnalysis().getAdvisor(*MF, *this); From 4e81b5b0b44de76465488cfb0110b3b945a4fd05 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Thu, 9 Jan 2025 09:11:45 +0000 Subject: [PATCH 09/14] Remove initializeMLProvider --- .../llvm/CodeGen/RegAllocEvictionAdvisor.h | 9 +++++--- llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp | 23 ++++++++----------- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 16 ++++++++++--- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index beb99ba2bc457..a6cfe051a1d57 100644 --- a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -266,9 +266,6 @@ class RegAllocEvictionAdvisorAnalysis void initializeProvider(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode Mode, LLVMContext &Ctx); - void - initializeMLProvider(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode Mode, - LLVMContext &Ctx); std::unique_ptr Provider; }; @@ -282,6 +279,12 @@ RegAllocEvictionAdvisorAnalysisLegacy *createReleaseModeAdvisorAnalysisLegacy(); RegAllocEvictionAdvisorAnalysisLegacy * createDevelopmentModeAdvisorAnalysisLegacy(); +RegAllocEvictionAdvisorProvider * +createReleaseModeAdvisorProvider(LLVMContext &Ctx); + +RegAllocEvictionAdvisorProvider * +createDevelopmentModeAdvisorProvider(LLVMContext &Ctx); + // TODO: move to RegAllocEvictionAdvisor.cpp when we move implementation // out of RegAllocGreedy.cpp class DefaultEvictionAdvisor : public RegAllocEvictionAdvisor { diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp index b1728aae7b1fd..ebd87ef8dde8f 100644 --- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp +++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp @@ -1251,22 +1251,17 @@ bool RegAllocScoring::runOnMachineFunction(MachineFunction &MF) { } #endif // #ifdef LLVM_HAVE_TFLITE -void RegAllocEvictionAdvisorAnalysis::initializeMLProvider( - RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode Mode, LLVMContext &Ctx) { - if (Provider) - return; - switch (Mode) { - case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: +RegAllocEvictionAdvisorProvider * +llvm::createReleaseModeAdvisorProvider(LLVMContext &Ctx) { + return new ReleaseModeEvictionAdvisorProvider(Ctx); +} + +RegAllocEvictionAdvisorProvider * +llvm::createDevelopmentModeAdvisorProvider(LLVMContext &Ctx) { #if defined(LLVM_HAVE_TFLITE) - Provider.reset(new DevelopmentModeEvictionAdvisorProvider(Ctx)); + return new DevelopmentModeEvictionAdvisorProvider(Ctx); #endif - break; - case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: - Provider.reset(new ReleaseModeEvictionAdvisorProvider(Ctx)); - break; - default: - break; - } + return nullptr; } RegAllocEvictionAdvisorAnalysisLegacy * diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index 73de74c5aad92..1c65b15f8afd2 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -118,11 +118,21 @@ void RegAllocEvictionAdvisorAnalysis::initializeProvider( RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode Mode, LLVMContext &Ctx) { if (Provider) return; - if (Mode == RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default) + switch (Mode) { + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default: Provider.reset( new DefaultEvictionAdvisorProvider(/*NotAsRequested=*/false, Ctx)); - else - initializeMLProvider(Mode, Ctx); + break; + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: +#if defined(LLVM_HAVE_TFLITE) + Provider.reset(createDevelopmentModeAdvisorProvider(Ctx)); +#endif + break; + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: + Provider.reset(createReleaseModeAdvisorProvider(Ctx)); + break; + } + if (!Provider) Provider.reset( new DefaultEvictionAdvisorProvider(/*NotAsRequested=*/true, Ctx)); From 8ee18ab22cb3a3ed7d41719bd41c387326093cbb Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Thu, 23 Jan 2025 09:03:17 +0000 Subject: [PATCH 10/14] address reviews, use #else --- .../llvm/CodeGen/RegAllocEvictionAdvisor.h | 3 +- llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp | 3 -- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 29 ++++++++++--------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index a6cfe051a1d57..e853446c7d82b 100644 --- a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -20,6 +20,7 @@ #include "llvm/IR/PassManager.h" #include "llvm/MC/MCRegister.h" #include "llvm/Pass.h" +#include "llvm/Support/Compiler.h" namespace llvm { class AllocationOrder; @@ -279,7 +280,7 @@ RegAllocEvictionAdvisorAnalysisLegacy *createReleaseModeAdvisorAnalysisLegacy(); RegAllocEvictionAdvisorAnalysisLegacy * createDevelopmentModeAdvisorAnalysisLegacy(); -RegAllocEvictionAdvisorProvider * +LLVM_ATTRIBUTE_RETURNS_NONNULL RegAllocEvictionAdvisorProvider * createReleaseModeAdvisorProvider(LLVMContext &Ctx); RegAllocEvictionAdvisorProvider * diff --git a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp index ebd87ef8dde8f..1a8e11de909e8 100644 --- a/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp +++ b/llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp @@ -620,9 +620,6 @@ class DevelopmentModeEvictionAdvisorAnalysisLegacy final AU.addRequired(); RegAllocEvictionAdvisorAnalysisLegacy::getAnalysisUsage(AU); } - -private: - // std::unique_ptr Provider; }; #endif // #ifdef LLVM_HAVE_TFLITE diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index 1c65b15f8afd2..d042ca2769431 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -122,20 +122,20 @@ void RegAllocEvictionAdvisorAnalysis::initializeProvider( case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default: Provider.reset( new DefaultEvictionAdvisorProvider(/*NotAsRequested=*/false, Ctx)); - break; + return; case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: #if defined(LLVM_HAVE_TFLITE) Provider.reset(createDevelopmentModeAdvisorProvider(Ctx)); +#else + Provider.reset( + new DefaultEvictionAdvisorProvider(/*NotAsRequested=*/true, Ctx)); #endif - break; + assert(Provider && "EvictionAdvisorProvider cannot be null"); + return; case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: Provider.reset(createReleaseModeAdvisorProvider(Ctx)); - break; + return; } - - if (!Provider) - Provider.reset( - new DefaultEvictionAdvisorProvider(/*NotAsRequested=*/true, Ctx)); } RegAllocEvictionAdvisorAnalysis::Result @@ -151,20 +151,21 @@ Pass *llvm::callDefaultCtor() { Pass *Ret = nullptr; switch (Mode) { case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default: - Ret = new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested*/ false); + return new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested*/ false); + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: + Ret = createReleaseModeAdvisorAnalysisLegacy(); break; case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: #if defined(LLVM_HAVE_TFLITE) Ret = createDevelopmentModeAdvisorAnalysisLegacy(); #endif break; - case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: - Ret = createReleaseModeAdvisorAnalysisLegacy(); - break; } - if (Ret) - return Ret; - return new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested*/ true); + + // release or development mode advisor may not be supported + if (!Ret) + Ret = new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested*/ true); + return Ret; } StringRef RegAllocEvictionAdvisorAnalysisLegacy::getPassName() const { From ebb6a59e6a33a6235c4dcf8dece282f7edd9e89d Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Tue, 11 Feb 2025 06:47:48 +0000 Subject: [PATCH 11/14] Apply AS, remove dead assert --- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index d042ca2769431..b037786f41091 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -130,7 +130,6 @@ void RegAllocEvictionAdvisorAnalysis::initializeProvider( Provider.reset( new DefaultEvictionAdvisorProvider(/*NotAsRequested=*/true, Ctx)); #endif - assert(Provider && "EvictionAdvisorProvider cannot be null"); return; case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: Provider.reset(createReleaseModeAdvisorProvider(Ctx)); @@ -151,20 +150,22 @@ Pass *llvm::callDefaultCtor() { Pass *Ret = nullptr; switch (Mode) { case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default: - return new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested*/ false); + return new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested=*/false); case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: Ret = createReleaseModeAdvisorAnalysisLegacy(); + // release mode advisor may not be supported + if (!Ret) + Ret = new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested=*/true); break; case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: #if defined(LLVM_HAVE_TFLITE) Ret = createDevelopmentModeAdvisorAnalysisLegacy(); +#else + Ret = new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested=*/true); #endif break; } - // release or development mode advisor may not be supported - if (!Ret) - Ret = new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested*/ true); return Ret; } From 112159444a3b633090c63f77ddb07c01fa909e98 Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Wed, 12 Feb 2025 04:26:37 +0000 Subject: [PATCH 12/14] simplify switch case with return --- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 21 ++++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index b037786f41091..2024343a8f60a 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -147,26 +147,25 @@ RegAllocEvictionAdvisorAnalysis::run(MachineFunction &MF, template <> Pass *llvm::callDefaultCtor() { - Pass *Ret = nullptr; switch (Mode) { case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default: return new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested=*/false); - case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: - Ret = createReleaseModeAdvisorAnalysisLegacy(); + case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release: { + Pass *Ret = createReleaseModeAdvisorAnalysisLegacy(); // release mode advisor may not be supported - if (!Ret) - Ret = new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested=*/true); - break; + if (Ret) + return Ret; + return new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested=*/true); + } case RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development: #if defined(LLVM_HAVE_TFLITE) - Ret = createDevelopmentModeAdvisorAnalysisLegacy(); + return createDevelopmentModeAdvisorAnalysisLegacy(); #else - Ret = new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested=*/true); + return new DefaultEvictionAdvisorAnalysisLegacy(/*NotAsRequested=*/true); #endif - break; } - - return Ret; + llvm_unreachable("unexpected advisor mode"); + return nullptr; } StringRef RegAllocEvictionAdvisorAnalysisLegacy::getPassName() const { From 46843235172898f240adfbbdd458fd0b994a6bcb Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Mon, 17 Feb 2025 19:20:24 +0700 Subject: [PATCH 13/14] remove dead return --- llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp index 2024343a8f60a..2369615ef0fb6 100644 --- a/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp +++ b/llvm/lib/CodeGen/RegAllocEvictionAdvisor.cpp @@ -165,7 +165,6 @@ Pass *llvm::callDefaultCtor() { #endif } llvm_unreachable("unexpected advisor mode"); - return nullptr; } StringRef RegAllocEvictionAdvisorAnalysisLegacy::getPassName() const { From ae4a2495b02ba1930eaa22466308e072c3f812cf Mon Sep 17 00:00:00 2001 From: Akshat Oke Date: Tue, 18 Feb 2025 09:31:24 +0000 Subject: [PATCH 14/14] Simplify invalidate as the provider does not store analyses. --- llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h index e853446c7d82b..a14548ff6959e 100644 --- a/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h +++ b/llvm/include/llvm/CodeGen/RegAllocEvictionAdvisor.h @@ -248,16 +248,9 @@ class RegAllocEvictionAdvisorAnalysis bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, MachineFunctionAnalysisManager::Invalidator &Inv) { - auto PAC = PA.getChecker(); - // If we are in default mode, the provider is always valid. - if (Provider->getAdvisorMode() == - RegAllocEvictionAdvisorProvider::AdvisorMode::Default) - return !PAC.preservedWhenStateless(); - // MBFI and Loops are used in release and development modes, so check - // those. - return !PAC.preservedWhenStateless() || - Inv.invalidate(MF, PA) || - Inv.invalidate(MF, PA); + // Provider is stateless and constructed only once. Do not get + // invalidated. + return false; } };