392 "print-pipeline-passes",
393 cl::desc(
"Print a '-passes' compatible string describing the pipeline "
394 "(best-effort only)."));
405class TriggerCrashModulePass :
public PassInfoMixin<TriggerCrashModulePass> {
411 static StringRef
name() {
return "TriggerCrashModulePass"; }
414class TriggerCrashFunctionPass
421 static StringRef
name() {
return "TriggerCrashFunctionPass"; }
426class TriggerVerifierErrorPass
432 auto *PtrTy = PointerType::getUnqual(
M.getContext());
434 GlobalValue::LinkageTypes::InternalLinkage,
435 "__bad_alias",
nullptr, &M);
455 static StringRef
name() {
return "TriggerVerifierErrorPass"; }
460class RequireAllMachineFunctionPropertiesPass
461 :
public PassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
468 static MachineFunctionProperties getRequiredProperties() {
469 return MachineFunctionProperties()
471 .setFailsVerification()
476 .setRegBankSelected()
478 .setTiedOpsRewritten()
479 .setTracksDebugUserValues()
480 .setTracksLiveness();
482 static StringRef
name() {
return "RequireAllMachineFunctionPropertiesPass"; }
499 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(S);
503 formatv(
"invalid optimization level '{}'", S).str(),
508 std::optional<PGOOptions> PGOOpt,
511 : TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC), FS(
std::
move(FS)) {
513 TM->registerPassBuilderCallbacks(*
this);
515 PIC->registerClassToPassNameCallback([
this, PIC]() {
519#define MODULE_PASS(NAME, CREATE_PASS) \
520 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
521#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
522 PIC->addClassToPassName(CLASS, NAME);
523#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
524 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
525#define FUNCTION_PASS(NAME, CREATE_PASS) \
526 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
527#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
528 PIC->addClassToPassName(CLASS, NAME);
529#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
530 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
531#define LOOPNEST_PASS(NAME, CREATE_PASS) \
532 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
533#define LOOP_PASS(NAME, CREATE_PASS) \
534 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
535#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
536 PIC->addClassToPassName(CLASS, NAME);
537#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
538 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
539#define CGSCC_PASS(NAME, CREATE_PASS) \
540 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
541#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
542 PIC->addClassToPassName(CLASS, NAME);
543#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
544 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
545#include "PassRegistry.def"
547#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
548 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
549#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
550 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
551#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
553 PIC->addClassToPassName(CLASS, NAME);
554#include "llvm/Passes/MachinePassRegistry.def"
562#define MODULE_CALLBACK(NAME, INVOKE) \
563 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
564 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
566 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
569 INVOKE(PM, L.get()); \
572#include "PassRegistry.def"
580#define MODULE_LTO_CALLBACK(NAME, INVOKE) \
581 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
582 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
584 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
587 INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \
590#include "PassRegistry.def"
598#define FUNCTION_CALLBACK(NAME, INVOKE) \
599 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
600 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
602 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
605 INVOKE(PM, L.get()); \
608#include "PassRegistry.def"
616#define CGSCC_CALLBACK(NAME, INVOKE) \
617 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
618 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
620 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
623 INVOKE(PM, L.get()); \
626#include "PassRegistry.def"
634#define LOOP_CALLBACK(NAME, INVOKE) \
635 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
636 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
638 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
641 INVOKE(PM, L.get()); \
644#include "PassRegistry.def"
650#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
651 MAM.registerPass([&] { return CREATE_PASS; });
652#include "PassRegistry.def"
654 for (
auto &
C : ModuleAnalysisRegistrationCallbacks)
659#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
660 CGAM.registerPass([&] { return CREATE_PASS; });
661#include "PassRegistry.def"
663 for (
auto &
C : CGSCCAnalysisRegistrationCallbacks)
673#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
674 if constexpr (std::is_constructible_v< \
675 std::remove_reference_t<decltype(CREATE_PASS)>, \
676 const TargetMachine &>) { \
678 FAM.registerPass([&] { return CREATE_PASS; }); \
680 FAM.registerPass([&] { return CREATE_PASS; }); \
682#include "PassRegistry.def"
684 for (
auto &
C : FunctionAnalysisRegistrationCallbacks)
691#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
692 MFAM.registerPass([&] { return CREATE_PASS; });
693#include "llvm/Passes/MachinePassRegistry.def"
695 for (
auto &
C : MachineFunctionAnalysisRegistrationCallbacks)
700#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
701 LAM.registerPass([&] { return CREATE_PASS; });
702#include "PassRegistry.def"
704 for (
auto &
C : LoopAnalysisRegistrationCallbacks)
708static std::optional<std::pair<bool, bool>>
710 std::pair<bool, bool> Params;
711 if (!Name.consume_front(
"function"))
715 if (!Name.consume_front(
"<") || !Name.consume_back(
">"))
717 while (!Name.empty()) {
718 auto [Front, Back] = Name.split(
';');
720 if (Front ==
"eager-inv")
722 else if (Front ==
"no-rerun")
723 Params.second =
true;
731 if (!Name.consume_front(
"devirt<") || !Name.consume_back(
">"))
743 while (!Params.
empty()) {
745 std::tie(ParamName, Params) = Params.
split(
';');
747 if (ParamName == OptionName) {
764 while (!Params.
empty()) {
766 std::tie(ParamName, Params) = Params.
split(
';');
771 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
776 if (ParamName.
consume_front(
"hardware-loop-counter-bitwidth=")) {
780 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
785 if (ParamName ==
"force-hardware-loops") {
787 }
else if (ParamName ==
"force-hardware-loop-phi") {
789 }
else if (ParamName ==
"force-nested-hardware-loop") {
791 }
else if (ParamName ==
"force-hardware-loop-guard") {
795 formatv(
"invalid HardwarePass parameter '{}'", ParamName).str(),
799 return HardwareLoopOpts;
811 while (!Params.
empty()) {
813 std::tie(ParamName, Params) = Params.
split(
';');
814 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(ParamName);
816 if (OptLevel && !OptLevel->isOptimizingForSize()) {
817 UnrollOpts.
setOptLevel(OptLevel->getSpeedupLevel());
824 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
831 if (ParamName ==
"partial") {
833 }
else if (ParamName ==
"peeling") {
835 }
else if (ParamName ==
"profile-peeling") {
837 }
else if (ParamName ==
"runtime") {
839 }
else if (ParamName ==
"upperbound") {
843 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
852 Params,
"vfe-linkage-unit-visibility",
"GlobalDCE");
872 Params,
"skip-non-recursive-function-attrs",
"PostOrderFunctionAttrs");
882 formatv(
"too many CFGuardPass parameters '{}'", Params).str(),
885 if (Param ==
"check")
887 if (Param ==
"dispatch")
891 formatv(
"invalid CFGuardPass mechanism: '{}'", Param).str(),
901 "EntryExitInstrumenter");
906 "DropUnnecessaryAssumes");
915 "LowerMatrixIntrinsics");
920 while (!Params.
empty()) {
922 std::tie(ParamName, Params) = Params.
split(
';');
925 if (ParamName ==
"preserve-order")
927 else if (ParamName ==
"rename-all")
929 else if (ParamName ==
"fold-all")
931 else if (ParamName ==
"reorder-operands")
935 formatv(
"invalid normalize pass parameter '{}'", ParamName).str(),
945 while (!Params.
empty()) {
947 std::tie(ParamName, Params) = Params.
split(
';');
949 if (ParamName ==
"kernel") {
950 Result.CompileKernel =
true;
951 }
else if (ParamName ==
"use-after-scope") {
952 Result.UseAfterScope =
true;
955 formatv(
"invalid AddressSanitizer pass parameter '{}'", ParamName)
965 while (!Params.
empty()) {
967 std::tie(ParamName, Params) = Params.
split(
';');
969 if (ParamName ==
"recover") {
971 }
else if (ParamName ==
"kernel") {
972 Result.CompileKernel =
true;
975 formatv(
"invalid HWAddressSanitizer pass parameter '{}'", ParamName)
985 while (!Params.
empty()) {
987 std::tie(ParamName, Params) = Params.
split(
';');
989 if (ParamName ==
"thinlto") {
991 }
else if (ParamName ==
"emit-summary") {
992 Result.EmitLTOSummary =
true;
995 formatv(
"invalid EmbedBitcode pass parameter '{}'", ParamName).str(),
1003parseLowerAllowCheckPassOptions(
StringRef Params) {
1005 while (!Params.
empty()) {
1007 std::tie(ParamName, Params) = Params.
split(
';');
1018 std::tie(IndicesStr, CutoffStr) = ParamName.
split(
"]=");
1025 formatv(
"invalid LowerAllowCheck pass cutoffs parameter '{}' ({})",
1030 if (!IndicesStr.
consume_front(
"cutoffs[") || IndicesStr ==
"")
1032 formatv(
"invalid LowerAllowCheck pass index parameter '{}' ({})",
1033 IndicesStr, CutoffStr)
1037 while (IndicesStr !=
"") {
1039 std::tie(firstIndexStr, IndicesStr) = IndicesStr.
split(
'|');
1045 "invalid LowerAllowCheck pass index parameter '{}' ({}) {}",
1046 firstIndexStr, IndicesStr)
1053 if (index >=
Result.cutoffs.size())
1054 Result.cutoffs.resize(index + 1, 0);
1056 Result.cutoffs[index] = cutoff;
1058 }
else if (ParamName.
starts_with(
"runtime_check")) {
1060 std::tie(std::ignore, ValueString) = ParamName.
split(
"=");
1064 formatv(
"invalid LowerAllowCheck pass runtime_check parameter '{}' "
1066 ValueString, Params)
1070 Result.runtime_check = runtime_check;
1073 formatv(
"invalid LowerAllowCheck pass parameter '{}'", ParamName)
1084 while (!Params.
empty()) {
1086 std::tie(ParamName, Params) = Params.
split(
';');
1088 if (ParamName ==
"recover") {
1090 }
else if (ParamName ==
"kernel") {
1095 formatv(
"invalid argument to MemorySanitizer pass track-origins "
1100 }
else if (ParamName ==
"eager-checks") {
1101 Result.EagerChecks =
true;
1104 formatv(
"invalid MemorySanitizer pass parameter '{}'", ParamName)
1114 while (!Params.
empty()) {
1116 std::tie(ParamName, Params) = Params.
split(
';');
1123 formatv(
"invalid argument to AllocToken pass mode "
1130 formatv(
"invalid AllocToken pass parameter '{}'", ParamName).str(),
1140 while (!Params.
empty()) {
1142 std::tie(ParamName, Params) = Params.
split(
';');
1145 if (ParamName ==
"speculate-blocks") {
1147 }
else if (ParamName ==
"simplify-cond-branch") {
1149 }
else if (ParamName ==
"forward-switch-cond") {
1151 }
else if (ParamName ==
"switch-range-to-icmp") {
1153 }
else if (ParamName ==
"switch-to-arithmetic") {
1155 }
else if (ParamName ==
"switch-to-lookup") {
1157 }
else if (ParamName ==
"keep-loops") {
1159 }
else if (ParamName ==
"hoist-common-insts") {
1161 }
else if (ParamName ==
"hoist-loads-stores-with-cond-faulting") {
1163 }
else if (ParamName ==
"sink-common-insts") {
1165 }
else if (ParamName ==
"speculate-unpredictables") {
1168 APInt BonusInstThreshold;
1171 formatv(
"invalid argument to SimplifyCFG pass bonus-threshold "
1179 formatv(
"invalid SimplifyCFG pass parameter '{}'", ParamName).str(),
1190 Result.setVerifyFixpoint(
true);
1191 while (!Params.
empty()) {
1193 std::tie(ParamName, Params) = Params.
split(
';');
1196 if (ParamName ==
"verify-fixpoint") {
1199 APInt MaxIterations;
1202 formatv(
"invalid argument to InstCombine pass max-iterations "
1210 formatv(
"invalid InstCombine pass parameter '{}'", ParamName).str(),
1220 while (!Params.
empty()) {
1222 std::tie(ParamName, Params) = Params.
split(
';');
1225 if (ParamName ==
"interleave-forced-only") {
1227 }
else if (ParamName ==
"vectorize-forced-only") {
1231 formatv(
"invalid LoopVectorize parameter '{}'", ParamName).str(),
1239 std::pair<bool, bool>
Result = {
false,
true};
1240 while (!Params.
empty()) {
1242 std::tie(ParamName, Params) = Params.
split(
';');
1245 if (ParamName ==
"nontrivial") {
1247 }
else if (ParamName ==
"trivial") {
1251 formatv(
"invalid LoopUnswitch pass parameter '{}'", ParamName).str(),
1260 while (!Params.
empty()) {
1262 std::tie(ParamName, Params) = Params.
split(
';');
1265 if (ParamName ==
"allowspeculation") {
1269 formatv(
"invalid LICM pass parameter '{}'", ParamName).str(),
1277 std::pair<bool, bool>
Result = {
true,
false};
1278 while (!Params.
empty()) {
1280 std::tie(ParamName, Params) = Params.
split(
';');
1283 if (ParamName ==
"header-duplication") {
1285 }
else if (ParamName ==
"prepare-for-lto") {
1289 formatv(
"invalid LoopRotate pass parameter '{}'", ParamName).str(),
1298 while (!Params.
empty()) {
1300 std::tie(ParamName, Params) = Params.
split(
';');
1303 if (ParamName ==
"split-footer-bb") {
1307 formatv(
"invalid MergedLoadStoreMotion pass parameter '{}'",
1318 while (!Params.
empty()) {
1320 std::tie(ParamName, Params) = Params.
split(
';');
1323 if (ParamName ==
"pre") {
1325 }
else if (ParamName ==
"load-pre") {
1327 }
else if (ParamName ==
"split-backedge-load-pre") {
1329 }
else if (ParamName ==
"memdep") {
1333 }
else if (ParamName ==
"memoryssa") {
1339 formatv(
"invalid GVN pass parameter '{}'", ParamName).str(),
1348 while (!Params.
empty()) {
1350 std::tie(ParamName, Params) = Params.
split(
';');
1353 if (ParamName ==
"func-spec")
1357 formatv(
"invalid IPSCCP pass parameter '{}'", ParamName).str(),
1365 while (!Params.
empty()) {
1367 std::tie(ParamName, Params) = Params.
split(
';');
1372 formatv(
"invalid argument to Scalarizer pass min-bits "
1383 if (ParamName ==
"load-store")
1385 else if (ParamName ==
"variable-insert-extract")
1389 formatv(
"invalid Scalarizer pass parameter '{}'", ParamName).str(),
1398 if (Params.
empty() || Params ==
"modify-cfg")
1400 if (Params ==
"preserve-cfg")
1403 formatv(
"invalid SROA pass parameter '{}' (either preserve-cfg or "
1404 "modify-cfg can be specified)",
1411parseStackLifetimeOptions(
StringRef Params) {
1413 while (!Params.
empty()) {
1415 std::tie(ParamName, Params) = Params.
split(
';');
1417 if (ParamName ==
"may") {
1419 }
else if (ParamName ==
"must") {
1423 formatv(
"invalid StackLifetime parameter '{}'", ParamName).str(),
1432 "DependenceAnalysisPrinter");
1437 "SeparateConstOffsetFromGEP");
1446parseFunctionSimplificationPipelineOptions(
StringRef Params) {
1450 formatv(
"invalid function-simplification parameter '{}'", Params).str(),
1458 "MemorySSAPrinterPass");
1463 "SpeculativeExecutionPass");
1468 while (!Params.
empty()) {
1470 std::tie(ParamName, Params) = Params.
split(
';');
1476 formatv(
"invalid MemProfUse pass parameter '{}'", ParamName).str(),
1484parseStructuralHashPrinterPassOptions(
StringRef Params) {
1487 if (Params ==
"detailed")
1489 if (Params ==
"call-target-ignored")
1492 formatv(
"invalid structural hash printer parameter '{}'", Params).str(),
1498 "WinEHPreparePass");
1503 while (!Params.
empty()) {
1505 std::tie(ParamName, Params) = Params.
split(
';');
1508 if (ParamName ==
"group-by-use")
1510 else if (ParamName ==
"ignore-single-use")
1512 else if (ParamName ==
"merge-const")
1514 else if (ParamName ==
"merge-const-aggressive")
1516 else if (ParamName ==
"merge-external")
1521 formatv(
"invalid GlobalMergePass parameter '{}'", ParamName).str(),
1525 formatv(
"invalid global-merge pass parameter '{}'", Params).str(),
1534 while (!Params.
empty()) {
1536 std::tie(ParamName, Params) = Params.
split(
';');
1542 formatv(
"invalid Internalize pass parameter '{}'", ParamName).str(),
1553 while (!Params.
empty()) {
1555 std::tie(ParamName, Params) = Params.
split(
';');
1558 std::optional<RegAllocFilterFunc>
Filter =
1562 formatv(
"invalid regallocfast register filter '{}'", ParamName)
1571 if (ParamName ==
"no-clear-vregs") {
1577 formatv(
"invalid regallocfast pass parameter '{}'", ParamName).str(),
1584parseBoundsCheckingOptions(
StringRef Params) {
1586 while (!Params.
empty()) {
1588 std::tie(ParamName, Params) = Params.
split(
';');
1589 if (ParamName ==
"trap") {
1591 }
else if (ParamName ==
"rt") {
1597 }
else if (ParamName ==
"rt-abort") {
1603 }
else if (ParamName ==
"min-rt") {
1609 }
else if (ParamName ==
"min-rt-abort") {
1615 }
else if (ParamName ==
"merge") {
1617 }
else if (ParamName ==
"handler-preserve-all-regs") {
1619 Options.Rt->HandlerPreserveAllRegs =
true;
1623 std::tie(ParamEQ, Val) = ParamName.
split(
'=');
1629 formatv(
"invalid BoundsChecking pass parameter '{}'", ParamName)
1646 if (!
Prefix.empty() || Digit.getAsInteger(10,
N))
1648 Param.str().c_str());
1651 if (!
Level.has_value())
1653 "invalid optimization level for expand-ir-insts pass: %s",
1654 Digit.str().c_str());
1661 if (Params.
empty() || Params ==
"all")
1662 return RAGreedyPass::Options();
1666 return RAGreedyPass::Options{*
Filter, Params};
1669 formatv(
"invalid regallocgreedy register filter '{}'", Params).str(),
1675 "MachineSinkingPass");
1679 bool AllowTailMerge =
true;
1680 if (!Params.
empty()) {
1682 if (Params !=
"tail-merge")
1684 formatv(
"invalid MachineBlockPlacementPass parameter '{}'", Params)
1688 return AllowTailMerge;
1692 bool ClearVirtRegs =
true;
1693 if (!Params.
empty()) {
1695 if (Params !=
"clear-vregs")
1697 formatv(
"invalid VirtRegRewriter pass parameter '{}'", Params).str(),
1700 return ClearVirtRegs;
1703struct FatLTOOptions {
1704 OptimizationLevel OptLevel;
1705 bool ThinLTO =
false;
1706 bool EmitSummary =
false;
1711 bool HaveOptLevel =
false;
1712 while (!Params.
empty()) {
1714 std::tie(ParamName, Params) = Params.
split(
';');
1716 if (ParamName ==
"thinlto") {
1718 }
else if (ParamName ==
"emit-summary") {
1719 Result.EmitSummary =
true;
1720 }
else if (std::optional<OptimizationLevel> OptLevel =
1722 Result.OptLevel = *OptLevel;
1723 HaveOptLevel =
true;
1726 formatv(
"invalid fatlto-pre-link pass parameter '{}'", ParamName)
1733 "missing optimization level for fatlto-pre-link pipeline",
1748template <
typename PassManagerT,
typename CallbacksT>
1750 if (!Callbacks.empty()) {
1751 PassManagerT DummyPM;
1752 for (
auto &CB : Callbacks)
1753 if (CB(Name, DummyPM, {}))
1759template <
typename CallbacksT>
1761 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1764 if (Name ==
"module")
1766 if (Name ==
"cgscc")
1768 if (NameNoBracket ==
"function")
1770 if (Name ==
"coro-cond")
1773#define MODULE_PASS(NAME, CREATE_PASS) \
1776#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1777 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1779#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1780 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1782#include "PassRegistry.def"
1787template <
typename CallbacksT>
1790 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1791 if (Name ==
"cgscc")
1793 if (NameNoBracket ==
"function")
1800#define CGSCC_PASS(NAME, CREATE_PASS) \
1803#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1804 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1806#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1807 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1809#include "PassRegistry.def"
1814template <
typename CallbacksT>
1817 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1818 if (NameNoBracket ==
"function")
1820 if (Name ==
"loop" || Name ==
"loop-mssa" || Name ==
"machine-function")
1823#define FUNCTION_PASS(NAME, CREATE_PASS) \
1826#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1827 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1829#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1830 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1832#include "PassRegistry.def"
1837template <
typename CallbacksT>
1840 if (Name ==
"machine-function")
1843#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
1846#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
1848 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1851#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1852 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1855#include "llvm/Passes/MachinePassRegistry.def"
1860template <
typename CallbacksT>
1862 bool &UseMemorySSA) {
1863 UseMemorySSA =
false;
1866 UseMemorySSA =
true;
1870#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1873#include "PassRegistry.def"
1878template <
typename CallbacksT>
1880 bool &UseMemorySSA) {
1881 UseMemorySSA =
false;
1884 UseMemorySSA =
true;
1888#define LOOP_PASS(NAME, CREATE_PASS) \
1891#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1892 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1894#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1895 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1897#include "PassRegistry.def"
1902std::optional<std::vector<PassBuilder::PipelineElement>>
1903PassBuilder::parsePipelineText(
StringRef Text) {
1904 std::vector<PipelineElement> ResultPipeline;
1909 std::vector<PipelineElement> &Pipeline = *PipelineStack.
back();
1910 size_t Pos =
Text.find_first_of(
",()");
1911 Pipeline.push_back({
Text.substr(0, Pos), {}});
1914 if (Pos ==
Text.npos)
1917 char Sep =
Text[Pos];
1925 PipelineStack.
push_back(&Pipeline.back().InnerPipeline);
1929 assert(Sep ==
')' &&
"Bogus separator!");
1934 if (PipelineStack.
size() == 1)
1935 return std::nullopt;
1938 }
while (
Text.consume_front(
")"));
1946 if (!
Text.consume_front(
","))
1947 return std::nullopt;
1950 if (PipelineStack.
size() > 1)
1952 return std::nullopt;
1954 assert(PipelineStack.
back() == &ResultPipeline &&
1955 "Wrong pipeline at the bottom of the stack!");
1956 return {std::move(ResultPipeline)};
1969 const PipelineElement &
E) {
1970 auto &
Name =
E.Name;
1971 auto &InnerPipeline =
E.InnerPipeline;
1974 if (!InnerPipeline.empty()) {
1975 if (Name ==
"module") {
1977 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1979 MPM.
addPass(std::move(NestedMPM));
1982 if (Name ==
"coro-cond") {
1984 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1986 MPM.
addPass(CoroConditionalWrapper(std::move(NestedMPM)));
1989 if (Name ==
"cgscc") {
1991 if (
auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
1999 "cannot have a no-rerun module to function adaptor",
2002 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2009 for (
auto &
C : ModulePipelineParsingCallbacks)
2010 if (
C(Name, MPM, InnerPipeline))
2015 formatv(
"invalid use of '{}' pass as module pipeline", Name).str(),
2021#define MODULE_PASS(NAME, CREATE_PASS) \
2022 if (Name == NAME) { \
2023 MPM.addPass(CREATE_PASS); \
2024 return Error::success(); \
2026#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2027 if (checkParametrizedPassName(Name, NAME)) { \
2028 auto Params = parsePassParameters(PARSER, Name, NAME); \
2030 return Params.takeError(); \
2031 MPM.addPass(CREATE_PASS(Params.get())); \
2032 return Error::success(); \
2034#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
2035 if (Name == "require<" NAME ">") { \
2037 RequireAnalysisPass< \
2038 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
2039 return Error::success(); \
2041 if (Name == "invalidate<" NAME ">") { \
2042 MPM.addPass(InvalidateAnalysisPass< \
2043 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2044 return Error::success(); \
2046#define CGSCC_PASS(NAME, CREATE_PASS) \
2047 if (Name == NAME) { \
2048 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
2049 return Error::success(); \
2051#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2052 if (checkParametrizedPassName(Name, NAME)) { \
2053 auto Params = parsePassParameters(PARSER, Name, NAME); \
2055 return Params.takeError(); \
2057 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
2058 return Error::success(); \
2060#define FUNCTION_PASS(NAME, CREATE_PASS) \
2061 if (Name == NAME) { \
2062 if constexpr (std::is_constructible_v< \
2063 std::remove_reference_t<decltype(CREATE_PASS)>, \
2064 const TargetMachine &>) { \
2066 return make_error<StringError>( \
2067 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2068 inconvertibleErrorCode()); \
2070 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
2071 return Error::success(); \
2073#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2074 if (checkParametrizedPassName(Name, NAME)) { \
2075 auto Params = parsePassParameters(PARSER, Name, NAME); \
2077 return Params.takeError(); \
2078 auto CreatePass = CREATE_PASS; \
2079 if constexpr (std::is_constructible_v< \
2080 std::remove_reference_t<decltype(CreatePass( \
2082 const TargetMachine &, \
2083 std::remove_reference_t<decltype(Params.get())>>) { \
2085 return make_error<StringError>( \
2086 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2087 inconvertibleErrorCode()); \
2090 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2091 return Error::success(); \
2093#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2094 if (Name == NAME) { \
2095 MPM.addPass(createModuleToFunctionPassAdaptor( \
2096 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2097 return Error::success(); \
2099#define LOOP_PASS(NAME, CREATE_PASS) \
2100 if (Name == NAME) { \
2101 MPM.addPass(createModuleToFunctionPassAdaptor( \
2102 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2103 return Error::success(); \
2105#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2106 if (checkParametrizedPassName(Name, NAME)) { \
2107 auto Params = parsePassParameters(PARSER, Name, NAME); \
2109 return Params.takeError(); \
2110 MPM.addPass(createModuleToFunctionPassAdaptor( \
2111 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2112 return Error::success(); \
2114#include "PassRegistry.def"
2116 for (
auto &
C : ModulePipelineParsingCallbacks)
2117 if (
C(Name, MPM, InnerPipeline))
2120 formatv(
"unknown module pass '{}'", Name).str(),
2125 const PipelineElement &
E) {
2126 auto &
Name =
E.Name;
2127 auto &InnerPipeline =
E.InnerPipeline;
2130 if (!InnerPipeline.empty()) {
2131 if (Name ==
"cgscc") {
2133 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2136 CGPM.
addPass(std::move(NestedCGPM));
2141 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2145 std::move(FPM), Params->first, Params->second));
2150 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2157 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2158 if (
C(Name, CGPM, InnerPipeline))
2163 formatv(
"invalid use of '{}' pass as cgscc pipeline", Name).str(),
2168#define CGSCC_PASS(NAME, CREATE_PASS) \
2169 if (Name == NAME) { \
2170 CGPM.addPass(CREATE_PASS); \
2171 return Error::success(); \
2173#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2174 if (checkParametrizedPassName(Name, NAME)) { \
2175 auto Params = parsePassParameters(PARSER, Name, NAME); \
2177 return Params.takeError(); \
2178 CGPM.addPass(CREATE_PASS(Params.get())); \
2179 return Error::success(); \
2181#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
2182 if (Name == "require<" NAME ">") { \
2183 CGPM.addPass(RequireAnalysisPass< \
2184 std::remove_reference_t<decltype(CREATE_PASS)>, \
2185 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
2186 CGSCCUpdateResult &>()); \
2187 return Error::success(); \
2189 if (Name == "invalidate<" NAME ">") { \
2190 CGPM.addPass(InvalidateAnalysisPass< \
2191 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2192 return Error::success(); \
2194#define FUNCTION_PASS(NAME, CREATE_PASS) \
2195 if (Name == NAME) { \
2196 if constexpr (std::is_constructible_v< \
2197 std::remove_reference_t<decltype(CREATE_PASS)>, \
2198 const TargetMachine &>) { \
2200 return make_error<StringError>( \
2201 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2202 inconvertibleErrorCode()); \
2204 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
2205 return Error::success(); \
2207#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2208 if (checkParametrizedPassName(Name, NAME)) { \
2209 auto Params = parsePassParameters(PARSER, Name, NAME); \
2211 return Params.takeError(); \
2212 auto CreatePass = CREATE_PASS; \
2213 if constexpr (std::is_constructible_v< \
2214 std::remove_reference_t<decltype(CreatePass( \
2216 const TargetMachine &, \
2217 std::remove_reference_t<decltype(Params.get())>>) { \
2219 return make_error<StringError>( \
2220 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2221 inconvertibleErrorCode()); \
2224 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2225 return Error::success(); \
2227#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2228 if (Name == NAME) { \
2229 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2230 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2231 return Error::success(); \
2233#define LOOP_PASS(NAME, CREATE_PASS) \
2234 if (Name == NAME) { \
2235 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2236 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2237 return Error::success(); \
2239#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2240 if (checkParametrizedPassName(Name, NAME)) { \
2241 auto Params = parsePassParameters(PARSER, Name, NAME); \
2243 return Params.takeError(); \
2244 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2245 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2246 return Error::success(); \
2248#include "PassRegistry.def"
2250 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2251 if (
C(Name, CGPM, InnerPipeline))
2258 const PipelineElement &
E) {
2259 auto &
Name =
E.Name;
2260 auto &InnerPipeline =
E.InnerPipeline;
2263 if (!InnerPipeline.empty()) {
2264 if (Name ==
"function") {
2266 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
2269 FPM.
addPass(std::move(NestedFPM));
2272 if (Name ==
"loop" || Name ==
"loop-mssa") {
2274 if (
auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
2277 bool UseMemorySSA = (
Name ==
"loop-mssa");
2282 if (Name ==
"machine-function") {
2284 if (
auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
2290 for (
auto &
C : FunctionPipelineParsingCallbacks)
2291 if (
C(Name, FPM, InnerPipeline))
2296 formatv(
"invalid use of '{}' pass as function pipeline", Name).str(),
2301#define FUNCTION_PASS(NAME, CREATE_PASS) \
2302 if (Name == NAME) { \
2303 if constexpr (std::is_constructible_v< \
2304 std::remove_reference_t<decltype(CREATE_PASS)>, \
2305 const TargetMachine &>) { \
2307 return make_error<StringError>( \
2308 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2309 inconvertibleErrorCode()); \
2311 FPM.addPass(CREATE_PASS); \
2312 return Error::success(); \
2314#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2315 if (checkParametrizedPassName(Name, NAME)) { \
2316 auto Params = parsePassParameters(PARSER, Name, NAME); \
2318 return Params.takeError(); \
2319 auto CreatePass = CREATE_PASS; \
2320 if constexpr (std::is_constructible_v< \
2321 std::remove_reference_t<decltype(CreatePass( \
2323 const TargetMachine &, \
2324 std::remove_reference_t<decltype(Params.get())>>) { \
2326 return make_error<StringError>( \
2327 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2328 inconvertibleErrorCode()); \
2331 FPM.addPass(CREATE_PASS(Params.get())); \
2332 return Error::success(); \
2334#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2335 if (Name == "require<" NAME ">") { \
2336 if constexpr (std::is_constructible_v< \
2337 std::remove_reference_t<decltype(CREATE_PASS)>, \
2338 const TargetMachine &>) { \
2340 return make_error<StringError>( \
2341 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2342 inconvertibleErrorCode()); \
2345 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2347 return Error::success(); \
2349 if (Name == "invalidate<" NAME ">") { \
2350 FPM.addPass(InvalidateAnalysisPass< \
2351 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2352 return Error::success(); \
2358#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2359 if (Name == NAME) { \
2360 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2361 return Error::success(); \
2363#define LOOP_PASS(NAME, CREATE_PASS) \
2364 if (Name == NAME) { \
2365 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2366 return Error::success(); \
2368#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2369 if (checkParametrizedPassName(Name, NAME)) { \
2370 auto Params = parsePassParameters(PARSER, Name, NAME); \
2372 return Params.takeError(); \
2374 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false)); \
2375 return Error::success(); \
2377#include "PassRegistry.def"
2379 for (
auto &
C : FunctionPipelineParsingCallbacks)
2380 if (
C(Name, FPM, InnerPipeline))
2383 formatv(
"unknown function pass '{}'", Name).str(),
2388 const PipelineElement &
E) {
2389 StringRef
Name =
E.Name;
2390 auto &InnerPipeline =
E.InnerPipeline;
2393 if (!InnerPipeline.empty()) {
2394 if (Name ==
"loop") {
2396 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
2399 LPM.addPass(std::move(NestedLPM));
2403 for (
auto &
C : LoopPipelineParsingCallbacks)
2404 if (
C(Name, LPM, InnerPipeline))
2409 formatv(
"invalid use of '{}' pass as loop pipeline", Name).str(),
2414#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2415 if (Name == NAME) { \
2416 LPM.addPass(CREATE_PASS); \
2417 return Error::success(); \
2419#define LOOP_PASS(NAME, CREATE_PASS) \
2420 if (Name == NAME) { \
2421 LPM.addPass(CREATE_PASS); \
2422 return Error::success(); \
2424#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2425 if (checkParametrizedPassName(Name, NAME)) { \
2426 auto Params = parsePassParameters(PARSER, Name, NAME); \
2428 return Params.takeError(); \
2429 LPM.addPass(CREATE_PASS(Params.get())); \
2430 return Error::success(); \
2432#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
2433 if (Name == "require<" NAME ">") { \
2434 LPM.addPass(RequireAnalysisPass< \
2435 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
2436 LoopAnalysisManager, LoopStandardAnalysisResults &, \
2438 return Error::success(); \
2440 if (Name == "invalidate<" NAME ">") { \
2441 LPM.addPass(InvalidateAnalysisPass< \
2442 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2443 return Error::success(); \
2445#include "PassRegistry.def"
2447 for (
auto &
C : LoopPipelineParsingCallbacks)
2448 if (
C(Name, LPM, InnerPipeline))
2455 const PipelineElement &
E) {
2456 StringRef
Name =
E.Name;
2458 if (!
E.InnerPipeline.empty()) {
2459 if (
E.Name ==
"machine-function") {
2461 if (
auto Err = parseMachinePassPipeline(NestedPM,
E.InnerPipeline))
2463 MFPM.
addPass(std::move(NestedPM));
2470#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) \
2471 if (Name == NAME) { \
2472 MFPM.addPass(CREATE_PASS); \
2473 return Error::success(); \
2475#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
2476 if (Name == NAME) { \
2477 MFPM.addPass(CREATE_PASS); \
2478 return Error::success(); \
2480#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
2482 if (checkParametrizedPassName(Name, NAME)) { \
2483 auto Params = parsePassParameters(PARSER, Name, NAME); \
2485 return Params.takeError(); \
2486 MFPM.addPass(CREATE_PASS(Params.get())); \
2487 return Error::success(); \
2489#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2490 if (Name == "require<" NAME ">") { \
2492 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2493 MachineFunction>()); \
2494 return Error::success(); \
2496 if (Name == "invalidate<" NAME ">") { \
2497 MFPM.addPass(InvalidateAnalysisPass< \
2498 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2499 return Error::success(); \
2501#include "llvm/Passes/MachinePassRegistry.def"
2503 for (
auto &
C : MachineFunctionPipelineParsingCallbacks)
2504 if (
C(Name, MFPM,
E.InnerPipeline))
2507 formatv(
"unknown machine pass '{}'", Name).str(),
2512#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2513 if (Name == NAME) { \
2514 AA.registerModuleAnalysis< \
2515 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2518#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2519 if (Name == NAME) { \
2520 AA.registerFunctionAnalysis< \
2521 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2524#include "PassRegistry.def"
2526 for (
auto &
C : AAParsingCallbacks)
2532Error PassBuilder::parseMachinePassPipeline(
2534 for (
const auto &Element : Pipeline) {
2535 if (
auto Err = parseMachinePass(MFPM, Element))
2543 for (
const auto &Element : Pipeline) {
2544 if (
auto Err = parseLoopPass(LPM, Element))
2550Error PassBuilder::parseFunctionPassPipeline(
2552 for (
const auto &Element : Pipeline) {
2553 if (
auto Err = parseFunctionPass(FPM, Element))
2561 for (
const auto &Element : Pipeline) {
2562 if (
auto Err = parseCGSCCPass(CGPM, Element))
2594 for (
const auto &Element : Pipeline) {
2595 if (
auto Err = parseModulePass(MPM, Element))
2606 auto Pipeline = parsePipelineText(PipelineText);
2607 if (!Pipeline || Pipeline->empty())
2609 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2619 Pipeline = {{
"cgscc", std::move(*Pipeline)}};
2621 FunctionPipelineParsingCallbacks)) {
2622 Pipeline = {{
"function", std::move(*Pipeline)}};
2625 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2626 std::move(*Pipeline)}}}};
2627 }
else if (
isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
2629 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2630 std::move(*Pipeline)}}}};
2632 FirstName, MachineFunctionPipelineParsingCallbacks)) {
2633 Pipeline = {{
"function", {{
"machine-function", std::move(*Pipeline)}}}};
2635 for (
auto &
C : TopLevelPipelineParsingCallbacks)
2636 if (
C(MPM, *Pipeline))
2640 auto &InnerPipeline = Pipeline->front().InnerPipeline;
2642 formatv(
"unknown {} name '{}'",
2643 (InnerPipeline.empty() ?
"pass" :
"pipeline"), FirstName)
2649 if (
auto Err = parseModulePassPipeline(MPM, *Pipeline))
2657 auto Pipeline = parsePipelineText(PipelineText);
2658 if (!Pipeline || Pipeline->empty())
2660 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2666 formatv(
"unknown cgscc pass '{}' in pipeline '{}'", FirstName,
2671 if (
auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
2680 auto Pipeline = parsePipelineText(PipelineText);
2681 if (!Pipeline || Pipeline->empty())
2683 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2689 formatv(
"unknown function pass '{}' in pipeline '{}'", FirstName,
2694 if (
auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2702 auto Pipeline = parsePipelineText(PipelineText);
2703 if (!Pipeline || Pipeline->empty())
2705 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2708 if (
auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2716 auto Pipeline = parsePipelineText(PipelineText);
2717 if (!Pipeline || Pipeline->empty())
2719 formatv(
"invalid machine pass pipeline '{}'", PipelineText).str(),
2722 if (
auto Err = parseMachinePassPipeline(MFPM, *Pipeline))
2731 if (PipelineText ==
"default") {
2736 while (!PipelineText.
empty()) {
2738 std::tie(Name, PipelineText) = PipelineText.
split(
',');
2739 if (!parseAAPassName(
AA, Name))
2741 formatv(
"unknown alias analysis name '{}'", Name).str(),
2748std::optional<RegAllocFilterFunc>
2750 if (FilterName ==
"all")
2752 for (
auto &
C : RegClassFilterParsingCallbacks)
2753 if (
auto F =
C(FilterName))
2755 return std::nullopt;
2763 OS <<
" " <<
PassName <<
"<" << Params <<
">\n";
2769 OS <<
"Module passes:\n";
2770#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2771#include "PassRegistry.def"
2773 OS <<
"Module passes with params:\n";
2774#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2775 printPassName(NAME, PARAMS, OS);
2776#include "PassRegistry.def"
2778 OS <<
"Module analyses:\n";
2779#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2780#include "PassRegistry.def"
2782 OS <<
"Module alias analyses:\n";
2783#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2784#include "PassRegistry.def"
2786 OS <<
"CGSCC passes:\n";
2787#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2788#include "PassRegistry.def"
2790 OS <<
"CGSCC passes with params:\n";
2791#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2792 printPassName(NAME, PARAMS, OS);
2793#include "PassRegistry.def"
2795 OS <<
"CGSCC analyses:\n";
2796#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2797#include "PassRegistry.def"
2799 OS <<
"Function passes:\n";
2800#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2801#include "PassRegistry.def"
2803 OS <<
"Function passes with params:\n";
2804#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2805 printPassName(NAME, PARAMS, OS);
2806#include "PassRegistry.def"
2808 OS <<
"Function analyses:\n";
2809#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2810#include "PassRegistry.def"
2812 OS <<
"Function alias analyses:\n";
2813#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2814#include "PassRegistry.def"
2816 OS <<
"LoopNest passes:\n";
2817#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2818#include "PassRegistry.def"
2820 OS <<
"Loop passes:\n";
2821#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2822#include "PassRegistry.def"
2824 OS <<
"Loop passes with params:\n";
2825#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2826 printPassName(NAME, PARAMS, OS);
2827#include "PassRegistry.def"
2829 OS <<
"Loop analyses:\n";
2830#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2831#include "PassRegistry.def"
2833 OS <<
"Machine module passes (WIP):\n";
2834#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2835#include "llvm/Passes/MachinePassRegistry.def"
2837 OS <<
"Machine function passes (WIP):\n";
2838#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2839#include "llvm/Passes/MachinePassRegistry.def"
2841 OS <<
"Machine function analyses (WIP):\n";
2842#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2843#include "llvm/Passes/MachinePassRegistry.def"
2849 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.
Provides analysis for continuously CSEing during GISel passes.
This file provides interfaces used to build and manipulate a call graph, which is a very useful tool ...
Defines an IR pass for CodeGen Prepare.
This file 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(char Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
Primary interface to the complete machine description for the target machine.
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