400 "print-pipeline-passes",
401 cl::desc(
"Print a '-passes' compatible string describing the pipeline "
402 "(best-effort only)."));
420 return MFA ? &MFA->
getMF() :
nullptr;
426class TriggerCrashModulePass
433 static StringRef
name() {
return "TriggerCrashModulePass"; }
436class TriggerCrashFunctionPass
443 static StringRef
name() {
return "TriggerCrashFunctionPass"; }
448class TriggerVerifierErrorPass
454 auto *PtrTy = PointerType::getUnqual(
M.getContext());
456 GlobalValue::LinkageTypes::InternalLinkage,
457 "__bad_alias",
nullptr, &M);
477 static StringRef
name() {
return "TriggerVerifierErrorPass"; }
482class RequireAllMachineFunctionPropertiesPass
490 static MachineFunctionProperties getRequiredProperties() {
491 return MachineFunctionProperties()
493 .setFailsVerification()
498 .setRegBankSelected()
500 .setTiedOpsRewritten()
501 .setTracksDebugUserValues()
502 .setTracksLiveness();
504 static StringRef
name() {
return "RequireAllMachineFunctionPropertiesPass"; }
510 if (S ==
"Os" || S ==
"Oz")
512 Twine(
"The optimization level \"") + S +
513 "\" is no longer supported. Use O2 in conjunction with the " +
514 (S ==
"Os" ?
"optsize" :
"minsize") +
" attribute instead.");
525 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(S);
529 formatv(
"invalid optimization level '{}'", S).str(),
534 std::optional<PGOOptions> PGOOpt,
537 : TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC), FS(
std::
move(FS)) {
539 TM->registerPassBuilderCallbacks(*
this);
541 PIC->registerClassToPassNameCallback([
this, PIC]() {
545#define MODULE_PASS(NAME, CREATE_PASS) \
546 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
547#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
548 PIC->addClassToPassName(CLASS, NAME);
549#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
550 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
551#define FUNCTION_PASS(NAME, CREATE_PASS) \
552 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
553#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
554 PIC->addClassToPassName(CLASS, NAME);
555#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
556 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
557#define LOOPNEST_PASS(NAME, CREATE_PASS) \
558 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
559#define LOOP_PASS(NAME, CREATE_PASS) \
560 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
561#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
562 PIC->addClassToPassName(CLASS, NAME);
563#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
564 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
565#define CGSCC_PASS(NAME, CREATE_PASS) \
566 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
567#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
568 PIC->addClassToPassName(CLASS, NAME);
569#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
570 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
571#include "PassRegistry.def"
573#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
574 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
575#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
576 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
577#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
579 PIC->addClassToPassName(CLASS, NAME);
580#include "llvm/Passes/MachinePassRegistry.def"
588#define MODULE_CALLBACK(NAME, INVOKE) \
589 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
590 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
592 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
595 INVOKE(PM, L.get()); \
598#include "PassRegistry.def"
606#define MODULE_LTO_CALLBACK(NAME, INVOKE) \
607 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
608 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
610 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
613 INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \
616#include "PassRegistry.def"
624#define FUNCTION_CALLBACK(NAME, INVOKE) \
625 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
626 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
628 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
631 INVOKE(PM, L.get()); \
634#include "PassRegistry.def"
642#define CGSCC_CALLBACK(NAME, INVOKE) \
643 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
644 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
646 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
649 INVOKE(PM, L.get()); \
652#include "PassRegistry.def"
660#define LOOP_CALLBACK(NAME, INVOKE) \
661 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
662 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
664 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
667 INVOKE(PM, L.get()); \
670#include "PassRegistry.def"
676#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
677 MAM.registerPass([&] { return CREATE_PASS; });
678#include "PassRegistry.def"
680 for (
auto &
C : ModuleAnalysisRegistrationCallbacks)
685#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
686 CGAM.registerPass([&] { return CREATE_PASS; });
687#include "PassRegistry.def"
689 for (
auto &
C : CGSCCAnalysisRegistrationCallbacks)
699#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
700 if constexpr (std::is_constructible_v< \
701 std::remove_reference_t<decltype(CREATE_PASS)>, \
702 const TargetMachine &>) { \
704 FAM.registerPass([&] { return CREATE_PASS; }); \
706 FAM.registerPass([&] { return CREATE_PASS; }); \
708#include "PassRegistry.def"
710 for (
auto &
C : FunctionAnalysisRegistrationCallbacks)
717#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
718 MFAM.registerPass([&] { return CREATE_PASS; });
719#include "llvm/Passes/MachinePassRegistry.def"
721 for (
auto &
C : MachineFunctionAnalysisRegistrationCallbacks)
726#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
727 LAM.registerPass([&] { return CREATE_PASS; });
728#include "PassRegistry.def"
730 for (
auto &
C : LoopAnalysisRegistrationCallbacks)
734static std::optional<std::pair<bool, bool>>
736 std::pair<bool, bool> Params;
737 if (!Name.consume_front(
"function"))
741 if (!Name.consume_front(
"<") || !Name.consume_back(
">"))
743 while (!Name.empty()) {
744 auto [Front, Back] = Name.split(
';');
746 if (Front ==
"eager-inv")
748 else if (Front ==
"no-rerun")
749 Params.second =
true;
757 if (!Name.consume_front(
"devirt<") || !Name.consume_back(
">"))
769 while (!Params.
empty()) {
771 std::tie(ParamName, Params) = Params.
split(
';');
773 if (ParamName == OptionName) {
790 while (!Params.
empty()) {
792 std::tie(ParamName, Params) = Params.
split(
';');
797 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
802 if (ParamName.
consume_front(
"hardware-loop-counter-bitwidth=")) {
806 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
811 if (ParamName ==
"force-hardware-loops") {
813 }
else if (ParamName ==
"force-hardware-loop-phi") {
815 }
else if (ParamName ==
"force-nested-hardware-loop") {
817 }
else if (ParamName ==
"force-hardware-loop-guard") {
821 formatv(
"invalid HardwarePass parameter '{}'", ParamName).str(),
825 return HardwareLoopOpts;
842 while (!Params.
empty()) {
844 std::tie(ParamName, Params) = Params.
split(
';');
845 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(ParamName);
847 UnrollOpts.
setOptLevel(OptLevel->getSpeedupLevel());
854 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
861 if (ParamName ==
"partial") {
863 }
else if (ParamName ==
"peeling") {
865 }
else if (ParamName ==
"profile-peeling") {
867 }
else if (ParamName ==
"runtime") {
869 }
else if (ParamName ==
"upperbound") {
873 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
882 Params,
"vfe-linkage-unit-visibility",
"GlobalDCE");
902 Params,
"skip-non-recursive-function-attrs",
"PostOrderFunctionAttrs");
911 "EntryExitInstrumenter");
916 "DropUnnecessaryAssumes");
925 "LowerMatrixIntrinsics");
930 while (!Params.
empty()) {
932 std::tie(ParamName, Params) = Params.
split(
';');
935 if (ParamName ==
"preserve-order")
937 else if (ParamName ==
"rename-all")
939 else if (ParamName ==
"fold-all")
941 else if (ParamName ==
"reorder-operands")
945 formatv(
"invalid normalize pass parameter '{}'", ParamName).str(),
955 while (!Params.
empty()) {
957 std::tie(ParamName, Params) = Params.
split(
';');
959 if (ParamName ==
"kernel") {
960 Result.CompileKernel =
true;
961 }
else if (ParamName ==
"use-after-scope") {
962 Result.UseAfterScope =
true;
965 formatv(
"invalid AddressSanitizer pass parameter '{}'", ParamName)
975 while (!Params.
empty()) {
977 std::tie(ParamName, Params) = Params.
split(
';');
979 if (ParamName ==
"recover") {
981 }
else if (ParamName ==
"kernel") {
982 Result.CompileKernel =
true;
985 formatv(
"invalid HWAddressSanitizer pass parameter '{}'", ParamName)
994parseDropTypeTestsPassOptions(
StringRef Params) {
996 while (!Params.
empty()) {
998 std::tie(ParamName, Params) = Params.
split(
';');
1000 if (ParamName ==
"all") {
1002 }
else if (ParamName ==
"assume") {
1006 formatv(
"invalid DropTypeTestsPass parameter '{}'", ParamName).str(),
1015 while (!Params.
empty()) {
1017 std::tie(ParamName, Params) = Params.
split(
';');
1019 if (ParamName ==
"thinlto") {
1021 }
else if (ParamName ==
"emit-summary") {
1022 Result.EmitLTOSummary =
true;
1025 formatv(
"invalid EmbedBitcode pass parameter '{}'", ParamName).str(),
1033parseLowerAllowCheckPassOptions(
StringRef Params) {
1035 while (!Params.
empty()) {
1037 std::tie(ParamName, Params) = Params.
split(
';');
1048 std::tie(IndicesStr, CutoffStr) = ParamName.
split(
"]=");
1055 formatv(
"invalid LowerAllowCheck pass cutoffs parameter '{}' ({})",
1060 if (!IndicesStr.
consume_front(
"cutoffs[") || IndicesStr ==
"")
1062 formatv(
"invalid LowerAllowCheck pass index parameter '{}' ({})",
1063 IndicesStr, CutoffStr)
1067 while (IndicesStr !=
"") {
1069 std::tie(firstIndexStr, IndicesStr) = IndicesStr.
split(
'|');
1075 "invalid LowerAllowCheck pass index parameter '{}' ({}) {}",
1076 firstIndexStr, IndicesStr)
1083 if (index >=
Result.cutoffs.size())
1084 Result.cutoffs.resize(index + 1, 0);
1086 Result.cutoffs[index] = cutoff;
1088 }
else if (ParamName.
starts_with(
"runtime_check")) {
1090 std::tie(std::ignore, ValueString) = ParamName.
split(
"=");
1094 formatv(
"invalid LowerAllowCheck pass runtime_check parameter '{}' "
1096 ValueString, Params)
1100 Result.runtime_check = runtime_check;
1103 formatv(
"invalid LowerAllowCheck pass parameter '{}'", ParamName)
1114 while (!Params.
empty()) {
1116 std::tie(ParamName, Params) = Params.
split(
';');
1118 if (ParamName ==
"recover") {
1120 }
else if (ParamName ==
"kernel") {
1125 formatv(
"invalid argument to MemorySanitizer pass track-origins "
1130 }
else if (ParamName ==
"eager-checks") {
1131 Result.EagerChecks =
true;
1134 formatv(
"invalid MemorySanitizer pass parameter '{}'", ParamName)
1144 while (!Params.
empty()) {
1146 std::tie(ParamName, Params) = Params.
split(
';');
1153 formatv(
"invalid argument to AllocToken pass mode "
1160 formatv(
"invalid AllocToken pass parameter '{}'", ParamName).str(),
1170 while (!Params.
empty()) {
1172 std::tie(ParamName, Params) = Params.
split(
';');
1175 if (ParamName ==
"speculate-blocks") {
1177 }
else if (ParamName ==
"simplify-cond-branch") {
1179 }
else if (ParamName ==
"forward-switch-cond") {
1181 }
else if (ParamName ==
"switch-range-to-icmp") {
1183 }
else if (ParamName ==
"switch-to-arithmetic") {
1185 }
else if (ParamName ==
"switch-to-lookup") {
1187 }
else if (ParamName ==
"keep-loops") {
1189 }
else if (ParamName ==
"hoist-common-insts") {
1191 }
else if (ParamName ==
"hoist-loads-stores-with-cond-faulting") {
1193 }
else if (ParamName ==
"sink-common-insts") {
1195 }
else if (ParamName ==
"speculate-unpredictables") {
1198 APInt BonusInstThreshold;
1201 formatv(
"invalid argument to SimplifyCFG pass bonus-threshold "
1209 formatv(
"invalid SimplifyCFG pass parameter '{}'", ParamName).str(),
1220 Result.setVerifyFixpoint(
true);
1221 while (!Params.
empty()) {
1223 std::tie(ParamName, Params) = Params.
split(
';');
1226 if (ParamName ==
"verify-fixpoint") {
1229 APInt MaxIterations;
1232 formatv(
"invalid argument to InstCombine pass max-iterations "
1240 formatv(
"invalid InstCombine pass parameter '{}'", ParamName).str(),
1250 while (!Params.
empty()) {
1252 std::tie(ParamName, Params) = Params.
split(
';');
1255 if (ParamName ==
"interleave-forced-only") {
1257 }
else if (ParamName ==
"vectorize-forced-only") {
1261 formatv(
"invalid LoopVectorize parameter '{}'", ParamName).str(),
1269 std::pair<bool, bool>
Result = {
false,
true};
1270 while (!Params.
empty()) {
1272 std::tie(ParamName, Params) = Params.
split(
';');
1275 if (ParamName ==
"nontrivial") {
1277 }
else if (ParamName ==
"trivial") {
1281 formatv(
"invalid LoopUnswitch pass parameter '{}'", ParamName).str(),
1290 while (!Params.
empty()) {
1292 std::tie(ParamName, Params) = Params.
split(
';');
1295 if (ParamName ==
"allowspeculation") {
1299 formatv(
"invalid LICM pass parameter '{}'", ParamName).str(),
1306struct LoopRotateOptions {
1307 bool EnableHeaderDuplication =
true;
1308 bool PrepareForLTO =
false;
1309 bool CheckExitCount =
false;
1313 LoopRotateOptions
Result;
1314 while (!Params.
empty()) {
1316 std::tie(ParamName, Params) = Params.
split(
';');
1319 if (ParamName ==
"header-duplication") {
1321 }
else if (ParamName ==
"prepare-for-lto") {
1323 }
else if (ParamName ==
"check-exit-count") {
1327 formatv(
"invalid LoopRotate pass parameter '{}'", ParamName).str(),
1336 while (!Params.
empty()) {
1338 std::tie(ParamName, Params) = Params.
split(
';');
1341 if (ParamName ==
"split-footer-bb") {
1345 formatv(
"invalid MergedLoadStoreMotion pass parameter '{}'",
1356 while (!Params.
empty()) {
1358 std::tie(ParamName, Params) = Params.
split(
';');
1361 if (ParamName ==
"scalar-pre") {
1363 }
else if (ParamName ==
"load-pre") {
1365 }
else if (ParamName ==
"split-backedge-load-pre") {
1367 }
else if (ParamName ==
"memdep") {
1371 }
else if (ParamName ==
"memoryssa") {
1377 formatv(
"invalid GVN pass parameter '{}'", ParamName).str(),
1386 while (!Params.
empty()) {
1388 std::tie(ParamName, Params) = Params.
split(
';');
1391 if (ParamName ==
"func-spec")
1395 formatv(
"invalid IPSCCP pass parameter '{}'", ParamName).str(),
1403 while (!Params.
empty()) {
1405 std::tie(ParamName, Params) = Params.
split(
';');
1410 formatv(
"invalid argument to Scalarizer pass min-bits "
1421 if (ParamName ==
"load-store")
1423 else if (ParamName ==
"variable-insert-extract")
1427 formatv(
"invalid Scalarizer pass parameter '{}'", ParamName).str(),
1436 if (Params.
empty() || Params ==
"modify-cfg")
1438 if (Params ==
"preserve-cfg")
1441 formatv(
"invalid SROA pass parameter '{}' (either preserve-cfg or "
1442 "modify-cfg can be specified)",
1449parseStackLifetimeOptions(
StringRef Params) {
1451 while (!Params.
empty()) {
1453 std::tie(ParamName, Params) = Params.
split(
';');
1455 if (ParamName ==
"may") {
1457 }
else if (ParamName ==
"must") {
1461 formatv(
"invalid StackLifetime parameter '{}'", ParamName).str(),
1470 "DependenceAnalysisPrinter");
1475 "SeparateConstOffsetFromGEP");
1484parseFunctionSimplificationPipelineOptions(
StringRef Params) {
1488 formatv(
"invalid function-simplification parameter '{}'", Params).str(),
1496 "MemorySSAPrinterPass");
1501 "SpeculativeExecutionPass");
1506 while (!Params.
empty()) {
1508 std::tie(ParamName, Params) = Params.
split(
';');
1514 formatv(
"invalid MemProfUse pass parameter '{}'", ParamName).str(),
1522parseStructuralHashPrinterPassOptions(
StringRef Params) {
1525 if (Params ==
"detailed")
1527 if (Params ==
"call-target-ignored")
1530 formatv(
"invalid structural hash printer parameter '{}'", Params).str(),
1536 "WinEHPreparePass");
1541 while (!Params.
empty()) {
1543 std::tie(ParamName, Params) = Params.
split(
';');
1546 if (ParamName ==
"group-by-use")
1548 else if (ParamName ==
"ignore-single-use")
1550 else if (ParamName ==
"merge-const")
1552 else if (ParamName ==
"merge-const-aggressive")
1554 else if (ParamName ==
"merge-external")
1559 formatv(
"invalid GlobalMergePass parameter '{}'", ParamName).str(),
1563 formatv(
"invalid global-merge pass parameter '{}'", Params).str(),
1572 while (!Params.
empty()) {
1574 std::tie(ParamName, Params) = Params.
split(
';');
1580 formatv(
"invalid Internalize pass parameter '{}'", ParamName).str(),
1591 while (!Params.
empty()) {
1593 std::tie(ParamName, Params) = Params.
split(
';');
1596 std::optional<RegAllocFilterFunc>
Filter =
1600 formatv(
"invalid regallocfast register filter '{}'", ParamName)
1609 if (ParamName ==
"no-clear-vregs") {
1615 formatv(
"invalid regallocfast pass parameter '{}'", ParamName).str(),
1622parseBoundsCheckingOptions(
StringRef Params) {
1624 while (!Params.
empty()) {
1626 std::tie(ParamName, Params) = Params.
split(
';');
1627 if (ParamName ==
"trap") {
1629 }
else if (ParamName ==
"rt") {
1635 }
else if (ParamName ==
"rt-abort") {
1641 }
else if (ParamName ==
"min-rt") {
1647 }
else if (ParamName ==
"min-rt-abort") {
1653 }
else if (ParamName ==
"merge") {
1655 }
else if (ParamName ==
"handler-preserve-all-regs") {
1657 Options.Rt->HandlerPreserveAllRegs =
true;
1661 std::tie(ParamEQ, Val) = ParamName.
split(
'=');
1667 formatv(
"invalid BoundsChecking pass parameter '{}'", ParamName)
1684 if (!
Prefix.empty() || Digit.getAsInteger(10,
N))
1686 Param.str().c_str());
1689 if (!
Level.has_value())
1691 "invalid optimization level for expand-ir-insts pass: %s",
1692 Digit.str().c_str());
1699 if (Params.
empty() || Params ==
"all")
1700 return RAGreedyPass::Options();
1704 return RAGreedyPass::Options{*
Filter, Params};
1707 formatv(
"invalid regallocgreedy register filter '{}'", Params).str(),
1713 "MachineSinkingPass");
1717 bool AllowTailMerge =
true;
1718 if (!Params.
empty()) {
1720 if (Params !=
"tail-merge")
1722 formatv(
"invalid MachineBlockPlacementPass parameter '{}'", Params)
1726 return AllowTailMerge;
1730 bool ClearVirtRegs =
true;
1731 if (!Params.
empty()) {
1733 if (Params !=
"clear-vregs")
1735 formatv(
"invalid VirtRegRewriter pass parameter '{}'", Params).str(),
1738 return ClearVirtRegs;
1741struct FatLTOOptions {
1742 OptimizationLevel OptLevel;
1743 bool ThinLTO =
false;
1744 bool EmitSummary =
false;
1749 bool HaveOptLevel =
false;
1750 while (!Params.
empty()) {
1752 std::tie(ParamName, Params) = Params.
split(
';');
1754 if (ParamName ==
"thinlto") {
1756 }
else if (ParamName ==
"emit-summary") {
1757 Result.EmitSummary =
true;
1758 }
else if (std::optional<OptimizationLevel> OptLevel =
1760 Result.OptLevel = *OptLevel;
1761 HaveOptLevel =
true;
1764 formatv(
"invalid fatlto-pre-link pass parameter '{}'", ParamName)
1771 "missing optimization level for fatlto-pre-link pipeline",
1786template <
typename PassManagerT,
typename CallbacksT>
1788 if (!Callbacks.empty()) {
1789 PassManagerT DummyPM;
1790 for (
auto &CB : Callbacks)
1791 if (CB(Name, DummyPM, {}))
1797template <
typename CallbacksT>
1799 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1802 if (Name ==
"module")
1804 if (Name ==
"cgscc")
1806 if (NameNoBracket ==
"function")
1808 if (Name ==
"coro-cond")
1811#define MODULE_PASS(NAME, CREATE_PASS) \
1814#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1815 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1817#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1818 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1820#include "PassRegistry.def"
1825template <
typename CallbacksT>
1828 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1829 if (Name ==
"cgscc")
1831 if (NameNoBracket ==
"function")
1838#define CGSCC_PASS(NAME, CREATE_PASS) \
1841#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1842 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1844#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1845 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1847#include "PassRegistry.def"
1852template <
typename CallbacksT>
1855 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1856 if (NameNoBracket ==
"function")
1858 if (Name ==
"loop" || Name ==
"loop-mssa" || Name ==
"machine-function")
1861#define FUNCTION_PASS(NAME, CREATE_PASS) \
1864#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1865 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1867#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1868 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1870#include "PassRegistry.def"
1875template <
typename CallbacksT>
1878 if (Name ==
"machine-function")
1881#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
1884#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
1886 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1889#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1890 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1893#include "llvm/Passes/MachinePassRegistry.def"
1898template <
typename CallbacksT>
1900 bool &UseMemorySSA) {
1901 UseMemorySSA =
false;
1904 UseMemorySSA =
true;
1908#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1911#include "PassRegistry.def"
1916template <
typename CallbacksT>
1918 bool &UseMemorySSA) {
1919 UseMemorySSA =
false;
1922 UseMemorySSA =
true;
1926#define LOOP_PASS(NAME, CREATE_PASS) \
1929#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1930 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1932#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1933 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1935#include "PassRegistry.def"
1940std::optional<std::vector<PassBuilder::PipelineElement>>
1941PassBuilder::parsePipelineText(
StringRef Text) {
1942 std::vector<PipelineElement> ResultPipeline;
1947 std::vector<PipelineElement> &Pipeline = *PipelineStack.
back();
1948 size_t Pos =
Text.find_first_of(
",()");
1949 Pipeline.push_back({
Text.substr(0, Pos), {}});
1952 if (Pos ==
Text.npos)
1955 char Sep =
Text[Pos];
1963 PipelineStack.
push_back(&Pipeline.back().InnerPipeline);
1967 assert(Sep ==
')' &&
"Bogus separator!");
1972 if (PipelineStack.
size() == 1)
1973 return std::nullopt;
1976 }
while (
Text.consume_front(
")"));
1984 if (!
Text.consume_front(
","))
1985 return std::nullopt;
1988 if (PipelineStack.
size() > 1)
1990 return std::nullopt;
1992 assert(PipelineStack.
back() == &ResultPipeline &&
1993 "Wrong pipeline at the bottom of the stack!");
1994 return {std::move(ResultPipeline)};
2004 const PipelineElement &
E) {
2005 auto &
Name =
E.Name;
2006 auto &InnerPipeline =
E.InnerPipeline;
2009 if (!InnerPipeline.empty()) {
2010 if (Name ==
"module") {
2012 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
2014 MPM.
addPass(std::move(NestedMPM));
2017 if (Name ==
"coro-cond") {
2019 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
2021 MPM.
addPass(CoroConditionalWrapper(std::move(NestedMPM)));
2024 if (Name ==
"cgscc") {
2026 if (
auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
2034 "cannot have a no-rerun module to function adaptor",
2037 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2044 for (
auto &
C : ModulePipelineParsingCallbacks)
2045 if (
C(Name, MPM, InnerPipeline))
2050 formatv(
"invalid use of '{}' pass as module pipeline", Name).str(),
2056#define MODULE_PASS(NAME, CREATE_PASS) \
2057 if (Name == NAME) { \
2058 MPM.addPass(CREATE_PASS); \
2059 return Error::success(); \
2061#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2062 if (checkParametrizedPassName(Name, NAME)) { \
2063 auto Params = parsePassParameters(PARSER, Name, NAME); \
2065 return Params.takeError(); \
2066 MPM.addPass(CREATE_PASS(Params.get())); \
2067 return Error::success(); \
2069#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
2070 if (Name == "require<" NAME ">") { \
2072 RequireAnalysisPass< \
2073 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
2074 return Error::success(); \
2076 if (Name == "invalidate<" NAME ">") { \
2077 MPM.addPass(InvalidateAnalysisPass< \
2078 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2079 return Error::success(); \
2081#define CGSCC_PASS(NAME, CREATE_PASS) \
2082 if (Name == NAME) { \
2083 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
2084 return Error::success(); \
2086#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2087 if (checkParametrizedPassName(Name, NAME)) { \
2088 auto Params = parsePassParameters(PARSER, Name, NAME); \
2090 return Params.takeError(); \
2092 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
2093 return Error::success(); \
2095#define FUNCTION_PASS(NAME, CREATE_PASS) \
2096 if (Name == NAME) { \
2097 if constexpr (std::is_constructible_v< \
2098 std::remove_reference_t<decltype(CREATE_PASS)>, \
2099 const TargetMachine &>) { \
2101 return make_error<StringError>( \
2102 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2103 inconvertibleErrorCode()); \
2105 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
2106 return Error::success(); \
2108#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2109 if (checkParametrizedPassName(Name, NAME)) { \
2110 auto Params = parsePassParameters(PARSER, Name, NAME); \
2112 return Params.takeError(); \
2113 auto CreatePass = CREATE_PASS; \
2114 if constexpr (std::is_constructible_v< \
2115 std::remove_reference_t<decltype(CreatePass( \
2117 const TargetMachine &, \
2118 std::remove_reference_t<decltype(Params.get())>>) { \
2120 return make_error<StringError>( \
2121 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2122 inconvertibleErrorCode()); \
2125 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2126 return Error::success(); \
2128#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2129 if (Name == NAME) { \
2130 MPM.addPass(createModuleToFunctionPassAdaptor( \
2131 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2132 return Error::success(); \
2134#define LOOP_PASS(NAME, CREATE_PASS) \
2135 if (Name == NAME) { \
2136 MPM.addPass(createModuleToFunctionPassAdaptor( \
2137 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2138 return Error::success(); \
2140#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2141 if (checkParametrizedPassName(Name, NAME)) { \
2142 auto Params = parsePassParameters(PARSER, Name, NAME); \
2144 return Params.takeError(); \
2145 MPM.addPass(createModuleToFunctionPassAdaptor( \
2146 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2147 return Error::success(); \
2149#include "PassRegistry.def"
2151 for (
auto &
C : ModulePipelineParsingCallbacks)
2152 if (
C(Name, MPM, InnerPipeline))
2155 formatv(
"unknown module pass '{}'", Name).str(),
2160 const PipelineElement &
E) {
2161 auto &
Name =
E.Name;
2162 auto &InnerPipeline =
E.InnerPipeline;
2165 if (!InnerPipeline.empty()) {
2166 if (Name ==
"cgscc") {
2168 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2171 CGPM.
addPass(std::move(NestedCGPM));
2176 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2180 std::move(FPM), Params->first, Params->second));
2185 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2192 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2193 if (
C(Name, CGPM, InnerPipeline))
2198 formatv(
"invalid use of '{}' pass as cgscc pipeline", Name).str(),
2203#define CGSCC_PASS(NAME, CREATE_PASS) \
2204 if (Name == NAME) { \
2205 CGPM.addPass(CREATE_PASS); \
2206 return Error::success(); \
2208#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2209 if (checkParametrizedPassName(Name, NAME)) { \
2210 auto Params = parsePassParameters(PARSER, Name, NAME); \
2212 return Params.takeError(); \
2213 CGPM.addPass(CREATE_PASS(Params.get())); \
2214 return Error::success(); \
2216#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
2217 if (Name == "require<" NAME ">") { \
2218 CGPM.addPass(RequireAnalysisPass< \
2219 std::remove_reference_t<decltype(CREATE_PASS)>, \
2220 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
2221 CGSCCUpdateResult &>()); \
2222 return Error::success(); \
2224 if (Name == "invalidate<" NAME ">") { \
2225 CGPM.addPass(InvalidateAnalysisPass< \
2226 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2227 return Error::success(); \
2229#define FUNCTION_PASS(NAME, CREATE_PASS) \
2230 if (Name == NAME) { \
2231 if constexpr (std::is_constructible_v< \
2232 std::remove_reference_t<decltype(CREATE_PASS)>, \
2233 const TargetMachine &>) { \
2235 return make_error<StringError>( \
2236 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2237 inconvertibleErrorCode()); \
2239 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
2240 return Error::success(); \
2242#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2243 if (checkParametrizedPassName(Name, NAME)) { \
2244 auto Params = parsePassParameters(PARSER, Name, NAME); \
2246 return Params.takeError(); \
2247 auto CreatePass = CREATE_PASS; \
2248 if constexpr (std::is_constructible_v< \
2249 std::remove_reference_t<decltype(CreatePass( \
2251 const TargetMachine &, \
2252 std::remove_reference_t<decltype(Params.get())>>) { \
2254 return make_error<StringError>( \
2255 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2256 inconvertibleErrorCode()); \
2259 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2260 return Error::success(); \
2262#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2263 if (Name == NAME) { \
2264 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2265 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2266 return Error::success(); \
2268#define LOOP_PASS(NAME, CREATE_PASS) \
2269 if (Name == NAME) { \
2270 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2271 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2272 return Error::success(); \
2274#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2275 if (checkParametrizedPassName(Name, NAME)) { \
2276 auto Params = parsePassParameters(PARSER, Name, NAME); \
2278 return Params.takeError(); \
2279 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2280 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2281 return Error::success(); \
2283#include "PassRegistry.def"
2285 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2286 if (
C(Name, CGPM, InnerPipeline))
2293 const PipelineElement &
E) {
2294 auto &
Name =
E.Name;
2295 auto &InnerPipeline =
E.InnerPipeline;
2298 if (!InnerPipeline.empty()) {
2299 if (Name ==
"function") {
2301 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
2304 FPM.
addPass(std::move(NestedFPM));
2307 if (Name ==
"loop" || Name ==
"loop-mssa") {
2309 if (
auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
2312 bool UseMemorySSA = (
Name ==
"loop-mssa");
2317 if (Name ==
"machine-function") {
2319 if (
auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
2325 for (
auto &
C : FunctionPipelineParsingCallbacks)
2326 if (
C(Name, FPM, InnerPipeline))
2331 formatv(
"invalid use of '{}' pass as function pipeline", Name).str(),
2336#define FUNCTION_PASS(NAME, CREATE_PASS) \
2337 if (Name == NAME) { \
2338 if constexpr (std::is_constructible_v< \
2339 std::remove_reference_t<decltype(CREATE_PASS)>, \
2340 const TargetMachine &>) { \
2342 return make_error<StringError>( \
2343 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2344 inconvertibleErrorCode()); \
2346 FPM.addPass(CREATE_PASS); \
2347 return Error::success(); \
2349#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2350 if (checkParametrizedPassName(Name, NAME)) { \
2351 auto Params = parsePassParameters(PARSER, Name, NAME); \
2353 return Params.takeError(); \
2354 auto CreatePass = CREATE_PASS; \
2355 if constexpr (std::is_constructible_v< \
2356 std::remove_reference_t<decltype(CreatePass( \
2358 const TargetMachine &, \
2359 std::remove_reference_t<decltype(Params.get())>>) { \
2361 return make_error<StringError>( \
2362 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2363 inconvertibleErrorCode()); \
2366 FPM.addPass(CREATE_PASS(Params.get())); \
2367 return Error::success(); \
2369#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2370 if (Name == "require<" NAME ">") { \
2371 if constexpr (std::is_constructible_v< \
2372 std::remove_reference_t<decltype(CREATE_PASS)>, \
2373 const TargetMachine &>) { \
2375 return make_error<StringError>( \
2376 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2377 inconvertibleErrorCode()); \
2380 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2382 return Error::success(); \
2384 if (Name == "invalidate<" NAME ">") { \
2385 FPM.addPass(InvalidateAnalysisPass< \
2386 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2387 return Error::success(); \
2393#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2394 if (Name == NAME) { \
2395 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2396 return Error::success(); \
2398#define LOOP_PASS(NAME, CREATE_PASS) \
2399 if (Name == NAME) { \
2400 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2401 return Error::success(); \
2403#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2404 if (checkParametrizedPassName(Name, NAME)) { \
2405 auto Params = parsePassParameters(PARSER, Name, NAME); \
2407 return Params.takeError(); \
2409 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false)); \
2410 return Error::success(); \
2412#include "PassRegistry.def"
2414 for (
auto &
C : FunctionPipelineParsingCallbacks)
2415 if (
C(Name, FPM, InnerPipeline))
2418 formatv(
"unknown function pass '{}'", Name).str(),
2423 const PipelineElement &
E) {
2424 StringRef
Name =
E.Name;
2425 auto &InnerPipeline =
E.InnerPipeline;
2428 if (!InnerPipeline.empty()) {
2429 if (Name ==
"loop") {
2431 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
2434 LPM.addPass(std::move(NestedLPM));
2438 for (
auto &
C : LoopPipelineParsingCallbacks)
2439 if (
C(Name, LPM, InnerPipeline))
2444 formatv(
"invalid use of '{}' pass as loop pipeline", Name).str(),
2449#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2450 if (Name == NAME) { \
2451 LPM.addPass(CREATE_PASS); \
2452 return Error::success(); \
2454#define LOOP_PASS(NAME, CREATE_PASS) \
2455 if (Name == NAME) { \
2456 LPM.addPass(CREATE_PASS); \
2457 return Error::success(); \
2459#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2460 if (checkParametrizedPassName(Name, NAME)) { \
2461 auto Params = parsePassParameters(PARSER, Name, NAME); \
2463 return Params.takeError(); \
2464 LPM.addPass(CREATE_PASS(Params.get())); \
2465 return Error::success(); \
2467#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
2468 if (Name == "require<" NAME ">") { \
2469 LPM.addPass(RequireAnalysisPass< \
2470 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
2471 LoopAnalysisManager, LoopStandardAnalysisResults &, \
2473 return Error::success(); \
2475 if (Name == "invalidate<" NAME ">") { \
2476 LPM.addPass(InvalidateAnalysisPass< \
2477 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2478 return Error::success(); \
2480#include "PassRegistry.def"
2482 for (
auto &
C : LoopPipelineParsingCallbacks)
2483 if (
C(Name, LPM, InnerPipeline))
2490 const PipelineElement &
E) {
2491 StringRef
Name =
E.Name;
2493 if (!
E.InnerPipeline.empty()) {
2494 if (
E.Name ==
"machine-function") {
2496 if (
auto Err = parseMachinePassPipeline(NestedPM,
E.InnerPipeline))
2498 MFPM.
addPass(std::move(NestedPM));
2505#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) \
2506 if (Name == NAME) { \
2507 MFPM.addPass(CREATE_PASS); \
2508 return Error::success(); \
2510#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
2511 if (Name == NAME) { \
2512 MFPM.addPass(CREATE_PASS); \
2513 return Error::success(); \
2515#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
2517 if (checkParametrizedPassName(Name, NAME)) { \
2518 auto Params = parsePassParameters(PARSER, Name, NAME); \
2520 return Params.takeError(); \
2521 MFPM.addPass(CREATE_PASS(Params.get())); \
2522 return Error::success(); \
2524#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2525 if (Name == "require<" NAME ">") { \
2527 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2528 MachineFunction>()); \
2529 return Error::success(); \
2531 if (Name == "invalidate<" NAME ">") { \
2532 MFPM.addPass(InvalidateAnalysisPass< \
2533 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2534 return Error::success(); \
2536#include "llvm/Passes/MachinePassRegistry.def"
2538 for (
auto &
C : MachineFunctionPipelineParsingCallbacks)
2539 if (
C(Name, MFPM,
E.InnerPipeline))
2542 formatv(
"unknown machine pass '{}'", Name).str(),
2547#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2548 if (Name == NAME) { \
2549 AA.registerModuleAnalysis< \
2550 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2553#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2554 if (Name == NAME) { \
2555 AA.registerFunctionAnalysis< \
2556 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2559#include "PassRegistry.def"
2561 for (
auto &
C : AAParsingCallbacks)
2567Error PassBuilder::parseMachinePassPipeline(
2569 for (
const auto &Element : Pipeline) {
2570 if (
auto Err = parseMachinePass(MFPM, Element))
2578 for (
const auto &Element : Pipeline) {
2579 if (
auto Err = parseLoopPass(LPM, Element))
2585Error PassBuilder::parseFunctionPassPipeline(
2587 for (
const auto &Element : Pipeline) {
2588 if (
auto Err = parseFunctionPass(FPM, Element))
2596 for (
const auto &Element : Pipeline) {
2597 if (
auto Err = parseCGSCCPass(CGPM, Element))
2629 for (
const auto &Element : Pipeline) {
2630 if (
auto Err = parseModulePass(MPM, Element))
2641 auto Pipeline = parsePipelineText(PipelineText);
2642 if (!Pipeline || Pipeline->empty())
2644 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2654 Pipeline = {{
"cgscc", std::move(*Pipeline)}};
2656 FunctionPipelineParsingCallbacks)) {
2657 Pipeline = {{
"function", std::move(*Pipeline)}};
2660 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2661 std::move(*Pipeline)}}}};
2662 }
else if (
isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
2664 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2665 std::move(*Pipeline)}}}};
2667 FirstName, MachineFunctionPipelineParsingCallbacks)) {
2668 Pipeline = {{
"function", {{
"machine-function", std::move(*Pipeline)}}}};
2670 for (
auto &
C : TopLevelPipelineParsingCallbacks)
2671 if (
C(MPM, *Pipeline))
2675 auto &InnerPipeline = Pipeline->front().InnerPipeline;
2677 formatv(
"unknown {} name '{}'",
2678 (InnerPipeline.empty() ?
"pass" :
"pipeline"), FirstName)
2684 if (
auto Err = parseModulePassPipeline(MPM, *Pipeline))
2692 auto Pipeline = parsePipelineText(PipelineText);
2693 if (!Pipeline || Pipeline->empty())
2695 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2701 formatv(
"unknown cgscc pass '{}' in pipeline '{}'", FirstName,
2706 if (
auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
2715 auto Pipeline = parsePipelineText(PipelineText);
2716 if (!Pipeline || Pipeline->empty())
2718 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2724 formatv(
"unknown function pass '{}' in pipeline '{}'", FirstName,
2729 if (
auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2737 auto Pipeline = parsePipelineText(PipelineText);
2738 if (!Pipeline || Pipeline->empty())
2740 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2743 if (
auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2751 auto Pipeline = parsePipelineText(PipelineText);
2752 if (!Pipeline || Pipeline->empty())
2754 formatv(
"invalid machine pass pipeline '{}'", PipelineText).str(),
2757 if (
auto Err = parseMachinePassPipeline(MFPM, *Pipeline))
2766 if (PipelineText ==
"default") {
2771 while (!PipelineText.
empty()) {
2773 std::tie(Name, PipelineText) = PipelineText.
split(
',');
2774 if (!parseAAPassName(
AA, Name))
2776 formatv(
"unknown alias analysis name '{}'", Name).str(),
2783std::optional<RegAllocFilterFunc>
2785 if (FilterName ==
"all")
2787 for (
auto &
C : RegClassFilterParsingCallbacks)
2788 if (
auto F =
C(FilterName))
2790 return std::nullopt;
2798 OS <<
" " <<
PassName <<
"<" << Params <<
">\n";
2804 OS <<
"Module passes:\n";
2805#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2806#include "PassRegistry.def"
2808 OS <<
"Module passes with params:\n";
2809#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2810 printPassName(NAME, PARAMS, OS);
2811#include "PassRegistry.def"
2813 OS <<
"Module analyses:\n";
2814#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2815#include "PassRegistry.def"
2817 OS <<
"Module alias analyses:\n";
2818#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2819#include "PassRegistry.def"
2821 OS <<
"CGSCC passes:\n";
2822#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2823#include "PassRegistry.def"
2825 OS <<
"CGSCC passes with params:\n";
2826#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2827 printPassName(NAME, PARAMS, OS);
2828#include "PassRegistry.def"
2830 OS <<
"CGSCC analyses:\n";
2831#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2832#include "PassRegistry.def"
2834 OS <<
"Function passes:\n";
2835#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2836#include "PassRegistry.def"
2838 OS <<
"Function passes with params:\n";
2839#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2840 printPassName(NAME, PARAMS, OS);
2841#include "PassRegistry.def"
2843 OS <<
"Function analyses:\n";
2844#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2845#include "PassRegistry.def"
2847 OS <<
"Function alias analyses:\n";
2848#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2849#include "PassRegistry.def"
2851 OS <<
"LoopNest passes:\n";
2852#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2853#include "PassRegistry.def"
2855 OS <<
"Loop passes:\n";
2856#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2857#include "PassRegistry.def"
2859 OS <<
"Loop passes with params:\n";
2860#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2861 printPassName(NAME, PARAMS, OS);
2862#include "PassRegistry.def"
2864 OS <<
"Loop analyses:\n";
2865#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2866#include "PassRegistry.def"
2868 OS <<
"Machine module passes (WIP):\n";
2869#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2870#include "llvm/Passes/MachinePassRegistry.def"
2872 OS <<
"Machine function passes (WIP):\n";
2873#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2874#include "llvm/Passes/MachinePassRegistry.def"
2876 OS <<
"Machine function analyses (WIP):\n";
2877#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2878#include "llvm/Passes/MachinePassRegistry.def"
2884 TopLevelPipelineParsingCallbacks.push_back(
C);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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.
Provides analysis for continuously CSEing during GISel passes.
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 contains the declaration of the MachineKCFI class, which is a Machine Pass that implements ...
This file declares an analysis pass that computes CycleInfo for LLVM IR, specialized from GenericCycl...
Analysis that tracks defined/used subregister lanes across COPY instructions and instructions that ge...
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.
Provides analysis for querying information about KnownBits during GISel passes.
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 the IR2Vec vocabulary analysis(IR2VecVocabAnalysis), the core ir2vec::Embedder inte...
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.
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.
Machine Check Debug Module
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
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
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 isLoopNestPassName(StringRef Name, CallbacksT &Callbacks, bool &UseMemorySSA)
static bool isMachineFunctionPassName(StringRef Name, CallbacksT &Callbacks)
static Expected< OptimizationLevel > parseOptLevelParam(StringRef S)
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 void setupOptionsForPipelineAlias(PipelineTuningOptions &PTO, OptimizationLevel L)
This file implements the PredicateInfo analysis, which creates an Extended SSA form for operations us...
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
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...
This file provides the interface for LLVM's Scalar Replacement of Aggregates pass.
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...
This pass strips convergence intrinsics and operand bundles as those are only useful when modifying t...
Target-Independent Code Generator Pass Configuration Options pass.
This is the interface for a metadata-based TBAA.
static const char PassName[]
A manager for alias analyses.
Class for arbitrary precision integers.
uint64_t getZExtValue() const
Get zero extended value.
int64_t getSExtValue() const
Get sign extended value.
bool registerPass(PassBuilderT &&PassBuilder)
Register an analysis pass with the manager.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
static LLVM_ABI 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...
A smart pointer to a reference-counted object that inherits from RefCountedBase or ThreadSafeRefCount...
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
MachineFunction & getMF()
This analysis create MachineFunction for given Function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const MachineFunctionProperties & getProperties() const
Get the function properties.
LLVM_ABI Register createGenericVirtualRegister(LLT Ty, StringRef Name="")
Create and return a new generic virtual register with low-level type Ty.
static LLVM_ABI const OptimizationLevel O3
Optimize for fast execution as much as possible.
static LLVM_ABI const OptimizationLevel O0
Disable as many optimizations as possible.
static LLVM_ABI const OptimizationLevel O2
Optimize for fast execution as much as possible without triggering significant incremental compile ti...
static LLVM_ABI const OptimizationLevel O1
Optimize quickly without destroying debuggability.
This class provides access to building LLVM's passes.
LLVM_ABI void printPassNames(raw_ostream &OS)
Print pass names.
static bool checkParametrizedPassName(StringRef Name, StringRef PassName)
LLVM_ABI AAManager buildDefaultAAPipeline()
Build the default AAManager with the default alias analysis pipeline registered.
LLVM_ABI Error parseAAPipeline(AAManager &AA, StringRef PipelineText)
Parse a textual alias analysis pipeline into the provided AA manager.
LLVM_ABI void registerLoopAnalyses(LoopAnalysisManager &LAM)
Registers all available loop analysis passes.
LLVM_ABI std::optional< RegAllocFilterFunc > parseRegAllocFilter(StringRef RegAllocFilterName)
Parse RegAllocFilterName to get RegAllocFilterFunc.
LLVM_ABI void crossRegisterProxies(LoopAnalysisManager &LAM, FunctionAnalysisManager &FAM, CGSCCAnalysisManager &CGAM, ModuleAnalysisManager &MAM, MachineFunctionAnalysisManager *MFAM=nullptr)
Cross register the analysis managers through their proxies.
LLVM_ABI PassBuilder(TargetMachine *TM=nullptr, PipelineTuningOptions PTO=PipelineTuningOptions(), std::optional< PGOOptions > PGOOpt=std::nullopt, PassInstrumentationCallbacks *PIC=nullptr, IntrusiveRefCntPtr< vfs::FileSystem > FS=vfs::getRealFileSystem())
LLVM_ABI Error parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText)
Parse a textual pass pipeline description into a ModulePassManager.
void registerPipelineParsingCallback(const std::function< bool(StringRef Name, CGSCCPassManager &, ArrayRef< PipelineElement >)> &C)
{{@ Register pipeline parsing callbacks with this pass builder instance.
LLVM_ABI void registerModuleAnalyses(ModuleAnalysisManager &MAM)
Registers all available module analysis passes.
LLVM_ABI void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM)
Registers all available CGSCC analysis passes.
static LLVM_ABI Expected< bool > parseSinglePassOption(StringRef Params, StringRef OptionName, StringRef PassName)
Handle passes only accept one bool-valued parameter.
LLVM_ABI void registerMachineFunctionAnalyses(MachineFunctionAnalysisManager &MFAM)
Registers all available machine function analysis passes.
LLVM_ABI void registerParseTopLevelPipelineCallback(const std::function< bool(ModulePassManager &, ArrayRef< PipelineElement >)> &C)
Register a callback for a top-level pipeline entry.
LLVM_ABI 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<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
Tunable parameters for passes in the default pipelines.
bool SLPVectorization
Tuning option to enable/disable slp loop vectorization, set based on opt level.
bool LoopVectorization
Tuning option to enable/disable loop vectorization, set based on opt level.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
std::string str() const
Get the contents as an std::string.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
Check if the string is empty.
char front() const
Get the first character in the string.
bool consume_front(char Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
Primary interface to the complete machine description for the target machine.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
Interfaces for registering analysis passes, producing common pass manager configurations,...
Abstract Attribute helper functions.
@ C
The default llvm calling convention, compatible with C.
std::optional< CodeGenOptLevel > getLevel(int OL)
Get the Level identified by the integer OL.
@ BasicBlock
Various leaf nodes.
DXILDebugInfoMap run(Module &M)
DropTestKind
Specifies how to drop type tests.
@ All
Drop only llvm.assumes using type test value.
NodeAddr< FuncNode * > Func
This is an optimization pass for GlobalISel generic memory operations.
OuterAnalysisManagerProxy< CGSCCAnalysisManager, Function > CGSCCAnalysisManagerFunctionProxy
A proxy from a CGSCCAnalysisManager to a Function.
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
DevirtSCCRepeatedPass createDevirtSCCRepeatedPass(CGSCCPassT &&Pass, int MaxIterations)
A function to deduce a function pass type and wrap it in the templated adaptor.
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
InnerAnalysisManagerProxy< LoopAnalysisManager, Function > LoopAnalysisManagerFunctionProxy
A proxy from a LoopAnalysisManager to a Function.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
PassManager< LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, CGSCCUpdateResult & > CGSCCPassManager
The CGSCC pass manager.
AnalysisManager< LazyCallGraph::SCC, LazyCallGraph & > CGSCCAnalysisManager
The CGSCC analysis manager.
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
PassManager< Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, LPMUpdater & > LoopPassManager
The Loop pass manager.
ModuleToPostOrderCGSCCPassAdaptor createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
LLVM_ABI cl::opt< bool > PrintPipelinePasses
Common option used by multiple tools to print pipeline passes.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
FunctionToLoopPassAdaptor createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA=false)
A function to deduce a loop 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.
FunctionToMachineFunctionPassAdaptor createFunctionToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass)
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
FunctionAddr VTableAddr Count
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
InnerAnalysisManagerProxy< MachineFunctionAnalysisManager, Function > MachineFunctionAnalysisManagerFunctionProxy
OuterAnalysisManagerProxy< FunctionAnalysisManager, Loop, LoopStandardAnalysisResults & > FunctionAnalysisManagerLoopProxy
A proxy from a FunctionAnalysisManager to a Loop.
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
OuterAnalysisManagerProxy< ModuleAnalysisManager, LazyCallGraph::SCC, LazyCallGraph & > ModuleAnalysisManagerCGSCCProxy
A proxy from a ModuleAnalysisManager to an SCC.
InnerAnalysisManagerProxy< MachineFunctionAnalysisManager, Module > MachineFunctionAnalysisManagerModuleProxy
InnerAnalysisManagerProxy< CGSCCAnalysisManager, Module > CGSCCAnalysisManagerModuleProxy
A proxy from a CGSCCAnalysisManager to a Module.
PassManager< Function > FunctionPassManager
Convenience typedef for a pass manager over functions.
MFPropsModifier(PassT &P, MachineFunction &MF) -> MFPropsModifier< PassT >
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
PassManager< MachineFunction > MachineFunctionPassManager
Convenience typedef for a pass manager over functions.
LLVM_ABI bool applyDebugifyMetadataToMachineFunction(DIBuilder &DIB, Function &F, llvm::function_ref< MachineFunction *(Function &)> GetMF)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI std::optional< AllocTokenMode > getAllocTokenModeFromString(StringRef Name)
Returns the AllocTokenMode from its canonical string name; if an invalid name was provided returns nu...
@ Detailed
Hash with opcode only.
@ CallTargetIgnored
Hash with opcode and operands.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Implement std::hash so that hash_code can be used in STL containers.
A special type used by analysis passes to provide an address that identifies that particular analysis...
A set of parameters to control various transforms performed by GVN pass.
HardwareLoopOptions & setForceNested(bool Force)
HardwareLoopOptions & setDecrement(unsigned Count)
HardwareLoopOptions & setForceGuard(bool Force)
HardwareLoopOptions & setForce(bool Force)
HardwareLoopOptions & setCounterBitwidth(unsigned Width)
HardwareLoopOptions & setForcePhi(bool Force)
A set of parameters to control various transforms performed by IPSCCP pass.
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 for passes that can be skipped.
RegAllocFilterFunc Filter