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;
837 while (!Params.
empty()) {
839 std::tie(ParamName, Params) = Params.
split(
';');
840 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(ParamName);
842 UnrollOpts.
setOptLevel(OptLevel->getSpeedupLevel());
849 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
856 if (ParamName ==
"partial") {
858 }
else if (ParamName ==
"peeling") {
860 }
else if (ParamName ==
"profile-peeling") {
862 }
else if (ParamName ==
"runtime") {
864 }
else if (ParamName ==
"upperbound") {
868 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
877 Params,
"vfe-linkage-unit-visibility",
"GlobalDCE");
897 Params,
"skip-non-recursive-function-attrs",
"PostOrderFunctionAttrs");
906 "EntryExitInstrumenter");
911 "DropUnnecessaryAssumes");
920 "LowerMatrixIntrinsics");
925 while (!Params.
empty()) {
927 std::tie(ParamName, Params) = Params.
split(
';');
930 if (ParamName ==
"preserve-order")
932 else if (ParamName ==
"rename-all")
934 else if (ParamName ==
"fold-all")
936 else if (ParamName ==
"reorder-operands")
940 formatv(
"invalid normalize pass parameter '{}'", ParamName).str(),
950 while (!Params.
empty()) {
952 std::tie(ParamName, Params) = Params.
split(
';');
954 if (ParamName ==
"kernel") {
955 Result.CompileKernel =
true;
956 }
else if (ParamName ==
"use-after-scope") {
957 Result.UseAfterScope =
true;
960 formatv(
"invalid AddressSanitizer pass parameter '{}'", ParamName)
970 while (!Params.
empty()) {
972 std::tie(ParamName, Params) = Params.
split(
';');
974 if (ParamName ==
"recover") {
976 }
else if (ParamName ==
"kernel") {
977 Result.CompileKernel =
true;
980 formatv(
"invalid HWAddressSanitizer pass parameter '{}'", ParamName)
989parseDropTypeTestsPassOptions(
StringRef Params) {
991 while (!Params.
empty()) {
993 std::tie(ParamName, Params) = Params.
split(
';');
995 if (ParamName ==
"all") {
997 }
else if (ParamName ==
"assume") {
1001 formatv(
"invalid DropTypeTestsPass parameter '{}'", ParamName).str(),
1010 while (!Params.
empty()) {
1012 std::tie(ParamName, Params) = Params.
split(
';');
1014 if (ParamName ==
"thinlto") {
1016 }
else if (ParamName ==
"emit-summary") {
1017 Result.EmitLTOSummary =
true;
1020 formatv(
"invalid EmbedBitcode pass parameter '{}'", ParamName).str(),
1028parseLowerAllowCheckPassOptions(
StringRef Params) {
1030 while (!Params.
empty()) {
1032 std::tie(ParamName, Params) = Params.
split(
';');
1043 std::tie(IndicesStr, CutoffStr) = ParamName.
split(
"]=");
1050 formatv(
"invalid LowerAllowCheck pass cutoffs parameter '{}' ({})",
1055 if (!IndicesStr.
consume_front(
"cutoffs[") || IndicesStr ==
"")
1057 formatv(
"invalid LowerAllowCheck pass index parameter '{}' ({})",
1058 IndicesStr, CutoffStr)
1062 while (IndicesStr !=
"") {
1064 std::tie(firstIndexStr, IndicesStr) = IndicesStr.
split(
'|');
1070 "invalid LowerAllowCheck pass index parameter '{}' ({}) {}",
1071 firstIndexStr, IndicesStr)
1078 if (index >=
Result.cutoffs.size())
1079 Result.cutoffs.resize(index + 1, 0);
1081 Result.cutoffs[index] = cutoff;
1083 }
else if (ParamName.
starts_with(
"runtime_check")) {
1085 std::tie(std::ignore, ValueString) = ParamName.
split(
"=");
1089 formatv(
"invalid LowerAllowCheck pass runtime_check parameter '{}' "
1091 ValueString, Params)
1095 Result.runtime_check = runtime_check;
1098 formatv(
"invalid LowerAllowCheck pass parameter '{}'", ParamName)
1109 while (!Params.
empty()) {
1111 std::tie(ParamName, Params) = Params.
split(
';');
1113 if (ParamName ==
"recover") {
1115 }
else if (ParamName ==
"kernel") {
1120 formatv(
"invalid argument to MemorySanitizer pass track-origins "
1125 }
else if (ParamName ==
"eager-checks") {
1126 Result.EagerChecks =
true;
1129 formatv(
"invalid MemorySanitizer pass parameter '{}'", ParamName)
1139 while (!Params.
empty()) {
1141 std::tie(ParamName, Params) = Params.
split(
';');
1148 formatv(
"invalid argument to AllocToken pass mode "
1155 formatv(
"invalid AllocToken pass parameter '{}'", ParamName).str(),
1165 while (!Params.
empty()) {
1167 std::tie(ParamName, Params) = Params.
split(
';');
1170 if (ParamName ==
"speculate-blocks") {
1172 }
else if (ParamName ==
"simplify-cond-branch") {
1174 }
else if (ParamName ==
"forward-switch-cond") {
1176 }
else if (ParamName ==
"switch-range-to-icmp") {
1178 }
else if (ParamName ==
"switch-to-arithmetic") {
1180 }
else if (ParamName ==
"switch-to-lookup") {
1182 }
else if (ParamName ==
"keep-loops") {
1184 }
else if (ParamName ==
"hoist-common-insts") {
1186 }
else if (ParamName ==
"hoist-loads-stores-with-cond-faulting") {
1188 }
else if (ParamName ==
"sink-common-insts") {
1190 }
else if (ParamName ==
"speculate-unpredictables") {
1193 APInt BonusInstThreshold;
1196 formatv(
"invalid argument to SimplifyCFG pass bonus-threshold "
1204 formatv(
"invalid SimplifyCFG pass parameter '{}'", ParamName).str(),
1215 Result.setVerifyFixpoint(
true);
1216 while (!Params.
empty()) {
1218 std::tie(ParamName, Params) = Params.
split(
';');
1221 if (ParamName ==
"verify-fixpoint") {
1224 APInt MaxIterations;
1227 formatv(
"invalid argument to InstCombine pass max-iterations "
1235 formatv(
"invalid InstCombine pass parameter '{}'", ParamName).str(),
1245 while (!Params.
empty()) {
1247 std::tie(ParamName, Params) = Params.
split(
';');
1250 if (ParamName ==
"interleave-forced-only") {
1252 }
else if (ParamName ==
"vectorize-forced-only") {
1256 formatv(
"invalid LoopVectorize parameter '{}'", ParamName).str(),
1264 std::pair<bool, bool>
Result = {
false,
true};
1265 while (!Params.
empty()) {
1267 std::tie(ParamName, Params) = Params.
split(
';');
1270 if (ParamName ==
"nontrivial") {
1272 }
else if (ParamName ==
"trivial") {
1276 formatv(
"invalid LoopUnswitch pass parameter '{}'", ParamName).str(),
1285 while (!Params.
empty()) {
1287 std::tie(ParamName, Params) = Params.
split(
';');
1290 if (ParamName ==
"allowspeculation") {
1294 formatv(
"invalid LICM pass parameter '{}'", ParamName).str(),
1301struct LoopRotateOptions {
1302 bool EnableHeaderDuplication =
true;
1303 bool PrepareForLTO =
false;
1304 bool CheckExitCount =
false;
1308 LoopRotateOptions
Result;
1309 while (!Params.
empty()) {
1311 std::tie(ParamName, Params) = Params.
split(
';');
1314 if (ParamName ==
"header-duplication") {
1316 }
else if (ParamName ==
"prepare-for-lto") {
1318 }
else if (ParamName ==
"check-exit-count") {
1322 formatv(
"invalid LoopRotate pass parameter '{}'", ParamName).str(),
1331 while (!Params.
empty()) {
1333 std::tie(ParamName, Params) = Params.
split(
';');
1336 if (ParamName ==
"split-footer-bb") {
1340 formatv(
"invalid MergedLoadStoreMotion pass parameter '{}'",
1351 while (!Params.
empty()) {
1353 std::tie(ParamName, Params) = Params.
split(
';');
1356 if (ParamName ==
"scalar-pre") {
1358 }
else if (ParamName ==
"load-pre") {
1360 }
else if (ParamName ==
"split-backedge-load-pre") {
1362 }
else if (ParamName ==
"memdep") {
1366 }
else if (ParamName ==
"memoryssa") {
1372 formatv(
"invalid GVN pass parameter '{}'", ParamName).str(),
1381 while (!Params.
empty()) {
1383 std::tie(ParamName, Params) = Params.
split(
';');
1386 if (ParamName ==
"func-spec")
1390 formatv(
"invalid IPSCCP pass parameter '{}'", ParamName).str(),
1398 while (!Params.
empty()) {
1400 std::tie(ParamName, Params) = Params.
split(
';');
1405 formatv(
"invalid argument to Scalarizer pass min-bits "
1416 if (ParamName ==
"load-store")
1418 else if (ParamName ==
"variable-insert-extract")
1422 formatv(
"invalid Scalarizer pass parameter '{}'", ParamName).str(),
1431 if (Params.
empty() || Params ==
"modify-cfg")
1433 if (Params ==
"preserve-cfg")
1436 formatv(
"invalid SROA pass parameter '{}' (either preserve-cfg or "
1437 "modify-cfg can be specified)",
1444parseStackLifetimeOptions(
StringRef Params) {
1446 while (!Params.
empty()) {
1448 std::tie(ParamName, Params) = Params.
split(
';');
1450 if (ParamName ==
"may") {
1452 }
else if (ParamName ==
"must") {
1456 formatv(
"invalid StackLifetime parameter '{}'", ParamName).str(),
1465 "DependenceAnalysisPrinter");
1470 "SeparateConstOffsetFromGEP");
1479parseFunctionSimplificationPipelineOptions(
StringRef Params) {
1483 formatv(
"invalid function-simplification parameter '{}'", Params).str(),
1491 "MemorySSAPrinterPass");
1496 "SpeculativeExecutionPass");
1501 while (!Params.
empty()) {
1503 std::tie(ParamName, Params) = Params.
split(
';');
1509 formatv(
"invalid MemProfUse pass parameter '{}'", ParamName).str(),
1517parseStructuralHashPrinterPassOptions(
StringRef Params) {
1520 if (Params ==
"detailed")
1522 if (Params ==
"call-target-ignored")
1525 formatv(
"invalid structural hash printer parameter '{}'", Params).str(),
1531 "WinEHPreparePass");
1536 while (!Params.
empty()) {
1538 std::tie(ParamName, Params) = Params.
split(
';');
1541 if (ParamName ==
"group-by-use")
1543 else if (ParamName ==
"ignore-single-use")
1545 else if (ParamName ==
"merge-const")
1547 else if (ParamName ==
"merge-const-aggressive")
1549 else if (ParamName ==
"merge-external")
1554 formatv(
"invalid GlobalMergePass parameter '{}'", ParamName).str(),
1558 formatv(
"invalid global-merge pass parameter '{}'", Params).str(),
1567 while (!Params.
empty()) {
1569 std::tie(ParamName, Params) = Params.
split(
';');
1575 formatv(
"invalid Internalize pass parameter '{}'", ParamName).str(),
1586 while (!Params.
empty()) {
1588 std::tie(ParamName, Params) = Params.
split(
';');
1591 std::optional<RegAllocFilterFunc>
Filter =
1595 formatv(
"invalid regallocfast register filter '{}'", ParamName)
1604 if (ParamName ==
"no-clear-vregs") {
1610 formatv(
"invalid regallocfast pass parameter '{}'", ParamName).str(),
1617parseBoundsCheckingOptions(
StringRef Params) {
1619 while (!Params.
empty()) {
1621 std::tie(ParamName, Params) = Params.
split(
';');
1622 if (ParamName ==
"trap") {
1624 }
else if (ParamName ==
"rt") {
1630 }
else if (ParamName ==
"rt-abort") {
1636 }
else if (ParamName ==
"min-rt") {
1642 }
else if (ParamName ==
"min-rt-abort") {
1648 }
else if (ParamName ==
"merge") {
1650 }
else if (ParamName ==
"handler-preserve-all-regs") {
1652 Options.Rt->HandlerPreserveAllRegs =
true;
1656 std::tie(ParamEQ, Val) = ParamName.
split(
'=');
1662 formatv(
"invalid BoundsChecking pass parameter '{}'", ParamName)
1679 if (!
Prefix.empty() || Digit.getAsInteger(10,
N))
1681 Param.str().c_str());
1684 if (!
Level.has_value())
1686 "invalid optimization level for expand-ir-insts pass: %s",
1687 Digit.str().c_str());
1694 if (Params.
empty() || Params ==
"all")
1695 return RAGreedyPass::Options();
1699 return RAGreedyPass::Options{*
Filter, Params};
1702 formatv(
"invalid regallocgreedy register filter '{}'", Params).str(),
1708 "MachineSinkingPass");
1712 bool AllowTailMerge =
true;
1713 if (!Params.
empty()) {
1715 if (Params !=
"tail-merge")
1717 formatv(
"invalid MachineBlockPlacementPass parameter '{}'", Params)
1721 return AllowTailMerge;
1725 bool ClearVirtRegs =
true;
1726 if (!Params.
empty()) {
1728 if (Params !=
"clear-vregs")
1730 formatv(
"invalid VirtRegRewriter pass parameter '{}'", Params).str(),
1733 return ClearVirtRegs;
1736struct FatLTOOptions {
1737 OptimizationLevel OptLevel;
1738 bool ThinLTO =
false;
1739 bool EmitSummary =
false;
1744 bool HaveOptLevel =
false;
1745 while (!Params.
empty()) {
1747 std::tie(ParamName, Params) = Params.
split(
';');
1749 if (ParamName ==
"thinlto") {
1751 }
else if (ParamName ==
"emit-summary") {
1752 Result.EmitSummary =
true;
1753 }
else if (std::optional<OptimizationLevel> OptLevel =
1755 Result.OptLevel = *OptLevel;
1756 HaveOptLevel =
true;
1759 formatv(
"invalid fatlto-pre-link pass parameter '{}'", ParamName)
1766 "missing optimization level for fatlto-pre-link pipeline",
1781template <
typename PassManagerT,
typename CallbacksT>
1783 if (!Callbacks.empty()) {
1784 PassManagerT DummyPM;
1785 for (
auto &CB : Callbacks)
1786 if (CB(Name, DummyPM, {}))
1792template <
typename CallbacksT>
1794 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1797 if (Name ==
"module")
1799 if (Name ==
"cgscc")
1801 if (NameNoBracket ==
"function")
1803 if (Name ==
"coro-cond")
1806#define MODULE_PASS(NAME, CREATE_PASS) \
1809#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1810 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1812#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1813 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1815#include "PassRegistry.def"
1820template <
typename CallbacksT>
1823 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1824 if (Name ==
"cgscc")
1826 if (NameNoBracket ==
"function")
1833#define CGSCC_PASS(NAME, CREATE_PASS) \
1836#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1837 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1839#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1840 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1842#include "PassRegistry.def"
1847template <
typename CallbacksT>
1850 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1851 if (NameNoBracket ==
"function")
1853 if (Name ==
"loop" || Name ==
"loop-mssa" || Name ==
"machine-function")
1856#define FUNCTION_PASS(NAME, CREATE_PASS) \
1859#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1860 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1862#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1863 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1865#include "PassRegistry.def"
1870template <
typename CallbacksT>
1873 if (Name ==
"machine-function")
1876#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
1879#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
1881 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1884#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1885 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1888#include "llvm/Passes/MachinePassRegistry.def"
1893template <
typename CallbacksT>
1895 bool &UseMemorySSA) {
1896 UseMemorySSA =
false;
1899 UseMemorySSA =
true;
1903#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1906#include "PassRegistry.def"
1911template <
typename CallbacksT>
1913 bool &UseMemorySSA) {
1914 UseMemorySSA =
false;
1917 UseMemorySSA =
true;
1921#define LOOP_PASS(NAME, CREATE_PASS) \
1924#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1925 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1927#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1928 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1930#include "PassRegistry.def"
1935std::optional<std::vector<PassBuilder::PipelineElement>>
1936PassBuilder::parsePipelineText(
StringRef Text) {
1937 std::vector<PipelineElement> ResultPipeline;
1942 std::vector<PipelineElement> &Pipeline = *PipelineStack.
back();
1943 size_t Pos =
Text.find_first_of(
",()");
1944 Pipeline.push_back({
Text.substr(0, Pos), {}});
1947 if (Pos ==
Text.npos)
1950 char Sep =
Text[Pos];
1958 PipelineStack.
push_back(&Pipeline.back().InnerPipeline);
1962 assert(Sep ==
')' &&
"Bogus separator!");
1967 if (PipelineStack.
size() == 1)
1968 return std::nullopt;
1971 }
while (
Text.consume_front(
")"));
1979 if (!
Text.consume_front(
","))
1980 return std::nullopt;
1983 if (PipelineStack.
size() > 1)
1985 return std::nullopt;
1987 assert(PipelineStack.
back() == &ResultPipeline &&
1988 "Wrong pipeline at the bottom of the stack!");
1989 return {std::move(ResultPipeline)};
1999 const PipelineElement &
E) {
2000 auto &
Name =
E.Name;
2001 auto &InnerPipeline =
E.InnerPipeline;
2004 if (!InnerPipeline.empty()) {
2005 if (Name ==
"module") {
2007 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
2009 MPM.
addPass(std::move(NestedMPM));
2012 if (Name ==
"coro-cond") {
2014 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
2016 MPM.
addPass(CoroConditionalWrapper(std::move(NestedMPM)));
2019 if (Name ==
"cgscc") {
2021 if (
auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
2029 "cannot have a no-rerun module to function adaptor",
2032 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2039 for (
auto &
C : ModulePipelineParsingCallbacks)
2040 if (
C(Name, MPM, InnerPipeline))
2045 formatv(
"invalid use of '{}' pass as module pipeline", Name).str(),
2051#define MODULE_PASS(NAME, CREATE_PASS) \
2052 if (Name == NAME) { \
2053 MPM.addPass(CREATE_PASS); \
2054 return Error::success(); \
2056#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2057 if (checkParametrizedPassName(Name, NAME)) { \
2058 auto Params = parsePassParameters(PARSER, Name, NAME); \
2060 return Params.takeError(); \
2061 MPM.addPass(CREATE_PASS(Params.get())); \
2062 return Error::success(); \
2064#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
2065 if (Name == "require<" NAME ">") { \
2067 RequireAnalysisPass< \
2068 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
2069 return Error::success(); \
2071 if (Name == "invalidate<" NAME ">") { \
2072 MPM.addPass(InvalidateAnalysisPass< \
2073 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2074 return Error::success(); \
2076#define CGSCC_PASS(NAME, CREATE_PASS) \
2077 if (Name == NAME) { \
2078 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
2079 return Error::success(); \
2081#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2082 if (checkParametrizedPassName(Name, NAME)) { \
2083 auto Params = parsePassParameters(PARSER, Name, NAME); \
2085 return Params.takeError(); \
2087 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
2088 return Error::success(); \
2090#define FUNCTION_PASS(NAME, CREATE_PASS) \
2091 if (Name == NAME) { \
2092 if constexpr (std::is_constructible_v< \
2093 std::remove_reference_t<decltype(CREATE_PASS)>, \
2094 const TargetMachine &>) { \
2096 return make_error<StringError>( \
2097 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2098 inconvertibleErrorCode()); \
2100 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
2101 return Error::success(); \
2103#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2104 if (checkParametrizedPassName(Name, NAME)) { \
2105 auto Params = parsePassParameters(PARSER, Name, NAME); \
2107 return Params.takeError(); \
2108 auto CreatePass = CREATE_PASS; \
2109 if constexpr (std::is_constructible_v< \
2110 std::remove_reference_t<decltype(CreatePass( \
2112 const TargetMachine &, \
2113 std::remove_reference_t<decltype(Params.get())>>) { \
2115 return make_error<StringError>( \
2116 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2117 inconvertibleErrorCode()); \
2120 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2121 return Error::success(); \
2123#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2124 if (Name == NAME) { \
2125 MPM.addPass(createModuleToFunctionPassAdaptor( \
2126 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2127 return Error::success(); \
2129#define LOOP_PASS(NAME, CREATE_PASS) \
2130 if (Name == NAME) { \
2131 MPM.addPass(createModuleToFunctionPassAdaptor( \
2132 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2133 return Error::success(); \
2135#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2136 if (checkParametrizedPassName(Name, NAME)) { \
2137 auto Params = parsePassParameters(PARSER, Name, NAME); \
2139 return Params.takeError(); \
2140 MPM.addPass(createModuleToFunctionPassAdaptor( \
2141 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2142 return Error::success(); \
2144#include "PassRegistry.def"
2146 for (
auto &
C : ModulePipelineParsingCallbacks)
2147 if (
C(Name, MPM, InnerPipeline))
2150 formatv(
"unknown module pass '{}'", Name).str(),
2155 const PipelineElement &
E) {
2156 auto &
Name =
E.Name;
2157 auto &InnerPipeline =
E.InnerPipeline;
2160 if (!InnerPipeline.empty()) {
2161 if (Name ==
"cgscc") {
2163 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2166 CGPM.
addPass(std::move(NestedCGPM));
2171 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2175 std::move(FPM), Params->first, Params->second));
2180 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2187 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2188 if (
C(Name, CGPM, InnerPipeline))
2193 formatv(
"invalid use of '{}' pass as cgscc pipeline", Name).str(),
2198#define CGSCC_PASS(NAME, CREATE_PASS) \
2199 if (Name == NAME) { \
2200 CGPM.addPass(CREATE_PASS); \
2201 return Error::success(); \
2203#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2204 if (checkParametrizedPassName(Name, NAME)) { \
2205 auto Params = parsePassParameters(PARSER, Name, NAME); \
2207 return Params.takeError(); \
2208 CGPM.addPass(CREATE_PASS(Params.get())); \
2209 return Error::success(); \
2211#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
2212 if (Name == "require<" NAME ">") { \
2213 CGPM.addPass(RequireAnalysisPass< \
2214 std::remove_reference_t<decltype(CREATE_PASS)>, \
2215 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
2216 CGSCCUpdateResult &>()); \
2217 return Error::success(); \
2219 if (Name == "invalidate<" NAME ">") { \
2220 CGPM.addPass(InvalidateAnalysisPass< \
2221 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2222 return Error::success(); \
2224#define FUNCTION_PASS(NAME, CREATE_PASS) \
2225 if (Name == NAME) { \
2226 if constexpr (std::is_constructible_v< \
2227 std::remove_reference_t<decltype(CREATE_PASS)>, \
2228 const TargetMachine &>) { \
2230 return make_error<StringError>( \
2231 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2232 inconvertibleErrorCode()); \
2234 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
2235 return Error::success(); \
2237#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2238 if (checkParametrizedPassName(Name, NAME)) { \
2239 auto Params = parsePassParameters(PARSER, Name, NAME); \
2241 return Params.takeError(); \
2242 auto CreatePass = CREATE_PASS; \
2243 if constexpr (std::is_constructible_v< \
2244 std::remove_reference_t<decltype(CreatePass( \
2246 const TargetMachine &, \
2247 std::remove_reference_t<decltype(Params.get())>>) { \
2249 return make_error<StringError>( \
2250 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2251 inconvertibleErrorCode()); \
2254 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2255 return Error::success(); \
2257#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2258 if (Name == NAME) { \
2259 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2260 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2261 return Error::success(); \
2263#define LOOP_PASS(NAME, CREATE_PASS) \
2264 if (Name == NAME) { \
2265 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2266 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2267 return Error::success(); \
2269#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2270 if (checkParametrizedPassName(Name, NAME)) { \
2271 auto Params = parsePassParameters(PARSER, Name, NAME); \
2273 return Params.takeError(); \
2274 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2275 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2276 return Error::success(); \
2278#include "PassRegistry.def"
2280 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2281 if (
C(Name, CGPM, InnerPipeline))
2288 const PipelineElement &
E) {
2289 auto &
Name =
E.Name;
2290 auto &InnerPipeline =
E.InnerPipeline;
2293 if (!InnerPipeline.empty()) {
2294 if (Name ==
"function") {
2296 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
2299 FPM.
addPass(std::move(NestedFPM));
2302 if (Name ==
"loop" || Name ==
"loop-mssa") {
2304 if (
auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
2307 bool UseMemorySSA = (
Name ==
"loop-mssa");
2312 if (Name ==
"machine-function") {
2314 if (
auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
2320 for (
auto &
C : FunctionPipelineParsingCallbacks)
2321 if (
C(Name, FPM, InnerPipeline))
2326 formatv(
"invalid use of '{}' pass as function pipeline", Name).str(),
2331#define FUNCTION_PASS(NAME, CREATE_PASS) \
2332 if (Name == NAME) { \
2333 if constexpr (std::is_constructible_v< \
2334 std::remove_reference_t<decltype(CREATE_PASS)>, \
2335 const TargetMachine &>) { \
2337 return make_error<StringError>( \
2338 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2339 inconvertibleErrorCode()); \
2341 FPM.addPass(CREATE_PASS); \
2342 return Error::success(); \
2344#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2345 if (checkParametrizedPassName(Name, NAME)) { \
2346 auto Params = parsePassParameters(PARSER, Name, NAME); \
2348 return Params.takeError(); \
2349 auto CreatePass = CREATE_PASS; \
2350 if constexpr (std::is_constructible_v< \
2351 std::remove_reference_t<decltype(CreatePass( \
2353 const TargetMachine &, \
2354 std::remove_reference_t<decltype(Params.get())>>) { \
2356 return make_error<StringError>( \
2357 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2358 inconvertibleErrorCode()); \
2361 FPM.addPass(CREATE_PASS(Params.get())); \
2362 return Error::success(); \
2364#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2365 if (Name == "require<" NAME ">") { \
2366 if constexpr (std::is_constructible_v< \
2367 std::remove_reference_t<decltype(CREATE_PASS)>, \
2368 const TargetMachine &>) { \
2370 return make_error<StringError>( \
2371 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2372 inconvertibleErrorCode()); \
2375 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2377 return Error::success(); \
2379 if (Name == "invalidate<" NAME ">") { \
2380 FPM.addPass(InvalidateAnalysisPass< \
2381 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2382 return Error::success(); \
2388#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2389 if (Name == NAME) { \
2390 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2391 return Error::success(); \
2393#define LOOP_PASS(NAME, CREATE_PASS) \
2394 if (Name == NAME) { \
2395 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2396 return Error::success(); \
2398#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2399 if (checkParametrizedPassName(Name, NAME)) { \
2400 auto Params = parsePassParameters(PARSER, Name, NAME); \
2402 return Params.takeError(); \
2404 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false)); \
2405 return Error::success(); \
2407#include "PassRegistry.def"
2409 for (
auto &
C : FunctionPipelineParsingCallbacks)
2410 if (
C(Name, FPM, InnerPipeline))
2413 formatv(
"unknown function pass '{}'", Name).str(),
2418 const PipelineElement &
E) {
2419 StringRef
Name =
E.Name;
2420 auto &InnerPipeline =
E.InnerPipeline;
2423 if (!InnerPipeline.empty()) {
2424 if (Name ==
"loop") {
2426 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
2429 LPM.addPass(std::move(NestedLPM));
2433 for (
auto &
C : LoopPipelineParsingCallbacks)
2434 if (
C(Name, LPM, InnerPipeline))
2439 formatv(
"invalid use of '{}' pass as loop pipeline", Name).str(),
2444#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2445 if (Name == NAME) { \
2446 LPM.addPass(CREATE_PASS); \
2447 return Error::success(); \
2449#define LOOP_PASS(NAME, CREATE_PASS) \
2450 if (Name == NAME) { \
2451 LPM.addPass(CREATE_PASS); \
2452 return Error::success(); \
2454#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2455 if (checkParametrizedPassName(Name, NAME)) { \
2456 auto Params = parsePassParameters(PARSER, Name, NAME); \
2458 return Params.takeError(); \
2459 LPM.addPass(CREATE_PASS(Params.get())); \
2460 return Error::success(); \
2462#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
2463 if (Name == "require<" NAME ">") { \
2464 LPM.addPass(RequireAnalysisPass< \
2465 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
2466 LoopAnalysisManager, LoopStandardAnalysisResults &, \
2468 return Error::success(); \
2470 if (Name == "invalidate<" NAME ">") { \
2471 LPM.addPass(InvalidateAnalysisPass< \
2472 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2473 return Error::success(); \
2475#include "PassRegistry.def"
2477 for (
auto &
C : LoopPipelineParsingCallbacks)
2478 if (
C(Name, LPM, InnerPipeline))
2485 const PipelineElement &
E) {
2486 StringRef
Name =
E.Name;
2488 if (!
E.InnerPipeline.empty()) {
2489 if (
E.Name ==
"machine-function") {
2491 if (
auto Err = parseMachinePassPipeline(NestedPM,
E.InnerPipeline))
2493 MFPM.
addPass(std::move(NestedPM));
2500#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) \
2501 if (Name == NAME) { \
2502 MFPM.addPass(CREATE_PASS); \
2503 return Error::success(); \
2505#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
2506 if (Name == NAME) { \
2507 MFPM.addPass(CREATE_PASS); \
2508 return Error::success(); \
2510#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
2512 if (checkParametrizedPassName(Name, NAME)) { \
2513 auto Params = parsePassParameters(PARSER, Name, NAME); \
2515 return Params.takeError(); \
2516 MFPM.addPass(CREATE_PASS(Params.get())); \
2517 return Error::success(); \
2519#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2520 if (Name == "require<" NAME ">") { \
2522 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2523 MachineFunction>()); \
2524 return Error::success(); \
2526 if (Name == "invalidate<" NAME ">") { \
2527 MFPM.addPass(InvalidateAnalysisPass< \
2528 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2529 return Error::success(); \
2531#include "llvm/Passes/MachinePassRegistry.def"
2533 for (
auto &
C : MachineFunctionPipelineParsingCallbacks)
2534 if (
C(Name, MFPM,
E.InnerPipeline))
2537 formatv(
"unknown machine pass '{}'", Name).str(),
2542#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2543 if (Name == NAME) { \
2544 AA.registerModuleAnalysis< \
2545 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2548#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2549 if (Name == NAME) { \
2550 AA.registerFunctionAnalysis< \
2551 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2554#include "PassRegistry.def"
2556 for (
auto &
C : AAParsingCallbacks)
2562Error PassBuilder::parseMachinePassPipeline(
2564 for (
const auto &Element : Pipeline) {
2565 if (
auto Err = parseMachinePass(MFPM, Element))
2573 for (
const auto &Element : Pipeline) {
2574 if (
auto Err = parseLoopPass(LPM, Element))
2580Error PassBuilder::parseFunctionPassPipeline(
2582 for (
const auto &Element : Pipeline) {
2583 if (
auto Err = parseFunctionPass(FPM, Element))
2591 for (
const auto &Element : Pipeline) {
2592 if (
auto Err = parseCGSCCPass(CGPM, Element))
2624 for (
const auto &Element : Pipeline) {
2625 if (
auto Err = parseModulePass(MPM, Element))
2636 auto Pipeline = parsePipelineText(PipelineText);
2637 if (!Pipeline || Pipeline->empty())
2639 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2649 Pipeline = {{
"cgscc", std::move(*Pipeline)}};
2651 FunctionPipelineParsingCallbacks)) {
2652 Pipeline = {{
"function", std::move(*Pipeline)}};
2655 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2656 std::move(*Pipeline)}}}};
2657 }
else if (
isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
2659 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2660 std::move(*Pipeline)}}}};
2662 FirstName, MachineFunctionPipelineParsingCallbacks)) {
2663 Pipeline = {{
"function", {{
"machine-function", std::move(*Pipeline)}}}};
2665 for (
auto &
C : TopLevelPipelineParsingCallbacks)
2666 if (
C(MPM, *Pipeline))
2670 auto &InnerPipeline = Pipeline->front().InnerPipeline;
2672 formatv(
"unknown {} name '{}'",
2673 (InnerPipeline.empty() ?
"pass" :
"pipeline"), FirstName)
2679 if (
auto Err = parseModulePassPipeline(MPM, *Pipeline))
2687 auto Pipeline = parsePipelineText(PipelineText);
2688 if (!Pipeline || Pipeline->empty())
2690 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2696 formatv(
"unknown cgscc pass '{}' in pipeline '{}'", FirstName,
2701 if (
auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
2710 auto Pipeline = parsePipelineText(PipelineText);
2711 if (!Pipeline || Pipeline->empty())
2713 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2719 formatv(
"unknown function pass '{}' in pipeline '{}'", FirstName,
2724 if (
auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2732 auto Pipeline = parsePipelineText(PipelineText);
2733 if (!Pipeline || Pipeline->empty())
2735 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2738 if (
auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2746 auto Pipeline = parsePipelineText(PipelineText);
2747 if (!Pipeline || Pipeline->empty())
2749 formatv(
"invalid machine pass pipeline '{}'", PipelineText).str(),
2752 if (
auto Err = parseMachinePassPipeline(MFPM, *Pipeline))
2761 if (PipelineText ==
"default") {
2766 while (!PipelineText.
empty()) {
2768 std::tie(Name, PipelineText) = PipelineText.
split(
',');
2769 if (!parseAAPassName(
AA, Name))
2771 formatv(
"unknown alias analysis name '{}'", Name).str(),
2778std::optional<RegAllocFilterFunc>
2780 if (FilterName ==
"all")
2782 for (
auto &
C : RegClassFilterParsingCallbacks)
2783 if (
auto F =
C(FilterName))
2785 return std::nullopt;
2793 OS <<
" " <<
PassName <<
"<" << Params <<
">\n";
2799 OS <<
"Module passes:\n";
2800#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2801#include "PassRegistry.def"
2803 OS <<
"Module passes with params:\n";
2804#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2805 printPassName(NAME, PARAMS, OS);
2806#include "PassRegistry.def"
2808 OS <<
"Module analyses:\n";
2809#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2810#include "PassRegistry.def"
2812 OS <<
"Module alias analyses:\n";
2813#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2814#include "PassRegistry.def"
2816 OS <<
"CGSCC passes:\n";
2817#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2818#include "PassRegistry.def"
2820 OS <<
"CGSCC passes with params:\n";
2821#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2822 printPassName(NAME, PARAMS, OS);
2823#include "PassRegistry.def"
2825 OS <<
"CGSCC analyses:\n";
2826#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2827#include "PassRegistry.def"
2829 OS <<
"Function passes:\n";
2830#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2831#include "PassRegistry.def"
2833 OS <<
"Function passes with params:\n";
2834#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2835 printPassName(NAME, PARAMS, OS);
2836#include "PassRegistry.def"
2838 OS <<
"Function analyses:\n";
2839#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2840#include "PassRegistry.def"
2842 OS <<
"Function alias analyses:\n";
2843#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2844#include "PassRegistry.def"
2846 OS <<
"LoopNest passes:\n";
2847#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2848#include "PassRegistry.def"
2850 OS <<
"Loop passes:\n";
2851#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2852#include "PassRegistry.def"
2854 OS <<
"Loop passes with params:\n";
2855#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2856 printPassName(NAME, PARAMS, OS);
2857#include "PassRegistry.def"
2859 OS <<
"Loop analyses:\n";
2860#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2861#include "PassRegistry.def"
2863 OS <<
"Machine module passes (WIP):\n";
2864#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2865#include "llvm/Passes/MachinePassRegistry.def"
2867 OS <<
"Machine function passes (WIP):\n";
2868#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2869#include "llvm/Passes/MachinePassRegistry.def"
2871 OS <<
"Machine function analyses (WIP):\n";
2872#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2873#include "llvm/Passes/MachinePassRegistry.def"
2879 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