LLVM 20.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
33#include "llvm/Analysis/DDG.h"
52#include "llvm/Analysis/Lint.h"
145#include "llvm/IR/DebugInfo.h"
146#include "llvm/IR/Dominators.h"
147#include "llvm/IR/PassManager.h"
148#include "llvm/IR/PrintPasses.h"
150#include "llvm/IR/Verifier.h"
154#include "llvm/Support/Debug.h"
157#include "llvm/Support/Regex.h"
346#include <optional>
347
348using namespace llvm;
349
351 "^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$");
352
353namespace llvm {
355 "print-pipeline-passes",
356 cl::desc("Print a '-passes' compatible string describing the pipeline "
357 "(best-effort only)."));
358} // namespace llvm
359
360AnalysisKey NoOpModuleAnalysis::Key;
361AnalysisKey NoOpCGSCCAnalysis::Key;
362AnalysisKey NoOpFunctionAnalysis::Key;
363AnalysisKey NoOpLoopAnalysis::Key;
364
365namespace {
366
367// Passes for testing crashes.
368// DO NOT USE THIS EXCEPT FOR TESTING!
369class TriggerCrashModulePass : public PassInfoMixin<TriggerCrashModulePass> {
370public:
372 abort();
373 return PreservedAnalyses::all();
374 }
375 static StringRef name() { return "TriggerCrashModulePass"; }
376};
377
378class TriggerCrashFunctionPass
379 : public PassInfoMixin<TriggerCrashFunctionPass> {
380public:
382 abort();
383 return PreservedAnalyses::all();
384 }
385 static StringRef name() { return "TriggerCrashFunctionPass"; }
386};
387
388// A pass for testing message reporting of -verify-each failures.
389// DO NOT USE THIS EXCEPT FOR TESTING!
390class TriggerVerifierErrorPass
391 : public PassInfoMixin<TriggerVerifierErrorPass> {
392public:
394 // Intentionally break the Module by creating an alias without setting the
395 // aliasee.
396 auto *PtrTy = llvm::PointerType::getUnqual(M.getContext());
397 GlobalAlias::create(PtrTy, PtrTy->getAddressSpace(),
398 GlobalValue::LinkageTypes::InternalLinkage,
399 "__bad_alias", nullptr, &M);
401 }
402
404 // Intentionally break the Function by inserting a terminator
405 // instruction in the middle of a basic block.
406 BasicBlock &BB = F.getEntryBlock();
407 new UnreachableInst(F.getContext(), BB.getTerminator()->getIterator());
409 }
410
412 // Intentionally create a virtual register and set NoVRegs property.
413 auto &MRI = MF.getRegInfo();
414 MRI.createGenericVirtualRegister(LLT::scalar(8));
415 MF.getProperties().set(MachineFunctionProperties::Property::NoVRegs);
416 return PreservedAnalyses::all();
417 }
418
419 static StringRef name() { return "TriggerVerifierErrorPass"; }
420};
421
422// A pass requires all MachineFunctionProperties.
423// DO NOT USE THIS EXCEPT FOR TESTING!
424class RequireAllMachineFunctionPropertiesPass
425 : public PassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
426public:
428 MFPropsModifier _(*this, MF);
430 }
431
432 static MachineFunctionProperties getRequiredProperties() {
434 MFProps.set(MachineFunctionProperties::Property::FailedISel);
435 MFProps.set(MachineFunctionProperties::Property::FailsVerification);
436 MFProps.set(MachineFunctionProperties::Property::IsSSA);
437 MFProps.set(MachineFunctionProperties::Property::Legalized);
438 MFProps.set(MachineFunctionProperties::Property::NoPHIs);
439 MFProps.set(MachineFunctionProperties::Property::NoVRegs);
440 MFProps.set(MachineFunctionProperties::Property::RegBankSelected);
441 MFProps.set(MachineFunctionProperties::Property::Selected);
442 MFProps.set(MachineFunctionProperties::Property::TiedOpsRewritten);
443 MFProps.set(MachineFunctionProperties::Property::TracksDebugUserValues);
444 MFProps.set(MachineFunctionProperties::Property::TracksLiveness);
445 return MFProps;
446 }
447 static StringRef name() { return "RequireAllMachineFunctionPropertiesPass"; }
448};
449
450} // namespace
451
453 std::optional<PGOOptions> PGOOpt,
455 : TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC) {
456 if (TM)
457 TM->registerPassBuilderCallbacks(*this);
458 if (PIC) {
460 // MSVC requires this to be captured if it's used inside decltype.
461 // Other compilers consider it an unused lambda capture.
462 (void)this;
463#define MODULE_PASS(NAME, CREATE_PASS) \
464 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
465#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
466 PIC->addClassToPassName(CLASS, NAME);
467#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
468 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
469#define FUNCTION_PASS(NAME, CREATE_PASS) \
470 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
471#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
472 PIC->addClassToPassName(CLASS, NAME);
473#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
474 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
475#define LOOPNEST_PASS(NAME, CREATE_PASS) \
476 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
477#define LOOP_PASS(NAME, CREATE_PASS) \
478 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
479#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
480 PIC->addClassToPassName(CLASS, NAME);
481#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
482 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
483#define CGSCC_PASS(NAME, CREATE_PASS) \
484 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
485#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
486 PIC->addClassToPassName(CLASS, NAME);
487#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
488 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
489#include "PassRegistry.def"
490
491#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
492 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
493#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
494 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
495#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
496 PARAMS) \
497 PIC->addClassToPassName(CLASS, NAME);
498#include "llvm/Passes/MachinePassRegistry.def"
499 });
500 }
501}
502
504#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
505 MAM.registerPass([&] { return CREATE_PASS; });
506#include "PassRegistry.def"
507
508 for (auto &C : ModuleAnalysisRegistrationCallbacks)
509 C(MAM);
510}
511
513#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
514 CGAM.registerPass([&] { return CREATE_PASS; });
515#include "PassRegistry.def"
516
517 for (auto &C : CGSCCAnalysisRegistrationCallbacks)
518 C(CGAM);
519}
520
522 // We almost always want the default alias analysis pipeline.
523 // If a user wants a different one, they can register their own before calling
524 // registerFunctionAnalyses().
525 FAM.registerPass([&] { return buildDefaultAAPipeline(); });
526
527#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
528 FAM.registerPass([&] { return CREATE_PASS; });
529#include "PassRegistry.def"
530
531 for (auto &C : FunctionAnalysisRegistrationCallbacks)
532 C(FAM);
533}
534
537
538#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
539 MFAM.registerPass([&] { return CREATE_PASS; });
540#include "llvm/Passes/MachinePassRegistry.def"
541
542 for (auto &C : MachineFunctionAnalysisRegistrationCallbacks)
543 C(MFAM);
544}
545
547#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
548 LAM.registerPass([&] { return CREATE_PASS; });
549#include "PassRegistry.def"
550
551 for (auto &C : LoopAnalysisRegistrationCallbacks)
552 C(LAM);
553}
554
555static std::optional<std::pair<bool, bool>>
557 std::pair<bool, bool> Params;
558 if (!Name.consume_front("function"))
559 return std::nullopt;
560 if (Name.empty())
561 return Params;
562 if (!Name.consume_front("<") || !Name.consume_back(">"))
563 return std::nullopt;
564 while (!Name.empty()) {
565 auto [Front, Back] = Name.split(';');
566 Name = Back;
567 if (Front == "eager-inv")
568 Params.first = true;
569 else if (Front == "no-rerun")
570 Params.second = true;
571 else
572 return std::nullopt;
573 }
574 return Params;
575}
576
577static std::optional<int> parseDevirtPassName(StringRef Name) {
578 if (!Name.consume_front("devirt<") || !Name.consume_back(">"))
579 return std::nullopt;
580 int Count;
581 if (Name.getAsInteger(0, Count) || Count < 0)
582 return std::nullopt;
583 return Count;
584}
585
586static std::optional<OptimizationLevel> parseOptLevel(StringRef S) {
588 .Case("O0", OptimizationLevel::O0)
594 .Default(std::nullopt);
595}
596
598 StringRef OptionName,
600 bool Result = false;
601 while (!Params.empty()) {
602 StringRef ParamName;
603 std::tie(ParamName, Params) = Params.split(';');
604
605 if (ParamName == OptionName) {
606 Result = true;
607 } else {
608 return make_error<StringError>(
609 formatv("invalid {1} pass parameter '{0}' ", ParamName, PassName)
610 .str(),
612 }
613 }
614 return Result;
615}
616
617namespace {
618
619/// Parser of parameters for HardwareLoops pass.
620Expected<HardwareLoopOptions> parseHardwareLoopOptions(StringRef Params) {
621 HardwareLoopOptions HardwareLoopOpts;
622
623 while (!Params.empty()) {
624 StringRef ParamName;
625 std::tie(ParamName, Params) = Params.split(';');
626 if (ParamName.consume_front("hardware-loop-decrement=")) {
627 int Count;
628 if (ParamName.getAsInteger(0, Count))
629 return make_error<StringError>(
630 formatv("invalid HardwareLoopPass parameter '{0}' ", ParamName).str(),
632 HardwareLoopOpts.setDecrement(Count);
633 continue;
634 }
635 if (ParamName.consume_front("hardware-loop-counter-bitwidth=")) {
636 int Count;
637 if (ParamName.getAsInteger(0, Count))
638 return make_error<StringError>(
639 formatv("invalid HardwareLoopPass parameter '{0}' ", ParamName).str(),
641 HardwareLoopOpts.setCounterBitwidth(Count);
642 continue;
643 }
644 if (ParamName == "force-hardware-loops") {
645 HardwareLoopOpts.setForce(true);
646 } else if (ParamName == "force-hardware-loop-phi") {
647 HardwareLoopOpts.setForcePhi(true);
648 } else if (ParamName == "force-nested-hardware-loop") {
649 HardwareLoopOpts.setForceNested(true);
650 } else if (ParamName == "force-hardware-loop-guard") {
651 HardwareLoopOpts.setForceGuard(true);
652 } else {
653 return make_error<StringError>(
654 formatv("invalid HardwarePass parameter '{0}' ", ParamName).str(),
656 }
657 }
658 return HardwareLoopOpts;
659}
660
661/// Parser of parameters for LoopUnroll pass.
662Expected<LoopUnrollOptions> parseLoopUnrollOptions(StringRef Params) {
663 LoopUnrollOptions UnrollOpts;
664 while (!Params.empty()) {
665 StringRef ParamName;
666 std::tie(ParamName, Params) = Params.split(';');
667 std::optional<OptimizationLevel> OptLevel = parseOptLevel(ParamName);
668 // Don't accept -Os/-Oz.
669 if (OptLevel && !OptLevel->isOptimizingForSize()) {
670 UnrollOpts.setOptLevel(OptLevel->getSpeedupLevel());
671 continue;
672 }
673 if (ParamName.consume_front("full-unroll-max=")) {
674 int Count;
675 if (ParamName.getAsInteger(0, Count))
676 return make_error<StringError>(
677 formatv("invalid LoopUnrollPass parameter '{0}' ", ParamName).str(),
679 UnrollOpts.setFullUnrollMaxCount(Count);
680 continue;
681 }
682
683 bool Enable = !ParamName.consume_front("no-");
684 if (ParamName == "partial") {
685 UnrollOpts.setPartial(Enable);
686 } else if (ParamName == "peeling") {
687 UnrollOpts.setPeeling(Enable);
688 } else if (ParamName == "profile-peeling") {
689 UnrollOpts.setProfileBasedPeeling(Enable);
690 } else if (ParamName == "runtime") {
691 UnrollOpts.setRuntime(Enable);
692 } else if (ParamName == "upperbound") {
693 UnrollOpts.setUpperBound(Enable);
694 } else {
695 return make_error<StringError>(
696 formatv("invalid LoopUnrollPass parameter '{0}' ", ParamName).str(),
698 }
699 }
700 return UnrollOpts;
701}
702
703Expected<bool> parseGlobalDCEPassOptions(StringRef Params) {
705 Params, "vfe-linkage-unit-visibility", "GlobalDCE");
706}
707
708Expected<bool> parseCGProfilePassOptions(StringRef Params) {
709 return PassBuilder::parseSinglePassOption(Params, "in-lto-post-link",
710 "CGProfile");
711}
712
713Expected<bool> parseInlinerPassOptions(StringRef Params) {
714 return PassBuilder::parseSinglePassOption(Params, "only-mandatory",
715 "InlinerPass");
716}
717
718Expected<bool> parseCoroSplitPassOptions(StringRef Params) {
719 return PassBuilder::parseSinglePassOption(Params, "reuse-storage",
720 "CoroSplitPass");
721}
722
723Expected<bool> parsePostOrderFunctionAttrsPassOptions(StringRef Params) {
725 Params, "skip-non-recursive-function-attrs", "PostOrderFunctionAttrs");
726}
727
728Expected<CFGuardPass::Mechanism> parseCFGuardPassOptions(StringRef Params) {
729 if (Params.empty())
731
732 auto [Param, RHS] = Params.split(';');
733 if (!RHS.empty())
734 return make_error<StringError>(
735 formatv("too many CFGuardPass parameters '{0}' ", Params).str(),
737
738 if (Param == "check")
740 if (Param == "dispatch")
742
743 return make_error<StringError>(
744 formatv("invalid CFGuardPass mechanism: '{0}' ", Param).str(),
746}
747
748Expected<bool> parseEarlyCSEPassOptions(StringRef Params) {
749 return PassBuilder::parseSinglePassOption(Params, "memssa", "EarlyCSE");
750}
751
752Expected<bool> parseEntryExitInstrumenterPassOptions(StringRef Params) {
753 return PassBuilder::parseSinglePassOption(Params, "post-inline",
754 "EntryExitInstrumenter");
755}
756
757Expected<bool> parseLoopExtractorPassOptions(StringRef Params) {
758 return PassBuilder::parseSinglePassOption(Params, "single", "LoopExtractor");
759}
760
761Expected<bool> parseLowerMatrixIntrinsicsPassOptions(StringRef Params) {
762 return PassBuilder::parseSinglePassOption(Params, "minimal",
763 "LowerMatrixIntrinsics");
764}
765
766Expected<AddressSanitizerOptions> parseASanPassOptions(StringRef Params) {
768 while (!Params.empty()) {
769 StringRef ParamName;
770 std::tie(ParamName, Params) = Params.split(';');
771
772 if (ParamName == "kernel") {
773 Result.CompileKernel = true;
774 } else {
775 return make_error<StringError>(
776 formatv("invalid AddressSanitizer pass parameter '{0}' ", ParamName)
777 .str(),
779 }
780 }
781 return Result;
782}
783
784Expected<HWAddressSanitizerOptions> parseHWASanPassOptions(StringRef Params) {
786 while (!Params.empty()) {
787 StringRef ParamName;
788 std::tie(ParamName, Params) = Params.split(';');
789
790 if (ParamName == "recover") {
791 Result.Recover = true;
792 } else if (ParamName == "kernel") {
793 Result.CompileKernel = true;
794 } else {
795 return make_error<StringError>(
796 formatv("invalid HWAddressSanitizer pass parameter '{0}' ", ParamName)
797 .str(),
799 }
800 }
801 return Result;
802}
803
804Expected<EmbedBitcodeOptions> parseEmbedBitcodePassOptions(StringRef Params) {
806 while (!Params.empty()) {
807 StringRef ParamName;
808 std::tie(ParamName, Params) = Params.split(';');
809
810 if (ParamName == "thinlto") {
811 Result.IsThinLTO = true;
812 } else if (ParamName == "emit-summary") {
813 Result.EmitLTOSummary = true;
814 } else {
815 return make_error<StringError>(
816 formatv("invalid EmbedBitcode pass parameter '{0}' ", ParamName)
817 .str(),
819 }
820 }
821 return Result;
822}
823
825parseLowerAllowCheckPassOptions(StringRef Params) {
827 while (!Params.empty()) {
828 StringRef ParamName;
829 std::tie(ParamName, Params) = Params.split(';');
830
831 return make_error<StringError>(
832 formatv("invalid LowerAllowCheck pass parameter '{0}' ", ParamName)
833 .str(),
835 }
836 return Result;
837}
838
839Expected<MemorySanitizerOptions> parseMSanPassOptions(StringRef Params) {
841 while (!Params.empty()) {
842 StringRef ParamName;
843 std::tie(ParamName, Params) = Params.split(';');
844
845 if (ParamName == "recover") {
846 Result.Recover = true;
847 } else if (ParamName == "kernel") {
848 Result.Kernel = true;
849 } else if (ParamName.consume_front("track-origins=")) {
850 if (ParamName.getAsInteger(0, Result.TrackOrigins))
851 return make_error<StringError>(
852 formatv("invalid argument to MemorySanitizer pass track-origins "
853 "parameter: '{0}' ",
854 ParamName)
855 .str(),
857 } else if (ParamName == "eager-checks") {
858 Result.EagerChecks = true;
859 } else {
860 return make_error<StringError>(
861 formatv("invalid MemorySanitizer pass parameter '{0}' ", ParamName)
862 .str(),
864 }
865 }
866 return Result;
867}
868
869/// Parser of parameters for SimplifyCFG pass.
870Expected<SimplifyCFGOptions> parseSimplifyCFGOptions(StringRef Params) {
872 while (!Params.empty()) {
873 StringRef ParamName;
874 std::tie(ParamName, Params) = Params.split(';');
875
876 bool Enable = !ParamName.consume_front("no-");
877 if (ParamName == "speculate-blocks") {
878 Result.speculateBlocks(Enable);
879 } else if (ParamName == "simplify-cond-branch") {
880 Result.setSimplifyCondBranch(Enable);
881 } else if (ParamName == "forward-switch-cond") {
882 Result.forwardSwitchCondToPhi(Enable);
883 } else if (ParamName == "switch-range-to-icmp") {
884 Result.convertSwitchRangeToICmp(Enable);
885 } else if (ParamName == "switch-to-lookup") {
886 Result.convertSwitchToLookupTable(Enable);
887 } else if (ParamName == "keep-loops") {
888 Result.needCanonicalLoops(Enable);
889 } else if (ParamName == "hoist-common-insts") {
890 Result.hoistCommonInsts(Enable);
891 } else if (ParamName == "hoist-loads-stores-with-cond-faulting") {
892 Result.hoistLoadsStoresWithCondFaulting(Enable);
893 } else if (ParamName == "sink-common-insts") {
894 Result.sinkCommonInsts(Enable);
895 } else if (ParamName == "speculate-unpredictables") {
896 Result.speculateUnpredictables(Enable);
897 } else if (Enable && ParamName.consume_front("bonus-inst-threshold=")) {
898 APInt BonusInstThreshold;
899 if (ParamName.getAsInteger(0, BonusInstThreshold))
900 return make_error<StringError>(
901 formatv("invalid argument to SimplifyCFG pass bonus-threshold "
902 "parameter: '{0}' ",
903 ParamName).str(),
905 Result.bonusInstThreshold(BonusInstThreshold.getSExtValue());
906 } else {
907 return make_error<StringError>(
908 formatv("invalid SimplifyCFG pass parameter '{0}' ", ParamName).str(),
910 }
911 }
912 return Result;
913}
914
915Expected<InstCombineOptions> parseInstCombineOptions(StringRef Params) {
917 // When specifying "instcombine" in -passes enable fix-point verification by
918 // default, as this is what most tests should use.
919 Result.setVerifyFixpoint(true);
920 while (!Params.empty()) {
921 StringRef ParamName;
922 std::tie(ParamName, Params) = Params.split(';');
923
924 bool Enable = !ParamName.consume_front("no-");
925 if (ParamName == "verify-fixpoint") {
926 Result.setVerifyFixpoint(Enable);
927 } else if (Enable && ParamName.consume_front("max-iterations=")) {
928 APInt MaxIterations;
929 if (ParamName.getAsInteger(0, MaxIterations))
930 return make_error<StringError>(
931 formatv("invalid argument to InstCombine pass max-iterations "
932 "parameter: '{0}' ",
933 ParamName).str(),
935 Result.setMaxIterations((unsigned)MaxIterations.getZExtValue());
936 } else {
937 return make_error<StringError>(
938 formatv("invalid InstCombine pass parameter '{0}' ", ParamName).str(),
940 }
941 }
942 return Result;
943}
944
945/// Parser of parameters for LoopVectorize pass.
946Expected<LoopVectorizeOptions> parseLoopVectorizeOptions(StringRef Params) {
948 while (!Params.empty()) {
949 StringRef ParamName;
950 std::tie(ParamName, Params) = Params.split(';');
951
952 bool Enable = !ParamName.consume_front("no-");
953 if (ParamName == "interleave-forced-only") {
955 } else if (ParamName == "vectorize-forced-only") {
957 } else {
958 return make_error<StringError>(
959 formatv("invalid LoopVectorize parameter '{0}' ", ParamName).str(),
961 }
962 }
963 return Opts;
964}
965
966Expected<std::pair<bool, bool>> parseLoopUnswitchOptions(StringRef Params) {
967 std::pair<bool, bool> Result = {false, true};
968 while (!Params.empty()) {
969 StringRef ParamName;
970 std::tie(ParamName, Params) = Params.split(';');
971
972 bool Enable = !ParamName.consume_front("no-");
973 if (ParamName == "nontrivial") {
974 Result.first = Enable;
975 } else if (ParamName == "trivial") {
976 Result.second = Enable;
977 } else {
978 return make_error<StringError>(
979 formatv("invalid LoopUnswitch pass parameter '{0}' ", ParamName)
980 .str(),
982 }
983 }
984 return Result;
985}
986
987Expected<LICMOptions> parseLICMOptions(StringRef Params) {
989 while (!Params.empty()) {
990 StringRef ParamName;
991 std::tie(ParamName, Params) = Params.split(';');
992
993 bool Enable = !ParamName.consume_front("no-");
994 if (ParamName == "allowspeculation") {
995 Result.AllowSpeculation = Enable;
996 } else {
997 return make_error<StringError>(
998 formatv("invalid LICM pass parameter '{0}' ", ParamName).str(),
1000 }
1001 }
1002 return Result;
1003}
1004
1005Expected<std::pair<bool, bool>> parseLoopRotateOptions(StringRef Params) {
1006 std::pair<bool, bool> Result = {true, false};
1007 while (!Params.empty()) {
1008 StringRef ParamName;
1009 std::tie(ParamName, Params) = Params.split(';');
1010
1011 bool Enable = !ParamName.consume_front("no-");
1012 if (ParamName == "header-duplication") {
1013 Result.first = Enable;
1014 } else if (ParamName == "prepare-for-lto") {
1015 Result.second = Enable;
1016 } else {
1017 return make_error<StringError>(
1018 formatv("invalid LoopRotate pass parameter '{0}' ", ParamName).str(),
1020 }
1021 }
1022 return Result;
1023}
1024
1025Expected<bool> parseMergedLoadStoreMotionOptions(StringRef Params) {
1026 bool Result = false;
1027 while (!Params.empty()) {
1028 StringRef ParamName;
1029 std::tie(ParamName, Params) = Params.split(';');
1030
1031 bool Enable = !ParamName.consume_front("no-");
1032 if (ParamName == "split-footer-bb") {
1033 Result = Enable;
1034 } else {
1035 return make_error<StringError>(
1036 formatv("invalid MergedLoadStoreMotion pass parameter '{0}' ",
1037 ParamName)
1038 .str(),
1040 }
1041 }
1042 return Result;
1043}
1044
1045Expected<GVNOptions> parseGVNOptions(StringRef Params) {
1047 while (!Params.empty()) {
1048 StringRef ParamName;
1049 std::tie(ParamName, Params) = Params.split(';');
1050
1051 bool Enable = !ParamName.consume_front("no-");
1052 if (ParamName == "pre") {
1053 Result.setPRE(Enable);
1054 } else if (ParamName == "load-pre") {
1055 Result.setLoadPRE(Enable);
1056 } else if (ParamName == "split-backedge-load-pre") {
1057 Result.setLoadPRESplitBackedge(Enable);
1058 } else if (ParamName == "memdep") {
1059 Result.setMemDep(Enable);
1060 } else if (ParamName == "memoryssa") {
1061 Result.setMemorySSA(Enable);
1062 } else {
1063 return make_error<StringError>(
1064 formatv("invalid GVN pass parameter '{0}' ", ParamName).str(),
1066 }
1067 }
1068 return Result;
1069}
1070
1071Expected<IPSCCPOptions> parseIPSCCPOptions(StringRef Params) {
1073 while (!Params.empty()) {
1074 StringRef ParamName;
1075 std::tie(ParamName, Params) = Params.split(';');
1076
1077 bool Enable = !ParamName.consume_front("no-");
1078 if (ParamName == "func-spec")
1079 Result.setFuncSpec(Enable);
1080 else
1081 return make_error<StringError>(
1082 formatv("invalid IPSCCP pass parameter '{0}' ", ParamName).str(),
1084 }
1085 return Result;
1086}
1087
1088Expected<ScalarizerPassOptions> parseScalarizerOptions(StringRef Params) {
1090 while (!Params.empty()) {
1091 StringRef ParamName;
1092 std::tie(ParamName, Params) = Params.split(';');
1093
1094 if (ParamName.consume_front("min-bits=")) {
1095 if (ParamName.getAsInteger(0, Result.ScalarizeMinBits)) {
1096 return make_error<StringError>(
1097 formatv("invalid argument to Scalarizer pass min-bits "
1098 "parameter: '{0}' ",
1099 ParamName)
1100 .str(),
1102 }
1103
1104 continue;
1105 }
1106
1107 bool Enable = !ParamName.consume_front("no-");
1108 if (ParamName == "load-store")
1109 Result.ScalarizeLoadStore = Enable;
1110 else if (ParamName == "variable-insert-extract")
1111 Result.ScalarizeVariableInsertExtract = Enable;
1112 else {
1113 return make_error<StringError>(
1114 formatv("invalid Scalarizer pass parameter '{0}' ", ParamName).str(),
1116 }
1117 }
1118
1119 return Result;
1120}
1121
1122Expected<SROAOptions> parseSROAOptions(StringRef Params) {
1123 if (Params.empty() || Params == "modify-cfg")
1125 if (Params == "preserve-cfg")
1127 return make_error<StringError>(
1128 formatv("invalid SROA pass parameter '{0}' (either preserve-cfg or "
1129 "modify-cfg can be specified)",
1130 Params)
1131 .str(),
1133}
1134
1136parseStackLifetimeOptions(StringRef Params) {
1138 while (!Params.empty()) {
1139 StringRef ParamName;
1140 std::tie(ParamName, Params) = Params.split(';');
1141
1142 if (ParamName == "may") {
1144 } else if (ParamName == "must") {
1146 } else {
1147 return make_error<StringError>(
1148 formatv("invalid StackLifetime parameter '{0}' ", ParamName).str(),
1150 }
1151 }
1152 return Result;
1153}
1154
1155Expected<bool> parseDependenceAnalysisPrinterOptions(StringRef Params) {
1156 return PassBuilder::parseSinglePassOption(Params, "normalized-results",
1157 "DependenceAnalysisPrinter");
1158}
1159
1160Expected<bool> parseSeparateConstOffsetFromGEPPassOptions(StringRef Params) {
1161 return PassBuilder::parseSinglePassOption(Params, "lower-gep",
1162 "SeparateConstOffsetFromGEP");
1163}
1164
1165Expected<bool> parseStructurizeCFGPassOptions(StringRef Params) {
1166 return PassBuilder::parseSinglePassOption(Params, "skip-uniform-regions",
1167 "StructurizeCFG");
1168}
1169
1171parseFunctionSimplificationPipelineOptions(StringRef Params) {
1172 std::optional<OptimizationLevel> L = parseOptLevel(Params);
1173 if (!L || *L == OptimizationLevel::O0) {
1174 return make_error<StringError>(
1175 formatv("invalid function-simplification parameter '{0}' ", Params)
1176 .str(),
1178 };
1179 return *L;
1180}
1181
1182Expected<bool> parseMemorySSAPrinterPassOptions(StringRef Params) {
1183 return PassBuilder::parseSinglePassOption(Params, "no-ensure-optimized-uses",
1184 "MemorySSAPrinterPass");
1185}
1186
1187Expected<bool> parseSpeculativeExecutionPassOptions(StringRef Params) {
1188 return PassBuilder::parseSinglePassOption(Params, "only-if-divergent-target",
1189 "SpeculativeExecutionPass");
1190}
1191
1192Expected<std::string> parseMemProfUsePassOptions(StringRef Params) {
1193 std::string Result;
1194 while (!Params.empty()) {
1195 StringRef ParamName;
1196 std::tie(ParamName, Params) = Params.split(';');
1197
1198 if (ParamName.consume_front("profile-filename=")) {
1199 Result = ParamName.str();
1200 } else {
1201 return make_error<StringError>(
1202 formatv("invalid MemProfUse pass parameter '{0}' ", ParamName).str(),
1204 }
1205 }
1206 return Result;
1207}
1208
1210parseStructuralHashPrinterPassOptions(StringRef Params) {
1211 if (Params.empty())
1213 if (Params == "detailed")
1215 if (Params == "call-target-ignored")
1217 return make_error<StringError>(
1218 formatv("invalid structural hash printer parameter '{0}' ", Params).str(),
1220}
1221
1222Expected<bool> parseWinEHPrepareOptions(StringRef Params) {
1223 return PassBuilder::parseSinglePassOption(Params, "demote-catchswitch-only",
1224 "WinEHPreparePass");
1225}
1226
1227Expected<GlobalMergeOptions> parseGlobalMergeOptions(StringRef Params) {
1229 while (!Params.empty()) {
1230 StringRef ParamName;
1231 std::tie(ParamName, Params) = Params.split(';');
1232
1233 bool Enable = !ParamName.consume_front("no-");
1234 if (ParamName == "group-by-use")
1235 Result.GroupByUse = Enable;
1236 else if (ParamName == "ignore-single-use")
1237 Result.IgnoreSingleUse = Enable;
1238 else if (ParamName == "merge-const")
1239 Result.MergeConst = Enable;
1240 else if (ParamName == "merge-external")
1241 Result.MergeExternal = Enable;
1242 else if (ParamName.consume_front("max-offset=")) {
1243 if (ParamName.getAsInteger(0, Result.MaxOffset))
1244 return make_error<StringError>(
1245 formatv("invalid GlobalMergePass parameter '{0}' ", ParamName)
1246 .str(),
1248 }
1249 }
1250 return Result;
1251}
1252
1253Expected<SmallVector<std::string, 0>> parseInternalizeGVs(StringRef Params) {
1254 SmallVector<std::string, 1> PreservedGVs;
1255 while (!Params.empty()) {
1256 StringRef ParamName;
1257 std::tie(ParamName, Params) = Params.split(';');
1258
1259 if (ParamName.consume_front("preserve-gv=")) {
1260 PreservedGVs.push_back(ParamName.str());
1261 } else {
1262 return make_error<StringError>(
1263 formatv("invalid Internalize pass parameter '{0}' ", ParamName).str(),
1265 }
1266 }
1267
1268 return Expected<SmallVector<std::string, 0>>(std::move(PreservedGVs));
1269}
1270
1272parseRegAllocFastPassOptions(PassBuilder &PB, StringRef Params) {
1274 while (!Params.empty()) {
1275 StringRef ParamName;
1276 std::tie(ParamName, Params) = Params.split(';');
1277
1278 if (ParamName.consume_front("filter=")) {
1279 std::optional<RegAllocFilterFunc> Filter =
1280 PB.parseRegAllocFilter(ParamName);
1281 if (!Filter) {
1282 return make_error<StringError>(
1283 formatv("invalid regallocfast register filter '{0}' ", ParamName)
1284 .str(),
1286 }
1287 Opts.Filter = *Filter;
1288 Opts.FilterName = ParamName;
1289 continue;
1290 }
1291
1292 if (ParamName == "no-clear-vregs") {
1293 Opts.ClearVRegs = false;
1294 continue;
1295 }
1296
1297 return make_error<StringError>(
1298 formatv("invalid regallocfast pass parameter '{0}' ", ParamName).str(),
1300 }
1301 return Opts;
1302}
1303
1305parseBoundsCheckingOptions(StringRef Params) {
1307 while (!Params.empty()) {
1308 StringRef ParamName;
1309 std::tie(ParamName, Params) = Params.split(';');
1310 if (ParamName == "trap") {
1311 Options.Rt = std::nullopt;
1312 } else if (ParamName == "rt") {
1313 Options.Rt = {
1314 /*MinRuntime=*/false,
1315 /*MayReturn=*/true,
1316 };
1317 } else if (ParamName == "rt-abort") {
1318 Options.Rt = {
1319 /*MinRuntime=*/false,
1320 /*MayReturn=*/false,
1321 };
1322 } else if (ParamName == "min-rt") {
1323 Options.Rt = {
1324 /*MinRuntime=*/true,
1325 /*MayReturn=*/true,
1326 };
1327 } else if (ParamName == "min-rt-abort") {
1328 Options.Rt = {
1329 /*MinRuntime=*/true,
1330 /*MayReturn=*/false,
1331 };
1332 } else if (ParamName == "merge") {
1333 Options.Merge = true;
1334 } else {
1335 StringRef ParamEQ;
1336 StringRef Val;
1337 std::tie(ParamEQ, Val) = ParamName.split('=');
1338 int8_t Id;
1339 if (ParamEQ == "guard" && !Val.getAsInteger(0, Id)) {
1340 Options.GuardKind = Id;
1341 } else {
1342 return make_error<StringError>(
1343 formatv("invalid BoundsChecking pass parameter '{0}' ", ParamName)
1344 .str(),
1346 }
1347 }
1348 }
1349 return Options;
1350}
1351
1352} // namespace
1353
1354/// Tests whether a pass name starts with a valid prefix for a default pipeline
1355/// alias.
1357 return Name.starts_with("default") || Name.starts_with("thinlto") ||
1358 Name.starts_with("lto");
1359}
1360
1361/// Tests whether registered callbacks will accept a given pass name.
1362///
1363/// When parsing a pipeline text, the type of the outermost pipeline may be
1364/// omitted, in which case the type is automatically determined from the first
1365/// pass name in the text. This may be a name that is handled through one of the
1366/// callbacks. We check this through the oridinary parsing callbacks by setting
1367/// up a dummy PassManager in order to not force the client to also handle this
1368/// type of query.
1369template <typename PassManagerT, typename CallbacksT>
1370static bool callbacksAcceptPassName(StringRef Name, CallbacksT &Callbacks) {
1371 if (!Callbacks.empty()) {
1372 PassManagerT DummyPM;
1373 for (auto &CB : Callbacks)
1374 if (CB(Name, DummyPM, {}))
1375 return true;
1376 }
1377 return false;
1378}
1379
1380template <typename CallbacksT>
1381static bool isModulePassName(StringRef Name, CallbacksT &Callbacks) {
1382 // Manually handle aliases for pre-configured pipeline fragments.
1385
1386 StringRef NameNoBracket = Name.take_until([](char C) { return C == '<'; });
1387
1388 // Explicitly handle pass manager names.
1389 if (Name == "module")
1390 return true;
1391 if (Name == "cgscc")
1392 return true;
1393 if (NameNoBracket == "function")
1394 return true;
1395 if (Name == "coro-cond")
1396 return true;
1397
1398#define MODULE_PASS(NAME, CREATE_PASS) \
1399 if (Name == NAME) \
1400 return true;
1401#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1402 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1403 return true;
1404#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1405 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1406 return true;
1407#include "PassRegistry.def"
1408
1409 return callbacksAcceptPassName<ModulePassManager>(Name, Callbacks);
1410}
1411
1412template <typename CallbacksT>
1413static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks) {
1414 // Explicitly handle pass manager names.
1415 StringRef NameNoBracket = Name.take_until([](char C) { return C == '<'; });
1416 if (Name == "cgscc")
1417 return true;
1418 if (NameNoBracket == "function")
1419 return true;
1420
1421 // Explicitly handle custom-parsed pass names.
1423 return true;
1424
1425#define CGSCC_PASS(NAME, CREATE_PASS) \
1426 if (Name == NAME) \
1427 return true;
1428#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1429 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1430 return true;
1431#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1432 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1433 return true;
1434#include "PassRegistry.def"
1435
1436 return callbacksAcceptPassName<CGSCCPassManager>(Name, Callbacks);
1437}
1438
1439template <typename CallbacksT>
1440static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks) {
1441 // Explicitly handle pass manager names.
1442 StringRef NameNoBracket = Name.take_until([](char C) { return C == '<'; });
1443 if (NameNoBracket == "function")
1444 return true;
1445 if (Name == "loop" || Name == "loop-mssa" || Name == "machine-function")
1446 return true;
1447
1448#define FUNCTION_PASS(NAME, CREATE_PASS) \
1449 if (Name == NAME) \
1450 return true;
1451#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1452 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1453 return true;
1454#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1455 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1456 return true;
1457#include "PassRegistry.def"
1458
1459 return callbacksAcceptPassName<FunctionPassManager>(Name, Callbacks);
1460}
1461
1462template <typename CallbacksT>
1463static bool isMachineFunctionPassName(StringRef Name, CallbacksT &Callbacks) {
1464 // Explicitly handle pass manager names.
1465 if (Name == "machine-function")
1466 return true;
1467
1468#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
1469 if (Name == NAME) \
1470 return true;
1471#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
1472 PARAMS) \
1473 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1474 return true;
1475
1476#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1477 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1478 return true;
1479
1480#include "llvm/Passes/MachinePassRegistry.def"
1481
1482 return callbacksAcceptPassName<MachineFunctionPassManager>(Name, Callbacks);
1483}
1484
1485template <typename CallbacksT>
1486static bool isLoopNestPassName(StringRef Name, CallbacksT &Callbacks,
1487 bool &UseMemorySSA) {
1488 UseMemorySSA = false;
1489
1491 UseMemorySSA = true;
1492 return true;
1493 }
1494
1495#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1496 if (Name == NAME) \
1497 return true;
1498#include "PassRegistry.def"
1499
1500 return callbacksAcceptPassName<LoopPassManager>(Name, Callbacks);
1501}
1502
1503template <typename CallbacksT>
1504static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks,
1505 bool &UseMemorySSA) {
1506 UseMemorySSA = false;
1507
1509 UseMemorySSA = true;
1510 return true;
1511 }
1512
1513#define LOOP_PASS(NAME, CREATE_PASS) \
1514 if (Name == NAME) \
1515 return true;
1516#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1517 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1518 return true;
1519#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1520 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1521 return true;
1522#include "PassRegistry.def"
1523
1524 return callbacksAcceptPassName<LoopPassManager>(Name, Callbacks);
1525}
1526
1527std::optional<std::vector<PassBuilder::PipelineElement>>
1528PassBuilder::parsePipelineText(StringRef Text) {
1529 std::vector<PipelineElement> ResultPipeline;
1530
1531 SmallVector<std::vector<PipelineElement> *, 4> PipelineStack = {
1532 &ResultPipeline};
1533 for (;;) {
1534 std::vector<PipelineElement> &Pipeline = *PipelineStack.back();
1535 size_t Pos = Text.find_first_of(",()");
1536 Pipeline.push_back({Text.substr(0, Pos), {}});
1537
1538 // If we have a single terminating name, we're done.
1539 if (Pos == Text.npos)
1540 break;
1541
1542 char Sep = Text[Pos];
1543 Text = Text.substr(Pos + 1);
1544 if (Sep == ',')
1545 // Just a name ending in a comma, continue.
1546 continue;
1547
1548 if (Sep == '(') {
1549 // Push the inner pipeline onto the stack to continue processing.
1550 PipelineStack.push_back(&Pipeline.back().InnerPipeline);
1551 continue;
1552 }
1553
1554 assert(Sep == ')' && "Bogus separator!");
1555 // When handling the close parenthesis, we greedily consume them to avoid
1556 // empty strings in the pipeline.
1557 do {
1558 // If we try to pop the outer pipeline we have unbalanced parentheses.
1559 if (PipelineStack.size() == 1)
1560 return std::nullopt;
1561
1562 PipelineStack.pop_back();
1563 } while (Text.consume_front(")"));
1564
1565 // Check if we've finished parsing.
1566 if (Text.empty())
1567 break;
1568
1569 // Otherwise, the end of an inner pipeline always has to be followed by
1570 // a comma, and then we can continue.
1571 if (!Text.consume_front(","))
1572 return std::nullopt;
1573 }
1574
1575 if (PipelineStack.size() > 1)
1576 // Unbalanced paretheses.
1577 return std::nullopt;
1578
1579 assert(PipelineStack.back() == &ResultPipeline &&
1580 "Wrong pipeline at the bottom of the stack!");
1581 return {std::move(ResultPipeline)};
1582}
1583
1584Error PassBuilder::parseModulePass(ModulePassManager &MPM,
1585 const PipelineElement &E) {
1586 auto &Name = E.Name;
1587 auto &InnerPipeline = E.InnerPipeline;
1588
1589 // First handle complex passes like the pass managers which carry pipelines.
1590 if (!InnerPipeline.empty()) {
1591 if (Name == "module") {
1592 ModulePassManager NestedMPM;
1593 if (auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1594 return Err;
1595 MPM.addPass(std::move(NestedMPM));
1596 return Error::success();
1597 }
1598 if (Name == "coro-cond") {
1599 ModulePassManager NestedMPM;
1600 if (auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1601 return Err;
1602 MPM.addPass(CoroConditionalWrapper(std::move(NestedMPM)));
1603 return Error::success();
1604 }
1605 if (Name == "cgscc") {
1606 CGSCCPassManager CGPM;
1607 if (auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
1608 return Err;
1610 return Error::success();
1611 }
1612 if (auto Params = parseFunctionPipelineName(Name)) {
1613 if (Params->second)
1614 return make_error<StringError>(
1615 "cannot have a no-rerun module to function adaptor",
1618 if (auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1619 return Err;
1620 MPM.addPass(
1621 createModuleToFunctionPassAdaptor(std::move(FPM), Params->first));
1622 return Error::success();
1623 }
1624
1625 for (auto &C : ModulePipelineParsingCallbacks)
1626 if (C(Name, MPM, InnerPipeline))
1627 return Error::success();
1628
1629 // Normal passes can't have pipelines.
1630 return make_error<StringError>(
1631 formatv("invalid use of '{0}' pass as module pipeline", Name).str(),
1633 ;
1634 }
1635
1636 // Manually handle aliases for pre-configured pipeline fragments.
1639 if (!DefaultAliasRegex.match(Name, &Matches))
1640 return make_error<StringError>(
1641 formatv("unknown default pipeline alias '{0}'", Name).str(),
1643
1644 assert(Matches.size() == 3 && "Must capture two matched strings!");
1645
1646 OptimizationLevel L = *parseOptLevel(Matches[2]);
1647
1648 // This is consistent with old pass manager invoked via opt, but
1649 // inconsistent with clang. Clang doesn't enable loop vectorization
1650 // but does enable slp vectorization at Oz.
1651 PTO.LoopVectorization =
1652 L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
1653 PTO.SLPVectorization =
1654 L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
1655
1656 if (Matches[1] == "default") {
1658 } else if (Matches[1] == "thinlto-pre-link") {
1660 } else if (Matches[1] == "thinlto") {
1661 MPM.addPass(buildThinLTODefaultPipeline(L, nullptr));
1662 } else if (Matches[1] == "lto-pre-link") {
1663 if (PTO.UnifiedLTO)
1664 // When UnifiedLTO is enabled, use the ThinLTO pre-link pipeline. This
1665 // avoids compile-time performance regressions and keeps the pre-link
1666 // LTO pipeline "unified" for both LTO modes.
1668 else
1670 } else {
1671 assert(Matches[1] == "lto" && "Not one of the matched options!");
1672 MPM.addPass(buildLTODefaultPipeline(L, nullptr));
1673 }
1674 return Error::success();
1675 }
1676
1677 // Finally expand the basic registered passes from the .inc file.
1678#define MODULE_PASS(NAME, CREATE_PASS) \
1679 if (Name == NAME) { \
1680 MPM.addPass(CREATE_PASS); \
1681 return Error::success(); \
1682 }
1683#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1684 if (checkParametrizedPassName(Name, NAME)) { \
1685 auto Params = parsePassParameters(PARSER, Name, NAME); \
1686 if (!Params) \
1687 return Params.takeError(); \
1688 MPM.addPass(CREATE_PASS(Params.get())); \
1689 return Error::success(); \
1690 }
1691#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1692 if (Name == "require<" NAME ">") { \
1693 MPM.addPass( \
1694 RequireAnalysisPass< \
1695 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
1696 return Error::success(); \
1697 } \
1698 if (Name == "invalidate<" NAME ">") { \
1699 MPM.addPass(InvalidateAnalysisPass< \
1700 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1701 return Error::success(); \
1702 }
1703#define CGSCC_PASS(NAME, CREATE_PASS) \
1704 if (Name == NAME) { \
1705 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
1706 return Error::success(); \
1707 }
1708#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1709 if (checkParametrizedPassName(Name, NAME)) { \
1710 auto Params = parsePassParameters(PARSER, Name, NAME); \
1711 if (!Params) \
1712 return Params.takeError(); \
1713 MPM.addPass( \
1714 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
1715 return Error::success(); \
1716 }
1717#define FUNCTION_PASS(NAME, CREATE_PASS) \
1718 if (Name == NAME) { \
1719 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
1720 return Error::success(); \
1721 }
1722#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1723 if (checkParametrizedPassName(Name, NAME)) { \
1724 auto Params = parsePassParameters(PARSER, Name, NAME); \
1725 if (!Params) \
1726 return Params.takeError(); \
1727 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
1728 return Error::success(); \
1729 }
1730#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1731 if (Name == NAME) { \
1732 MPM.addPass(createModuleToFunctionPassAdaptor( \
1733 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1734 return Error::success(); \
1735 }
1736#define LOOP_PASS(NAME, CREATE_PASS) \
1737 if (Name == NAME) { \
1738 MPM.addPass(createModuleToFunctionPassAdaptor( \
1739 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1740 return Error::success(); \
1741 }
1742#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1743 if (checkParametrizedPassName(Name, NAME)) { \
1744 auto Params = parsePassParameters(PARSER, Name, NAME); \
1745 if (!Params) \
1746 return Params.takeError(); \
1747 MPM.addPass( \
1748 createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor( \
1749 CREATE_PASS(Params.get()), false, false))); \
1750 return Error::success(); \
1751 }
1752#include "PassRegistry.def"
1753
1754 for (auto &C : ModulePipelineParsingCallbacks)
1755 if (C(Name, MPM, InnerPipeline))
1756 return Error::success();
1757 return make_error<StringError>(
1758 formatv("unknown module pass '{0}'", Name).str(),
1760}
1761
1762Error PassBuilder::parseCGSCCPass(CGSCCPassManager &CGPM,
1763 const PipelineElement &E) {
1764 auto &Name = E.Name;
1765 auto &InnerPipeline = E.InnerPipeline;
1766
1767 // First handle complex passes like the pass managers which carry pipelines.
1768 if (!InnerPipeline.empty()) {
1769 if (Name == "cgscc") {
1770 CGSCCPassManager NestedCGPM;
1771 if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1772 return Err;
1773 // Add the nested pass manager with the appropriate adaptor.
1774 CGPM.addPass(std::move(NestedCGPM));
1775 return Error::success();
1776 }
1777 if (auto Params = parseFunctionPipelineName(Name)) {
1779 if (auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1780 return Err;
1781 // Add the nested pass manager with the appropriate adaptor.
1783 std::move(FPM), Params->first, Params->second));
1784 return Error::success();
1785 }
1786 if (auto MaxRepetitions = parseDevirtPassName(Name)) {
1787 CGSCCPassManager NestedCGPM;
1788 if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1789 return Err;
1790 CGPM.addPass(
1791 createDevirtSCCRepeatedPass(std::move(NestedCGPM), *MaxRepetitions));
1792 return Error::success();
1793 }
1794
1795 for (auto &C : CGSCCPipelineParsingCallbacks)
1796 if (C(Name, CGPM, InnerPipeline))
1797 return Error::success();
1798
1799 // Normal passes can't have pipelines.
1800 return make_error<StringError>(
1801 formatv("invalid use of '{0}' pass as cgscc pipeline", Name).str(),
1803 }
1804
1805// Now expand the basic registered passes from the .inc file.
1806#define CGSCC_PASS(NAME, CREATE_PASS) \
1807 if (Name == NAME) { \
1808 CGPM.addPass(CREATE_PASS); \
1809 return Error::success(); \
1810 }
1811#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1812 if (checkParametrizedPassName(Name, NAME)) { \
1813 auto Params = parsePassParameters(PARSER, Name, NAME); \
1814 if (!Params) \
1815 return Params.takeError(); \
1816 CGPM.addPass(CREATE_PASS(Params.get())); \
1817 return Error::success(); \
1818 }
1819#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1820 if (Name == "require<" NAME ">") { \
1821 CGPM.addPass(RequireAnalysisPass< \
1822 std::remove_reference_t<decltype(CREATE_PASS)>, \
1823 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
1824 CGSCCUpdateResult &>()); \
1825 return Error::success(); \
1826 } \
1827 if (Name == "invalidate<" NAME ">") { \
1828 CGPM.addPass(InvalidateAnalysisPass< \
1829 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1830 return Error::success(); \
1831 }
1832#define FUNCTION_PASS(NAME, CREATE_PASS) \
1833 if (Name == NAME) { \
1834 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
1835 return Error::success(); \
1836 }
1837#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1838 if (checkParametrizedPassName(Name, NAME)) { \
1839 auto Params = parsePassParameters(PARSER, Name, NAME); \
1840 if (!Params) \
1841 return Params.takeError(); \
1842 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
1843 return Error::success(); \
1844 }
1845#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1846 if (Name == NAME) { \
1847 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
1848 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1849 return Error::success(); \
1850 }
1851#define LOOP_PASS(NAME, CREATE_PASS) \
1852 if (Name == NAME) { \
1853 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
1854 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1855 return Error::success(); \
1856 }
1857#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1858 if (checkParametrizedPassName(Name, NAME)) { \
1859 auto Params = parsePassParameters(PARSER, Name, NAME); \
1860 if (!Params) \
1861 return Params.takeError(); \
1862 CGPM.addPass( \
1863 createCGSCCToFunctionPassAdaptor(createFunctionToLoopPassAdaptor( \
1864 CREATE_PASS(Params.get()), false, false))); \
1865 return Error::success(); \
1866 }
1867#include "PassRegistry.def"
1868
1869 for (auto &C : CGSCCPipelineParsingCallbacks)
1870 if (C(Name, CGPM, InnerPipeline))
1871 return Error::success();
1872 return make_error<StringError>(
1873 formatv("unknown cgscc pass '{0}'", Name).str(),
1875}
1876
1877Error PassBuilder::parseFunctionPass(FunctionPassManager &FPM,
1878 const PipelineElement &E) {
1879 auto &Name = E.Name;
1880 auto &InnerPipeline = E.InnerPipeline;
1881
1882 // First handle complex passes like the pass managers which carry pipelines.
1883 if (!InnerPipeline.empty()) {
1884 if (Name == "function") {
1885 FunctionPassManager NestedFPM;
1886 if (auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
1887 return Err;
1888 // Add the nested pass manager with the appropriate adaptor.
1889 FPM.addPass(std::move(NestedFPM));
1890 return Error::success();
1891 }
1892 if (Name == "loop" || Name == "loop-mssa") {
1893 LoopPassManager LPM;
1894 if (auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
1895 return Err;
1896 // Add the nested pass manager with the appropriate adaptor.
1897 bool UseMemorySSA = (Name == "loop-mssa");
1898 bool UseBFI = llvm::any_of(InnerPipeline, [](auto Pipeline) {
1899 return Pipeline.Name.contains("simple-loop-unswitch");
1900 });
1901 bool UseBPI = llvm::any_of(InnerPipeline, [](auto Pipeline) {
1902 return Pipeline.Name == "loop-predication";
1903 });
1904 FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM), UseMemorySSA,
1905 UseBFI, UseBPI));
1906 return Error::success();
1907 }
1908 if (Name == "machine-function") {
1910 if (auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
1911 return Err;
1913 return Error::success();
1914 }
1915
1916 for (auto &C : FunctionPipelineParsingCallbacks)
1917 if (C(Name, FPM, InnerPipeline))
1918 return Error::success();
1919
1920 // Normal passes can't have pipelines.
1921 return make_error<StringError>(
1922 formatv("invalid use of '{0}' pass as function pipeline", Name).str(),
1924 }
1925
1926// Now expand the basic registered passes from the .inc file.
1927#define FUNCTION_PASS(NAME, CREATE_PASS) \
1928 if (Name == NAME) { \
1929 FPM.addPass(CREATE_PASS); \
1930 return Error::success(); \
1931 }
1932#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1933 if (checkParametrizedPassName(Name, NAME)) { \
1934 auto Params = parsePassParameters(PARSER, Name, NAME); \
1935 if (!Params) \
1936 return Params.takeError(); \
1937 FPM.addPass(CREATE_PASS(Params.get())); \
1938 return Error::success(); \
1939 }
1940#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1941 if (Name == "require<" NAME ">") { \
1942 FPM.addPass( \
1943 RequireAnalysisPass< \
1944 std::remove_reference_t<decltype(CREATE_PASS)>, Function>()); \
1945 return Error::success(); \
1946 } \
1947 if (Name == "invalidate<" NAME ">") { \
1948 FPM.addPass(InvalidateAnalysisPass< \
1949 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1950 return Error::success(); \
1951 }
1952// FIXME: UseMemorySSA is set to false. Maybe we could do things like:
1953// bool UseMemorySSA = !("canon-freeze" || "loop-predication" ||
1954// "guard-widening");
1955// The risk is that it may become obsolete if we're not careful.
1956#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1957 if (Name == NAME) { \
1958 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)); \
1959 return Error::success(); \
1960 }
1961#define LOOP_PASS(NAME, CREATE_PASS) \
1962 if (Name == NAME) { \
1963 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)); \
1964 return Error::success(); \
1965 }
1966#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1967 if (checkParametrizedPassName(Name, NAME)) { \
1968 auto Params = parsePassParameters(PARSER, Name, NAME); \
1969 if (!Params) \
1970 return Params.takeError(); \
1971 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), \
1972 false, false)); \
1973 return Error::success(); \
1974 }
1975#include "PassRegistry.def"
1976
1977 for (auto &C : FunctionPipelineParsingCallbacks)
1978 if (C(Name, FPM, InnerPipeline))
1979 return Error::success();
1980 return make_error<StringError>(
1981 formatv("unknown function pass '{0}'", Name).str(),
1983}
1984
1985Error PassBuilder::parseLoopPass(LoopPassManager &LPM,
1986 const PipelineElement &E) {
1987 StringRef Name = E.Name;
1988 auto &InnerPipeline = E.InnerPipeline;
1989
1990 // First handle complex passes like the pass managers which carry pipelines.
1991 if (!InnerPipeline.empty()) {
1992 if (Name == "loop") {
1993 LoopPassManager NestedLPM;
1994 if (auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
1995 return Err;
1996 // Add the nested pass manager with the appropriate adaptor.
1997 LPM.addPass(std::move(NestedLPM));
1998 return Error::success();
1999 }
2000
2001 for (auto &C : LoopPipelineParsingCallbacks)
2002 if (C(Name, LPM, InnerPipeline))
2003 return Error::success();
2004
2005 // Normal passes can't have pipelines.
2006 return make_error<StringError>(
2007 formatv("invalid use of '{0}' pass as loop pipeline", Name).str(),
2009 }
2010
2011// Now expand the basic registered passes from the .inc file.
2012#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2013 if (Name == NAME) { \
2014 LPM.addPass(CREATE_PASS); \
2015 return Error::success(); \
2016 }
2017#define LOOP_PASS(NAME, CREATE_PASS) \
2018 if (Name == NAME) { \
2019 LPM.addPass(CREATE_PASS); \
2020 return Error::success(); \
2021 }
2022#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2023 if (checkParametrizedPassName(Name, NAME)) { \
2024 auto Params = parsePassParameters(PARSER, Name, NAME); \
2025 if (!Params) \
2026 return Params.takeError(); \
2027 LPM.addPass(CREATE_PASS(Params.get())); \
2028 return Error::success(); \
2029 }
2030#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
2031 if (Name == "require<" NAME ">") { \
2032 LPM.addPass(RequireAnalysisPass< \
2033 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
2034 LoopAnalysisManager, LoopStandardAnalysisResults &, \
2035 LPMUpdater &>()); \
2036 return Error::success(); \
2037 } \
2038 if (Name == "invalidate<" NAME ">") { \
2039 LPM.addPass(InvalidateAnalysisPass< \
2040 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2041 return Error::success(); \
2042 }
2043#include "PassRegistry.def"
2044
2045 for (auto &C : LoopPipelineParsingCallbacks)
2046 if (C(Name, LPM, InnerPipeline))
2047 return Error::success();
2048 return make_error<StringError>(formatv("unknown loop pass '{0}'", Name).str(),
2050}
2051
2052Error PassBuilder::parseMachinePass(MachineFunctionPassManager &MFPM,
2053 const PipelineElement &E) {
2054 StringRef Name = E.Name;
2055 if (!E.InnerPipeline.empty())
2056 return make_error<StringError>("invalid pipeline",
2058
2059#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) \
2060 if (Name == NAME) { \
2061 MFPM.addPass(CREATE_PASS); \
2062 return Error::success(); \
2063 }
2064#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
2065 if (Name == NAME) { \
2066 MFPM.addPass(CREATE_PASS); \
2067 return Error::success(); \
2068 }
2069#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
2070 PARAMS) \
2071 if (checkParametrizedPassName(Name, NAME)) { \
2072 auto Params = parsePassParameters(PARSER, Name, NAME); \
2073 if (!Params) \
2074 return Params.takeError(); \
2075 MFPM.addPass(CREATE_PASS(Params.get())); \
2076 return Error::success(); \
2077 }
2078#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2079 if (Name == "require<" NAME ">") { \
2080 MFPM.addPass( \
2081 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2082 MachineFunction>()); \
2083 return Error::success(); \
2084 } \
2085 if (Name == "invalidate<" NAME ">") { \
2086 MFPM.addPass(InvalidateAnalysisPass< \
2087 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2088 return Error::success(); \
2089 }
2090#include "llvm/Passes/MachinePassRegistry.def"
2091
2092 for (auto &C : MachineFunctionPipelineParsingCallbacks)
2093 if (C(Name, MFPM, E.InnerPipeline))
2094 return Error::success();
2095 return make_error<StringError>(
2096 formatv("unknown machine pass '{0}'", Name).str(),
2098}
2099
2100bool PassBuilder::parseAAPassName(AAManager &AA, StringRef Name) {
2101#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2102 if (Name == NAME) { \
2103 AA.registerModuleAnalysis< \
2104 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2105 return true; \
2106 }
2107#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2108 if (Name == NAME) { \
2109 AA.registerFunctionAnalysis< \
2110 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2111 return true; \
2112 }
2113#include "PassRegistry.def"
2114
2115 for (auto &C : AAParsingCallbacks)
2116 if (C(Name, AA))
2117 return true;
2118 return false;
2119}
2120
2121Error PassBuilder::parseMachinePassPipeline(
2123 for (const auto &Element : Pipeline) {
2124 if (auto Err = parseMachinePass(MFPM, Element))
2125 return Err;
2126 }
2127 return Error::success();
2128}
2129
2130Error PassBuilder::parseLoopPassPipeline(LoopPassManager &LPM,
2131 ArrayRef<PipelineElement> Pipeline) {
2132 for (const auto &Element : Pipeline) {
2133 if (auto Err = parseLoopPass(LPM, Element))
2134 return Err;
2135 }
2136 return Error::success();
2137}
2138
2139Error PassBuilder::parseFunctionPassPipeline(
2141 for (const auto &Element : Pipeline) {
2142 if (auto Err = parseFunctionPass(FPM, Element))
2143 return Err;
2144 }
2145 return Error::success();
2146}
2147
2148Error PassBuilder::parseCGSCCPassPipeline(CGSCCPassManager &CGPM,
2149 ArrayRef<PipelineElement> Pipeline) {
2150 for (const auto &Element : Pipeline) {
2151 if (auto Err = parseCGSCCPass(CGPM, Element))
2152 return Err;
2153 }
2154 return Error::success();
2155}
2156
2169 if (MFAM) {
2171 [&] { return MachineFunctionAnalysisManagerModuleProxy(*MFAM); });
2173 [&] { return MachineFunctionAnalysisManagerFunctionProxy(*MFAM); });
2174 MFAM->registerPass(
2176 MFAM->registerPass(
2178 }
2179}
2180
2181Error PassBuilder::parseModulePassPipeline(ModulePassManager &MPM,
2182 ArrayRef<PipelineElement> Pipeline) {
2183 for (const auto &Element : Pipeline) {
2184 if (auto Err = parseModulePass(MPM, Element))
2185 return Err;
2186 }
2187 return Error::success();
2188}
2189
2190// Primary pass pipeline description parsing routine for a \c ModulePassManager
2191// FIXME: Should this routine accept a TargetMachine or require the caller to
2192// pre-populate the analysis managers with target-specific stuff?
2194 StringRef PipelineText) {
2195 auto Pipeline = parsePipelineText(PipelineText);
2196 if (!Pipeline || Pipeline->empty())
2197 return make_error<StringError>(
2198 formatv("invalid pipeline '{0}'", PipelineText).str(),
2200
2201 // If the first name isn't at the module layer, wrap the pipeline up
2202 // automatically.
2203 StringRef FirstName = Pipeline->front().Name;
2204
2205 if (!isModulePassName(FirstName, ModulePipelineParsingCallbacks)) {
2206 bool UseMemorySSA;
2207 if (isCGSCCPassName(FirstName, CGSCCPipelineParsingCallbacks)) {
2208 Pipeline = {{"cgscc", std::move(*Pipeline)}};
2209 } else if (isFunctionPassName(FirstName,
2210 FunctionPipelineParsingCallbacks)) {
2211 Pipeline = {{"function", std::move(*Pipeline)}};
2212 } else if (isLoopNestPassName(FirstName, LoopPipelineParsingCallbacks,
2213 UseMemorySSA)) {
2214 Pipeline = {{"function", {{UseMemorySSA ? "loop-mssa" : "loop",
2215 std::move(*Pipeline)}}}};
2216 } else if (isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
2217 UseMemorySSA)) {
2218 Pipeline = {{"function", {{UseMemorySSA ? "loop-mssa" : "loop",
2219 std::move(*Pipeline)}}}};
2220 } else if (isMachineFunctionPassName(
2221 FirstName, MachineFunctionPipelineParsingCallbacks)) {
2222 Pipeline = {{"function", {{"machine-function", std::move(*Pipeline)}}}};
2223 } else {
2224 for (auto &C : TopLevelPipelineParsingCallbacks)
2225 if (C(MPM, *Pipeline))
2226 return Error::success();
2227
2228 // Unknown pass or pipeline name!
2229 auto &InnerPipeline = Pipeline->front().InnerPipeline;
2230 return make_error<StringError>(
2231 formatv("unknown {0} name '{1}'",
2232 (InnerPipeline.empty() ? "pass" : "pipeline"), FirstName)
2233 .str(),
2235 }
2236 }
2237
2238 if (auto Err = parseModulePassPipeline(MPM, *Pipeline))
2239 return Err;
2240 return Error::success();
2241}
2242
2243// Primary pass pipeline description parsing routine for a \c CGSCCPassManager
2245 StringRef PipelineText) {
2246 auto Pipeline = parsePipelineText(PipelineText);
2247 if (!Pipeline || Pipeline->empty())
2248 return make_error<StringError>(
2249 formatv("invalid pipeline '{0}'", PipelineText).str(),
2251
2252 StringRef FirstName = Pipeline->front().Name;
2253 if (!isCGSCCPassName(FirstName, CGSCCPipelineParsingCallbacks))
2254 return make_error<StringError>(
2255 formatv("unknown cgscc pass '{0}' in pipeline '{1}'", FirstName,
2256 PipelineText)
2257 .str(),
2259
2260 if (auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
2261 return Err;
2262 return Error::success();
2263}
2264
2265// Primary pass pipeline description parsing routine for a \c
2266// FunctionPassManager
2268 StringRef PipelineText) {
2269 auto Pipeline = parsePipelineText(PipelineText);
2270 if (!Pipeline || Pipeline->empty())
2271 return make_error<StringError>(
2272 formatv("invalid pipeline '{0}'", PipelineText).str(),
2274
2275 StringRef FirstName = Pipeline->front().Name;
2276 if (!isFunctionPassName(FirstName, FunctionPipelineParsingCallbacks))
2277 return make_error<StringError>(
2278 formatv("unknown function pass '{0}' in pipeline '{1}'", FirstName,
2279 PipelineText)
2280 .str(),
2282
2283 if (auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2284 return Err;
2285 return Error::success();
2286}
2287
2288// Primary pass pipeline description parsing routine for a \c LoopPassManager
2290 StringRef PipelineText) {
2291 auto Pipeline = parsePipelineText(PipelineText);
2292 if (!Pipeline || Pipeline->empty())
2293 return make_error<StringError>(
2294 formatv("invalid pipeline '{0}'", PipelineText).str(),
2296
2297 if (auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2298 return Err;
2299
2300 return Error::success();
2301}
2302
2304 StringRef PipelineText) {
2305 auto Pipeline = parsePipelineText(PipelineText);
2306 if (!Pipeline || Pipeline->empty())
2307 return make_error<StringError>(
2308 formatv("invalid machine pass pipeline '{0}'", PipelineText).str(),
2310
2311 if (auto Err = parseMachinePassPipeline(MFPM, *Pipeline))
2312 return Err;
2313
2314 return Error::success();
2315}
2316
2318 // If the pipeline just consists of the word 'default' just replace the AA
2319 // manager with our default one.
2320 if (PipelineText == "default") {
2322 return Error::success();
2323 }
2324
2325 while (!PipelineText.empty()) {
2327 std::tie(Name, PipelineText) = PipelineText.split(',');
2328 if (!parseAAPassName(AA, Name))
2329 return make_error<StringError>(
2330 formatv("unknown alias analysis name '{0}'", Name).str(),
2332 }
2333
2334 return Error::success();
2335}
2336
2337std::optional<RegAllocFilterFunc>
2339 if (FilterName == "all")
2340 return nullptr;
2341 for (auto &C : RegClassFilterParsingCallbacks)
2342 if (auto F = C(FilterName))
2343 return F;
2344 return std::nullopt;
2345}
2346
2348 OS << " " << PassName << "\n";
2349}
2351 raw_ostream &OS) {
2352 OS << " " << PassName << "<" << Params << ">\n";
2353}
2354
2356 // TODO: print pass descriptions when they are available
2357
2358 OS << "Module passes:\n";
2359#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2360#include "PassRegistry.def"
2361
2362 OS << "Module passes with params:\n";
2363#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2364 printPassName(NAME, PARAMS, OS);
2365#include "PassRegistry.def"
2366
2367 OS << "Module analyses:\n";
2368#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2369#include "PassRegistry.def"
2370
2371 OS << "Module alias analyses:\n";
2372#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2373#include "PassRegistry.def"
2374
2375 OS << "CGSCC passes:\n";
2376#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2377#include "PassRegistry.def"
2378
2379 OS << "CGSCC passes with params:\n";
2380#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2381 printPassName(NAME, PARAMS, OS);
2382#include "PassRegistry.def"
2383
2384 OS << "CGSCC analyses:\n";
2385#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2386#include "PassRegistry.def"
2387
2388 OS << "Function passes:\n";
2389#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2390#include "PassRegistry.def"
2391
2392 OS << "Function passes with params:\n";
2393#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2394 printPassName(NAME, PARAMS, OS);
2395#include "PassRegistry.def"
2396
2397 OS << "Function analyses:\n";
2398#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2399#include "PassRegistry.def"
2400
2401 OS << "Function alias analyses:\n";
2402#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2403#include "PassRegistry.def"
2404
2405 OS << "LoopNest passes:\n";
2406#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2407#include "PassRegistry.def"
2408
2409 OS << "Loop passes:\n";
2410#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2411#include "PassRegistry.def"
2412
2413 OS << "Loop passes with params:\n";
2414#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2415 printPassName(NAME, PARAMS, OS);
2416#include "PassRegistry.def"
2417
2418 OS << "Loop analyses:\n";
2419#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2420#include "PassRegistry.def"
2421
2422 OS << "Machine module passes (WIP):\n";
2423#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2424#include "llvm/Passes/MachinePassRegistry.def"
2425
2426 OS << "Machine function passes (WIP):\n";
2427#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2428#include "llvm/Passes/MachinePassRegistry.def"
2429
2430 OS << "Machine function analyses (WIP):\n";
2431#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2432#include "llvm/Passes/MachinePassRegistry.def"
2433}
2434
2436 const std::function<bool(ModulePassManager &, ArrayRef<PipelineElement>)>
2437 &C) {
2438 TopLevelPipelineParsingCallbacks.push_back(C);
2439}
unsigned const MachineRegisterInfo * MRI
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.
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 ...
Defines an IR pass for CodeGen Prepare.
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 ...
This file provides a pass manager that only runs its passes if the provided marker analysis has been ...
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.
#define _
AcceleratorCodeSelection - Identify all functions reachable from a kernel, removing those that are un...
This file defines passes to print out IR in various granularities.
This header defines various interfaces for pass management in LLVM.
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.
This file contains the declaration of the InterleavedAccessPass class, its corresponding pass name is...
See the comments on JumpThreadingPass.
static LVOptions Options
Definition: LVOptions.cpp:25
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.
This file provides the interface for the pass responsible for removing expensive ubsan checks.
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
UseBFI
Definition: MachineLICM.cpp:89
===- MachineOptimizationRemarkEmitter.h - Opt Diagnostics -*- C++ -*-—===//
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
LoopAnalysisManager LAM
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &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 std::optional< int > parseDevirtPassName(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 bool isMachineFunctionPassName(StringRef Name, CallbacksT &Callbacks)
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 file implements the PredicateInfo analysis, which creates an Extended SSA form for operations us...
This pass is required to take advantage of the interprocedural register allocation infrastructure.
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 contains the declaration of the SelectOptimizePass class, its corresponding pass name is se...
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...
Target-Independent Code Generator Pass Configuration Options pass.
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[]
Value * RHS
A manager for alias analyses.
Class for arbitrary precision integers.
Definition: APInt.h:78
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1520
int64_t getSExtValue() const
Get sign extended value.
Definition: APInt.h:1542
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
bool registerPass(PassBuilderT &&PassBuilder)
Register an analysis pass with the manager.
Definition: PassManager.h:471
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:61
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:239
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
static ErrorSuccess success()
Create a success value.
Definition: Error.h:337
Tagged union holding either a T or a Error.
Definition: Error.h:481
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:557
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
Definition: PassManager.h:567
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
Definition: LowLevelType.h:42
An RAII based helper class to modify MachineFunctionProperties when running pass.
Properties which a MachineFunction may have at a given point in time.
MachineFunctionProperties & set(Property P)
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const MachineFunctionProperties & getProperties() const
Get the function properties.
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.
This class provides access to building LLVM's passes.
Definition: PassBuilder.h:105
void printPassNames(raw_ostream &OS)
Print pass names.
static bool checkParametrizedPassName(StringRef Name, StringRef PassName)
Definition: PassBuilder.h:650
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.
std::optional< RegAllocFilterFunc > parseRegAllocFilter(StringRef RegAllocFilterName)
Parse RegAllocFilterName to get RegAllocFilterFunc.
void crossRegisterProxies(LoopAnalysisManager &LAM, FunctionAnalysisManager &FAM, CGSCCAnalysisManager &CGAM, ModuleAnalysisManager &MAM, MachineFunctionAnalysisManager *MFAM=nullptr)
Cross register the analysis managers through their proxies.
ModulePassManager buildPerModuleDefaultPipeline(OptimizationLevel Level, ThinOrFullLTOPhase Phase=ThinOrFullLTOPhase::None)
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 a 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.
static Expected< bool > parseSinglePassOption(StringRef Params, StringRef OptionName, StringRef PassName)
Handle passes only accept one bool-valued parameter.
void registerMachineFunctionAnalyses(MachineFunctionAnalysisManager &MFAM)
Registers all available machine function 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.
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_v< PassT, PassManager > > addPass(PassT &&Pass)
Definition: PassManager.h:195
Tunable parameters for passes in the default pipelines.
Definition: PassBuilder.h:43
bool SLPVectorization
Tuning option to enable/disable slp loop vectorization, set based on opt level.
Definition: PassBuilder.h:58
bool LoopVectorization
Tuning option to enable/disable loop vectorization, set based on opt level.
Definition: PassBuilder.h:54
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:686
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:111
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition: Analysis.h:114
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:117
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:78
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition: StringRef.h:700
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition: StringRef.h:470
std::string str() const
str - Get the contents as an std::string.
Definition: StringRef.h:229
constexpr bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:147
char front() const
front - Get the first character in the string.
Definition: StringRef.h:153
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Definition: StringRef.h:635
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:77
This function has undefined behavior.
self_iterator getIterator()
Definition: ilist_node.h:132
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,...
@ 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
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:852
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:98
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
Definition: PassManager.h:802
InnerAnalysisManagerProxy< MachineFunctionAnalysisManager, Module > MachineFunctionAnalysisManagerModuleProxy
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:1746
ModuleToPostOrderCGSCCPassAdaptor createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
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:648
FunctionToMachineFunctionPassAdaptor createFunctionToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass)
InnerAnalysisManagerProxy< MachineFunctionAnalysisManager, Function > MachineFunctionAnalysisManagerFunctionProxy
OuterAnalysisManagerProxy< FunctionAnalysisManager, Loop, LoopStandardAnalysisResults & > FunctionAnalysisManagerLoopProxy
A proxy from a FunctionAnalysisManager to a Loop.
cl::opt< bool > PrintPipelinePasses
Common option used by multiple tools to print pipeline passes.
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.
@ Detailed
Hash with opcode only.
@ CallTargetIgnored
Hash with opcode and operands.
@ Enable
Enable colors.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:28
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
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:69
static StringRef name()
Gets the name of the pass we are mixed into.
Definition: PassManager.h:71
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
RegAllocFilterFunc Filter
Definition: RegAllocFast.h:18