File indexing completed on 2026-05-10 08:44:23
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef LLVM_PASSES_PASSBUILDER_H
0016 #define LLVM_PASSES_PASSBUILDER_H
0017
0018 #include "llvm/Analysis/CGSCCPassManager.h"
0019 #include "llvm/CodeGen/MachinePassManager.h"
0020 #include "llvm/CodeGen/RegAllocCommon.h"
0021 #include "llvm/IR/PassManager.h"
0022 #include "llvm/Passes/OptimizationLevel.h"
0023 #include "llvm/Support/Error.h"
0024 #include "llvm/Support/PGOOptions.h"
0025 #include "llvm/Support/raw_ostream.h"
0026 #include "llvm/Transforms/IPO/Inliner.h"
0027 #include "llvm/Transforms/IPO/ModuleInliner.h"
0028 #include "llvm/Transforms/Scalar/LoopPassManager.h"
0029 #include <optional>
0030 #include <vector>
0031
0032 namespace llvm {
0033 class StringRef;
0034 class AAManager;
0035 class TargetMachine;
0036 class ModuleSummaryIndex;
0037 template <typename T> class IntrusiveRefCntPtr;
0038 namespace vfs {
0039 class FileSystem;
0040 }
0041
0042
0043 class PipelineTuningOptions {
0044 public:
0045
0046
0047 PipelineTuningOptions();
0048
0049
0050 bool LoopInterleaving;
0051
0052
0053
0054 bool LoopVectorization;
0055
0056
0057
0058 bool SLPVectorization;
0059
0060
0061 bool LoopUnrolling;
0062
0063
0064
0065 bool ForgetAllSCEVInLoopUnroll;
0066
0067
0068
0069 unsigned LicmMssaOptCap;
0070
0071
0072
0073 unsigned LicmMssaNoAccForPromotionCap;
0074
0075
0076
0077 bool CallGraphProfile;
0078
0079
0080 bool UnifiedLTO;
0081
0082
0083
0084 bool MergeFunctions;
0085
0086
0087 int InlinerThreshold;
0088
0089
0090
0091
0092
0093
0094
0095
0096 bool EagerlyInvalidateAnalyses;
0097 };
0098
0099
0100
0101
0102
0103
0104
0105 class PassBuilder {
0106 TargetMachine *TM;
0107 PipelineTuningOptions PTO;
0108 std::optional<PGOOptions> PGOOpt;
0109 PassInstrumentationCallbacks *PIC;
0110
0111 public:
0112
0113
0114
0115
0116
0117
0118
0119
0120 struct PipelineElement {
0121 StringRef Name;
0122 std::vector<PipelineElement> InnerPipeline;
0123 };
0124
0125 explicit PassBuilder(TargetMachine *TM = nullptr,
0126 PipelineTuningOptions PTO = PipelineTuningOptions(),
0127 std::optional<PGOOptions> PGOOpt = std::nullopt,
0128 PassInstrumentationCallbacks *PIC = nullptr);
0129
0130
0131
0132
0133
0134 void crossRegisterProxies(LoopAnalysisManager &LAM,
0135 FunctionAnalysisManager &FAM,
0136 CGSCCAnalysisManager &CGAM,
0137 ModuleAnalysisManager &MAM,
0138 MachineFunctionAnalysisManager *MFAM = nullptr);
0139
0140
0141
0142
0143
0144
0145
0146 void registerModuleAnalyses(ModuleAnalysisManager &MAM);
0147
0148
0149
0150
0151
0152
0153
0154 void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM);
0155
0156
0157
0158
0159
0160
0161
0162 void registerFunctionAnalyses(FunctionAnalysisManager &FAM);
0163
0164
0165
0166
0167
0168
0169 void registerLoopAnalyses(LoopAnalysisManager &LAM);
0170
0171
0172
0173
0174
0175
0176
0177 void registerMachineFunctionAnalyses(MachineFunctionAnalysisManager &MFAM);
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193 FunctionPassManager
0194 buildFunctionSimplificationPipeline(OptimizationLevel Level,
0195 ThinOrFullLTOPhase Phase);
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212 ModulePassManager buildModuleSimplificationPipeline(OptimizationLevel Level,
0213 ThinOrFullLTOPhase Phase);
0214
0215
0216
0217 ModuleInlinerWrapperPass buildInlinerPipeline(OptimizationLevel Level,
0218 ThinOrFullLTOPhase Phase);
0219
0220
0221
0222 ModulePassManager buildModuleInlinerPipeline(OptimizationLevel Level,
0223 ThinOrFullLTOPhase Phase);
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238 ModulePassManager
0239 buildModuleOptimizationPipeline(OptimizationLevel Level,
0240 ThinOrFullLTOPhase LTOPhase);
0241
0242
0243
0244
0245
0246
0247
0248 ModulePassManager buildPerModuleDefaultPipeline(
0249 OptimizationLevel Level,
0250 ThinOrFullLTOPhase Phase = ThinOrFullLTOPhase::None);
0251
0252
0253
0254
0255
0256
0257 ModulePassManager buildFatLTODefaultPipeline(OptimizationLevel Level,
0258 bool ThinLTO, bool EmitSummary);
0259
0260
0261
0262
0263
0264
0265
0266
0267 ModulePassManager buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level);
0268
0269
0270
0271
0272
0273
0274
0275 ModulePassManager
0276 buildThinLTODefaultPipeline(OptimizationLevel Level,
0277 const ModuleSummaryIndex *ImportSummary);
0278
0279
0280
0281
0282
0283
0284
0285
0286 ModulePassManager buildLTOPreLinkDefaultPipeline(OptimizationLevel Level);
0287
0288
0289
0290
0291
0292
0293
0294 ModulePassManager buildLTODefaultPipeline(OptimizationLevel Level,
0295 ModuleSummaryIndex *ExportSummary);
0296
0297
0298
0299
0300 ModulePassManager
0301 buildO0DefaultPipeline(OptimizationLevel Level,
0302 ThinOrFullLTOPhase Phase = ThinOrFullLTOPhase::None);
0303
0304
0305
0306
0307
0308
0309 AAManager buildDefaultAAPipeline();
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351 Error parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText);
0352
0353
0354
0355
0356
0357
0358
0359
0360 Error parsePassPipeline(CGSCCPassManager &CGPM, StringRef PipelineText);
0361 Error parsePassPipeline(FunctionPassManager &FPM, StringRef PipelineText);
0362 Error parsePassPipeline(LoopPassManager &LPM, StringRef PipelineText);
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374 Error parsePassPipeline(MachineFunctionPassManager &MFPM,
0375 StringRef PipelineText);
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392 Error parseAAPipeline(AAManager &AA, StringRef PipelineText);
0393
0394
0395 std::optional<RegAllocFilterFunc>
0396 parseRegAllocFilter(StringRef RegAllocFilterName);
0397
0398
0399 void printPassNames(raw_ostream &OS);
0400
0401
0402
0403
0404
0405
0406
0407 void registerPeepholeEPCallback(
0408 const std::function<void(FunctionPassManager &, OptimizationLevel)> &C) {
0409 PeepholeEPCallbacks.push_back(C);
0410 }
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421 void registerLateLoopOptimizationsEPCallback(
0422 const std::function<void(LoopPassManager &, OptimizationLevel)> &C) {
0423 LateLoopOptimizationsEPCallbacks.push_back(C);
0424 }
0425
0426
0427
0428
0429
0430
0431 void registerLoopOptimizerEndEPCallback(
0432 const std::function<void(LoopPassManager &, OptimizationLevel)> &C) {
0433 LoopOptimizerEndEPCallbacks.push_back(C);
0434 }
0435
0436
0437
0438
0439
0440
0441 void registerScalarOptimizerLateEPCallback(
0442 const std::function<void(FunctionPassManager &, OptimizationLevel)> &C) {
0443 ScalarOptimizerLateEPCallbacks.push_back(C);
0444 }
0445
0446
0447
0448
0449
0450
0451
0452 void registerCGSCCOptimizerLateEPCallback(
0453 const std::function<void(CGSCCPassManager &, OptimizationLevel)> &C) {
0454 CGSCCOptimizerLateEPCallbacks.push_back(C);
0455 }
0456
0457
0458
0459
0460
0461
0462
0463 void registerVectorizerStartEPCallback(
0464 const std::function<void(FunctionPassManager &, OptimizationLevel)> &C) {
0465 VectorizerStartEPCallbacks.push_back(C);
0466 }
0467
0468
0469
0470
0471
0472
0473 void registerPipelineStartEPCallback(
0474 const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
0475 PipelineStartEPCallbacks.push_back(C);
0476 }
0477
0478
0479
0480
0481
0482 void registerPipelineEarlySimplificationEPCallback(
0483 const std::function<void(ModulePassManager &, OptimizationLevel,
0484 ThinOrFullLTOPhase)> &C) {
0485 PipelineEarlySimplificationEPCallbacks.push_back(C);
0486 }
0487
0488
0489
0490
0491
0492 void registerOptimizerEarlyEPCallback(
0493 const std::function<void(ModulePassManager &, OptimizationLevel,
0494 ThinOrFullLTOPhase Phase)> &C) {
0495 OptimizerEarlyEPCallbacks.push_back(C);
0496 }
0497
0498
0499
0500
0501
0502 void registerOptimizerLastEPCallback(
0503 const std::function<void(ModulePassManager &, OptimizationLevel,
0504 ThinOrFullLTOPhase)> &C) {
0505 OptimizerLastEPCallbacks.push_back(C);
0506 }
0507
0508
0509
0510
0511
0512 void registerFullLinkTimeOptimizationEarlyEPCallback(
0513 const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
0514 FullLinkTimeOptimizationEarlyEPCallbacks.push_back(C);
0515 }
0516
0517
0518
0519
0520
0521 void registerFullLinkTimeOptimizationLastEPCallback(
0522 const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
0523 FullLinkTimeOptimizationLastEPCallbacks.push_back(C);
0524 }
0525
0526
0527
0528 void registerParseAACallback(
0529 const std::function<bool(StringRef Name, AAManager &AA)> &C) {
0530 AAParsingCallbacks.push_back(C);
0531 }
0532
0533
0534
0535
0536 void registerAnalysisRegistrationCallback(
0537 const std::function<void(CGSCCAnalysisManager &)> &C) {
0538 CGSCCAnalysisRegistrationCallbacks.push_back(C);
0539 }
0540 void registerAnalysisRegistrationCallback(
0541 const std::function<void(FunctionAnalysisManager &)> &C) {
0542 FunctionAnalysisRegistrationCallbacks.push_back(C);
0543 }
0544 void registerAnalysisRegistrationCallback(
0545 const std::function<void(LoopAnalysisManager &)> &C) {
0546 LoopAnalysisRegistrationCallbacks.push_back(C);
0547 }
0548 void registerAnalysisRegistrationCallback(
0549 const std::function<void(ModuleAnalysisManager &)> &C) {
0550 ModuleAnalysisRegistrationCallbacks.push_back(C);
0551 }
0552 void registerAnalysisRegistrationCallback(
0553 const std::function<void(MachineFunctionAnalysisManager &)> &C) {
0554 MachineFunctionAnalysisRegistrationCallbacks.push_back(C);
0555 }
0556
0557
0558
0559
0560
0561
0562 void registerPipelineParsingCallback(
0563 const std::function<bool(StringRef Name, CGSCCPassManager &,
0564 ArrayRef<PipelineElement>)> &C) {
0565 CGSCCPipelineParsingCallbacks.push_back(C);
0566 }
0567 void registerPipelineParsingCallback(
0568 const std::function<bool(StringRef Name, FunctionPassManager &,
0569 ArrayRef<PipelineElement>)> &C) {
0570 FunctionPipelineParsingCallbacks.push_back(C);
0571 }
0572 void registerPipelineParsingCallback(
0573 const std::function<bool(StringRef Name, LoopPassManager &,
0574 ArrayRef<PipelineElement>)> &C) {
0575 LoopPipelineParsingCallbacks.push_back(C);
0576 }
0577 void registerPipelineParsingCallback(
0578 const std::function<bool(StringRef Name, ModulePassManager &,
0579 ArrayRef<PipelineElement>)> &C) {
0580 ModulePipelineParsingCallbacks.push_back(C);
0581 }
0582 void registerPipelineParsingCallback(
0583 const std::function<bool(StringRef Name, MachineFunctionPassManager &,
0584 ArrayRef<PipelineElement>)> &C) {
0585 MachineFunctionPipelineParsingCallbacks.push_back(C);
0586 }
0587
0588
0589
0590
0591
0592 void registerRegClassFilterParsingCallback(
0593 const std::function<RegAllocFilterFunc(StringRef)> &C) {
0594 RegClassFilterParsingCallbacks.push_back(C);
0595 }
0596
0597
0598
0599
0600
0601
0602 void registerParseTopLevelPipelineCallback(
0603 const std::function<bool(ModulePassManager &, ArrayRef<PipelineElement>)>
0604 &C);
0605
0606
0607 void addPGOInstrPassesForO0(ModulePassManager &MPM, bool RunProfileGen,
0608 bool IsCS, bool AtomicCounterUpdate,
0609 std::string ProfileFile,
0610 std::string ProfileRemappingFile,
0611 IntrusiveRefCntPtr<vfs::FileSystem> FS);
0612
0613
0614
0615 PassInstrumentationCallbacks *getPassInstrumentationCallbacks() const {
0616 return PIC;
0617 }
0618
0619
0620
0621
0622 void invokePeepholeEPCallbacks(FunctionPassManager &FPM,
0623 OptimizationLevel Level);
0624 void invokeLateLoopOptimizationsEPCallbacks(LoopPassManager &LPM,
0625 OptimizationLevel Level);
0626 void invokeLoopOptimizerEndEPCallbacks(LoopPassManager &LPM,
0627 OptimizationLevel Level);
0628 void invokeScalarOptimizerLateEPCallbacks(FunctionPassManager &FPM,
0629 OptimizationLevel Level);
0630 void invokeCGSCCOptimizerLateEPCallbacks(CGSCCPassManager &CGPM,
0631 OptimizationLevel Level);
0632 void invokeVectorizerStartEPCallbacks(FunctionPassManager &FPM,
0633 OptimizationLevel Level);
0634 void invokeOptimizerEarlyEPCallbacks(ModulePassManager &MPM,
0635 OptimizationLevel Level,
0636 ThinOrFullLTOPhase Phase);
0637 void invokeOptimizerLastEPCallbacks(ModulePassManager &MPM,
0638 OptimizationLevel Level,
0639 ThinOrFullLTOPhase Phase);
0640 void invokeFullLinkTimeOptimizationEarlyEPCallbacks(ModulePassManager &MPM,
0641 OptimizationLevel Level);
0642 void invokeFullLinkTimeOptimizationLastEPCallbacks(ModulePassManager &MPM,
0643 OptimizationLevel Level);
0644 void invokePipelineStartEPCallbacks(ModulePassManager &MPM,
0645 OptimizationLevel Level);
0646 void invokePipelineEarlySimplificationEPCallbacks(ModulePassManager &MPM,
0647 OptimizationLevel Level,
0648 ThinOrFullLTOPhase Phase);
0649
0650 static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
0651 if (!Name.consume_front(PassName))
0652 return false;
0653
0654 if (Name.empty())
0655 return true;
0656 return Name.starts_with("<") && Name.ends_with(">");
0657 }
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674 template <typename ParametersParseCallableT>
0675 static auto parsePassParameters(ParametersParseCallableT &&Parser,
0676 StringRef Name, StringRef PassName)
0677 -> decltype(Parser(StringRef{})) {
0678 using ParametersT = typename decltype(Parser(StringRef{}))::value_type;
0679
0680 StringRef Params = Name;
0681 if (!Params.consume_front(PassName)) {
0682 llvm_unreachable(
0683 "unable to strip pass name from parametrized pass specification");
0684 }
0685 if (!Params.empty() &&
0686 (!Params.consume_front("<") || !Params.consume_back(">"))) {
0687 llvm_unreachable("invalid format for parametrized pass name");
0688 }
0689
0690 Expected<ParametersT> Result = Parser(Params);
0691 assert((Result || Result.template errorIsA<StringError>()) &&
0692 "Pass parameter parser can only return StringErrors.");
0693 return Result;
0694 }
0695
0696
0697
0698
0699 static Expected<bool> parseSinglePassOption(StringRef Params,
0700 StringRef OptionName,
0701 StringRef PassName);
0702
0703 private:
0704
0705 FunctionPassManager
0706 buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
0707 ThinOrFullLTOPhase Phase);
0708
0709 void addRequiredLTOPreLinkPasses(ModulePassManager &MPM);
0710
0711 void addVectorPasses(OptimizationLevel Level, FunctionPassManager &FPM,
0712 bool IsFullLTO);
0713
0714 static std::optional<std::vector<PipelineElement>>
0715 parsePipelineText(StringRef Text);
0716
0717 Error parseModulePass(ModulePassManager &MPM, const PipelineElement &E);
0718 Error parseCGSCCPass(CGSCCPassManager &CGPM, const PipelineElement &E);
0719 Error parseFunctionPass(FunctionPassManager &FPM, const PipelineElement &E);
0720 Error parseLoopPass(LoopPassManager &LPM, const PipelineElement &E);
0721 Error parseMachinePass(MachineFunctionPassManager &MFPM,
0722 const PipelineElement &E);
0723 bool parseAAPassName(AAManager &AA, StringRef Name);
0724
0725 Error parseMachinePassPipeline(MachineFunctionPassManager &MFPM,
0726 ArrayRef<PipelineElement> Pipeline);
0727 Error parseLoopPassPipeline(LoopPassManager &LPM,
0728 ArrayRef<PipelineElement> Pipeline);
0729 Error parseFunctionPassPipeline(FunctionPassManager &FPM,
0730 ArrayRef<PipelineElement> Pipeline);
0731 Error parseCGSCCPassPipeline(CGSCCPassManager &CGPM,
0732 ArrayRef<PipelineElement> Pipeline);
0733 Error parseModulePassPipeline(ModulePassManager &MPM,
0734 ArrayRef<PipelineElement> Pipeline);
0735
0736
0737
0738
0739 void addPreInlinerPasses(ModulePassManager &MPM, OptimizationLevel Level,
0740 ThinOrFullLTOPhase LTOPhase);
0741
0742 void addPGOInstrPasses(ModulePassManager &MPM, OptimizationLevel Level,
0743 bool RunProfileGen, bool IsCS,
0744 bool AtomicCounterUpdate, std::string ProfileFile,
0745 std::string ProfileRemappingFile,
0746 IntrusiveRefCntPtr<vfs::FileSystem> FS);
0747 void addPostPGOLoopRotation(ModulePassManager &MPM, OptimizationLevel Level);
0748
0749
0750 SmallVector<std::function<void(FunctionPassManager &, OptimizationLevel)>, 2>
0751 PeepholeEPCallbacks;
0752 SmallVector<std::function<void(LoopPassManager &, OptimizationLevel)>, 2>
0753 LateLoopOptimizationsEPCallbacks;
0754 SmallVector<std::function<void(LoopPassManager &, OptimizationLevel)>, 2>
0755 LoopOptimizerEndEPCallbacks;
0756 SmallVector<std::function<void(FunctionPassManager &, OptimizationLevel)>, 2>
0757 ScalarOptimizerLateEPCallbacks;
0758 SmallVector<std::function<void(CGSCCPassManager &, OptimizationLevel)>, 2>
0759 CGSCCOptimizerLateEPCallbacks;
0760 SmallVector<std::function<void(FunctionPassManager &, OptimizationLevel)>, 2>
0761 VectorizerStartEPCallbacks;
0762
0763 SmallVector<std::function<void(ModulePassManager &, OptimizationLevel,
0764 ThinOrFullLTOPhase)>,
0765 2>
0766 OptimizerEarlyEPCallbacks;
0767 SmallVector<std::function<void(ModulePassManager &, OptimizationLevel,
0768 ThinOrFullLTOPhase)>,
0769 2>
0770 OptimizerLastEPCallbacks;
0771 SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
0772 FullLinkTimeOptimizationEarlyEPCallbacks;
0773 SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
0774 FullLinkTimeOptimizationLastEPCallbacks;
0775 SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
0776 PipelineStartEPCallbacks;
0777 SmallVector<std::function<void(ModulePassManager &, OptimizationLevel,
0778 ThinOrFullLTOPhase)>,
0779 2>
0780 PipelineEarlySimplificationEPCallbacks;
0781
0782 SmallVector<std::function<void(ModuleAnalysisManager &)>, 2>
0783 ModuleAnalysisRegistrationCallbacks;
0784 SmallVector<std::function<bool(StringRef, ModulePassManager &,
0785 ArrayRef<PipelineElement>)>,
0786 2>
0787 ModulePipelineParsingCallbacks;
0788 SmallVector<
0789 std::function<bool(ModulePassManager &, ArrayRef<PipelineElement>)>, 2>
0790 TopLevelPipelineParsingCallbacks;
0791
0792 SmallVector<std::function<void(CGSCCAnalysisManager &)>, 2>
0793 CGSCCAnalysisRegistrationCallbacks;
0794 SmallVector<std::function<bool(StringRef, CGSCCPassManager &,
0795 ArrayRef<PipelineElement>)>,
0796 2>
0797 CGSCCPipelineParsingCallbacks;
0798
0799 SmallVector<std::function<void(FunctionAnalysisManager &)>, 2>
0800 FunctionAnalysisRegistrationCallbacks;
0801 SmallVector<std::function<bool(StringRef, FunctionPassManager &,
0802 ArrayRef<PipelineElement>)>,
0803 2>
0804 FunctionPipelineParsingCallbacks;
0805
0806 SmallVector<std::function<void(LoopAnalysisManager &)>, 2>
0807 LoopAnalysisRegistrationCallbacks;
0808 SmallVector<std::function<bool(StringRef, LoopPassManager &,
0809 ArrayRef<PipelineElement>)>,
0810 2>
0811 LoopPipelineParsingCallbacks;
0812
0813 SmallVector<std::function<bool(StringRef Name, AAManager &AA)>, 2>
0814 AAParsingCallbacks;
0815
0816 SmallVector<std::function<void(MachineFunctionAnalysisManager &)>, 2>
0817 MachineFunctionAnalysisRegistrationCallbacks;
0818 SmallVector<std::function<bool(StringRef, MachineFunctionPassManager &,
0819 ArrayRef<PipelineElement>)>,
0820 2>
0821 MachineFunctionPipelineParsingCallbacks;
0822
0823 SmallVector<std::function<RegAllocFilterFunc(StringRef)>, 2>
0824 RegClassFilterParsingCallbacks;
0825 };
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841 template <typename AnalysisT, typename IRUnitT, typename AnalysisManagerT,
0842 typename... ExtraArgTs>
0843 bool parseAnalysisUtilityPasses(
0844 StringRef AnalysisName, StringRef PipelineName,
0845 PassManager<IRUnitT, AnalysisManagerT, ExtraArgTs...> &PM) {
0846 if (!PipelineName.ends_with(">"))
0847 return false;
0848
0849 if (PipelineName.starts_with("invalidate<")) {
0850 PipelineName = PipelineName.substr(11, PipelineName.size() - 12);
0851 if (PipelineName != AnalysisName)
0852 return false;
0853 PM.addPass(InvalidateAnalysisPass<AnalysisT>());
0854 return true;
0855 }
0856
0857
0858 if (PipelineName.starts_with("require<")) {
0859 PipelineName = PipelineName.substr(8, PipelineName.size() - 9);
0860 if (PipelineName != AnalysisName)
0861 return false;
0862 PM.addPass(RequireAnalysisPass<AnalysisT, IRUnitT, AnalysisManagerT,
0863 ExtraArgTs...>());
0864 return true;
0865 }
0866
0867 return false;
0868 }
0869
0870
0871
0872
0873 struct NoOpModulePass : PassInfoMixin<NoOpModulePass> {
0874 PreservedAnalyses run(Module &M, ModuleAnalysisManager &) {
0875 return PreservedAnalyses::all();
0876 }
0877 };
0878
0879
0880 class NoOpModuleAnalysis : public AnalysisInfoMixin<NoOpModuleAnalysis> {
0881 friend AnalysisInfoMixin<NoOpModuleAnalysis>;
0882 static AnalysisKey Key;
0883
0884 public:
0885 struct Result {};
0886 Result run(Module &, ModuleAnalysisManager &) { return Result(); }
0887 };
0888
0889
0890 struct NoOpCGSCCPass : PassInfoMixin<NoOpCGSCCPass> {
0891 PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &,
0892 LazyCallGraph &, CGSCCUpdateResult &UR) {
0893 return PreservedAnalyses::all();
0894 }
0895 };
0896
0897
0898 class NoOpCGSCCAnalysis : public AnalysisInfoMixin<NoOpCGSCCAnalysis> {
0899 friend AnalysisInfoMixin<NoOpCGSCCAnalysis>;
0900 static AnalysisKey Key;
0901
0902 public:
0903 struct Result {};
0904 Result run(LazyCallGraph::SCC &, CGSCCAnalysisManager &, LazyCallGraph &G) {
0905 return Result();
0906 }
0907 };
0908
0909
0910 struct NoOpFunctionPass : PassInfoMixin<NoOpFunctionPass> {
0911 PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
0912 return PreservedAnalyses::all();
0913 }
0914 };
0915
0916
0917 class NoOpFunctionAnalysis : public AnalysisInfoMixin<NoOpFunctionAnalysis> {
0918 friend AnalysisInfoMixin<NoOpFunctionAnalysis>;
0919 static AnalysisKey Key;
0920
0921 public:
0922 struct Result {};
0923 Result run(Function &, FunctionAnalysisManager &) { return Result(); }
0924 };
0925
0926
0927 struct NoOpLoopNestPass : PassInfoMixin<NoOpLoopNestPass> {
0928 PreservedAnalyses run(LoopNest &L, LoopAnalysisManager &,
0929 LoopStandardAnalysisResults &, LPMUpdater &) {
0930 return PreservedAnalyses::all();
0931 }
0932 };
0933
0934
0935 struct NoOpLoopPass : PassInfoMixin<NoOpLoopPass> {
0936 PreservedAnalyses run(Loop &L, LoopAnalysisManager &,
0937 LoopStandardAnalysisResults &, LPMUpdater &) {
0938 return PreservedAnalyses::all();
0939 }
0940 };
0941
0942
0943 struct NoOpMachineFunctionPass : public PassInfoMixin<NoOpMachineFunctionPass> {
0944 PreservedAnalyses run(MachineFunction &, MachineFunctionAnalysisManager &) {
0945 return PreservedAnalyses::all();
0946 }
0947 };
0948
0949
0950 class NoOpLoopAnalysis : public AnalysisInfoMixin<NoOpLoopAnalysis> {
0951 friend AnalysisInfoMixin<NoOpLoopAnalysis>;
0952 static AnalysisKey Key;
0953
0954 public:
0955 struct Result {};
0956 Result run(Loop &, LoopAnalysisManager &, LoopStandardAnalysisResults &) {
0957 return Result();
0958 }
0959 };
0960
0961
0962 extern cl::opt<bool> PrintPipelinePasses;
0963
0964 }
0965
0966 #endif