Skip to content

Commit 557628d

Browse files
authored
[CodeGen][NewPM] Port RegAllocPriorityAdvisor analysis to NPM (#118462)
Similar to #117309. The advisor and logger are accessed through the provider, which is served by the new PM. Legacy PM forwards calls to the provider. New PM is a machine function analysis that lazily initializes the provider.
1 parent c58011d commit 557628d

10 files changed

+314
-132
lines changed

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

Lines changed: 73 additions & 9 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,72 @@ 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+
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) {};
77132
static char ID;
78133

79134
/// 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; }
82136
AdvisorMode getAdvisorMode() const { return Mode; }
83137
virtual void logRewardIfNeeded(const MachineFunction &MF,
84-
llvm::function_ref<float()> GetReward){};
138+
llvm::function_ref<float()> GetReward) {};
85139

86140
protected:
87141
// This analysis preserves everything, and subclasses may have additional
@@ -90,18 +144,28 @@ class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
90144
AU.setPreservesAll();
91145
}
92146

147+
std::unique_ptr<RegAllocPriorityAdvisorProvider> Provider;
148+
93149
private:
94150
StringRef getPassName() const override;
95151
const AdvisorMode Mode;
96152
};
97153

98154
/// Specialization for the API used by the analysis infrastructure to create
99155
/// 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();
101163

102-
RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor();
164+
LLVM_ATTRIBUTE_RETURNS_NONNULL RegAllocPriorityAdvisorProvider *
165+
createReleaseModePriorityAdvisorProvider();
103166

104-
RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor();
167+
LLVM_ATTRIBUTE_RETURNS_NONNULL RegAllocPriorityAdvisorProvider *
168+
createDevelopmentModePriorityAdvisorProvider(LLVMContext &Ctx);
105169

106170
} // namespace llvm
107171

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ void initializeReachingDefAnalysisPass(PassRegistry &);
253253
void initializeReassociateLegacyPassPass(PassRegistry &);
254254
void initializeRegAllocEvictionAdvisorAnalysisLegacyPass(PassRegistry &);
255255
void initializeRegAllocFastPass(PassRegistry &);
256-
void initializeRegAllocPriorityAdvisorAnalysisPass(PassRegistry &);
256+
void initializeRegAllocPriorityAdvisorAnalysisLegacyPass(PassRegistry &);
257257
void initializeRegAllocScoringPass(PassRegistry &);
258258
void initializeRegBankSelectPass(PassRegistry &);
259259
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)