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 {
@@ -56,20 +58,81 @@ class DefaultPriorityAdvisor : public RegAllocPriorityAdvisor {
56
58
unsigned getPriority (const LiveInterval &LI) const override ;
57
59
};
58
60
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 {
60
68
public:
61
69
enum class AdvisorMode : int { Default, Release, Development };
62
70
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) {};
65
128
static char ID;
66
129
67
130
// / Get an advisor for the given context (i.e. machine function, etc)
68
131
virtual std::unique_ptr<RegAllocPriorityAdvisor>
69
132
getAdvisor (const MachineFunction &MF, const RAGreedy &RA) = 0 ;
70
133
AdvisorMode getAdvisorMode () const { return Mode; }
71
134
virtual void logRewardIfNeeded (const MachineFunction &MF,
72
- llvm::function_ref<float ()> GetReward){};
135
+ llvm::function_ref<float ()> GetReward) {};
73
136
74
137
protected:
75
138
// This analysis preserves everything, and subclasses may have additional
@@ -85,11 +148,13 @@ class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
85
148
86
149
// / Specialization for the API used by the analysis infrastructure to create
87
150
// / an instance of the priority advisor.
88
- template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysis >();
151
+ template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysisLegacy >();
89
152
90
- RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor ();
153
+ RegAllocPriorityAdvisorAnalysisLegacy *
154
+ createReleaseModePriorityAdvisorAnalysis ();
91
155
92
- RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor ();
156
+ RegAllocPriorityAdvisorAnalysisLegacy *
157
+ createDevelopmentModePriorityAdvisorAnalysis ();
93
158
94
159
} // namespace llvm
95
160
0 commit comments