390 "print-pipeline-passes",
391 cl::desc(
"Print a '-passes' compatible string describing the pipeline "
392 "(best-effort only)."));
403class TriggerCrashModulePass :
public PassInfoMixin<TriggerCrashModulePass> {
409 static StringRef
name() {
return "TriggerCrashModulePass"; }
412class TriggerCrashFunctionPass
419 static StringRef
name() {
return "TriggerCrashFunctionPass"; }
424class TriggerVerifierErrorPass
430 auto *PtrTy = PointerType::getUnqual(
M.getContext());
432 GlobalValue::LinkageTypes::InternalLinkage,
433 "__bad_alias",
nullptr, &M);
453 static StringRef
name() {
return "TriggerVerifierErrorPass"; }
458class RequireAllMachineFunctionPropertiesPass
459 :
public PassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
466 static MachineFunctionProperties getRequiredProperties() {
467 return MachineFunctionProperties()
469 .setFailsVerification()
474 .setRegBankSelected()
476 .setTiedOpsRewritten()
477 .setTracksDebugUserValues()
478 .setTracksLiveness();
480 static StringRef
name() {
return "RequireAllMachineFunctionPropertiesPass"; }
497 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(S);
501 formatv(
"invalid optimization level '{}'", S).str(),
506 std::optional<PGOOptions> PGOOpt,
509 : TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC), FS(
std::
move(FS)) {
511 TM->registerPassBuilderCallbacks(*
this);
513 PIC->registerClassToPassNameCallback([
this, PIC]() {
517#define MODULE_PASS(NAME, CREATE_PASS) \
518 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
519#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
520 PIC->addClassToPassName(CLASS, NAME);
521#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
522 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
523#define FUNCTION_PASS(NAME, CREATE_PASS) \
524 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
525#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
526 PIC->addClassToPassName(CLASS, NAME);
527#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
528 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
529#define LOOPNEST_PASS(NAME, CREATE_PASS) \
530 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
531#define LOOP_PASS(NAME, CREATE_PASS) \
532 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
533#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
534 PIC->addClassToPassName(CLASS, NAME);
535#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
536 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
537#define CGSCC_PASS(NAME, CREATE_PASS) \
538 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
539#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
540 PIC->addClassToPassName(CLASS, NAME);
541#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
542 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
543#include "PassRegistry.def"
545#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
546 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
547#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
548 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
549#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
551 PIC->addClassToPassName(CLASS, NAME);
552#include "llvm/Passes/MachinePassRegistry.def"
560#define MODULE_CALLBACK(NAME, INVOKE) \
561 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
562 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
564 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
567 INVOKE(PM, L.get()); \
570#include "PassRegistry.def"
578#define MODULE_LTO_CALLBACK(NAME, INVOKE) \
579 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
580 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
582 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
585 INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \
588#include "PassRegistry.def"
596#define FUNCTION_CALLBACK(NAME, INVOKE) \
597 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
598 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
600 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
603 INVOKE(PM, L.get()); \
606#include "PassRegistry.def"
614#define CGSCC_CALLBACK(NAME, INVOKE) \
615 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
616 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
618 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
621 INVOKE(PM, L.get()); \
624#include "PassRegistry.def"
632#define LOOP_CALLBACK(NAME, INVOKE) \
633 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
634 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
636 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
639 INVOKE(PM, L.get()); \
642#include "PassRegistry.def"
648#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
649 MAM.registerPass([&] { return CREATE_PASS; });
650#include "PassRegistry.def"
652 for (
auto &
C : ModuleAnalysisRegistrationCallbacks)
657#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
658 CGAM.registerPass([&] { return CREATE_PASS; });
659#include "PassRegistry.def"
661 for (
auto &
C : CGSCCAnalysisRegistrationCallbacks)
671#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
672 if constexpr (std::is_constructible_v< \
673 std::remove_reference_t<decltype(CREATE_PASS)>, \
674 const TargetMachine &>) { \
676 FAM.registerPass([&] { return CREATE_PASS; }); \
678 FAM.registerPass([&] { return CREATE_PASS; }); \
680#include "PassRegistry.def"
682 for (
auto &
C : FunctionAnalysisRegistrationCallbacks)
689#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
690 MFAM.registerPass([&] { return CREATE_PASS; });
691#include "llvm/Passes/MachinePassRegistry.def"
693 for (
auto &
C : MachineFunctionAnalysisRegistrationCallbacks)
698#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
699 LAM.registerPass([&] { return CREATE_PASS; });
700#include "PassRegistry.def"
702 for (
auto &
C : LoopAnalysisRegistrationCallbacks)
706static std::optional<std::pair<bool, bool>>
708 std::pair<bool, bool> Params;
709 if (!Name.consume_front(
"function"))
713 if (!Name.consume_front(
"<") || !Name.consume_back(
">"))
715 while (!Name.empty()) {
716 auto [Front, Back] = Name.split(
';');
718 if (Front ==
"eager-inv")
720 else if (Front ==
"no-rerun")
721 Params.second =
true;
729 if (!Name.consume_front(
"devirt<") || !Name.consume_back(
">"))
741 while (!Params.
empty()) {
743 std::tie(ParamName, Params) = Params.
split(
';');
745 if (ParamName == OptionName) {
762 while (!Params.
empty()) {
764 std::tie(ParamName, Params) = Params.
split(
';');
769 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
774 if (ParamName.
consume_front(
"hardware-loop-counter-bitwidth=")) {
778 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
783 if (ParamName ==
"force-hardware-loops") {
785 }
else if (ParamName ==
"force-hardware-loop-phi") {
787 }
else if (ParamName ==
"force-nested-hardware-loop") {
789 }
else if (ParamName ==
"force-hardware-loop-guard") {
793 formatv(
"invalid HardwarePass parameter '{}'", ParamName).str(),
797 return HardwareLoopOpts;
809 while (!Params.
empty()) {
811 std::tie(ParamName, Params) = Params.
split(
';');
812 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(ParamName);
814 if (OptLevel && !OptLevel->isOptimizingForSize()) {
815 UnrollOpts.
setOptLevel(OptLevel->getSpeedupLevel());
822 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
829 if (ParamName ==
"partial") {
831 }
else if (ParamName ==
"peeling") {
833 }
else if (ParamName ==
"profile-peeling") {
835 }
else if (ParamName ==
"runtime") {
837 }
else if (ParamName ==
"upperbound") {
841 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
850 Params,
"vfe-linkage-unit-visibility",
"GlobalDCE");
870 Params,
"skip-non-recursive-function-attrs",
"PostOrderFunctionAttrs");
880 formatv(
"too many CFGuardPass parameters '{}'", Params).str(),
883 if (Param ==
"check")
885 if (Param ==
"dispatch")
889 formatv(
"invalid CFGuardPass mechanism: '{}'", Param).str(),
899 "EntryExitInstrumenter");
904 "DropUnnecessaryAssumes");
913 "LowerMatrixIntrinsics");
918 while (!Params.
empty()) {
920 std::tie(ParamName, Params) = Params.
split(
';');
923 if (ParamName ==
"preserve-order")
925 else if (ParamName ==
"rename-all")
927 else if (ParamName ==
"fold-all")
929 else if (ParamName ==
"reorder-operands")
933 formatv(
"invalid normalize pass parameter '{}'", ParamName).str(),
943 while (!Params.
empty()) {
945 std::tie(ParamName, Params) = Params.
split(
';');
947 if (ParamName ==
"kernel") {
948 Result.CompileKernel =
true;
949 }
else if (ParamName ==
"use-after-scope") {
950 Result.UseAfterScope =
true;
953 formatv(
"invalid AddressSanitizer pass parameter '{}'", ParamName)
963 while (!Params.
empty()) {
965 std::tie(ParamName, Params) = Params.
split(
';');
967 if (ParamName ==
"recover") {
969 }
else if (ParamName ==
"kernel") {
970 Result.CompileKernel =
true;
973 formatv(
"invalid HWAddressSanitizer pass parameter '{}'", ParamName)
983 while (!Params.
empty()) {
985 std::tie(ParamName, Params) = Params.
split(
';');
987 if (ParamName ==
"thinlto") {
989 }
else if (ParamName ==
"emit-summary") {
990 Result.EmitLTOSummary =
true;
993 formatv(
"invalid EmbedBitcode pass parameter '{}'", ParamName).str(),
1001parseLowerAllowCheckPassOptions(
StringRef Params) {
1003 while (!Params.
empty()) {
1005 std::tie(ParamName, Params) = Params.
split(
';');
1016 std::tie(IndicesStr, CutoffStr) = ParamName.
split(
"]=");
1023 formatv(
"invalid LowerAllowCheck pass cutoffs parameter '{}' ({})",
1028 if (!IndicesStr.
consume_front(
"cutoffs[") || IndicesStr ==
"")
1030 formatv(
"invalid LowerAllowCheck pass index parameter '{}' ({})",
1031 IndicesStr, CutoffStr)
1035 while (IndicesStr !=
"") {
1037 std::tie(firstIndexStr, IndicesStr) = IndicesStr.
split(
'|');
1043 "invalid LowerAllowCheck pass index parameter '{}' ({}) {}",
1044 firstIndexStr, IndicesStr)
1051 if (index >=
Result.cutoffs.size())
1052 Result.cutoffs.resize(index + 1, 0);
1054 Result.cutoffs[index] = cutoff;
1056 }
else if (ParamName.
starts_with(
"runtime_check")) {
1058 std::tie(std::ignore, ValueString) = ParamName.
split(
"=");
1062 formatv(
"invalid LowerAllowCheck pass runtime_check parameter '{}' "
1064 ValueString, Params)
1068 Result.runtime_check = runtime_check;
1071 formatv(
"invalid LowerAllowCheck pass parameter '{}'", ParamName)
1082 while (!Params.
empty()) {
1084 std::tie(ParamName, Params) = Params.
split(
';');
1086 if (ParamName ==
"recover") {
1088 }
else if (ParamName ==
"kernel") {
1093 formatv(
"invalid argument to MemorySanitizer pass track-origins "
1098 }
else if (ParamName ==
"eager-checks") {
1099 Result.EagerChecks =
true;
1102 formatv(
"invalid MemorySanitizer pass parameter '{}'", ParamName)
1112 while (!Params.
empty()) {
1114 std::tie(ParamName, Params) = Params.
split(
';');
1121 formatv(
"invalid argument to AllocToken pass mode "
1128 formatv(
"invalid AllocToken pass parameter '{}'", ParamName).str(),
1138 while (!Params.
empty()) {
1140 std::tie(ParamName, Params) = Params.
split(
';');
1143 if (ParamName ==
"speculate-blocks") {
1145 }
else if (ParamName ==
"simplify-cond-branch") {
1147 }
else if (ParamName ==
"forward-switch-cond") {
1149 }
else if (ParamName ==
"switch-range-to-icmp") {
1151 }
else if (ParamName ==
"switch-to-arithmetic") {
1153 }
else if (ParamName ==
"switch-to-lookup") {
1155 }
else if (ParamName ==
"keep-loops") {
1157 }
else if (ParamName ==
"hoist-common-insts") {
1159 }
else if (ParamName ==
"hoist-loads-stores-with-cond-faulting") {
1161 }
else if (ParamName ==
"sink-common-insts") {
1163 }
else if (ParamName ==
"speculate-unpredictables") {
1166 APInt BonusInstThreshold;
1169 formatv(
"invalid argument to SimplifyCFG pass bonus-threshold "
1177 formatv(
"invalid SimplifyCFG pass parameter '{}'", ParamName).str(),
1188 Result.setVerifyFixpoint(
true);
1189 while (!Params.
empty()) {
1191 std::tie(ParamName, Params) = Params.
split(
';');
1194 if (ParamName ==
"verify-fixpoint") {
1197 APInt MaxIterations;
1200 formatv(
"invalid argument to InstCombine pass max-iterations "
1208 formatv(
"invalid InstCombine pass parameter '{}'", ParamName).str(),
1218 while (!Params.
empty()) {
1220 std::tie(ParamName, Params) = Params.
split(
';');
1223 if (ParamName ==
"interleave-forced-only") {
1225 }
else if (ParamName ==
"vectorize-forced-only") {
1229 formatv(
"invalid LoopVectorize parameter '{}'", ParamName).str(),
1237 std::pair<bool, bool>
Result = {
false,
true};
1238 while (!Params.
empty()) {
1240 std::tie(ParamName, Params) = Params.
split(
';');
1243 if (ParamName ==
"nontrivial") {
1245 }
else if (ParamName ==
"trivial") {
1249 formatv(
"invalid LoopUnswitch pass parameter '{}'", ParamName).str(),
1258 while (!Params.
empty()) {
1260 std::tie(ParamName, Params) = Params.
split(
';');
1263 if (ParamName ==
"allowspeculation") {
1267 formatv(
"invalid LICM pass parameter '{}'", ParamName).str(),
1275 std::pair<bool, bool>
Result = {
true,
false};
1276 while (!Params.
empty()) {
1278 std::tie(ParamName, Params) = Params.
split(
';');
1281 if (ParamName ==
"header-duplication") {
1283 }
else if (ParamName ==
"prepare-for-lto") {
1287 formatv(
"invalid LoopRotate pass parameter '{}'", ParamName).str(),
1296 while (!Params.
empty()) {
1298 std::tie(ParamName, Params) = Params.
split(
';');
1301 if (ParamName ==
"split-footer-bb") {
1305 formatv(
"invalid MergedLoadStoreMotion pass parameter '{}'",
1316 while (!Params.
empty()) {
1318 std::tie(ParamName, Params) = Params.
split(
';');
1321 if (ParamName ==
"pre") {
1323 }
else if (ParamName ==
"load-pre") {
1325 }
else if (ParamName ==
"split-backedge-load-pre") {
1327 }
else if (ParamName ==
"memdep") {
1331 }
else if (ParamName ==
"memoryssa") {
1337 formatv(
"invalid GVN pass parameter '{}'", ParamName).str(),
1346 while (!Params.
empty()) {
1348 std::tie(ParamName, Params) = Params.
split(
';');
1351 if (ParamName ==
"func-spec")
1355 formatv(
"invalid IPSCCP pass parameter '{}'", ParamName).str(),
1363 while (!Params.
empty()) {
1365 std::tie(ParamName, Params) = Params.
split(
';');
1370 formatv(
"invalid argument to Scalarizer pass min-bits "
1381 if (ParamName ==
"load-store")
1383 else if (ParamName ==
"variable-insert-extract")
1387 formatv(
"invalid Scalarizer pass parameter '{}'", ParamName).str(),
1396 if (Params.
empty() || Params ==
"modify-cfg")
1398 if (Params ==
"preserve-cfg")
1401 formatv(
"invalid SROA pass parameter '{}' (either preserve-cfg or "
1402 "modify-cfg can be specified)",
1409parseStackLifetimeOptions(
StringRef Params) {
1411 while (!Params.
empty()) {
1413 std::tie(ParamName, Params) = Params.
split(
';');
1415 if (ParamName ==
"may") {
1417 }
else if (ParamName ==
"must") {
1421 formatv(
"invalid StackLifetime parameter '{}'", ParamName).str(),
1430 "DependenceAnalysisPrinter");
1435 "SeparateConstOffsetFromGEP");
1444parseFunctionSimplificationPipelineOptions(
StringRef Params) {
1448 formatv(
"invalid function-simplification parameter '{}'", Params).str(),
1456 "MemorySSAPrinterPass");
1461 "SpeculativeExecutionPass");
1466 while (!Params.
empty()) {
1468 std::tie(ParamName, Params) = Params.
split(
';');
1474 formatv(
"invalid MemProfUse pass parameter '{}'", ParamName).str(),
1482parseStructuralHashPrinterPassOptions(
StringRef Params) {
1485 if (Params ==
"detailed")
1487 if (Params ==
"call-target-ignored")
1490 formatv(
"invalid structural hash printer parameter '{}'", Params).str(),
1496 "WinEHPreparePass");
1501 while (!Params.
empty()) {
1503 std::tie(ParamName, Params) = Params.
split(
';');
1506 if (ParamName ==
"group-by-use")
1508 else if (ParamName ==
"ignore-single-use")
1510 else if (ParamName ==
"merge-const")
1512 else if (ParamName ==
"merge-const-aggressive")
1514 else if (ParamName ==
"merge-external")
1519 formatv(
"invalid GlobalMergePass parameter '{}'", ParamName).str(),
1523 formatv(
"invalid global-merge pass parameter '{}'", Params).str(),
1532 while (!Params.
empty()) {
1534 std::tie(ParamName, Params) = Params.
split(
';');
1540 formatv(
"invalid Internalize pass parameter '{}'", ParamName).str(),
1551 while (!Params.
empty()) {
1553 std::tie(ParamName, Params) = Params.
split(
';');
1556 std::optional<RegAllocFilterFunc>
Filter =
1560 formatv(
"invalid regallocfast register filter '{}'", ParamName)
1569 if (ParamName ==
"no-clear-vregs") {
1575 formatv(
"invalid regallocfast pass parameter '{}'", ParamName).str(),
1582parseBoundsCheckingOptions(
StringRef Params) {
1584 while (!Params.
empty()) {
1586 std::tie(ParamName, Params) = Params.
split(
';');
1587 if (ParamName ==
"trap") {
1589 }
else if (ParamName ==
"rt") {
1594 }
else if (ParamName ==
"rt-abort") {
1599 }
else if (ParamName ==
"min-rt") {
1604 }
else if (ParamName ==
"min-rt-abort") {
1609 }
else if (ParamName ==
"merge") {
1614 std::tie(ParamEQ, Val) = ParamName.
split(
'=');
1620 formatv(
"invalid BoundsChecking pass parameter '{}'", ParamName)
1637 if (!
Prefix.empty() || Digit.getAsInteger(10,
N))
1639 Param.str().c_str());
1642 if (!
Level.has_value())
1644 "invalid optimization level for expand-fp pass: %s",
1645 Digit.str().c_str());
1652 if (Params.
empty() || Params ==
"all")
1653 return RAGreedyPass::Options();
1657 return RAGreedyPass::Options{*
Filter, Params};
1660 formatv(
"invalid regallocgreedy register filter '{}'", Params).str(),
1666 "MachineSinkingPass");
1670 bool AllowTailMerge =
true;
1671 if (!Params.
empty()) {
1673 if (Params !=
"tail-merge")
1675 formatv(
"invalid MachineBlockPlacementPass parameter '{}'", Params)
1679 return AllowTailMerge;
1683 bool ClearVirtRegs =
true;
1684 if (!Params.
empty()) {
1686 if (Params !=
"clear-vregs")
1688 formatv(
"invalid VirtRegRewriter pass parameter '{}'", Params).str(),
1691 return ClearVirtRegs;
1694struct FatLTOOptions {
1695 OptimizationLevel OptLevel;
1696 bool ThinLTO =
false;
1697 bool EmitSummary =
false;
1702 bool HaveOptLevel =
false;
1703 while (!Params.
empty()) {
1705 std::tie(ParamName, Params) = Params.
split(
';');
1707 if (ParamName ==
"thinlto") {
1709 }
else if (ParamName ==
"emit-summary") {
1710 Result.EmitSummary =
true;
1711 }
else if (std::optional<OptimizationLevel> OptLevel =
1713 Result.OptLevel = *OptLevel;
1714 HaveOptLevel =
true;
1717 formatv(
"invalid fatlto-pre-link pass parameter '{}'", ParamName)
1724 "missing optimization level for fatlto-pre-link pipeline",
1739template <
typename PassManagerT,
typename CallbacksT>
1741 if (!Callbacks.empty()) {
1742 PassManagerT DummyPM;
1743 for (
auto &CB : Callbacks)
1744 if (CB(Name, DummyPM, {}))
1750template <
typename CallbacksT>
1752 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1755 if (Name ==
"module")
1757 if (Name ==
"cgscc")
1759 if (NameNoBracket ==
"function")
1761 if (Name ==
"coro-cond")
1764#define MODULE_PASS(NAME, CREATE_PASS) \
1767#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1768 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1770#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1771 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1773#include "PassRegistry.def"
1778template <
typename CallbacksT>
1781 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1782 if (Name ==
"cgscc")
1784 if (NameNoBracket ==
"function")
1791#define CGSCC_PASS(NAME, CREATE_PASS) \
1794#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1795 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1797#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1798 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1800#include "PassRegistry.def"
1805template <
typename CallbacksT>
1808 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1809 if (NameNoBracket ==
"function")
1811 if (Name ==
"loop" || Name ==
"loop-mssa" || Name ==
"machine-function")
1814#define FUNCTION_PASS(NAME, CREATE_PASS) \
1817#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1818 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1820#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1821 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1823#include "PassRegistry.def"
1828template <
typename CallbacksT>
1831 if (Name ==
"machine-function")
1834#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
1837#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
1839 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1842#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1843 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1846#include "llvm/Passes/MachinePassRegistry.def"
1851template <
typename CallbacksT>
1853 bool &UseMemorySSA) {
1854 UseMemorySSA =
false;
1857 UseMemorySSA =
true;
1861#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1864#include "PassRegistry.def"
1869template <
typename CallbacksT>
1871 bool &UseMemorySSA) {
1872 UseMemorySSA =
false;
1875 UseMemorySSA =
true;
1879#define LOOP_PASS(NAME, CREATE_PASS) \
1882#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1883 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1885#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1886 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1888#include "PassRegistry.def"
1893std::optional<std::vector<PassBuilder::PipelineElement>>
1894PassBuilder::parsePipelineText(
StringRef Text) {
1895 std::vector<PipelineElement> ResultPipeline;
1900 std::vector<PipelineElement> &Pipeline = *PipelineStack.
back();
1901 size_t Pos =
Text.find_first_of(
",()");
1902 Pipeline.push_back({
Text.substr(0, Pos), {}});
1905 if (Pos ==
Text.npos)
1908 char Sep =
Text[Pos];
1916 PipelineStack.
push_back(&Pipeline.back().InnerPipeline);
1920 assert(Sep ==
')' &&
"Bogus separator!");
1925 if (PipelineStack.
size() == 1)
1926 return std::nullopt;
1929 }
while (
Text.consume_front(
")"));
1937 if (!
Text.consume_front(
","))
1938 return std::nullopt;
1941 if (PipelineStack.
size() > 1)
1943 return std::nullopt;
1945 assert(PipelineStack.
back() == &ResultPipeline &&
1946 "Wrong pipeline at the bottom of the stack!");
1947 return {std::move(ResultPipeline)};
1960 const PipelineElement &
E) {
1961 auto &
Name =
E.Name;
1962 auto &InnerPipeline =
E.InnerPipeline;
1965 if (!InnerPipeline.empty()) {
1966 if (Name ==
"module") {
1968 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1970 MPM.
addPass(std::move(NestedMPM));
1973 if (Name ==
"coro-cond") {
1975 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1977 MPM.
addPass(CoroConditionalWrapper(std::move(NestedMPM)));
1980 if (Name ==
"cgscc") {
1982 if (
auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
1990 "cannot have a no-rerun module to function adaptor",
1993 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2000 for (
auto &
C : ModulePipelineParsingCallbacks)
2001 if (
C(Name, MPM, InnerPipeline))
2006 formatv(
"invalid use of '{}' pass as module pipeline", Name).str(),
2012#define MODULE_PASS(NAME, CREATE_PASS) \
2013 if (Name == NAME) { \
2014 MPM.addPass(CREATE_PASS); \
2015 return Error::success(); \
2017#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2018 if (checkParametrizedPassName(Name, NAME)) { \
2019 auto Params = parsePassParameters(PARSER, Name, NAME); \
2021 return Params.takeError(); \
2022 MPM.addPass(CREATE_PASS(Params.get())); \
2023 return Error::success(); \
2025#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
2026 if (Name == "require<" NAME ">") { \
2028 RequireAnalysisPass< \
2029 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
2030 return Error::success(); \
2032 if (Name == "invalidate<" NAME ">") { \
2033 MPM.addPass(InvalidateAnalysisPass< \
2034 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2035 return Error::success(); \
2037#define CGSCC_PASS(NAME, CREATE_PASS) \
2038 if (Name == NAME) { \
2039 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
2040 return Error::success(); \
2042#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2043 if (checkParametrizedPassName(Name, NAME)) { \
2044 auto Params = parsePassParameters(PARSER, Name, NAME); \
2046 return Params.takeError(); \
2048 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
2049 return Error::success(); \
2051#define FUNCTION_PASS(NAME, CREATE_PASS) \
2052 if (Name == NAME) { \
2053 if constexpr (std::is_constructible_v< \
2054 std::remove_reference_t<decltype(CREATE_PASS)>, \
2055 const TargetMachine &>) { \
2057 return make_error<StringError>( \
2058 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2059 inconvertibleErrorCode()); \
2061 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
2062 return Error::success(); \
2064#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2065 if (checkParametrizedPassName(Name, NAME)) { \
2066 auto Params = parsePassParameters(PARSER, Name, NAME); \
2068 return Params.takeError(); \
2069 auto CreatePass = CREATE_PASS; \
2070 if constexpr (std::is_constructible_v< \
2071 std::remove_reference_t<decltype(CreatePass( \
2073 const TargetMachine &, \
2074 std::remove_reference_t<decltype(Params.get())>>) { \
2076 return make_error<StringError>( \
2077 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2078 inconvertibleErrorCode()); \
2081 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2082 return Error::success(); \
2084#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2085 if (Name == NAME) { \
2086 MPM.addPass(createModuleToFunctionPassAdaptor( \
2087 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2088 return Error::success(); \
2090#define LOOP_PASS(NAME, CREATE_PASS) \
2091 if (Name == NAME) { \
2092 MPM.addPass(createModuleToFunctionPassAdaptor( \
2093 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2094 return Error::success(); \
2096#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2097 if (checkParametrizedPassName(Name, NAME)) { \
2098 auto Params = parsePassParameters(PARSER, Name, NAME); \
2100 return Params.takeError(); \
2101 MPM.addPass(createModuleToFunctionPassAdaptor( \
2102 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2103 return Error::success(); \
2105#include "PassRegistry.def"
2107 for (
auto &
C : ModulePipelineParsingCallbacks)
2108 if (
C(Name, MPM, InnerPipeline))
2111 formatv(
"unknown module pass '{}'", Name).str(),
2116 const PipelineElement &
E) {
2117 auto &
Name =
E.Name;
2118 auto &InnerPipeline =
E.InnerPipeline;
2121 if (!InnerPipeline.empty()) {
2122 if (Name ==
"cgscc") {
2124 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2127 CGPM.
addPass(std::move(NestedCGPM));
2132 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2136 std::move(FPM), Params->first, Params->second));
2141 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2148 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2149 if (
C(Name, CGPM, InnerPipeline))
2154 formatv(
"invalid use of '{}' pass as cgscc pipeline", Name).str(),
2159#define CGSCC_PASS(NAME, CREATE_PASS) \
2160 if (Name == NAME) { \
2161 CGPM.addPass(CREATE_PASS); \
2162 return Error::success(); \
2164#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2165 if (checkParametrizedPassName(Name, NAME)) { \
2166 auto Params = parsePassParameters(PARSER, Name, NAME); \
2168 return Params.takeError(); \
2169 CGPM.addPass(CREATE_PASS(Params.get())); \
2170 return Error::success(); \
2172#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
2173 if (Name == "require<" NAME ">") { \
2174 CGPM.addPass(RequireAnalysisPass< \
2175 std::remove_reference_t<decltype(CREATE_PASS)>, \
2176 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
2177 CGSCCUpdateResult &>()); \
2178 return Error::success(); \
2180 if (Name == "invalidate<" NAME ">") { \
2181 CGPM.addPass(InvalidateAnalysisPass< \
2182 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2183 return Error::success(); \
2185#define FUNCTION_PASS(NAME, CREATE_PASS) \
2186 if (Name == NAME) { \
2187 if constexpr (std::is_constructible_v< \
2188 std::remove_reference_t<decltype(CREATE_PASS)>, \
2189 const TargetMachine &>) { \
2191 return make_error<StringError>( \
2192 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2193 inconvertibleErrorCode()); \
2195 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
2196 return Error::success(); \
2198#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2199 if (checkParametrizedPassName(Name, NAME)) { \
2200 auto Params = parsePassParameters(PARSER, Name, NAME); \
2202 return Params.takeError(); \
2203 auto CreatePass = CREATE_PASS; \
2204 if constexpr (std::is_constructible_v< \
2205 std::remove_reference_t<decltype(CreatePass( \
2207 const TargetMachine &, \
2208 std::remove_reference_t<decltype(Params.get())>>) { \
2210 return make_error<StringError>( \
2211 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2212 inconvertibleErrorCode()); \
2215 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2216 return Error::success(); \
2218#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2219 if (Name == NAME) { \
2220 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2221 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2222 return Error::success(); \
2224#define LOOP_PASS(NAME, CREATE_PASS) \
2225 if (Name == NAME) { \
2226 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2227 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2228 return Error::success(); \
2230#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2231 if (checkParametrizedPassName(Name, NAME)) { \
2232 auto Params = parsePassParameters(PARSER, Name, NAME); \
2234 return Params.takeError(); \
2235 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2236 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2237 return Error::success(); \
2239#include "PassRegistry.def"
2241 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2242 if (
C(Name, CGPM, InnerPipeline))
2249 const PipelineElement &
E) {
2250 auto &
Name =
E.Name;
2251 auto &InnerPipeline =
E.InnerPipeline;
2254 if (!InnerPipeline.empty()) {
2255 if (Name ==
"function") {
2257 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
2260 FPM.
addPass(std::move(NestedFPM));
2263 if (Name ==
"loop" || Name ==
"loop-mssa") {
2265 if (
auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
2268 bool UseMemorySSA = (
Name ==
"loop-mssa");
2273 if (Name ==
"machine-function") {
2275 if (
auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
2281 for (
auto &
C : FunctionPipelineParsingCallbacks)
2282 if (
C(Name, FPM, InnerPipeline))
2287 formatv(
"invalid use of '{}' pass as function pipeline", Name).str(),
2292#define FUNCTION_PASS(NAME, CREATE_PASS) \
2293 if (Name == NAME) { \
2294 if constexpr (std::is_constructible_v< \
2295 std::remove_reference_t<decltype(CREATE_PASS)>, \
2296 const TargetMachine &>) { \
2298 return make_error<StringError>( \
2299 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2300 inconvertibleErrorCode()); \
2302 FPM.addPass(CREATE_PASS); \
2303 return Error::success(); \
2305#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2306 if (checkParametrizedPassName(Name, NAME)) { \
2307 auto Params = parsePassParameters(PARSER, Name, NAME); \
2309 return Params.takeError(); \
2310 auto CreatePass = CREATE_PASS; \
2311 if constexpr (std::is_constructible_v< \
2312 std::remove_reference_t<decltype(CreatePass( \
2314 const TargetMachine &, \
2315 std::remove_reference_t<decltype(Params.get())>>) { \
2317 return make_error<StringError>( \
2318 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2319 inconvertibleErrorCode()); \
2322 FPM.addPass(CREATE_PASS(Params.get())); \
2323 return Error::success(); \
2325#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2326 if (Name == "require<" NAME ">") { \
2327 if constexpr (std::is_constructible_v< \
2328 std::remove_reference_t<decltype(CREATE_PASS)>, \
2329 const TargetMachine &>) { \
2331 return make_error<StringError>( \
2332 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2333 inconvertibleErrorCode()); \
2336 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2338 return Error::success(); \
2340 if (Name == "invalidate<" NAME ">") { \
2341 FPM.addPass(InvalidateAnalysisPass< \
2342 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2343 return Error::success(); \
2349#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2350 if (Name == NAME) { \
2351 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2352 return Error::success(); \
2354#define LOOP_PASS(NAME, CREATE_PASS) \
2355 if (Name == NAME) { \
2356 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2357 return Error::success(); \
2359#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2360 if (checkParametrizedPassName(Name, NAME)) { \
2361 auto Params = parsePassParameters(PARSER, Name, NAME); \
2363 return Params.takeError(); \
2365 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false)); \
2366 return Error::success(); \
2368#include "PassRegistry.def"
2370 for (
auto &
C : FunctionPipelineParsingCallbacks)
2371 if (
C(Name, FPM, InnerPipeline))
2374 formatv(
"unknown function pass '{}'", Name).str(),
2379 const PipelineElement &
E) {
2380 StringRef
Name =
E.Name;
2381 auto &InnerPipeline =
E.InnerPipeline;
2384 if (!InnerPipeline.empty()) {
2385 if (Name ==
"loop") {
2387 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
2390 LPM.addPass(std::move(NestedLPM));
2394 for (
auto &
C : LoopPipelineParsingCallbacks)
2395 if (
C(Name, LPM, InnerPipeline))
2400 formatv(
"invalid use of '{}' pass as loop pipeline", Name).str(),
2405#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2406 if (Name == NAME) { \
2407 LPM.addPass(CREATE_PASS); \
2408 return Error::success(); \
2410#define LOOP_PASS(NAME, CREATE_PASS) \
2411 if (Name == NAME) { \
2412 LPM.addPass(CREATE_PASS); \
2413 return Error::success(); \
2415#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2416 if (checkParametrizedPassName(Name, NAME)) { \
2417 auto Params = parsePassParameters(PARSER, Name, NAME); \
2419 return Params.takeError(); \
2420 LPM.addPass(CREATE_PASS(Params.get())); \
2421 return Error::success(); \
2423#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
2424 if (Name == "require<" NAME ">") { \
2425 LPM.addPass(RequireAnalysisPass< \
2426 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
2427 LoopAnalysisManager, LoopStandardAnalysisResults &, \
2429 return Error::success(); \
2431 if (Name == "invalidate<" NAME ">") { \
2432 LPM.addPass(InvalidateAnalysisPass< \
2433 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2434 return Error::success(); \
2436#include "PassRegistry.def"
2438 for (
auto &
C : LoopPipelineParsingCallbacks)
2439 if (
C(Name, LPM, InnerPipeline))
2446 const PipelineElement &
E) {
2447 StringRef
Name =
E.Name;
2449 if (!
E.InnerPipeline.empty()) {
2450 if (
E.Name ==
"machine-function") {
2452 if (
auto Err = parseMachinePassPipeline(NestedPM,
E.InnerPipeline))
2454 MFPM.
addPass(std::move(NestedPM));
2461#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) \
2462 if (Name == NAME) { \
2463 MFPM.addPass(CREATE_PASS); \
2464 return Error::success(); \
2466#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
2467 if (Name == NAME) { \
2468 MFPM.addPass(CREATE_PASS); \
2469 return Error::success(); \
2471#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
2473 if (checkParametrizedPassName(Name, NAME)) { \
2474 auto Params = parsePassParameters(PARSER, Name, NAME); \
2476 return Params.takeError(); \
2477 MFPM.addPass(CREATE_PASS(Params.get())); \
2478 return Error::success(); \
2480#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2481 if (Name == "require<" NAME ">") { \
2483 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2484 MachineFunction>()); \
2485 return Error::success(); \
2487 if (Name == "invalidate<" NAME ">") { \
2488 MFPM.addPass(InvalidateAnalysisPass< \
2489 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2490 return Error::success(); \
2492#include "llvm/Passes/MachinePassRegistry.def"
2494 for (
auto &
C : MachineFunctionPipelineParsingCallbacks)
2495 if (
C(Name, MFPM,
E.InnerPipeline))
2498 formatv(
"unknown machine pass '{}'", Name).str(),
2503#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2504 if (Name == NAME) { \
2505 AA.registerModuleAnalysis< \
2506 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2509#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2510 if (Name == NAME) { \
2511 AA.registerFunctionAnalysis< \
2512 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2515#include "PassRegistry.def"
2517 for (
auto &
C : AAParsingCallbacks)
2523Error PassBuilder::parseMachinePassPipeline(
2525 for (
const auto &Element : Pipeline) {
2526 if (
auto Err = parseMachinePass(MFPM, Element))
2534 for (
const auto &Element : Pipeline) {
2535 if (
auto Err = parseLoopPass(LPM, Element))
2541Error PassBuilder::parseFunctionPassPipeline(
2543 for (
const auto &Element : Pipeline) {
2544 if (
auto Err = parseFunctionPass(FPM, Element))
2552 for (
const auto &Element : Pipeline) {
2553 if (
auto Err = parseCGSCCPass(CGPM, Element))
2585 for (
const auto &Element : Pipeline) {
2586 if (
auto Err = parseModulePass(MPM, Element))
2597 auto Pipeline = parsePipelineText(PipelineText);
2598 if (!Pipeline || Pipeline->empty())
2600 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2610 Pipeline = {{
"cgscc", std::move(*Pipeline)}};
2612 FunctionPipelineParsingCallbacks)) {
2613 Pipeline = {{
"function", std::move(*Pipeline)}};
2616 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2617 std::move(*Pipeline)}}}};
2618 }
else if (
isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
2620 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2621 std::move(*Pipeline)}}}};
2623 FirstName, MachineFunctionPipelineParsingCallbacks)) {
2624 Pipeline = {{
"function", {{
"machine-function", std::move(*Pipeline)}}}};
2626 for (
auto &
C : TopLevelPipelineParsingCallbacks)
2627 if (
C(MPM, *Pipeline))
2631 auto &InnerPipeline = Pipeline->front().InnerPipeline;
2633 formatv(
"unknown {} name '{}'",
2634 (InnerPipeline.empty() ?
"pass" :
"pipeline"), FirstName)
2640 if (
auto Err = parseModulePassPipeline(MPM, *Pipeline))
2648 auto Pipeline = parsePipelineText(PipelineText);
2649 if (!Pipeline || Pipeline->empty())
2651 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2657 formatv(
"unknown cgscc pass '{}' in pipeline '{}'", FirstName,
2662 if (
auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
2671 auto Pipeline = parsePipelineText(PipelineText);
2672 if (!Pipeline || Pipeline->empty())
2674 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2680 formatv(
"unknown function pass '{}' in pipeline '{}'", FirstName,
2685 if (
auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2693 auto Pipeline = parsePipelineText(PipelineText);
2694 if (!Pipeline || Pipeline->empty())
2696 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2699 if (
auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2707 auto Pipeline = parsePipelineText(PipelineText);
2708 if (!Pipeline || Pipeline->empty())
2710 formatv(
"invalid machine pass pipeline '{}'", PipelineText).str(),
2713 if (
auto Err = parseMachinePassPipeline(MFPM, *Pipeline))
2722 if (PipelineText ==
"default") {
2727 while (!PipelineText.
empty()) {
2729 std::tie(Name, PipelineText) = PipelineText.
split(
',');
2730 if (!parseAAPassName(
AA, Name))
2732 formatv(
"unknown alias analysis name '{}'", Name).str(),
2739std::optional<RegAllocFilterFunc>
2741 if (FilterName ==
"all")
2743 for (
auto &
C : RegClassFilterParsingCallbacks)
2744 if (
auto F =
C(FilterName))
2746 return std::nullopt;
2754 OS <<
" " <<
PassName <<
"<" << Params <<
">\n";
2760 OS <<
"Module passes:\n";
2761#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2762#include "PassRegistry.def"
2764 OS <<
"Module passes with params:\n";
2765#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2766 printPassName(NAME, PARAMS, OS);
2767#include "PassRegistry.def"
2769 OS <<
"Module analyses:\n";
2770#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2771#include "PassRegistry.def"
2773 OS <<
"Module alias analyses:\n";
2774#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2775#include "PassRegistry.def"
2777 OS <<
"CGSCC passes:\n";
2778#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2779#include "PassRegistry.def"
2781 OS <<
"CGSCC passes with params:\n";
2782#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2783 printPassName(NAME, PARAMS, OS);
2784#include "PassRegistry.def"
2786 OS <<
"CGSCC analyses:\n";
2787#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2788#include "PassRegistry.def"
2790 OS <<
"Function passes:\n";
2791#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2792#include "PassRegistry.def"
2794 OS <<
"Function passes with params:\n";
2795#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2796 printPassName(NAME, PARAMS, OS);
2797#include "PassRegistry.def"
2799 OS <<
"Function analyses:\n";
2800#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2801#include "PassRegistry.def"
2803 OS <<
"Function alias analyses:\n";
2804#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2805#include "PassRegistry.def"
2807 OS <<
"LoopNest passes:\n";
2808#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2809#include "PassRegistry.def"
2811 OS <<
"Loop passes:\n";
2812#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2813#include "PassRegistry.def"
2815 OS <<
"Loop passes with params:\n";
2816#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2817 printPassName(NAME, PARAMS, OS);
2818#include "PassRegistry.def"
2820 OS <<
"Loop analyses:\n";
2821#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2822#include "PassRegistry.def"
2824 OS <<
"Machine module passes (WIP):\n";
2825#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2826#include "llvm/Passes/MachinePassRegistry.def"
2828 OS <<
"Machine function passes (WIP):\n";
2829#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2830#include "llvm/Passes/MachinePassRegistry.def"
2832 OS <<
"Machine function analyses (WIP):\n";
2833#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2834#include "llvm/Passes/MachinePassRegistry.def"
2840 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.
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 ...
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.
Machine Check Debug Module
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
This pass performs merges of loads and stores on both sides of a.
This is the interface to build a ModuleSummaryIndex for a module.
Contains a collection of routines for determining if a given instruction is guaranteed to execute if ...
This file provides the interface for LLVM's Global Value Numbering pass.
This file declares a simple ARC-aware AliasAnalysis using special knowledge of Objective C to enhance...
This header enumerates the LLVM-provided high-level optimization levels.
This file provides the interface for IR based instrumentation passes ( (profile-gen,...
CGSCCAnalysisManager CGAM
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
static bool isModulePassName(StringRef Name, CallbacksT &Callbacks)
static bool callbacksAcceptPassName(StringRef Name, CallbacksT &Callbacks)
Tests whether registered callbacks will accept a given pass name.
static std::optional< int > parseDevirtPassName(StringRef Name)
static bool isLoopNestPassName(StringRef Name, CallbacksT &Callbacks, bool &UseMemorySSA)
static bool isMachineFunctionPassName(StringRef Name, CallbacksT &Callbacks)
static Expected< OptimizationLevel > parseOptLevelParam(StringRef S)
static std::optional< OptimizationLevel > parseOptLevel(StringRef S)
static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks, bool &UseMemorySSA)
static std::optional< std::pair< bool, bool > > parseFunctionPipelineName(StringRef Name)
static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks)
static void printPassName(StringRef PassName, raw_ostream &OS)
static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks)
static void setupOptionsForPipelineAlias(PipelineTuningOptions &PTO, OptimizationLevel L)
This file implements the PredicateInfo analysis, which creates an Extended SSA form for operations us...
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
This pass is required to take advantage of the interprocedural register allocation infrastructure.
This file implements relative lookup table converter that converts lookup tables to relative lookup t...
This file provides the interface for LLVM's Scalar Replacement of Aggregates pass.
This file provides the interface for the pseudo probe implementation for AutoFDO.
This file provides the interface for the sampled PGO loader pass.
This is the interface for a SCEV-based alias analysis.
This pass converts vector operations into scalar operations (or, optionally, operations on smaller ve...
This is the interface for a metadata-based scoped no-alias analysis.
This file contains the declaration of the SelectOptimizePass class, its corresponding pass name is se...
This file provides the interface for the pass responsible for both simplifying and canonicalizing the...
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Target-Independent Code Generator Pass Configuration Options pass.
This is the interface for a metadata-based TBAA.
static const char PassName[]
A manager for alias analyses.
Class for arbitrary precision integers.
uint64_t getZExtValue() const
Get zero extended value.
int64_t getSExtValue() const
Get sign extended value.
bool registerPass(PassBuilderT &&PassBuilder)
Register an analysis pass with the manager.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
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...
A smart pointer to a reference-counted object that inherits from RefCountedBase or ThreadSafeRefCount...
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const MachineFunctionProperties & getProperties() const
Get the function properties.
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 void registerLoopAnalyses(LoopAnalysisManager &LAM)
Registers all available loop analysis passes.
LLVM_ABI std::optional< RegAllocFilterFunc > parseRegAllocFilter(StringRef RegAllocFilterName)
Parse RegAllocFilterName to get RegAllocFilterFunc.
LLVM_ABI void crossRegisterProxies(LoopAnalysisManager &LAM, FunctionAnalysisManager &FAM, CGSCCAnalysisManager &CGAM, ModuleAnalysisManager &MAM, MachineFunctionAnalysisManager *MFAM=nullptr)
Cross register the analysis managers through their proxies.
LLVM_ABI PassBuilder(TargetMachine *TM=nullptr, PipelineTuningOptions PTO=PipelineTuningOptions(), std::optional< PGOOptions > PGOOpt=std::nullopt, PassInstrumentationCallbacks *PIC=nullptr, IntrusiveRefCntPtr< vfs::FileSystem > FS=vfs::getRealFileSystem())
LLVM_ABI Error parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText)
Parse a textual pass pipeline description into a ModulePassManager.
void registerPipelineParsingCallback(const std::function< bool(StringRef Name, CGSCCPassManager &, ArrayRef< PipelineElement >)> &C)
{{@ Register pipeline parsing callbacks with this pass builder instance.
LLVM_ABI void registerModuleAnalyses(ModuleAnalysisManager &MAM)
Registers all available module analysis passes.
LLVM_ABI void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM)
Registers all available CGSCC analysis passes.
static LLVM_ABI Expected< bool > parseSinglePassOption(StringRef Params, StringRef OptionName, StringRef PassName)
Handle passes only accept one bool-valued parameter.
LLVM_ABI void registerMachineFunctionAnalyses(MachineFunctionAnalysisManager &MFAM)
Registers all available machine function analysis passes.
LLVM_ABI void registerParseTopLevelPipelineCallback(const std::function< bool(ModulePassManager &, ArrayRef< PipelineElement >)> &C)
Register a callback for a top-level pipeline entry.
LLVM_ABI void registerFunctionAnalyses(FunctionAnalysisManager &FAM)
Registers all available function analysis passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
Tunable parameters for passes in the default pipelines.
bool SLPVectorization
Tuning option to enable/disable slp loop vectorization, set based on opt level.
bool LoopVectorization
Tuning option to enable/disable loop vectorization, set based on opt level.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
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.
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
Interfaces for registering analysis passes, producing common pass manager configurations,...
Abstract Attribute helper functions.
@ C
The default llvm calling convention, compatible with C.
std::optional< CodeGenOptLevel > getLevel(int OL)
Get the Level identified by the integer OL.
@ BasicBlock
Various leaf nodes.
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
This is an optimization pass for GlobalISel generic memory operations.
OuterAnalysisManagerProxy< CGSCCAnalysisManager, Function > CGSCCAnalysisManagerFunctionProxy
A proxy from a CGSCCAnalysisManager to a Function.
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
DevirtSCCRepeatedPass createDevirtSCCRepeatedPass(CGSCCPassT &&Pass, int MaxIterations)
A function to deduce a function pass type and wrap it in the templated adaptor.
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
InnerAnalysisManagerProxy< LoopAnalysisManager, Function > LoopAnalysisManagerFunctionProxy
A proxy from a LoopAnalysisManager to a Function.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
PassManager< LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, CGSCCUpdateResult & > CGSCCPassManager
The CGSCC pass manager.
AnalysisManager< LazyCallGraph::SCC, LazyCallGraph & > CGSCCAnalysisManager
The CGSCC analysis manager.
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
PassManager< Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, LPMUpdater & > LoopPassManager
The Loop pass manager.
ModuleToPostOrderCGSCCPassAdaptor createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
LLVM_ABI cl::opt< bool > PrintPipelinePasses
Common option used by multiple tools to print pipeline passes.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
FunctionToLoopPassAdaptor createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA=false)
A function to deduce a loop pass type and wrap it in the templated adaptor.
CGSCCToFunctionPassAdaptor createCGSCCToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false, bool NoRerun=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
FunctionToMachineFunctionPassAdaptor createFunctionToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass)
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
FunctionAddr VTableAddr Count
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
InnerAnalysisManagerProxy< MachineFunctionAnalysisManager, Function > MachineFunctionAnalysisManagerFunctionProxy
OuterAnalysisManagerProxy< FunctionAnalysisManager, Loop, LoopStandardAnalysisResults & > FunctionAnalysisManagerLoopProxy
A proxy from a FunctionAnalysisManager to a Loop.
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
OuterAnalysisManagerProxy< ModuleAnalysisManager, LazyCallGraph::SCC, LazyCallGraph & > ModuleAnalysisManagerCGSCCProxy
A proxy from a ModuleAnalysisManager to an SCC.
InnerAnalysisManagerProxy< MachineFunctionAnalysisManager, Module > MachineFunctionAnalysisManagerModuleProxy
InnerAnalysisManagerProxy< CGSCCAnalysisManager, Module > CGSCCAnalysisManagerModuleProxy
A proxy from a CGSCCAnalysisManager to a Module.
PassManager< Function > FunctionPassManager
Convenience typedef for a pass manager over functions.
MFPropsModifier(PassT &P, MachineFunction &MF) -> MFPropsModifier< PassT >
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
PassManager< MachineFunction > MachineFunctionPassManager
Convenience typedef for a pass manager over functions.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI std::optional< AllocTokenMode > getAllocTokenModeFromString(StringRef Name)
Returns the AllocTokenMode from its canonical string name; if an invalid name was provided returns nu...
@ Detailed
Hash with opcode only.
@ CallTargetIgnored
Hash with opcode and operands.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Implement std::hash so that hash_code can be used in STL containers.
A special type used by analysis passes to provide an address that identifies that particular analysis...
A set of parameters to control various transforms performed by GVN pass.
HardwareLoopOptions & setForceNested(bool Force)
HardwareLoopOptions & setDecrement(unsigned Count)
HardwareLoopOptions & setForceGuard(bool Force)
HardwareLoopOptions & setForce(bool Force)
HardwareLoopOptions & setCounterBitwidth(unsigned Width)
HardwareLoopOptions & setForcePhi(bool Force)
A set of parameters to control various transforms performed by IPSCCP pass.
A set of parameters used to control various transforms performed by the LoopUnroll pass.
LoopUnrollOptions & setPeeling(bool Peeling)
Enables or disables loop peeling.
LoopUnrollOptions & setOptLevel(int O)
LoopUnrollOptions & setPartial(bool Partial)
Enables or disables partial unrolling.
LoopUnrollOptions & setFullUnrollMaxCount(unsigned O)
LoopUnrollOptions & setUpperBound(bool UpperBound)
Enables or disables the use of trip count upper bound in loop unrolling.
LoopUnrollOptions & setRuntime(bool Runtime)
Enables or disables unrolling of loops with runtime trip count.
LoopUnrollOptions & setProfileBasedPeeling(int O)
LoopVectorizeOptions & setVectorizeOnlyWhenForced(bool Value)
LoopVectorizeOptions & setInterleaveOnlyWhenForced(bool Value)
A CRTP mix-in to automatically provide informational APIs needed for passes.
RegAllocFilterFunc Filter