386 "print-pipeline-passes",
387 cl::desc(
"Print a '-passes' compatible string describing the pipeline "
388 "(best-effort only)."));
399class TriggerCrashModulePass :
public PassInfoMixin<TriggerCrashModulePass> {
408class TriggerCrashFunctionPass
415 static StringRef name() {
return "TriggerCrashFunctionPass"; }
420class TriggerVerifierErrorPass
428 GlobalValue::LinkageTypes::InternalLinkage,
429 "__bad_alias",
nullptr, &M);
449 static StringRef name() {
return "TriggerVerifierErrorPass"; }
454class RequireAllMachineFunctionPropertiesPass
455 :
public PassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
465 .setFailsVerification()
470 .setRegBankSelected()
472 .setTiedOpsRewritten()
473 .setTracksDebugUserValues()
474 .setTracksLiveness();
476 static StringRef name() {
return "RequireAllMachineFunctionPropertiesPass"; }
482 std::optional<PGOOptions> PGOOpt,
484 : TM(TM), PTO(PTO), PGOOpt(PGOOpt),
PIC(
PIC) {
486 TM->registerPassBuilderCallbacks(*
this);
492#define MODULE_PASS(NAME, CREATE_PASS) \
493 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
494#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
495 PIC->addClassToPassName(CLASS, NAME);
496#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
497 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
498#define FUNCTION_PASS(NAME, CREATE_PASS) \
499 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
500#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
501 PIC->addClassToPassName(CLASS, NAME);
502#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
503 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
504#define LOOPNEST_PASS(NAME, CREATE_PASS) \
505 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
506#define LOOP_PASS(NAME, CREATE_PASS) \
507 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
508#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
509 PIC->addClassToPassName(CLASS, NAME);
510#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
511 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
512#define CGSCC_PASS(NAME, CREATE_PASS) \
513 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
514#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
515 PIC->addClassToPassName(CLASS, NAME);
516#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
517 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
518#include "PassRegistry.def"
520#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
521 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
522#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
523 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
524#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
526 PIC->addClassToPassName(CLASS, NAME);
527#include "llvm/Passes/MachinePassRegistry.def"
533#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
534 MAM.registerPass([&] { return CREATE_PASS; });
535#include "PassRegistry.def"
537 for (
auto &
C : ModuleAnalysisRegistrationCallbacks)
542#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
543 CGAM.registerPass([&] { return CREATE_PASS; });
544#include "PassRegistry.def"
546 for (
auto &
C : CGSCCAnalysisRegistrationCallbacks)
556#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
557 FAM.registerPass([&] { return CREATE_PASS; });
558#include "PassRegistry.def"
560 for (
auto &
C : FunctionAnalysisRegistrationCallbacks)
567#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
568 MFAM.registerPass([&] { return CREATE_PASS; });
569#include "llvm/Passes/MachinePassRegistry.def"
571 for (
auto &
C : MachineFunctionAnalysisRegistrationCallbacks)
576#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
577 LAM.registerPass([&] { return CREATE_PASS; });
578#include "PassRegistry.def"
580 for (
auto &
C : LoopAnalysisRegistrationCallbacks)
584static std::optional<std::pair<bool, bool>>
586 std::pair<bool, bool> Params;
587 if (!
Name.consume_front(
"function"))
591 if (!
Name.consume_front(
"<") || !
Name.consume_back(
">"))
593 while (!
Name.empty()) {
594 auto [Front, Back] =
Name.split(
';');
596 if (Front ==
"eager-inv")
598 else if (Front ==
"no-rerun")
599 Params.second =
true;
607 if (!
Name.consume_front(
"devirt<") || !
Name.consume_back(
">"))
610 if (
Name.getAsInteger(0, Count) || Count < 0)
627 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(S);
630 return make_error<StringError>(
631 formatv(
"invalid optimization level '{}'", S).str(),
639 while (!Params.
empty()) {
641 std::tie(ParamName, Params) = Params.
split(
';');
643 if (ParamName == OptionName) {
646 return make_error<StringError>(
660 while (!Params.
empty()) {
662 std::tie(ParamName, Params) = Params.
split(
';');
666 return make_error<StringError>(
667 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
672 if (ParamName.
consume_front(
"hardware-loop-counter-bitwidth=")) {
675 return make_error<StringError>(
676 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
681 if (ParamName ==
"force-hardware-loops") {
683 }
else if (ParamName ==
"force-hardware-loop-phi") {
685 }
else if (ParamName ==
"force-nested-hardware-loop") {
687 }
else if (ParamName ==
"force-hardware-loop-guard") {
690 return make_error<StringError>(
691 formatv(
"invalid HardwarePass parameter '{}'", ParamName).str(),
695 return HardwareLoopOpts;
707 while (!Params.
empty()) {
709 std::tie(ParamName, Params) = Params.
split(
';');
710 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(ParamName);
712 if (OptLevel && !OptLevel->isOptimizingForSize()) {
713 UnrollOpts.
setOptLevel(OptLevel->getSpeedupLevel());
719 return make_error<StringError>(
720 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
727 if (ParamName ==
"partial") {
729 }
else if (ParamName ==
"peeling") {
731 }
else if (ParamName ==
"profile-peeling") {
733 }
else if (ParamName ==
"runtime") {
735 }
else if (ParamName ==
"upperbound") {
738 return make_error<StringError>(
739 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
748 Params,
"vfe-linkage-unit-visibility",
"GlobalDCE");
768 Params,
"skip-non-recursive-function-attrs",
"PostOrderFunctionAttrs");
777 return make_error<StringError>(
778 formatv(
"too many CFGuardPass parameters '{}'", Params).str(),
781 if (Param ==
"check")
783 if (Param ==
"dispatch")
786 return make_error<StringError>(
787 formatv(
"invalid CFGuardPass mechanism: '{}'", Param).str(),
797 "EntryExitInstrumenter");
806 "LowerMatrixIntrinsics");
811 while (!Params.
empty()) {
813 std::tie(ParamName, Params) = Params.
split(
';');
816 if (ParamName ==
"preserve-order")
818 else if (ParamName ==
"rename-all")
820 else if (ParamName ==
"fold-all")
822 else if (ParamName ==
"reorder-operands")
825 return make_error<StringError>(
826 formatv(
"invalid normalize pass parameter '{}'", ParamName).str(),
836 while (!Params.
empty()) {
838 std::tie(ParamName, Params) = Params.
split(
';');
840 if (ParamName ==
"kernel") {
841 Result.CompileKernel =
true;
842 }
else if (ParamName ==
"use-after-scope") {
843 Result.UseAfterScope =
true;
845 return make_error<StringError>(
846 formatv(
"invalid AddressSanitizer pass parameter '{}'", ParamName)
856 while (!Params.
empty()) {
858 std::tie(ParamName, Params) = Params.
split(
';');
860 if (ParamName ==
"recover") {
862 }
else if (ParamName ==
"kernel") {
863 Result.CompileKernel =
true;
865 return make_error<StringError>(
866 formatv(
"invalid HWAddressSanitizer pass parameter '{}'", ParamName)
876 while (!Params.
empty()) {
878 std::tie(ParamName, Params) = Params.
split(
';');
880 if (ParamName ==
"thinlto") {
882 }
else if (ParamName ==
"emit-summary") {
883 Result.EmitLTOSummary =
true;
885 return make_error<StringError>(
886 formatv(
"invalid EmbedBitcode pass parameter '{}'", ParamName).str(),
894parseLowerAllowCheckPassOptions(
StringRef Params) {
896 while (!Params.
empty()) {
898 std::tie(ParamName, Params) = Params.
split(
';');
909 std::tie(IndicesStr, CutoffStr) = ParamName.
split(
"]=");
915 return make_error<StringError>(
916 formatv(
"invalid LowerAllowCheck pass cutoffs parameter '{}' ({})",
921 if (!IndicesStr.
consume_front(
"cutoffs[") || IndicesStr ==
"")
922 return make_error<StringError>(
923 formatv(
"invalid LowerAllowCheck pass index parameter '{}' ({})",
924 IndicesStr, CutoffStr)
928 while (IndicesStr !=
"") {
930 std::tie(firstIndexStr, IndicesStr) = IndicesStr.
split(
'|');
934 return make_error<StringError>(
936 "invalid LowerAllowCheck pass index parameter '{}' ({}) {}",
937 firstIndexStr, IndicesStr)
944 if (index >=
Result.cutoffs.size())
945 Result.cutoffs.resize(index + 1, 0);
947 Result.cutoffs[index] = cutoff;
949 }
else if (ParamName.
starts_with(
"runtime_check")) {
951 std::tie(std::ignore, ValueString) = ParamName.
split(
"=");
954 return make_error<StringError>(
955 formatv(
"invalid LowerAllowCheck pass runtime_check parameter '{}' "
961 Result.runtime_check = runtime_check;
963 return make_error<StringError>(
964 formatv(
"invalid LowerAllowCheck pass parameter '{}'", ParamName)
975 while (!Params.
empty()) {
977 std::tie(ParamName, Params) = Params.
split(
';');
979 if (ParamName ==
"recover") {
981 }
else if (ParamName ==
"kernel") {
985 return make_error<StringError>(
986 formatv(
"invalid argument to MemorySanitizer pass track-origins "
991 }
else if (ParamName ==
"eager-checks") {
992 Result.EagerChecks =
true;
994 return make_error<StringError>(
995 formatv(
"invalid MemorySanitizer pass parameter '{}'", ParamName)
1006 while (!Params.
empty()) {
1008 std::tie(ParamName, Params) = Params.
split(
';');
1011 if (ParamName ==
"speculate-blocks") {
1013 }
else if (ParamName ==
"simplify-cond-branch") {
1015 }
else if (ParamName ==
"forward-switch-cond") {
1017 }
else if (ParamName ==
"switch-range-to-icmp") {
1019 }
else if (ParamName ==
"switch-to-lookup") {
1021 }
else if (ParamName ==
"keep-loops") {
1023 }
else if (ParamName ==
"hoist-common-insts") {
1025 }
else if (ParamName ==
"hoist-loads-stores-with-cond-faulting") {
1027 }
else if (ParamName ==
"sink-common-insts") {
1029 }
else if (ParamName ==
"speculate-unpredictables") {
1032 APInt BonusInstThreshold;
1034 return make_error<StringError>(
1035 formatv(
"invalid argument to SimplifyCFG pass bonus-threshold "
1042 return make_error<StringError>(
1043 formatv(
"invalid SimplifyCFG pass parameter '{}'", ParamName).str(),
1054 Result.setVerifyFixpoint(
true);
1055 while (!Params.
empty()) {
1057 std::tie(ParamName, Params) = Params.
split(
';');
1060 if (ParamName ==
"verify-fixpoint") {
1063 APInt MaxIterations;
1065 return make_error<StringError>(
1066 formatv(
"invalid argument to InstCombine pass max-iterations "
1073 return make_error<StringError>(
1074 formatv(
"invalid InstCombine pass parameter '{}'", ParamName).str(),
1084 while (!Params.
empty()) {
1086 std::tie(ParamName, Params) = Params.
split(
';');
1089 if (ParamName ==
"interleave-forced-only") {
1091 }
else if (ParamName ==
"vectorize-forced-only") {
1094 return make_error<StringError>(
1095 formatv(
"invalid LoopVectorize parameter '{}'", ParamName).str(),
1103 std::pair<bool, bool>
Result = {
false,
true};
1104 while (!Params.
empty()) {
1106 std::tie(ParamName, Params) = Params.
split(
';');
1109 if (ParamName ==
"nontrivial") {
1111 }
else if (ParamName ==
"trivial") {
1114 return make_error<StringError>(
1115 formatv(
"invalid LoopUnswitch pass parameter '{}'", ParamName).str(),
1124 while (!Params.
empty()) {
1126 std::tie(ParamName, Params) = Params.
split(
';');
1129 if (ParamName ==
"allowspeculation") {
1132 return make_error<StringError>(
1133 formatv(
"invalid LICM pass parameter '{}'", ParamName).str(),
1141 std::pair<bool, bool>
Result = {
true,
false};
1142 while (!Params.
empty()) {
1144 std::tie(ParamName, Params) = Params.
split(
';');
1147 if (ParamName ==
"header-duplication") {
1149 }
else if (ParamName ==
"prepare-for-lto") {
1152 return make_error<StringError>(
1153 formatv(
"invalid LoopRotate pass parameter '{}'", ParamName).str(),
1162 while (!Params.
empty()) {
1164 std::tie(ParamName, Params) = Params.
split(
';');
1167 if (ParamName ==
"split-footer-bb") {
1170 return make_error<StringError>(
1171 formatv(
"invalid MergedLoadStoreMotion pass parameter '{}'",
1182 while (!Params.
empty()) {
1184 std::tie(ParamName, Params) = Params.
split(
';');
1187 if (ParamName ==
"pre") {
1189 }
else if (ParamName ==
"load-pre") {
1191 }
else if (ParamName ==
"split-backedge-load-pre") {
1193 }
else if (ParamName ==
"memdep") {
1197 }
else if (ParamName ==
"memoryssa") {
1202 return make_error<StringError>(
1203 formatv(
"invalid GVN pass parameter '{}'", ParamName).str(),
1212 while (!Params.
empty()) {
1214 std::tie(ParamName, Params) = Params.
split(
';');
1217 if (ParamName ==
"func-spec")
1220 return make_error<StringError>(
1221 formatv(
"invalid IPSCCP pass parameter '{}'", ParamName).str(),
1229 while (!Params.
empty()) {
1231 std::tie(ParamName, Params) = Params.
split(
';');
1235 return make_error<StringError>(
1236 formatv(
"invalid argument to Scalarizer pass min-bits "
1247 if (ParamName ==
"load-store")
1249 else if (ParamName ==
"variable-insert-extract")
1252 return make_error<StringError>(
1253 formatv(
"invalid Scalarizer pass parameter '{}'", ParamName).str(),
1262 if (Params.
empty() || Params ==
"modify-cfg")
1264 if (Params ==
"preserve-cfg")
1266 return make_error<StringError>(
1267 formatv(
"invalid SROA pass parameter '{}' (either preserve-cfg or "
1268 "modify-cfg can be specified)",
1275parseStackLifetimeOptions(
StringRef Params) {
1277 while (!Params.
empty()) {
1279 std::tie(ParamName, Params) = Params.
split(
';');
1281 if (ParamName ==
"may") {
1283 }
else if (ParamName ==
"must") {
1286 return make_error<StringError>(
1287 formatv(
"invalid StackLifetime parameter '{}'", ParamName).str(),
1296 "DependenceAnalysisPrinter");
1301 "SeparateConstOffsetFromGEP");
1310parseFunctionSimplificationPipelineOptions(
StringRef Params) {
1313 return make_error<StringError>(
1314 formatv(
"invalid function-simplification parameter '{}'", Params).str(),
1322 "MemorySSAPrinterPass");
1327 "SpeculativeExecutionPass");
1332 while (!Params.
empty()) {
1334 std::tie(ParamName, Params) = Params.
split(
';');
1339 return make_error<StringError>(
1340 formatv(
"invalid MemProfUse pass parameter '{}'", ParamName).str(),
1348parseStructuralHashPrinterPassOptions(
StringRef Params) {
1351 if (Params ==
"detailed")
1353 if (Params ==
"call-target-ignored")
1355 return make_error<StringError>(
1356 formatv(
"invalid structural hash printer parameter '{}'", Params).str(),
1362 "WinEHPreparePass");
1367 while (!Params.
empty()) {
1369 std::tie(ParamName, Params) = Params.
split(
';');
1372 if (ParamName ==
"group-by-use")
1374 else if (ParamName ==
"ignore-single-use")
1376 else if (ParamName ==
"merge-const")
1378 else if (ParamName ==
"merge-const-aggressive")
1380 else if (ParamName ==
"merge-external")
1384 return make_error<StringError>(
1385 formatv(
"invalid GlobalMergePass parameter '{}'", ParamName).str(),
1388 return make_error<StringError>(
1389 formatv(
"invalid global-merge pass parameter '{}'", Params).str(),
1398 while (!Params.
empty()) {
1400 std::tie(ParamName, Params) = Params.
split(
';');
1405 return make_error<StringError>(
1406 formatv(
"invalid Internalize pass parameter '{}'", ParamName).str(),
1417 while (!Params.
empty()) {
1419 std::tie(ParamName, Params) = Params.
split(
';');
1422 std::optional<RegAllocFilterFunc>
Filter =
1425 return make_error<StringError>(
1426 formatv(
"invalid regallocfast register filter '{}'", ParamName)
1435 if (ParamName ==
"no-clear-vregs") {
1440 return make_error<StringError>(
1441 formatv(
"invalid regallocfast pass parameter '{}'", ParamName).str(),
1448parseBoundsCheckingOptions(
StringRef Params) {
1450 while (!Params.
empty()) {
1452 std::tie(ParamName, Params) = Params.
split(
';');
1453 if (ParamName ==
"trap") {
1455 }
else if (ParamName ==
"rt") {
1460 }
else if (ParamName ==
"rt-abort") {
1465 }
else if (ParamName ==
"min-rt") {
1470 }
else if (ParamName ==
"min-rt-abort") {
1475 }
else if (ParamName ==
"merge") {
1480 std::tie(ParamEQ, Val) = ParamName.
split(
'=');
1485 return make_error<StringError>(
1486 formatv(
"invalid BoundsChecking pass parameter '{}'", ParamName)
1497 if (Params.
empty() || Params ==
"all")
1504 return make_error<StringError>(
1505 formatv(
"invalid regallocgreedy register filter '{}'", Params).str(),
1511 "MachineSinkingPass");
1515 bool AllowTailMerge =
true;
1516 if (!Params.
empty()) {
1518 if (Params !=
"tail-merge")
1519 return make_error<StringError>(
1520 formatv(
"invalid MachineBlockPlacementPass parameter '{}'", Params)
1524 return AllowTailMerge;
1528 bool ClearVirtRegs =
true;
1529 if (!Params.
empty()) {
1531 if (Params !=
"clear-vregs")
1532 return make_error<StringError>(
1533 formatv(
"invalid VirtRegRewriter pass parameter '{}'", Params).str(),
1536 return ClearVirtRegs;
1539struct FatLTOOptions {
1541 bool ThinLTO =
false;
1542 bool EmitSummary =
false;
1547 bool HaveOptLevel =
false;
1548 while (!Params.
empty()) {
1550 std::tie(ParamName, Params) = Params.
split(
';');
1552 if (ParamName ==
"thinlto") {
1554 }
else if (ParamName ==
"emit-summary") {
1555 Result.EmitSummary =
true;
1556 }
else if (std::optional<OptimizationLevel> OptLevel =
1558 Result.OptLevel = *OptLevel;
1559 HaveOptLevel =
true;
1561 return make_error<StringError>(
1562 formatv(
"invalid fatlto-pre-link pass parameter '{}'", ParamName)
1568 return make_error<StringError>(
1569 "missing optimization level for fatlto-pre-link pipeline",
1584template <
typename PassManagerT,
typename CallbacksT>
1586 if (!Callbacks.empty()) {
1587 PassManagerT DummyPM;
1588 for (
auto &CB : Callbacks)
1589 if (CB(
Name, DummyPM, {}))
1595template <
typename CallbacksT>
1597 StringRef NameNoBracket =
Name.take_until([](
char C) {
return C ==
'<'; });
1600 if (
Name ==
"module")
1602 if (
Name ==
"cgscc")
1604 if (NameNoBracket ==
"function")
1606 if (
Name ==
"coro-cond")
1609#define MODULE_PASS(NAME, CREATE_PASS) \
1612#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1613 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1615#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1616 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1618#include "PassRegistry.def"
1620 return callbacksAcceptPassName<ModulePassManager>(
Name, Callbacks);
1623template <
typename CallbacksT>
1626 StringRef NameNoBracket =
Name.take_until([](
char C) {
return C ==
'<'; });
1627 if (
Name ==
"cgscc")
1629 if (NameNoBracket ==
"function")
1636#define CGSCC_PASS(NAME, CREATE_PASS) \
1639#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1640 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1642#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1643 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1645#include "PassRegistry.def"
1647 return callbacksAcceptPassName<CGSCCPassManager>(
Name, Callbacks);
1650template <
typename CallbacksT>
1653 StringRef NameNoBracket =
Name.take_until([](
char C) {
return C ==
'<'; });
1654 if (NameNoBracket ==
"function")
1656 if (
Name ==
"loop" ||
Name ==
"loop-mssa" ||
Name ==
"machine-function")
1659#define FUNCTION_PASS(NAME, CREATE_PASS) \
1662#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1663 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1665#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1666 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1668#include "PassRegistry.def"
1670 return callbacksAcceptPassName<FunctionPassManager>(
Name, Callbacks);
1673template <
typename CallbacksT>
1676 if (
Name ==
"machine-function")
1679#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
1682#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
1684 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1687#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1688 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1691#include "llvm/Passes/MachinePassRegistry.def"
1693 return callbacksAcceptPassName<MachineFunctionPassManager>(
Name, Callbacks);
1696template <
typename CallbacksT>
1698 bool &UseMemorySSA) {
1699 UseMemorySSA =
false;
1702 UseMemorySSA =
true;
1706#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1709#include "PassRegistry.def"
1711 return callbacksAcceptPassName<LoopPassManager>(
Name, Callbacks);
1714template <
typename CallbacksT>
1716 bool &UseMemorySSA) {
1717 UseMemorySSA =
false;
1720 UseMemorySSA =
true;
1724#define LOOP_PASS(NAME, CREATE_PASS) \
1727#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1728 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1730#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1731 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1733#include "PassRegistry.def"
1735 return callbacksAcceptPassName<LoopPassManager>(
Name, Callbacks);
1738std::optional<std::vector<PassBuilder::PipelineElement>>
1739PassBuilder::parsePipelineText(
StringRef Text) {
1740 std::vector<PipelineElement> ResultPipeline;
1745 std::vector<PipelineElement> &Pipeline = *PipelineStack.
back();
1746 size_t Pos =
Text.find_first_of(
",()");
1747 Pipeline.push_back({
Text.substr(0, Pos), {}});
1750 if (Pos ==
Text.npos)
1753 char Sep =
Text[Pos];
1761 PipelineStack.
push_back(&Pipeline.back().InnerPipeline);
1765 assert(Sep ==
')' &&
"Bogus separator!");
1770 if (PipelineStack.
size() == 1)
1771 return std::nullopt;
1774 }
while (
Text.consume_front(
")"));
1782 if (!
Text.consume_front(
","))
1783 return std::nullopt;
1786 if (PipelineStack.
size() > 1)
1788 return std::nullopt;
1790 assert(PipelineStack.
back() == &ResultPipeline &&
1791 "Wrong pipeline at the bottom of the stack!");
1792 return {std::move(ResultPipeline)};
1805 const PipelineElement &E) {
1806 auto &
Name = E.Name;
1807 auto &InnerPipeline = E.InnerPipeline;
1810 if (!InnerPipeline.empty()) {
1811 if (
Name ==
"module") {
1813 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1815 MPM.
addPass(std::move(NestedMPM));
1818 if (
Name ==
"coro-cond") {
1820 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1825 if (
Name ==
"cgscc") {
1827 if (
auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
1834 return make_error<StringError>(
1835 "cannot have a no-rerun module to function adaptor",
1838 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1845 for (
auto &
C : ModulePipelineParsingCallbacks)
1846 if (
C(
Name, MPM, InnerPipeline))
1850 return make_error<StringError>(
1851 formatv(
"invalid use of '{}' pass as module pipeline",
Name).str(),
1857#define MODULE_PASS(NAME, CREATE_PASS) \
1858 if (Name == NAME) { \
1859 MPM.addPass(CREATE_PASS); \
1860 return Error::success(); \
1862#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1863 if (checkParametrizedPassName(Name, NAME)) { \
1864 auto Params = parsePassParameters(PARSER, Name, NAME); \
1866 return Params.takeError(); \
1867 MPM.addPass(CREATE_PASS(Params.get())); \
1868 return Error::success(); \
1870#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1871 if (Name == "require<" NAME ">") { \
1873 RequireAnalysisPass< \
1874 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
1875 return Error::success(); \
1877 if (Name == "invalidate<" NAME ">") { \
1878 MPM.addPass(InvalidateAnalysisPass< \
1879 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1880 return Error::success(); \
1882#define CGSCC_PASS(NAME, CREATE_PASS) \
1883 if (Name == NAME) { \
1884 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
1885 return Error::success(); \
1887#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1888 if (checkParametrizedPassName(Name, NAME)) { \
1889 auto Params = parsePassParameters(PARSER, Name, NAME); \
1891 return Params.takeError(); \
1893 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
1894 return Error::success(); \
1896#define FUNCTION_PASS(NAME, CREATE_PASS) \
1897 if (Name == NAME) { \
1898 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
1899 return Error::success(); \
1901#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1902 if (checkParametrizedPassName(Name, NAME)) { \
1903 auto Params = parsePassParameters(PARSER, Name, NAME); \
1905 return Params.takeError(); \
1906 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
1907 return Error::success(); \
1909#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1910 if (Name == NAME) { \
1911 MPM.addPass(createModuleToFunctionPassAdaptor( \
1912 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1913 return Error::success(); \
1915#define LOOP_PASS(NAME, CREATE_PASS) \
1916 if (Name == NAME) { \
1917 MPM.addPass(createModuleToFunctionPassAdaptor( \
1918 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1919 return Error::success(); \
1921#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1922 if (checkParametrizedPassName(Name, NAME)) { \
1923 auto Params = parsePassParameters(PARSER, Name, NAME); \
1925 return Params.takeError(); \
1927 createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor( \
1928 CREATE_PASS(Params.get()), false, false))); \
1929 return Error::success(); \
1931#include "PassRegistry.def"
1933 for (
auto &
C : ModulePipelineParsingCallbacks)
1934 if (
C(
Name, MPM, InnerPipeline))
1936 return make_error<StringError>(
1942 const PipelineElement &E) {
1943 auto &
Name = E.Name;
1944 auto &InnerPipeline = E.InnerPipeline;
1947 if (!InnerPipeline.empty()) {
1948 if (
Name ==
"cgscc") {
1950 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1953 CGPM.
addPass(std::move(NestedCGPM));
1958 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1962 std::move(FPM), Params->first, Params->second));
1967 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1974 for (
auto &
C : CGSCCPipelineParsingCallbacks)
1975 if (
C(
Name, CGPM, InnerPipeline))
1979 return make_error<StringError>(
1980 formatv(
"invalid use of '{}' pass as cgscc pipeline",
Name).str(),
1985#define CGSCC_PASS(NAME, CREATE_PASS) \
1986 if (Name == NAME) { \
1987 CGPM.addPass(CREATE_PASS); \
1988 return Error::success(); \
1990#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1991 if (checkParametrizedPassName(Name, NAME)) { \
1992 auto Params = parsePassParameters(PARSER, Name, NAME); \
1994 return Params.takeError(); \
1995 CGPM.addPass(CREATE_PASS(Params.get())); \
1996 return Error::success(); \
1998#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1999 if (Name == "require<" NAME ">") { \
2000 CGPM.addPass(RequireAnalysisPass< \
2001 std::remove_reference_t<decltype(CREATE_PASS)>, \
2002 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
2003 CGSCCUpdateResult &>()); \
2004 return Error::success(); \
2006 if (Name == "invalidate<" NAME ">") { \
2007 CGPM.addPass(InvalidateAnalysisPass< \
2008 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2009 return Error::success(); \
2011#define FUNCTION_PASS(NAME, CREATE_PASS) \
2012 if (Name == NAME) { \
2013 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
2014 return Error::success(); \
2016#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2017 if (checkParametrizedPassName(Name, NAME)) { \
2018 auto Params = parsePassParameters(PARSER, Name, NAME); \
2020 return Params.takeError(); \
2021 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2022 return Error::success(); \
2024#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2025 if (Name == NAME) { \
2026 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2027 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
2028 return Error::success(); \
2030#define LOOP_PASS(NAME, CREATE_PASS) \
2031 if (Name == NAME) { \
2032 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2033 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
2034 return Error::success(); \
2036#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2037 if (checkParametrizedPassName(Name, NAME)) { \
2038 auto Params = parsePassParameters(PARSER, Name, NAME); \
2040 return Params.takeError(); \
2042 createCGSCCToFunctionPassAdaptor(createFunctionToLoopPassAdaptor( \
2043 CREATE_PASS(Params.get()), false, false))); \
2044 return Error::success(); \
2046#include "PassRegistry.def"
2048 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2049 if (
C(
Name, CGPM, InnerPipeline))
2051 return make_error<StringError>(
formatv(
"unknown cgscc pass '{}'",
Name).str(),
2056 const PipelineElement &E) {
2057 auto &
Name = E.Name;
2058 auto &InnerPipeline = E.InnerPipeline;
2061 if (!InnerPipeline.empty()) {
2062 if (
Name ==
"function") {
2064 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
2067 FPM.
addPass(std::move(NestedFPM));
2070 if (
Name ==
"loop" ||
Name ==
"loop-mssa") {
2072 if (
auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
2075 bool UseMemorySSA = (
Name ==
"loop-mssa");
2077 return Pipeline.Name.contains(
"simple-loop-unswitch");
2079 bool UseBPI =
llvm::any_of(InnerPipeline, [](
auto Pipeline) {
2080 return Pipeline.Name ==
"loop-predication";
2086 if (
Name ==
"machine-function") {
2088 if (
auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
2094 for (
auto &
C : FunctionPipelineParsingCallbacks)
2095 if (
C(
Name, FPM, InnerPipeline))
2099 return make_error<StringError>(
2100 formatv(
"invalid use of '{}' pass as function pipeline",
Name).str(),
2105#define FUNCTION_PASS(NAME, CREATE_PASS) \
2106 if (Name == NAME) { \
2107 FPM.addPass(CREATE_PASS); \
2108 return Error::success(); \
2110#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2111 if (checkParametrizedPassName(Name, NAME)) { \
2112 auto Params = parsePassParameters(PARSER, Name, NAME); \
2114 return Params.takeError(); \
2115 FPM.addPass(CREATE_PASS(Params.get())); \
2116 return Error::success(); \
2118#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2119 if (Name == "require<" NAME ">") { \
2121 RequireAnalysisPass< \
2122 std::remove_reference_t<decltype(CREATE_PASS)>, Function>()); \
2123 return Error::success(); \
2125 if (Name == "invalidate<" NAME ">") { \
2126 FPM.addPass(InvalidateAnalysisPass< \
2127 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2128 return Error::success(); \
2134#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2135 if (Name == NAME) { \
2136 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)); \
2137 return Error::success(); \
2139#define LOOP_PASS(NAME, CREATE_PASS) \
2140 if (Name == NAME) { \
2141 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)); \
2142 return Error::success(); \
2144#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2145 if (checkParametrizedPassName(Name, NAME)) { \
2146 auto Params = parsePassParameters(PARSER, Name, NAME); \
2148 return Params.takeError(); \
2149 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), \
2151 return Error::success(); \
2153#include "PassRegistry.def"
2155 for (
auto &
C : FunctionPipelineParsingCallbacks)
2156 if (
C(
Name, FPM, InnerPipeline))
2158 return make_error<StringError>(
2159 formatv(
"unknown function pass '{}'",
Name).str(),
2164 const PipelineElement &E) {
2166 auto &InnerPipeline = E.InnerPipeline;
2169 if (!InnerPipeline.empty()) {
2170 if (
Name ==
"loop") {
2172 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
2175 LPM.
addPass(std::move(NestedLPM));
2179 for (
auto &
C : LoopPipelineParsingCallbacks)
2180 if (
C(
Name, LPM, InnerPipeline))
2184 return make_error<StringError>(
2185 formatv(
"invalid use of '{}' pass as loop pipeline",
Name).str(),
2190#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2191 if (Name == NAME) { \
2192 LPM.addPass(CREATE_PASS); \
2193 return Error::success(); \
2195#define LOOP_PASS(NAME, CREATE_PASS) \
2196 if (Name == NAME) { \
2197 LPM.addPass(CREATE_PASS); \
2198 return Error::success(); \
2200#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2201 if (checkParametrizedPassName(Name, NAME)) { \
2202 auto Params = parsePassParameters(PARSER, Name, NAME); \
2204 return Params.takeError(); \
2205 LPM.addPass(CREATE_PASS(Params.get())); \
2206 return Error::success(); \
2208#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
2209 if (Name == "require<" NAME ">") { \
2210 LPM.addPass(RequireAnalysisPass< \
2211 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
2212 LoopAnalysisManager, LoopStandardAnalysisResults &, \
2214 return Error::success(); \
2216 if (Name == "invalidate<" NAME ">") { \
2217 LPM.addPass(InvalidateAnalysisPass< \
2218 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2219 return Error::success(); \
2221#include "PassRegistry.def"
2223 for (
auto &
C : LoopPipelineParsingCallbacks)
2224 if (
C(
Name, LPM, InnerPipeline))
2226 return make_error<StringError>(
formatv(
"unknown loop pass '{}'",
Name).str(),
2231 const PipelineElement &E) {
2234 if (!E.InnerPipeline.empty()) {
2235 if (E.Name ==
"machine-function") {
2237 if (
auto Err = parseMachinePassPipeline(NestedPM, E.InnerPipeline))
2239 MFPM.
addPass(std::move(NestedPM));
2242 return make_error<StringError>(
"invalid pipeline",
2246#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) \
2247 if (Name == NAME) { \
2248 MFPM.addPass(CREATE_PASS); \
2249 return Error::success(); \
2251#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
2252 if (Name == NAME) { \
2253 MFPM.addPass(CREATE_PASS); \
2254 return Error::success(); \
2256#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
2258 if (checkParametrizedPassName(Name, NAME)) { \
2259 auto Params = parsePassParameters(PARSER, Name, NAME); \
2261 return Params.takeError(); \
2262 MFPM.addPass(CREATE_PASS(Params.get())); \
2263 return Error::success(); \
2265#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2266 if (Name == "require<" NAME ">") { \
2268 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2269 MachineFunction>()); \
2270 return Error::success(); \
2272 if (Name == "invalidate<" NAME ">") { \
2273 MFPM.addPass(InvalidateAnalysisPass< \
2274 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2275 return Error::success(); \
2277#include "llvm/Passes/MachinePassRegistry.def"
2279 for (
auto &
C : MachineFunctionPipelineParsingCallbacks)
2280 if (
C(
Name, MFPM, E.InnerPipeline))
2282 return make_error<StringError>(
2288#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2289 if (Name == NAME) { \
2290 AA.registerModuleAnalysis< \
2291 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2294#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2295 if (Name == NAME) { \
2296 AA.registerFunctionAnalysis< \
2297 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2300#include "PassRegistry.def"
2302 for (
auto &
C : AAParsingCallbacks)
2308Error PassBuilder::parseMachinePassPipeline(
2310 for (
const auto &Element : Pipeline) {
2311 if (
auto Err = parseMachinePass(MFPM, Element))
2319 for (
const auto &Element : Pipeline) {
2320 if (
auto Err = parseLoopPass(LPM, Element))
2326Error PassBuilder::parseFunctionPassPipeline(
2328 for (
const auto &Element : Pipeline) {
2329 if (
auto Err = parseFunctionPass(FPM, Element))
2337 for (
const auto &Element : Pipeline) {
2338 if (
auto Err = parseCGSCCPass(CGPM, Element))
2370 for (
const auto &Element : Pipeline) {
2371 if (
auto Err = parseModulePass(MPM, Element))
2382 auto Pipeline = parsePipelineText(PipelineText);
2383 if (!Pipeline || Pipeline->empty())
2384 return make_error<StringError>(
2385 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2395 Pipeline = {{
"cgscc", std::move(*Pipeline)}};
2397 FunctionPipelineParsingCallbacks)) {
2398 Pipeline = {{
"function", std::move(*Pipeline)}};
2401 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2402 std::move(*Pipeline)}}}};
2403 }
else if (
isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
2405 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2406 std::move(*Pipeline)}}}};
2408 FirstName, MachineFunctionPipelineParsingCallbacks)) {
2409 Pipeline = {{
"function", {{
"machine-function", std::move(*Pipeline)}}}};
2411 for (
auto &
C : TopLevelPipelineParsingCallbacks)
2412 if (
C(MPM, *Pipeline))
2416 auto &InnerPipeline = Pipeline->front().InnerPipeline;
2417 return make_error<StringError>(
2418 formatv(
"unknown {} name '{}'",
2419 (InnerPipeline.empty() ?
"pass" :
"pipeline"), FirstName)
2425 if (
auto Err = parseModulePassPipeline(MPM, *Pipeline))
2433 auto Pipeline = parsePipelineText(PipelineText);
2434 if (!Pipeline || Pipeline->empty())
2435 return make_error<StringError>(
2436 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2441 return make_error<StringError>(
2442 formatv(
"unknown cgscc pass '{}' in pipeline '{}'", FirstName,
2447 if (
auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
2456 auto Pipeline = parsePipelineText(PipelineText);
2457 if (!Pipeline || Pipeline->empty())
2458 return make_error<StringError>(
2459 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2464 return make_error<StringError>(
2465 formatv(
"unknown function pass '{}' in pipeline '{}'", FirstName,
2470 if (
auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2478 auto Pipeline = parsePipelineText(PipelineText);
2479 if (!Pipeline || Pipeline->empty())
2480 return make_error<StringError>(
2481 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2484 if (
auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2492 auto Pipeline = parsePipelineText(PipelineText);
2493 if (!Pipeline || Pipeline->empty())
2494 return make_error<StringError>(
2495 formatv(
"invalid machine pass pipeline '{}'", PipelineText).str(),
2498 if (
auto Err = parseMachinePassPipeline(MFPM, *Pipeline))
2507 if (PipelineText ==
"default") {
2512 while (!PipelineText.
empty()) {
2514 std::tie(
Name, PipelineText) = PipelineText.
split(
',');
2515 if (!parseAAPassName(AA,
Name))
2516 return make_error<StringError>(
2517 formatv(
"unknown alias analysis name '{}'",
Name).str(),
2524std::optional<RegAllocFilterFunc>
2526 if (FilterName ==
"all")
2528 for (
auto &
C : RegClassFilterParsingCallbacks)
2529 if (
auto F =
C(FilterName))
2531 return std::nullopt;
2539 OS <<
" " <<
PassName <<
"<" << Params <<
">\n";
2545 OS <<
"Module passes:\n";
2546#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2547#include "PassRegistry.def"
2549 OS <<
"Module passes with params:\n";
2550#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2551 printPassName(NAME, PARAMS, OS);
2552#include "PassRegistry.def"
2554 OS <<
"Module analyses:\n";
2555#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2556#include "PassRegistry.def"
2558 OS <<
"Module alias analyses:\n";
2559#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2560#include "PassRegistry.def"
2562 OS <<
"CGSCC passes:\n";
2563#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2564#include "PassRegistry.def"
2566 OS <<
"CGSCC passes with params:\n";
2567#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2568 printPassName(NAME, PARAMS, OS);
2569#include "PassRegistry.def"
2571 OS <<
"CGSCC analyses:\n";
2572#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2573#include "PassRegistry.def"
2575 OS <<
"Function passes:\n";
2576#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2577#include "PassRegistry.def"
2579 OS <<
"Function passes with params:\n";
2580#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2581 printPassName(NAME, PARAMS, OS);
2582#include "PassRegistry.def"
2584 OS <<
"Function analyses:\n";
2585#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2586#include "PassRegistry.def"
2588 OS <<
"Function alias analyses:\n";
2589#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2590#include "PassRegistry.def"
2592 OS <<
"LoopNest passes:\n";
2593#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2594#include "PassRegistry.def"
2596 OS <<
"Loop passes:\n";
2597#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2598#include "PassRegistry.def"
2600 OS <<
"Loop passes with params:\n";
2601#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2602 printPassName(NAME, PARAMS, OS);
2603#include "PassRegistry.def"
2605 OS <<
"Loop analyses:\n";
2606#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2607#include "PassRegistry.def"
2609 OS <<
"Machine module passes (WIP):\n";
2610#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2611#include "llvm/Passes/MachinePassRegistry.def"
2613 OS <<
"Machine function passes (WIP):\n";
2614#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2615#include "llvm/Passes/MachinePassRegistry.def"
2617 OS <<
"Machine function analyses (WIP):\n";
2618#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2619#include "llvm/Passes/MachinePassRegistry.def"
2625 TopLevelPipelineParsingCallbacks.push_back(
C);
unsigned const MachineRegisterInfo * MRI
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 provides the interface for LLVM's Call Graph Profile pass.
This header provides classes for managing passes over SCCs of the call graph.
This file provides interfaces used to build and manipulate a call graph, which is a very useful tool ...
Defines an IR pass for CodeGen Prepare.
This file declares an analysis pass that computes CycleInfo for LLVM IR, specialized from GenericCycl...
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.
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
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
static bool isModulePassName(StringRef Name, CallbacksT &Callbacks)
static bool callbacksAcceptPassName(StringRef Name, CallbacksT &Callbacks)
Tests whether registered callbacks will accept a given pass name.
static std::optional< int > parseDevirtPassName(StringRef Name)
static bool 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...
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...
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.
A container for analyses that lazily runs them and caches their results.
bool registerPass(PassBuilderT &&PassBuilder)
Register an analysis pass with the manager.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
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...
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
An RAII based helper class to modify MachineFunctionProperties when running pass.
Properties which a MachineFunction may have at a given point in time.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const MachineFunctionProperties & getProperties() const
Get the function properties.
A Module instance is used to store all the information related to an LLVM module.
static LLVM_ABI const OptimizationLevel O3
Optimize for fast execution as much as possible.
static LLVM_ABI const OptimizationLevel Oz
A very specialized mode that will optimize for code size at any and all costs.
static LLVM_ABI const OptimizationLevel O0
Disable as many optimizations as possible.
static LLVM_ABI const OptimizationLevel Os
Similar to O2 but tries to optimize for small code size instead of fast execution without triggering ...
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 PassBuilder(TargetMachine *TM=nullptr, PipelineTuningOptions PTO=PipelineTuningOptions(), std::optional< PGOOptions > PGOOpt=std::nullopt, PassInstrumentationCallbacks *PIC=nullptr)
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 Error parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText)
Parse a textual pass pipeline description into a ModulePassManager.
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.
LLVM_ATTRIBUTE_MINSIZE void addPass(PassT &&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 PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
A set of analyses that are preserved following a run of a transformation pass.
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.
StringRef - 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
str - 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
empty - Check if the string is empty.
char front() const
front - Get the first character in the string.
bool consume_front(StringRef 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.
This function has undefined behavior.
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,...
@ C
The default llvm calling convention, compatible with C.
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
This is an optimization pass for GlobalISel generic memory operations.
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.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
InnerAnalysisManagerProxy< MachineFunctionAnalysisManager, Module > MachineFunctionAnalysisManagerModuleProxy
OuterAnalysisManagerProxy< ModuleAnalysisManager, LazyCallGraph::SCC, LazyCallGraph & > ModuleAnalysisManagerCGSCCProxy
A proxy from a ModuleAnalysisManager to an SCC.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
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)
CGSCCToFunctionPassAdaptor createCGSCCToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false, bool NoRerun=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
FunctionToMachineFunctionPassAdaptor createFunctionToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass)
InnerAnalysisManagerProxy< MachineFunctionAnalysisManager, Function > MachineFunctionAnalysisManagerFunctionProxy
OuterAnalysisManagerProxy< FunctionAnalysisManager, Loop, LoopStandardAnalysisResults & > FunctionAnalysisManagerLoopProxy
A proxy from a FunctionAnalysisManager to a Loop.
OuterAnalysisManagerProxy< CGSCCAnalysisManager, Function > CGSCCAnalysisManagerFunctionProxy
A proxy from a CGSCCAnalysisManager to a Function.
FunctionToLoopPassAdaptor createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA=false, bool UseBlockFrequencyInfo=false, bool UseBranchProbabilityInfo=false)
A function to deduce a loop pass type and wrap it in the templated adaptor.
@ Detailed
Hash with opcode only.
@ CallTargetIgnored
Hash with opcode and operands.
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 to automatically provide informational APIs needed for passes.
static StringRef name()
Gets the name of the pass we are mixed into.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
void registerClassToPassNameCallback(CallableT C)
RegAllocFilterFunc Filter