| 1 | //===- PassRegistry.def - Registry of passes --------------------*- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file is used as the registry of passes that are part of the core LLVM |
| 10 | // libraries. This file describes both transformation passes and analyses |
| 11 | // Analyses are registered while transformation passes have names registered |
| 12 | // that can be used when providing a textual pass pipeline. |
| 13 | // |
| 14 | //===----------------------------------------------------------------------===// |
| 15 | |
| 16 | // NOTE: NO INCLUDE GUARD DESIRED! |
| 17 | |
| 18 | #ifndef MODULE_ANALYSIS |
| 19 | #define MODULE_ANALYSIS(NAME, CREATE_PASS) |
| 20 | #endif |
| 21 | MODULE_ANALYSIS("callgraph" , CallGraphAnalysis()) |
| 22 | MODULE_ANALYSIS("collector-metadata" , CollectorMetadataAnalysis()) |
| 23 | MODULE_ANALYSIS("ctx-prof-analysis" , CtxProfAnalysis()) |
| 24 | MODULE_ANALYSIS("dxil-metadata" , DXILMetadataAnalysis()) |
| 25 | MODULE_ANALYSIS("dxil-resources" , DXILResourceAnalysis()) |
| 26 | MODULE_ANALYSIS("dxil-resource-type" , DXILResourceTypeAnalysis()) |
| 27 | MODULE_ANALYSIS("dxil-resource-bindings" , DXILResourceBindingAnalysis()) |
| 28 | MODULE_ANALYSIS("inline-advisor" , InlineAdvisorAnalysis()) |
| 29 | MODULE_ANALYSIS("ir2vec-vocab" , IR2VecVocabAnalysis()) |
| 30 | MODULE_ANALYSIS("ir-similarity" , IRSimilarityAnalysis()) |
| 31 | MODULE_ANALYSIS("last-run-tracking" , LastRunTrackingAnalysis()) |
| 32 | MODULE_ANALYSIS("lcg" , LazyCallGraphAnalysis()) |
| 33 | MODULE_ANALYSIS("module-summary" , ModuleSummaryIndexAnalysis()) |
| 34 | MODULE_ANALYSIS("no-op-module" , NoOpModuleAnalysis()) |
| 35 | MODULE_ANALYSIS("pass-instrumentation" , PassInstrumentationAnalysis(PIC)) |
| 36 | MODULE_ANALYSIS("profile-summary" , ProfileSummaryAnalysis()) |
| 37 | MODULE_ANALYSIS("reg-usage" , PhysicalRegisterUsageAnalysis()) |
| 38 | MODULE_ANALYSIS("stack-safety" , StackSafetyGlobalAnalysis()) |
| 39 | MODULE_ANALYSIS("verify" , VerifierAnalysis()) |
| 40 | |
| 41 | #ifndef MODULE_ALIAS_ANALYSIS |
| 42 | #define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \ |
| 43 | MODULE_ANALYSIS(NAME, CREATE_PASS) |
| 44 | #endif |
| 45 | MODULE_ALIAS_ANALYSIS("globals-aa" , GlobalsAA()) |
| 46 | #undef MODULE_ALIAS_ANALYSIS |
| 47 | #undef MODULE_ANALYSIS |
| 48 | |
| 49 | #ifndef MODULE_PASS |
| 50 | #define MODULE_PASS(NAME, CREATE_PASS) |
| 51 | #endif |
| 52 | MODULE_PASS("always-inline" , AlwaysInlinerPass()) |
| 53 | MODULE_PASS("annotation2metadata" , Annotation2MetadataPass()) |
| 54 | MODULE_PASS("assign-guid" , AssignGUIDPass()) |
| 55 | MODULE_PASS("attributor" , AttributorPass()) |
| 56 | MODULE_PASS("attributor-light" , AttributorLightPass()) |
| 57 | MODULE_PASS("called-value-propagation" , CalledValuePropagationPass()) |
| 58 | MODULE_PASS("canonicalize-aliases" , CanonicalizeAliasesPass()) |
| 59 | MODULE_PASS("check-debugify" , NewPMCheckDebugifyPass()) |
| 60 | MODULE_PASS("constmerge" , ConstantMergePass()) |
| 61 | MODULE_PASS("coro-cleanup" , CoroCleanupPass()) |
| 62 | MODULE_PASS("coro-early" , CoroEarlyPass()) |
| 63 | MODULE_PASS("cross-dso-cfi" , CrossDSOCFIPass()) |
| 64 | MODULE_PASS("ctx-instr-gen" , |
| 65 | PGOInstrumentationGen(PGOInstrumentationType::CTXPROF)) |
| 66 | MODULE_PASS("ctx-prof-flatten" , |
| 67 | PGOCtxProfFlatteningPass(/*IsPreThinlink=*/false)) |
| 68 | MODULE_PASS("ctx-prof-flatten-prethinlink" , |
| 69 | PGOCtxProfFlatteningPass(/*IsPreThinlink=*/true)) |
| 70 | MODULE_PASS("noinline-nonprevailing" , NoinlineNonPrevailing()) |
| 71 | MODULE_PASS("deadargelim" , DeadArgumentEliminationPass()) |
| 72 | MODULE_PASS("debugify" , NewPMDebugifyPass()) |
| 73 | MODULE_PASS("dfsan" , DataFlowSanitizerPass()) |
| 74 | MODULE_PASS("dot-callgraph" , CallGraphDOTPrinterPass()) |
| 75 | MODULE_PASS("dxil-upgrade" , DXILUpgradePass()) |
| 76 | MODULE_PASS("elim-avail-extern" , EliminateAvailableExternallyPass()) |
| 77 | MODULE_PASS("extract-blocks" , BlockExtractorPass({}, false)) |
| 78 | MODULE_PASS("expand-variadics" , |
| 79 | ExpandVariadicsPass(ExpandVariadicsMode::Disable)) |
| 80 | MODULE_PASS("forceattrs" , ForceFunctionAttrsPass()) |
| 81 | MODULE_PASS("function-import" , FunctionImportPass()) |
| 82 | MODULE_PASS("global-merge-func" , GlobalMergeFuncPass()) |
| 83 | MODULE_PASS("globalopt" , GlobalOptPass()) |
| 84 | MODULE_PASS("globalsplit" , GlobalSplitPass()) |
| 85 | MODULE_PASS("hipstdpar-interpose-alloc" , HipStdParAllocationInterpositionPass()) |
| 86 | MODULE_PASS("hipstdpar-select-accelerator-code" , |
| 87 | HipStdParAcceleratorCodeSelectionPass()) |
| 88 | MODULE_PASS("hotcoldsplit" , HotColdSplittingPass()) |
| 89 | MODULE_PASS("inferattrs" , InferFunctionAttrsPass()) |
| 90 | MODULE_PASS("inliner-ml-advisor-release" , |
| 91 | ModuleInlinerWrapperPass(getInlineParams(), true, {}, |
| 92 | InliningAdvisorMode::Release, 0)) |
| 93 | MODULE_PASS("inliner-wrapper" , ModuleInlinerWrapperPass()) |
| 94 | MODULE_PASS("inliner-wrapper-no-mandatory-first" , |
| 95 | ModuleInlinerWrapperPass(getInlineParams(), false)) |
| 96 | MODULE_PASS("insert-gcov-profiling" , GCOVProfilerPass()) |
| 97 | MODULE_PASS("instrprof" , InstrProfilingLoweringPass()) |
| 98 | MODULE_PASS("ctx-instr-lower" , PGOCtxProfLoweringPass()) |
| 99 | MODULE_PASS("print<ctx-prof-analysis>" , CtxProfAnalysisPrinterPass(errs())) |
| 100 | MODULE_PASS("invalidate<all>" , InvalidateAllAnalysesPass()) |
| 101 | MODULE_PASS("iroutliner" , IROutlinerPass()) |
| 102 | MODULE_PASS("jmc-instrumenter" , JMCInstrumenterPass()) |
| 103 | MODULE_PASS("lower-emutls" , LowerEmuTLSPass()) |
| 104 | MODULE_PASS("lower-global-dtors" , LowerGlobalDtorsPass()) |
| 105 | MODULE_PASS("lower-ifunc" , LowerIFuncPass()) |
| 106 | MODULE_PASS("simplify-type-tests" , SimplifyTypeTestsPass()) |
| 107 | MODULE_PASS("lowertypetests" , LowerTypeTestsPass()) |
| 108 | MODULE_PASS("fatlto-cleanup" , FatLtoCleanup()) |
| 109 | MODULE_PASS("pgo-force-function-attrs" , |
| 110 | PGOForceFunctionAttrsPass(PGOOpt |
| 111 | ? PGOOpt->ColdOptType |
| 112 | : PGOOptions::ColdFuncOpt::Default)) |
| 113 | MODULE_PASS("memprof-context-disambiguation" , MemProfContextDisambiguation()) |
| 114 | MODULE_PASS("memprof-module" , ModuleMemProfilerPass()) |
| 115 | MODULE_PASS("mergefunc" , MergeFunctionsPass()) |
| 116 | MODULE_PASS("metarenamer" , MetaRenamerPass()) |
| 117 | MODULE_PASS("module-inline" , ModuleInlinerPass()) |
| 118 | MODULE_PASS("name-anon-globals" , NameAnonGlobalPass()) |
| 119 | MODULE_PASS("no-op-module" , NoOpModulePass()) |
| 120 | MODULE_PASS("nsan" , NumericalStabilitySanitizerPass()) |
| 121 | MODULE_PASS("objc-arc-apelim" , ObjCARCAPElimPass()) |
| 122 | MODULE_PASS("openmp-opt" , OpenMPOptPass()) |
| 123 | MODULE_PASS("openmp-opt-postlink" , |
| 124 | OpenMPOptPass(ThinOrFullLTOPhase::FullLTOPostLink)) |
| 125 | MODULE_PASS("partial-inliner" , PartialInlinerPass()) |
| 126 | MODULE_PASS("pgo-icall-prom" , PGOIndirectCallPromotion()) |
| 127 | MODULE_PASS("pgo-instr-gen" , PGOInstrumentationGen()) |
| 128 | MODULE_PASS("pgo-instr-use" , PGOInstrumentationUse()) |
| 129 | MODULE_PASS("pre-isel-intrinsic-lowering" , PreISelIntrinsicLoweringPass(TM)) |
| 130 | MODULE_PASS("print" , PrintModulePass(errs())) |
| 131 | MODULE_PASS("print-callgraph" , CallGraphPrinterPass(errs())) |
| 132 | MODULE_PASS("print-callgraph-sccs" , CallGraphSCCsPrinterPass(errs())) |
| 133 | MODULE_PASS("print-ir-similarity" , IRSimilarityAnalysisPrinterPass(errs())) |
| 134 | MODULE_PASS("print-lcg" , LazyCallGraphPrinterPass(errs())) |
| 135 | MODULE_PASS("print-lcg-dot" , LazyCallGraphDOTPrinterPass(errs())) |
| 136 | MODULE_PASS("print-must-be-executed-contexts" , |
| 137 | MustBeExecutedContextPrinterPass(errs())) |
| 138 | MODULE_PASS("print-profile-summary" , ProfileSummaryPrinterPass(errs())) |
| 139 | MODULE_PASS("print-stack-safety" , StackSafetyGlobalPrinterPass(errs())) |
| 140 | MODULE_PASS("print<dxil-metadata>" , DXILMetadataAnalysisPrinterPass(errs())) |
| 141 | MODULE_PASS("print<dxil-resources>" , DXILResourcePrinterPass(errs())) |
| 142 | MODULE_PASS("print<inline-advisor>" , InlineAdvisorAnalysisPrinterPass(errs())) |
| 143 | MODULE_PASS("print<ir2vec>" , IR2VecPrinterPass(errs())) |
| 144 | MODULE_PASS("print<ir2vec-vocab>" , IR2VecVocabPrinterPass(errs())) |
| 145 | MODULE_PASS("print<module-debuginfo>" , ModuleDebugInfoPrinterPass(errs())) |
| 146 | MODULE_PASS("print<reg-usage>" , PhysicalRegisterUsageInfoPrinterPass(errs())) |
| 147 | MODULE_PASS("pseudo-probe" , SampleProfileProbePass(TM)) |
| 148 | MODULE_PASS("pseudo-probe-update" , PseudoProbeUpdatePass()) |
| 149 | MODULE_PASS("recompute-globalsaa" , RecomputeGlobalsAAPass()) |
| 150 | MODULE_PASS("rel-lookup-table-converter" , RelLookupTableConverterPass()) |
| 151 | MODULE_PASS("rewrite-statepoints-for-gc" , RewriteStatepointsForGC()) |
| 152 | MODULE_PASS("rewrite-symbols" , RewriteSymbolPass()) |
| 153 | MODULE_PASS("rpo-function-attrs" , ReversePostOrderFunctionAttrsPass()) |
| 154 | MODULE_PASS("rtsan" , RealtimeSanitizerPass()) |
| 155 | MODULE_PASS("sample-profile" , SampleProfileLoaderPass()) |
| 156 | MODULE_PASS("sancov-module" , SanitizerCoveragePass()) |
| 157 | MODULE_PASS("sanmd-module" , SanitizerBinaryMetadataPass()) |
| 158 | MODULE_PASS("scc-oz-module-inliner" , |
| 159 | buildInlinerPipeline(OptimizationLevel::Oz, |
| 160 | ThinOrFullLTOPhase::None)) |
| 161 | MODULE_PASS("shadow-stack-gc-lowering" , ShadowStackGCLoweringPass()) |
| 162 | MODULE_PASS("strip" , StripSymbolsPass()) |
| 163 | MODULE_PASS("strip-dead-debug-info" , StripDeadDebugInfoPass()) |
| 164 | MODULE_PASS("strip-dead-prototypes" , StripDeadPrototypesPass()) |
| 165 | MODULE_PASS("strip-debug-declare" , StripDebugDeclarePass()) |
| 166 | MODULE_PASS("strip-nondebug" , StripNonDebugSymbolsPass()) |
| 167 | MODULE_PASS("strip-nonlinetable-debuginfo" , StripNonLineTableDebugInfoPass()) |
| 168 | MODULE_PASS("strip-dead-cg-profile" , StripDeadCGProfilePass()) |
| 169 | MODULE_PASS("trigger-crash-module" , TriggerCrashModulePass()) |
| 170 | MODULE_PASS("trigger-verifier-error" , TriggerVerifierErrorPass()) |
| 171 | MODULE_PASS("tsan-module" , ModuleThreadSanitizerPass()) |
| 172 | MODULE_PASS("tysan" , TypeSanitizerPass()) |
| 173 | MODULE_PASS("verify" , VerifierPass()) |
| 174 | MODULE_PASS("view-callgraph" , CallGraphViewerPass()) |
| 175 | MODULE_PASS("wholeprogramdevirt" , WholeProgramDevirtPass()) |
| 176 | #undef MODULE_PASS |
| 177 | |
| 178 | #ifndef MODULE_PASS_WITH_PARAMS |
| 179 | #define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) |
| 180 | #endif |
| 181 | MODULE_PASS_WITH_PARAMS( |
| 182 | "asan" , "AddressSanitizerPass" , |
| 183 | [](AddressSanitizerOptions Opts) { return AddressSanitizerPass(Opts); }, |
| 184 | parseASanPassOptions, "kernel;use-after-scope" ) |
| 185 | MODULE_PASS_WITH_PARAMS( |
| 186 | "cg-profile" , "CGProfilePass" , |
| 187 | [](bool InLTOPostLink) { return CGProfilePass(InLTOPostLink); }, |
| 188 | parseCGProfilePassOptions, "in-lto-post-link" ) |
| 189 | MODULE_PASS_WITH_PARAMS( |
| 190 | "global-merge" , "GlobalMergePass" , |
| 191 | [TM = TM](GlobalMergeOptions Opts) { return GlobalMergePass(TM, Opts); }, |
| 192 | parseGlobalMergeOptions, |
| 193 | "group-by-use;ignore-single-use;max-offset=N;merge-const;" |
| 194 | "merge-const-aggressive;merge-external;no-group-by-use;" |
| 195 | "no-ignore-single-use;no-merge-const;no-merge-const-aggressive;" |
| 196 | "no-merge-external" ) |
| 197 | MODULE_PASS_WITH_PARAMS( |
| 198 | "embed-bitcode" , "EmbedBitcodePass" , |
| 199 | [](EmbedBitcodeOptions Opts) { return EmbedBitcodePass(Opts); }, |
| 200 | parseEmbedBitcodePassOptions, "thinlto;emit-summary" ) |
| 201 | MODULE_PASS_WITH_PARAMS( |
| 202 | "globaldce" , "GlobalDCEPass" , |
| 203 | [](bool InLTOPostLink) { return GlobalDCEPass(InLTOPostLink); }, |
| 204 | parseGlobalDCEPassOptions, "vfe-linkage-unit-visibility" ) |
| 205 | MODULE_PASS_WITH_PARAMS( |
| 206 | "hwasan" , "HWAddressSanitizerPass" , |
| 207 | [](HWAddressSanitizerOptions Opts) { return HWAddressSanitizerPass(Opts); }, |
| 208 | parseHWASanPassOptions, "kernel;recover" ) |
| 209 | MODULE_PASS_WITH_PARAMS( |
| 210 | "internalize" , "InternalizePass" , |
| 211 | [](SmallVector<std::string, 0> PreservedGVs) { |
| 212 | if (PreservedGVs.empty()) |
| 213 | return InternalizePass(); |
| 214 | auto MustPreserveGV = [=](const GlobalValue &GV) { |
| 215 | for (auto &PreservedGV : PreservedGVs) |
| 216 | if (GV.getName() == PreservedGV) |
| 217 | return true; |
| 218 | return false; |
| 219 | }; |
| 220 | return InternalizePass(MustPreserveGV); |
| 221 | }, |
| 222 | parseInternalizeGVs, "preserve-gv=GV" ) |
| 223 | MODULE_PASS_WITH_PARAMS( |
| 224 | "ipsccp" , "IPSCCPPass" , [](IPSCCPOptions Opts) { return IPSCCPPass(Opts); }, |
| 225 | parseIPSCCPOptions, "no-func-spec;func-spec" ) |
| 226 | MODULE_PASS_WITH_PARAMS( |
| 227 | "loop-extract" , "LoopExtractorPass" , |
| 228 | [](bool Single) { |
| 229 | if (Single) |
| 230 | return LoopExtractorPass(1); |
| 231 | return LoopExtractorPass(); |
| 232 | }, |
| 233 | parseLoopExtractorPassOptions, "single" ) |
| 234 | MODULE_PASS_WITH_PARAMS( |
| 235 | "memprof-use" , "MemProfUsePass" , |
| 236 | [](std::string Opts) { return MemProfUsePass(Opts); }, |
| 237 | parseMemProfUsePassOptions, "profile-filename=S" ) |
| 238 | MODULE_PASS_WITH_PARAMS( |
| 239 | "msan" , "MemorySanitizerPass" , |
| 240 | [](MemorySanitizerOptions Opts) { return MemorySanitizerPass(Opts); }, |
| 241 | parseMSanPassOptions, "recover;kernel;eager-checks;track-origins=N" ) |
| 242 | MODULE_PASS_WITH_PARAMS( |
| 243 | "print<structural-hash>" , "StructuralHashPrinterPass" , |
| 244 | [](StructuralHashOptions Options) { |
| 245 | return StructuralHashPrinterPass(errs(), Options); |
| 246 | }, |
| 247 | parseStructuralHashPrinterPassOptions, "detailed;call-target-ignored" ) |
| 248 | |
| 249 | MODULE_PASS_WITH_PARAMS( |
| 250 | "default" , "" , [&](OptimizationLevel L) { |
| 251 | setupOptionsForPipelineAlias(PTO, L); |
| 252 | return buildPerModuleDefaultPipeline(L); |
| 253 | }, |
| 254 | parseOptLevelParam, "O0;O1;O2;O3;Os;Oz" ) |
| 255 | MODULE_PASS_WITH_PARAMS( |
| 256 | "thinlto-pre-link" , "" , [&](OptimizationLevel L) { |
| 257 | setupOptionsForPipelineAlias(PTO, L); |
| 258 | return buildThinLTOPreLinkDefaultPipeline(L); |
| 259 | }, |
| 260 | parseOptLevelParam, "O0;O1;O2;O3;Os;Oz" ) |
| 261 | MODULE_PASS_WITH_PARAMS( |
| 262 | "thinlto" , "" , [&](OptimizationLevel L) { |
| 263 | setupOptionsForPipelineAlias(PTO, L); |
| 264 | return buildThinLTODefaultPipeline(L, nullptr); |
| 265 | }, |
| 266 | parseOptLevelParam, "O0;O1;O2;O3;Os;Oz" ) |
| 267 | MODULE_PASS_WITH_PARAMS( |
| 268 | "lto-pre-link" , "" , [&](OptimizationLevel L) { |
| 269 | setupOptionsForPipelineAlias(PTO, L); |
| 270 | if (PTO.UnifiedLTO) { |
| 271 | // When UnifiedLTO is enabled, use the ThinLTO pre-link pipeline. This |
| 272 | // avoids compile-time performance regressions and keeps the pre-link |
| 273 | // LTO pipeline "unified" for both LTO modes. |
| 274 | return buildThinLTOPreLinkDefaultPipeline(L); |
| 275 | } |
| 276 | return buildLTOPreLinkDefaultPipeline(L); |
| 277 | }, |
| 278 | parseOptLevelParam, "O0;O1;O2;O3;Os;Oz" ) |
| 279 | MODULE_PASS_WITH_PARAMS( |
| 280 | "lto" , "" , [&](OptimizationLevel L) { |
| 281 | setupOptionsForPipelineAlias(PTO, L); |
| 282 | return buildLTODefaultPipeline(L, nullptr); |
| 283 | }, |
| 284 | parseOptLevelParam, "O0;O1;O2;O3;Os;Oz" ) |
| 285 | MODULE_PASS_WITH_PARAMS( |
| 286 | "fatlto-pre-link" , "" , [&](FatLTOOptions Opts) { |
| 287 | setupOptionsForPipelineAlias(PTO, Opts.OptLevel); |
| 288 | return buildFatLTODefaultPipeline(Opts.OptLevel, Opts.ThinLTO, |
| 289 | Opts.EmitSummary); |
| 290 | }, |
| 291 | parseFatLTOOptions, "O0;O1;O2;O3;Os;Oz;thinlto;emit-summary" ) |
| 292 | |
| 293 | #undef MODULE_PASS_WITH_PARAMS |
| 294 | |
| 295 | #ifndef CGSCC_ANALYSIS |
| 296 | #define CGSCC_ANALYSIS(NAME, CREATE_PASS) |
| 297 | #endif |
| 298 | CGSCC_ANALYSIS("no-op-cgscc" , NoOpCGSCCAnalysis()) |
| 299 | CGSCC_ANALYSIS("fam-proxy" , FunctionAnalysisManagerCGSCCProxy()) |
| 300 | CGSCC_ANALYSIS("pass-instrumentation" , PassInstrumentationAnalysis(PIC)) |
| 301 | #undef CGSCC_ANALYSIS |
| 302 | |
| 303 | #ifndef CGSCC_PASS |
| 304 | #define CGSCC_PASS(NAME, CREATE_PASS) |
| 305 | #endif |
| 306 | CGSCC_PASS("argpromotion" , ArgumentPromotionPass()) |
| 307 | CGSCC_PASS("attributor-cgscc" , AttributorCGSCCPass()) |
| 308 | CGSCC_PASS("attributor-light-cgscc" , AttributorLightCGSCCPass()) |
| 309 | CGSCC_PASS("invalidate<all>" , InvalidateAllAnalysesPass()) |
| 310 | CGSCC_PASS("no-op-cgscc" , NoOpCGSCCPass()) |
| 311 | CGSCC_PASS("openmp-opt-cgscc" , OpenMPOptCGSCCPass()) |
| 312 | CGSCC_PASS("coro-annotation-elide" , CoroAnnotationElidePass()) |
| 313 | #undef CGSCC_PASS |
| 314 | |
| 315 | #ifndef CGSCC_PASS_WITH_PARAMS |
| 316 | #define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) |
| 317 | #endif |
| 318 | CGSCC_PASS_WITH_PARAMS( |
| 319 | "coro-split" , "CoroSplitPass" , |
| 320 | [](bool OptimizeFrame) { return CoroSplitPass(OptimizeFrame); }, |
| 321 | parseCoroSplitPassOptions, "reuse-storage" ) |
| 322 | CGSCC_PASS_WITH_PARAMS( |
| 323 | "function-attrs" , "PostOrderFunctionAttrsPass" , |
| 324 | [](bool SkipNonRecursive) { |
| 325 | return PostOrderFunctionAttrsPass(SkipNonRecursive); |
| 326 | }, |
| 327 | parsePostOrderFunctionAttrsPassOptions, "skip-non-recursive-function-attrs" ) |
| 328 | CGSCC_PASS_WITH_PARAMS( |
| 329 | "inline" , "InlinerPass" , |
| 330 | [](bool OnlyMandatory) { return InlinerPass(OnlyMandatory); }, |
| 331 | parseInlinerPassOptions, "only-mandatory" ) |
| 332 | #undef CGSCC_PASS_WITH_PARAMS |
| 333 | |
| 334 | #ifndef FUNCTION_ANALYSIS |
| 335 | #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) |
| 336 | #endif |
| 337 | FUNCTION_ANALYSIS("aa" , AAManager()) |
| 338 | FUNCTION_ANALYSIS("access-info" , LoopAccessAnalysis()) |
| 339 | FUNCTION_ANALYSIS("assumptions" , AssumptionAnalysis()) |
| 340 | FUNCTION_ANALYSIS("bb-sections-profile-reader" , |
| 341 | BasicBlockSectionsProfileReaderAnalysis(TM)) |
| 342 | FUNCTION_ANALYSIS("block-freq" , BlockFrequencyAnalysis()) |
| 343 | FUNCTION_ANALYSIS("branch-prob" , BranchProbabilityAnalysis()) |
| 344 | FUNCTION_ANALYSIS("cycles" , CycleAnalysis()) |
| 345 | FUNCTION_ANALYSIS("da" , DependenceAnalysis()) |
| 346 | FUNCTION_ANALYSIS("debug-ata" , DebugAssignmentTrackingAnalysis()) |
| 347 | FUNCTION_ANALYSIS("demanded-bits" , DemandedBitsAnalysis()) |
| 348 | FUNCTION_ANALYSIS("domfrontier" , DominanceFrontierAnalysis()) |
| 349 | FUNCTION_ANALYSIS("domtree" , DominatorTreeAnalysis()) |
| 350 | FUNCTION_ANALYSIS("ephemerals" , EphemeralValuesAnalysis()) |
| 351 | FUNCTION_ANALYSIS("func-properties" , FunctionPropertiesAnalysis()) |
| 352 | FUNCTION_ANALYSIS("machine-function-info" , MachineFunctionAnalysis(TM)) |
| 353 | FUNCTION_ANALYSIS("gc-function" , GCFunctionAnalysis()) |
| 354 | FUNCTION_ANALYSIS("inliner-size-estimator" , InlineSizeEstimatorAnalysis()) |
| 355 | FUNCTION_ANALYSIS("last-run-tracking" , LastRunTrackingAnalysis()) |
| 356 | FUNCTION_ANALYSIS("lazy-value-info" , LazyValueAnalysis()) |
| 357 | FUNCTION_ANALYSIS("loops" , LoopAnalysis()) |
| 358 | FUNCTION_ANALYSIS("memdep" , MemoryDependenceAnalysis()) |
| 359 | FUNCTION_ANALYSIS("memoryssa" , MemorySSAAnalysis()) |
| 360 | FUNCTION_ANALYSIS("no-op-function" , NoOpFunctionAnalysis()) |
| 361 | FUNCTION_ANALYSIS("opt-remark-emit" , OptimizationRemarkEmitterAnalysis()) |
| 362 | FUNCTION_ANALYSIS("pass-instrumentation" , PassInstrumentationAnalysis(PIC)) |
| 363 | FUNCTION_ANALYSIS("phi-values" , PhiValuesAnalysis()) |
| 364 | FUNCTION_ANALYSIS("postdomtree" , PostDominatorTreeAnalysis()) |
| 365 | FUNCTION_ANALYSIS("regions" , RegionInfoAnalysis()) |
| 366 | FUNCTION_ANALYSIS("scalar-evolution" , ScalarEvolutionAnalysis()) |
| 367 | FUNCTION_ANALYSIS("should-not-run-function-passes" , |
| 368 | ShouldNotRunFunctionPassesAnalysis()) |
| 369 | FUNCTION_ANALYSIS("should-run-extra-vector-passes" , |
| 370 | ShouldRunExtraVectorPasses()) |
| 371 | FUNCTION_ANALYSIS("ssp-layout" , SSPLayoutAnalysis()) |
| 372 | FUNCTION_ANALYSIS("stack-safety-local" , StackSafetyAnalysis()) |
| 373 | FUNCTION_ANALYSIS("target-ir" , |
| 374 | TM ? TM->getTargetIRAnalysis() : TargetIRAnalysis()) |
| 375 | FUNCTION_ANALYSIS("target-lib-info" , TargetLibraryAnalysis()) |
| 376 | FUNCTION_ANALYSIS("uniformity" , UniformityInfoAnalysis()) |
| 377 | FUNCTION_ANALYSIS("verify" , VerifierAnalysis()) |
| 378 | |
| 379 | #ifndef FUNCTION_ALIAS_ANALYSIS |
| 380 | #define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \ |
| 381 | FUNCTION_ANALYSIS(NAME, CREATE_PASS) |
| 382 | #endif |
| 383 | FUNCTION_ALIAS_ANALYSIS("basic-aa" , BasicAA()) |
| 384 | FUNCTION_ALIAS_ANALYSIS("objc-arc-aa" , objcarc::ObjCARCAA()) |
| 385 | FUNCTION_ALIAS_ANALYSIS("scev-aa" , SCEVAA()) |
| 386 | FUNCTION_ALIAS_ANALYSIS("scoped-noalias-aa" , ScopedNoAliasAA()) |
| 387 | FUNCTION_ALIAS_ANALYSIS("tbaa" , TypeBasedAA()) |
| 388 | #undef FUNCTION_ALIAS_ANALYSIS |
| 389 | #undef FUNCTION_ANALYSIS |
| 390 | |
| 391 | #ifndef FUNCTION_PASS |
| 392 | #define FUNCTION_PASS(NAME, CREATE_PASS) |
| 393 | #endif |
| 394 | FUNCTION_PASS("aa-eval" , AAEvaluator()) |
| 395 | FUNCTION_PASS("adce" , ADCEPass()) |
| 396 | FUNCTION_PASS("add-discriminators" , AddDiscriminatorsPass()) |
| 397 | FUNCTION_PASS("aggressive-instcombine" , AggressiveInstCombinePass()) |
| 398 | FUNCTION_PASS("alignment-from-assumptions" , AlignmentFromAssumptionsPass()) |
| 399 | FUNCTION_PASS("annotation-remarks" , AnnotationRemarksPass()) |
| 400 | FUNCTION_PASS("assume-builder" , AssumeBuilderPass()) |
| 401 | FUNCTION_PASS("assume-simplify" , AssumeSimplifyPass()) |
| 402 | FUNCTION_PASS("atomic-expand" , AtomicExpandPass(TM)) |
| 403 | FUNCTION_PASS("bdce" , BDCEPass()) |
| 404 | FUNCTION_PASS("break-crit-edges" , BreakCriticalEdgesPass()) |
| 405 | FUNCTION_PASS("callbr-prepare" , CallBrPreparePass()) |
| 406 | FUNCTION_PASS("callsite-splitting" , CallSiteSplittingPass()) |
| 407 | FUNCTION_PASS("chr" , ControlHeightReductionPass()) |
| 408 | FUNCTION_PASS("codegenprepare" , CodeGenPreparePass(TM)) |
| 409 | FUNCTION_PASS("complex-deinterleaving" , ComplexDeinterleavingPass(TM)) |
| 410 | FUNCTION_PASS("consthoist" , ConstantHoistingPass()) |
| 411 | FUNCTION_PASS("constraint-elimination" , ConstraintEliminationPass()) |
| 412 | FUNCTION_PASS("coro-elide" , CoroElidePass()) |
| 413 | FUNCTION_PASS("correlated-propagation" , CorrelatedValuePropagationPass()) |
| 414 | FUNCTION_PASS("count-visits" , CountVisitsPass()) |
| 415 | FUNCTION_PASS("dce" , DCEPass()) |
| 416 | FUNCTION_PASS("declare-to-assign" , llvm::AssignmentTrackingPass()) |
| 417 | FUNCTION_PASS("dfa-jump-threading" , DFAJumpThreadingPass()) |
| 418 | FUNCTION_PASS("div-rem-pairs" , DivRemPairsPass()) |
| 419 | FUNCTION_PASS("dot-cfg" , CFGPrinterPass()) |
| 420 | FUNCTION_PASS("dot-cfg-only" , CFGOnlyPrinterPass()) |
| 421 | FUNCTION_PASS("dot-dom" , DomPrinter()) |
| 422 | FUNCTION_PASS("dot-dom-only" , DomOnlyPrinter()) |
| 423 | FUNCTION_PASS("dot-post-dom" , PostDomPrinter()) |
| 424 | FUNCTION_PASS("dot-post-dom-only" , PostDomOnlyPrinter()) |
| 425 | FUNCTION_PASS("dse" , DSEPass()) |
| 426 | FUNCTION_PASS("dwarf-eh-prepare" , DwarfEHPreparePass(TM)) |
| 427 | FUNCTION_PASS("expand-large-div-rem" , ExpandLargeDivRemPass(TM)) |
| 428 | FUNCTION_PASS("expand-fp" , ExpandFpPass(TM)) |
| 429 | FUNCTION_PASS("expand-memcmp" , ExpandMemCmpPass(TM)) |
| 430 | FUNCTION_PASS("extra-vector-passes" , |
| 431 | ExtraFunctionPassManager<ShouldRunExtraVectorPasses>()) |
| 432 | FUNCTION_PASS("fix-irreducible" , FixIrreduciblePass()) |
| 433 | FUNCTION_PASS("flatten-cfg" , FlattenCFGPass()) |
| 434 | FUNCTION_PASS("float2int" , Float2IntPass()) |
| 435 | FUNCTION_PASS("gc-lowering" , GCLoweringPass()) |
| 436 | FUNCTION_PASS("guard-widening" , GuardWideningPass()) |
| 437 | FUNCTION_PASS("gvn-hoist" , GVNHoistPass()) |
| 438 | FUNCTION_PASS("gvn-sink" , GVNSinkPass()) |
| 439 | FUNCTION_PASS("helloworld" , HelloWorldPass()) |
| 440 | FUNCTION_PASS("indirectbr-expand" , IndirectBrExpandPass(TM)) |
| 441 | FUNCTION_PASS("infer-address-spaces" , InferAddressSpacesPass()) |
| 442 | FUNCTION_PASS("infer-alignment" , InferAlignmentPass()) |
| 443 | FUNCTION_PASS("inject-tli-mappings" , InjectTLIMappings()) |
| 444 | FUNCTION_PASS("instcount" , InstCountPass()) |
| 445 | FUNCTION_PASS("instnamer" , InstructionNamerPass()) |
| 446 | FUNCTION_PASS("instsimplify" , InstSimplifyPass()) |
| 447 | FUNCTION_PASS("interleaved-access" , InterleavedAccessPass(TM)) |
| 448 | FUNCTION_PASS("interleaved-load-combine" , InterleavedLoadCombinePass(TM)) |
| 449 | FUNCTION_PASS("invalidate<all>" , InvalidateAllAnalysesPass()) |
| 450 | FUNCTION_PASS("irce" , IRCEPass()) |
| 451 | FUNCTION_PASS("jump-threading" , JumpThreadingPass()) |
| 452 | FUNCTION_PASS("jump-table-to-switch" , JumpTableToSwitchPass()); |
| 453 | FUNCTION_PASS("kcfi" , KCFIPass()) |
| 454 | FUNCTION_PASS("kernel-info" , KernelInfoPrinter(TM)) |
| 455 | FUNCTION_PASS("lcssa" , LCSSAPass()) |
| 456 | FUNCTION_PASS("libcalls-shrinkwrap" , LibCallsShrinkWrapPass()) |
| 457 | FUNCTION_PASS("load-store-vectorizer" , LoadStoreVectorizerPass()) |
| 458 | FUNCTION_PASS("loop-data-prefetch" , LoopDataPrefetchPass()) |
| 459 | FUNCTION_PASS("loop-distribute" , LoopDistributePass()) |
| 460 | FUNCTION_PASS("loop-fusion" , LoopFusePass()) |
| 461 | FUNCTION_PASS("loop-load-elim" , LoopLoadEliminationPass()) |
| 462 | FUNCTION_PASS("loop-simplify" , LoopSimplifyPass()) |
| 463 | FUNCTION_PASS("loop-sink" , LoopSinkPass()) |
| 464 | FUNCTION_PASS("loop-versioning" , LoopVersioningPass()) |
| 465 | FUNCTION_PASS("lower-atomic" , LowerAtomicPass()) |
| 466 | FUNCTION_PASS("lower-constant-intrinsics" , LowerConstantIntrinsicsPass()) |
| 467 | FUNCTION_PASS("lower-expect" , LowerExpectIntrinsicPass()) |
| 468 | FUNCTION_PASS("lower-guard-intrinsic" , LowerGuardIntrinsicPass()) |
| 469 | FUNCTION_PASS("lower-invoke" , LowerInvokePass()) |
| 470 | FUNCTION_PASS("lower-switch" , LowerSwitchPass()) |
| 471 | FUNCTION_PASS("lower-widenable-condition" , LowerWidenableConditionPass()) |
| 472 | FUNCTION_PASS("make-guards-explicit" , MakeGuardsExplicitPass()) |
| 473 | FUNCTION_PASS("mem2reg" , PromotePass()) |
| 474 | FUNCTION_PASS("memcpyopt" , MemCpyOptPass()) |
| 475 | FUNCTION_PASS("memprof" , MemProfilerPass()) |
| 476 | FUNCTION_PASS("mergeicmps" , MergeICmpsPass()) |
| 477 | FUNCTION_PASS("mergereturn" , UnifyFunctionExitNodesPass()) |
| 478 | FUNCTION_PASS("move-auto-init" , MoveAutoInitPass()) |
| 479 | FUNCTION_PASS("nary-reassociate" , NaryReassociatePass()) |
| 480 | FUNCTION_PASS("newgvn" , NewGVNPass()) |
| 481 | FUNCTION_PASS("no-op-function" , NoOpFunctionPass()) |
| 482 | FUNCTION_PASS("objc-arc" , ObjCARCOptPass()) |
| 483 | FUNCTION_PASS("objc-arc-contract" , ObjCARCContractPass()) |
| 484 | FUNCTION_PASS("objc-arc-expand" , ObjCARCExpandPass()) |
| 485 | FUNCTION_PASS("pa-eval" , PAEvalPass()) |
| 486 | FUNCTION_PASS("partially-inline-libcalls" , PartiallyInlineLibCallsPass()) |
| 487 | FUNCTION_PASS("pgo-memop-opt" , PGOMemOPSizeOpt()) |
| 488 | FUNCTION_PASS("place-safepoints" , PlaceSafepointsPass()) |
| 489 | FUNCTION_PASS("print" , PrintFunctionPass(errs())) |
| 490 | // TODO: rename to print<foo> after NPM switch |
| 491 | FUNCTION_PASS("print-alias-sets" , AliasSetsPrinterPass(errs())) |
| 492 | FUNCTION_PASS("print-cfg-sccs" , CFGSCCPrinterPass(errs())) |
| 493 | FUNCTION_PASS("print-memderefs" , MemDerefPrinterPass(errs())) |
| 494 | FUNCTION_PASS("print-mustexecute" , MustExecutePrinterPass(errs())) |
| 495 | FUNCTION_PASS("print-predicateinfo" , PredicateInfoPrinterPass(errs())) |
| 496 | FUNCTION_PASS("print<assumptions>" , AssumptionPrinterPass(errs())) |
| 497 | FUNCTION_PASS("print<block-freq>" , BlockFrequencyPrinterPass(errs())) |
| 498 | FUNCTION_PASS("print<branch-prob>" , BranchProbabilityPrinterPass(errs())) |
| 499 | FUNCTION_PASS("print<cost-model>" , CostModelPrinterPass(errs())) |
| 500 | FUNCTION_PASS("print<cycles>" , CycleInfoPrinterPass(errs())) |
| 501 | FUNCTION_PASS("print<da>" , DependenceAnalysisPrinterPass(errs())) |
| 502 | FUNCTION_PASS("print<debug-ata>" , DebugAssignmentTrackingPrinterPass(errs())) |
| 503 | FUNCTION_PASS("print<delinearization>" , DelinearizationPrinterPass(errs())) |
| 504 | FUNCTION_PASS("print<demanded-bits>" , DemandedBitsPrinterPass(errs())) |
| 505 | FUNCTION_PASS("print<domfrontier>" , DominanceFrontierPrinterPass(errs())) |
| 506 | FUNCTION_PASS("print<domtree>" , DominatorTreePrinterPass(errs())) |
| 507 | FUNCTION_PASS("print<func-properties>" , FunctionPropertiesPrinterPass(errs())) |
| 508 | FUNCTION_PASS("print<inline-cost>" , InlineCostAnnotationPrinterPass(errs())) |
| 509 | FUNCTION_PASS("print<inliner-size-estimator>" , |
| 510 | InlineSizeEstimatorAnalysisPrinterPass(errs())) |
| 511 | FUNCTION_PASS("print<lazy-value-info>" , LazyValueInfoPrinterPass(errs())) |
| 512 | FUNCTION_PASS("print<loops>" , LoopPrinterPass(errs())) |
| 513 | FUNCTION_PASS("print<memoryssa-walker>" , MemorySSAWalkerPrinterPass(errs())) |
| 514 | FUNCTION_PASS("print<phi-values>" , PhiValuesPrinterPass(errs())) |
| 515 | FUNCTION_PASS("print<postdomtree>" , PostDominatorTreePrinterPass(errs())) |
| 516 | FUNCTION_PASS("print<regions>" , RegionInfoPrinterPass(errs())) |
| 517 | FUNCTION_PASS("print<scalar-evolution>" , ScalarEvolutionPrinterPass(errs())) |
| 518 | FUNCTION_PASS("print<stack-safety-local>" , StackSafetyPrinterPass(errs())) |
| 519 | FUNCTION_PASS("print<uniformity>" , UniformityInfoPrinterPass(errs())) |
| 520 | FUNCTION_PASS("reassociate" , ReassociatePass()) |
| 521 | FUNCTION_PASS("redundant-dbg-inst-elim" , RedundantDbgInstEliminationPass()) |
| 522 | FUNCTION_PASS("reg2mem" , RegToMemPass()) |
| 523 | FUNCTION_PASS("safe-stack" , SafeStackPass(TM)) |
| 524 | FUNCTION_PASS("sandbox-vectorizer" , SandboxVectorizerPass()) |
| 525 | FUNCTION_PASS("scalarize-masked-mem-intrin" , ScalarizeMaskedMemIntrinPass()) |
| 526 | FUNCTION_PASS("sccp" , SCCPPass()) |
| 527 | FUNCTION_PASS("select-optimize" , SelectOptimizePass(TM)) |
| 528 | FUNCTION_PASS("separate-const-offset-from-gep" , |
| 529 | SeparateConstOffsetFromGEPPass()) |
| 530 | FUNCTION_PASS("sink" , SinkingPass()) |
| 531 | FUNCTION_PASS("sjlj-eh-prepare" , SjLjEHPreparePass(TM)) |
| 532 | FUNCTION_PASS("slp-vectorizer" , SLPVectorizerPass()) |
| 533 | FUNCTION_PASS("slsr" , StraightLineStrengthReducePass()) |
| 534 | FUNCTION_PASS("stack-protector" , StackProtectorPass(TM)) |
| 535 | FUNCTION_PASS("strip-gc-relocates" , StripGCRelocates()) |
| 536 | FUNCTION_PASS("tailcallelim" , TailCallElimPass()) |
| 537 | FUNCTION_PASS("transform-warning" , WarnMissedTransformationsPass()) |
| 538 | FUNCTION_PASS("trigger-crash-function" , TriggerCrashFunctionPass()) |
| 539 | FUNCTION_PASS("trigger-verifier-error" , TriggerVerifierErrorPass()) |
| 540 | FUNCTION_PASS("tsan" , ThreadSanitizerPass()) |
| 541 | FUNCTION_PASS("typepromotion" , TypePromotionPass(TM)) |
| 542 | FUNCTION_PASS("unify-loop-exits" , UnifyLoopExitsPass()) |
| 543 | FUNCTION_PASS("vector-combine" , VectorCombinePass()) |
| 544 | FUNCTION_PASS("verify" , VerifierPass()) |
| 545 | FUNCTION_PASS("verify<cycles>" , CycleInfoVerifierPass()) |
| 546 | FUNCTION_PASS("verify<domtree>" , DominatorTreeVerifierPass()) |
| 547 | FUNCTION_PASS("verify<loops>" , LoopVerifierPass()) |
| 548 | FUNCTION_PASS("verify<memoryssa>" , MemorySSAVerifierPass()) |
| 549 | FUNCTION_PASS("verify<regions>" , RegionInfoVerifierPass()) |
| 550 | FUNCTION_PASS("verify<safepoint-ir>" , SafepointIRVerifierPass()) |
| 551 | FUNCTION_PASS("verify<scalar-evolution>" , ScalarEvolutionVerifierPass()) |
| 552 | FUNCTION_PASS("view-cfg" , CFGViewerPass()) |
| 553 | FUNCTION_PASS("view-cfg-only" , CFGOnlyViewerPass()) |
| 554 | FUNCTION_PASS("view-dom" , DomViewer()) |
| 555 | FUNCTION_PASS("view-dom-only" , DomOnlyViewer()) |
| 556 | FUNCTION_PASS("view-post-dom" , PostDomViewer()) |
| 557 | FUNCTION_PASS("view-post-dom-only" , PostDomOnlyViewer()) |
| 558 | FUNCTION_PASS("wasm-eh-prepare" , WasmEHPreparePass()) |
| 559 | #undef FUNCTION_PASS |
| 560 | |
| 561 | #ifndef FUNCTION_PASS_WITH_PARAMS |
| 562 | #define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) |
| 563 | #endif |
| 564 | FUNCTION_PASS_WITH_PARAMS( |
| 565 | "cfguard" , "CFGuardPass" , |
| 566 | [](CFGuardPass::Mechanism M) { return CFGuardPass(M); }, |
| 567 | parseCFGuardPassOptions, "check;dispatch" ) |
| 568 | FUNCTION_PASS_WITH_PARAMS( |
| 569 | "early-cse" , "EarlyCSEPass" , |
| 570 | [](bool UseMemorySSA) { return EarlyCSEPass(UseMemorySSA); }, |
| 571 | parseEarlyCSEPassOptions, "memssa" ) |
| 572 | FUNCTION_PASS_WITH_PARAMS( |
| 573 | "ee-instrument" , "EntryExitInstrumenterPass" , |
| 574 | [](bool PostInlining) { return EntryExitInstrumenterPass(PostInlining); }, |
| 575 | parseEntryExitInstrumenterPassOptions, "post-inline" ) |
| 576 | FUNCTION_PASS_WITH_PARAMS( |
| 577 | "function-simplification" , "" , |
| 578 | [this](OptimizationLevel OL) { |
| 579 | return buildFunctionSimplificationPipeline(OL, ThinOrFullLTOPhase::None); |
| 580 | }, |
| 581 | parseFunctionSimplificationPipelineOptions, "O1;O2;O3;Os;Oz" ) |
| 582 | FUNCTION_PASS_WITH_PARAMS( |
| 583 | "gvn" , "GVNPass" , [](GVNOptions Opts) { return GVNPass(Opts); }, |
| 584 | parseGVNOptions, |
| 585 | "no-pre;pre;no-load-pre;load-pre;no-split-backedge-load-pre;" |
| 586 | "split-backedge-load-pre;no-memdep;memdep;no-memoryssa;memoryssa" ) |
| 587 | FUNCTION_PASS_WITH_PARAMS( |
| 588 | "hardware-loops" , "HardwareLoopsPass" , |
| 589 | [](HardwareLoopOptions Opts) { return HardwareLoopsPass(Opts); }, |
| 590 | parseHardwareLoopOptions, |
| 591 | "force-hardware-loops;force-hardware-loop-phi;force-nested-hardware-loop;" |
| 592 | "force-hardware-loop-guard;hardware-loop-decrement=N;" |
| 593 | "hardware-loop-counter-bitwidth=N" ) |
| 594 | FUNCTION_PASS_WITH_PARAMS( |
| 595 | "instcombine" , "InstCombinePass" , |
| 596 | [](InstCombineOptions Opts) { return InstCombinePass(Opts); }, |
| 597 | parseInstCombineOptions, |
| 598 | "no-verify-fixpoint;verify-fixpoint;max-iterations=N" ) |
| 599 | FUNCTION_PASS_WITH_PARAMS( |
| 600 | "lint" , "LintPass" , |
| 601 | [](bool AbortOnError) { return LintPass(AbortOnError); }, parseLintOptions, |
| 602 | "abort-on-error" ) |
| 603 | FUNCTION_PASS_WITH_PARAMS( |
| 604 | "loop-unroll" , "LoopUnrollPass" , |
| 605 | [](LoopUnrollOptions Opts) { return LoopUnrollPass(Opts); }, |
| 606 | parseLoopUnrollOptions, |
| 607 | "O0;O1;O2;O3;full-unroll-max=N;no-partial;partial;no-peeling;peeling;" |
| 608 | "no-profile-peeling;profile-peeling;no-runtime;runtime;no-upperbound;" |
| 609 | "upperbound" ) |
| 610 | FUNCTION_PASS_WITH_PARAMS( |
| 611 | "loop-vectorize" , "LoopVectorizePass" , |
| 612 | [](LoopVectorizeOptions Opts) { return LoopVectorizePass(Opts); }, |
| 613 | parseLoopVectorizeOptions, |
| 614 | "no-interleave-forced-only;interleave-forced-only;no-vectorize-forced-only;" |
| 615 | "vectorize-forced-only" ) |
| 616 | FUNCTION_PASS_WITH_PARAMS( |
| 617 | "lower-allow-check" , "LowerAllowCheckPass" , |
| 618 | [](LowerAllowCheckPass::Options Opts) { return LowerAllowCheckPass(Opts); }, |
| 619 | parseLowerAllowCheckPassOptions, "cutoffs[indices]=N" ) |
| 620 | FUNCTION_PASS_WITH_PARAMS( |
| 621 | "lower-matrix-intrinsics" , "LowerMatrixIntrinsicsPass" , |
| 622 | [](bool Minimal) { return LowerMatrixIntrinsicsPass(Minimal); }, |
| 623 | parseLowerMatrixIntrinsicsPassOptions, "minimal" ) |
| 624 | FUNCTION_PASS_WITH_PARAMS( |
| 625 | "normalize" , "IRNormalizerPass" , |
| 626 | [](IRNormalizerOptions Options) { return IRNormalizerPass(Options); }, |
| 627 | parseIRNormalizerPassOptions, |
| 628 | "no-preserve-order;preserve-order;no-rename-all;rename-all;no-fold-all;" |
| 629 | "fold-all;no-reorder-operands;reorder-operands" ) |
| 630 | FUNCTION_PASS_WITH_PARAMS( |
| 631 | "mldst-motion" , "MergedLoadStoreMotionPass" , |
| 632 | [](MergedLoadStoreMotionOptions Opts) { |
| 633 | return MergedLoadStoreMotionPass(Opts); |
| 634 | }, |
| 635 | parseMergedLoadStoreMotionOptions, "no-split-footer-bb;split-footer-bb" ) |
| 636 | FUNCTION_PASS_WITH_PARAMS( |
| 637 | "print<access-info>" , "LoopAccessInfoPrinterPass" , |
| 638 | [](bool AllowPartial) { |
| 639 | return LoopAccessInfoPrinterPass(errs(), AllowPartial); |
| 640 | }, |
| 641 | [](StringRef Params) { |
| 642 | return PassBuilder::parseSinglePassOption(Params, "allow-partial" , |
| 643 | "LoopAccessInfoPrinterPass" ); |
| 644 | }, |
| 645 | "allow-partial" ) |
| 646 | FUNCTION_PASS_WITH_PARAMS( |
| 647 | "print<da>" , "DependenceAnalysisPrinterPass" , |
| 648 | [](bool NormalizeResults) { |
| 649 | return DependenceAnalysisPrinterPass(errs(), NormalizeResults); |
| 650 | }, |
| 651 | parseDependenceAnalysisPrinterOptions, "normalized-results" ) |
| 652 | FUNCTION_PASS_WITH_PARAMS( |
| 653 | "print<memoryssa>" , "MemorySSAPrinterPass" , |
| 654 | [](bool NoEnsureOptimizedUses) { |
| 655 | return MemorySSAPrinterPass(errs(), !NoEnsureOptimizedUses); |
| 656 | }, |
| 657 | parseMemorySSAPrinterPassOptions, "no-ensure-optimized-uses" ) |
| 658 | FUNCTION_PASS_WITH_PARAMS( |
| 659 | "print<stack-lifetime>" , "StackLifetimePrinterPass" , |
| 660 | [](StackLifetime::LivenessType Type) { |
| 661 | return StackLifetimePrinterPass(errs(), Type); |
| 662 | }, |
| 663 | parseStackLifetimeOptions, "may;must" ) |
| 664 | FUNCTION_PASS_WITH_PARAMS( |
| 665 | "scalarizer" , "ScalarizerPass" , |
| 666 | [](ScalarizerPassOptions Opts) { return ScalarizerPass(Opts); }, |
| 667 | parseScalarizerOptions, |
| 668 | "load-store;no-load-store;variable-insert-extract;" |
| 669 | "no-variable-insert-extract;min-bits=N;" ) |
| 670 | FUNCTION_PASS_WITH_PARAMS( |
| 671 | "separate-const-offset-from-gep" , "SeparateConstOffsetFromGEPPass" , |
| 672 | [](bool LowerGEP) { return SeparateConstOffsetFromGEPPass(LowerGEP); }, |
| 673 | parseSeparateConstOffsetFromGEPPassOptions, "lower-gep" ) |
| 674 | FUNCTION_PASS_WITH_PARAMS( |
| 675 | "simplifycfg" , "SimplifyCFGPass" , |
| 676 | [](SimplifyCFGOptions Opts) { return SimplifyCFGPass(Opts); }, |
| 677 | parseSimplifyCFGOptions, |
| 678 | "no-speculate-blocks;speculate-blocks;no-simplify-cond-branch;" |
| 679 | "simplify-cond-branch;no-forward-switch-cond;forward-switch-cond;" |
| 680 | "no-switch-range-to-icmp;switch-range-to-icmp;no-switch-to-lookup;" |
| 681 | "switch-to-lookup;no-keep-loops;keep-loops;no-hoist-common-insts;" |
| 682 | "hoist-common-insts;no-hoist-loads-stores-with-cond-faulting;" |
| 683 | "hoist-loads-stores-with-cond-faulting;no-sink-common-insts;" |
| 684 | "sink-common-insts;no-speculate-unpredictables;speculate-unpredictables;" |
| 685 | "bonus-inst-threshold=N" ) |
| 686 | FUNCTION_PASS_WITH_PARAMS( |
| 687 | "speculative-execution" , "SpeculativeExecutionPass" , |
| 688 | [](bool OnlyIfDivergentTarget) { |
| 689 | return SpeculativeExecutionPass(OnlyIfDivergentTarget); |
| 690 | }, |
| 691 | parseSpeculativeExecutionPassOptions, "only-if-divergent-target" ) |
| 692 | FUNCTION_PASS_WITH_PARAMS( |
| 693 | "sroa" , "SROAPass" , |
| 694 | [](SROAOptions PreserveCFG) { return SROAPass(PreserveCFG); }, |
| 695 | parseSROAOptions, "preserve-cfg;modify-cfg" ) |
| 696 | FUNCTION_PASS_WITH_PARAMS( |
| 697 | "structurizecfg" , "StructurizeCFG" , |
| 698 | [](bool SkipUniformRegions) { |
| 699 | return StructurizeCFGPass(SkipUniformRegions); |
| 700 | }, |
| 701 | parseStructurizeCFGPassOptions, "skip-uniform-regions" ) |
| 702 | FUNCTION_PASS_WITH_PARAMS( |
| 703 | "win-eh-prepare" , "WinEHPreparePass" , |
| 704 | [](bool DemoteCatchSwitchPHIOnly) { |
| 705 | return WinEHPreparePass(DemoteCatchSwitchPHIOnly); |
| 706 | }, |
| 707 | parseWinEHPrepareOptions, "demote-catchswitch-only" ) |
| 708 | FUNCTION_PASS_WITH_PARAMS( |
| 709 | "bounds-checking" , "BoundsCheckingPass" , |
| 710 | [](BoundsCheckingPass::Options Options) { |
| 711 | return BoundsCheckingPass(Options); |
| 712 | }, |
| 713 | parseBoundsCheckingOptions, |
| 714 | "trap;rt;rt-abort;min-rt;min-rt-abort;merge;guard=N" ) |
| 715 | #undef FUNCTION_PASS_WITH_PARAMS |
| 716 | |
| 717 | #ifndef LOOPNEST_PASS |
| 718 | #define LOOPNEST_PASS(NAME, CREATE_PASS) |
| 719 | #endif |
| 720 | LOOPNEST_PASS("loop-flatten" , LoopFlattenPass()) |
| 721 | LOOPNEST_PASS("loop-interchange" , LoopInterchangePass()) |
| 722 | LOOPNEST_PASS("loop-unroll-and-jam" , LoopUnrollAndJamPass()) |
| 723 | LOOPNEST_PASS("no-op-loopnest" , NoOpLoopNestPass()) |
| 724 | #undef LOOPNEST_PASS |
| 725 | |
| 726 | #ifndef LOOP_ANALYSIS |
| 727 | #define LOOP_ANALYSIS(NAME, CREATE_PASS) |
| 728 | #endif |
| 729 | LOOP_ANALYSIS("ddg" , DDGAnalysis()) |
| 730 | LOOP_ANALYSIS("iv-users" , IVUsersAnalysis()) |
| 731 | LOOP_ANALYSIS("no-op-loop" , NoOpLoopAnalysis()) |
| 732 | LOOP_ANALYSIS("pass-instrumentation" , PassInstrumentationAnalysis(PIC)) |
| 733 | LOOP_ANALYSIS("should-run-extra-simple-loop-unswitch" , |
| 734 | ShouldRunExtraSimpleLoopUnswitch()) |
| 735 | |
| 736 | #undef LOOP_ANALYSIS |
| 737 | |
| 738 | #ifndef LOOP_PASS |
| 739 | #define LOOP_PASS(NAME, CREATE_PASS) |
| 740 | #endif |
| 741 | LOOP_PASS("canon-freeze" , CanonicalizeFreezeInLoopsPass()) |
| 742 | LOOP_PASS("dot-ddg" , DDGDotPrinterPass()) |
| 743 | LOOP_PASS("evl-iv-simplify" , EVLIndVarSimplifyPass()) |
| 744 | LOOP_PASS("guard-widening" , GuardWideningPass()) |
| 745 | LOOP_PASS("extra-simple-loop-unswitch-passes" , |
| 746 | ExtraLoopPassManager<ShouldRunExtraSimpleLoopUnswitch>()) |
| 747 | LOOP_PASS("indvars" , IndVarSimplifyPass()) |
| 748 | LOOP_PASS("invalidate<all>" , InvalidateAllAnalysesPass()) |
| 749 | LOOP_PASS("loop-bound-split" , LoopBoundSplitPass()) |
| 750 | LOOP_PASS("loop-deletion" , LoopDeletionPass()) |
| 751 | LOOP_PASS("loop-idiom" , LoopIdiomRecognizePass()) |
| 752 | LOOP_PASS("loop-idiom-vectorize" , LoopIdiomVectorizePass()) |
| 753 | LOOP_PASS("loop-instsimplify" , LoopInstSimplifyPass()) |
| 754 | LOOP_PASS("loop-predication" , LoopPredicationPass()) |
| 755 | LOOP_PASS("loop-reduce" , LoopStrengthReducePass()) |
| 756 | LOOP_PASS("loop-term-fold" , LoopTermFoldPass()) |
| 757 | LOOP_PASS("loop-simplifycfg" , LoopSimplifyCFGPass()) |
| 758 | LOOP_PASS("loop-unroll-full" , LoopFullUnrollPass()) |
| 759 | LOOP_PASS("loop-versioning-licm" , LoopVersioningLICMPass()) |
| 760 | LOOP_PASS("no-op-loop" , NoOpLoopPass()) |
| 761 | LOOP_PASS("print" , PrintLoopPass(errs())) |
| 762 | LOOP_PASS("print<ddg>" , DDGAnalysisPrinterPass(errs())) |
| 763 | LOOP_PASS("print<hash-recognize>" , HashRecognizePrinterPass(errs())) |
| 764 | LOOP_PASS("print<iv-users>" , IVUsersPrinterPass(errs())) |
| 765 | LOOP_PASS("print<loop-cache-cost>" , LoopCachePrinterPass(errs())) |
| 766 | LOOP_PASS("print<loopnest>" , LoopNestPrinterPass(errs())) |
| 767 | #undef LOOP_PASS |
| 768 | |
| 769 | #ifndef LOOP_PASS_WITH_PARAMS |
| 770 | #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) |
| 771 | #endif |
| 772 | LOOP_PASS_WITH_PARAMS( |
| 773 | "licm" , "LICMPass" , [](LICMOptions Params) { return LICMPass(Params); }, |
| 774 | parseLICMOptions, "allowspeculation;no-allowspeculation" ) |
| 775 | LOOP_PASS_WITH_PARAMS( |
| 776 | "lnicm" , "LNICMPass" , [](LICMOptions Params) { return LNICMPass(Params); }, |
| 777 | parseLICMOptions, "allowspeculation;no-allowspeculation" ) |
| 778 | LOOP_PASS_WITH_PARAMS( |
| 779 | "loop-rotate" , "LoopRotatePass" , |
| 780 | [](std::pair<bool, bool> Params) { |
| 781 | return LoopRotatePass(Params.first, Params.second); |
| 782 | }, |
| 783 | parseLoopRotateOptions, |
| 784 | "no-header-duplication;header-duplication;" |
| 785 | "no-prepare-for-lto;prepare-for-lto" ) |
| 786 | LOOP_PASS_WITH_PARAMS( |
| 787 | "simple-loop-unswitch" , "SimpleLoopUnswitchPass" , |
| 788 | [](std::pair<bool, bool> Params) { |
| 789 | return SimpleLoopUnswitchPass(Params.first, Params.second); |
| 790 | }, |
| 791 | parseLoopUnswitchOptions, "nontrivial;no-nontrivial;trivial;no-trivial" ) |
| 792 | #undef LOOP_PASS_WITH_PARAMS |
| 793 | |