391 "print-pipeline-passes",
392 cl::desc(
"Print a '-passes' compatible string describing the pipeline "
393 "(best-effort only)."));
404class TriggerCrashModulePass :
public PassInfoMixin<TriggerCrashModulePass> {
410 static StringRef
name() {
return "TriggerCrashModulePass"; }
413class TriggerCrashFunctionPass
420 static StringRef
name() {
return "TriggerCrashFunctionPass"; }
425class TriggerVerifierErrorPass
431 auto *PtrTy = PointerType::getUnqual(
M.getContext());
433 GlobalValue::LinkageTypes::InternalLinkage,
434 "__bad_alias",
nullptr, &M);
454 static StringRef
name() {
return "TriggerVerifierErrorPass"; }
459class RequireAllMachineFunctionPropertiesPass
460 :
public PassInfoMixin<RequireAllMachineFunctionPropertiesPass> {
467 static MachineFunctionProperties getRequiredProperties() {
468 return MachineFunctionProperties()
470 .setFailsVerification()
475 .setRegBankSelected()
477 .setTiedOpsRewritten()
478 .setTracksDebugUserValues()
479 .setTracksLiveness();
481 static StringRef
name() {
return "RequireAllMachineFunctionPropertiesPass"; }
498 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(S);
502 formatv(
"invalid optimization level '{}'", S).str(),
507 std::optional<PGOOptions> PGOOpt,
510 : TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC), FS(
std::
move(FS)) {
512 TM->registerPassBuilderCallbacks(*
this);
514 PIC->registerClassToPassNameCallback([
this, PIC]() {
518#define MODULE_PASS(NAME, CREATE_PASS) \
519 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
520#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
521 PIC->addClassToPassName(CLASS, NAME);
522#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
523 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
524#define FUNCTION_PASS(NAME, CREATE_PASS) \
525 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
526#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
527 PIC->addClassToPassName(CLASS, NAME);
528#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
529 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
530#define LOOPNEST_PASS(NAME, CREATE_PASS) \
531 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
532#define LOOP_PASS(NAME, CREATE_PASS) \
533 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
534#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
535 PIC->addClassToPassName(CLASS, NAME);
536#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
537 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
538#define CGSCC_PASS(NAME, CREATE_PASS) \
539 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
540#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
541 PIC->addClassToPassName(CLASS, NAME);
542#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
543 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
544#include "PassRegistry.def"
546#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
547 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
548#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
549 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
550#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
552 PIC->addClassToPassName(CLASS, NAME);
553#include "llvm/Passes/MachinePassRegistry.def"
561#define MODULE_CALLBACK(NAME, INVOKE) \
562 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
563 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
565 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
568 INVOKE(PM, L.get()); \
571#include "PassRegistry.def"
579#define MODULE_LTO_CALLBACK(NAME, INVOKE) \
580 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
581 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
583 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
586 INVOKE(PM, L.get(), ThinOrFullLTOPhase::None); \
589#include "PassRegistry.def"
597#define FUNCTION_CALLBACK(NAME, INVOKE) \
598 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
599 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
601 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
604 INVOKE(PM, L.get()); \
607#include "PassRegistry.def"
615#define CGSCC_CALLBACK(NAME, INVOKE) \
616 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
617 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
619 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
622 INVOKE(PM, L.get()); \
625#include "PassRegistry.def"
633#define LOOP_CALLBACK(NAME, INVOKE) \
634 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
635 auto L = PassBuilder::parsePassParameters(parseOptLevelParam, Name, NAME); \
637 errs() << NAME ": " << toString(L.takeError()) << '\n'; \
640 INVOKE(PM, L.get()); \
643#include "PassRegistry.def"
649#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
650 MAM.registerPass([&] { return CREATE_PASS; });
651#include "PassRegistry.def"
653 for (
auto &
C : ModuleAnalysisRegistrationCallbacks)
658#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
659 CGAM.registerPass([&] { return CREATE_PASS; });
660#include "PassRegistry.def"
662 for (
auto &
C : CGSCCAnalysisRegistrationCallbacks)
672#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
673 if constexpr (std::is_constructible_v< \
674 std::remove_reference_t<decltype(CREATE_PASS)>, \
675 const TargetMachine &>) { \
677 FAM.registerPass([&] { return CREATE_PASS; }); \
679 FAM.registerPass([&] { return CREATE_PASS; }); \
681#include "PassRegistry.def"
683 for (
auto &
C : FunctionAnalysisRegistrationCallbacks)
690#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
691 MFAM.registerPass([&] { return CREATE_PASS; });
692#include "llvm/Passes/MachinePassRegistry.def"
694 for (
auto &
C : MachineFunctionAnalysisRegistrationCallbacks)
699#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
700 LAM.registerPass([&] { return CREATE_PASS; });
701#include "PassRegistry.def"
703 for (
auto &
C : LoopAnalysisRegistrationCallbacks)
707static std::optional<std::pair<bool, bool>>
709 std::pair<bool, bool> Params;
710 if (!Name.consume_front(
"function"))
714 if (!Name.consume_front(
"<") || !Name.consume_back(
">"))
716 while (!Name.empty()) {
717 auto [Front, Back] = Name.split(
';');
719 if (Front ==
"eager-inv")
721 else if (Front ==
"no-rerun")
722 Params.second =
true;
730 if (!Name.consume_front(
"devirt<") || !Name.consume_back(
">"))
742 while (!Params.
empty()) {
744 std::tie(ParamName, Params) = Params.
split(
';');
746 if (ParamName == OptionName) {
763 while (!Params.
empty()) {
765 std::tie(ParamName, Params) = Params.
split(
';');
770 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
775 if (ParamName.
consume_front(
"hardware-loop-counter-bitwidth=")) {
779 formatv(
"invalid HardwareLoopPass parameter '{}'", ParamName).str(),
784 if (ParamName ==
"force-hardware-loops") {
786 }
else if (ParamName ==
"force-hardware-loop-phi") {
788 }
else if (ParamName ==
"force-nested-hardware-loop") {
790 }
else if (ParamName ==
"force-hardware-loop-guard") {
794 formatv(
"invalid HardwarePass parameter '{}'", ParamName).str(),
798 return HardwareLoopOpts;
810 while (!Params.
empty()) {
812 std::tie(ParamName, Params) = Params.
split(
';');
813 std::optional<OptimizationLevel> OptLevel =
parseOptLevel(ParamName);
815 if (OptLevel && !OptLevel->isOptimizingForSize()) {
816 UnrollOpts.
setOptLevel(OptLevel->getSpeedupLevel());
823 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
830 if (ParamName ==
"partial") {
832 }
else if (ParamName ==
"peeling") {
834 }
else if (ParamName ==
"profile-peeling") {
836 }
else if (ParamName ==
"runtime") {
838 }
else if (ParamName ==
"upperbound") {
842 formatv(
"invalid LoopUnrollPass parameter '{}'", ParamName).str(),
851 Params,
"vfe-linkage-unit-visibility",
"GlobalDCE");
871 Params,
"skip-non-recursive-function-attrs",
"PostOrderFunctionAttrs");
881 formatv(
"too many CFGuardPass parameters '{}'", Params).str(),
884 if (Param ==
"check")
886 if (Param ==
"dispatch")
890 formatv(
"invalid CFGuardPass mechanism: '{}'", Param).str(),
900 "EntryExitInstrumenter");
909 "LowerMatrixIntrinsics");
914 while (!Params.
empty()) {
916 std::tie(ParamName, Params) = Params.
split(
';');
919 if (ParamName ==
"preserve-order")
921 else if (ParamName ==
"rename-all")
923 else if (ParamName ==
"fold-all")
925 else if (ParamName ==
"reorder-operands")
929 formatv(
"invalid normalize pass parameter '{}'", ParamName).str(),
939 while (!Params.
empty()) {
941 std::tie(ParamName, Params) = Params.
split(
';');
943 if (ParamName ==
"kernel") {
944 Result.CompileKernel =
true;
945 }
else if (ParamName ==
"use-after-scope") {
946 Result.UseAfterScope =
true;
949 formatv(
"invalid AddressSanitizer pass parameter '{}'", ParamName)
959 while (!Params.
empty()) {
961 std::tie(ParamName, Params) = Params.
split(
';');
963 if (ParamName ==
"recover") {
965 }
else if (ParamName ==
"kernel") {
966 Result.CompileKernel =
true;
969 formatv(
"invalid HWAddressSanitizer pass parameter '{}'", ParamName)
979 while (!Params.
empty()) {
981 std::tie(ParamName, Params) = Params.
split(
';');
983 if (ParamName ==
"thinlto") {
985 }
else if (ParamName ==
"emit-summary") {
986 Result.EmitLTOSummary =
true;
989 formatv(
"invalid EmbedBitcode pass parameter '{}'", ParamName).str(),
997parseLowerAllowCheckPassOptions(
StringRef Params) {
999 while (!Params.
empty()) {
1001 std::tie(ParamName, Params) = Params.
split(
';');
1012 std::tie(IndicesStr, CutoffStr) = ParamName.
split(
"]=");
1019 formatv(
"invalid LowerAllowCheck pass cutoffs parameter '{}' ({})",
1024 if (!IndicesStr.
consume_front(
"cutoffs[") || IndicesStr ==
"")
1026 formatv(
"invalid LowerAllowCheck pass index parameter '{}' ({})",
1027 IndicesStr, CutoffStr)
1031 while (IndicesStr !=
"") {
1033 std::tie(firstIndexStr, IndicesStr) = IndicesStr.
split(
'|');
1039 "invalid LowerAllowCheck pass index parameter '{}' ({}) {}",
1040 firstIndexStr, IndicesStr)
1047 if (index >=
Result.cutoffs.size())
1048 Result.cutoffs.resize(index + 1, 0);
1050 Result.cutoffs[index] = cutoff;
1052 }
else if (ParamName.
starts_with(
"runtime_check")) {
1054 std::tie(std::ignore, ValueString) = ParamName.
split(
"=");
1058 formatv(
"invalid LowerAllowCheck pass runtime_check parameter '{}' "
1060 ValueString, Params)
1064 Result.runtime_check = runtime_check;
1067 formatv(
"invalid LowerAllowCheck pass parameter '{}'", ParamName)
1078 while (!Params.
empty()) {
1080 std::tie(ParamName, Params) = Params.
split(
';');
1082 if (ParamName ==
"recover") {
1084 }
else if (ParamName ==
"kernel") {
1089 formatv(
"invalid argument to MemorySanitizer pass track-origins "
1094 }
else if (ParamName ==
"eager-checks") {
1095 Result.EagerChecks =
true;
1098 formatv(
"invalid MemorySanitizer pass parameter '{}'", ParamName)
1108 while (!Params.
empty()) {
1110 std::tie(ParamName, Params) = Params.
split(
';');
1117 formatv(
"invalid argument to AllocToken pass mode "
1124 formatv(
"invalid AllocToken pass parameter '{}'", ParamName).str(),
1134 while (!Params.
empty()) {
1136 std::tie(ParamName, Params) = Params.
split(
';');
1139 if (ParamName ==
"speculate-blocks") {
1141 }
else if (ParamName ==
"simplify-cond-branch") {
1143 }
else if (ParamName ==
"forward-switch-cond") {
1145 }
else if (ParamName ==
"switch-range-to-icmp") {
1147 }
else if (ParamName ==
"switch-to-arithmetic") {
1149 }
else if (ParamName ==
"switch-to-lookup") {
1151 }
else if (ParamName ==
"keep-loops") {
1153 }
else if (ParamName ==
"hoist-common-insts") {
1155 }
else if (ParamName ==
"hoist-loads-stores-with-cond-faulting") {
1157 }
else if (ParamName ==
"sink-common-insts") {
1159 }
else if (ParamName ==
"speculate-unpredictables") {
1162 APInt BonusInstThreshold;
1165 formatv(
"invalid argument to SimplifyCFG pass bonus-threshold "
1173 formatv(
"invalid SimplifyCFG pass parameter '{}'", ParamName).str(),
1184 Result.setVerifyFixpoint(
true);
1185 while (!Params.
empty()) {
1187 std::tie(ParamName, Params) = Params.
split(
';');
1190 if (ParamName ==
"verify-fixpoint") {
1193 APInt MaxIterations;
1196 formatv(
"invalid argument to InstCombine pass max-iterations "
1204 formatv(
"invalid InstCombine pass parameter '{}'", ParamName).str(),
1214 while (!Params.
empty()) {
1216 std::tie(ParamName, Params) = Params.
split(
';');
1219 if (ParamName ==
"interleave-forced-only") {
1221 }
else if (ParamName ==
"vectorize-forced-only") {
1225 formatv(
"invalid LoopVectorize parameter '{}'", ParamName).str(),
1233 std::pair<bool, bool>
Result = {
false,
true};
1234 while (!Params.
empty()) {
1236 std::tie(ParamName, Params) = Params.
split(
';');
1239 if (ParamName ==
"nontrivial") {
1241 }
else if (ParamName ==
"trivial") {
1245 formatv(
"invalid LoopUnswitch pass parameter '{}'", ParamName).str(),
1254 while (!Params.
empty()) {
1256 std::tie(ParamName, Params) = Params.
split(
';');
1259 if (ParamName ==
"allowspeculation") {
1263 formatv(
"invalid LICM pass parameter '{}'", ParamName).str(),
1271 std::pair<bool, bool>
Result = {
true,
false};
1272 while (!Params.
empty()) {
1274 std::tie(ParamName, Params) = Params.
split(
';');
1277 if (ParamName ==
"header-duplication") {
1279 }
else if (ParamName ==
"prepare-for-lto") {
1283 formatv(
"invalid LoopRotate pass parameter '{}'", ParamName).str(),
1292 while (!Params.
empty()) {
1294 std::tie(ParamName, Params) = Params.
split(
';');
1297 if (ParamName ==
"split-footer-bb") {
1301 formatv(
"invalid MergedLoadStoreMotion pass parameter '{}'",
1312 while (!Params.
empty()) {
1314 std::tie(ParamName, Params) = Params.
split(
';');
1317 if (ParamName ==
"pre") {
1319 }
else if (ParamName ==
"load-pre") {
1321 }
else if (ParamName ==
"split-backedge-load-pre") {
1323 }
else if (ParamName ==
"memdep") {
1327 }
else if (ParamName ==
"memoryssa") {
1333 formatv(
"invalid GVN pass parameter '{}'", ParamName).str(),
1342 while (!Params.
empty()) {
1344 std::tie(ParamName, Params) = Params.
split(
';');
1347 if (ParamName ==
"func-spec")
1351 formatv(
"invalid IPSCCP pass parameter '{}'", ParamName).str(),
1359 while (!Params.
empty()) {
1361 std::tie(ParamName, Params) = Params.
split(
';');
1366 formatv(
"invalid argument to Scalarizer pass min-bits "
1377 if (ParamName ==
"load-store")
1379 else if (ParamName ==
"variable-insert-extract")
1383 formatv(
"invalid Scalarizer pass parameter '{}'", ParamName).str(),
1392 if (Params.
empty() || Params ==
"modify-cfg")
1394 if (Params ==
"preserve-cfg")
1397 formatv(
"invalid SROA pass parameter '{}' (either preserve-cfg or "
1398 "modify-cfg can be specified)",
1405parseStackLifetimeOptions(
StringRef Params) {
1407 while (!Params.
empty()) {
1409 std::tie(ParamName, Params) = Params.
split(
';');
1411 if (ParamName ==
"may") {
1413 }
else if (ParamName ==
"must") {
1417 formatv(
"invalid StackLifetime parameter '{}'", ParamName).str(),
1426 "DependenceAnalysisPrinter");
1431 "SeparateConstOffsetFromGEP");
1440parseFunctionSimplificationPipelineOptions(
StringRef Params) {
1444 formatv(
"invalid function-simplification parameter '{}'", Params).str(),
1452 "MemorySSAPrinterPass");
1457 "SpeculativeExecutionPass");
1462 while (!Params.
empty()) {
1464 std::tie(ParamName, Params) = Params.
split(
';');
1470 formatv(
"invalid MemProfUse pass parameter '{}'", ParamName).str(),
1478parseStructuralHashPrinterPassOptions(
StringRef Params) {
1481 if (Params ==
"detailed")
1483 if (Params ==
"call-target-ignored")
1486 formatv(
"invalid structural hash printer parameter '{}'", Params).str(),
1492 "WinEHPreparePass");
1497 while (!Params.
empty()) {
1499 std::tie(ParamName, Params) = Params.
split(
';');
1502 if (ParamName ==
"group-by-use")
1504 else if (ParamName ==
"ignore-single-use")
1506 else if (ParamName ==
"merge-const")
1508 else if (ParamName ==
"merge-const-aggressive")
1510 else if (ParamName ==
"merge-external")
1515 formatv(
"invalid GlobalMergePass parameter '{}'", ParamName).str(),
1519 formatv(
"invalid global-merge pass parameter '{}'", Params).str(),
1528 while (!Params.
empty()) {
1530 std::tie(ParamName, Params) = Params.
split(
';');
1536 formatv(
"invalid Internalize pass parameter '{}'", ParamName).str(),
1547 while (!Params.
empty()) {
1549 std::tie(ParamName, Params) = Params.
split(
';');
1552 std::optional<RegAllocFilterFunc>
Filter =
1556 formatv(
"invalid regallocfast register filter '{}'", ParamName)
1565 if (ParamName ==
"no-clear-vregs") {
1571 formatv(
"invalid regallocfast pass parameter '{}'", ParamName).str(),
1578parseBoundsCheckingOptions(
StringRef Params) {
1580 while (!Params.
empty()) {
1582 std::tie(ParamName, Params) = Params.
split(
';');
1583 if (ParamName ==
"trap") {
1585 }
else if (ParamName ==
"rt") {
1590 }
else if (ParamName ==
"rt-abort") {
1595 }
else if (ParamName ==
"min-rt") {
1600 }
else if (ParamName ==
"min-rt-abort") {
1605 }
else if (ParamName ==
"merge") {
1610 std::tie(ParamEQ, Val) = ParamName.
split(
'=');
1616 formatv(
"invalid BoundsChecking pass parameter '{}'", ParamName)
1633 if (!
Prefix.empty() || Digit.getAsInteger(10,
N))
1635 Param.str().c_str());
1638 if (!
Level.has_value())
1640 "invalid optimization level for expand-fp pass: %s",
1641 Digit.str().c_str());
1648 if (Params.
empty() || Params ==
"all")
1649 return RAGreedyPass::Options();
1653 return RAGreedyPass::Options{*
Filter, Params};
1656 formatv(
"invalid regallocgreedy register filter '{}'", Params).str(),
1662 "MachineSinkingPass");
1666 bool AllowTailMerge =
true;
1667 if (!Params.
empty()) {
1669 if (Params !=
"tail-merge")
1671 formatv(
"invalid MachineBlockPlacementPass parameter '{}'", Params)
1675 return AllowTailMerge;
1679 bool ClearVirtRegs =
true;
1680 if (!Params.
empty()) {
1682 if (Params !=
"clear-vregs")
1684 formatv(
"invalid VirtRegRewriter pass parameter '{}'", Params).str(),
1687 return ClearVirtRegs;
1690struct FatLTOOptions {
1691 OptimizationLevel OptLevel;
1692 bool ThinLTO =
false;
1693 bool EmitSummary =
false;
1698 bool HaveOptLevel =
false;
1699 while (!Params.
empty()) {
1701 std::tie(ParamName, Params) = Params.
split(
';');
1703 if (ParamName ==
"thinlto") {
1705 }
else if (ParamName ==
"emit-summary") {
1706 Result.EmitSummary =
true;
1707 }
else if (std::optional<OptimizationLevel> OptLevel =
1709 Result.OptLevel = *OptLevel;
1710 HaveOptLevel =
true;
1713 formatv(
"invalid fatlto-pre-link pass parameter '{}'", ParamName)
1720 "missing optimization level for fatlto-pre-link pipeline",
1735template <
typename PassManagerT,
typename CallbacksT>
1737 if (!Callbacks.empty()) {
1738 PassManagerT DummyPM;
1739 for (
auto &CB : Callbacks)
1740 if (CB(Name, DummyPM, {}))
1746template <
typename CallbacksT>
1748 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1751 if (Name ==
"module")
1753 if (Name ==
"cgscc")
1755 if (NameNoBracket ==
"function")
1757 if (Name ==
"coro-cond")
1760#define MODULE_PASS(NAME, CREATE_PASS) \
1763#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1764 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1766#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
1767 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1769#include "PassRegistry.def"
1774template <
typename CallbacksT>
1777 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1778 if (Name ==
"cgscc")
1780 if (NameNoBracket ==
"function")
1787#define CGSCC_PASS(NAME, CREATE_PASS) \
1790#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1791 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1793#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
1794 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1796#include "PassRegistry.def"
1801template <
typename CallbacksT>
1804 StringRef NameNoBracket = Name.take_until([](
char C) {
return C ==
'<'; });
1805 if (NameNoBracket ==
"function")
1807 if (Name ==
"loop" || Name ==
"loop-mssa" || Name ==
"machine-function")
1810#define FUNCTION_PASS(NAME, CREATE_PASS) \
1813#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1814 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1816#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1817 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1819#include "PassRegistry.def"
1824template <
typename CallbacksT>
1827 if (Name ==
"machine-function")
1830#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
1833#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
1835 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1838#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
1839 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1842#include "llvm/Passes/MachinePassRegistry.def"
1847template <
typename CallbacksT>
1849 bool &UseMemorySSA) {
1850 UseMemorySSA =
false;
1853 UseMemorySSA =
true;
1857#define LOOPNEST_PASS(NAME, CREATE_PASS) \
1860#include "PassRegistry.def"
1865template <
typename CallbacksT>
1867 bool &UseMemorySSA) {
1868 UseMemorySSA =
false;
1871 UseMemorySSA =
true;
1875#define LOOP_PASS(NAME, CREATE_PASS) \
1878#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1879 if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
1881#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
1882 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
1884#include "PassRegistry.def"
1889std::optional<std::vector<PassBuilder::PipelineElement>>
1890PassBuilder::parsePipelineText(
StringRef Text) {
1891 std::vector<PipelineElement> ResultPipeline;
1896 std::vector<PipelineElement> &Pipeline = *PipelineStack.
back();
1897 size_t Pos =
Text.find_first_of(
",()");
1898 Pipeline.push_back({
Text.substr(0, Pos), {}});
1901 if (Pos ==
Text.npos)
1904 char Sep =
Text[Pos];
1912 PipelineStack.
push_back(&Pipeline.back().InnerPipeline);
1916 assert(Sep ==
')' &&
"Bogus separator!");
1921 if (PipelineStack.
size() == 1)
1922 return std::nullopt;
1925 }
while (
Text.consume_front(
")"));
1933 if (!
Text.consume_front(
","))
1934 return std::nullopt;
1937 if (PipelineStack.
size() > 1)
1939 return std::nullopt;
1941 assert(PipelineStack.
back() == &ResultPipeline &&
1942 "Wrong pipeline at the bottom of the stack!");
1943 return {std::move(ResultPipeline)};
1956 const PipelineElement &
E) {
1957 auto &
Name =
E.Name;
1958 auto &InnerPipeline =
E.InnerPipeline;
1961 if (!InnerPipeline.empty()) {
1962 if (Name ==
"module") {
1964 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1966 MPM.
addPass(std::move(NestedMPM));
1969 if (Name ==
"coro-cond") {
1971 if (
auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1973 MPM.
addPass(CoroConditionalWrapper(std::move(NestedMPM)));
1976 if (Name ==
"cgscc") {
1978 if (
auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
1986 "cannot have a no-rerun module to function adaptor",
1989 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1996 for (
auto &
C : ModulePipelineParsingCallbacks)
1997 if (
C(Name, MPM, InnerPipeline))
2002 formatv(
"invalid use of '{}' pass as module pipeline", Name).str(),
2008#define MODULE_PASS(NAME, CREATE_PASS) \
2009 if (Name == NAME) { \
2010 MPM.addPass(CREATE_PASS); \
2011 return Error::success(); \
2013#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2014 if (checkParametrizedPassName(Name, NAME)) { \
2015 auto Params = parsePassParameters(PARSER, Name, NAME); \
2017 return Params.takeError(); \
2018 MPM.addPass(CREATE_PASS(Params.get())); \
2019 return Error::success(); \
2021#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
2022 if (Name == "require<" NAME ">") { \
2024 RequireAnalysisPass< \
2025 std::remove_reference_t<decltype(CREATE_PASS)>, Module>()); \
2026 return Error::success(); \
2028 if (Name == "invalidate<" NAME ">") { \
2029 MPM.addPass(InvalidateAnalysisPass< \
2030 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2031 return Error::success(); \
2033#define CGSCC_PASS(NAME, CREATE_PASS) \
2034 if (Name == NAME) { \
2035 MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS)); \
2036 return Error::success(); \
2038#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2039 if (checkParametrizedPassName(Name, NAME)) { \
2040 auto Params = parsePassParameters(PARSER, Name, NAME); \
2042 return Params.takeError(); \
2044 createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get()))); \
2045 return Error::success(); \
2047#define FUNCTION_PASS(NAME, CREATE_PASS) \
2048 if (Name == NAME) { \
2049 if constexpr (std::is_constructible_v< \
2050 std::remove_reference_t<decltype(CREATE_PASS)>, \
2051 const TargetMachine &>) { \
2053 return make_error<StringError>( \
2054 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2055 inconvertibleErrorCode()); \
2057 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \
2058 return Error::success(); \
2060#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2061 if (checkParametrizedPassName(Name, NAME)) { \
2062 auto Params = parsePassParameters(PARSER, Name, NAME); \
2064 return Params.takeError(); \
2065 auto CreatePass = CREATE_PASS; \
2066 if constexpr (std::is_constructible_v< \
2067 std::remove_reference_t<decltype(CreatePass( \
2069 const TargetMachine &, \
2070 std::remove_reference_t<decltype(Params.get())>>) { \
2072 return make_error<StringError>( \
2073 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2074 inconvertibleErrorCode()); \
2077 MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2078 return Error::success(); \
2080#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2081 if (Name == NAME) { \
2082 MPM.addPass(createModuleToFunctionPassAdaptor( \
2083 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2084 return Error::success(); \
2086#define LOOP_PASS(NAME, CREATE_PASS) \
2087 if (Name == NAME) { \
2088 MPM.addPass(createModuleToFunctionPassAdaptor( \
2089 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2090 return Error::success(); \
2092#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2093 if (checkParametrizedPassName(Name, NAME)) { \
2094 auto Params = parsePassParameters(PARSER, Name, NAME); \
2096 return Params.takeError(); \
2097 MPM.addPass(createModuleToFunctionPassAdaptor( \
2098 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2099 return Error::success(); \
2101#include "PassRegistry.def"
2103 for (
auto &
C : ModulePipelineParsingCallbacks)
2104 if (
C(Name, MPM, InnerPipeline))
2107 formatv(
"unknown module pass '{}'", Name).str(),
2112 const PipelineElement &
E) {
2113 auto &
Name =
E.Name;
2114 auto &InnerPipeline =
E.InnerPipeline;
2117 if (!InnerPipeline.empty()) {
2118 if (Name ==
"cgscc") {
2120 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2123 CGPM.
addPass(std::move(NestedCGPM));
2128 if (
auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
2132 std::move(FPM), Params->first, Params->second));
2137 if (
auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
2144 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2145 if (
C(Name, CGPM, InnerPipeline))
2150 formatv(
"invalid use of '{}' pass as cgscc pipeline", Name).str(),
2155#define CGSCC_PASS(NAME, CREATE_PASS) \
2156 if (Name == NAME) { \
2157 CGPM.addPass(CREATE_PASS); \
2158 return Error::success(); \
2160#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2161 if (checkParametrizedPassName(Name, NAME)) { \
2162 auto Params = parsePassParameters(PARSER, Name, NAME); \
2164 return Params.takeError(); \
2165 CGPM.addPass(CREATE_PASS(Params.get())); \
2166 return Error::success(); \
2168#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
2169 if (Name == "require<" NAME ">") { \
2170 CGPM.addPass(RequireAnalysisPass< \
2171 std::remove_reference_t<decltype(CREATE_PASS)>, \
2172 LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &, \
2173 CGSCCUpdateResult &>()); \
2174 return Error::success(); \
2176 if (Name == "invalidate<" NAME ">") { \
2177 CGPM.addPass(InvalidateAnalysisPass< \
2178 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2179 return Error::success(); \
2181#define FUNCTION_PASS(NAME, CREATE_PASS) \
2182 if (Name == NAME) { \
2183 if constexpr (std::is_constructible_v< \
2184 std::remove_reference_t<decltype(CREATE_PASS)>, \
2185 const TargetMachine &>) { \
2187 return make_error<StringError>( \
2188 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2189 inconvertibleErrorCode()); \
2191 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \
2192 return Error::success(); \
2194#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2195 if (checkParametrizedPassName(Name, NAME)) { \
2196 auto Params = parsePassParameters(PARSER, Name, NAME); \
2198 return Params.takeError(); \
2199 auto CreatePass = CREATE_PASS; \
2200 if constexpr (std::is_constructible_v< \
2201 std::remove_reference_t<decltype(CreatePass( \
2203 const TargetMachine &, \
2204 std::remove_reference_t<decltype(Params.get())>>) { \
2206 return make_error<StringError>( \
2207 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2208 inconvertibleErrorCode()); \
2211 CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
2212 return Error::success(); \
2214#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2215 if (Name == NAME) { \
2216 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2217 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2218 return Error::success(); \
2220#define LOOP_PASS(NAME, CREATE_PASS) \
2221 if (Name == NAME) { \
2222 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2223 createFunctionToLoopPassAdaptor(CREATE_PASS, false))); \
2224 return Error::success(); \
2226#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2227 if (checkParametrizedPassName(Name, NAME)) { \
2228 auto Params = parsePassParameters(PARSER, Name, NAME); \
2230 return Params.takeError(); \
2231 CGPM.addPass(createCGSCCToFunctionPassAdaptor( \
2232 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false))); \
2233 return Error::success(); \
2235#include "PassRegistry.def"
2237 for (
auto &
C : CGSCCPipelineParsingCallbacks)
2238 if (
C(Name, CGPM, InnerPipeline))
2245 const PipelineElement &
E) {
2246 auto &
Name =
E.Name;
2247 auto &InnerPipeline =
E.InnerPipeline;
2250 if (!InnerPipeline.empty()) {
2251 if (Name ==
"function") {
2253 if (
auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
2256 FPM.
addPass(std::move(NestedFPM));
2259 if (Name ==
"loop" || Name ==
"loop-mssa") {
2261 if (
auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
2264 bool UseMemorySSA = (
Name ==
"loop-mssa");
2269 if (Name ==
"machine-function") {
2271 if (
auto Err = parseMachinePassPipeline(MFPM, InnerPipeline))
2277 for (
auto &
C : FunctionPipelineParsingCallbacks)
2278 if (
C(Name, FPM, InnerPipeline))
2283 formatv(
"invalid use of '{}' pass as function pipeline", Name).str(),
2288#define FUNCTION_PASS(NAME, CREATE_PASS) \
2289 if (Name == NAME) { \
2290 if constexpr (std::is_constructible_v< \
2291 std::remove_reference_t<decltype(CREATE_PASS)>, \
2292 const TargetMachine &>) { \
2294 return make_error<StringError>( \
2295 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2296 inconvertibleErrorCode()); \
2298 FPM.addPass(CREATE_PASS); \
2299 return Error::success(); \
2301#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2302 if (checkParametrizedPassName(Name, NAME)) { \
2303 auto Params = parsePassParameters(PARSER, Name, NAME); \
2305 return Params.takeError(); \
2306 auto CreatePass = CREATE_PASS; \
2307 if constexpr (std::is_constructible_v< \
2308 std::remove_reference_t<decltype(CreatePass( \
2310 const TargetMachine &, \
2311 std::remove_reference_t<decltype(Params.get())>>) { \
2313 return make_error<StringError>( \
2314 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2315 inconvertibleErrorCode()); \
2318 FPM.addPass(CREATE_PASS(Params.get())); \
2319 return Error::success(); \
2321#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2322 if (Name == "require<" NAME ">") { \
2323 if constexpr (std::is_constructible_v< \
2324 std::remove_reference_t<decltype(CREATE_PASS)>, \
2325 const TargetMachine &>) { \
2327 return make_error<StringError>( \
2328 formatv("pass '{0}' requires TargetMachine", Name).str(), \
2329 inconvertibleErrorCode()); \
2332 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2334 return Error::success(); \
2336 if (Name == "invalidate<" NAME ">") { \
2337 FPM.addPass(InvalidateAnalysisPass< \
2338 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2339 return Error::success(); \
2345#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2346 if (Name == NAME) { \
2347 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2348 return Error::success(); \
2350#define LOOP_PASS(NAME, CREATE_PASS) \
2351 if (Name == NAME) { \
2352 FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false)); \
2353 return Error::success(); \
2355#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2356 if (checkParametrizedPassName(Name, NAME)) { \
2357 auto Params = parsePassParameters(PARSER, Name, NAME); \
2359 return Params.takeError(); \
2361 createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()), false)); \
2362 return Error::success(); \
2364#include "PassRegistry.def"
2366 for (
auto &
C : FunctionPipelineParsingCallbacks)
2367 if (
C(Name, FPM, InnerPipeline))
2370 formatv(
"unknown function pass '{}'", Name).str(),
2375 const PipelineElement &
E) {
2376 StringRef
Name =
E.Name;
2377 auto &InnerPipeline =
E.InnerPipeline;
2380 if (!InnerPipeline.empty()) {
2381 if (Name ==
"loop") {
2383 if (
auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
2386 LPM.addPass(std::move(NestedLPM));
2390 for (
auto &
C : LoopPipelineParsingCallbacks)
2391 if (
C(Name, LPM, InnerPipeline))
2396 formatv(
"invalid use of '{}' pass as loop pipeline", Name).str(),
2401#define LOOPNEST_PASS(NAME, CREATE_PASS) \
2402 if (Name == NAME) { \
2403 LPM.addPass(CREATE_PASS); \
2404 return Error::success(); \
2406#define LOOP_PASS(NAME, CREATE_PASS) \
2407 if (Name == NAME) { \
2408 LPM.addPass(CREATE_PASS); \
2409 return Error::success(); \
2411#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2412 if (checkParametrizedPassName(Name, NAME)) { \
2413 auto Params = parsePassParameters(PARSER, Name, NAME); \
2415 return Params.takeError(); \
2416 LPM.addPass(CREATE_PASS(Params.get())); \
2417 return Error::success(); \
2419#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
2420 if (Name == "require<" NAME ">") { \
2421 LPM.addPass(RequireAnalysisPass< \
2422 std::remove_reference_t<decltype(CREATE_PASS)>, Loop, \
2423 LoopAnalysisManager, LoopStandardAnalysisResults &, \
2425 return Error::success(); \
2427 if (Name == "invalidate<" NAME ">") { \
2428 LPM.addPass(InvalidateAnalysisPass< \
2429 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2430 return Error::success(); \
2432#include "PassRegistry.def"
2434 for (
auto &
C : LoopPipelineParsingCallbacks)
2435 if (
C(Name, LPM, InnerPipeline))
2442 const PipelineElement &
E) {
2443 StringRef
Name =
E.Name;
2445 if (!
E.InnerPipeline.empty()) {
2446 if (
E.Name ==
"machine-function") {
2448 if (
auto Err = parseMachinePassPipeline(NestedPM,
E.InnerPipeline))
2450 MFPM.
addPass(std::move(NestedPM));
2457#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) \
2458 if (Name == NAME) { \
2459 MFPM.addPass(CREATE_PASS); \
2460 return Error::success(); \
2462#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
2463 if (Name == NAME) { \
2464 MFPM.addPass(CREATE_PASS); \
2465 return Error::success(); \
2467#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
2469 if (checkParametrizedPassName(Name, NAME)) { \
2470 auto Params = parsePassParameters(PARSER, Name, NAME); \
2472 return Params.takeError(); \
2473 MFPM.addPass(CREATE_PASS(Params.get())); \
2474 return Error::success(); \
2476#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
2477 if (Name == "require<" NAME ">") { \
2479 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
2480 MachineFunction>()); \
2481 return Error::success(); \
2483 if (Name == "invalidate<" NAME ">") { \
2484 MFPM.addPass(InvalidateAnalysisPass< \
2485 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
2486 return Error::success(); \
2488#include "llvm/Passes/MachinePassRegistry.def"
2490 for (
auto &
C : MachineFunctionPipelineParsingCallbacks)
2491 if (
C(Name, MFPM,
E.InnerPipeline))
2494 formatv(
"unknown machine pass '{}'", Name).str(),
2499#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2500 if (Name == NAME) { \
2501 AA.registerModuleAnalysis< \
2502 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2505#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
2506 if (Name == NAME) { \
2507 AA.registerFunctionAnalysis< \
2508 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
2511#include "PassRegistry.def"
2513 for (
auto &
C : AAParsingCallbacks)
2519Error PassBuilder::parseMachinePassPipeline(
2521 for (
const auto &Element : Pipeline) {
2522 if (
auto Err = parseMachinePass(MFPM, Element))
2530 for (
const auto &Element : Pipeline) {
2531 if (
auto Err = parseLoopPass(LPM, Element))
2537Error PassBuilder::parseFunctionPassPipeline(
2539 for (
const auto &Element : Pipeline) {
2540 if (
auto Err = parseFunctionPass(FPM, Element))
2548 for (
const auto &Element : Pipeline) {
2549 if (
auto Err = parseCGSCCPass(CGPM, Element))
2581 for (
const auto &Element : Pipeline) {
2582 if (
auto Err = parseModulePass(MPM, Element))
2593 auto Pipeline = parsePipelineText(PipelineText);
2594 if (!Pipeline || Pipeline->empty())
2596 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2606 Pipeline = {{
"cgscc", std::move(*Pipeline)}};
2608 FunctionPipelineParsingCallbacks)) {
2609 Pipeline = {{
"function", std::move(*Pipeline)}};
2612 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2613 std::move(*Pipeline)}}}};
2614 }
else if (
isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
2616 Pipeline = {{
"function", {{UseMemorySSA ?
"loop-mssa" :
"loop",
2617 std::move(*Pipeline)}}}};
2619 FirstName, MachineFunctionPipelineParsingCallbacks)) {
2620 Pipeline = {{
"function", {{
"machine-function", std::move(*Pipeline)}}}};
2622 for (
auto &
C : TopLevelPipelineParsingCallbacks)
2623 if (
C(MPM, *Pipeline))
2627 auto &InnerPipeline = Pipeline->front().InnerPipeline;
2629 formatv(
"unknown {} name '{}'",
2630 (InnerPipeline.empty() ?
"pass" :
"pipeline"), FirstName)
2636 if (
auto Err = parseModulePassPipeline(MPM, *Pipeline))
2644 auto Pipeline = parsePipelineText(PipelineText);
2645 if (!Pipeline || Pipeline->empty())
2647 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2653 formatv(
"unknown cgscc pass '{}' in pipeline '{}'", FirstName,
2658 if (
auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
2667 auto Pipeline = parsePipelineText(PipelineText);
2668 if (!Pipeline || Pipeline->empty())
2670 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2676 formatv(
"unknown function pass '{}' in pipeline '{}'", FirstName,
2681 if (
auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
2689 auto Pipeline = parsePipelineText(PipelineText);
2690 if (!Pipeline || Pipeline->empty())
2692 formatv(
"invalid pipeline '{}'", PipelineText).str(),
2695 if (
auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
2703 auto Pipeline = parsePipelineText(PipelineText);
2704 if (!Pipeline || Pipeline->empty())
2706 formatv(
"invalid machine pass pipeline '{}'", PipelineText).str(),
2709 if (
auto Err = parseMachinePassPipeline(MFPM, *Pipeline))
2718 if (PipelineText ==
"default") {
2723 while (!PipelineText.
empty()) {
2725 std::tie(Name, PipelineText) = PipelineText.
split(
',');
2726 if (!parseAAPassName(
AA, Name))
2728 formatv(
"unknown alias analysis name '{}'", Name).str(),
2735std::optional<RegAllocFilterFunc>
2737 if (FilterName ==
"all")
2739 for (
auto &
C : RegClassFilterParsingCallbacks)
2740 if (
auto F =
C(FilterName))
2742 return std::nullopt;
2750 OS <<
" " <<
PassName <<
"<" << Params <<
">\n";
2756 OS <<
"Module passes:\n";
2757#define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2758#include "PassRegistry.def"
2760 OS <<
"Module passes with params:\n";
2761#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2762 printPassName(NAME, PARAMS, OS);
2763#include "PassRegistry.def"
2765 OS <<
"Module analyses:\n";
2766#define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2767#include "PassRegistry.def"
2769 OS <<
"Module alias analyses:\n";
2770#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2771#include "PassRegistry.def"
2773 OS <<
"CGSCC passes:\n";
2774#define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2775#include "PassRegistry.def"
2777 OS <<
"CGSCC passes with params:\n";
2778#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2779 printPassName(NAME, PARAMS, OS);
2780#include "PassRegistry.def"
2782 OS <<
"CGSCC analyses:\n";
2783#define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2784#include "PassRegistry.def"
2786 OS <<
"Function passes:\n";
2787#define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2788#include "PassRegistry.def"
2790 OS <<
"Function passes with params:\n";
2791#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2792 printPassName(NAME, PARAMS, OS);
2793#include "PassRegistry.def"
2795 OS <<
"Function analyses:\n";
2796#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2797#include "PassRegistry.def"
2799 OS <<
"Function alias analyses:\n";
2800#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2801#include "PassRegistry.def"
2803 OS <<
"LoopNest passes:\n";
2804#define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2805#include "PassRegistry.def"
2807 OS <<
"Loop passes:\n";
2808#define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2809#include "PassRegistry.def"
2811 OS <<
"Loop passes with params:\n";
2812#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
2813 printPassName(NAME, PARAMS, OS);
2814#include "PassRegistry.def"
2816 OS <<
"Loop analyses:\n";
2817#define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2818#include "PassRegistry.def"
2820 OS <<
"Machine module passes (WIP):\n";
2821#define MACHINE_MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2822#include "llvm/Passes/MachinePassRegistry.def"
2824 OS <<
"Machine function passes (WIP):\n";
2825#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
2826#include "llvm/Passes/MachinePassRegistry.def"
2828 OS <<
"Machine function analyses (WIP):\n";
2829#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
2830#include "llvm/Passes/MachinePassRegistry.def"
2836 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