Skip to content

Commit 41013be

Browse files
committed
[CodeGen][NewPM] Port RegAllocPriorityAdvisor analysis to NPM
1 parent 2103b92 commit 41013be

10 files changed

+294
-112
lines changed

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

Lines changed: 72 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 {
@@ -56,20 +58,81 @@ class DefaultPriorityAdvisor : public RegAllocPriorityAdvisor {
5658
unsigned getPriority(const LiveInterval &LI) const override;
5759
};
5860

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 {
6068
public:
6169
enum class AdvisorMode : int { Default, Release, Development };
6270

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) {};
65128
static char ID;
66129

67130
/// Get an advisor for the given context (i.e. machine function, etc)
68131
virtual std::unique_ptr<RegAllocPriorityAdvisor>
69132
getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0;
70133
AdvisorMode getAdvisorMode() const { return Mode; }
71134
virtual void logRewardIfNeeded(const MachineFunction &MF,
72-
llvm::function_ref<float()> GetReward){};
135+
llvm::function_ref<float()> GetReward) {};
73136

74137
protected:
75138
// This analysis preserves everything, and subclasses may have additional
@@ -85,11 +148,13 @@ class RegAllocPriorityAdvisorAnalysis : public ImmutablePass {
85148

86149
/// Specialization for the API used by the analysis infrastructure to create
87150
/// an instance of the priority advisor.
88-
template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysis>();
151+
template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysisLegacy>();
89152

90-
RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor();
153+
RegAllocPriorityAdvisorAnalysisLegacy *
154+
createReleaseModePriorityAdvisorAnalysis();
91155

92-
RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor();
156+
RegAllocPriorityAdvisorAnalysisLegacy *
157+
createDevelopmentModePriorityAdvisorAnalysis();
93158

94159
} // namespace llvm
95160

llvm/include/llvm/InitializePasses.h

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

llvm/include/llvm/Passes/MachinePassRegistry.def

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

llvm/lib/CodeGen/MLRegAllocEvictAdvisor.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class RegAllocScoring : public MachineFunctionPass {
109109
void getAnalysisUsage(AnalysisUsage &AU) const override {
110110
AU.setPreservesAll();
111111
AU.addRequired<RegAllocEvictionAdvisorAnalysisLegacy>();
112-
AU.addRequired<RegAllocPriorityAdvisorAnalysis>();
112+
AU.addRequired<RegAllocPriorityAdvisorAnalysisLegacy>();
113113
AU.addRequired<MachineBlockFrequencyInfoWrapperPass>();
114114
MachineFunctionPass::getAnalysisUsage(AU);
115115
}
@@ -1218,8 +1218,8 @@ bool RegAllocScoring::runOnMachineFunction(MachineFunction &MF) {
12181218

12191219
getAnalysis<RegAllocEvictionAdvisorAnalysisLegacy>().logRewardIfNeeded(
12201220
MF, GetReward);
1221-
getAnalysis<RegAllocPriorityAdvisorAnalysis>().logRewardIfNeeded(MF,
1222-
GetReward);
1221+
getAnalysis<RegAllocPriorityAdvisorAnalysisLegacy>().logRewardIfNeeded(
1222+
MF, GetReward);
12231223
return false;
12241224
}
12251225
#endif // #ifdef LLVM_HAVE_TFLITE

0 commit comments

Comments
 (0)