99#ifndef LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H
1010#define LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H
1111
12+ #include " llvm/CodeGen/MachineBasicBlock.h"
1213#include " llvm/CodeGen/RegAllocEvictionAdvisor.h"
1314#include " llvm/CodeGen/SlotIndexes.h"
15+ #include " llvm/IR/PassManager.h"
1416#include " llvm/Pass.h"
1517
1618namespace llvm {
@@ -68,20 +70,72 @@ class DummyPriorityAdvisor : public RegAllocPriorityAdvisor {
6870 unsigned getPriority (const LiveInterval &LI) const override ;
6971};
7072
71- class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
73+ // / Common provider for getting the priority advisor and logging rewards.
74+ // / Legacy analysis forwards all calls to this provider.
75+ // / New analysis serves the provider as the analysis result.
76+ // / Expensive setup is done in the constructor, so that the advisor can be
77+ // / created quickly for every machine function.
78+ // / TODO: Remove once legacy PM support is dropped.
79+ class RegAllocPriorityAdvisorProvider {
7280public:
7381 enum class AdvisorMode : int { Default, Release, Development, Dummy };
7482
75- RegAllocPriorityAdvisorAnalysis (AdvisorMode Mode)
76- : ImmutablePass(ID), Mode(Mode){};
83+ RegAllocPriorityAdvisorProvider (AdvisorMode Mode) : Mode(Mode) {}
84+
85+ virtual ~RegAllocPriorityAdvisorProvider () = default ;
86+
87+ virtual void logRewardIfNeeded (const MachineFunction &MF,
88+ function_ref<float ()> GetReward) {};
89+
90+ virtual std::unique_ptr<RegAllocPriorityAdvisor>
91+ getAdvisor (const MachineFunction &MF, const RAGreedy &RA,
92+ SlotIndexes &SI) = 0 ;
93+
94+ AdvisorMode getAdvisorMode () const { return Mode; }
95+
96+ private:
97+ const AdvisorMode Mode;
98+ };
99+
100+ class RegAllocPriorityAdvisorAnalysis
101+ : public AnalysisInfoMixin<RegAllocPriorityAdvisorAnalysis> {
102+ static AnalysisKey Key;
103+ friend AnalysisInfoMixin<RegAllocPriorityAdvisorAnalysis>;
104+
105+ public:
106+ struct Result {
107+ // Owned by this analysis.
108+ RegAllocPriorityAdvisorProvider *Provider;
109+
110+ bool invalidate (MachineFunction &MF, const PreservedAnalyses &PA,
111+ MachineFunctionAnalysisManager::Invalidator &Inv) {
112+ auto PAC = PA.getChecker <RegAllocPriorityAdvisorAnalysis>();
113+ return !PAC.preservedWhenStateless () ||
114+ Inv.invalidate <SlotIndexesAnalysis>(MF, PA);
115+ }
116+ };
117+
118+ Result run (MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
119+
120+ private:
121+ void initializeProvider (LLVMContext &Ctx);
122+ void initializeMLProvider (RegAllocPriorityAdvisorProvider::AdvisorMode Mode,
123+ LLVMContext &Ctx);
124+ std::unique_ptr<RegAllocPriorityAdvisorProvider> Provider;
125+ };
126+
127+ class RegAllocPriorityAdvisorAnalysisLegacy : public ImmutablePass {
128+ public:
129+ using AdvisorMode = RegAllocPriorityAdvisorProvider::AdvisorMode;
130+ RegAllocPriorityAdvisorAnalysisLegacy (AdvisorMode Mode)
131+ : ImmutablePass(ID), Mode(Mode) {};
77132 static char ID;
78133
79134 // / Get an advisor for the given context (i.e. machine function, etc)
80- virtual std::unique_ptr<RegAllocPriorityAdvisor>
81- getAdvisor (const MachineFunction &MF, const RAGreedy &RA) = 0 ;
135+ RegAllocPriorityAdvisorProvider &getProvider () { return *Provider; }
82136 AdvisorMode getAdvisorMode () const { return Mode; }
83137 virtual void logRewardIfNeeded (const MachineFunction &MF,
84- llvm::function_ref<float ()> GetReward){};
138+ llvm::function_ref<float ()> GetReward) {};
85139
86140protected:
87141 // This analysis preserves everything, and subclasses may have additional
@@ -90,18 +144,28 @@ class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
90144 AU.setPreservesAll ();
91145 }
92146
147+ std::unique_ptr<RegAllocPriorityAdvisorProvider> Provider;
148+
93149private:
94150 StringRef getPassName () const override ;
95151 const AdvisorMode Mode;
96152};
97153
98154// / Specialization for the API used by the analysis infrastructure to create
99155// / an instance of the priority advisor.
100- template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysis>();
156+ template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysisLegacy>();
157+
158+ RegAllocPriorityAdvisorAnalysisLegacy *
159+ createReleaseModePriorityAdvisorAnalysis ();
160+
161+ RegAllocPriorityAdvisorAnalysisLegacy *
162+ createDevelopmentModePriorityAdvisorAnalysis ();
101163
102- RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor ();
164+ LLVM_ATTRIBUTE_RETURNS_NONNULL RegAllocPriorityAdvisorProvider *
165+ createReleaseModePriorityAdvisorProvider ();
103166
104- RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor ();
167+ LLVM_ATTRIBUTE_RETURNS_NONNULL RegAllocPriorityAdvisorProvider *
168+ createDevelopmentModePriorityAdvisorProvider (LLVMContext &Ctx);
105169
106170} // namespace llvm
107171
0 commit comments