9
9
#ifndef LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H
10
10
#define LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H
11
11
12
+ #include " llvm/CodeGen/MachineBasicBlock.h"
12
13
#include " llvm/CodeGen/RegAllocEvictionAdvisor.h"
13
14
#include " llvm/CodeGen/SlotIndexes.h"
15
+ #include " llvm/IR/PassManager.h"
14
16
#include " llvm/Pass.h"
15
17
16
18
namespace llvm {
@@ -68,20 +70,72 @@ class DummyPriorityAdvisor : public RegAllocPriorityAdvisor {
68
70
unsigned getPriority (const LiveInterval &LI) const override ;
69
71
};
70
72
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 {
72
80
public:
73
81
enum class AdvisorMode : int { Default, Release, Development, Dummy };
74
82
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) {};
77
132
static char ID;
78
133
79
134
// / 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; }
82
136
AdvisorMode getAdvisorMode () const { return Mode; }
83
137
virtual void logRewardIfNeeded (const MachineFunction &MF,
84
- llvm::function_ref<float ()> GetReward){};
138
+ llvm::function_ref<float ()> GetReward) {};
85
139
86
140
protected:
87
141
// This analysis preserves everything, and subclasses may have additional
@@ -90,18 +144,28 @@ class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
90
144
AU.setPreservesAll ();
91
145
}
92
146
147
+ std::unique_ptr<RegAllocPriorityAdvisorProvider> Provider;
148
+
93
149
private:
94
150
StringRef getPassName () const override ;
95
151
const AdvisorMode Mode;
96
152
};
97
153
98
154
// / Specialization for the API used by the analysis infrastructure to create
99
155
// / 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 ();
101
163
102
- RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor ();
164
+ LLVM_ATTRIBUTE_RETURNS_NONNULL RegAllocPriorityAdvisorProvider *
165
+ createReleaseModePriorityAdvisorProvider ();
103
166
104
- RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor ();
167
+ LLVM_ATTRIBUTE_RETURNS_NONNULL RegAllocPriorityAdvisorProvider *
168
+ createDevelopmentModePriorityAdvisorProvider (LLVMContext &Ctx);
105
169
106
170
} // namespace llvm
107
171
0 commit comments