LLVM 18.0.0git
PassBuilder.cpp
Go to the documentation of this file.
1//===- Parsing and selection of pass pipelines ----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8/// \file
9///
10/// This file provides the implementation of the PassBuilder based on our
11/// static pass registry as well as related functionality. It also provides
12/// helpers to aid in analyzing, debugging, and testing passes and pass
13/// pipelines.
14///
15//===----------------------------------------------------------------------===//
16
32#include "llvm/Analysis/DDG.h"
48#include "llvm/Analysis/Lint.h"
83#include "llvm/IR/DebugInfo.h"
84#include "llvm/IR/Dominators.h"
85#include "llvm/IR/PassManager.h"
86#include "llvm/IR/PrintPasses.h"
88#include "llvm/IR/Verifier.h"
92#include "llvm/Support/Debug.h"
95#include "llvm/Support/Regex.h"
273#include <optional>
274
275using namespace llvm;
276
278 "^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$");
279
280namespace llvm {
282 "print-pipeline-passes",
283 cl::desc("Print a '-passes' compatible string describing the pipeline "
284 "(best-effort only)."));
285} // namespace llvm
286
287namespace {
288
289// The following passes/analyses have custom names, otherwise their name will
290// include `(anonymous namespace)`. These are special since they are only for
291// testing purposes and don't live in a header file.
292
293/// No-op module pass which does nothing.
294struct NoOpModulePass : PassInfoMixin<NoOpModulePass> {
296 return PreservedAnalyses::all();
297 }
298
299 static StringRef name() { return "NoOpModulePass"; }
300};
301
302/// No-op module analysis.
303class NoOpModuleAnalysis : public AnalysisInfoMixin<NoOpModuleAnalysis> {
305 static AnalysisKey Key;
306
307public:
308 struct Result {};
309 Result run(Module &, ModuleAnalysisManager &) { return Result(); }
310 static StringRef name() { return "NoOpModuleAnalysis"; }
311};
312
313/// No-op CGSCC pass which does nothing.
314struct NoOpCGSCCPass : PassInfoMixin<NoOpCGSCCPass> {
317 return PreservedAnalyses::all();
318 }
319 static StringRef name() { return "NoOpCGSCCPass"; }
320};
321
322/// No-op CGSCC analysis.
323class NoOpCGSCCAnalysis : public AnalysisInfoMixin<NoOpCGSCCAnalysis> {
325 static AnalysisKey Key;
326
327public:
328 struct Result {};
330 return Result();
331 }
332 static StringRef name() { return "NoOpCGSCCAnalysis"; }
333};
334
335/// No-op function pass which does nothing.
336struct NoOpFunctionPass : PassInfoMixin<NoOpFunctionPass> {
338 return PreservedAnalyses::all();
339 }
340 static StringRef name() { return "NoOpFunctionPass"; }
341};
342
343/// No-op function analysis.
344class NoOpFunctionAnalysis : public AnalysisInfoMixin<NoOpFunctionAnalysis> {
346 static AnalysisKey Key;
347
348public:
349 struct Result {};
351 static StringRef name() { return "NoOpFunctionAnalysis"; }
352};
353
354/// No-op loop nest pass which does nothing.
355struct NoOpLoopNestPass : PassInfoMixin<NoOpLoopNestPass> {
358 return PreservedAnalyses::all();
359 }
360 static StringRef name() { return "NoOpLoopNestPass"; }
361};
362
363/// No-op loop pass which does nothing.
364struct NoOpLoopPass : PassInfoMixin<NoOpLoopPass> {
367 return PreservedAnalyses::all();
368 }
369 static StringRef name() { return "NoOpLoopPass"; }
370};
371
372/// No-op loop analysis.
373class NoOpLoopAnalysis : public AnalysisInfoMixin<NoOpLoopAnalysis> {
375 static AnalysisKey Key;
376
377public:
378 struct Result {};
380 return Result();
381 }
382 static StringRef name() { return "NoOpLoopAnalysis"; }
383};
384
385AnalysisKey NoOpModuleAnalysis::Key;
386AnalysisKey NoOpCGSCCAnalysis::Key;
387AnalysisKey NoOpFunctionAnalysis::Key;
388AnalysisKey NoOpLoopAnalysis::Key;
389
390/// Whether or not we should populate a PassInstrumentationCallbacks's class to
391/// pass name map.
392///
393/// This is for optimization purposes so we don't populate it if we never use
394/// it. This should be updated if new pass instrumentation wants to use the map.
395/// We currently only use this for --print-before/after.
396bool shouldPopulateClassToPassNames() {
397 return PrintPipelinePasses || !printBeforePasses().empty() ||
398 !printAfterPasses().empty() || !isFilterPassesEmpty();
399}
400
401// A pass for testing -print-on-crash.
402// DO NOT USE THIS EXCEPT FOR TESTING!
403class TriggerCrashPass : public PassInfoMixin<TriggerCrashPass> {
404public:
406 abort();
407 return PreservedAnalyses::all();
408 }
409 static StringRef name() { return "TriggerCrashPass"; }
410};
411
412// A pass for testing message reporting of -verify-each failures.
413// DO NOT USE THIS EXCEPT FOR TESTING!
414class TriggerVerifierErrorPass
415 : public PassInfoMixin<TriggerVerifierErrorPass> {
416public:
418 // Intentionally break the Module by creating an alias without setting the
419 // aliasee.
420 auto *PtrTy = llvm::PointerType::getUnqual(M.getContext());
421 GlobalAlias::create(PtrTy, PtrTy->getAddressSpace(),
422 GlobalValue::LinkageTypes::InternalLinkage,
423 "__bad_alias", nullptr, &M);
425 }
426
428 // Intentionally break the Function by inserting a terminator
429 // instruction in the middle of a basic block.
430 BasicBlock &BB = F.getEntryBlock();
431 new UnreachableInst(F.getContext(), BB.getTerminator());
433 }
434
435 static StringRef name() { return "TriggerVerifierErrorPass"; }
436};
437
438} // namespace
439
441 std::optional<PGOOptions> PGOOpt,
443 : TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC) {
444 if (TM)
445 TM->registerPassBuilderCallbacks(*this);
446 if (PIC && shouldPopulateClassToPassNames()) {
447#define MODULE_PASS(NAME, CREATE_PASS) \
448 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
449#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
450 PIC->addClassToPassName(CLASS, NAME);
451#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
452 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
453#define FUNCTION_PASS(NAME, CREATE_PASS) \
454 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
455#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
456 PIC->addClassToPassName(CLASS, NAME);
457#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
458 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
459#define LOOPNEST_PASS(NAME, CREATE_PASS) \
460 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
461#define LOOP_PASS(NAME, CREATE_PASS) \
462 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
463#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
464 PIC->addClassToPassName(CLASS, NAME);
465#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
466 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
467#define CGSCC_PASS(NAME, CREATE_PASS) \
468 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
469#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
470 PIC->addClassToPassName(CLASS, NAME);
471#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
472 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
473#include "PassRegistry.def"
474 }
475}
476
478#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
479 MAM.registerPass([&] { return CREATE_PASS; });
480#include "PassRegistry.def"
481
482 for (auto &C : ModuleAnalysisRegistrationCallbacks)
483 C(MAM);
484}
485
487#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
488 CGAM.registerPass([&] { return CREATE_PASS; });
489#include "PassRegistry.def"
490
491 for (auto &C : CGSCCAnalysisRegistrationCallbacks)
492 C(CGAM);
493}
494
496 // We almost always want the default alias analysis pipeline.
497 // If a user wants a different one, they can register their own before calling
498 // registerFunctionAnalyses().
499 FAM.registerPass([&] { return buildDefaultAAPipeline(); });
500
501#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
502 FAM.registerPass([&] { return CREATE_PASS; });
503#include "PassRegistry.def"
504
505 for (auto &C : FunctionAnalysisRegistrationCallbacks)
506 C(FAM);
507}
508
510#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
511 LAM.registerPass([&] { return CREATE_PASS; });
512#include "PassRegistry.def"
513
514 for (auto &C : LoopAnalysisRegistrationCallbacks)
515 C(LAM);
516}
517
518static std::optional<int> parseRepeatPassName(StringRef Name) {
519 if (!Name.consume_front("repeat<") || !Name.consume_back(">"))
520 return std::nullopt;
521 int Count;
522 if (Name.getAsInteger(0, Count) || Count <= 0)
523 return std::nullopt;
524 return Count;
525}
526
527static std::optional<std::pair<bool, bool>>
529 std::pair<bool, bool> Params;
530 if (!Name.consume_front("function"))
531 return std::nullopt;
532 if (Name.empty())
533 return Params;
534 if (!Name.consume_front("<") || !Name.consume_back(">"))
535 return std::nullopt;
536 while (!Name.empty()) {
537 auto [Front, Back] = Name.split(';');
538 Name = Back;
539 if (Front == "eager-inv")
540 Params.first = true;
541 else if (Front == "no-rerun")
542 Params.second = true;
543 else
544 return std::nullopt;
545 }
546 return Params;
547}
548
549static std::optional<int> parseDevirtPassName(StringRef Name) {
550 if (!Name.consume_front("devirt<") || !Name.consume_back(">"))
551 return std::nullopt;
552 int Count;
553 if (Name.getAsInteger(0, Count) || Count < 0)
554 return std::nullopt;
555 return Count;
556}
557
559 if (!Name.consume_front(PassName))
560 return false;
561 // normal pass name w/o parameters == default parameters
562 if (Name.empty())
563 return true;
564 return Name.startswith("<") && Name.endswith(">");
565}
566
567static std::optional<OptimizationLevel> parseOptLevel(StringRef S) {
569 .Case("O0", OptimizationLevel::O0)
575 .Default(std::nullopt);
576}
577
578namespace {
579
580/// This performs customized parsing of pass name with parameters.
581///
582/// We do not need parametrization of passes in textual pipeline very often,
583/// yet on a rare occasion ability to specify parameters right there can be
584/// useful.
585///
586/// \p Name - parameterized specification of a pass from a textual pipeline
587/// is a string in a form of :
588/// PassName '<' parameter-list '>'
589///
590/// Parameter list is being parsed by the parser callable argument, \p Parser,
591/// It takes a string-ref of parameters and returns either StringError or a
592/// parameter list in a form of a custom parameters type, all wrapped into
593/// Expected<> template class.
594///
595template <typename ParametersParseCallableT>
596auto parsePassParameters(ParametersParseCallableT &&Parser, StringRef Name,
597 StringRef PassName) -> decltype(Parser(StringRef{})) {
598 using ParametersT = typename decltype(Parser(StringRef{}))::value_type;
599
600 StringRef Params = Name;
601 if (!Params.consume_front(PassName)) {
602 assert(false &&
603 "unable to strip pass name from parametrized pass specification");
604 }
605 if (!Params.empty() &&
606 (!Params.consume_front("<") || !Params.consume_back(">"))) {
607 assert(false && "invalid format for parametrized pass name");
608 }
609
610 Expected<ParametersT> Result = Parser(Params);
611 assert((Result || Result.template errorIsA<StringError>()) &&
612 "Pass parameter parser can only return StringErrors.");
613 return Result;
614}
615
616/// Parser of parameters for HardwareLoops pass.
617Expected<HardwareLoopOptions> parseHardwareLoopOptions(StringRef Params) {
618 HardwareLoopOptions HardwareLoopOpts;
619
620 while (!Params.empty()) {
621 StringRef ParamName;
622 std::tie(ParamName, Params) = Params.split(';');
623 if (ParamName.consume_front("hardware-loop-decrement=")) {
624 int Count;
625 if (ParamName.getAsInteger(0, Count))
626 return make_error<StringError>(
627 formatv("invalid HardwareLoopPass parameter '{0}' ", ParamName).str(),
629 HardwareLoopOpts.setDecrement(Count);
630 continue;
631 }
632 if (ParamName.consume_front("hardware-loop-counter-bitwidth=")) {
633 int Count;
634 if (ParamName.getAsInteger(0, Count))
635 return make_error<StringError>(
636 formatv("invalid HardwareLoopPass parameter '{0}' ", ParamName).str(),
638 HardwareLoopOpts.setCounterBitwidth(Count);
639 continue;
640 }
641 if (ParamName == "force-hardware-loops") {
642 HardwareLoopOpts.setForce(true);
643 } else if (ParamName == "force-hardware-loop-phi") {
644 HardwareLoopOpts.setForcePhi(true);
645 } else if (ParamName == "force-nested-hardware-loop") {
646 HardwareLoopOpts.setForceNested(true);
647 } else if (ParamName == "force-hardware-loop-guard") {
648 HardwareLoopOpts.setForceGuard(true);
649 } else {
650 return make_error<StringError>(
651 formatv("invalid HardwarePass parameter '{0}' ", ParamName).str(),
653 }
654 }
655 return HardwareLoopOpts;
656}
657
658/// Parser of parameters for LoopUnroll pass.
659Expected<LoopUnrollOptions> parseLoopUnrollOptions(StringRef Params) {
660 LoopUnrollOptions UnrollOpts;
661 while (!Params.empty()) {
662 StringRef ParamName;
663 std::tie(ParamName, Params) = Params.split(';');
664 std::optional<OptimizationLevel> OptLevel = parseOptLevel(ParamName);
665 // Don't accept -Os/-Oz.
666 if (OptLevel && !OptLevel->isOptimizingForSize()) {
667 UnrollOpts.setOptLevel(OptLevel->getSpeedupLevel());
668 continue;
669 }
670 if (ParamName.consume_front("full-unroll-max=")) {
671 int Count;
672 if (ParamName.getAsInteger(0, Count))
673 return make_error<StringError>(
674 formatv("invalid LoopUnrollPass parameter '{0}' ", ParamName).str(),
676 UnrollOpts.setFullUnrollMaxCount(Count);
677 continue;
678 }
679
680 bool Enable = !ParamName.consume_front("no-");
681 if (ParamName == "partial") {
682 UnrollOpts.setPartial(Enable);
683 } else if (ParamName == "peeling") {
684 UnrollOpts.setPeeling(Enable);
685 } else if (ParamName == "profile-peeling") {
686 UnrollOpts.setProfileBasedPeeling(Enable);
687 } else if (ParamName == "runtime") {
688 UnrollOpts.setRuntime(Enable);
689 } else if (ParamName == "upperbound") {
690 UnrollOpts.setUpperBound(Enable);
691 } else {
692 return make_error<StringError>(
693 formatv("invalid LoopUnrollPass parameter '{0}' ", ParamName).str(),
695 }
696 }
697 return UnrollOpts;
698}
699
700Expected<bool> parseSinglePassOption(StringRef Params, StringRef OptionName,
702 bool Result = false;
703 while (!Params.empty()) {
704 StringRef ParamName;
705 std::tie(ParamName, Params) = Params.split(';');
706
707 if (ParamName == OptionName) {
708 Result = true;
709 } else {
710 return make_error<StringError>(
711 formatv("invalid {1} pass parameter '{0}' ", ParamName, PassName)
712 .str(),
714 }
715 }
716 return Result;
717}
718
719Expected<bool> parseGlobalDCEPassOptions(StringRef Params) {
720 return parseSinglePassOption(Params, "vfe-linkage-unit-visibility", "GlobalDCE");
721}
722
723Expected<bool> parseInlinerPassOptions(StringRef Params) {
724 return parseSinglePassOption(Params, "only-mandatory", "InlinerPass");
725}
726
727Expected<bool> parseCoroSplitPassOptions(StringRef Params) {
728 return parseSinglePassOption(Params, "reuse-storage", "CoroSplitPass");
729}
730
731Expected<bool> parsePostOrderFunctionAttrsPassOptions(StringRef Params) {
732 return parseSinglePassOption(Params, "skip-non-recursive-function-attrs",
733 "PostOrderFunctionAttrs");
734}
735
736Expected<bool> parseEarlyCSEPassOptions(StringRef Params) {
737 return parseSinglePassOption(Params, "memssa", "EarlyCSE");
738}
739
740Expected<bool> parseEntryExitInstrumenterPassOptions(StringRef Params) {
741 return parseSinglePassOption(Params, "post-inline", "EntryExitInstrumenter");
742}
743
744Expected<bool> parseLoopExtractorPassOptions(StringRef Params) {
745 return parseSinglePassOption(Params, "single", "LoopExtractor");
746}
747
748Expected<bool> parseLowerMatrixIntrinsicsPassOptions(StringRef Params) {
749 return parseSinglePassOption(Params, "minimal", "LowerMatrixIntrinsics");
750}
751
752Expected<AddressSanitizerOptions> parseASanPassOptions(StringRef Params) {
754 while (!Params.empty()) {
755 StringRef ParamName;
756 std::tie(ParamName, Params) = Params.split(';');
757
758 if (ParamName == "kernel") {
759 Result.CompileKernel = true;
760 } else {
761 return make_error<StringError>(
762 formatv("invalid AddressSanitizer pass parameter '{0}' ", ParamName)
763 .str(),
765 }
766 }
767 return Result;
768}
769
770Expected<HWAddressSanitizerOptions> parseHWASanPassOptions(StringRef Params) {
772 while (!Params.empty()) {
773 StringRef ParamName;
774 std::tie(ParamName, Params) = Params.split(';');
775
776 if (ParamName == "recover") {
777 Result.Recover = true;
778 } else if (ParamName == "kernel") {
779 Result.CompileKernel = true;
780 } else {
781 return make_error<StringError>(
782 formatv("invalid HWAddressSanitizer pass parameter '{0}' ", ParamName)
783 .str(),
785 }
786 }
787 return Result;
788}
789
790Expected<MemorySanitizerOptions> parseMSanPassOptions(StringRef Params) {
792 while (!Params.empty()) {
793 StringRef ParamName;
794 std::tie(ParamName, Params) = Params.split(';');
795
796 if (ParamName == "recover") {
797 Result.Recover = true;
798 } else if (ParamName == "kernel") {
799 Result.Kernel = true;
800 } else if (ParamName.consume_front("track-origins=")) {
801 if (ParamName.getAsInteger(0, Result.TrackOrigins))
802 return make_error<StringError>(
803 formatv("invalid argument to MemorySanitizer pass track-origins "
804 "parameter: '{0}' ",
805 ParamName)
806 .str(),
808 } else if (ParamName == "eager-checks") {
809 Result.EagerChecks = true;
810 } else {
811 return make_error<StringError>(
812 formatv("invalid MemorySanitizer pass parameter '{0}' ", ParamName)
813 .str(),
815 }
816 }
817 return Result;
818}
819
820/// Parser of parameters for SimplifyCFG pass.
821Expected<SimplifyCFGOptions> parseSimplifyCFGOptions(StringRef Params) {
823 while (!Params.empty()) {
824 StringRef ParamName;
825 std::tie(ParamName, Params) = Params.split(';');
826
827 bool Enable = !ParamName.consume_front("no-");
828 if (ParamName == "speculate-blocks") {
829 Result.speculateBlocks(Enable);
830 } else if (ParamName == "simplify-cond-branch") {
831 Result.setSimplifyCondBranch(Enable);
832 } else if (ParamName == "forward-switch-cond") {
833 Result.forwardSwitchCondToPhi(Enable);
834 } else if (ParamName == "switch-range-to-icmp") {
835 Result.convertSwitchRangeToICmp(Enable);
836 } else if (ParamName == "switch-to-lookup") {
837 Result.convertSwitchToLookupTable(Enable);
838 } else if (ParamName == "keep-loops") {
839 Result.needCanonicalLoops(Enable);
840 } else if (ParamName == "hoist-common-insts") {
841 Result.hoistCommonInsts(Enable);
842 } else if (ParamName == "sink-common-insts") {
843 Result.sinkCommonInsts(Enable);
844 } else if (Enable && ParamName.consume_front("bonus-inst-threshold=")) {
845 APInt BonusInstThreshold;
846 if (ParamName.getAsInteger(0, BonusInstThreshold))
847 return make_error<StringError>(
848 formatv("invalid argument to SimplifyCFG pass bonus-threshold "
849 "parameter: '{0}' ",
850 ParamName).str(),
852 Result.bonusInstThreshold(BonusInstThreshold.getSExtValue());
853 } else {
854 return make_error<StringError>(
855 formatv("invalid SimplifyCFG pass parameter '{0}' ", ParamName).str(),
857 }
858 }
859 return Result;
860}
861
862Expected<InstCombineOptions> parseInstCombineOptions(StringRef Params) {
864 // When specifying "instcombine" in -passes enable fix-point verification by
865 // default, as this is what most tests should use.
866 Result.setVerifyFixpoint(true);
867 while (!Params.empty()) {
868 StringRef ParamName;
869 std::tie(ParamName, Params) = Params.split(';');
870
871 bool Enable = !ParamName.consume_front("no-");
872 if (ParamName == "use-loop-info") {
873 Result.setUseLoopInfo(Enable);
874 } else if (ParamName == "verify-fixpoint") {
875 Result.setVerifyFixpoint(Enable);
876 } else if (Enable && ParamName.consume_front("max-iterations=")) {
877 APInt MaxIterations;
878 if (ParamName.getAsInteger(0, MaxIterations))
879 return make_error<StringError>(
880 formatv("invalid argument to InstCombine pass max-iterations "
881 "parameter: '{0}' ",
882 ParamName).str(),
884 Result.setMaxIterations((unsigned)MaxIterations.getZExtValue());
885 } else {
886 return make_error<StringError>(
887 formatv("invalid InstCombine pass parameter '{0}' ", ParamName).str(),
889 }
890 }
891 return Result;
892}
893
894/// Parser of parameters for LoopVectorize pass.
895Expected<LoopVectorizeOptions> parseLoopVectorizeOptions(StringRef Params) {
897 while (!Params.empty()) {
898 StringRef ParamName;
899 std::tie(ParamName, Params) = Params.split(';');
900
901 bool Enable = !ParamName.consume_front("no-");
902 if (ParamName == "interleave-forced-only") {
904 } else if (ParamName == "vectorize-forced-only") {
906 } else {
907 return make_error<StringError>(
908 formatv("invalid LoopVectorize parameter '{0}' ", ParamName).str(),
910 }
911 }
912 return Opts;
913}
914
915Expected<std::pair<bool, bool>> parseLoopUnswitchOptions(StringRef Params) {
916 std::pair<bool, bool> Result = {false, true};
917 while (!Params.empty()) {
918 StringRef ParamName;
919 std::tie(ParamName, Params) = Params.split(';');
920
921 bool Enable = !ParamName.consume_front("no-");
922 if (ParamName == "nontrivial") {
923 Result.first = Enable;
924 } else if (ParamName == "trivial") {
925 Result.second = Enable;
926 } else {
927 return make_error<StringError>(
928 formatv("invalid LoopUnswitch pass parameter '{0}' ", ParamName)
929 .str(),
931 }
932 }
933 return Result;
934}
935
936Expected<LICMOptions> parseLICMOptions(StringRef Params) {
938 while (!Params.empty()) {
939 StringRef ParamName;
940 std::tie(ParamName, Params) = Params.split(';');
941
942 bool Enable = !ParamName.consume_front("no-");
943 if (ParamName == "allowspeculation") {
944 Result.AllowSpeculation = Enable;
945 } else {
946 return make_error<StringError>(
947 formatv("invalid LICM pass parameter '{0}' ", ParamName).str(),
949 }
950 }
951 return Result;
952}
953
954Expected<std::pair<bool, bool>> parseLoopRotateOptions(StringRef Params) {
955 std::pair<bool, bool> Result = {true, false};
956 while (!Params.empty()) {
957 StringRef ParamName;
958 std::tie(ParamName, Params) = Params.split(';');
959
960 bool Enable = !ParamName.consume_front("no-");
961 if (ParamName == "header-duplication") {
962 Result.first = Enable;
963 } else if (ParamName == "prepare-for-lto") {
964 Result.second = Enable;
965 } else {
966 return make_error<StringError>(
967 formatv("invalid LoopRotate pass parameter '{0}' ", ParamName).str(),
969 }
970 }
971 return Result;
972}
973
974Expected<bool> parseMergedLoadStoreMotionOptions(StringRef Params) {
975 bool Result = false;
976 while (!Params.empty()) {
977 StringRef ParamName;
978 std::tie(ParamName, Params) = Params.split(';');
979
980 bool Enable = !ParamName.consume_front("no-");
981 if (ParamName == "split-footer-bb") {
982 Result = Enable;
983 } else {
984 return make_error<StringError>(
985 formatv("invalid MergedLoadStoreMotion pass parameter '{0}' ",
986 ParamName)
987 .str(),
989 }
990 }
991 return Result;
992}
993
994Expected<GVNOptions> parseGVNOptions(StringRef Params) {
996 while (!Params.empty()) {
997 StringRef ParamName;
998 std::tie(ParamName, Params) = Params.split(';');
999
1000 bool Enable = !ParamName.consume_front("no-");
1001 if (ParamName == "pre") {
1002 Result.setPRE(Enable);
1003 } else if (ParamName == "load-pre") {
1004 Result.setLoadPRE(Enable);
1005 } else if (ParamName == "split-backedge-load-pre") {
1006 Result.setLoadPRESplitBackedge(Enable);
1007 } else if (ParamName == "memdep") {
1008 Result.setMemDep(Enable);
1009 } else {
1010 return make_error<StringError>(
1011 formatv("invalid GVN pass parameter '{0}' ", ParamName).str(),
1013 }
1014 }
1015 return Result;
1016}
1017
1018Expected<IPSCCPOptions> parseIPSCCPOptions(StringRef Params) {
1020 while (!Params.empty()) {
1021 StringRef ParamName;
1022 std::tie(ParamName, Params) = Params.split(';');
1023
1024 bool Enable = !ParamName.consume_front("no-");
1025 if (ParamName == "func-spec")
1026 Result.setFuncSpec(Enable);
1027 else
1028 return make_error<StringError>(
1029 formatv("invalid IPSCCP pass parameter '{0}' ", ParamName).str(),
1031 }
1032 return Result;
1033}
1034
1035Expected<SROAOptions> parseSROAOptions(StringRef Params) {
1036 if (Params.empty() || Params == "modify-cfg")
1038 if (Params == "preserve-cfg")
1040 return make_error<StringError>(
1041 formatv("invalid SROA pass parameter '{0}' (either preserve-cfg or "
1042 "modify-cfg can be specified)",
1043 Params)
1044 .str(),
1046}
1047
1049parseStackLifetimeOptions(StringRef Params) {
1051 while (!Params.empty()) {
1052 StringRef ParamName;
1053 std::tie(ParamName, Params) = Params.split(';');
1054
1055 if (ParamName == "may") {
1057 } else if (ParamName == "must") {
1059 } else {
1060 return make_error<StringError>(
1061 formatv("invalid StackLifetime parameter '{0}' ", ParamName).str(),
1063 }
1064 }
1065 return Result;
1066}
1067
1068Expected<bool> parseDependenceAnalysisPrinterOptions(StringRef Params) {
1069 return parseSinglePassOption(Params, "normalized-results",
1070 "DependenceAnalysisPrinter");
1071}
1072
1073Expected<bool> parseSeparateConstOffsetFromGEPPassOptions(StringRef Params) {
1074 return parseSinglePassOption(Params, "lower-gep",
1075 "SeparateConstOffsetFromGEP");
1076}
1077
1079parseFunctionSimplificationPipelineOptions(StringRef Params) {
1080 std::optional<OptimizationLevel> L = parseOptLevel(Params);
1081 if (!L || *L == OptimizationLevel::O0) {
1082 return make_error<StringError>(
1083 formatv("invalid function-simplification parameter '{0}' ", Params)
1084 .str(),
1086 };
1087 return *L;
1088}
1089
1090Expected<bool> parseMemorySSAPrinterPassOptions(StringRef Params) {
1091 return parseSinglePassOption(Params, "no-ensure-optimized-uses",
1092 "MemorySSAPrinterPass");
1093}
1094
1095Expected<bool> parseSpeculativeExecutionPassOptions(StringRef Params) {
1096 return parseSinglePassOption(Params, "only-if-divergent-target",
1097 "SpeculativeExecutionPass");
1098}
1099
1100Expected<std::string> parseMemProfUsePassOptions(StringRef Params) {
1101 std::string Result;
1102 while (!Params.empty()) {
1103 StringRef ParamName;
1104 std::tie(ParamName, Params) = Params.split(';');
1105
1106 if (ParamName.consume_front("profile-filename=")) {
1107 Result = ParamName.str();
1108 } else {
1109 return make_error<StringError>(
1110 formatv("invalid MemProfUse pass parameter '{0}' ", ParamName).str(),
1112 }
1113 }
1114 return Result;
1115}
1116
1117Expected<bool> parseStructuralHashPrinterPassOptions(StringRef Params) {
1118 return parseSinglePassOption(Params, "detailed",
1119 "StructuralHashPrinterPass");
1120}
1121
1122Expected<bool> parseWinEHPrepareOptions(StringRef Params) {
1123 return parseSinglePassOption(Params, "demote-catchswitch-only",
1124 "WinEHPreparePass");
1125}
1126
1127} // namespace
1128
1129/// Tests whether a pass name starts with a valid prefix for a default pipeline
1130/// alias.
1132 return Name.startswith("default") || Name.startswith("thinlto") ||
1133 Name.startswith("lto");
1134}
1135
1136/// Tests whether registered callbacks will accept a given pass name.
1137///
1138/// When parsing a pipeline text, the type of the outermost pipeline may be
1139/// omitted, in which case the type is automatically determined from the first
1140/// pass name in the text. This may be a name that is handled through one of the
1141/// callbacks. We check this through the oridinary parsing callbacks by setting
1142/// up a dummy PassManager in order to not force the client to also handle this
1143/// type of query.
1144template <typename PassManagerT, typename CallbacksT>
1145static bool callbacksAcceptPassName(StringRef Name, CallbacksT &Callbacks) {
1146 if (!Callbacks.empty()) {
1147 PassManagerT DummyPM;
1148 for (auto &CB : Callbacks)
1149 if (CB(Name, DummyPM, {}))
1150 return true;
1151 }
1152 return false;
1153}
1154
1155template <typename CallbacksT>
1156static bool isModulePassName(StringRef Name, CallbacksT &Callbacks) {
1157 // Manually handle aliases for pre-configured pipeline fragments.
1160
1161 StringRef NameNoBracket = Name.take_until([](char C) { return C == '<'; });
1162
1163 // Explicitly handle pass manager names.
1164 if (Name == "module")
1165 return true;
1166 if (Name == "cgscc")
1167 return true;
1168 if (NameNoBracket == "function")
1169 return true;
1170 if (Name == "coro-cond")
1171 return true;
1172
1173 // Explicitly handle custom-parsed pass names.
1175 return true;
1176
1177#define MODULE_PASS(NAME, CREATE_PASS) \
1178 if (Name == NAME) \
1179 return true;
1180#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1181 if (checkParametrizedPassName(Name, NAME)) \
1182 return true;
1183#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1184 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1185 return true;
1186#include "PassRegistry.def"
1187
1188 return callbacksAcceptPassName<ModulePassManager>(Name, Callbacks);
1189}
1190
1191template <typename CallbacksT>
1192static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks) {
1193 // Explicitly handle pass manager names.
1194 StringRef NameNoBracket = Name.take_until([](char C) { return C == '<'; });
1195 if (Name == "cgscc")
1196 return true;
1197 if (NameNoBracket == "function")
1198 return true;
1199
1200 // Explicitly handle custom-parsed pass names.
1202 return true;
1204 return true;
1205
1206#define CGSCC_PASS(NAME, CREATE_PASS) \
1207 if (Name == NAME) \
1208 return true;
1209#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1210 if (checkParametrizedPassName(Name, NAME)) \
1211 return true;
1212#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1213 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1214 return true;
1215#include "PassRegistry.def"
1216
1217 return callbacksAcceptPassName<CGSCCPassManager>(Name, Callbacks);
1218}
1219
1220template <typename CallbacksT>
1221static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks) {
1222 // Explicitly handle pass manager names.
1223 StringRef NameNoBracket = Name.take_until([](char C) { return C == '<'; });
1224 if (NameNoBracket == "function")
1225 return true;
1226 if (Name == "loop" || Name == "loop-mssa")
1227 return true;
1228
1229 // Explicitly handle custom-parsed pass names.
1231 return true;
1232
1233#define FUNCTION_PASS(NAME, CREATE_PASS) \
1234 if (Name == NAME) \
1235 return true;
1236#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1237 if (checkParametrizedPassName(Name, NAME)) \
1238 return true;
1239#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1240 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1241 return true;
1242#include "PassRegistry.def"
1243
1244 return callbacksAcceptPassName<FunctionPassManager>(Name, Callbacks);
1245}
1246
1247template <typename CallbacksT>
1248static bool isLoopNestPassName(StringRef Name, CallbacksT &Callbacks,
1249 bool &UseMemorySSA) {
1250 UseMemorySSA = false;
1251
1252 // Explicitly handle custom-parsed pass names.
1254 return true;
1255
1256 if (checkParametrizedPassName(Name, "lnicm")) {
1257 UseMemorySSA = true;
1258 return true;
1259 }
1260
1261#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1262 if (Name == NAME) \
1263 return true;
1264#include "PassRegistry.def"
1265
1266 return callbacksAcceptPassName<LoopPassManager>(Name, Callbacks);
1267}
1268
1269template <typename CallbacksT>
1270static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks,
1271 bool &UseMemorySSA) {
1272 UseMemorySSA = false;
1273
1274 // Explicitly handle custom-parsed pass names.
1276 return true;
1277
1278 if (checkParametrizedPassName(Name, "licm")) {
1279 UseMemorySSA = true;
1280 return true;
1281 }
1282
1283#define LOOP_PASS(NAME, CREATE_PASS) \
1284 if (Name == NAME) \
1285 return true;
1286#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1287 if (checkParametrizedPassName(Name, NAME)) \
1288 return true;
1289#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1290 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1291 return true;
1292#include "PassRegistry.def"
1293
1294 return callbacksAcceptPassName<LoopPassManager>(Name, Callbacks);
1295}
1296
1297std::optional<std::vector<PassBuilder::PipelineElement>>
1298PassBuilder::parsePipelineText(StringRef Text) {
1299 std::vector<PipelineElement> ResultPipeline;
1300
1301 SmallVector<std::vector<PipelineElement> *, 4> PipelineStack = {
1302 &ResultPipeline};
1303 for (;;) {
1304 std::vector<PipelineElement> &Pipeline = *PipelineStack.back();
1305 size_t Pos = Text.find_first_of(",()");
1306 Pipeline.push_back({Text.substr(0, Pos), {}});
1307
1308 // If we have a single terminating name, we're done.
1309 if (Pos == Text.npos)
1310 break;
1311
1312 char Sep = Text[Pos];
1313 Text = Text.substr(Pos + 1);
1314 if (Sep == ',')
1315 // Just a name ending in a comma, continue.
1316 continue;
1317
1318 if (Sep == '(') {
1319 // Push the inner pipeline onto the stack to continue processing.
1320 PipelineStack.push_back(&Pipeline.back().InnerPipeline);
1321 continue;
1322 }
1323
1324 assert(Sep == ')' && "Bogus separator!");
1325 // When handling the close parenthesis, we greedily consume them to avoid
1326 // empty strings in the pipeline.
1327 do {
1328 // If we try to pop the outer pipeline we have unbalanced parentheses.
1329 if (PipelineStack.size() == 1)
1330 return std::nullopt;
1331
1332 PipelineStack.pop_back();
1333 } while (Text.consume_front(")"));
1334
1335 // Check if we've finished parsing.
1336 if (Text.empty())
1337 break;
1338
1339 // Otherwise, the end of an inner pipeline always has to be followed by
1340 // a comma, and then we can continue.
1341 if (!Text.consume_front(","))
1342 return std::nullopt;
1343 }
1344
1345 if (PipelineStack.size() > 1)
1346 // Unbalanced paretheses.
1347 return std::nullopt;
1348
1349 assert(PipelineStack.back() == &ResultPipeline &&
1350 "Wrong pipeline at the bottom of the stack!");
1351 return {std::move(ResultPipeline)};
1352}
1353
1354Error PassBuilder::parseModulePass(ModulePassManager &MPM,
1355 const PipelineElement &E) {
1356 auto &Name = E.Name;
1357 auto &InnerPipeline = E.InnerPipeline;
1358
1359 // First handle complex passes like the pass managers which carry pipelines.
1360 if (!InnerPipeline.empty()) {
1361 if (Name == "module") {
1362 ModulePassManager NestedMPM;
1363 if (auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1364 return Err;
1365 MPM.addPass(std::move(NestedMPM));
1366 return Error::success();
1367 }
1368 if (Name == "coro-cond") {
1369 ModulePassManager NestedMPM;
1370 if (auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1371 return Err;
1372 MPM.addPass(CoroConditionalWrapper(std::move(NestedMPM)));
1373 return Error::success();
1374 }
1375 if (Name == "cgscc") {
1376 CGSCCPassManager CGPM;
1377 if (auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
1378 return Err;
1380 return Error::success();
1381 }
1382 if (auto Params = parseFunctionPipelineName(Name)) {
1383 if (Params->second)
1384 return make_error<StringError>(
1385 "cannot have a no-rerun module to function adaptor",
1388 if (auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1389 return Err;
1390 MPM.addPass(
1391 createModuleToFunctionPassAdaptor(std::move(FPM), Params->first));
1392 return Error::success();
1393 }
1394 if (auto Count = parseRepeatPassName(Name)) {
1395 ModulePassManager NestedMPM;
1396 if (auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1397 return Err;
1398 MPM.addPass(createRepeatedPass(*Count, std::move(NestedMPM)));
1399 return Error::success();
1400 }
1401
1402 for (auto &C : ModulePipelineParsingCallbacks)
1403 if (C(Name, MPM, InnerPipeline))
1404 return Error::success();
1405
1406 // Normal passes can't have pipelines.
1407 return make_error<StringError>(
1408 formatv("invalid use of '{0}' pass as module pipeline", Name).str(),
1410 ;
1411 }
1412
1413 // Manually handle aliases for pre-configured pipeline fragments.
1416 if (!DefaultAliasRegex.match(Name, &Matches))
1417 return make_error<StringError>(
1418 formatv("unknown default pipeline alias '{0}'", Name).str(),
1420
1421 assert(Matches.size() == 3 && "Must capture two matched strings!");
1422
1423 OptimizationLevel L = *parseOptLevel(Matches[2]);
1424
1425 // This is consistent with old pass manager invoked via opt, but
1426 // inconsistent with clang. Clang doesn't enable loop vectorization
1427 // but does enable slp vectorization at Oz.
1428 PTO.LoopVectorization =
1429 L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
1430 PTO.SLPVectorization =
1431 L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
1432
1433 if (Matches[1] == "default") {
1435 } else if (Matches[1] == "thinlto-pre-link") {
1437 } else if (Matches[1] == "thinlto") {
1439 } else if (Matches[1] == "lto-pre-link") {
1440 if (PTO.UnifiedLTO)
1441 // When UnifiedLTO is enabled, use the ThinLTO pre-link pipeline. This
1442 // avoids compile-time performance regressions and keeps the pre-link
1443 // LTO pipeline "unified" for both LTO modes.
1445 else
1447 } else {
1448 assert(Matches[1] == "lto" && "Not one of the matched options!");
1449 MPM.addPass(buildLTODefaultPipeline(L, nullptr));
1450 }
1451 return Error::success();
1452 }
1453
1454 // Finally expand the basic registered passes from the .inc file.
1455#define MODULE_PASS(NAME, CREATE_PASS) \
1456 if (Name == NAME) { \
1457 MPM.addPass(CREATE_PASS); \
1458 return Error::success(); \
1459 }
1460#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1461 if (checkParametrizedPassName(Name, NAME)) { \
1462 auto Params = parsePassParameters(PARSER, Name, NAME); \
1463 if (!Params) \
1464 return Params.takeError(); \
1465 MPM.addPass(CREATE_PASS(Params.get())); \
1466 return Error::success(); \
1467 }
1468#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1469 if (Name == "require<" NAME ">") { \
1470 MPM.addPass( \
1471 RequireAnalysisPass< \
1472 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
1473 return Error::success(); \
1474 } \
1475 if (Name == "invalidate<" NAME ">") { \
1476 MPM.addPass(InvalidateAnalysisPass< \
1477 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1478 return Error::success(); \
1479 }
1480#define CGSCC_PASS(NAME, CREATE_PASS) \
1481 if (Name == NAME) { \
1482 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
1483 return Error::success(); \
1484 }
1485#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1486 if (checkParametrizedPassName(Name, NAME)) { \
1487 auto Params = parsePassParameters(PARSER, Name, NAME); \
1488 if (!Params) \
1489 return Params.takeError(); \
1490 MPM.addPass( \
1491 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
1492 return Error::success(); \
1493 }
1494#define FUNCTION_PASS(NAME, CREATE_PASS) \
1495 if (Name == NAME) { \
1496 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
1497 return Error::success(); \
1498 }
1499#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1500 if (checkParametrizedPassName(Name, NAME)) { \
1501 auto Params = parsePassParameters(PARSER, Name, NAME); \
1502 if (!Params) \
1503 return Params.takeError(); \
1504 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
1505 return Error::success(); \
1506 }
1507#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1508 if (Name == NAME) { \
1509 MPM.addPass(createModuleToFunctionPassAdaptor( \
1510 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1511 return Error::success(); \
1512 }
1513#define LOOP_PASS(NAME, CREATE_PASS) \
1514 if (Name == NAME) { \
1515 MPM.addPass(createModuleToFunctionPassAdaptor( \
1516 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1517 return Error::success(); \
1518 }
1519#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1520 if (checkParametrizedPassName(Name, NAME)) { \
1521 auto Params = parsePassParameters(PARSER, Name, NAME); \
1522 if (!Params) \
1523 return Params.takeError(); \
1524 MPM.addPass( \
1525 createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor( \
1526 CREATE_PASS(Params.get()), false, false))); \
1527 return Error::success(); \
1528 }
1529#include "PassRegistry.def"
1530
1531 for (auto &C : ModulePipelineParsingCallbacks)
1532 if (C(Name, MPM, InnerPipeline))
1533 return Error::success();
1534 return make_error<StringError>(
1535 formatv("unknown module pass '{0}'", Name).str(),
1537}
1538
1539Error PassBuilder::parseCGSCCPass(CGSCCPassManager &CGPM,
1540 const PipelineElement &E) {
1541 auto &Name = E.Name;
1542 auto &InnerPipeline = E.InnerPipeline;
1543
1544 // First handle complex passes like the pass managers which carry pipelines.
1545 if (!InnerPipeline.empty()) {
1546 if (Name == "cgscc") {
1547 CGSCCPassManager NestedCGPM;
1548 if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1549 return Err;
1550 // Add the nested pass manager with the appropriate adaptor.
1551 CGPM.addPass(std::move(NestedCGPM));
1552 return Error::success();
1553 }
1554 if (auto Params = parseFunctionPipelineName(Name)) {
1556 if (auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1557 return Err;
1558 // Add the nested pass manager with the appropriate adaptor.
1560 std::move(FPM), Params->first, Params->second));
1561 return Error::success();
1562 }
1563 if (auto Count = parseRepeatPassName(Name)) {
1564 CGSCCPassManager NestedCGPM;
1565 if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1566 return Err;
1567 CGPM.addPass(createRepeatedPass(*Count, std::move(NestedCGPM)));
1568 return Error::success();
1569 }
1570 if (auto MaxRepetitions = parseDevirtPassName(Name)) {
1571 CGSCCPassManager NestedCGPM;
1572 if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1573 return Err;
1574 CGPM.addPass(
1575 createDevirtSCCRepeatedPass(std::move(NestedCGPM), *MaxRepetitions));
1576 return Error::success();
1577 }
1578
1579 for (auto &C : CGSCCPipelineParsingCallbacks)
1580 if (C(Name, CGPM, InnerPipeline))
1581 return Error::success();
1582
1583 // Normal passes can't have pipelines.
1584 return make_error<StringError>(
1585 formatv("invalid use of '{0}' pass as cgscc pipeline", Name).str(),
1587 }
1588
1589// Now expand the basic registered passes from the .inc file.
1590#define CGSCC_PASS(NAME, CREATE_PASS) \
1591 if (Name == NAME) { \
1592 CGPM.addPass(CREATE_PASS); \
1593 return Error::success(); \
1594 }
1595#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1596 if (checkParametrizedPassName(Name, NAME)) { \
1597 auto Params = parsePassParameters(PARSER, Name, NAME); \
1598 if (!Params) \
1599 return Params.takeError(); \
1600 CGPM.addPass(CREATE_PASS(Params.get())); \
1601 return Error::success(); \
1602 }
1603#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1604 if (Name == "require<" NAME ">") { \
1605 CGPM.addPass(RequireAnalysisPass< \
1606 std::remove_reference_t<decltype(CREATE_PASS)>, \
1607 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
1608 CGSCCUpdateResult &>()); \
1609 return Error::success(); \
1610 } \
1611 if (Name == "invalidate<" NAME ">") { \
1612 CGPM.addPass(InvalidateAnalysisPass< \
1613 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1614 return Error::success(); \
1615 }
1616#define FUNCTION_PASS(NAME, CREATE_PASS) \
1617 if (Name == NAME) { \
1618 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
1619 return Error::success(); \
1620 }
1621#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1622 if (checkParametrizedPassName(Name, NAME)) { \
1623 auto Params = parsePassParameters(PARSER, Name, NAME); \
1624 if (!Params) \
1625 return Params.takeError(); \
1626 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
1627 return Error::success(); \
1628 }
1629#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1630 if (Name == NAME) { \
1631 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
1632 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1633 return Error::success(); \
1634 }
1635#define LOOP_PASS(NAME, CREATE_PASS) \
1636 if (Name == NAME) { \
1637 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
1638 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1639 return Error::success(); \
1640 }
1641#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1642 if (checkParametrizedPassName(Name, NAME)) { \
1643 auto Params = parsePassParameters(PARSER, Name, NAME); \
1644 if (!Params) \
1645 return Params.takeError(); \
1646 CGPM.addPass( \
1647 createCGSCCToFunctionPassAdaptor(createFunctionToLoopPassAdaptor( \
1648 CREATE_PASS(Params.get()), false, false))); \
1649 return Error::success(); \
1650 }
1651#include "PassRegistry.def"
1652
1653 for (auto &C : CGSCCPipelineParsingCallbacks)
1654 if (C(Name, CGPM, InnerPipeline))
1655 return Error::success();
1656 return make_error<StringError>(
1657 formatv("unknown cgscc pass '{0}'", Name).str(),
1659}
1660
1661Error PassBuilder::parseFunctionPass(FunctionPassManager &FPM,
1662 const PipelineElement &E) {
1663 auto &Name = E.Name;
1664 auto &InnerPipeline = E.InnerPipeline;
1665
1666 // First handle complex passes like the pass managers which carry pipelines.
1667 if (!InnerPipeline.empty()) {
1668 if (Name == "function") {
1669 FunctionPassManager NestedFPM;
1670 if (auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
1671 return Err;
1672 // Add the nested pass manager with the appropriate adaptor.
1673 FPM.addPass(std::move(NestedFPM));
1674 return Error::success();
1675 }
1676 if (Name == "loop" || Name == "loop-mssa") {
1677 LoopPassManager LPM;
1678 if (auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
1679 return Err;
1680 // Add the nested pass manager with the appropriate adaptor.
1681 bool UseMemorySSA = (Name == "loop-mssa");
1682 bool UseBFI = llvm::any_of(InnerPipeline, [](auto Pipeline) {
1683 return Pipeline.Name.contains("simple-loop-unswitch");
1684 });
1685 bool UseBPI = llvm::any_of(InnerPipeline, [](auto Pipeline) {
1686 return Pipeline.Name == "loop-predication";
1687 });
1688 FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM), UseMemorySSA,
1689 UseBFI, UseBPI));
1690 return Error::success();
1691 }
1692 if (auto Count = parseRepeatPassName(Name)) {
1693 FunctionPassManager NestedFPM;
1694 if (auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
1695 return Err;
1696 FPM.addPass(createRepeatedPass(*Count, std::move(NestedFPM)));
1697 return Error::success();
1698 }
1699
1700 for (auto &C : FunctionPipelineParsingCallbacks)
1701 if (C(Name, FPM, InnerPipeline))
1702 return Error::success();
1703
1704 // Normal passes can't have pipelines.
1705 return make_error<StringError>(
1706 formatv("invalid use of '{0}' pass as function pipeline", Name).str(),
1708 }
1709
1710// Now expand the basic registered passes from the .inc file.
1711#define FUNCTION_PASS(NAME, CREATE_PASS) \
1712 if (Name == NAME) { \
1713 FPM.addPass(CREATE_PASS); \
1714 return Error::success(); \
1715 }
1716#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1717 if (checkParametrizedPassName(Name, NAME)) { \
1718 auto Params = parsePassParameters(PARSER, Name, NAME); \
1719 if (!Params) \
1720 return Params.takeError(); \
1721 FPM.addPass(CREATE_PASS(Params.get())); \
1722 return Error::success(); \
1723 }
1724#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1725 if (Name == "require<" NAME ">") { \
1726 FPM.addPass( \
1727 RequireAnalysisPass< \
1728 std::remove_reference_t<decltype(CREATE_PASS)>, Function>()); \
1729 return Error::success(); \
1730 } \
1731 if (Name == "invalidate<" NAME ">") { \
1732 FPM.addPass(InvalidateAnalysisPass< \
1733 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1734 return Error::success(); \
1735 }
1736// FIXME: UseMemorySSA is set to false. Maybe we could do things like:
1737// bool UseMemorySSA = !("canon-freeze" || "loop-predication" ||
1738// "guard-widening");
1739// The risk is that it may become obsolete if we're not careful.
1740#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1741 if (Name == NAME) { \
1742 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)); \
1743 return Error::success(); \
1744 }
1745#define LOOP_PASS(NAME, CREATE_PASS) \
1746 if (Name == NAME) { \
1747 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)); \
1748 return Error::success(); \
1749 }
1750#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1751 if (checkParametrizedPassName(Name, NAME)) { \
1752 auto Params = parsePassParameters(PARSER, Name, NAME); \
1753 if (!Params) \
1754 return Params.takeError(); \
1755 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), \
1756 false, false)); \
1757 return Error::success(); \
1758 }
1759#include "PassRegistry.def"
1760
1761 for (auto &C : FunctionPipelineParsingCallbacks)
1762 if (C(Name, FPM, InnerPipeline))
1763 return Error::success();
1764 return make_error<StringError>(
1765 formatv("unknown function pass '{0}'", Name).str(),
1767}
1768
1769Error PassBuilder::parseLoopPass(LoopPassManager &LPM,
1770 const PipelineElement &E) {
1771 StringRef Name = E.Name;
1772 auto &InnerPipeline = E.InnerPipeline;
1773
1774 // First handle complex passes like the pass managers which carry pipelines.
1775 if (!InnerPipeline.empty()) {
1776 if (Name == "loop") {
1777 LoopPassManager NestedLPM;
1778 if (auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
1779 return Err;
1780 // Add the nested pass manager with the appropriate adaptor.
1781 LPM.addPass(std::move(NestedLPM));
1782 return Error::success();
1783 }
1784 if (auto Count = parseRepeatPassName(Name)) {
1785 LoopPassManager NestedLPM;
1786 if (auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
1787 return Err;
1788 LPM.addPass(createRepeatedPass(*Count, std::move(NestedLPM)));
1789 return Error::success();
1790 }
1791
1792 for (auto &C : LoopPipelineParsingCallbacks)
1793 if (C(Name, LPM, InnerPipeline))
1794 return Error::success();
1795
1796 // Normal passes can't have pipelines.
1797 return make_error<StringError>(
1798 formatv("invalid use of '{0}' pass as loop pipeline", Name).str(),
1800 }
1801
1802// Now expand the basic registered passes from the .inc file.
1803#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1804 if (Name == NAME) { \
1805 LPM.addPass(CREATE_PASS); \
1806 return Error::success(); \
1807 }
1808#define LOOP_PASS(NAME, CREATE_PASS) \
1809 if (Name == NAME) { \
1810 LPM.addPass(CREATE_PASS); \
1811 return Error::success(); \
1812 }
1813#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1814 if (checkParametrizedPassName(Name, NAME)) { \
1815 auto Params = parsePassParameters(PARSER, Name, NAME); \
1816 if (!Params) \
1817 return Params.takeError(); \
1818 LPM.addPass(CREATE_PASS(Params.get())); \
1819 return Error::success(); \
1820 }
1821#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1822 if (Name == "require<" NAME ">") { \
1823 LPM.addPass(RequireAnalysisPass< \
1824 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
1825 LoopAnalysisManager, LoopStandardAnalysisResults &, \
1826 LPMUpdater &>()); \
1827 return Error::success(); \
1828 } \
1829 if (Name == "invalidate<" NAME ">") { \
1830 LPM.addPass(InvalidateAnalysisPass< \
1831 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1832 return Error::success(); \
1833 }
1834#include "PassRegistry.def"
1835
1836 for (auto &C : LoopPipelineParsingCallbacks)
1837 if (C(Name, LPM, InnerPipeline))
1838 return Error::success();
1839 return make_error<StringError>(formatv("unknown loop pass '{0}'", Name).str(),
1841}
1842
1843bool PassBuilder::parseAAPassName(AAManager &AA, StringRef Name) {
1844#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
1845 if (Name == NAME) { \
1846 AA.registerModuleAnalysis< \
1847 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
1848 return true; \
1849 }
1850#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
1851 if (Name == NAME) { \
1852 AA.registerFunctionAnalysis< \
1853 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
1854 return true; \
1855 }
1856#include "PassRegistry.def"
1857
1858 for (auto &C : AAParsingCallbacks)
1859 if (C(Name, AA))
1860 return true;
1861 return false;
1862}
1863
1864Error PassBuilder::parseLoopPassPipeline(LoopPassManager &LPM,
1865 ArrayRef<PipelineElement> Pipeline) {
1866 for (const auto &Element : Pipeline) {
1867 if (auto Err = parseLoopPass(LPM, Element))
1868 return Err;
1869 }
1870 return Error::success();
1871}
1872
1873Error PassBuilder::parseFunctionPassPipeline(
1875 for (const auto &Element : Pipeline) {
1876 if (auto Err = parseFunctionPass(FPM, Element))
1877 return Err;
1878 }
1879 return Error::success();
1880}
1881
1882Error PassBuilder::parseCGSCCPassPipeline(CGSCCPassManager &CGPM,
1883 ArrayRef<PipelineElement> Pipeline) {
1884 for (const auto &Element : Pipeline) {
1885 if (auto Err = parseCGSCCPass(CGPM, Element))
1886 return Err;
1887 }
1888 return Error::success();
1889}
1890
1902}
1903
1904Error PassBuilder::parseModulePassPipeline(ModulePassManager &MPM,
1905 ArrayRef<PipelineElement> Pipeline) {
1906 for (const auto &Element : Pipeline) {
1907 if (auto Err = parseModulePass(MPM, Element))
1908 return Err;
1909 }
1910 return Error::success();
1911}
1912
1913// Primary pass pipeline description parsing routine for a \c ModulePassManager
1914// FIXME: Should this routine accept a TargetMachine or require the caller to
1915// pre-populate the analysis managers with target-specific stuff?
1917 StringRef PipelineText) {
1918 auto Pipeline = parsePipelineText(PipelineText);
1919 if (!Pipeline || Pipeline->empty())
1920 return make_error<StringError>(
1921 formatv("invalid pipeline '{0}'", PipelineText).str(),
1923
1924 // If the first name isn't at the module layer, wrap the pipeline up
1925 // automatically.
1926 StringRef FirstName = Pipeline->front().Name;
1927
1928 if (!isModulePassName(FirstName, ModulePipelineParsingCallbacks)) {
1929 bool UseMemorySSA;
1930 if (isCGSCCPassName(FirstName, CGSCCPipelineParsingCallbacks)) {
1931 Pipeline = {{"cgscc", std::move(*Pipeline)}};
1932 } else if (isFunctionPassName(FirstName,
1933 FunctionPipelineParsingCallbacks)) {
1934 Pipeline = {{"function", std::move(*Pipeline)}};
1935 } else if (isLoopNestPassName(FirstName, LoopPipelineParsingCallbacks,
1936 UseMemorySSA)) {
1937 Pipeline = {{"function", {{UseMemorySSA ? "loop-mssa" : "loop",
1938 std::move(*Pipeline)}}}};
1939 } else if (isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
1940 UseMemorySSA)) {
1941 Pipeline = {{"function", {{UseMemorySSA ? "loop-mssa" : "loop",
1942 std::move(*Pipeline)}}}};
1943 } else {
1944 for (auto &C : TopLevelPipelineParsingCallbacks)
1945 if (C(MPM, *Pipeline))
1946 return Error::success();
1947
1948 // Unknown pass or pipeline name!
1949 auto &InnerPipeline = Pipeline->front().InnerPipeline;
1950 return make_error<StringError>(
1951 formatv("unknown {0} name '{1}'",
1952 (InnerPipeline.empty() ? "pass" : "pipeline"), FirstName)
1953 .str(),
1955 }
1956 }
1957
1958 if (auto Err = parseModulePassPipeline(MPM, *Pipeline))
1959 return Err;
1960 return Error::success();
1961}
1962
1963// Primary pass pipeline description parsing routine for a \c CGSCCPassManager
1965 StringRef PipelineText) {
1966 auto Pipeline = parsePipelineText(PipelineText);
1967 if (!Pipeline || Pipeline->empty())
1968 return make_error<StringError>(
1969 formatv("invalid pipeline '{0}'", PipelineText).str(),
1971
1972 StringRef FirstName = Pipeline->front().Name;
1973 if (!isCGSCCPassName(FirstName, CGSCCPipelineParsingCallbacks))
1974 return make_error<StringError>(
1975 formatv("unknown cgscc pass '{0}' in pipeline '{1}'", FirstName,
1976 PipelineText)
1977 .str(),
1979
1980 if (auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
1981 return Err;
1982 return Error::success();
1983}
1984
1985// Primary pass pipeline description parsing routine for a \c
1986// FunctionPassManager
1988 StringRef PipelineText) {
1989 auto Pipeline = parsePipelineText(PipelineText);
1990 if (!Pipeline || Pipeline->empty())
1991 return make_error<StringError>(
1992 formatv("invalid pipeline '{0}'", PipelineText).str(),
1994
1995 StringRef FirstName = Pipeline->front().Name;
1996 if (!isFunctionPassName(FirstName, FunctionPipelineParsingCallbacks))
1997 return make_error<StringError>(
1998 formatv("unknown function pass '{0}' in pipeline '{1}'", FirstName,
1999 PipelineText)
2000 .str(),
2002
2003 if (auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2004 return Err;
2005 return Error::success();
2006}
2007
2008// Primary pass pipeline description parsing routine for a \c LoopPassManager
2010 StringRef PipelineText) {
2011 auto Pipeline = parsePipelineText(PipelineText);
2012 if (!Pipeline || Pipeline->empty())
2013 return make_error<StringError>(
2014 formatv("invalid pipeline '{0}'", PipelineText).str(),
2016
2017 if (auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2018 return Err;
2019
2020 return Error::success();
2021}
2022
2024 // If the pipeline just consists of the word 'default' just replace the AA
2025 // manager with our default one.
2026 if (PipelineText == "default") {
2028 return Error::success();
2029 }
2030
2031 while (!PipelineText.empty()) {
2033 std::tie(Name, PipelineText) = PipelineText.split(',');
2034 if (!parseAAPassName(AA, Name))
2035 return make_error<StringError>(
2036 formatv("unknown alias analysis name '{0}'", Name).str(),
2038 }
2039
2040 return Error::success();
2041}
2042
2044 OS << " " << PassName << "\n";
2045}
2047 raw_ostream &OS) {
2048 OS << " " << PassName << "<" << Params << ">\n";
2049}
2050
2052 // TODO: print pass descriptions when they are available
2053
2054 OS << "Module passes:\n";
2055#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2056#include "PassRegistry.def"
2057
2058 OS << "Module passes with params:\n";
2059#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2060 printPassName(NAME, PARAMS, OS);
2061#include "PassRegistry.def"
2062
2063 OS << "Module analyses:\n";
2064#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2065#include "PassRegistry.def"
2066
2067 OS << "Module alias analyses:\n";
2068#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2069#include "PassRegistry.def"
2070
2071 OS << "CGSCC passes:\n";
2072#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2073#include "PassRegistry.def"
2074
2075 OS << "CGSCC passes with params:\n";
2076#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2077 printPassName(NAME, PARAMS, OS);
2078#include "PassRegistry.def"
2079
2080 OS << "CGSCC analyses:\n";
2081#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2082#include "PassRegistry.def"
2083
2084 OS << "Function passes:\n";
2085#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2086#include "PassRegistry.def"
2087
2088 OS << "Function passes with params:\n";
2089#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2090 printPassName(NAME, PARAMS, OS);
2091#include "PassRegistry.def"
2092
2093 OS << "Function analyses:\n";
2094#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2095#include "PassRegistry.def"
2096
2097 OS << "Function alias analyses:\n";
2098#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2099#include "PassRegistry.def"
2100
2101 OS << "LoopNest passes:\n";
2102#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2103#include "PassRegistry.def"
2104
2105 OS << "Loop passes:\n";
2106#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2107#include "PassRegistry.def"
2108
2109 OS << "Loop passes with params:\n";
2110#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2111 printPassName(NAME, PARAMS, OS);
2112#include "PassRegistry.def"
2113
2114 OS << "Loop analyses:\n";
2115#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2116#include "PassRegistry.def"
2117}
2118
2120 const std::function<bool(ModulePassManager &, ArrayRef<PipelineElement>)>
2121 &C) {
2122 TopLevelPipelineParsingCallbacks.push_back(C);
2123}
AggressiveInstCombiner - Combine expression patterns to form expressions with fewer,...
This file implements a simple N^2 alias analysis accuracy evaluator.
Provides passes to inlining "always_inline" functions.
This is the interface for LLVM's primary stateless and local alias analysis.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file provides the interface for LLVM's Call Graph Profile pass.
This header provides classes for managing passes over SCCs of the call graph.
This file provides interfaces used to build and manipulate a call graph, which is a very useful tool ...
This file declares an analysis pass that computes CycleInfo for LLVM IR, specialized from GenericCycl...
std::string Name
This file provides the interface for a simple, fast CSE pass.
This file provides a pass which clones the current module and runs the provided pass pipeline on the ...
Super simple passes to force specific function attrs from the commandline into the IR for debugging p...
Provides passes for computing function attributes based on interprocedural analyses.
This file provides the interface for the GCOV style profiler pass.
This file provides the interface for LLVM's Global Value Numbering pass which eliminates fully redund...
This is the interface for a simple mod/ref and alias analysis over globals.
Defines an IR pass for the creation of hardware loops.
AcceleratorCodeSelection - Identify all functions reachable from a kernel, removing those that are un...
This file defines passes to print out IR in various granularities.
Interfaces for passes which infer implicit function attributes from the name and signature of functio...
This file provides the primary interface to the instcombine pass.
Defines passes for running instruction simplification across chunks of IR.
This file provides the interface for LLVM's PGO Instrumentation lowering pass.
See the comments on JumpThreadingPass.
Implements a lazy call graph analysis and related passes for the new pass manager.
This file defines the interface for the loop cache analysis.
This file provides the interface for LLVM's Loop Data Prefetching Pass.
This file implements the Loop Fusion pass.
This header defines the LoopLoadEliminationPass object.
This file defines the interface for the loop nest analysis.
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
The header file for the LowerConstantIntrinsics pass as used by the new pass manager.
The header file for the LowerExpectIntrinsic pass as used by the new pass manager.
#define F(x, y, z)
Definition: MD5.cpp:55
#define G(x, y, z)
Definition: MD5.cpp:56
UseBFI
Definition: MachineLICM.cpp:88
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
This pass performs merges of loads and stores on both sides of a.
This is the interface to build a ModuleSummaryIndex for a module.
Contains a collection of routines for determining if a given instruction is guaranteed to execute if ...
This file provides the interface for LLVM's Global Value Numbering pass.
This file declares a simple ARC-aware AliasAnalysis using special knowledge of Objective C to enhance...
This header enumerates the LLVM-provided high-level optimization levels.
This file provides the interface for IR based instrumentation passes ( (profile-gen,...
CGSCCAnalysisManager CGAM
ModulePassManager MPM
LoopAnalysisManager LAM
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
const char LLVMTargetMachineRef TM
PassInstrumentationCallbacks PIC
static bool isModulePassName(StringRef Name, CallbacksT &Callbacks)
static bool callbacksAcceptPassName(StringRef Name, CallbacksT &Callbacks)
Tests whether registered callbacks will accept a given pass name.
static bool checkParametrizedPassName(StringRef Name, StringRef PassName)
static std::optional< int > parseDevirtPassName(StringRef Name)
static std::optional< int > parseRepeatPassName(StringRef Name)
static bool startsWithDefaultPipelineAliasPrefix(StringRef Name)
Tests whether a pass name starts with a valid prefix for a default pipeline alias.
static bool isLoopNestPassName(StringRef Name, CallbacksT &Callbacks, bool &UseMemorySSA)
static std::optional< OptimizationLevel > parseOptLevel(StringRef S)
static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks, bool &UseMemorySSA)
static std::optional< std::pair< bool, bool > > parseFunctionPipelineName(StringRef Name)
static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks)
static void printPassName(StringRef PassName, raw_ostream &OS)
static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks)
static const Regex DefaultAliasRegex("^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$")
This header defines various interfaces for pass management in LLVM.
This file implements the PredicateInfo analysis, which creates an Extended SSA form for operations us...
This file implements relative lookup table converter that converts lookup tables to relative lookup t...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file provides the interface for LLVM's Scalar Replacement of Aggregates pass.
raw_pwrite_stream & OS
This file provides the interface for the pseudo probe implementation for AutoFDO.
This file provides the interface for the sampled PGO loader pass.
This is the interface for a SCEV-based alias analysis.
This pass converts vector operations into scalar operations (or, optionally, operations on smaller ve...
This is the interface for a metadata-based scoped no-alias analysis.
This file provides the interface for the pass responsible for both simplifying and canonicalizing the...
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
This pass exposes codegen information to IR-level passes.
This is the interface for a metadata-based TBAA.
Defines an IR pass for type promotion.
LLVM IR instance of the generic uniformity analysis.
static const char PassName[]
A manager for alias analyses.
Class for arbitrary precision integers.
Definition: APInt.h:76
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1485
int64_t getSExtValue() const
Get sign extended value.
Definition: APInt.h:1507
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:649
bool registerPass(PassBuilderT &&PassBuilder)
Register an analysis pass with the manager.
Definition: PassManager.h:865
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
LLVM Basic Block Representation.
Definition: BasicBlock.h:60
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition: BasicBlock.h:228
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
static ErrorSuccess success()
Create a success value.
Definition: Error.h:334
Tagged union holding either a T or a Error.
Definition: Error.h:474
static GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
Definition: Globals.cpp:517
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
Definition: PassManager.h:962
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
An SCC of the call graph.
A lazily constructed view of the call graph of a module.
This class represents a loop nest and can be used to query its properties.
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:44
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
static const OptimizationLevel O3
Optimize for fast execution as much as possible.
static const OptimizationLevel Oz
A very specialized mode that will optimize for code size at any and all costs.
static const OptimizationLevel O0
Disable as many optimizations as possible.
static const OptimizationLevel Os
Similar to O2 but tries to optimize for small code size instead of fast execution without triggering ...
static const OptimizationLevel O2
Optimize for fast execution as much as possible without triggering significant incremental compile ti...
static const OptimizationLevel O1
Optimize quickly without destroying debuggability.
void printPassNames(raw_ostream &OS)
Print pass names.
AAManager buildDefaultAAPipeline()
Build the default AAManager with the default alias analysis pipeline registered.
Error parseAAPipeline(AAManager &AA, StringRef PipelineText)
Parse a textual alias analysis pipeline into the provided AA manager.
ModulePassManager buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level)
Build a pre-link, ThinLTO-targeting default optimization pipeline to a pass manager.
PassBuilder(TargetMachine *TM=nullptr, PipelineTuningOptions PTO=PipelineTuningOptions(), std::optional< PGOOptions > PGOOpt=std::nullopt, PassInstrumentationCallbacks *PIC=nullptr)
void registerLoopAnalyses(LoopAnalysisManager &LAM)
Registers all available loop analysis passes.
void crossRegisterProxies(LoopAnalysisManager &LAM, FunctionAnalysisManager &FAM, CGSCCAnalysisManager &CGAM, ModuleAnalysisManager &MAM)
Cross register the analysis managers through their proxies.
ModulePassManager buildPerModuleDefaultPipeline(OptimizationLevel Level, bool LTOPreLink=false)
Build a per-module default optimization pipeline.
Error parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText)
Parse a textual pass pipeline description into a ModulePassManager.
ModulePassManager buildLTODefaultPipeline(OptimizationLevel Level, ModuleSummaryIndex *ExportSummary)
Build an LTO default optimization pipeline to a pass manager.
ModulePassManager buildThinLTODefaultPipeline(OptimizationLevel Level, const ModuleSummaryIndex *ImportSummary)
Build an ThinLTO default optimization pipeline to a pass manager.
void registerModuleAnalyses(ModuleAnalysisManager &MAM)
Registers all available module analysis passes.
void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM)
Registers all available CGSCC analysis passes.
void registerParseTopLevelPipelineCallback(const std::function< bool(ModulePassManager &, ArrayRef< PipelineElement >)> &C)
Register a callback for a top-level pipeline entry.
ModulePassManager buildLTOPreLinkDefaultPipeline(OptimizationLevel Level)
Build a pre-link, LTO-targeting default optimization pipeline to a pass manager.
void registerFunctionAnalyses(FunctionAnalysisManager &FAM)
Registers all available function analysis passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t< is_detected< HasRunOnLoopT, PassT >::value > addPass(PassT &&Pass)
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same< PassT, PassManager >::value > addPass(PassT &&Pass)
Definition: PassManager.h:573
Tunable parameters for passes in the default pipelines.
Definition: PassBuilder.h:41
bool SLPVectorization
Tuning option to enable/disable slp loop vectorization, set based on opt level.
Definition: PassBuilder.h:56
bool LoopVectorization
Tuning option to enable/disable loop vectorization, set based on opt level.
Definition: PassBuilder.h:52
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:662
A set of analyses that are preserved following a run of a transformation pass.
Definition: PassManager.h:172
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition: PassManager.h:175
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: PassManager.h:178
bool match(StringRef String, SmallVectorImpl< StringRef > *Matches=nullptr, std::string *Error=nullptr) const
matches - Match the regex against a given String.
Definition: Regex.cpp:83
size_t size() const
Definition: SmallVector.h:91
void push_back(const T &Elt)
Definition: SmallVector.h:416
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1200
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition: StringRef.h:704
bool consume_back(StringRef Suffix)
Returns true if this StringRef has the given suffix and removes that suffix.
Definition: StringRef.h:659
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition: StringRef.h:474
std::string str() const
str - Get the contents as an std::string.
Definition: StringRef.h:222
constexpr bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:134
char front() const
front - Get the first character in the string.
Definition: StringRef.h:140
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Definition: StringRef.h:639
A switch()-like statement whose cases are string literals.
Definition: StringSwitch.h:44
StringSwitch & Case(StringLiteral S, T Value)
Definition: StringSwitch.h:69
R Default(T Value)
Definition: StringSwitch.h:182
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:78
This function has undefined behavior.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
Interfaces for registering analysis passes, producing common pass manager configurations,...
Key
PAL metadata keys.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto formatv(const char *Fmt, Ts &&... Vals) -> formatv_object< decltype(std::make_tuple(detail::build_format_adapter(std::forward< Ts >(Vals))...))>
std::vector< std::string > printAfterPasses()
ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
Definition: PassManager.h:1247
RepeatedPass< PassT > createRepeatedPass(int Count, PassT &&P)
Definition: PassManager.h:1382
DevirtSCCRepeatedPass createDevirtSCCRepeatedPass(CGSCCPassT &&Pass, int MaxIterations)
A function to deduce a function pass type and wrap it in the templated adaptor.
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition: Error.cpp:90
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
Definition: PassManager.h:1197
OuterAnalysisManagerProxy< ModuleAnalysisManager, LazyCallGraph::SCC, LazyCallGraph & > ModuleAnalysisManagerCGSCCProxy
A proxy from a ModuleAnalysisManager to an SCC.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1733
std::vector< std::string > printBeforePasses()
ModuleToPostOrderCGSCCPassAdaptor createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
CGSCCToFunctionPassAdaptor createCGSCCToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false, bool NoRerun=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
Definition: PassManager.h:1043
cl::opt< bool > PrintPipelinePasses("print-pipeline-passes", cl::desc("Print a '-passes' compatible string describing the pipeline " "(best-effort only)."))
OuterAnalysisManagerProxy< FunctionAnalysisManager, Loop, LoopStandardAnalysisResults & > FunctionAnalysisManagerLoopProxy
A proxy from a FunctionAnalysisManager to a Loop.
OuterAnalysisManagerProxy< CGSCCAnalysisManager, Function > CGSCCAnalysisManagerFunctionProxy
A proxy from a CGSCCAnalysisManager to a Function.
std::enable_if_t< is_detected< HasRunOnLoopT, LoopPassT >::value, FunctionToLoopPassAdaptor > createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA=false, bool UseBlockFrequencyInfo=false, bool UseBranchProbabilityInfo=false)
A function to deduce a loop pass type and wrap it in the templated adaptor.
bool isFilterPassesEmpty()
@ Enable
Enable colors.
A CRTP mix-in that provides informational APIs needed for analysis passes.
Definition: PassManager.h:414
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: PassManager.h:89
Support structure for SCC passes to communicate updates the call graph back to the CGSCC pass manager...
A set of parameters to control various transforms performed by GVN pass.
Definition: GVN.h:74
HardwareLoopOptions & setForceNested(bool Force)
Definition: HardwareLoops.h:45
HardwareLoopOptions & setDecrement(unsigned Count)
Definition: HardwareLoops.h:29
HardwareLoopOptions & setForceGuard(bool Force)
Definition: HardwareLoops.h:49
HardwareLoopOptions & setForce(bool Force)
Definition: HardwareLoops.h:37
HardwareLoopOptions & setCounterBitwidth(unsigned Width)
Definition: HardwareLoops.h:33
HardwareLoopOptions & setForcePhi(bool Force)
Definition: HardwareLoops.h:41
A set of parameters to control various transforms performed by IPSCCP pass.
Definition: SCCP.h:35
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
A set of parameters used to control various transforms performed by the LoopUnroll pass.
LoopUnrollOptions & setPeeling(bool Peeling)
Enables or disables loop peeling.
LoopUnrollOptions & setOptLevel(int O)
LoopUnrollOptions & setPartial(bool Partial)
Enables or disables partial unrolling.
LoopUnrollOptions & setFullUnrollMaxCount(unsigned O)
LoopUnrollOptions & setUpperBound(bool UpperBound)
Enables or disables the use of trip count upper bound in loop unrolling.
LoopUnrollOptions & setRuntime(bool Runtime)
Enables or disables unrolling of loops with runtime trip count.
LoopUnrollOptions & setProfileBasedPeeling(int O)
LoopVectorizeOptions & setVectorizeOnlyWhenForced(bool Value)
LoopVectorizeOptions & setInterleaveOnlyWhenForced(bool Value)
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition: PassManager.h:391
static StringRef name()
Gets the name of the pass we are mixed into.
Definition: PassManager.h:393