389 "print-pipeline-passes",
390 cl::desc(
"Print a '-passes' compatible string describing the pipeline "
391 "(best-effort only)."));
402class TriggerCrashModulePass :
public PassInfoMixin<TriggerCrashModulePass> {
408 static StringRef
name() {
return "TriggerCrashModulePass"; }
411class TriggerCrashFunctionPass
418 static StringRef
name() {
return "TriggerCrashFunctionPass"; }
423class TriggerVerifierErrorPass
429 auto *PtrTy = PointerType::getUnqual(
M.getContext());
431 GlobalValue::LinkageTypes::InternalLinkage,
432 "__bad_alias",
nullptr, &M);
452 static StringRef
name() {
return "TriggerVerifierErrorPass"; }
457class RequireAllMachineFunctionPropertiesPass
458 :
public PassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
465 static MachineFunctionProperties getRequiredProperties() {
466 return MachineFunctionProperties()
468 .setFailsVerification()
473 .setRegBankSelected()
475 .setTiedOpsRewritten()
476 .setTracksDebugUserValues()
477 .setTracksLiveness();
479 static StringRef
name() {
return "RequireAllMachineFunctionPropertiesPass"; }
496 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(S);
500 formatv(
"invalid optimization level '{}'", S).str(),
505 std::optional<PGOOptions> PGOOpt,
508 : TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC), FS(
std::
move(FS)) {
510 TM->registerPassBuilderCallbacks(*
this);
512 PIC->registerClassToPassNameCallback([
this, PIC]() {
516#define MODULE_PASS(NAME, CREATE_PASS) \
517 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
518#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
519 PIC->addClassToPassName(CLASS, NAME);
520#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
521 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
522#define FUNCTION_PASS(NAME, CREATE_PASS) \
523 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
524#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
525 PIC->addClassToPassName(CLASS, NAME);
526#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
527 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
528#define LOOPNEST_PASS(NAME, CREATE_PASS) \
529 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
530#define LOOP_PASS(NAME, CREATE_PASS) \
531 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
532#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
533 PIC->addClassToPassName(CLASS, NAME);
534#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
535 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
536#define CGSCC_PASS(NAME, CREATE_PASS) \
537 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
538#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
539 PIC->addClassToPassName(CLASS, NAME);
540#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
541 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
542#include "PassRegistry.def"
544#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
545 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
546#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
547 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
548#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
550 PIC->addClassToPassName(CLASS, NAME);
551#include "llvm/Passes/MachinePassRegistry.def"
559#define MODULE_CALLBACK(NAME, INVOKE) \
560 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
561 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
563 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
566 INVOKE(PM, L.get()); \
569#include "PassRegistry.def"
577#define MODULE_LTO_CALLBACK(NAME, INVOKE) \
578 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
579 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
581 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
584 INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \
587#include "PassRegistry.def"
595#define FUNCTION_CALLBACK(NAME, INVOKE) \
596 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
597 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
599 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
602 INVOKE(PM, L.get()); \
605#include "PassRegistry.def"
613#define CGSCC_CALLBACK(NAME, INVOKE) \
614 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
615 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
617 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
620 INVOKE(PM, L.get()); \
623#include "PassRegistry.def"
631#define LOOP_CALLBACK(NAME, INVOKE) \
632 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
633 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
635 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
638 INVOKE(PM, L.get()); \
641#include "PassRegistry.def"
647#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
648 MAM.registerPass([&] { return CREATE_PASS; });
649#include "PassRegistry.def"
651 for (
auto &
C : ModuleAnalysisRegistrationCallbacks)
656#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
657 CGAM.registerPass([&] { return CREATE_PASS; });
658#include "PassRegistry.def"
660 for (
auto &
C : CGSCCAnalysisRegistrationCallbacks)
670#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
671 if constexpr (std::is_constructible_v< \
672 std::remove_reference_t<decltype(CREATE_PASS)>, \
673 const TargetMachine &>) { \
675 FAM.registerPass([&] { return CREATE_PASS; }); \
677 FAM.registerPass([&] { return CREATE_PASS; }); \
679#include "PassRegistry.def"
681 for (
auto &
C : FunctionAnalysisRegistrationCallbacks)
688#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
689 MFAM.registerPass([&] { return CREATE_PASS; });
690#include "llvm/Passes/MachinePassRegistry.def"
692 for (
auto &
C : MachineFunctionAnalysisRegistrationCallbacks)
697#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
698 LAM.registerPass([&] { return CREATE_PASS; });
699#include "PassRegistry.def"
701 for (
auto &
C : LoopAnalysisRegistrationCallbacks)
705static std::optional<std::pair<bool, bool>>
707 std::pair<bool, bool> Params;
708 if (!Name.consume_front(
"function"))
712 if (!Name.consume_front(
"<") || !Name.consume_back(
">"))
714 while (!Name.empty()) {
715 auto [Front, Back] = Name.split(
';');
717 if (Front ==
"eager-inv")
719 else if (Front ==
"no-rerun")
720 Params.second =
true;
728 if (!Name.consume_front(
"devirt<") || !Name.consume_back(
">"))
740 while (!Params.
empty()) {
742 std::tie(ParamName, Params) = Params.
split(
';');
744 if (ParamName == OptionName) {
761 while (!Params.
empty()) {
763 std::tie(ParamName, Params) = Params.
split(
';');
768 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
773 if (ParamName.
consume_front(
"hardware-loop-counter-bitwidth=")) {
777 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
782 if (ParamName ==
"force-hardware-loops") {
784 }
else if (ParamName ==
"force-hardware-loop-phi") {
786 }
else if (ParamName ==
"force-nested-hardware-loop") {
788 }
else if (ParamName ==
"force-hardware-loop-guard") {
792 formatv(
"invalid HardwarePass parameter '{}'", ParamName).str(),
796 return HardwareLoopOpts;
808 while (!Params.
empty()) {
810 std::tie(ParamName, Params) = Params.
split(
';');
811 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(ParamName);
813 if (OptLevel && !OptLevel->isOptimizingForSize()) {
814 UnrollOpts.
setOptLevel(OptLevel->getSpeedupLevel());
821 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
828 if (ParamName ==
"partial") {
830 }
else if (ParamName ==
"peeling") {
832 }
else if (ParamName ==
"profile-peeling") {
834 }
else if (ParamName ==
"runtime") {
836 }
else if (ParamName ==
"upperbound") {
840 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
849 Params,
"vfe-linkage-unit-visibility",
"GlobalDCE");
869 Params,
"skip-non-recursive-function-attrs",
"PostOrderFunctionAttrs");
879 formatv(
"too many CFGuardPass parameters '{}'", Params).str(),
882 if (Param ==
"check")
884 if (Param ==
"dispatch")
888 formatv(
"invalid CFGuardPass mechanism: '{}'", Param).str(),
898 "EntryExitInstrumenter");
903 "DropUnnecessaryAssumes");
912 "LowerMatrixIntrinsics");
917 while (!Params.
empty()) {
919 std::tie(ParamName, Params) = Params.
split(
';');
922 if (ParamName ==
"preserve-order")
924 else if (ParamName ==
"rename-all")
926 else if (ParamName ==
"fold-all")
928 else if (ParamName ==
"reorder-operands")
932 formatv(
"invalid normalize pass parameter '{}'", ParamName).str(),
942 while (!Params.
empty()) {
944 std::tie(ParamName, Params) = Params.
split(
';');
946 if (ParamName ==
"kernel") {
947 Result.CompileKernel =
true;
948 }
else if (ParamName ==
"use-after-scope") {
949 Result.UseAfterScope =
true;
952 formatv(
"invalid AddressSanitizer pass parameter '{}'", ParamName)
962 while (!Params.
empty()) {
964 std::tie(ParamName, Params) = Params.
split(
';');
966 if (ParamName ==
"recover") {
968 }
else if (ParamName ==
"kernel") {
969 Result.CompileKernel =
true;
972 formatv(
"invalid HWAddressSanitizer pass parameter '{}'", ParamName)
982 while (!Params.
empty()) {
984 std::tie(ParamName, Params) = Params.
split(
';');
986 if (ParamName ==
"thinlto") {
988 }
else if (ParamName ==
"emit-summary") {
989 Result.EmitLTOSummary =
true;
992 formatv(
"invalid EmbedBitcode pass parameter '{}'", ParamName).str(),
1000parseLowerAllowCheckPassOptions(
StringRef Params) {
1002 while (!Params.
empty()) {
1004 std::tie(ParamName, Params) = Params.
split(
';');
1015 std::tie(IndicesStr, CutoffStr) = ParamName.
split(
"]=");
1022 formatv(
"invalid LowerAllowCheck pass cutoffs parameter '{}' ({})",
1027 if (!IndicesStr.
consume_front(
"cutoffs[") || IndicesStr ==
"")
1029 formatv(
"invalid LowerAllowCheck pass index parameter '{}' ({})",
1030 IndicesStr, CutoffStr)
1034 while (IndicesStr !=
"") {
1036 std::tie(firstIndexStr, IndicesStr) = IndicesStr.
split(
'|');
1042 "invalid LowerAllowCheck pass index parameter '{}' ({}) {}",
1043 firstIndexStr, IndicesStr)
1050 if (index >=
Result.cutoffs.size())
1051 Result.cutoffs.resize(index + 1, 0);
1053 Result.cutoffs[index] = cutoff;
1055 }
else if (ParamName.
starts_with(
"runtime_check")) {
1057 std::tie(std::ignore, ValueString) = ParamName.
split(
"=");
1061 formatv(
"invalid LowerAllowCheck pass runtime_check parameter '{}' "
1063 ValueString, Params)
1067 Result.runtime_check = runtime_check;
1070 formatv(
"invalid LowerAllowCheck pass parameter '{}'", ParamName)
1081 while (!Params.
empty()) {
1083 std::tie(ParamName, Params) = Params.
split(
';');
1085 if (ParamName ==
"recover") {
1087 }
else if (ParamName ==
"kernel") {
1092 formatv(
"invalid argument to MemorySanitizer pass track-origins "
1097 }
else if (ParamName ==
"eager-checks") {
1098 Result.EagerChecks =
true;
1101 formatv(
"invalid MemorySanitizer pass parameter '{}'", ParamName)
1111 while (!Params.
empty()) {
1113 std::tie(ParamName, Params) = Params.
split(
';');
1120 formatv(
"invalid argument to AllocToken pass mode "
1127 formatv(
"invalid AllocToken pass parameter '{}'", ParamName).str(),
1137 while (!Params.
empty()) {
1139 std::tie(ParamName, Params) = Params.
split(
';');
1142 if (ParamName ==
"speculate-blocks") {
1144 }
else if (ParamName ==
"simplify-cond-branch") {
1146 }
else if (ParamName ==
"forward-switch-cond") {
1148 }
else if (ParamName ==
"switch-range-to-icmp") {
1150 }
else if (ParamName ==
"switch-to-arithmetic") {
1152 }
else if (ParamName ==
"switch-to-lookup") {
1154 }
else if (ParamName ==
"keep-loops") {
1156 }
else if (ParamName ==
"hoist-common-insts") {
1158 }
else if (ParamName ==
"hoist-loads-stores-with-cond-faulting") {
1160 }
else if (ParamName ==
"sink-common-insts") {
1162 }
else if (ParamName ==
"speculate-unpredictables") {
1165 APInt BonusInstThreshold;
1168 formatv(
"invalid argument to SimplifyCFG pass bonus-threshold "
1176 formatv(
"invalid SimplifyCFG pass parameter '{}'", ParamName).str(),
1187 Result.setVerifyFixpoint(
true);
1188 while (!Params.
empty()) {
1190 std::tie(ParamName, Params) = Params.
split(
';');
1193 if (ParamName ==
"verify-fixpoint") {
1196 APInt MaxIterations;
1199 formatv(
"invalid argument to InstCombine pass max-iterations "
1207 formatv(
"invalid InstCombine pass parameter '{}'", ParamName).str(),
1217 while (!Params.
empty()) {
1219 std::tie(ParamName, Params) = Params.
split(
';');
1222 if (ParamName ==
"interleave-forced-only") {
1224 }
else if (ParamName ==
"vectorize-forced-only") {
1228 formatv(
"invalid LoopVectorize parameter '{}'", ParamName).str(),
1236 std::pair<bool, bool>
Result = {
false,
true};
1237 while (!Params.
empty()) {
1239 std::tie(ParamName, Params) = Params.
split(
';');
1242 if (ParamName ==
"nontrivial") {
1244 }
else if (ParamName ==
"trivial") {
1248 formatv(
"invalid LoopUnswitch pass parameter '{}'", ParamName).str(),
1257 while (!Params.
empty()) {
1259 std::tie(ParamName, Params) = Params.
split(
';');
1262 if (ParamName ==
"allowspeculation") {
1266 formatv(
"invalid LICM pass parameter '{}'", ParamName).str(),
1274 std::pair<bool, bool>
Result = {
true,
false};
1275 while (!Params.
empty()) {
1277 std::tie(ParamName, Params) = Params.
split(
';');
1280 if (ParamName ==
"header-duplication") {
1282 }
else if (ParamName ==
"prepare-for-lto") {
1286 formatv(
"invalid LoopRotate pass parameter '{}'", ParamName).str(),
1295 while (!Params.
empty()) {
1297 std::tie(ParamName, Params) = Params.
split(
';');
1300 if (ParamName ==
"split-footer-bb") {
1304 formatv(
"invalid MergedLoadStoreMotion pass parameter '{}'",
1315 while (!Params.
empty()) {
1317 std::tie(ParamName, Params) = Params.
split(
';');
1320 if (ParamName ==
"pre") {
1322 }
else if (ParamName ==
"load-pre") {
1324 }
else if (ParamName ==
"split-backedge-load-pre") {
1326 }
else if (ParamName ==
"memdep") {
1330 }
else if (ParamName ==
"memoryssa") {
1336 formatv(
"invalid GVN pass parameter '{}'", ParamName).str(),
1345 while (!Params.
empty()) {
1347 std::tie(ParamName, Params) = Params.
split(
';');
1350 if (ParamName ==
"func-spec")
1354 formatv(
"invalid IPSCCP pass parameter '{}'", ParamName).str(),
1362 while (!Params.
empty()) {
1364 std::tie(ParamName, Params) = Params.
split(
';');
1369 formatv(
"invalid argument to Scalarizer pass min-bits "
1380 if (ParamName ==
"load-store")
1382 else if (ParamName ==
"variable-insert-extract")
1386 formatv(
"invalid Scalarizer pass parameter '{}'", ParamName).str(),
1395 if (Params.
empty() || Params ==
"modify-cfg")
1397 if (Params ==
"preserve-cfg")
1400 formatv(
"invalid SROA pass parameter '{}' (either preserve-cfg or "
1401 "modify-cfg can be specified)",
1408parseStackLifetimeOptions(
StringRef Params) {
1410 while (!Params.
empty()) {
1412 std::tie(ParamName, Params) = Params.
split(
';');
1414 if (ParamName ==
"may") {
1416 }
else if (ParamName ==
"must") {
1420 formatv(
"invalid StackLifetime parameter '{}'", ParamName).str(),
1429 "DependenceAnalysisPrinter");
1434 "SeparateConstOffsetFromGEP");
1443parseFunctionSimplificationPipelineOptions(
StringRef Params) {
1447 formatv(
"invalid function-simplification parameter '{}'", Params).str(),
1455 "MemorySSAPrinterPass");
1460 "SpeculativeExecutionPass");
1465 while (!Params.
empty()) {
1467 std::tie(ParamName, Params) = Params.
split(
';');
1473 formatv(
"invalid MemProfUse pass parameter '{}'", ParamName).str(),
1481parseStructuralHashPrinterPassOptions(
StringRef Params) {
1484 if (Params ==
"detailed")
1486 if (Params ==
"call-target-ignored")
1489 formatv(
"invalid structural hash printer parameter '{}'", Params).str(),
1495 "WinEHPreparePass");
1500 while (!Params.
empty()) {
1502 std::tie(ParamName, Params) = Params.
split(
';');
1505 if (ParamName ==
"group-by-use")
1507 else if (ParamName ==
"ignore-single-use")
1509 else if (ParamName ==
"merge-const")
1511 else if (ParamName ==
"merge-const-aggressive")
1513 else if (ParamName ==
"merge-external")
1518 formatv(
"invalid GlobalMergePass parameter '{}'", ParamName).str(),
1522 formatv(
"invalid global-merge pass parameter '{}'", Params).str(),
1531 while (!Params.
empty()) {
1533 std::tie(ParamName, Params) = Params.
split(
';');
1539 formatv(
"invalid Internalize pass parameter '{}'", ParamName).str(),
1550 while (!Params.
empty()) {
1552 std::tie(ParamName, Params) = Params.
split(
';');
1555 std::optional<RegAllocFilterFunc>
Filter =
1559 formatv(
"invalid regallocfast register filter '{}'", ParamName)
1568 if (ParamName ==
"no-clear-vregs") {
1574 formatv(
"invalid regallocfast pass parameter '{}'", ParamName).str(),
1581parseBoundsCheckingOptions(
StringRef Params) {
1583 while (!Params.
empty()) {
1585 std::tie(ParamName, Params) = Params.
split(
';');
1586 if (ParamName ==
"trap") {
1588 }
else if (ParamName ==
"rt") {
1594 }
else if (ParamName ==
"rt-abort") {
1600 }
else if (ParamName ==
"min-rt") {
1606 }
else if (ParamName ==
"min-rt-abort") {
1612 }
else if (ParamName ==
"merge") {
1614 }
else if (ParamName ==
"handler-preserve-all-regs") {
1616 Options.Rt->HandlerPreserveAllRegs =
true;
1620 std::tie(ParamEQ, Val) = ParamName.
split(
'=');
1626 formatv(
"invalid BoundsChecking pass parameter '{}'", ParamName)
1643 if (!
Prefix.empty() || Digit.getAsInteger(10,
N))
1645 Param.str().c_str());
1648 if (!
Level.has_value())
1650 "invalid optimization level for expand-fp pass: %s",
1651 Digit.str().c_str());
1658 if (Params.
empty() || Params ==
"all")
1659 return RAGreedyPass::Options();
1663 return RAGreedyPass::Options{*
Filter, Params};
1666 formatv(
"invalid regallocgreedy register filter '{}'", Params).str(),
1672 "MachineSinkingPass");
1676 bool AllowTailMerge =
true;
1677 if (!Params.
empty()) {
1679 if (Params !=
"tail-merge")
1681 formatv(
"invalid MachineBlockPlacementPass parameter '{}'", Params)
1685 return AllowTailMerge;
1689 bool ClearVirtRegs =
true;
1690 if (!Params.
empty()) {
1692 if (Params !=
"clear-vregs")
1694 formatv(
"invalid VirtRegRewriter pass parameter '{}'", Params).str(),
1697 return ClearVirtRegs;
1700struct FatLTOOptions {
1701 OptimizationLevel OptLevel;
1702 bool ThinLTO =
false;
1703 bool EmitSummary =
false;
1708 bool HaveOptLevel =
false;
1709 while (!Params.
empty()) {
1711 std::tie(ParamName, Params) = Params.
split(
';');
1713 if (ParamName ==
"thinlto") {
1715 }
else if (ParamName ==
"emit-summary") {
1716 Result.EmitSummary =
true;
1717 }
else if (std::optional<OptimizationLevel> OptLevel =
1719 Result.OptLevel = *OptLevel;
1720 HaveOptLevel =
true;
1723 formatv(
"invalid fatlto-pre-link pass parameter '{}'", ParamName)
1730 "missing optimization level for fatlto-pre-link pipeline",
1745template <
typename PassManagerT,
typename CallbacksT>
1747 if (!Callbacks.empty()) {
1748 PassManagerT DummyPM;
1749 for (
auto &CB : Callbacks)
1750 if (CB(Name, DummyPM, {}))
1756template <
typename CallbacksT>
1758 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1761 if (Name ==
"module")
1763 if (Name ==
"cgscc")
1765 if (NameNoBracket ==
"function")
1767 if (Name ==
"coro-cond")
1770#define MODULE_PASS(NAME, CREATE_PASS) \
1773#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1774 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1776#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1777 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1779#include "PassRegistry.def"
1784template <
typename CallbacksT>
1787 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1788 if (Name ==
"cgscc")
1790 if (NameNoBracket ==
"function")
1797#define CGSCC_PASS(NAME, CREATE_PASS) \
1800#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1801 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1803#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1804 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1806#include "PassRegistry.def"
1811template <
typename CallbacksT>
1814 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1815 if (NameNoBracket ==
"function")
1817 if (Name ==
"loop" || Name ==
"loop-mssa" || Name ==
"machine-function")
1820#define FUNCTION_PASS(NAME, CREATE_PASS) \
1823#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1824 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1826#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1827 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1829#include "PassRegistry.def"
1834template <
typename CallbacksT>
1837 if (Name ==
"machine-function")
1840#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
1843#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
1845 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1848#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1849 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1852#include "llvm/Passes/MachinePassRegistry.def"
1857template <
typename CallbacksT>
1859 bool &UseMemorySSA) {
1860 UseMemorySSA =
false;
1863 UseMemorySSA =
true;
1867#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1870#include "PassRegistry.def"
1875template <
typename CallbacksT>
1877 bool &UseMemorySSA) {
1878 UseMemorySSA =
false;
1881 UseMemorySSA =
true;
1885#define LOOP_PASS(NAME, CREATE_PASS) \
1888#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1889 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1891#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1892 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1894#include "PassRegistry.def"
1899std::optional<std::vector<PassBuilder::PipelineElement>>
1900PassBuilder::parsePipelineText(
StringRef Text) {
1901 std::vector<PipelineElement> ResultPipeline;
1906 std::vector<PipelineElement> &Pipeline = *PipelineStack.
back();
1907 size_t Pos =
Text.find_first_of(
",()");
1908 Pipeline.push_back({
Text.substr(0, Pos), {}});
1911 if (Pos ==
Text.npos)
1914 char Sep =
Text[Pos];
1922 PipelineStack.
push_back(&Pipeline.back().InnerPipeline);
1926 assert(Sep ==
')' &&
"Bogus separator!");
1931 if (PipelineStack.
size() == 1)
1932 return std::nullopt;
1935 }
while (
Text.consume_front(
")"));
1943 if (!
Text.consume_front(
","))
1944 return std::nullopt;
1947 if (PipelineStack.
size() > 1)
1949 return std::nullopt;
1951 assert(PipelineStack.
back() == &ResultPipeline &&
1952 "Wrong pipeline at the bottom of the stack!");
1953 return {std::move(ResultPipeline)};
1966 const PipelineElement &
E) {
1967 auto &
Name =
E.Name;
1968 auto &InnerPipeline =
E.InnerPipeline;
1971 if (!InnerPipeline.empty()) {
1972 if (Name ==
"module") {
1974 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1976 MPM.
addPass(std::move(NestedMPM));
1979 if (Name ==
"coro-cond") {
1981 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1983 MPM.
addPass(CoroConditionalWrapper(std::move(NestedMPM)));
1986 if (Name ==
"cgscc") {
1988 if (
auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
1996 "cannot have a no-rerun module to function adaptor",
1999 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2006 for (
auto &
C : ModulePipelineParsingCallbacks)
2007 if (
C(Name, MPM, InnerPipeline))
2012 formatv(
"invalid use of '{}' pass as module pipeline", Name).str(),
2018#define MODULE_PASS(NAME, CREATE_PASS) \
2019 if (Name == NAME) { \
2020 MPM.addPass(CREATE_PASS); \
2021 return Error::success(); \
2023#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2024 if (checkParametrizedPassName(Name, NAME)) { \
2025 auto Params = parsePassParameters(PARSER, Name, NAME); \
2027 return Params.takeError(); \
2028 MPM.addPass(CREATE_PASS(Params.get())); \
2029 return Error::success(); \
2031#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
2032 if (Name == "require<" NAME ">") { \
2034 RequireAnalysisPass< \
2035 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
2036 return Error::success(); \
2038 if (Name == "invalidate<" NAME ">") { \
2039 MPM.addPass(InvalidateAnalysisPass< \
2040 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2041 return Error::success(); \
2043#define CGSCC_PASS(NAME, CREATE_PASS) \
2044 if (Name == NAME) { \
2045 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
2046 return Error::success(); \
2048#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2049 if (checkParametrizedPassName(Name, NAME)) { \
2050 auto Params = parsePassParameters(PARSER, Name, NAME); \
2052 return Params.takeError(); \
2054 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
2055 return Error::success(); \
2057#define FUNCTION_PASS(NAME, CREATE_PASS) \
2058 if (Name == NAME) { \
2059 if constexpr (std::is_constructible_v< \
2060 std::remove_reference_t<decltype(CREATE_PASS)>, \
2061 const TargetMachine &>) { \
2063 return make_error<StringError>( \
2064 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2065 inconvertibleErrorCode()); \
2067 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
2068 return Error::success(); \
2070#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2071 if (checkParametrizedPassName(Name, NAME)) { \
2072 auto Params = parsePassParameters(PARSER, Name, NAME); \
2074 return Params.takeError(); \
2075 auto CreatePass = CREATE_PASS; \
2076 if constexpr (std::is_constructible_v< \
2077 std::remove_reference_t<decltype(CreatePass( \
2079 const TargetMachine &, \
2080 std::remove_reference_t<decltype(Params.get())>>) { \
2082 return make_error<StringError>( \
2083 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2084 inconvertibleErrorCode()); \
2087 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2088 return Error::success(); \
2090#define LOOPNEST_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(NAME, CREATE_PASS) \
2097 if (Name == NAME) { \
2098 MPM.addPass(createModuleToFunctionPassAdaptor( \
2099 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2100 return Error::success(); \
2102#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2103 if (checkParametrizedPassName(Name, NAME)) { \
2104 auto Params = parsePassParameters(PARSER, Name, NAME); \
2106 return Params.takeError(); \
2107 MPM.addPass(createModuleToFunctionPassAdaptor( \
2108 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2109 return Error::success(); \
2111#include "PassRegistry.def"
2113 for (
auto &
C : ModulePipelineParsingCallbacks)
2114 if (
C(Name, MPM, InnerPipeline))
2117 formatv(
"unknown module pass '{}'", Name).str(),
2122 const PipelineElement &
E) {
2123 auto &
Name =
E.Name;
2124 auto &InnerPipeline =
E.InnerPipeline;
2127 if (!InnerPipeline.empty()) {
2128 if (Name ==
"cgscc") {
2130 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2133 CGPM.
addPass(std::move(NestedCGPM));
2138 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2142 std::move(FPM), Params->first, Params->second));
2147 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2154 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2155 if (
C(Name, CGPM, InnerPipeline))
2160 formatv(
"invalid use of '{}' pass as cgscc pipeline", Name).str(),
2165#define CGSCC_PASS(NAME, CREATE_PASS) \
2166 if (Name == NAME) { \
2167 CGPM.addPass(CREATE_PASS); \
2168 return Error::success(); \
2170#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2171 if (checkParametrizedPassName(Name, NAME)) { \
2172 auto Params = parsePassParameters(PARSER, Name, NAME); \
2174 return Params.takeError(); \
2175 CGPM.addPass(CREATE_PASS(Params.get())); \
2176 return Error::success(); \
2178#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
2179 if (Name == "require<" NAME ">") { \
2180 CGPM.addPass(RequireAnalysisPass< \
2181 std::remove_reference_t<decltype(CREATE_PASS)>, \
2182 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
2183 CGSCCUpdateResult &>()); \
2184 return Error::success(); \
2186 if (Name == "invalidate<" NAME ">") { \
2187 CGPM.addPass(InvalidateAnalysisPass< \
2188 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2189 return Error::success(); \
2191#define FUNCTION_PASS(NAME, CREATE_PASS) \
2192 if (Name == NAME) { \
2193 if constexpr (std::is_constructible_v< \
2194 std::remove_reference_t<decltype(CREATE_PASS)>, \
2195 const TargetMachine &>) { \
2197 return make_error<StringError>( \
2198 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2199 inconvertibleErrorCode()); \
2201 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
2202 return Error::success(); \
2204#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2205 if (checkParametrizedPassName(Name, NAME)) { \
2206 auto Params = parsePassParameters(PARSER, Name, NAME); \
2208 return Params.takeError(); \
2209 auto CreatePass = CREATE_PASS; \
2210 if constexpr (std::is_constructible_v< \
2211 std::remove_reference_t<decltype(CreatePass( \
2213 const TargetMachine &, \
2214 std::remove_reference_t<decltype(Params.get())>>) { \
2216 return make_error<StringError>( \
2217 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2218 inconvertibleErrorCode()); \
2221 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2222 return Error::success(); \
2224#define LOOPNEST_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(NAME, CREATE_PASS) \
2231 if (Name == NAME) { \
2232 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2233 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2234 return Error::success(); \
2236#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2237 if (checkParametrizedPassName(Name, NAME)) { \
2238 auto Params = parsePassParameters(PARSER, Name, NAME); \
2240 return Params.takeError(); \
2241 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2242 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2243 return Error::success(); \
2245#include "PassRegistry.def"
2247 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2248 if (
C(Name, CGPM, InnerPipeline))
2255 const PipelineElement &
E) {
2256 auto &
Name =
E.Name;
2257 auto &InnerPipeline =
E.InnerPipeline;
2260 if (!InnerPipeline.empty()) {
2261 if (Name ==
"function") {
2263 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
2266 FPM.
addPass(std::move(NestedFPM));
2269 if (Name ==
"loop" || Name ==
"loop-mssa") {
2271 if (
auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
2274 bool UseMemorySSA = (
Name ==
"loop-mssa");
2279 if (Name ==
"machine-function") {
2281 if (
auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
2287 for (
auto &
C : FunctionPipelineParsingCallbacks)
2288 if (
C(Name, FPM, InnerPipeline))
2293 formatv(
"invalid use of '{}' pass as function pipeline", Name).str(),
2298#define FUNCTION_PASS(NAME, CREATE_PASS) \
2299 if (Name == NAME) { \
2300 if constexpr (std::is_constructible_v< \
2301 std::remove_reference_t<decltype(CREATE_PASS)>, \
2302 const TargetMachine &>) { \
2304 return make_error<StringError>( \
2305 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2306 inconvertibleErrorCode()); \
2308 FPM.addPass(CREATE_PASS); \
2309 return Error::success(); \
2311#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2312 if (checkParametrizedPassName(Name, NAME)) { \
2313 auto Params = parsePassParameters(PARSER, Name, NAME); \
2315 return Params.takeError(); \
2316 auto CreatePass = CREATE_PASS; \
2317 if constexpr (std::is_constructible_v< \
2318 std::remove_reference_t<decltype(CreatePass( \
2320 const TargetMachine &, \
2321 std::remove_reference_t<decltype(Params.get())>>) { \
2323 return make_error<StringError>( \
2324 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2325 inconvertibleErrorCode()); \
2328 FPM.addPass(CREATE_PASS(Params.get())); \
2329 return Error::success(); \
2331#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2332 if (Name == "require<" NAME ">") { \
2333 if constexpr (std::is_constructible_v< \
2334 std::remove_reference_t<decltype(CREATE_PASS)>, \
2335 const TargetMachine &>) { \
2337 return make_error<StringError>( \
2338 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2339 inconvertibleErrorCode()); \
2342 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2344 return Error::success(); \
2346 if (Name == "invalidate<" NAME ">") { \
2347 FPM.addPass(InvalidateAnalysisPass< \
2348 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2349 return Error::success(); \
2355#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2356 if (Name == NAME) { \
2357 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2358 return Error::success(); \
2360#define LOOP_PASS(NAME, CREATE_PASS) \
2361 if (Name == NAME) { \
2362 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2363 return Error::success(); \
2365#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2366 if (checkParametrizedPassName(Name, NAME)) { \
2367 auto Params = parsePassParameters(PARSER, Name, NAME); \
2369 return Params.takeError(); \
2371 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false)); \
2372 return Error::success(); \
2374#include "PassRegistry.def"
2376 for (
auto &
C : FunctionPipelineParsingCallbacks)
2377 if (
C(Name, FPM, InnerPipeline))
2380 formatv(
"unknown function pass '{}'", Name).str(),
2385 const PipelineElement &
E) {
2386 StringRef
Name =
E.Name;
2387 auto &InnerPipeline =
E.InnerPipeline;
2390 if (!InnerPipeline.empty()) {
2391 if (Name ==
"loop") {
2393 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
2396 LPM.addPass(std::move(NestedLPM));
2400 for (
auto &
C : LoopPipelineParsingCallbacks)
2401 if (
C(Name, LPM, InnerPipeline))
2406 formatv(
"invalid use of '{}' pass as loop pipeline", Name).str(),
2411#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2412 if (Name == NAME) { \
2413 LPM.addPass(CREATE_PASS); \
2414 return Error::success(); \
2416#define LOOP_PASS(NAME, CREATE_PASS) \
2417 if (Name == NAME) { \
2418 LPM.addPass(CREATE_PASS); \
2419 return Error::success(); \
2421#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2422 if (checkParametrizedPassName(Name, NAME)) { \
2423 auto Params = parsePassParameters(PARSER, Name, NAME); \
2425 return Params.takeError(); \
2426 LPM.addPass(CREATE_PASS(Params.get())); \
2427 return Error::success(); \
2429#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
2430 if (Name == "require<" NAME ">") { \
2431 LPM.addPass(RequireAnalysisPass< \
2432 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
2433 LoopAnalysisManager, LoopStandardAnalysisResults &, \
2435 return Error::success(); \
2437 if (Name == "invalidate<" NAME ">") { \
2438 LPM.addPass(InvalidateAnalysisPass< \
2439 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2440 return Error::success(); \
2442#include "PassRegistry.def"
2444 for (
auto &
C : LoopPipelineParsingCallbacks)
2445 if (
C(Name, LPM, InnerPipeline))
2452 const PipelineElement &
E) {
2453 StringRef
Name =
E.Name;
2455 if (!
E.InnerPipeline.empty()) {
2456 if (
E.Name ==
"machine-function") {
2458 if (
auto Err = parseMachinePassPipeline(NestedPM,
E.InnerPipeline))
2460 MFPM.
addPass(std::move(NestedPM));
2467#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) \
2468 if (Name == NAME) { \
2469 MFPM.addPass(CREATE_PASS); \
2470 return Error::success(); \
2472#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
2473 if (Name == NAME) { \
2474 MFPM.addPass(CREATE_PASS); \
2475 return Error::success(); \
2477#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
2479 if (checkParametrizedPassName(Name, NAME)) { \
2480 auto Params = parsePassParameters(PARSER, Name, NAME); \
2482 return Params.takeError(); \
2483 MFPM.addPass(CREATE_PASS(Params.get())); \
2484 return Error::success(); \
2486#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2487 if (Name == "require<" NAME ">") { \
2489 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2490 MachineFunction>()); \
2491 return Error::success(); \
2493 if (Name == "invalidate<" NAME ">") { \
2494 MFPM.addPass(InvalidateAnalysisPass< \
2495 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2496 return Error::success(); \
2498#include "llvm/Passes/MachinePassRegistry.def"
2500 for (
auto &
C : MachineFunctionPipelineParsingCallbacks)
2501 if (
C(Name, MFPM,
E.InnerPipeline))
2504 formatv(
"unknown machine pass '{}'", Name).str(),
2509#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2510 if (Name == NAME) { \
2511 AA.registerModuleAnalysis< \
2512 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2515#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2516 if (Name == NAME) { \
2517 AA.registerFunctionAnalysis< \
2518 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2521#include "PassRegistry.def"
2523 for (
auto &
C : AAParsingCallbacks)
2529Error PassBuilder::parseMachinePassPipeline(
2531 for (
const auto &Element : Pipeline) {
2532 if (
auto Err = parseMachinePass(MFPM, Element))
2540 for (
const auto &Element : Pipeline) {
2541 if (
auto Err = parseLoopPass(LPM, Element))
2547Error PassBuilder::parseFunctionPassPipeline(
2549 for (
const auto &Element : Pipeline) {
2550 if (
auto Err = parseFunctionPass(FPM, Element))
2558 for (
const auto &Element : Pipeline) {
2559 if (
auto Err = parseCGSCCPass(CGPM, Element))
2591 for (
const auto &Element : Pipeline) {
2592 if (
auto Err = parseModulePass(MPM, Element))
2603 auto Pipeline = parsePipelineText(PipelineText);
2604 if (!Pipeline || Pipeline->empty())
2606 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2616 Pipeline = {{
"cgscc", std::move(*Pipeline)}};
2618 FunctionPipelineParsingCallbacks)) {
2619 Pipeline = {{
"function", std::move(*Pipeline)}};
2622 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2623 std::move(*Pipeline)}}}};
2624 }
else if (
isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
2626 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2627 std::move(*Pipeline)}}}};
2629 FirstName, MachineFunctionPipelineParsingCallbacks)) {
2630 Pipeline = {{
"function", {{
"machine-function", std::move(*Pipeline)}}}};
2632 for (
auto &
C : TopLevelPipelineParsingCallbacks)
2633 if (
C(MPM, *Pipeline))
2637 auto &InnerPipeline = Pipeline->front().InnerPipeline;
2639 formatv(
"unknown {} name '{}'",
2640 (InnerPipeline.empty() ?
"pass" :
"pipeline"), FirstName)
2646 if (
auto Err = parseModulePassPipeline(MPM, *Pipeline))
2654 auto Pipeline = parsePipelineText(PipelineText);
2655 if (!Pipeline || Pipeline->empty())
2657 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2663 formatv(
"unknown cgscc pass '{}' in pipeline '{}'", FirstName,
2668 if (
auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
2677 auto Pipeline = parsePipelineText(PipelineText);
2678 if (!Pipeline || Pipeline->empty())
2680 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2686 formatv(
"unknown function pass '{}' in pipeline '{}'", FirstName,
2691 if (
auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2699 auto Pipeline = parsePipelineText(PipelineText);
2700 if (!Pipeline || Pipeline->empty())
2702 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2705 if (
auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2713 auto Pipeline = parsePipelineText(PipelineText);
2714 if (!Pipeline || Pipeline->empty())
2716 formatv(
"invalid machine pass pipeline '{}'", PipelineText).str(),
2719 if (
auto Err = parseMachinePassPipeline(MFPM, *Pipeline))
2728 if (PipelineText ==
"default") {
2733 while (!PipelineText.
empty()) {
2735 std::tie(Name, PipelineText) = PipelineText.
split(
',');
2736 if (!parseAAPassName(
AA, Name))
2738 formatv(
"unknown alias analysis name '{}'", Name).str(),
2745std::optional<RegAllocFilterFunc>
2747 if (FilterName ==
"all")
2749 for (
auto &
C : RegClassFilterParsingCallbacks)
2750 if (
auto F =
C(FilterName))
2752 return std::nullopt;
2760 OS <<
" " <<
PassName <<
"<" << Params <<
">\n";
2766 OS <<
"Module passes:\n";
2767#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2768#include "PassRegistry.def"
2770 OS <<
"Module passes with params:\n";
2771#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2772 printPassName(NAME, PARAMS, OS);
2773#include "PassRegistry.def"
2775 OS <<
"Module analyses:\n";
2776#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2777#include "PassRegistry.def"
2779 OS <<
"Module alias analyses:\n";
2780#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2781#include "PassRegistry.def"
2783 OS <<
"CGSCC passes:\n";
2784#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2785#include "PassRegistry.def"
2787 OS <<
"CGSCC passes with params:\n";
2788#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2789 printPassName(NAME, PARAMS, OS);
2790#include "PassRegistry.def"
2792 OS <<
"CGSCC analyses:\n";
2793#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2794#include "PassRegistry.def"
2796 OS <<
"Function passes:\n";
2797#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2798#include "PassRegistry.def"
2800 OS <<
"Function passes with params:\n";
2801#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2802 printPassName(NAME, PARAMS, OS);
2803#include "PassRegistry.def"
2805 OS <<
"Function analyses:\n";
2806#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2807#include "PassRegistry.def"
2809 OS <<
"Function alias analyses:\n";
2810#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2811#include "PassRegistry.def"
2813 OS <<
"LoopNest passes:\n";
2814#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2815#include "PassRegistry.def"
2817 OS <<
"Loop passes:\n";
2818#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2819#include "PassRegistry.def"
2821 OS <<
"Loop passes with params:\n";
2822#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2823 printPassName(NAME, PARAMS, OS);
2824#include "PassRegistry.def"
2826 OS <<
"Loop analyses:\n";
2827#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2828#include "PassRegistry.def"
2830 OS <<
"Machine module passes (WIP):\n";
2831#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2832#include "llvm/Passes/MachinePassRegistry.def"
2834 OS <<
"Machine function passes (WIP):\n";
2835#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2836#include "llvm/Passes/MachinePassRegistry.def"
2838 OS <<
"Machine function analyses (WIP):\n";
2839#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2840#include "llvm/Passes/MachinePassRegistry.def"
2846 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