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,80 @@ 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
+ llvm::function_ref<float ()> GetReward) {};
89
+
90
+ virtual std::unique_ptr<RegAllocPriorityAdvisor>
91
+ getAdvisor (const MachineFunction &MF, const RAGreedy &RA) = 0 ;
92
+
93
+ void setAnalyses (SlotIndexes *SI) { this ->SI = SI; }
94
+
95
+ AdvisorMode getAdvisorMode () const { return Mode; }
96
+
97
+ protected:
98
+ SlotIndexes *SI;
99
+
100
+ private:
101
+ const AdvisorMode Mode;
102
+ };
103
+
104
+ RegAllocPriorityAdvisorProvider *createReleaseModePriorityAdvisorProvider ();
105
+
106
+ RegAllocPriorityAdvisorProvider *
107
+ createDevelopmentModePriorityAdvisorProvider (LLVMContext &Ctx);
108
+
109
+ class RegAllocPriorityAdvisorAnalysis
110
+ : public AnalysisInfoMixin<RegAllocPriorityAdvisorAnalysis> {
111
+ static AnalysisKey Key;
112
+ friend AnalysisInfoMixin<RegAllocPriorityAdvisorAnalysis>;
113
+
114
+ public:
115
+ struct Result {
116
+ // Owned by this analysis.
117
+ RegAllocPriorityAdvisorProvider *Provider;
118
+
119
+ bool invalidate (MachineFunction &MF, const PreservedAnalyses &PA,
120
+ MachineFunctionAnalysisManager::Invalidator &Inv) {
121
+ auto PAC = PA.getChecker <RegAllocPriorityAdvisorAnalysis>();
122
+ return !PAC.preservedWhenStateless () ||
123
+ Inv.invalidate <SlotIndexesAnalysis>(MF, PA);
124
+ }
125
+ };
126
+
127
+ Result run (MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
128
+
129
+ private:
130
+ void initializeProvider (LLVMContext &Ctx);
131
+ std::unique_ptr<RegAllocPriorityAdvisorProvider> Provider;
132
+ };
133
+
134
+ class RegAllocPriorityAdvisorAnalysisLegacy : public ImmutablePass {
135
+ public:
136
+ using AdvisorMode = RegAllocPriorityAdvisorProvider::AdvisorMode;
137
+ RegAllocPriorityAdvisorAnalysisLegacy (AdvisorMode Mode)
138
+ : ImmutablePass(ID), Mode(Mode) {};
77
139
static char ID;
78
140
79
141
// / Get an advisor for the given context (i.e. machine function, etc)
80
142
virtual std::unique_ptr<RegAllocPriorityAdvisor>
81
143
getAdvisor (const MachineFunction &MF, const RAGreedy &RA) = 0 ;
82
144
AdvisorMode getAdvisorMode () const { return Mode; }
83
145
virtual void logRewardIfNeeded (const MachineFunction &MF,
84
- llvm::function_ref<float ()> GetReward){};
146
+ llvm::function_ref<float ()> GetReward) {};
85
147
86
148
protected:
87
149
// This analysis preserves everything, and subclasses may have additional
@@ -97,11 +159,13 @@ class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
97
159
98
160
// / Specialization for the API used by the analysis infrastructure to create
99
161
// / an instance of the priority advisor.
100
- template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysis >();
162
+ template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysisLegacy >();
101
163
102
- RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor ();
164
+ RegAllocPriorityAdvisorAnalysisLegacy *
165
+ createReleaseModePriorityAdvisorAnalysis ();
103
166
104
- RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor ();
167
+ RegAllocPriorityAdvisorAnalysisLegacy *
168
+ createDevelopmentModePriorityAdvisorAnalysis ();
105
169
106
170
} // namespace llvm
107
171
0 commit comments