402 "print-pipeline-passes",
403 cl::desc(
"Print a '-passes' compatible string describing the pipeline "
404 "(best-effort only)."));
422 return MFA ? &MFA->
getMF() :
nullptr;
428class TriggerVerifierErrorPass
434 auto *PtrTy = PointerType::getUnqual(
M.getContext());
436 GlobalValue::LinkageTypes::InternalLinkage,
437 "__bad_alias",
nullptr, &M);
457 static StringRef
name() {
return "TriggerVerifierErrorPass"; }
462class RequireAllMachineFunctionPropertiesPass
470 static MachineFunctionProperties getRequiredProperties() {
471 return MachineFunctionProperties()
473 .setFailsVerification()
478 .setRegBankSelected()
480 .setTiedOpsRewritten()
481 .setTracksDebugUserValues()
482 .setTracksLiveness();
484 static StringRef
name() {
return "RequireAllMachineFunctionPropertiesPass"; }
490 if (S ==
"Os" || S ==
"Oz")
492 Twine(
"The optimization level \"") + S +
493 "\" is no longer supported. Use O2 in conjunction with the " +
494 (S ==
"Os" ?
"optsize" :
"minsize") +
" attribute instead.");
505 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(S);
509 formatv(
"invalid optimization level '{}'", S).str(),
514 std::optional<PGOOptions> PGOOpt,
517 : TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC), FS(
std::
move(FS)) {
519 TM->registerPassBuilderCallbacks(*
this);
521 PIC->registerClassToPassNameCallback([
this, PIC]() {
525#define MODULE_PASS(NAME, CREATE_PASS) \
526 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
527#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
528 PIC->addClassToPassName(CLASS, NAME);
529#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
530 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
531#define FUNCTION_PASS(NAME, CREATE_PASS) \
532 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
533#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
534 PIC->addClassToPassName(CLASS, NAME);
535#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
536 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
537#define LOOPNEST_PASS(NAME, CREATE_PASS) \
538 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
539#define LOOP_PASS(NAME, CREATE_PASS) \
540 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
541#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
542 PIC->addClassToPassName(CLASS, NAME);
543#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
544 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
545#define CGSCC_PASS(NAME, CREATE_PASS) \
546 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
547#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
548 PIC->addClassToPassName(CLASS, NAME);
549#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
550 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
551#include "PassRegistry.def"
553#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
554 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
555#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
556 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
557#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
559 PIC->addClassToPassName(CLASS, NAME);
560#include "llvm/Passes/MachinePassRegistry.def"
568#define MODULE_CALLBACK(NAME, INVOKE) \
569 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
570 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
572 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
575 INVOKE(PM, L.get()); \
578#include "PassRegistry.def"
586#define MODULE_LTO_CALLBACK(NAME, INVOKE) \
587 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
588 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
590 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
593 INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \
596#include "PassRegistry.def"
604#define FUNCTION_CALLBACK(NAME, INVOKE) \
605 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
606 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
608 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
611 INVOKE(PM, L.get()); \
614#include "PassRegistry.def"
622#define CGSCC_CALLBACK(NAME, INVOKE) \
623 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
624 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
626 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
629 INVOKE(PM, L.get()); \
632#include "PassRegistry.def"
640#define LOOP_CALLBACK(NAME, INVOKE) \
641 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
642 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
644 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
647 INVOKE(PM, L.get()); \
650#include "PassRegistry.def"
656#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
657 MAM.registerPass([&] { return CREATE_PASS; });
658#include "PassRegistry.def"
660 for (
auto &
C : ModuleAnalysisRegistrationCallbacks)
665#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
666 CGAM.registerPass([&] { return CREATE_PASS; });
667#include "PassRegistry.def"
669 for (
auto &
C : CGSCCAnalysisRegistrationCallbacks)
679#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
680 if constexpr (std::is_constructible_v< \
681 std::remove_reference_t<decltype(CREATE_PASS)>, \
682 const TargetMachine &>) { \
684 FAM.registerPass([&] { return CREATE_PASS; }); \
686 FAM.registerPass([&] { return CREATE_PASS; }); \
688#include "PassRegistry.def"
690 for (
auto &
C : FunctionAnalysisRegistrationCallbacks)
697#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
698 MFAM.registerPass([&] { return CREATE_PASS; });
699#include "llvm/Passes/MachinePassRegistry.def"
701 for (
auto &
C : MachineFunctionAnalysisRegistrationCallbacks)
706#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
707 LAM.registerPass([&] { return CREATE_PASS; });
708#include "PassRegistry.def"
710 for (
auto &
C : LoopAnalysisRegistrationCallbacks)
714static std::optional<std::pair<bool, bool>>
716 std::pair<bool, bool> Params;
717 if (!Name.consume_front(
"function"))
721 if (!Name.consume_front(
"<") || !Name.consume_back(
">"))
723 while (!Name.empty()) {
724 auto [Front, Back] = Name.split(
';');
726 if (Front ==
"eager-inv")
728 else if (Front ==
"no-rerun")
729 Params.second =
true;
737 if (!Name.consume_front(
"devirt<") || !Name.consume_back(
">"))
749 while (!Params.
empty()) {
751 std::tie(ParamName, Params) = Params.
split(
';');
753 if (ParamName == OptionName) {
770 while (!Params.
empty()) {
772 std::tie(ParamName, Params) = Params.
split(
';');
777 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
782 if (ParamName.
consume_front(
"hardware-loop-counter-bitwidth=")) {
786 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
791 if (ParamName ==
"force-hardware-loops") {
793 }
else if (ParamName ==
"force-hardware-loop-phi") {
795 }
else if (ParamName ==
"force-nested-hardware-loop") {
797 }
else if (ParamName ==
"force-hardware-loop-guard") {
801 formatv(
"invalid HardwarePass parameter '{}'", ParamName).str(),
805 return HardwareLoopOpts;
817 "FunctionPropertiesStatisticsPass");
828 while (!Params.
empty()) {
830 std::tie(ParamName, Params) = Params.
split(
';');
831 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(ParamName);
833 UnrollOpts.
setOptLevel(OptLevel->getSpeedupLevel());
840 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
847 if (ParamName ==
"partial") {
849 }
else if (ParamName ==
"peeling") {
851 }
else if (ParamName ==
"profile-peeling") {
853 }
else if (ParamName ==
"runtime") {
855 }
else if (ParamName ==
"upperbound") {
859 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
868 Params,
"vfe-linkage-unit-visibility",
"GlobalDCE");
888 Params,
"skip-non-recursive-function-attrs",
"PostOrderFunctionAttrs");
897 "EntryExitInstrumenter");
902 "DropUnnecessaryAssumes");
911 "LowerMatrixIntrinsics");
916 while (!Params.
empty()) {
918 std::tie(ParamName, Params) = Params.
split(
';');
921 if (ParamName ==
"preserve-order")
923 else if (ParamName ==
"rename-all")
925 else if (ParamName ==
"fold-all")
927 else if (ParamName ==
"reorder-operands")
931 formatv(
"invalid normalize pass parameter '{}'", ParamName).str(),
941 while (!Params.
empty()) {
943 std::tie(ParamName, Params) = Params.
split(
';');
945 if (ParamName ==
"kernel") {
946 Result.CompileKernel =
true;
947 }
else if (ParamName ==
"use-after-scope") {
948 Result.UseAfterScope =
true;
951 formatv(
"invalid AddressSanitizer pass parameter '{}'", ParamName)
961 while (!Params.
empty()) {
963 std::tie(ParamName, Params) = Params.
split(
';');
965 if (ParamName ==
"recover") {
967 }
else if (ParamName ==
"kernel") {
968 Result.CompileKernel =
true;
971 formatv(
"invalid HWAddressSanitizer pass parameter '{}'", ParamName)
980parseDropTypeTestsPassOptions(
StringRef Params) {
982 while (!Params.
empty()) {
984 std::tie(ParamName, Params) = Params.
split(
';');
986 if (ParamName ==
"all") {
988 }
else if (ParamName ==
"assume") {
992 formatv(
"invalid DropTypeTestsPass parameter '{}'", ParamName).str(),
1001 while (!Params.
empty()) {
1003 std::tie(ParamName, Params) = Params.
split(
';');
1005 if (ParamName ==
"thinlto") {
1007 }
else if (ParamName ==
"emit-summary") {
1008 Result.EmitLTOSummary =
true;
1011 formatv(
"invalid EmbedBitcode pass parameter '{}'", ParamName).str(),
1019parseLowerAllowCheckPassOptions(
StringRef Params) {
1021 while (!Params.
empty()) {
1023 std::tie(ParamName, Params) = Params.
split(
';');
1034 std::tie(IndicesStr, CutoffStr) = ParamName.
split(
"]=");
1041 formatv(
"invalid LowerAllowCheck pass cutoffs parameter '{}' ({})",
1046 if (!IndicesStr.
consume_front(
"cutoffs[") || IndicesStr ==
"")
1048 formatv(
"invalid LowerAllowCheck pass index parameter '{}' ({})",
1049 IndicesStr, CutoffStr)
1053 while (IndicesStr !=
"") {
1055 std::tie(firstIndexStr, IndicesStr) = IndicesStr.
split(
'|');
1061 "invalid LowerAllowCheck pass index parameter '{}' ({}) {}",
1062 firstIndexStr, IndicesStr)
1069 if (index >=
Result.cutoffs.size())
1070 Result.cutoffs.resize(index + 1, 0);
1072 Result.cutoffs[index] = cutoff;
1074 }
else if (ParamName.
starts_with(
"runtime_check")) {
1076 std::tie(std::ignore, ValueString) = ParamName.
split(
"=");
1080 formatv(
"invalid LowerAllowCheck pass runtime_check parameter '{}' "
1082 ValueString, Params)
1086 Result.runtime_check = runtime_check;
1089 formatv(
"invalid LowerAllowCheck pass parameter '{}'", ParamName)
1100 while (!Params.
empty()) {
1102 std::tie(ParamName, Params) = Params.
split(
';');
1104 if (ParamName ==
"recover") {
1106 }
else if (ParamName ==
"kernel") {
1111 formatv(
"invalid argument to MemorySanitizer pass track-origins "
1116 }
else if (ParamName ==
"eager-checks") {
1117 Result.EagerChecks =
true;
1120 formatv(
"invalid MemorySanitizer pass parameter '{}'", ParamName)
1130 while (!Params.
empty()) {
1132 std::tie(ParamName, Params) = Params.
split(
';');
1139 formatv(
"invalid argument to AllocToken pass mode "
1146 formatv(
"invalid AllocToken pass parameter '{}'", ParamName).str(),
1156 while (!Params.
empty()) {
1158 std::tie(ParamName, Params) = Params.
split(
';');
1161 if (ParamName ==
"speculate-blocks") {
1163 }
else if (ParamName ==
"simplify-cond-branch") {
1165 }
else if (ParamName ==
"forward-switch-cond") {
1167 }
else if (ParamName ==
"switch-range-to-icmp") {
1169 }
else if (ParamName ==
"switch-to-arithmetic") {
1171 }
else if (ParamName ==
"switch-to-lookup") {
1173 }
else if (ParamName ==
"keep-loops") {
1175 }
else if (ParamName ==
"hoist-common-insts") {
1177 }
else if (ParamName ==
"hoist-loads-stores-with-cond-faulting") {
1179 }
else if (ParamName ==
"sink-common-insts") {
1181 }
else if (ParamName ==
"speculate-unpredictables") {
1184 APInt BonusInstThreshold;
1187 formatv(
"invalid argument to SimplifyCFG pass bonus-threshold "
1195 formatv(
"invalid SimplifyCFG pass parameter '{}'", ParamName).str(),
1206 Result.setVerifyFixpoint(
true);
1207 while (!Params.
empty()) {
1209 std::tie(ParamName, Params) = Params.
split(
';');
1212 if (ParamName ==
"verify-fixpoint") {
1215 APInt MaxIterations;
1218 formatv(
"invalid argument to InstCombine pass max-iterations "
1226 formatv(
"invalid InstCombine pass parameter '{}'", ParamName).str(),
1236 while (!Params.
empty()) {
1238 std::tie(ParamName, Params) = Params.
split(
';');
1241 if (ParamName ==
"interleave-forced-only") {
1243 }
else if (ParamName ==
"vectorize-forced-only") {
1247 formatv(
"invalid LoopVectorize parameter '{}'", ParamName).str(),
1255 std::pair<bool, bool>
Result = {
false,
true};
1256 while (!Params.
empty()) {
1258 std::tie(ParamName, Params) = Params.
split(
';');
1261 if (ParamName ==
"nontrivial") {
1263 }
else if (ParamName ==
"trivial") {
1267 formatv(
"invalid LoopUnswitch pass parameter '{}'", ParamName).str(),
1276 while (!Params.
empty()) {
1278 std::tie(ParamName, Params) = Params.
split(
';');
1281 if (ParamName ==
"allowspeculation") {
1285 formatv(
"invalid LICM pass parameter '{}'", ParamName).str(),
1292struct LoopRotateOptions {
1293 bool EnableHeaderDuplication =
true;
1294 bool PrepareForLTO =
false;
1295 bool CheckExitCount =
false;
1299 LoopRotateOptions
Result;
1300 while (!Params.
empty()) {
1302 std::tie(ParamName, Params) = Params.
split(
';');
1305 if (ParamName ==
"header-duplication") {
1307 }
else if (ParamName ==
"prepare-for-lto") {
1309 }
else if (ParamName ==
"check-exit-count") {
1313 formatv(
"invalid LoopRotate pass parameter '{}'", ParamName).str(),
1322 while (!Params.
empty()) {
1324 std::tie(ParamName, Params) = Params.
split(
';');
1327 if (ParamName ==
"split-footer-bb") {
1331 formatv(
"invalid MergedLoadStoreMotion pass parameter '{}'",
1342 while (!Params.
empty()) {
1344 std::tie(ParamName, Params) = Params.
split(
';');
1347 if (ParamName ==
"scalar-pre") {
1349 }
else if (ParamName ==
"load-pre") {
1351 }
else if (ParamName ==
"split-backedge-load-pre") {
1353 }
else if (ParamName ==
"memdep") {
1357 }
else if (ParamName ==
"memoryssa") {
1363 formatv(
"invalid GVN pass parameter '{}'", ParamName).str(),
1372 while (!Params.
empty()) {
1374 std::tie(ParamName, Params) = Params.
split(
';');
1377 if (ParamName ==
"func-spec")
1381 formatv(
"invalid IPSCCP pass parameter '{}'", ParamName).str(),
1389 while (!Params.
empty()) {
1391 std::tie(ParamName, Params) = Params.
split(
';');
1396 formatv(
"invalid argument to Scalarizer pass min-bits "
1407 if (ParamName ==
"load-store")
1409 else if (ParamName ==
"variable-insert-extract")
1413 formatv(
"invalid Scalarizer pass parameter '{}'", ParamName).str(),
1423 bool SawCFGOption =
false;
1424 while (!Params.
empty()) {
1426 std::tie(ParamName, Params) = Params.
split(
';');
1428 if (ParamName ==
"modify-cfg") {
1433 SawCFGOption =
true;
1434 }
else if (ParamName ==
"preserve-cfg") {
1439 SawCFGOption =
true;
1440 }
else if (ParamName ==
"aggregate-to-vector") {
1441 Result.AggregateToVector =
true;
1444 formatv(
"invalid SROA pass parameter '{}' (expected preserve-cfg, "
1445 "modify-cfg, or aggregate-to-vector)",
1455parseStackLifetimeOptions(
StringRef Params) {
1457 while (!Params.
empty()) {
1459 std::tie(ParamName, Params) = Params.
split(
';');
1461 if (ParamName ==
"may") {
1463 }
else if (ParamName ==
"must") {
1467 formatv(
"invalid StackLifetime parameter '{}'", ParamName).str(),
1476 "DependenceAnalysisPrinter");
1481 "SeparateConstOffsetFromGEP");
1490parseFunctionSimplificationPipelineOptions(
StringRef Params) {
1494 formatv(
"invalid function-simplification parameter '{}'", Params).str(),
1502 "MemorySSAPrinterPass");
1507 "SpeculativeExecutionPass");
1512 while (!Params.
empty()) {
1514 std::tie(ParamName, Params) = Params.
split(
';');
1520 formatv(
"invalid MemProfUse pass parameter '{}'", ParamName).str(),
1528parseStructuralHashPrinterPassOptions(
StringRef Params) {
1531 if (Params ==
"detailed")
1533 if (Params ==
"call-target-ignored")
1536 formatv(
"invalid structural hash printer parameter '{}'", Params).str(),
1542 "WinEHPreparePass");
1547 while (!Params.
empty()) {
1549 std::tie(ParamName, Params) = Params.
split(
';');
1552 if (ParamName ==
"group-by-use")
1554 else if (ParamName ==
"ignore-single-use")
1556 else if (ParamName ==
"merge-const")
1558 else if (ParamName ==
"merge-const-aggressive")
1560 else if (ParamName ==
"merge-external")
1565 formatv(
"invalid GlobalMergePass parameter '{}'", ParamName).str(),
1569 formatv(
"invalid global-merge pass parameter '{}'", Params).str(),
1578 while (!Params.
empty()) {
1580 std::tie(ParamName, Params) = Params.
split(
';');
1586 formatv(
"invalid Internalize pass parameter '{}'", ParamName).str(),
1597 while (!Params.
empty()) {
1599 std::tie(ParamName, Params) = Params.
split(
';');
1602 std::optional<RegAllocFilterFunc>
Filter =
1606 formatv(
"invalid regallocfast register filter '{}'", ParamName)
1615 if (ParamName ==
"no-clear-vregs") {
1621 formatv(
"invalid regallocfast pass parameter '{}'", ParamName).str(),
1628parseBoundsCheckingOptions(
StringRef Params) {
1630 while (!Params.
empty()) {
1632 std::tie(ParamName, Params) = Params.
split(
';');
1633 if (ParamName ==
"trap") {
1635 }
else if (ParamName ==
"rt") {
1641 }
else if (ParamName ==
"rt-abort") {
1647 }
else if (ParamName ==
"min-rt") {
1653 }
else if (ParamName ==
"min-rt-abort") {
1659 }
else if (ParamName ==
"merge") {
1661 }
else if (ParamName ==
"handler-preserve-all-regs") {
1663 Options.Rt->HandlerPreserveAllRegs =
true;
1667 std::tie(ParamEQ, Val) = ParamName.
split(
'=');
1673 formatv(
"invalid BoundsChecking pass parameter '{}'", ParamName)
1690 if (!
Prefix.empty() || Digit.getAsInteger(10,
N))
1692 Param.str().c_str());
1695 if (!
Level.has_value())
1697 "invalid optimization level for expand-ir-insts pass: %s",
1698 Digit.str().c_str());
1705 if (Params.
empty() || Params ==
"all")
1706 return RAGreedyPass::Options();
1710 return RAGreedyPass::Options{*
Filter, Params};
1713 formatv(
"invalid regallocgreedy register filter '{}'", Params).str(),
1719 "MachineSinkingPass");
1723 bool AllowTailMerge =
true;
1724 if (!Params.
empty()) {
1726 if (Params !=
"tail-merge")
1728 formatv(
"invalid MachineBlockPlacementPass parameter '{}'", Params)
1732 return AllowTailMerge;
1736 bool ClearVirtRegs =
true;
1737 if (!Params.
empty()) {
1739 if (Params !=
"clear-vregs")
1741 formatv(
"invalid VirtRegRewriter pass parameter '{}'", Params).str(),
1744 return ClearVirtRegs;
1747struct FatLTOOptions {
1748 OptimizationLevel OptLevel;
1749 bool ThinLTO =
false;
1750 bool EmitSummary =
false;
1755 bool HaveOptLevel =
false;
1756 while (!Params.
empty()) {
1758 std::tie(ParamName, Params) = Params.
split(
';');
1760 if (ParamName ==
"thinlto") {
1762 }
else if (ParamName ==
"emit-summary") {
1763 Result.EmitSummary =
true;
1764 }
else if (std::optional<OptimizationLevel> OptLevel =
1766 Result.OptLevel = *OptLevel;
1767 HaveOptLevel =
true;
1770 formatv(
"invalid fatlto-pre-link pass parameter '{}'", ParamName)
1777 "missing optimization level for fatlto-pre-link pipeline",
1792template <
typename PassManagerT,
typename CallbacksT>
1794 if (!Callbacks.empty()) {
1795 PassManagerT DummyPM;
1796 for (
auto &CB : Callbacks)
1797 if (CB(Name, DummyPM, {}))
1803template <
typename CallbacksT>
1805 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1808 if (Name ==
"module")
1810 if (Name ==
"cgscc")
1812 if (NameNoBracket ==
"function")
1814 if (Name ==
"coro-cond")
1817#define MODULE_PASS(NAME, CREATE_PASS) \
1820#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1821 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1823#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1824 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1826#include "PassRegistry.def"
1831template <
typename CallbacksT>
1834 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1835 if (Name ==
"cgscc")
1837 if (NameNoBracket ==
"function")
1844#define CGSCC_PASS(NAME, CREATE_PASS) \
1847#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1848 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1850#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1851 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1853#include "PassRegistry.def"
1858template <
typename CallbacksT>
1861 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1862 if (NameNoBracket ==
"function")
1864 if (Name ==
"loop" || Name ==
"loop-mssa" || Name ==
"machine-function")
1867#define FUNCTION_PASS(NAME, CREATE_PASS) \
1870#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1871 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1873#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1874 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1876#include "PassRegistry.def"
1881template <
typename CallbacksT>
1884 if (Name ==
"machine-function")
1887#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
1890#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
1892 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1895#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1896 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1899#include "llvm/Passes/MachinePassRegistry.def"
1904template <
typename CallbacksT>
1906 bool &UseMemorySSA) {
1907 UseMemorySSA =
false;
1910 UseMemorySSA =
true;
1914#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1917#include "PassRegistry.def"
1922template <
typename CallbacksT>
1924 bool &UseMemorySSA) {
1925 UseMemorySSA =
false;
1928 UseMemorySSA =
true;
1932#define LOOP_PASS(NAME, CREATE_PASS) \
1935#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1936 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1938#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1939 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1941#include "PassRegistry.def"
1946std::optional<std::vector<PassBuilder::PipelineElement>>
1947PassBuilder::parsePipelineText(
StringRef Text) {
1948 std::vector<PipelineElement> ResultPipeline;
1953 std::vector<PipelineElement> &Pipeline = *PipelineStack.
back();
1954 size_t Pos =
Text.find_first_of(
",()");
1955 Pipeline.push_back({
Text.substr(0, Pos), {}});
1958 if (Pos ==
Text.npos)
1961 char Sep =
Text[Pos];
1969 PipelineStack.
push_back(&Pipeline.back().InnerPipeline);
1973 assert(Sep ==
')' &&
"Bogus separator!");
1978 if (PipelineStack.
size() == 1)
1979 return std::nullopt;
1982 }
while (
Text.consume_front(
")"));
1990 if (!
Text.consume_front(
","))
1991 return std::nullopt;
1994 if (PipelineStack.
size() > 1)
1996 return std::nullopt;
1998 assert(PipelineStack.
back() == &ResultPipeline &&
1999 "Wrong pipeline at the bottom of the stack!");
2000 return {std::move(ResultPipeline)};
2010 const PipelineElement &
E) {
2011 auto &
Name =
E.Name;
2012 auto &InnerPipeline =
E.InnerPipeline;
2015 if (!InnerPipeline.empty()) {
2016 if (Name ==
"module") {
2018 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
2020 MPM.
addPass(std::move(NestedMPM));
2023 if (Name ==
"coro-cond") {
2025 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
2027 MPM.
addPass(CoroConditionalWrapper(std::move(NestedMPM)));
2030 if (Name ==
"cgscc") {
2032 if (
auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
2040 "cannot have a no-rerun module to function adaptor",
2043 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2050 for (
auto &
C : ModulePipelineParsingCallbacks)
2051 if (
C(Name, MPM, InnerPipeline))
2056 formatv(
"invalid use of '{}' pass as module pipeline", Name).str(),
2062#define MODULE_PASS(NAME, CREATE_PASS) \
2063 if (Name == NAME) { \
2064 MPM.addPass(CREATE_PASS); \
2065 return Error::success(); \
2067#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2068 if (checkParametrizedPassName(Name, NAME)) { \
2069 auto Params = parsePassParameters(PARSER, Name, NAME); \
2071 return Params.takeError(); \
2072 MPM.addPass(CREATE_PASS(Params.get())); \
2073 return Error::success(); \
2075#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
2076 if (Name == "require<" NAME ">") { \
2078 RequireAnalysisPass< \
2079 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
2080 return Error::success(); \
2082 if (Name == "invalidate<" NAME ">") { \
2083 MPM.addPass(InvalidateAnalysisPass< \
2084 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2085 return Error::success(); \
2087#define CGSCC_PASS(NAME, CREATE_PASS) \
2088 if (Name == NAME) { \
2089 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
2090 return Error::success(); \
2092#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2093 if (checkParametrizedPassName(Name, NAME)) { \
2094 auto Params = parsePassParameters(PARSER, Name, NAME); \
2096 return Params.takeError(); \
2098 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
2099 return Error::success(); \
2101#define FUNCTION_PASS(NAME, CREATE_PASS) \
2102 if (Name == NAME) { \
2103 if constexpr (std::is_constructible_v< \
2104 std::remove_reference_t<decltype(CREATE_PASS)>, \
2105 const TargetMachine &>) { \
2107 return make_error<StringError>( \
2108 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2109 inconvertibleErrorCode()); \
2111 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
2112 return Error::success(); \
2114#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2115 if (checkParametrizedPassName(Name, NAME)) { \
2116 auto Params = parsePassParameters(PARSER, Name, NAME); \
2118 return Params.takeError(); \
2119 auto CreatePass = CREATE_PASS; \
2120 if constexpr (std::is_constructible_v< \
2121 std::remove_reference_t<decltype(CreatePass( \
2123 const TargetMachine &, \
2124 std::remove_reference_t<decltype(Params.get())>>) { \
2126 return make_error<StringError>( \
2127 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2128 inconvertibleErrorCode()); \
2131 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2132 return Error::success(); \
2134#define LOOPNEST_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(NAME, CREATE_PASS) \
2141 if (Name == NAME) { \
2142 MPM.addPass(createModuleToFunctionPassAdaptor( \
2143 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2144 return Error::success(); \
2146#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2147 if (checkParametrizedPassName(Name, NAME)) { \
2148 auto Params = parsePassParameters(PARSER, Name, NAME); \
2150 return Params.takeError(); \
2151 MPM.addPass(createModuleToFunctionPassAdaptor( \
2152 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2153 return Error::success(); \
2155#include "PassRegistry.def"
2157 for (
auto &
C : ModulePipelineParsingCallbacks)
2158 if (
C(Name, MPM, InnerPipeline))
2161 formatv(
"unknown module pass '{}'", Name).str(),
2166 const PipelineElement &
E) {
2167 auto &
Name =
E.Name;
2168 auto &InnerPipeline =
E.InnerPipeline;
2171 if (!InnerPipeline.empty()) {
2172 if (Name ==
"cgscc") {
2174 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2177 CGPM.
addPass(std::move(NestedCGPM));
2182 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2186 std::move(FPM), Params->first, Params->second));
2191 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2198 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2199 if (
C(Name, CGPM, InnerPipeline))
2204 formatv(
"invalid use of '{}' pass as cgscc pipeline", Name).str(),
2209#define CGSCC_PASS(NAME, CREATE_PASS) \
2210 if (Name == NAME) { \
2211 CGPM.addPass(CREATE_PASS); \
2212 return Error::success(); \
2214#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2215 if (checkParametrizedPassName(Name, NAME)) { \
2216 auto Params = parsePassParameters(PARSER, Name, NAME); \
2218 return Params.takeError(); \
2219 CGPM.addPass(CREATE_PASS(Params.get())); \
2220 return Error::success(); \
2222#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
2223 if (Name == "require<" NAME ">") { \
2224 CGPM.addPass(RequireAnalysisPass< \
2225 std::remove_reference_t<decltype(CREATE_PASS)>, \
2226 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
2227 CGSCCUpdateResult &>()); \
2228 return Error::success(); \
2230 if (Name == "invalidate<" NAME ">") { \
2231 CGPM.addPass(InvalidateAnalysisPass< \
2232 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2233 return Error::success(); \
2235#define FUNCTION_PASS(NAME, CREATE_PASS) \
2236 if (Name == NAME) { \
2237 if constexpr (std::is_constructible_v< \
2238 std::remove_reference_t<decltype(CREATE_PASS)>, \
2239 const TargetMachine &>) { \
2241 return make_error<StringError>( \
2242 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2243 inconvertibleErrorCode()); \
2245 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
2246 return Error::success(); \
2248#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2249 if (checkParametrizedPassName(Name, NAME)) { \
2250 auto Params = parsePassParameters(PARSER, Name, NAME); \
2252 return Params.takeError(); \
2253 auto CreatePass = CREATE_PASS; \
2254 if constexpr (std::is_constructible_v< \
2255 std::remove_reference_t<decltype(CreatePass( \
2257 const TargetMachine &, \
2258 std::remove_reference_t<decltype(Params.get())>>) { \
2260 return make_error<StringError>( \
2261 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2262 inconvertibleErrorCode()); \
2265 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2266 return Error::success(); \
2268#define LOOPNEST_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(NAME, CREATE_PASS) \
2275 if (Name == NAME) { \
2276 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2277 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2278 return Error::success(); \
2280#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2281 if (checkParametrizedPassName(Name, NAME)) { \
2282 auto Params = parsePassParameters(PARSER, Name, NAME); \
2284 return Params.takeError(); \
2285 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2286 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2287 return Error::success(); \
2289#include "PassRegistry.def"
2291 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2292 if (
C(Name, CGPM, InnerPipeline))
2299 const PipelineElement &
E) {
2300 auto &
Name =
E.Name;
2301 auto &InnerPipeline =
E.InnerPipeline;
2304 if (!InnerPipeline.empty()) {
2305 if (Name ==
"function") {
2307 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
2310 FPM.
addPass(std::move(NestedFPM));
2313 if (Name ==
"loop" || Name ==
"loop-mssa") {
2315 if (
auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
2318 bool UseMemorySSA = (
Name ==
"loop-mssa");
2323 if (Name ==
"machine-function") {
2325 if (
auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
2331 for (
auto &
C : FunctionPipelineParsingCallbacks)
2332 if (
C(Name, FPM, InnerPipeline))
2337 formatv(
"invalid use of '{}' pass as function pipeline", Name).str(),
2342#define FUNCTION_PASS(NAME, CREATE_PASS) \
2343 if (Name == NAME) { \
2344 if constexpr (std::is_constructible_v< \
2345 std::remove_reference_t<decltype(CREATE_PASS)>, \
2346 const TargetMachine &>) { \
2348 return make_error<StringError>( \
2349 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2350 inconvertibleErrorCode()); \
2352 FPM.addPass(CREATE_PASS); \
2353 return Error::success(); \
2355#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2356 if (checkParametrizedPassName(Name, NAME)) { \
2357 auto Params = parsePassParameters(PARSER, Name, NAME); \
2359 return Params.takeError(); \
2360 auto CreatePass = CREATE_PASS; \
2361 if constexpr (std::is_constructible_v< \
2362 std::remove_reference_t<decltype(CreatePass( \
2364 const TargetMachine &, \
2365 std::remove_reference_t<decltype(Params.get())>>) { \
2367 return make_error<StringError>( \
2368 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2369 inconvertibleErrorCode()); \
2372 FPM.addPass(CREATE_PASS(Params.get())); \
2373 return Error::success(); \
2375#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2376 if (Name == "require<" NAME ">") { \
2377 if constexpr (std::is_constructible_v< \
2378 std::remove_reference_t<decltype(CREATE_PASS)>, \
2379 const TargetMachine &>) { \
2381 return make_error<StringError>( \
2382 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2383 inconvertibleErrorCode()); \
2386 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2388 return Error::success(); \
2390 if (Name == "invalidate<" NAME ">") { \
2391 FPM.addPass(InvalidateAnalysisPass< \
2392 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2393 return Error::success(); \
2399#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2400 if (Name == NAME) { \
2401 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2402 return Error::success(); \
2404#define LOOP_PASS(NAME, CREATE_PASS) \
2405 if (Name == NAME) { \
2406 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2407 return Error::success(); \
2409#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2410 if (checkParametrizedPassName(Name, NAME)) { \
2411 auto Params = parsePassParameters(PARSER, Name, NAME); \
2413 return Params.takeError(); \
2415 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false)); \
2416 return Error::success(); \
2418#include "PassRegistry.def"
2420 for (
auto &
C : FunctionPipelineParsingCallbacks)
2421 if (
C(Name, FPM, InnerPipeline))
2424 formatv(
"unknown function pass '{}'", Name).str(),
2429 const PipelineElement &
E) {
2430 StringRef
Name =
E.Name;
2431 auto &InnerPipeline =
E.InnerPipeline;
2434 if (!InnerPipeline.empty()) {
2435 if (Name ==
"loop") {
2437 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
2440 LPM.addPass(std::move(NestedLPM));
2444 for (
auto &
C : LoopPipelineParsingCallbacks)
2445 if (
C(Name, LPM, InnerPipeline))
2450 formatv(
"invalid use of '{}' pass as loop pipeline", Name).str(),
2455#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2456 if (Name == NAME) { \
2457 LPM.addPass(CREATE_PASS); \
2458 return Error::success(); \
2460#define LOOP_PASS(NAME, CREATE_PASS) \
2461 if (Name == NAME) { \
2462 LPM.addPass(CREATE_PASS); \
2463 return Error::success(); \
2465#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2466 if (checkParametrizedPassName(Name, NAME)) { \
2467 auto Params = parsePassParameters(PARSER, Name, NAME); \
2469 return Params.takeError(); \
2470 LPM.addPass(CREATE_PASS(Params.get())); \
2471 return Error::success(); \
2473#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
2474 if (Name == "require<" NAME ">") { \
2475 LPM.addPass(RequireAnalysisPass< \
2476 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
2477 LoopAnalysisManager, LoopStandardAnalysisResults &, \
2479 return Error::success(); \
2481 if (Name == "invalidate<" NAME ">") { \
2482 LPM.addPass(InvalidateAnalysisPass< \
2483 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2484 return Error::success(); \
2486#include "PassRegistry.def"
2488 for (
auto &
C : LoopPipelineParsingCallbacks)
2489 if (
C(Name, LPM, InnerPipeline))
2496 const PipelineElement &
E) {
2497 StringRef
Name =
E.Name;
2499 if (!
E.InnerPipeline.empty()) {
2500 if (
E.Name ==
"machine-function") {
2502 if (
auto Err = parseMachinePassPipeline(NestedPM,
E.InnerPipeline))
2504 MFPM.
addPass(std::move(NestedPM));
2511#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) \
2512 if (Name == NAME) { \
2513 MFPM.addPass(CREATE_PASS); \
2514 return Error::success(); \
2516#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
2517 if (Name == NAME) { \
2518 MFPM.addPass(CREATE_PASS); \
2519 return Error::success(); \
2521#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
2523 if (checkParametrizedPassName(Name, NAME)) { \
2524 auto Params = parsePassParameters(PARSER, Name, NAME); \
2526 return Params.takeError(); \
2527 MFPM.addPass(CREATE_PASS(Params.get())); \
2528 return Error::success(); \
2530#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2531 if (Name == "require<" NAME ">") { \
2533 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2534 MachineFunction>()); \
2535 return Error::success(); \
2537 if (Name == "invalidate<" NAME ">") { \
2538 MFPM.addPass(InvalidateAnalysisPass< \
2539 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2540 return Error::success(); \
2542#include "llvm/Passes/MachinePassRegistry.def"
2544 for (
auto &
C : MachineFunctionPipelineParsingCallbacks)
2545 if (
C(Name, MFPM,
E.InnerPipeline))
2548 formatv(
"unknown machine pass '{}'", Name).str(),
2553#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2554 if (Name == NAME) { \
2555 AA.registerModuleAnalysis< \
2556 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2559#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2560 if (Name == NAME) { \
2561 AA.registerFunctionAnalysis< \
2562 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2565#include "PassRegistry.def"
2567 for (
auto &
C : AAParsingCallbacks)
2573Error PassBuilder::parseMachinePassPipeline(
2575 for (
const auto &Element : Pipeline) {
2576 if (
auto Err = parseMachinePass(MFPM, Element))
2584 for (
const auto &Element : Pipeline) {
2585 if (
auto Err = parseLoopPass(LPM, Element))
2591Error PassBuilder::parseFunctionPassPipeline(
2593 for (
const auto &Element : Pipeline) {
2594 if (
auto Err = parseFunctionPass(FPM, Element))
2602 for (
const auto &Element : Pipeline) {
2603 if (
auto Err = parseCGSCCPass(CGPM, Element))
2635 for (
const auto &Element : Pipeline) {
2636 if (
auto Err = parseModulePass(MPM, Element))
2647 auto Pipeline = parsePipelineText(PipelineText);
2648 if (!Pipeline || Pipeline->empty())
2650 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2660 Pipeline = {{
"cgscc", std::move(*Pipeline)}};
2662 FunctionPipelineParsingCallbacks)) {
2663 Pipeline = {{
"function", std::move(*Pipeline)}};
2666 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2667 std::move(*Pipeline)}}}};
2668 }
else if (
isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
2670 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2671 std::move(*Pipeline)}}}};
2673 FirstName, MachineFunctionPipelineParsingCallbacks)) {
2674 Pipeline = {{
"function", {{
"machine-function", std::move(*Pipeline)}}}};
2676 for (
auto &
C : TopLevelPipelineParsingCallbacks)
2677 if (
C(MPM, *Pipeline))
2681 auto &InnerPipeline = Pipeline->front().InnerPipeline;
2683 formatv(
"unknown {} name '{}'",
2684 (InnerPipeline.empty() ?
"pass" :
"pipeline"), FirstName)
2690 if (
auto Err = parseModulePassPipeline(MPM, *Pipeline))
2698 auto Pipeline = parsePipelineText(PipelineText);
2699 if (!Pipeline || Pipeline->empty())
2701 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2707 formatv(
"unknown cgscc pass '{}' in pipeline '{}'", FirstName,
2712 if (
auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
2721 auto Pipeline = parsePipelineText(PipelineText);
2722 if (!Pipeline || Pipeline->empty())
2724 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2730 formatv(
"unknown function pass '{}' in pipeline '{}'", FirstName,
2735 if (
auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2743 auto Pipeline = parsePipelineText(PipelineText);
2744 if (!Pipeline || Pipeline->empty())
2746 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2749 if (
auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2757 auto Pipeline = parsePipelineText(PipelineText);
2758 if (!Pipeline || Pipeline->empty())
2760 formatv(
"invalid machine pass pipeline '{}'", PipelineText).str(),
2763 if (
auto Err = parseMachinePassPipeline(MFPM, *Pipeline))
2772 if (PipelineText ==
"default") {
2777 while (!PipelineText.
empty()) {
2779 std::tie(Name, PipelineText) = PipelineText.
split(
',');
2780 if (!parseAAPassName(
AA, Name))
2782 formatv(
"unknown alias analysis name '{}'", Name).str(),
2789std::optional<RegAllocFilterFunc>
2791 if (FilterName ==
"all")
2793 for (
auto &
C : RegClassFilterParsingCallbacks)
2794 if (
auto F =
C(FilterName))
2796 return std::nullopt;
2804 OS <<
" " <<
PassName <<
"<" << Params <<
">\n";
2810 OS <<
"Module passes:\n";
2811#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2812#include "PassRegistry.def"
2814 OS <<
"Module passes with params:\n";
2815#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2816 printPassName(NAME, PARAMS, OS);
2817#include "PassRegistry.def"
2819 OS <<
"Module analyses:\n";
2820#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2821#include "PassRegistry.def"
2823 OS <<
"Module alias analyses:\n";
2824#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2825#include "PassRegistry.def"
2827 OS <<
"CGSCC passes:\n";
2828#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2829#include "PassRegistry.def"
2831 OS <<
"CGSCC passes with params:\n";
2832#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2833 printPassName(NAME, PARAMS, OS);
2834#include "PassRegistry.def"
2836 OS <<
"CGSCC analyses:\n";
2837#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2838#include "PassRegistry.def"
2840 OS <<
"Function passes:\n";
2841#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2842#include "PassRegistry.def"
2844 OS <<
"Function passes with params:\n";
2845#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2846 printPassName(NAME, PARAMS, OS);
2847#include "PassRegistry.def"
2849 OS <<
"Function analyses:\n";
2850#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2851#include "PassRegistry.def"
2853 OS <<
"Function alias analyses:\n";
2854#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2855#include "PassRegistry.def"
2857 OS <<
"LoopNest passes:\n";
2858#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2859#include "PassRegistry.def"
2861 OS <<
"Loop passes:\n";
2862#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2863#include "PassRegistry.def"
2865 OS <<
"Loop passes with params:\n";
2866#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2867 printPassName(NAME, PARAMS, OS);
2868#include "PassRegistry.def"
2870 OS <<
"Loop analyses:\n";
2871#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2872#include "PassRegistry.def"
2874 OS <<
"Machine module passes (WIP):\n";
2875#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2876#include "llvm/Passes/MachinePassRegistry.def"
2878 OS <<
"Machine function passes (WIP):\n";
2879#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2880#include "llvm/Passes/MachinePassRegistry.def"
2882 OS <<
"Machine function analyses (WIP):\n";
2883#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2884#include "llvm/Passes/MachinePassRegistry.def"
2890 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.
This file contains the declaration of the BreakFalseDepsPass class, used to identify and avoid false ...
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