Skip to content

Commit 957dc43

Browse files
authored
[IR] Lazily initialize the class to pass name mapping (NFC) (llvm#96321)
Initializing this map is somewhat expensive (especially for O0), so we currently only do it if certain flags are used. I would like to make use of it for crash dumps (llvm#96078), where we don't know in advance whether it will be needed or not. This patch changes the initialization to a lazy approach, where a callback is registered that does the actual initialization. The callbacks will be run the first time the pass name is requested. This way there is no compile-time impact if the mapping is not used.
1 parent abf5969 commit 957dc43

17 files changed

+32
-44
lines changed

llvm/include/llvm/IR/PassInstrumentation.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ class PassInstrumentationCallbacks {
149149
AnalysesClearedCallbacks.emplace_back(std::move(C));
150150
}
151151

152+
template <typename CallableT>
153+
void registerClassToPassNameCallback(CallableT C) {
154+
ClassToPassNameCallbacks.emplace_back(std::move(C));
155+
}
156+
152157
/// Add a class name to pass name mapping for use by pass instrumentation.
153158
void addClassToPassName(StringRef ClassName, StringRef PassName);
154159
/// Get the pass name for a given pass class name.
@@ -185,6 +190,7 @@ class PassInstrumentationCallbacks {
185190
SmallVector<llvm::unique_function<AnalysesClearedFunc>, 4>
186191
AnalysesClearedCallbacks;
187192

193+
SmallVector<llvm::unique_function<void ()>, 4> ClassToPassNameCallbacks;
188194
DenseMap<StringRef, std::string> ClassToPassName;
189195
};
190196

llvm/include/llvm/Passes/TargetPassRegistry.inc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
#error "must provide <Target>PassRegistry.def"
2222
#endif
2323

24-
if (PopulateClassToPassNames) {
25-
auto *PIC = PB.getPassInstrumentationCallbacks();
26-
24+
auto *PIC = PB.getPassInstrumentationCallbacks();
25+
if (PIC) {
26+
PIC->registerClassToPassNameCallback([PIC]() {
2727
#define ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS) \
2828
PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
2929
#define ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS) \
@@ -69,6 +69,7 @@ if (PopulateClassToPassNames) {
6969
#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
7070
#undef ADD_CLASS_PASS_TO_PASS_NAME
7171
#undef ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS
72+
});
7273
}
7374

7475
#define ADD_PASS(NAME, CREATE_PASS) \

llvm/include/llvm/Target/TargetMachine.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,7 @@ class TargetMachine {
369369

370370
/// Allow the target to modify the pass pipeline.
371371
// TODO: Populate all pass names by using <Target>PassRegistry.def.
372-
virtual void registerPassBuilderCallbacks(PassBuilder &,
373-
bool PopulateClassToPassNames) {}
372+
virtual void registerPassBuilderCallbacks(PassBuilder &) {}
374373

375374
/// Allow the target to register alias analyses with the AAManager for use
376375
/// with the new pass manager. Only affects the "default" AAManager.

llvm/lib/IR/PassInstrumentation.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ void PassInstrumentationCallbacks::addClassToPassName(StringRef ClassName,
2424

2525
StringRef
2626
PassInstrumentationCallbacks::getPassNameForClassName(StringRef ClassName) {
27+
if (!ClassToPassNameCallbacks.empty()) {
28+
for (auto &Fn : ClassToPassNameCallbacks)
29+
Fn();
30+
ClassToPassNameCallbacks.clear();
31+
}
2732
return ClassToPassName[ClassName];
2833
}
2934

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -325,18 +325,6 @@ AnalysisKey NoOpLoopAnalysis::Key;
325325

326326
namespace {
327327

328-
/// Whether or not we should populate a PassInstrumentationCallbacks's class to
329-
/// pass name map.
330-
///
331-
/// This is for optimization purposes so we don't populate it if we never use
332-
/// it. This should be updated if new pass instrumentation wants to use the map.
333-
/// We currently only use this for --print-before/after.
334-
bool shouldPopulateClassToPassNames() {
335-
return PrintPipelinePasses || !printBeforePasses().empty() ||
336-
!printAfterPasses().empty() || !isFilterPassesEmpty() ||
337-
TargetPassConfig::hasLimitedCodeGenPipeline();
338-
}
339-
340328
// A pass for testing -print-on-crash.
341329
// DO NOT USE THIS EXCEPT FOR TESTING!
342330
class TriggerCrashPass : public PassInfoMixin<TriggerCrashPass> {
@@ -416,10 +404,10 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
416404
std::optional<PGOOptions> PGOOpt,
417405
PassInstrumentationCallbacks *PIC)
418406
: TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC) {
419-
bool ShouldPopulateClassToPassNames = PIC && shouldPopulateClassToPassNames();
420407
if (TM)
421-
TM->registerPassBuilderCallbacks(*this, ShouldPopulateClassToPassNames);
422-
if (ShouldPopulateClassToPassNames) {
408+
TM->registerPassBuilderCallbacks(*this);
409+
if (PIC) {
410+
PIC->registerClassToPassNameCallback([PIC]() {
423411
#define MODULE_PASS(NAME, CREATE_PASS) \
424412
PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
425413
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
@@ -453,6 +441,7 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
453441
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
454442
PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
455443
#include "llvm/Passes/MachinePassRegistry.def"
444+
});
456445
}
457446
}
458447

llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,8 +554,7 @@ class AArch64PassConfig : public TargetPassConfig {
554554

555555
} // end anonymous namespace
556556

557-
void AArch64TargetMachine::registerPassBuilderCallbacks(
558-
PassBuilder &PB, bool PopulateClassToPassNames) {
557+
void AArch64TargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
559558

560559
PB.registerLateLoopOptimizationsEPCallback(
561560
[=](LoopPassManager &LPM, OptimizationLevel Level) {

llvm/lib/Target/AArch64/AArch64TargetMachine.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ class AArch64TargetMachine : public LLVMTargetMachine {
4343
// Pass Pipeline Configuration
4444
TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
4545

46-
void registerPassBuilderCallbacks(PassBuilder &PB,
47-
bool PopulateClassToPassNames) override;
46+
void registerPassBuilderCallbacks(PassBuilder &PB) override;
4847

4948
TargetTransformInfo getTargetTransformInfo(const Function &F) const override;
5049

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -658,8 +658,7 @@ Error AMDGPUTargetMachine::buildCodeGenPipeline(
658658
return CGPB.buildPipeline(MPM, Out, DwoOut, FileType);
659659
}
660660

661-
void AMDGPUTargetMachine::registerPassBuilderCallbacks(
662-
PassBuilder &PB, bool PopulateClassToPassNames) {
661+
void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
663662

664663
#define GET_PASS_REGISTRY "AMDGPUPassRegistry.def"
665664
#include "llvm/Passes/TargetPassRegistry.inc"

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ class AMDGPUTargetMachine : public LLVMTargetMachine {
5858
const CGPassBuilderOption &Opts,
5959
PassInstrumentationCallbacks *PIC) override;
6060

61-
void registerPassBuilderCallbacks(PassBuilder &PB,
62-
bool PopulateClassToPassNames) override;
61+
void registerPassBuilderCallbacks(PassBuilder &PB) override;
6362
void registerDefaultAliasAnalyses(AAManager &) override;
6463

6564
/// Get the integer value of a null pointer in the given address space.

llvm/lib/Target/BPF/BPFTargetMachine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ static Expected<bool> parseBPFPreserveStaticOffsetOptions(StringRef Params) {
113113
"BPFPreserveStaticOffsetPass");
114114
}
115115

116-
void BPFTargetMachine::registerPassBuilderCallbacks(
117-
PassBuilder &PB, bool PopulateClassToPassNames) {
116+
void BPFTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
118117
#define GET_PASS_REGISTRY "BPFPassRegistry.def"
119118
#include "llvm/Passes/TargetPassRegistry.inc"
120119

llvm/lib/Target/BPF/BPFTargetMachine.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ class BPFTargetMachine : public LLVMTargetMachine {
4242
return TLOF.get();
4343
}
4444

45-
void registerPassBuilderCallbacks(PassBuilder &PB,
46-
bool PopulateClassToPassNames) override;
45+
void registerPassBuilderCallbacks(PassBuilder &PB) override;
4746
};
4847
}
4948

llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,7 @@ HexagonTargetMachine::getSubtargetImpl(const Function &F) const {
312312
return I.get();
313313
}
314314

315-
void HexagonTargetMachine::registerPassBuilderCallbacks(
316-
PassBuilder &PB, bool PopulateClassToPassNames) {
315+
void HexagonTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
317316
#define GET_PASS_REGISTRY "HexagonPassRegistry.def"
318317
#include "llvm/Passes/TargetPassRegistry.inc"
319318

llvm/lib/Target/Hexagon/HexagonTargetMachine.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ class HexagonTargetMachine : public LLVMTargetMachine {
3535
~HexagonTargetMachine() override;
3636
const HexagonSubtarget *getSubtargetImpl(const Function &F) const override;
3737

38-
void registerPassBuilderCallbacks(PassBuilder &PB,
39-
bool PopulateClassToPassNames) override;
38+
void registerPassBuilderCallbacks(PassBuilder &PB) override;
4039
TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
4140
TargetTransformInfo getTargetTransformInfo(const Function &F) const override;
4241

llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,7 @@ void NVPTXTargetMachine::registerDefaultAliasAnalyses(AAManager &AAM) {
224224
AAM.registerFunctionAnalysis<NVPTXAA>();
225225
}
226226

227-
void NVPTXTargetMachine::registerPassBuilderCallbacks(
228-
PassBuilder &PB, bool PopulateClassToPassNames) {
227+
void NVPTXTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
229228
#define GET_PASS_REGISTRY "NVPTXPassRegistry.def"
230229
#include "llvm/Passes/TargetPassRegistry.inc"
231230

llvm/lib/Target/NVPTX/NVPTXTargetMachine.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ class NVPTXTargetMachine : public LLVMTargetMachine {
6666

6767
void registerDefaultAliasAnalyses(AAManager &AAM) override;
6868

69-
void registerPassBuilderCallbacks(PassBuilder &PB,
70-
bool PopulateClassToPassNames) override;
69+
void registerPassBuilderCallbacks(PassBuilder &PB) override;
7170

7271
TargetTransformInfo getTargetTransformInfo(const Function &F) const override;
7372

llvm/lib/Target/X86/X86CodeGenPassBuilder.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ Error X86CodeGenPassBuilder::addInstSelector(AddMachinePass &addPass) const {
5050

5151
} // namespace
5252

53-
void X86TargetMachine::registerPassBuilderCallbacks(
54-
PassBuilder &PB, bool PopulateClassToPassNames) {
53+
void X86TargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
5554
#define GET_PASS_REGISTRY "X86PassRegistry.def"
5655
#include "llvm/Passes/TargetPassRegistry.inc"
5756
}

llvm/lib/Target/X86/X86TargetMachine.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ class X86TargetMachine final : public LLVMTargetMachine {
6666
SMDiagnostic &Error,
6767
SMRange &SourceRange) const override;
6868

69-
void registerPassBuilderCallbacks(PassBuilder &PB,
70-
bool PopulateClassToPassNames) override;
69+
void registerPassBuilderCallbacks(PassBuilder &PB) override;
7170

7271
Error buildCodeGenPipeline(ModulePassManager &, raw_pwrite_stream &,
7372
raw_pwrite_stream *, CodeGenFileType,

0 commit comments

Comments
 (0)