Skip to content

Commit 5621464

Browse files
authored
[CodeGen][NewPM] Port ReachingDefAnalysis to new pass manager. (#159572)
In this commit: (1) Added new pass manager support for `ReachingDefAnalysis`. (2) Added printer pass. (3) Make old pass manager use `ReachingDefInfoWrapperPass`
1 parent ba49062 commit 5621464

18 files changed

+286
-192
lines changed

llvm/include/llvm/CodeGen/ExecutionDomainFix.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,15 +133,15 @@ class ExecutionDomainFix : public MachineFunctionPass {
133133
using OutRegsInfoMap = SmallVector<LiveRegsDVInfo, 4>;
134134
OutRegsInfoMap MBBOutRegsInfos;
135135

136-
ReachingDefAnalysis *RDA = nullptr;
136+
ReachingDefInfo *RDI = nullptr;
137137

138138
public:
139139
ExecutionDomainFix(char &PassID, const TargetRegisterClass &RC)
140140
: MachineFunctionPass(PassID), RC(&RC), NumRegs(RC.getNumRegs()) {}
141141

142142
void getAnalysisUsage(AnalysisUsage &AU) const override {
143143
AU.setPreservesAll();
144-
AU.addRequired<ReachingDefAnalysis>();
144+
AU.addRequired<ReachingDefInfoWrapperPass>();
145145
MachineFunctionPass::getAnalysisUsage(AU);
146146
}
147147

llvm/include/llvm/CodeGen/ReachingDefAnalysis.h

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "llvm/ADT/TinyPtrVector.h"
2727
#include "llvm/CodeGen/LoopTraversal.h"
2828
#include "llvm/CodeGen/MachineFunctionPass.h"
29+
#include "llvm/CodeGen/MachinePassManager.h"
2930
#include "llvm/InitializePasses.h"
3031

3132
namespace llvm {
@@ -110,7 +111,7 @@ class MBBReachingDefsInfo {
110111
};
111112

112113
/// This class provides the reaching def analysis.
113-
class ReachingDefAnalysis : public MachineFunctionPass {
114+
class ReachingDefInfo {
114115
private:
115116
MachineFunction *MF = nullptr;
116117
const TargetRegisterInfo *TRI = nullptr;
@@ -156,24 +157,16 @@ class ReachingDefAnalysis : public MachineFunctionPass {
156157
using BlockSet = SmallPtrSetImpl<MachineBasicBlock*>;
157158

158159
public:
159-
static char ID; // Pass identification, replacement for typeid
160+
ReachingDefInfo();
161+
ReachingDefInfo(ReachingDefInfo &&);
162+
~ReachingDefInfo();
163+
/// Handle invalidation explicitly.
164+
bool invalidate(MachineFunction &F, const PreservedAnalyses &PA,
165+
MachineFunctionAnalysisManager::Invalidator &);
160166

161-
ReachingDefAnalysis() : MachineFunctionPass(ID) {
162-
initializeReachingDefAnalysisPass(*PassRegistry::getPassRegistry());
163-
}
164-
void releaseMemory() override;
165-
166-
void getAnalysisUsage(AnalysisUsage &AU) const override {
167-
AU.setPreservesAll();
168-
MachineFunctionPass::getAnalysisUsage(AU);
169-
}
170-
171-
void printAllReachingDefs(MachineFunction &MF);
172-
bool runOnMachineFunction(MachineFunction &MF) override;
173-
174-
MachineFunctionProperties getRequiredProperties() const override {
175-
return MachineFunctionProperties().setNoVRegs().setTracksLiveness();
176-
}
167+
void run(MachineFunction &mf);
168+
void print(raw_ostream &OS);
169+
void releaseMemory();
177170

178171
/// Re-run the analysis.
179172
void reset();
@@ -319,6 +312,46 @@ class ReachingDefAnalysis : public MachineFunctionPass {
319312
MachineInstr *getReachingLocalMIDef(MachineInstr *MI, Register Reg) const;
320313
};
321314

315+
class ReachingDefAnalysis : public AnalysisInfoMixin<ReachingDefAnalysis> {
316+
friend AnalysisInfoMixin<ReachingDefAnalysis>;
317+
static AnalysisKey Key;
318+
319+
public:
320+
using Result = ReachingDefInfo;
321+
322+
Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
323+
};
324+
325+
/// Printer pass for the \c ReachingDefInfo results.
326+
class ReachingDefPrinterPass : public PassInfoMixin<ReachingDefPrinterPass> {
327+
raw_ostream &OS;
328+
329+
public:
330+
explicit ReachingDefPrinterPass(raw_ostream &OS) : OS(OS) {}
331+
332+
PreservedAnalyses run(MachineFunction &MF,
333+
MachineFunctionAnalysisManager &MFAM);
334+
335+
static bool isRequired() { return true; }
336+
};
337+
338+
class ReachingDefInfoWrapperPass : public MachineFunctionPass {
339+
ReachingDefInfo RDI;
340+
341+
public:
342+
static char ID;
343+
344+
ReachingDefInfoWrapperPass();
345+
346+
void getAnalysisUsage(AnalysisUsage &AU) const override;
347+
MachineFunctionProperties getRequiredProperties() const override;
348+
bool runOnMachineFunction(MachineFunction &F) override;
349+
void releaseMemory() override { RDI.releaseMemory(); }
350+
351+
ReachingDefInfo &getRDI() { return RDI; }
352+
const ReachingDefInfo &getRDI() const { return RDI; }
353+
};
354+
322355
} // namespace llvm
323356

324357
#endif // LLVM_CODEGEN_REACHINGDEFANALYSIS_H

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ LLVM_ABI void initializePromoteLegacyPassPass(PassRegistry &);
264264
LLVM_ABI void initializeRABasicPass(PassRegistry &);
265265
LLVM_ABI void initializePseudoProbeInserterPass(PassRegistry &);
266266
LLVM_ABI void initializeRAGreedyLegacyPass(PassRegistry &);
267-
LLVM_ABI void initializeReachingDefAnalysisPass(PassRegistry &);
267+
LLVM_ABI void initializeReachingDefInfoWrapperPassPass(PassRegistry &);
268268
LLVM_ABI void initializeReassociateLegacyPassPass(PassRegistry &);
269269
LLVM_ABI void
270270
initializeRegAllocEvictionAdvisorAnalysisLegacyPass(PassRegistry &);

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree",
8282
MACHINE_FUNCTION_ANALYSIS("machine-trace-metrics", MachineTraceMetricsAnalysis())
8383
MACHINE_FUNCTION_ANALYSIS("machine-uniformity", MachineUniformityAnalysis())
8484
MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC))
85+
MACHINE_FUNCTION_ANALYSIS("reaching-def", ReachingDefAnalysis())
8586
MACHINE_FUNCTION_ANALYSIS("regalloc-evict", RegAllocEvictionAdvisorAnalysis())
8687
MACHINE_FUNCTION_ANALYSIS("regalloc-priority", RegAllocPriorityAdvisorAnalysis())
8788
MACHINE_FUNCTION_ANALYSIS("slot-indexes", SlotIndexesAnalysis())
@@ -96,8 +97,7 @@ MACHINE_FUNCTION_ANALYSIS("virtregmap", VirtRegMapAnalysis())
9697
// MachinePostDominatorTreeAnalysis())
9798
// MACHINE_FUNCTION_ANALYSIS("machine-region-info",
9899
// MachineRegionInfoPassAnalysis())
99-
// MACHINE_FUNCTION_ANALYSIS("reaching-def",
100-
// ReachingDefAnalysisAnalysis()) MACHINE_FUNCTION_ANALYSIS("gc-analysis",
100+
// MACHINE_FUNCTION_ANALYSIS("gc-analysis",
101101
// GCMachineCodeAnalysisPass())
102102
#undef MACHINE_FUNCTION_ANALYSIS
103103

@@ -151,6 +151,7 @@ MACHINE_FUNCTION_PASS("print<machine-post-dom-tree>",
151151
MachinePostDominatorTreePrinterPass(errs()))
152152
MACHINE_FUNCTION_PASS("print<machine-uniformity>",
153153
MachineUniformityPrinterPass(errs()))
154+
MACHINE_FUNCTION_PASS("print<reaching-def>", ReachingDefPrinterPass(errs()))
154155
MACHINE_FUNCTION_PASS("print<slot-indexes>", SlotIndexesPrinterPass(errs()))
155156
MACHINE_FUNCTION_PASS("print<virtregmap>", VirtRegMapPrinterPass(errs()))
156157
MACHINE_FUNCTION_PASS("process-imp-defs", ProcessImplicitDefsPass())

llvm/lib/CodeGen/BreakFalseDeps.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class BreakFalseDeps : public MachineFunctionPass {
4646
/// Storage for register unit liveness.
4747
LivePhysRegs LiveRegSet;
4848

49-
ReachingDefAnalysis *RDA = nullptr;
49+
ReachingDefInfo *RDI = nullptr;
5050

5151
public:
5252
static char ID; // Pass identification, replacement for typeid
@@ -57,7 +57,7 @@ class BreakFalseDeps : public MachineFunctionPass {
5757

5858
void getAnalysisUsage(AnalysisUsage &AU) const override {
5959
AU.setPreservesAll();
60-
AU.addRequired<ReachingDefAnalysis>();
60+
AU.addRequired<ReachingDefInfoWrapperPass>();
6161
MachineFunctionPass::getAnalysisUsage(AU);
6262
}
6363

@@ -101,7 +101,7 @@ class BreakFalseDeps : public MachineFunctionPass {
101101

102102
char BreakFalseDeps::ID = 0;
103103
INITIALIZE_PASS_BEGIN(BreakFalseDeps, DEBUG_TYPE, "BreakFalseDeps", false, false)
104-
INITIALIZE_PASS_DEPENDENCY(ReachingDefAnalysis)
104+
INITIALIZE_PASS_DEPENDENCY(ReachingDefInfoWrapperPass)
105105
INITIALIZE_PASS_END(BreakFalseDeps, DEBUG_TYPE, "BreakFalseDeps", false, false)
106106

107107
FunctionPass *llvm::createBreakFalseDeps() { return new BreakFalseDeps(); }
@@ -153,7 +153,7 @@ bool BreakFalseDeps::pickBestRegisterForUndef(MachineInstr *MI, unsigned OpIdx,
153153
unsigned MaxClearanceReg = OriginalReg;
154154
ArrayRef<MCPhysReg> Order = RegClassInfo.getOrder(OpRC);
155155
for (MCPhysReg Reg : Order) {
156-
unsigned Clearance = RDA->getClearance(MI, Reg);
156+
unsigned Clearance = RDI->getClearance(MI, Reg);
157157
if (Clearance <= MaxClearance)
158158
continue;
159159
MaxClearance = Clearance;
@@ -173,7 +173,7 @@ bool BreakFalseDeps::pickBestRegisterForUndef(MachineInstr *MI, unsigned OpIdx,
173173
bool BreakFalseDeps::shouldBreakDependence(MachineInstr *MI, unsigned OpIdx,
174174
unsigned Pref) {
175175
MCRegister Reg = MI->getOperand(OpIdx).getReg().asMCReg();
176-
unsigned Clearance = RDA->getClearance(MI, Reg);
176+
unsigned Clearance = RDI->getClearance(MI, Reg);
177177
LLVM_DEBUG(dbgs() << "Clearance: " << Clearance << ", want " << Pref);
178178

179179
if (Pref > Clearance) {
@@ -282,7 +282,7 @@ bool BreakFalseDeps::runOnMachineFunction(MachineFunction &mf) {
282282
MF = &mf;
283283
TII = MF->getSubtarget().getInstrInfo();
284284
TRI = MF->getSubtarget().getRegisterInfo();
285-
RDA = &getAnalysis<ReachingDefAnalysis>();
285+
RDI = &getAnalysis<ReachingDefInfoWrapperPass>().getRDI();
286286

287287
RegClassInfo.runOnMachineFunction(mf, /*Rev=*/true);
288288

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
112112
initializeProcessImplicitDefsLegacyPass(Registry);
113113
initializeRABasicPass(Registry);
114114
initializeRAGreedyLegacyPass(Registry);
115+
initializeReachingDefInfoWrapperPassPass(Registry);
115116
initializeRegAllocFastPass(Registry);
116117
initializeRegUsageInfoCollectorLegacyPass(Registry);
117118
initializeRegUsageInfoPropagationLegacyPass(Registry);

llvm/lib/CodeGen/ExecutionDomainFix.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,9 @@ void ExecutionDomainFix::visitSoftInstr(MachineInstr *mi, unsigned mask) {
337337
}
338338
// Sorted insertion.
339339
// Enables giving priority to the latest domains during merging.
340-
const int Def = RDA->getReachingDef(mi, RC->getRegister(rx));
340+
const int Def = RDI->getReachingDef(mi, RC->getRegister(rx));
341341
auto I = partition_point(Regs, [&](int I) {
342-
return RDA->getReachingDef(mi, RC->getRegister(I)) <= Def;
342+
return RDI->getReachingDef(mi, RC->getRegister(I)) <= Def;
343343
});
344344
Regs.insert(I, rx);
345345
}
@@ -435,7 +435,7 @@ bool ExecutionDomainFix::runOnMachineFunction(MachineFunction &mf) {
435435
if (!anyregs)
436436
return false;
437437

438-
RDA = &getAnalysis<ReachingDefAnalysis>();
438+
RDI = &getAnalysis<ReachingDefInfoWrapperPass>().getRDI();
439439

440440
// Initialize the AliasMap on the first use.
441441
if (AliasMap.empty()) {

0 commit comments

Comments
 (0)