Skip to content

Commit a5c1a65

Browse files
committed
[CodeGen][NewPM] Port RegAllocPriorityAdvisor analysis to NPM
1 parent 3a0e62f commit a5c1a65

10 files changed

+320
-120
lines changed

llvm/lib/CodeGen/RegAllocPriorityAdvisor.h renamed to llvm/include/llvm/CodeGen/RegAllocPriorityAdvisor.h

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
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

1618
namespace llvm {
@@ -68,20 +70,80 @@ 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 {
7280
public:
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+
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) {};
77139
static char ID;
78140

79141
/// Get an advisor for the given context (i.e. machine function, etc)
80142
virtual std::unique_ptr<RegAllocPriorityAdvisor>
81143
getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0;
82144
AdvisorMode getAdvisorMode() const { return Mode; }
83145
virtual void logRewardIfNeeded(const MachineFunction &MF,
84-
llvm::function_ref<float()> GetReward){};
146+
llvm::function_ref<float()> GetReward) {};
85147

86148
protected:
87149
// This analysis preserves everything, and subclasses may have additional
@@ -97,11 +159,13 @@ class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
97159

98160
/// Specialization for the API used by the analysis infrastructure to create
99161
/// an instance of the priority advisor.
100-
template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysis>();
162+
template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysisLegacy>();
101163

102-
RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor();
164+
RegAllocPriorityAdvisorAnalysisLegacy *
165+
createReleaseModePriorityAdvisorAnalysis();
103166

104-
RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor();
167+
RegAllocPriorityAdvisorAnalysisLegacy *
168+
createDevelopmentModePriorityAdvisorAnalysis();
105169

106170
} // namespace llvm
107171

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ void initializeReachingDefAnalysisPass(PassRegistry &);
255255
void initializeReassociateLegacyPassPass(PassRegistry &);
256256
void initializeRegAllocEvictionAdvisorAnalysisLegacyPass(PassRegistry &);
257257
void initializeRegAllocFastPass(PassRegistry &);
258-
void initializeRegAllocPriorityAdvisorAnalysisPass(PassRegistry &);
258+
void initializeRegAllocPriorityAdvisorAnalysisLegacyPass(PassRegistry &);
259259
void initializeRegAllocScoringPass(PassRegistry &);
260260
void initializeRegBankSelectPass(PassRegistry &);
261261
void initializeRegToMemWrapperPassPass(PassRegistry &);

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree",
115115
MACHINE_FUNCTION_ANALYSIS("machine-trace-metrics", MachineTraceMetricsAnalysis())
116116
MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC))
117117
MACHINE_FUNCTION_ANALYSIS("regalloc-evict", RegAllocEvictionAdvisorAnalysis())
118+
MACHINE_FUNCTION_ANALYSIS("regalloc-priority", RegAllocPriorityAdvisorAnalysis())
118119
MACHINE_FUNCTION_ANALYSIS("slot-indexes", SlotIndexesAnalysis())
119120
MACHINE_FUNCTION_ANALYSIS("spill-code-placement", SpillPlacementAnalysis())
120121
MACHINE_FUNCTION_ANALYSIS("virtregmap", VirtRegMapAnalysis())

llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class RegAllocScoring : public MachineFunctionPass {
116116
void getAnalysisUsage(AnalysisUsage &AU) const override {
117117
AU.setPreservesAll();
118118
AU.addRequired<RegAllocEvictionAdvisorAnalysisLegacy>();
119-
AU.addRequired<RegAllocPriorityAdvisorAnalysis>();
119+
AU.addRequired<RegAllocPriorityAdvisorAnalysisLegacy>();
120120
AU.addRequired<MachineBlockFrequencyInfoWrapperPass>();
121121
MachineFunctionPass::getAnalysisUsage(AU);
122122
}
@@ -1242,8 +1242,8 @@ bool RegAllocScoring::runOnMachineFunction(MachineFunction &MF) {
12421242

12431243
getAnalysis<RegAllocEvictionAdvisorAnalysisLegacy>().logRewardIfNeeded(
12441244
MF, GetReward);
1245-
getAnalysis<RegAllocPriorityAdvisorAnalysis>().logRewardIfNeeded(MF,
1246-
GetReward);
1245+
getAnalysis<RegAllocPriorityAdvisorAnalysisLegacy>().logRewardIfNeeded(
1246+
MF, GetReward);
12471247
return false;
12481248
}
12491249
#endif // #ifdef LLVM_HAVE_TFLITE

0 commit comments

Comments
 (0)