278 "^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$");
282 "print-pipeline-passes",
283 cl::desc(
"Print a '-passes' compatible string describing the pipeline "
284 "(best-effort only)."));
396bool shouldPopulateClassToPassNames() {
403class TriggerCrashPass :
public PassInfoMixin<TriggerCrashPass> {
414class TriggerVerifierErrorPass
422 GlobalValue::LinkageTypes::InternalLinkage,
423 "__bad_alias",
nullptr, &M);
435 static StringRef name() {
return "TriggerVerifierErrorPass"; }
441 std::optional<PGOOptions> PGOOpt,
443 :
TM(
TM), PTO(PTO), PGOOpt(PGOOpt),
PIC(
PIC) {
445 TM->registerPassBuilderCallbacks(*
this);
446 if (
PIC && shouldPopulateClassToPassNames()) {
447#define MODULE_PASS(NAME, CREATE_PASS) \
448 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
449#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
450 PIC->addClassToPassName(CLASS, NAME);
451#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
452 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
453#define FUNCTION_PASS(NAME, CREATE_PASS) \
454 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
455#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
456 PIC->addClassToPassName(CLASS, NAME);
457#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
458 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
459#define LOOPNEST_PASS(NAME, CREATE_PASS) \
460 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
461#define LOOP_PASS(NAME, CREATE_PASS) \
462 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
463#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
464 PIC->addClassToPassName(CLASS, NAME);
465#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
466 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
467#define CGSCC_PASS(NAME, CREATE_PASS) \
468 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
469#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
470 PIC->addClassToPassName(CLASS, NAME);
471#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
472 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
473#include "PassRegistry.def"
478#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
479 MAM.registerPass([&] { return CREATE_PASS; });
480#include "PassRegistry.def"
482 for (
auto &
C : ModuleAnalysisRegistrationCallbacks)
487#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
488 CGAM.registerPass([&] { return CREATE_PASS; });
489#include "PassRegistry.def"
491 for (
auto &
C : CGSCCAnalysisRegistrationCallbacks)
501#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
502 FAM.registerPass([&] { return CREATE_PASS; });
503#include "PassRegistry.def"
505 for (
auto &
C : FunctionAnalysisRegistrationCallbacks)
510#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
511 LAM.registerPass([&] { return CREATE_PASS; });
512#include "PassRegistry.def"
514 for (
auto &
C : LoopAnalysisRegistrationCallbacks)
519 if (!
Name.consume_front(
"repeat<") || !
Name.consume_back(
">"))
522 if (
Name.getAsInteger(0, Count) || Count <= 0)
527static std::optional<std::pair<bool, bool>>
529 std::pair<bool, bool> Params;
530 if (!
Name.consume_front(
"function"))
534 if (!
Name.consume_front(
"<") || !
Name.consume_back(
">"))
536 while (!
Name.empty()) {
537 auto [Front, Back] =
Name.split(
';');
539 if (Front ==
"eager-inv")
541 else if (Front ==
"no-rerun")
542 Params.second =
true;
550 if (!
Name.consume_front(
"devirt<") || !
Name.consume_back(
">"))
553 if (
Name.getAsInteger(0, Count) || Count < 0)
564 return Name.startswith(
"<") &&
Name.endswith(
">");
595template <
typename ParametersParseCallableT>
596auto parsePassParameters(ParametersParseCallableT &&Parser,
StringRef Name,
598 using ParametersT =
typename decltype(Parser(
StringRef{}))::value_type;
603 "unable to strip pass name from parametrized pass specification");
605 if (!Params.
empty() &&
607 assert(
false &&
"invalid format for parametrized pass name");
611 assert((Result ||
Result.template errorIsA<StringError>()) &&
612 "Pass parameter parser can only return StringErrors.");
620 while (!Params.
empty()) {
622 std::tie(ParamName, Params) = Params.
split(
';');
626 return make_error<StringError>(
627 formatv(
"invalid HardwareLoopPass parameter '{0}' ", ParamName).str(),
632 if (ParamName.
consume_front(
"hardware-loop-counter-bitwidth=")) {
635 return make_error<StringError>(
636 formatv(
"invalid HardwareLoopPass parameter '{0}' ", ParamName).str(),
641 if (ParamName ==
"force-hardware-loops") {
643 }
else if (ParamName ==
"force-hardware-loop-phi") {
645 }
else if (ParamName ==
"force-nested-hardware-loop") {
647 }
else if (ParamName ==
"force-hardware-loop-guard") {
650 return make_error<StringError>(
651 formatv(
"invalid HardwarePass parameter '{0}' ", ParamName).str(),
655 return HardwareLoopOpts;
661 while (!Params.
empty()) {
663 std::tie(ParamName, Params) = Params.
split(
';');
664 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(ParamName);
666 if (OptLevel && !OptLevel->isOptimizingForSize()) {
667 UnrollOpts.
setOptLevel(OptLevel->getSpeedupLevel());
673 return make_error<StringError>(
674 formatv(
"invalid LoopUnrollPass parameter '{0}' ", ParamName).str(),
681 if (ParamName ==
"partial") {
683 }
else if (ParamName ==
"peeling") {
685 }
else if (ParamName ==
"profile-peeling") {
687 }
else if (ParamName ==
"runtime") {
689 }
else if (ParamName ==
"upperbound") {
692 return make_error<StringError>(
693 formatv(
"invalid LoopUnrollPass parameter '{0}' ", ParamName).str(),
703 while (!Params.
empty()) {
705 std::tie(ParamName, Params) = Params.
split(
';');
707 if (ParamName == OptionName) {
710 return make_error<StringError>(
720 return parseSinglePassOption(Params,
"vfe-linkage-unit-visibility",
"GlobalDCE");
724 return parseSinglePassOption(Params,
"only-mandatory",
"InlinerPass");
728 return parseSinglePassOption(Params,
"reuse-storage",
"CoroSplitPass");
732 return parseSinglePassOption(Params,
"skip-non-recursive-function-attrs",
733 "PostOrderFunctionAttrs");
737 return parseSinglePassOption(Params,
"memssa",
"EarlyCSE");
741 return parseSinglePassOption(Params,
"post-inline",
"EntryExitInstrumenter");
745 return parseSinglePassOption(Params,
"single",
"LoopExtractor");
749 return parseSinglePassOption(Params,
"minimal",
"LowerMatrixIntrinsics");
754 while (!Params.
empty()) {
756 std::tie(ParamName, Params) = Params.
split(
';');
758 if (ParamName ==
"kernel") {
759 Result.CompileKernel =
true;
761 return make_error<StringError>(
762 formatv(
"invalid AddressSanitizer pass parameter '{0}' ", ParamName)
772 while (!Params.
empty()) {
774 std::tie(ParamName, Params) = Params.
split(
';');
776 if (ParamName ==
"recover") {
778 }
else if (ParamName ==
"kernel") {
779 Result.CompileKernel =
true;
781 return make_error<StringError>(
782 formatv(
"invalid HWAddressSanitizer pass parameter '{0}' ", ParamName)
792 while (!Params.
empty()) {
794 std::tie(ParamName, Params) = Params.
split(
';');
796 if (ParamName ==
"recover") {
798 }
else if (ParamName ==
"kernel") {
802 return make_error<StringError>(
803 formatv(
"invalid argument to MemorySanitizer pass track-origins "
808 }
else if (ParamName ==
"eager-checks") {
809 Result.EagerChecks =
true;
811 return make_error<StringError>(
812 formatv(
"invalid MemorySanitizer pass parameter '{0}' ", ParamName)
823 while (!Params.
empty()) {
825 std::tie(ParamName, Params) = Params.
split(
';');
828 if (ParamName ==
"speculate-blocks") {
830 }
else if (ParamName ==
"simplify-cond-branch") {
832 }
else if (ParamName ==
"forward-switch-cond") {
834 }
else if (ParamName ==
"switch-range-to-icmp") {
836 }
else if (ParamName ==
"switch-to-lookup") {
838 }
else if (ParamName ==
"keep-loops") {
840 }
else if (ParamName ==
"hoist-common-insts") {
842 }
else if (ParamName ==
"sink-common-insts") {
845 APInt BonusInstThreshold;
847 return make_error<StringError>(
848 formatv(
"invalid argument to SimplifyCFG pass bonus-threshold "
854 return make_error<StringError>(
855 formatv(
"invalid SimplifyCFG pass parameter '{0}' ", ParamName).str(),
866 Result.setVerifyFixpoint(
true);
867 while (!Params.
empty()) {
869 std::tie(ParamName, Params) = Params.
split(
';');
872 if (ParamName ==
"use-loop-info") {
874 }
else if (ParamName ==
"verify-fixpoint") {
879 return make_error<StringError>(
880 formatv(
"invalid argument to InstCombine pass max-iterations "
886 return make_error<StringError>(
887 formatv(
"invalid InstCombine pass parameter '{0}' ", ParamName).str(),
897 while (!Params.
empty()) {
899 std::tie(ParamName, Params) = Params.
split(
';');
902 if (ParamName ==
"interleave-forced-only") {
904 }
else if (ParamName ==
"vectorize-forced-only") {
907 return make_error<StringError>(
908 formatv(
"invalid LoopVectorize parameter '{0}' ", ParamName).str(),
916 std::pair<bool, bool>
Result = {
false,
true};
917 while (!Params.
empty()) {
919 std::tie(ParamName, Params) = Params.
split(
';');
922 if (ParamName ==
"nontrivial") {
924 }
else if (ParamName ==
"trivial") {
927 return make_error<StringError>(
928 formatv(
"invalid LoopUnswitch pass parameter '{0}' ", ParamName)
938 while (!Params.
empty()) {
940 std::tie(ParamName, Params) = Params.
split(
';');
943 if (ParamName ==
"allowspeculation") {
946 return make_error<StringError>(
947 formatv(
"invalid LICM pass parameter '{0}' ", ParamName).str(),
955 std::pair<bool, bool>
Result = {
true,
false};
956 while (!Params.
empty()) {
958 std::tie(ParamName, Params) = Params.
split(
';');
961 if (ParamName ==
"header-duplication") {
963 }
else if (ParamName ==
"prepare-for-lto") {
966 return make_error<StringError>(
967 formatv(
"invalid LoopRotate pass parameter '{0}' ", ParamName).str(),
976 while (!Params.
empty()) {
978 std::tie(ParamName, Params) = Params.
split(
';');
981 if (ParamName ==
"split-footer-bb") {
984 return make_error<StringError>(
985 formatv(
"invalid MergedLoadStoreMotion pass parameter '{0}' ",
996 while (!Params.
empty()) {
998 std::tie(ParamName, Params) = Params.
split(
';');
1001 if (ParamName ==
"pre") {
1003 }
else if (ParamName ==
"load-pre") {
1005 }
else if (ParamName ==
"split-backedge-load-pre") {
1007 }
else if (ParamName ==
"memdep") {
1010 return make_error<StringError>(
1011 formatv(
"invalid GVN pass parameter '{0}' ", ParamName).str(),
1020 while (!Params.
empty()) {
1022 std::tie(ParamName, Params) = Params.
split(
';');
1025 if (ParamName ==
"func-spec")
1028 return make_error<StringError>(
1029 formatv(
"invalid IPSCCP pass parameter '{0}' ", ParamName).str(),
1036 if (Params.
empty() || Params ==
"modify-cfg")
1038 if (Params ==
"preserve-cfg")
1040 return make_error<StringError>(
1041 formatv(
"invalid SROA pass parameter '{0}' (either preserve-cfg or "
1042 "modify-cfg can be specified)",
1049parseStackLifetimeOptions(
StringRef Params) {
1051 while (!Params.
empty()) {
1053 std::tie(ParamName, Params) = Params.
split(
';');
1055 if (ParamName ==
"may") {
1057 }
else if (ParamName ==
"must") {
1060 return make_error<StringError>(
1061 formatv(
"invalid StackLifetime parameter '{0}' ", ParamName).str(),
1069 return parseSinglePassOption(Params,
"normalized-results",
1070 "DependenceAnalysisPrinter");
1074 return parseSinglePassOption(Params,
"lower-gep",
1075 "SeparateConstOffsetFromGEP");
1079parseFunctionSimplificationPipelineOptions(
StringRef Params) {
1082 return make_error<StringError>(
1083 formatv(
"invalid function-simplification parameter '{0}' ", Params)
1091 return parseSinglePassOption(Params,
"no-ensure-optimized-uses",
1092 "MemorySSAPrinterPass");
1096 return parseSinglePassOption(Params,
"only-if-divergent-target",
1097 "SpeculativeExecutionPass");
1102 while (!Params.
empty()) {
1104 std::tie(ParamName, Params) = Params.
split(
';');
1109 return make_error<StringError>(
1110 formatv(
"invalid MemProfUse pass parameter '{0}' ", ParamName).str(),
1118 return parseSinglePassOption(Params,
"detailed",
1119 "StructuralHashPrinterPass");
1123 return parseSinglePassOption(Params,
"demote-catchswitch-only",
1124 "WinEHPreparePass");
1132 return Name.startswith(
"default") ||
Name.startswith(
"thinlto") ||
1133 Name.startswith(
"lto");
1144template <
typename PassManagerT,
typename CallbacksT>
1146 if (!Callbacks.empty()) {
1147 PassManagerT DummyPM;
1148 for (
auto &CB : Callbacks)
1149 if (CB(
Name, DummyPM, {}))
1155template <
typename CallbacksT>
1161 StringRef NameNoBracket =
Name.take_until([](
char C) {
return C ==
'<'; });
1164 if (
Name ==
"module")
1166 if (
Name ==
"cgscc")
1168 if (NameNoBracket ==
"function")
1170 if (
Name ==
"coro-cond")
1177#define MODULE_PASS(NAME, CREATE_PASS) \
1180#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1181 if (checkParametrizedPassName(Name, NAME)) \
1183#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1184 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1186#include "PassRegistry.def"
1188 return callbacksAcceptPassName<ModulePassManager>(
Name, Callbacks);
1191template <
typename CallbacksT>
1194 StringRef NameNoBracket =
Name.take_until([](
char C) {
return C ==
'<'; });
1195 if (
Name ==
"cgscc")
1197 if (NameNoBracket ==
"function")
1206#define CGSCC_PASS(NAME, CREATE_PASS) \
1209#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1210 if (checkParametrizedPassName(Name, NAME)) \
1212#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1213 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1215#include "PassRegistry.def"
1217 return callbacksAcceptPassName<CGSCCPassManager>(
Name, Callbacks);
1220template <
typename CallbacksT>
1223 StringRef NameNoBracket =
Name.take_until([](
char C) {
return C ==
'<'; });
1224 if (NameNoBracket ==
"function")
1226 if (
Name ==
"loop" ||
Name ==
"loop-mssa")
1233#define FUNCTION_PASS(NAME, CREATE_PASS) \
1236#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1237 if (checkParametrizedPassName(Name, NAME)) \
1239#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1240 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1242#include "PassRegistry.def"
1244 return callbacksAcceptPassName<FunctionPassManager>(
Name, Callbacks);
1247template <
typename CallbacksT>
1249 bool &UseMemorySSA) {
1250 UseMemorySSA =
false;
1257 UseMemorySSA =
true;
1261#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1264#include "PassRegistry.def"
1266 return callbacksAcceptPassName<LoopPassManager>(
Name, Callbacks);
1269template <
typename CallbacksT>
1271 bool &UseMemorySSA) {
1272 UseMemorySSA =
false;
1279 UseMemorySSA =
true;
1283#define LOOP_PASS(NAME, CREATE_PASS) \
1286#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1287 if (checkParametrizedPassName(Name, NAME)) \
1289#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1290 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1292#include "PassRegistry.def"
1294 return callbacksAcceptPassName<LoopPassManager>(
Name, Callbacks);
1297std::optional<std::vector<PassBuilder::PipelineElement>>
1298PassBuilder::parsePipelineText(
StringRef Text) {
1299 std::vector<PipelineElement> ResultPipeline;
1304 std::vector<PipelineElement> &Pipeline = *PipelineStack.
back();
1305 size_t Pos =
Text.find_first_of(
",()");
1306 Pipeline.push_back({
Text.substr(0, Pos), {}});
1309 if (Pos ==
Text.npos)
1312 char Sep =
Text[Pos];
1320 PipelineStack.
push_back(&Pipeline.back().InnerPipeline);
1324 assert(Sep ==
')' &&
"Bogus separator!");
1329 if (PipelineStack.
size() == 1)
1330 return std::nullopt;
1333 }
while (
Text.consume_front(
")"));
1341 if (!
Text.consume_front(
","))
1342 return std::nullopt;
1345 if (PipelineStack.
size() > 1)
1347 return std::nullopt;
1349 assert(PipelineStack.
back() == &ResultPipeline &&
1350 "Wrong pipeline at the bottom of the stack!");
1351 return {std::move(ResultPipeline)};
1355 const PipelineElement &
E) {
1356 auto &
Name =
E.Name;
1357 auto &InnerPipeline =
E.InnerPipeline;
1360 if (!InnerPipeline.empty()) {
1361 if (
Name ==
"module") {
1363 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1368 if (
Name ==
"coro-cond") {
1370 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1375 if (
Name ==
"cgscc") {
1377 if (
auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
1384 return make_error<StringError>(
1385 "cannot have a no-rerun module to function adaptor",
1388 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1396 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1402 for (
auto &
C : ModulePipelineParsingCallbacks)
1407 return make_error<StringError>(
1408 formatv(
"invalid use of '{0}' pass as module pipeline",
Name).str(),
1417 return make_error<StringError>(
1418 formatv(
"unknown default pipeline alias '{0}'",
Name).str(),
1421 assert(Matches.
size() == 3 &&
"Must capture two matched strings!");
1433 if (Matches[1] ==
"default") {
1435 }
else if (Matches[1] ==
"thinlto-pre-link") {
1437 }
else if (Matches[1] ==
"thinlto") {
1439 }
else if (Matches[1] ==
"lto-pre-link") {
1448 assert(Matches[1] ==
"lto" &&
"Not one of the matched options!");
1455#define MODULE_PASS(NAME, CREATE_PASS) \
1456 if (Name == NAME) { \
1457 MPM.addPass(CREATE_PASS); \
1458 return Error::success(); \
1460#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1461 if (checkParametrizedPassName(Name, NAME)) { \
1462 auto Params = parsePassParameters(PARSER, Name, NAME); \
1464 return Params.takeError(); \
1465 MPM.addPass(CREATE_PASS(Params.get())); \
1466 return Error::success(); \
1468#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1469 if (Name == "require<" NAME ">") { \
1471 RequireAnalysisPass< \
1472 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
1473 return Error::success(); \
1475 if (Name == "invalidate<" NAME ">") { \
1476 MPM.addPass(InvalidateAnalysisPass< \
1477 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1478 return Error::success(); \
1480#define CGSCC_PASS(NAME, CREATE_PASS) \
1481 if (Name == NAME) { \
1482 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
1483 return Error::success(); \
1485#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1486 if (checkParametrizedPassName(Name, NAME)) { \
1487 auto Params = parsePassParameters(PARSER, Name, NAME); \
1489 return Params.takeError(); \
1491 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
1492 return Error::success(); \
1494#define FUNCTION_PASS(NAME, CREATE_PASS) \
1495 if (Name == NAME) { \
1496 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
1497 return Error::success(); \
1499#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1500 if (checkParametrizedPassName(Name, NAME)) { \
1501 auto Params = parsePassParameters(PARSER, Name, NAME); \
1503 return Params.takeError(); \
1504 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
1505 return Error::success(); \
1507#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1508 if (Name == NAME) { \
1509 MPM.addPass(createModuleToFunctionPassAdaptor( \
1510 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1511 return Error::success(); \
1513#define LOOP_PASS(NAME, CREATE_PASS) \
1514 if (Name == NAME) { \
1515 MPM.addPass(createModuleToFunctionPassAdaptor( \
1516 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1517 return Error::success(); \
1519#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1520 if (checkParametrizedPassName(Name, NAME)) { \
1521 auto Params = parsePassParameters(PARSER, Name, NAME); \
1523 return Params.takeError(); \
1525 createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor( \
1526 CREATE_PASS(Params.get()), false, false))); \
1527 return Error::success(); \
1529#include "PassRegistry.def"
1531 for (
auto &
C : ModulePipelineParsingCallbacks)
1534 return make_error<StringError>(
1540 const PipelineElement &
E) {
1541 auto &
Name =
E.Name;
1542 auto &InnerPipeline =
E.InnerPipeline;
1545 if (!InnerPipeline.empty()) {
1546 if (
Name ==
"cgscc") {
1548 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1551 CGPM.
addPass(std::move(NestedCGPM));
1556 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1560 std::move(FPM), Params->first, Params->second));
1565 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1572 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1579 for (
auto &
C : CGSCCPipelineParsingCallbacks)
1580 if (
C(
Name, CGPM, InnerPipeline))
1584 return make_error<StringError>(
1585 formatv(
"invalid use of '{0}' pass as cgscc pipeline",
Name).str(),
1590#define CGSCC_PASS(NAME, CREATE_PASS) \
1591 if (Name == NAME) { \
1592 CGPM.addPass(CREATE_PASS); \
1593 return Error::success(); \
1595#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1596 if (checkParametrizedPassName(Name, NAME)) { \
1597 auto Params = parsePassParameters(PARSER, Name, NAME); \
1599 return Params.takeError(); \
1600 CGPM.addPass(CREATE_PASS(Params.get())); \
1601 return Error::success(); \
1603#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1604 if (Name == "require<" NAME ">") { \
1605 CGPM.addPass(RequireAnalysisPass< \
1606 std::remove_reference_t<decltype(CREATE_PASS)>, \
1607 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
1608 CGSCCUpdateResult &>()); \
1609 return Error::success(); \
1611 if (Name == "invalidate<" NAME ">") { \
1612 CGPM.addPass(InvalidateAnalysisPass< \
1613 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1614 return Error::success(); \
1616#define FUNCTION_PASS(NAME, CREATE_PASS) \
1617 if (Name == NAME) { \
1618 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
1619 return Error::success(); \
1621#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1622 if (checkParametrizedPassName(Name, NAME)) { \
1623 auto Params = parsePassParameters(PARSER, Name, NAME); \
1625 return Params.takeError(); \
1626 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
1627 return Error::success(); \
1629#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1630 if (Name == NAME) { \
1631 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
1632 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1633 return Error::success(); \
1635#define LOOP_PASS(NAME, CREATE_PASS) \
1636 if (Name == NAME) { \
1637 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
1638 createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \
1639 return Error::success(); \
1641#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1642 if (checkParametrizedPassName(Name, NAME)) { \
1643 auto Params = parsePassParameters(PARSER, Name, NAME); \
1645 return Params.takeError(); \
1647 createCGSCCToFunctionPassAdaptor(createFunctionToLoopPassAdaptor( \
1648 CREATE_PASS(Params.get()), false, false))); \
1649 return Error::success(); \
1651#include "PassRegistry.def"
1653 for (
auto &
C : CGSCCPipelineParsingCallbacks)
1654 if (
C(
Name, CGPM, InnerPipeline))
1656 return make_error<StringError>(
1662 const PipelineElement &
E) {
1663 auto &
Name =
E.Name;
1664 auto &InnerPipeline =
E.InnerPipeline;
1667 if (!InnerPipeline.empty()) {
1668 if (
Name ==
"function") {
1670 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
1673 FPM.
addPass(std::move(NestedFPM));
1676 if (
Name ==
"loop" ||
Name ==
"loop-mssa") {
1678 if (
auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
1681 bool UseMemorySSA = (
Name ==
"loop-mssa");
1683 return Pipeline.Name.contains(
"simple-loop-unswitch");
1685 bool UseBPI =
llvm::any_of(InnerPipeline, [](
auto Pipeline) {
1686 return Pipeline.Name ==
"loop-predication";
1694 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
1700 for (
auto &
C : FunctionPipelineParsingCallbacks)
1701 if (
C(
Name, FPM, InnerPipeline))
1705 return make_error<StringError>(
1706 formatv(
"invalid use of '{0}' pass as function pipeline",
Name).str(),
1711#define FUNCTION_PASS(NAME, CREATE_PASS) \
1712 if (Name == NAME) { \
1713 FPM.addPass(CREATE_PASS); \
1714 return Error::success(); \
1716#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1717 if (checkParametrizedPassName(Name, NAME)) { \
1718 auto Params = parsePassParameters(PARSER, Name, NAME); \
1720 return Params.takeError(); \
1721 FPM.addPass(CREATE_PASS(Params.get())); \
1722 return Error::success(); \
1724#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1725 if (Name == "require<" NAME ">") { \
1727 RequireAnalysisPass< \
1728 std::remove_reference_t<decltype(CREATE_PASS)>, Function>()); \
1729 return Error::success(); \
1731 if (Name == "invalidate<" NAME ">") { \
1732 FPM.addPass(InvalidateAnalysisPass< \
1733 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1734 return Error::success(); \
1740#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1741 if (Name == NAME) { \
1742 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)); \
1743 return Error::success(); \
1745#define LOOP_PASS(NAME, CREATE_PASS) \
1746 if (Name == NAME) { \
1747 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)); \
1748 return Error::success(); \
1750#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1751 if (checkParametrizedPassName(Name, NAME)) { \
1752 auto Params = parsePassParameters(PARSER, Name, NAME); \
1754 return Params.takeError(); \
1755 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), \
1757 return Error::success(); \
1759#include "PassRegistry.def"
1761 for (
auto &
C : FunctionPipelineParsingCallbacks)
1762 if (
C(
Name, FPM, InnerPipeline))
1764 return make_error<StringError>(
1765 formatv(
"unknown function pass '{0}'",
Name).str(),
1770 const PipelineElement &
E) {
1772 auto &InnerPipeline =
E.InnerPipeline;
1775 if (!InnerPipeline.empty()) {
1776 if (
Name ==
"loop") {
1778 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
1781 LPM.
addPass(std::move(NestedLPM));
1786 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
1792 for (
auto &
C : LoopPipelineParsingCallbacks)
1793 if (
C(
Name, LPM, InnerPipeline))
1797 return make_error<StringError>(
1798 formatv(
"invalid use of '{0}' pass as loop pipeline",
Name).str(),
1803#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1804 if (Name == NAME) { \
1805 LPM.addPass(CREATE_PASS); \
1806 return Error::success(); \
1808#define LOOP_PASS(NAME, CREATE_PASS) \
1809 if (Name == NAME) { \
1810 LPM.addPass(CREATE_PASS); \
1811 return Error::success(); \
1813#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1814 if (checkParametrizedPassName(Name, NAME)) { \
1815 auto Params = parsePassParameters(PARSER, Name, NAME); \
1817 return Params.takeError(); \
1818 LPM.addPass(CREATE_PASS(Params.get())); \
1819 return Error::success(); \
1821#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1822 if (Name == "require<" NAME ">") { \
1823 LPM.addPass(RequireAnalysisPass< \
1824 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
1825 LoopAnalysisManager, LoopStandardAnalysisResults &, \
1827 return Error::success(); \
1829 if (Name == "invalidate<" NAME ">") { \
1830 LPM.addPass(InvalidateAnalysisPass< \
1831 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
1832 return Error::success(); \
1834#include "PassRegistry.def"
1836 for (
auto &
C : LoopPipelineParsingCallbacks)
1837 if (
C(
Name, LPM, InnerPipeline))
1839 return make_error<StringError>(
formatv(
"unknown loop pass '{0}'",
Name).str(),
1844#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
1845 if (Name == NAME) { \
1846 AA.registerModuleAnalysis< \
1847 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
1850#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
1851 if (Name == NAME) { \
1852 AA.registerFunctionAnalysis< \
1853 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
1856#include "PassRegistry.def"
1858 for (
auto &
C : AAParsingCallbacks)
1866 for (
const auto &Element : Pipeline) {
1867 if (
auto Err = parseLoopPass(LPM, Element))
1873Error PassBuilder::parseFunctionPassPipeline(
1875 for (
const auto &Element : Pipeline) {
1876 if (
auto Err = parseFunctionPass(FPM, Element))
1884 for (
const auto &Element : Pipeline) {
1885 if (
auto Err = parseCGSCCPass(CGPM, Element))
1906 for (
const auto &Element : Pipeline) {
1907 if (
auto Err = parseModulePass(
MPM, Element))
1918 auto Pipeline = parsePipelineText(PipelineText);
1919 if (!Pipeline || Pipeline->empty())
1920 return make_error<StringError>(
1921 formatv(
"invalid pipeline '{0}'", PipelineText).str(),
1931 Pipeline = {{
"cgscc", std::move(*Pipeline)}};
1933 FunctionPipelineParsingCallbacks)) {
1934 Pipeline = {{
"function", std::move(*Pipeline)}};
1937 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
1938 std::move(*Pipeline)}}}};
1939 }
else if (
isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
1941 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
1942 std::move(*Pipeline)}}}};
1944 for (
auto &
C : TopLevelPipelineParsingCallbacks)
1945 if (
C(
MPM, *Pipeline))
1949 auto &InnerPipeline = Pipeline->front().InnerPipeline;
1950 return make_error<StringError>(
1951 formatv(
"unknown {0} name '{1}'",
1952 (InnerPipeline.empty() ?
"pass" :
"pipeline"), FirstName)
1958 if (
auto Err = parseModulePassPipeline(
MPM, *Pipeline))
1966 auto Pipeline = parsePipelineText(PipelineText);
1967 if (!Pipeline || Pipeline->empty())
1968 return make_error<StringError>(
1969 formatv(
"invalid pipeline '{0}'", PipelineText).str(),
1974 return make_error<StringError>(
1975 formatv(
"unknown cgscc pass '{0}' in pipeline '{1}'", FirstName,
1980 if (
auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
1989 auto Pipeline = parsePipelineText(PipelineText);
1990 if (!Pipeline || Pipeline->empty())
1991 return make_error<StringError>(
1992 formatv(
"invalid pipeline '{0}'", PipelineText).str(),
1997 return make_error<StringError>(
1998 formatv(
"unknown function pass '{0}' in pipeline '{1}'", FirstName,
2003 if (
auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2011 auto Pipeline = parsePipelineText(PipelineText);
2012 if (!Pipeline || Pipeline->empty())
2013 return make_error<StringError>(
2014 formatv(
"invalid pipeline '{0}'", PipelineText).str(),
2017 if (
auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2026 if (PipelineText ==
"default") {
2031 while (!PipelineText.
empty()) {
2033 std::tie(
Name, PipelineText) = PipelineText.
split(
',');
2034 if (!parseAAPassName(AA,
Name))
2035 return make_error<StringError>(
2036 formatv(
"unknown alias analysis name '{0}'",
Name).str(),
2048 OS <<
" " <<
PassName <<
"<" << Params <<
">\n";
2054 OS <<
"Module passes:\n";
2055#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2056#include "PassRegistry.def"
2058 OS <<
"Module passes with params:\n";
2059#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2060 printPassName(NAME, PARAMS, OS);
2061#include "PassRegistry.def"
2063 OS <<
"Module analyses:\n";
2064#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2065#include "PassRegistry.def"
2067 OS <<
"Module alias analyses:\n";
2068#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2069#include "PassRegistry.def"
2071 OS <<
"CGSCC passes:\n";
2072#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2073#include "PassRegistry.def"
2075 OS <<
"CGSCC passes with params:\n";
2076#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2077 printPassName(NAME, PARAMS, OS);
2078#include "PassRegistry.def"
2080 OS <<
"CGSCC analyses:\n";
2081#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2082#include "PassRegistry.def"
2084 OS <<
"Function passes:\n";
2085#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2086#include "PassRegistry.def"
2088 OS <<
"Function passes with params:\n";
2089#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2090 printPassName(NAME, PARAMS, OS);
2091#include "PassRegistry.def"
2093 OS <<
"Function analyses:\n";
2094#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2095#include "PassRegistry.def"
2097 OS <<
"Function alias analyses:\n";
2098#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2099#include "PassRegistry.def"
2101 OS <<
"LoopNest passes:\n";
2102#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2103#include "PassRegistry.def"
2105 OS <<
"Loop passes:\n";
2106#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2107#include "PassRegistry.def"
2109 OS <<
"Loop passes with params:\n";
2110#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2111 printPassName(NAME, PARAMS, OS);
2112#include "PassRegistry.def"
2114 OS <<
"Loop analyses:\n";
2115#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2116#include "PassRegistry.def"
2122 TopLevelPipelineParsingCallbacks.push_back(
C);
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.
This file provides interfaces used to build and manipulate a call graph, which is a very useful tool ...
This file declares an analysis pass that computes CycleInfo for LLVM IR, specialized from GenericCycl...
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.
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 passes to print out IR in various granularities.
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.
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.
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
const char LLVMTargetMachineRef TM
PassInstrumentationCallbacks 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 bool checkParametrizedPassName(StringRef Name, StringRef PassName)
static std::optional< int > parseDevirtPassName(StringRef Name)
static std::optional< int > parseRepeatPassName(StringRef Name)
static bool startsWithDefaultPipelineAliasPrefix(StringRef Name)
Tests whether a pass name starts with a valid prefix for a default pipeline alias.
static bool isLoopNestPassName(StringRef Name, CallbacksT &Callbacks, bool &UseMemorySSA)
static std::optional< OptimizationLevel > parseOptLevel(StringRef S)
static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks, bool &UseMemorySSA)
static std::optional< std::pair< bool, bool > > parseFunctionPipelineName(StringRef Name)
static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks)
static void printPassName(StringRef PassName, raw_ostream &OS)
static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks)
static const Regex DefaultAliasRegex("^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$")
This header defines various interfaces for pass management in LLVM.
This file implements the PredicateInfo analysis, which creates an Extended SSA form for operations us...
This file implements relative lookup table converter that converts lookup tables to relative lookup t...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file provides the interface for LLVM's Scalar Replacement of Aggregates pass.
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 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 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 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...
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
An SCC of the call graph.
A lazily constructed view of the call graph of a module.
This class represents a loop nest and can be used to query its properties.
Represents a single loop in the control flow graph.
A Module instance is used to store all the information related to an LLVM module.
static const OptimizationLevel O3
Optimize for fast execution as much as possible.
static const OptimizationLevel Oz
A very specialized mode that will optimize for code size at any and all costs.
static const OptimizationLevel O0
Disable as many optimizations as possible.
static const OptimizationLevel Os
Similar to O2 but tries to optimize for small code size instead of fast execution without triggering ...
static const OptimizationLevel O2
Optimize for fast execution as much as possible without triggering significant incremental compile ti...
static const OptimizationLevel O1
Optimize quickly without destroying debuggability.
void printPassNames(raw_ostream &OS)
Print pass names.
AAManager buildDefaultAAPipeline()
Build the default AAManager with the default alias analysis pipeline registered.
Error parseAAPipeline(AAManager &AA, StringRef PipelineText)
Parse a textual alias analysis pipeline into the provided AA manager.
ModulePassManager buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level)
Build a pre-link, ThinLTO-targeting default optimization pipeline to a pass manager.
PassBuilder(TargetMachine *TM=nullptr, PipelineTuningOptions PTO=PipelineTuningOptions(), std::optional< PGOOptions > PGOOpt=std::nullopt, PassInstrumentationCallbacks *PIC=nullptr)
void registerLoopAnalyses(LoopAnalysisManager &LAM)
Registers all available loop analysis passes.
void crossRegisterProxies(LoopAnalysisManager &LAM, FunctionAnalysisManager &FAM, CGSCCAnalysisManager &CGAM, ModuleAnalysisManager &MAM)
Cross register the analysis managers through their proxies.
ModulePassManager buildPerModuleDefaultPipeline(OptimizationLevel Level, bool LTOPreLink=false)
Build a per-module default optimization pipeline.
Error parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText)
Parse a textual pass pipeline description into a ModulePassManager.
ModulePassManager buildLTODefaultPipeline(OptimizationLevel Level, ModuleSummaryIndex *ExportSummary)
Build an LTO default optimization pipeline to a pass manager.
ModulePassManager buildThinLTODefaultPipeline(OptimizationLevel Level, const ModuleSummaryIndex *ImportSummary)
Build an ThinLTO default optimization pipeline to a pass manager.
void registerModuleAnalyses(ModuleAnalysisManager &MAM)
Registers all available module analysis passes.
void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM)
Registers all available CGSCC analysis passes.
void registerParseTopLevelPipelineCallback(const std::function< bool(ModulePassManager &, ArrayRef< PipelineElement >)> &C)
Register a callback for a top-level pipeline entry.
ModulePassManager buildLTOPreLinkDefaultPipeline(OptimizationLevel Level)
Build a pre-link, LTO-targeting default optimization pipeline to a pass manager.
void registerFunctionAnalyses(FunctionAnalysisManager &FAM)
Registers all available function analysis passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t< is_detected< HasRunOnLoopT, PassT >::value > addPass(PassT &&Pass)
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same< PassT, PassManager >::value > 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.
bool match(StringRef String, SmallVectorImpl< StringRef > *Matches=nullptr, std::string *Error=nullptr) const
matches - Match the regex against a given String.
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 consume_back(StringRef Suffix)
Returns true if this StringRef has the given suffix and removes that suffix.
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.
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.
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.
auto formatv(const char *Fmt, Ts &&... Vals) -> formatv_object< decltype(std::make_tuple(detail::build_format_adapter(std::forward< Ts >(Vals))...))>
std::vector< std::string > printAfterPasses()
ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
RepeatedPass< PassT > createRepeatedPass(int Count, PassT &&P)
DevirtSCCRepeatedPass createDevirtSCCRepeatedPass(CGSCCPassT &&Pass, int MaxIterations)
A function to deduce a function pass type and wrap it in the templated adaptor.
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
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.
std::vector< std::string > printBeforePasses()
ModuleToPostOrderCGSCCPassAdaptor createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass)
A function to deduce a function 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.
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
cl::opt< bool > PrintPipelinePasses("print-pipeline-passes", cl::desc("Print a '-passes' compatible string describing the pipeline " "(best-effort only)."))
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.
std::enable_if_t< is_detected< HasRunOnLoopT, LoopPassT >::value, FunctionToLoopPassAdaptor > createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA=false, bool UseBlockFrequencyInfo=false, bool UseBranchProbabilityInfo=false)
A function to deduce a loop pass type and wrap it in the templated adaptor.
bool isFilterPassesEmpty()
A CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Support structure for SCC passes to communicate updates the call graph back to the CGSCC pass manager...
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.
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
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.