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 | |