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 {
@@ -56,20 +58,81 @@ class DefaultPriorityAdvisor : public RegAllocPriorityAdvisor {
5658 unsigned getPriority (const LiveInterval &LI) const override ;
5759};
5860
59- class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
61+ // / Common provider for getting the priority advisor and logging rewards.
62+ // / Legacy analysis forwards all calls to this provider.
63+ // / New analysis serves the provider as the analysis result.
64+ // / Expensive setup is done in the constructor, so that the advisor can be
65+ // / created quickly for every machine function.
66+ // / TODO: Remove once legacy PM support is dropped.
67+ class RegAllocPriorityAdvisorProvider {
6068public:
6169 enum class AdvisorMode : int { Default, Release, Development };
6270
63- RegAllocPriorityAdvisorAnalysis (AdvisorMode Mode)
64- : ImmutablePass(ID), Mode(Mode){};
71+ RegAllocPriorityAdvisorProvider (AdvisorMode Mode) : Mode(Mode) {}
72+
73+ virtual ~RegAllocPriorityAdvisorProvider () = default ;
74+
75+ virtual void logRewardIfNeeded (const MachineFunction &MF,
76+ llvm::function_ref<float ()> GetReward) {};
77+
78+ virtual std::unique_ptr<RegAllocPriorityAdvisor>
79+ getAdvisor (const MachineFunction &MF, const RAGreedy &RA) = 0 ;
80+
81+ void setAnalyses (SlotIndexes *SI) { this ->SI = SI; }
82+
83+ AdvisorMode getAdvisorMode () const { return Mode; }
84+
85+ protected:
86+ SlotIndexes *SI;
87+
88+ private:
89+ const AdvisorMode Mode;
90+ };
91+
92+ RegAllocPriorityAdvisorProvider *createReleaseModePriorityAdvisorProvider ();
93+
94+ RegAllocPriorityAdvisorProvider *
95+ createDevelopmentModePriorityAdvisorProvider (LLVMContext &Ctx);
96+
97+ class RegAllocPriorityAdvisorAnalysis
98+ : public AnalysisInfoMixin<RegAllocPriorityAdvisorAnalysis> {
99+ static AnalysisKey Key;
100+ friend AnalysisInfoMixin<RegAllocPriorityAdvisorAnalysis>;
101+
102+ public:
103+ struct Result {
104+ // Owned by this analysis.
105+ RegAllocPriorityAdvisorProvider *Provider;
106+
107+ bool invalidate (MachineFunction &MF, const PreservedAnalyses &PA,
108+ MachineFunctionAnalysisManager::Invalidator &Inv) {
109+ auto PAC = PA.getChecker <RegAllocPriorityAdvisorAnalysis>();
110+ return !PAC.preservedWhenStateless () ||
111+ Inv.invalidate <SlotIndexesAnalysis>(MF, PA);
112+ }
113+ };
114+
115+ Result run (MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
116+
117+ private:
118+ void initializeProvider (LLVMContext &Ctx);
119+ std::unique_ptr<RegAllocPriorityAdvisorProvider> Provider;
120+ };
121+
122+ class RegAllocPriorityAdvisorAnalysisLegacy : public ImmutablePass {
123+ public:
124+ enum class AdvisorMode : int { Default, Release, Development };
125+
126+ RegAllocPriorityAdvisorAnalysisLegacy (AdvisorMode Mode)
127+ : ImmutablePass(ID), Mode(Mode) {};
65128 static char ID;
66129
67130 // / Get an advisor for the given context (i.e. machine function, etc)
68131 virtual std::unique_ptr<RegAllocPriorityAdvisor>
69132 getAdvisor (const MachineFunction &MF, const RAGreedy &RA) = 0 ;
70133 AdvisorMode getAdvisorMode () const { return Mode; }
71134 virtual void logRewardIfNeeded (const MachineFunction &MF,
72- llvm::function_ref<float ()> GetReward){};
135+ llvm::function_ref<float ()> GetReward) {};
73136
74137protected:
75138 // This analysis preserves everything, and subclasses may have additional
@@ -85,11 +148,13 @@ class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
85148
86149// / Specialization for the API used by the analysis infrastructure to create
87150// / an instance of the priority advisor.
88- template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysis >();
151+ template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysisLegacy >();
89152
90- RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor ();
153+ RegAllocPriorityAdvisorAnalysisLegacy *
154+ createReleaseModePriorityAdvisorAnalysis ();
91155
92- RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor ();
156+ RegAllocPriorityAdvisorAnalysisLegacy *
157+ createDevelopmentModePriorityAdvisorAnalysis ();
93158
94159} // namespace llvm
95160
0 commit comments