1 //===- Parsing and selection of pass pipelines ----------------------------===//
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 /// \file
9 ///
10 /// This file provides the implementation of the PassBuilder based on our
11 /// static pass registry as well as related functionality. It also provides
12 /// helpers to aid in analyzing, debugging, and testing passes and pass
13 /// pipelines.
14 ///
15 //===----------------------------------------------------------------------===//
16 
17 #include "llvm/Passes/PassBuilder.h"
18 #include "llvm/ADT/StringSwitch.h"
19 #include "llvm/Analysis/AliasAnalysisEvaluator.h"
20 #include "llvm/Analysis/AliasSetTracker.h"
21 #include "llvm/Analysis/AssumptionCache.h"
22 #include "llvm/Analysis/BasicAliasAnalysis.h"
23 #include "llvm/Analysis/BlockFrequencyInfo.h"
24 #include "llvm/Analysis/BranchProbabilityInfo.h"
25 #include "llvm/Analysis/CFGPrinter.h"
26 #include "llvm/Analysis/CFLAndersAliasAnalysis.h"
27 #include "llvm/Analysis/CFLSteensAliasAnalysis.h"
28 #include "llvm/Analysis/CGSCCPassManager.h"
29 #include "llvm/Analysis/CallGraph.h"
30 #include "llvm/Analysis/CostModel.h"
31 #include "llvm/Analysis/CycleAnalysis.h"
32 #include "llvm/Analysis/DDG.h"
33 #include "llvm/Analysis/DDGPrinter.h"
34 #include "llvm/Analysis/Delinearization.h"
35 #include "llvm/Analysis/DemandedBits.h"
36 #include "llvm/Analysis/DependenceAnalysis.h"
37 #include "llvm/Analysis/DivergenceAnalysis.h"
38 #include "llvm/Analysis/DomPrinter.h"
39 #include "llvm/Analysis/DominanceFrontier.h"
40 #include "llvm/Analysis/FunctionPropertiesAnalysis.h"
41 #include "llvm/Analysis/GlobalsModRef.h"
42 #include "llvm/Analysis/IRSimilarityIdentifier.h"
43 #include "llvm/Analysis/IVUsers.h"
44 #include "llvm/Analysis/InlineAdvisor.h"
45 #include "llvm/Analysis/InlineSizeEstimatorAnalysis.h"
46 #include "llvm/Analysis/InstCount.h"
47 #include "llvm/Analysis/LazyCallGraph.h"
48 #include "llvm/Analysis/LazyValueInfo.h"
49 #include "llvm/Analysis/Lint.h"
50 #include "llvm/Analysis/LoopAccessAnalysis.h"
51 #include "llvm/Analysis/LoopCacheAnalysis.h"
52 #include "llvm/Analysis/LoopInfo.h"
53 #include "llvm/Analysis/LoopNestAnalysis.h"
54 #include "llvm/Analysis/MemDerefPrinter.h"
55 #include "llvm/Analysis/MemoryDependenceAnalysis.h"
56 #include "llvm/Analysis/MemorySSA.h"
57 #include "llvm/Analysis/ModuleDebugInfoPrinter.h"
58 #include "llvm/Analysis/ModuleSummaryAnalysis.h"
59 #include "llvm/Analysis/MustExecute.h"
60 #include "llvm/Analysis/ObjCARCAliasAnalysis.h"
61 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
62 #include "llvm/Analysis/PhiValues.h"
63 #include "llvm/Analysis/PostDominators.h"
64 #include "llvm/Analysis/ProfileSummaryInfo.h"
65 #include "llvm/Analysis/RegionInfo.h"
66 #include "llvm/Analysis/ScalarEvolution.h"
67 #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
68 #include "llvm/Analysis/ScopedNoAliasAA.h"
69 #include "llvm/Analysis/StackLifetime.h"
70 #include "llvm/Analysis/StackSafetyAnalysis.h"
71 #include "llvm/Analysis/TargetLibraryInfo.h"
72 #include "llvm/Analysis/TargetTransformInfo.h"
73 #include "llvm/Analysis/TypeBasedAliasAnalysis.h"
74 #include "llvm/IR/Dominators.h"
75 #include "llvm/IR/IRPrintingPasses.h"
76 #include "llvm/IR/PassManager.h"
77 #include "llvm/IR/PrintPasses.h"
78 #include "llvm/IR/SafepointIRVerifier.h"
79 #include "llvm/IR/Verifier.h"
80 #include "llvm/Support/CommandLine.h"
81 #include "llvm/Support/Debug.h"
82 #include "llvm/Support/ErrorHandling.h"
83 #include "llvm/Support/FormatVariadic.h"
84 #include "llvm/Support/Regex.h"
85 #include "llvm/Target/TargetMachine.h"
86 #include "llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h"
87 #include "llvm/Transforms/Coroutines/CoroCleanup.h"
88 #include "llvm/Transforms/Coroutines/CoroEarly.h"
89 #include "llvm/Transforms/Coroutines/CoroElide.h"
90 #include "llvm/Transforms/Coroutines/CoroSplit.h"
91 #include "llvm/Transforms/IPO/AlwaysInliner.h"
92 #include "llvm/Transforms/IPO/Annotation2Metadata.h"
93 #include "llvm/Transforms/IPO/ArgumentPromotion.h"
94 #include "llvm/Transforms/IPO/Attributor.h"
95 #include "llvm/Transforms/IPO/BlockExtractor.h"
96 #include "llvm/Transforms/IPO/CalledValuePropagation.h"
97 #include "llvm/Transforms/IPO/ConstantMerge.h"
98 #include "llvm/Transforms/IPO/CrossDSOCFI.h"
99 #include "llvm/Transforms/IPO/DeadArgumentElimination.h"
100 #include "llvm/Transforms/IPO/ElimAvailExtern.h"
101 #include "llvm/Transforms/IPO/ForceFunctionAttrs.h"
102 #include "llvm/Transforms/IPO/FunctionAttrs.h"
103 #include "llvm/Transforms/IPO/FunctionImport.h"
104 #include "llvm/Transforms/IPO/GlobalDCE.h"
105 #include "llvm/Transforms/IPO/GlobalOpt.h"
106 #include "llvm/Transforms/IPO/GlobalSplit.h"
107 #include "llvm/Transforms/IPO/HotColdSplitting.h"
108 #include "llvm/Transforms/IPO/IROutliner.h"
109 #include "llvm/Transforms/IPO/InferFunctionAttrs.h"
110 #include "llvm/Transforms/IPO/Inliner.h"
111 #include "llvm/Transforms/IPO/Internalize.h"
112 #include "llvm/Transforms/IPO/LoopExtractor.h"
113 #include "llvm/Transforms/IPO/LowerTypeTests.h"
114 #include "llvm/Transforms/IPO/MergeFunctions.h"
115 #include "llvm/Transforms/IPO/ModuleInliner.h"
116 #include "llvm/Transforms/IPO/OpenMPOpt.h"
117 #include "llvm/Transforms/IPO/PartialInlining.h"
118 #include "llvm/Transforms/IPO/SCCP.h"
119 #include "llvm/Transforms/IPO/SampleProfile.h"
120 #include "llvm/Transforms/IPO/SampleProfileProbe.h"
121 #include "llvm/Transforms/IPO/StripDeadPrototypes.h"
122 #include "llvm/Transforms/IPO/StripSymbols.h"
123 #include "llvm/Transforms/IPO/SyntheticCountsPropagation.h"
124 #include "llvm/Transforms/IPO/WholeProgramDevirt.h"
125 #include "llvm/Transforms/InstCombine/InstCombine.h"
126 #include "llvm/Transforms/Instrumentation.h"
127 #include "llvm/Transforms/Instrumentation/AddressSanitizer.h"
128 #include "llvm/Transforms/Instrumentation/BoundsChecking.h"
129 #include "llvm/Transforms/Instrumentation/CGProfile.h"
130 #include "llvm/Transforms/Instrumentation/ControlHeightReduction.h"
131 #include "llvm/Transforms/Instrumentation/DataFlowSanitizer.h"
132 #include "llvm/Transforms/Instrumentation/GCOVProfiler.h"
133 #include "llvm/Transforms/Instrumentation/HWAddressSanitizer.h"
134 #include "llvm/Transforms/Instrumentation/InstrOrderFile.h"
135 #include "llvm/Transforms/Instrumentation/InstrProfiling.h"
136 #include "llvm/Transforms/Instrumentation/MemProfiler.h"
137 #include "llvm/Transforms/Instrumentation/MemorySanitizer.h"
138 #include "llvm/Transforms/Instrumentation/PGOInstrumentation.h"
139 #include "llvm/Transforms/Instrumentation/PoisonChecking.h"
140 #include "llvm/Transforms/Instrumentation/SanitizerCoverage.h"
141 #include "llvm/Transforms/Instrumentation/ThreadSanitizer.h"
142 #include "llvm/Transforms/ObjCARC.h"
143 #include "llvm/Transforms/Scalar/ADCE.h"
144 #include "llvm/Transforms/Scalar/AlignmentFromAssumptions.h"
145 #include "llvm/Transforms/Scalar/AnnotationRemarks.h"
146 #include "llvm/Transforms/Scalar/BDCE.h"
147 #include "llvm/Transforms/Scalar/CallSiteSplitting.h"
148 #include "llvm/Transforms/Scalar/ConstantHoisting.h"
149 #include "llvm/Transforms/Scalar/ConstraintElimination.h"
150 #include "llvm/Transforms/Scalar/CorrelatedValuePropagation.h"
151 #include "llvm/Transforms/Scalar/DCE.h"
152 #include "llvm/Transforms/Scalar/DFAJumpThreading.h"
153 #include "llvm/Transforms/Scalar/DeadStoreElimination.h"
154 #include "llvm/Transforms/Scalar/DivRemPairs.h"
155 #include "llvm/Transforms/Scalar/EarlyCSE.h"
156 #include "llvm/Transforms/Scalar/FlattenCFG.h"
157 #include "llvm/Transforms/Scalar/Float2Int.h"
158 #include "llvm/Transforms/Scalar/GVN.h"
159 #include "llvm/Transforms/Scalar/GuardWidening.h"
160 #include "llvm/Transforms/Scalar/IVUsersPrinter.h"
161 #include "llvm/Transforms/Scalar/IndVarSimplify.h"
162 #include "llvm/Transforms/Scalar/InductiveRangeCheckElimination.h"
163 #include "llvm/Transforms/Scalar/InferAddressSpaces.h"
164 #include "llvm/Transforms/Scalar/InstSimplifyPass.h"
165 #include "llvm/Transforms/Scalar/JumpThreading.h"
166 #include "llvm/Transforms/Scalar/LICM.h"
167 #include "llvm/Transforms/Scalar/LoopAccessAnalysisPrinter.h"
168 #include "llvm/Transforms/Scalar/LoopBoundSplit.h"
169 #include "llvm/Transforms/Scalar/LoopDataPrefetch.h"
170 #include "llvm/Transforms/Scalar/LoopDeletion.h"
171 #include "llvm/Transforms/Scalar/LoopDistribute.h"
172 #include "llvm/Transforms/Scalar/LoopFlatten.h"
173 #include "llvm/Transforms/Scalar/LoopFuse.h"
174 #include "llvm/Transforms/Scalar/LoopIdiomRecognize.h"
175 #include "llvm/Transforms/Scalar/LoopInstSimplify.h"
176 #include "llvm/Transforms/Scalar/LoopInterchange.h"
177 #include "llvm/Transforms/Scalar/LoopLoadElimination.h"
178 #include "llvm/Transforms/Scalar/LoopPassManager.h"
179 #include "llvm/Transforms/Scalar/LoopPredication.h"
180 #include "llvm/Transforms/Scalar/LoopReroll.h"
181 #include "llvm/Transforms/Scalar/LoopRotation.h"
182 #include "llvm/Transforms/Scalar/LoopSimplifyCFG.h"
183 #include "llvm/Transforms/Scalar/LoopSink.h"
184 #include "llvm/Transforms/Scalar/LoopStrengthReduce.h"
185 #include "llvm/Transforms/Scalar/LoopUnrollAndJamPass.h"
186 #include "llvm/Transforms/Scalar/LoopUnrollPass.h"
187 #include "llvm/Transforms/Scalar/LoopVersioningLICM.h"
188 #include "llvm/Transforms/Scalar/LowerAtomic.h"
189 #include "llvm/Transforms/Scalar/LowerConstantIntrinsics.h"
190 #include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
191 #include "llvm/Transforms/Scalar/LowerGuardIntrinsic.h"
192 #include "llvm/Transforms/Scalar/LowerMatrixIntrinsics.h"
193 #include "llvm/Transforms/Scalar/LowerWidenableCondition.h"
194 #include "llvm/Transforms/Scalar/MakeGuardsExplicit.h"
195 #include "llvm/Transforms/Scalar/MemCpyOptimizer.h"
196 #include "llvm/Transforms/Scalar/MergeICmps.h"
197 #include "llvm/Transforms/Scalar/MergedLoadStoreMotion.h"
198 #include "llvm/Transforms/Scalar/NaryReassociate.h"
199 #include "llvm/Transforms/Scalar/NewGVN.h"
200 #include "llvm/Transforms/Scalar/PartiallyInlineLibCalls.h"
201 #include "llvm/Transforms/Scalar/Reassociate.h"
202 #include "llvm/Transforms/Scalar/Reg2Mem.h"
203 #include "llvm/Transforms/Scalar/RewriteStatepointsForGC.h"
204 #include "llvm/Transforms/Scalar/SCCP.h"
205 #include "llvm/Transforms/Scalar/SROA.h"
206 #include "llvm/Transforms/Scalar/ScalarizeMaskedMemIntrin.h"
207 #include "llvm/Transforms/Scalar/Scalarizer.h"
208 #include "llvm/Transforms/Scalar/SeparateConstOffsetFromGEP.h"
209 #include "llvm/Transforms/Scalar/SimpleLoopUnswitch.h"
210 #include "llvm/Transforms/Scalar/SimplifyCFG.h"
211 #include "llvm/Transforms/Scalar/Sink.h"
212 #include "llvm/Transforms/Scalar/SpeculativeExecution.h"
213 #include "llvm/Transforms/Scalar/StraightLineStrengthReduce.h"
214 #include "llvm/Transforms/Scalar/StructurizeCFG.h"
215 #include "llvm/Transforms/Scalar/TailRecursionElimination.h"
216 #include "llvm/Transforms/Scalar/WarnMissedTransforms.h"
217 #include "llvm/Transforms/Utils/AddDiscriminators.h"
218 #include "llvm/Transforms/Utils/AssumeBundleBuilder.h"
219 #include "llvm/Transforms/Utils/BreakCriticalEdges.h"
220 #include "llvm/Transforms/Utils/CanonicalizeAliases.h"
221 #include "llvm/Transforms/Utils/CanonicalizeFreezeInLoops.h"
222 #include "llvm/Transforms/Utils/Debugify.h"
223 #include "llvm/Transforms/Utils/EntryExitInstrumenter.h"
224 #include "llvm/Transforms/Utils/FixIrreducible.h"
225 #include "llvm/Transforms/Utils/HelloWorld.h"
226 #include "llvm/Transforms/Utils/InjectTLIMappings.h"
227 #include "llvm/Transforms/Utils/InstructionNamer.h"
228 #include "llvm/Transforms/Utils/LCSSA.h"
229 #include "llvm/Transforms/Utils/LibCallsShrinkWrap.h"
230 #include "llvm/Transforms/Utils/LoopSimplify.h"
231 #include "llvm/Transforms/Utils/LoopVersioning.h"
232 #include "llvm/Transforms/Utils/LowerInvoke.h"
233 #include "llvm/Transforms/Utils/LowerSwitch.h"
234 #include "llvm/Transforms/Utils/Mem2Reg.h"
235 #include "llvm/Transforms/Utils/MetaRenamer.h"
236 #include "llvm/Transforms/Utils/NameAnonGlobals.h"
237 #include "llvm/Transforms/Utils/PredicateInfo.h"
238 #include "llvm/Transforms/Utils/RelLookupTableConverter.h"
239 #include "llvm/Transforms/Utils/StripGCRelocates.h"
240 #include "llvm/Transforms/Utils/StripNonLineTableDebugInfo.h"
241 #include "llvm/Transforms/Utils/SymbolRewriter.h"
242 #include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
243 #include "llvm/Transforms/Utils/UnifyLoopExits.h"
244 #include "llvm/Transforms/Vectorize/LoadStoreVectorizer.h"
245 #include "llvm/Transforms/Vectorize/LoopVectorize.h"
246 #include "llvm/Transforms/Vectorize/SLPVectorizer.h"
247 #include "llvm/Transforms/Vectorize/VectorCombine.h"
248 
249 using namespace llvm;
250 
251 static const Regex DefaultAliasRegex(
252     "^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$");
253 
254 namespace llvm {
255 cl::opt<bool> PrintPipelinePasses(
256     "print-pipeline-passes",
257     cl::desc("Print a '-passes' compatible string describing the pipeline "
258              "(best-effort only)."));
259 } // namespace llvm
260 
261 namespace {
262 
263 // The following passes/analyses have custom names, otherwise their name will
264 // include `(anonymous namespace)`. These are special since they are only for
265 // testing purposes and don't live in a header file.
266 
267 /// No-op module pass which does nothing.
268 struct NoOpModulePass : PassInfoMixin<NoOpModulePass> {
269   PreservedAnalyses run(Module &M, ModuleAnalysisManager &) {
270     return PreservedAnalyses::all();
271   }
272 
273   static StringRef name() { return "NoOpModulePass"; }
274 };
275 
276 /// No-op module analysis.
277 class NoOpModuleAnalysis : public AnalysisInfoMixin<NoOpModuleAnalysis> {
278   friend AnalysisInfoMixin<NoOpModuleAnalysis>;
279   static AnalysisKey Key;
280 
281 public:
282   struct Result {};
283   Result run(Module &, ModuleAnalysisManager &) { return Result(); }
284   static StringRef name() { return "NoOpModuleAnalysis"; }
285 };
286 
287 /// No-op CGSCC pass which does nothing.
288 struct NoOpCGSCCPass : PassInfoMixin<NoOpCGSCCPass> {
289   PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &,
290                         LazyCallGraph &, CGSCCUpdateResult &UR) {
291     return PreservedAnalyses::all();
292   }
293   static StringRef name() { return "NoOpCGSCCPass"; }
294 };
295 
296 /// No-op CGSCC analysis.
297 class NoOpCGSCCAnalysis : public AnalysisInfoMixin<NoOpCGSCCAnalysis> {
298   friend AnalysisInfoMixin<NoOpCGSCCAnalysis>;
299   static AnalysisKey Key;
300 
301 public:
302   struct Result {};
303   Result run(LazyCallGraph::SCC &, CGSCCAnalysisManager &, LazyCallGraph &G) {
304     return Result();
305   }
306   static StringRef name() { return "NoOpCGSCCAnalysis"; }
307 };
308 
309 /// No-op function pass which does nothing.
310 struct NoOpFunctionPass : PassInfoMixin<NoOpFunctionPass> {
311   PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
312     return PreservedAnalyses::all();
313   }
314   static StringRef name() { return "NoOpFunctionPass"; }
315 };
316 
317 /// No-op function analysis.
318 class NoOpFunctionAnalysis : public AnalysisInfoMixin<NoOpFunctionAnalysis> {
319   friend AnalysisInfoMixin<NoOpFunctionAnalysis>;
320   static AnalysisKey Key;
321 
322 public:
323   struct Result {};
324   Result run(Function &, FunctionAnalysisManager &) { return Result(); }
325   static StringRef name() { return "NoOpFunctionAnalysis"; }
326 };
327 
328 /// No-op loop nest pass which does nothing.
329 struct NoOpLoopNestPass : PassInfoMixin<NoOpLoopNestPass> {
330   PreservedAnalyses run(LoopNest &L, LoopAnalysisManager &,
331                         LoopStandardAnalysisResults &, LPMUpdater &) {
332     return PreservedAnalyses::all();
333   }
334   static StringRef name() { return "NoOpLoopNestPass"; }
335 };
336 
337 /// No-op loop pass which does nothing.
338 struct NoOpLoopPass : PassInfoMixin<NoOpLoopPass> {
339   PreservedAnalyses run(Loop &L, LoopAnalysisManager &,
340                         LoopStandardAnalysisResults &, LPMUpdater &) {
341     return PreservedAnalyses::all();
342   }
343   static StringRef name() { return "NoOpLoopPass"; }
344 };
345 
346 /// No-op loop analysis.
347 class NoOpLoopAnalysis : public AnalysisInfoMixin<NoOpLoopAnalysis> {
348   friend AnalysisInfoMixin<NoOpLoopAnalysis>;
349   static AnalysisKey Key;
350 
351 public:
352   struct Result {};
353   Result run(Loop &, LoopAnalysisManager &, LoopStandardAnalysisResults &) {
354     return Result();
355   }
356   static StringRef name() { return "NoOpLoopAnalysis"; }
357 };
358 
359 AnalysisKey NoOpModuleAnalysis::Key;
360 AnalysisKey NoOpCGSCCAnalysis::Key;
361 AnalysisKey NoOpFunctionAnalysis::Key;
362 AnalysisKey NoOpLoopAnalysis::Key;
363 
364 /// Whether or not we should populate a PassInstrumentationCallbacks's class to
365 /// pass name map.
366 ///
367 /// This is for optimization purposes so we don't populate it if we never use
368 /// it. This should be updated if new pass instrumentation wants to use the map.
369 /// We currently only use this for --print-before/after.
370 bool shouldPopulateClassToPassNames() {
371   return PrintPipelinePasses || !printBeforePasses().empty() ||
372          !printAfterPasses().empty();
373 }
374 
375 } // namespace
376 
377 PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
378                          Optional<PGOOptions> PGOOpt,
379                          PassInstrumentationCallbacks *PIC)
380     : TM(TM), PTO(PTO), PGOOpt(PGOOpt), PIC(PIC) {
381   if (TM)
382     TM->registerPassBuilderCallbacks(*this);
383   if (PIC && shouldPopulateClassToPassNames()) {
384 #define MODULE_PASS(NAME, CREATE_PASS)                                         \
385   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
386 #define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)      \
387   PIC->addClassToPassName(CLASS, NAME);
388 #define MODULE_ANALYSIS(NAME, CREATE_PASS)                                     \
389   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
390 #define FUNCTION_PASS(NAME, CREATE_PASS)                                       \
391   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
392 #define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)    \
393   PIC->addClassToPassName(CLASS, NAME);
394 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS)                                   \
395   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
396 #define LOOPNEST_PASS(NAME, CREATE_PASS)                                       \
397   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
398 #define LOOP_PASS(NAME, CREATE_PASS)                                           \
399   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
400 #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)        \
401   PIC->addClassToPassName(CLASS, NAME);
402 #define LOOP_ANALYSIS(NAME, CREATE_PASS)                                       \
403   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
404 #define CGSCC_PASS(NAME, CREATE_PASS)                                          \
405   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
406 #define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)       \
407   PIC->addClassToPassName(CLASS, NAME);
408 #define CGSCC_ANALYSIS(NAME, CREATE_PASS)                                      \
409   PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
410 #include "PassRegistry.def"
411   }
412 }
413 
414 void PassBuilder::registerModuleAnalyses(ModuleAnalysisManager &MAM) {
415 #define MODULE_ANALYSIS(NAME, CREATE_PASS)                                     \
416   MAM.registerPass([&] { return CREATE_PASS; });
417 #include "PassRegistry.def"
418 
419   for (auto &C : ModuleAnalysisRegistrationCallbacks)
420     C(MAM);
421 }
422 
423 void PassBuilder::registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM) {
424 #define CGSCC_ANALYSIS(NAME, CREATE_PASS)                                      \
425   CGAM.registerPass([&] { return CREATE_PASS; });
426 #include "PassRegistry.def"
427 
428   for (auto &C : CGSCCAnalysisRegistrationCallbacks)
429     C(CGAM);
430 }
431 
432 void PassBuilder::registerFunctionAnalyses(FunctionAnalysisManager &FAM) {
433   // We almost always want the default alias analysis pipeline.
434   // If a user wants a different one, they can register their own before calling
435   // registerFunctionAnalyses().
436   FAM.registerPass([&] { return buildDefaultAAPipeline(); });
437 
438 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS)                                   \
439   FAM.registerPass([&] { return CREATE_PASS; });
440 #include "PassRegistry.def"
441 
442   for (auto &C : FunctionAnalysisRegistrationCallbacks)
443     C(FAM);
444 }
445 
446 void PassBuilder::registerLoopAnalyses(LoopAnalysisManager &LAM) {
447 #define LOOP_ANALYSIS(NAME, CREATE_PASS)                                       \
448   LAM.registerPass([&] { return CREATE_PASS; });
449 #include "PassRegistry.def"
450 
451   for (auto &C : LoopAnalysisRegistrationCallbacks)
452     C(LAM);
453 }
454 
455 static Optional<int> parseRepeatPassName(StringRef Name) {
456   if (!Name.consume_front("repeat<") || !Name.consume_back(">"))
457     return None;
458   int Count;
459   if (Name.getAsInteger(0, Count) || Count <= 0)
460     return None;
461   return Count;
462 }
463 
464 static Optional<int> parseDevirtPassName(StringRef Name) {
465   if (!Name.consume_front("devirt<") || !Name.consume_back(">"))
466     return None;
467   int Count;
468   if (Name.getAsInteger(0, Count) || Count < 0)
469     return None;
470   return Count;
471 }
472 
473 static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
474   if (!Name.consume_front(PassName))
475     return false;
476   // normal pass name w/o parameters == default parameters
477   if (Name.empty())
478     return true;
479   return Name.startswith("<") && Name.endswith(">");
480 }
481 
482 namespace {
483 
484 /// This performs customized parsing of pass name with parameters.
485 ///
486 /// We do not need parametrization of passes in textual pipeline very often,
487 /// yet on a rare occasion ability to specify parameters right there can be
488 /// useful.
489 ///
490 /// \p Name - parameterized specification of a pass from a textual pipeline
491 /// is a string in a form of :
492 ///      PassName '<' parameter-list '>'
493 ///
494 /// Parameter list is being parsed by the parser callable argument, \p Parser,
495 /// It takes a string-ref of parameters and returns either StringError or a
496 /// parameter list in a form of a custom parameters type, all wrapped into
497 /// Expected<> template class.
498 ///
499 template <typename ParametersParseCallableT>
500 auto parsePassParameters(ParametersParseCallableT &&Parser, StringRef Name,
501                          StringRef PassName) -> decltype(Parser(StringRef{})) {
502   using ParametersT = typename decltype(Parser(StringRef{}))::value_type;
503 
504   StringRef Params = Name;
505   if (!Params.consume_front(PassName)) {
506     assert(false &&
507            "unable to strip pass name from parametrized pass specification");
508   }
509   if (!Params.empty() &&
510       (!Params.consume_front("<") || !Params.consume_back(">"))) {
511     assert(false && "invalid format for parametrized pass name");
512   }
513 
514   Expected<ParametersT> Result = Parser(Params);
515   assert((Result || Result.template errorIsA<StringError>()) &&
516          "Pass parameter parser can only return StringErrors.");
517   return Result;
518 }
519 
520 /// Parser of parameters for LoopUnroll pass.
521 Expected<LoopUnrollOptions> parseLoopUnrollOptions(StringRef Params) {
522   LoopUnrollOptions UnrollOpts;
523   while (!Params.empty()) {
524     StringRef ParamName;
525     std::tie(ParamName, Params) = Params.split(';');
526     int OptLevel = StringSwitch<int>(ParamName)
527                        .Case("O0", 0)
528                        .Case("O1", 1)
529                        .Case("O2", 2)
530                        .Case("O3", 3)
531                        .Default(-1);
532     if (OptLevel >= 0) {
533       UnrollOpts.setOptLevel(OptLevel);
534       continue;
535     }
536     if (ParamName.consume_front("full-unroll-max=")) {
537       int Count;
538       if (ParamName.getAsInteger(0, Count))
539         return make_error<StringError>(
540             formatv("invalid LoopUnrollPass parameter '{0}' ", ParamName).str(),
541             inconvertibleErrorCode());
542       UnrollOpts.setFullUnrollMaxCount(Count);
543       continue;
544     }
545 
546     bool Enable = !ParamName.consume_front("no-");
547     if (ParamName == "partial") {
548       UnrollOpts.setPartial(Enable);
549     } else if (ParamName == "peeling") {
550       UnrollOpts.setPeeling(Enable);
551     } else if (ParamName == "profile-peeling") {
552       UnrollOpts.setProfileBasedPeeling(Enable);
553     } else if (ParamName == "runtime") {
554       UnrollOpts.setRuntime(Enable);
555     } else if (ParamName == "upperbound") {
556       UnrollOpts.setUpperBound(Enable);
557     } else {
558       return make_error<StringError>(
559           formatv("invalid LoopUnrollPass parameter '{0}' ", ParamName).str(),
560           inconvertibleErrorCode());
561     }
562   }
563   return UnrollOpts;
564 }
565 
566 Expected<bool> parseSinglePassOption(StringRef Params, StringRef OptionName,
567                                      StringRef PassName) {
568   bool Result = false;
569   while (!Params.empty()) {
570     StringRef ParamName;
571     std::tie(ParamName, Params) = Params.split(';');
572 
573     if (ParamName == OptionName) {
574       Result = true;
575     } else {
576       return make_error<StringError>(
577           formatv("invalid {1} pass parameter '{0}' ", ParamName, PassName)
578               .str(),
579           inconvertibleErrorCode());
580     }
581   }
582   return Result;
583 }
584 
585 Expected<bool> parseInlinerPassOptions(StringRef Params) {
586   return parseSinglePassOption(Params, "only-mandatory", "InlinerPass");
587 }
588 
589 Expected<bool> parseEarlyCSEPassOptions(StringRef Params) {
590   return parseSinglePassOption(Params, "memssa", "EarlyCSE");
591 }
592 
593 Expected<bool> parseEntryExitInstrumenterPassOptions(StringRef Params) {
594   return parseSinglePassOption(Params, "post-inline", "EntryExitInstrumenter");
595 }
596 
597 Expected<bool> parseLoopExtractorPassOptions(StringRef Params) {
598   return parseSinglePassOption(Params, "single", "LoopExtractor");
599 }
600 
601 Expected<bool> parseLowerMatrixIntrinsicsPassOptions(StringRef Params) {
602   return parseSinglePassOption(Params, "minimal", "LowerMatrixIntrinsics");
603 }
604 
605 Expected<AddressSanitizerOptions> parseASanPassOptions(StringRef Params) {
606   AddressSanitizerOptions Result;
607   while (!Params.empty()) {
608     StringRef ParamName;
609     std::tie(ParamName, Params) = Params.split(';');
610 
611     if (ParamName == "kernel") {
612       Result.CompileKernel = true;
613     } else {
614       return make_error<StringError>(
615           formatv("invalid AddressSanitizer pass parameter '{0}' ", ParamName)
616               .str(),
617           inconvertibleErrorCode());
618     }
619   }
620   return Result;
621 }
622 
623 Expected<HWAddressSanitizerOptions> parseHWASanPassOptions(StringRef Params) {
624   HWAddressSanitizerOptions Result;
625   while (!Params.empty()) {
626     StringRef ParamName;
627     std::tie(ParamName, Params) = Params.split(';');
628 
629     if (ParamName == "recover") {
630       Result.Recover = true;
631     } else if (ParamName == "kernel") {
632       Result.CompileKernel = true;
633     } else {
634       return make_error<StringError>(
635           formatv("invalid HWAddressSanitizer pass parameter '{0}' ", ParamName)
636               .str(),
637           inconvertibleErrorCode());
638     }
639   }
640   return Result;
641 }
642 
643 Expected<MemorySanitizerOptions> parseMSanPassOptions(StringRef Params) {
644   MemorySanitizerOptions Result;
645   while (!Params.empty()) {
646     StringRef ParamName;
647     std::tie(ParamName, Params) = Params.split(';');
648 
649     if (ParamName == "recover") {
650       Result.Recover = true;
651     } else if (ParamName == "kernel") {
652       Result.Kernel = true;
653     } else if (ParamName.consume_front("track-origins=")) {
654       if (ParamName.getAsInteger(0, Result.TrackOrigins))
655         return make_error<StringError>(
656             formatv("invalid argument to MemorySanitizer pass track-origins "
657                     "parameter: '{0}' ",
658                     ParamName)
659                 .str(),
660             inconvertibleErrorCode());
661     } else if (ParamName == "eager-checks") {
662       Result.EagerChecks = true;
663     } else {
664       return make_error<StringError>(
665           formatv("invalid MemorySanitizer pass parameter '{0}' ", ParamName)
666               .str(),
667           inconvertibleErrorCode());
668     }
669   }
670   return Result;
671 }
672 
673 /// Parser of parameters for SimplifyCFG pass.
674 Expected<SimplifyCFGOptions> parseSimplifyCFGOptions(StringRef Params) {
675   SimplifyCFGOptions Result;
676   while (!Params.empty()) {
677     StringRef ParamName;
678     std::tie(ParamName, Params) = Params.split(';');
679 
680     bool Enable = !ParamName.consume_front("no-");
681     if (ParamName == "forward-switch-cond") {
682       Result.forwardSwitchCondToPhi(Enable);
683     } else if (ParamName == "switch-range-to-icmp") {
684       Result.convertSwitchRangeToICmp(Enable);
685     } else if (ParamName == "switch-to-lookup") {
686       Result.convertSwitchToLookupTable(Enable);
687     } else if (ParamName == "keep-loops") {
688       Result.needCanonicalLoops(Enable);
689     } else if (ParamName == "hoist-common-insts") {
690       Result.hoistCommonInsts(Enable);
691     } else if (ParamName == "sink-common-insts") {
692       Result.sinkCommonInsts(Enable);
693     } else if (Enable && ParamName.consume_front("bonus-inst-threshold=")) {
694       APInt BonusInstThreshold;
695       if (ParamName.getAsInteger(0, BonusInstThreshold))
696         return make_error<StringError>(
697             formatv("invalid argument to SimplifyCFG pass bonus-threshold "
698                     "parameter: '{0}' ",
699                     ParamName).str(),
700             inconvertibleErrorCode());
701       Result.bonusInstThreshold(BonusInstThreshold.getSExtValue());
702     } else {
703       return make_error<StringError>(
704           formatv("invalid SimplifyCFG pass parameter '{0}' ", ParamName).str(),
705           inconvertibleErrorCode());
706     }
707   }
708   return Result;
709 }
710 
711 /// Parser of parameters for LoopVectorize pass.
712 Expected<LoopVectorizeOptions> parseLoopVectorizeOptions(StringRef Params) {
713   LoopVectorizeOptions Opts;
714   while (!Params.empty()) {
715     StringRef ParamName;
716     std::tie(ParamName, Params) = Params.split(';');
717 
718     bool Enable = !ParamName.consume_front("no-");
719     if (ParamName == "interleave-forced-only") {
720       Opts.setInterleaveOnlyWhenForced(Enable);
721     } else if (ParamName == "vectorize-forced-only") {
722       Opts.setVectorizeOnlyWhenForced(Enable);
723     } else {
724       return make_error<StringError>(
725           formatv("invalid LoopVectorize parameter '{0}' ", ParamName).str(),
726           inconvertibleErrorCode());
727     }
728   }
729   return Opts;
730 }
731 
732 Expected<std::pair<bool, bool>> parseLoopUnswitchOptions(StringRef Params) {
733   std::pair<bool, bool> Result = {false, true};
734   while (!Params.empty()) {
735     StringRef ParamName;
736     std::tie(ParamName, Params) = Params.split(';');
737 
738     bool Enable = !ParamName.consume_front("no-");
739     if (ParamName == "nontrivial") {
740       Result.first = Enable;
741     } else if (ParamName == "trivial") {
742       Result.second = Enable;
743     } else {
744       return make_error<StringError>(
745           formatv("invalid LoopUnswitch pass parameter '{0}' ", ParamName)
746               .str(),
747           inconvertibleErrorCode());
748     }
749   }
750   return Result;
751 }
752 
753 Expected<bool> parseMergedLoadStoreMotionOptions(StringRef Params) {
754   bool Result = false;
755   while (!Params.empty()) {
756     StringRef ParamName;
757     std::tie(ParamName, Params) = Params.split(';');
758 
759     bool Enable = !ParamName.consume_front("no-");
760     if (ParamName == "split-footer-bb") {
761       Result = Enable;
762     } else {
763       return make_error<StringError>(
764           formatv("invalid MergedLoadStoreMotion pass parameter '{0}' ",
765                   ParamName)
766               .str(),
767           inconvertibleErrorCode());
768     }
769   }
770   return Result;
771 }
772 
773 Expected<GVNOptions> parseGVNOptions(StringRef Params) {
774   GVNOptions Result;
775   while (!Params.empty()) {
776     StringRef ParamName;
777     std::tie(ParamName, Params) = Params.split(';');
778 
779     bool Enable = !ParamName.consume_front("no-");
780     if (ParamName == "pre") {
781       Result.setPRE(Enable);
782     } else if (ParamName == "load-pre") {
783       Result.setLoadPRE(Enable);
784     } else if (ParamName == "split-backedge-load-pre") {
785       Result.setLoadPRESplitBackedge(Enable);
786     } else if (ParamName == "memdep") {
787       Result.setMemDep(Enable);
788     } else {
789       return make_error<StringError>(
790           formatv("invalid GVN pass parameter '{0}' ", ParamName).str(),
791           inconvertibleErrorCode());
792     }
793   }
794   return Result;
795 }
796 
797 Expected<StackLifetime::LivenessType>
798 parseStackLifetimeOptions(StringRef Params) {
799   StackLifetime::LivenessType Result = StackLifetime::LivenessType::May;
800   while (!Params.empty()) {
801     StringRef ParamName;
802     std::tie(ParamName, Params) = Params.split(';');
803 
804     if (ParamName == "may") {
805       Result = StackLifetime::LivenessType::May;
806     } else if (ParamName == "must") {
807       Result = StackLifetime::LivenessType::Must;
808     } else {
809       return make_error<StringError>(
810           formatv("invalid StackLifetime parameter '{0}' ", ParamName).str(),
811           inconvertibleErrorCode());
812     }
813   }
814   return Result;
815 }
816 
817 } // namespace
818 
819 /// Tests whether a pass name starts with a valid prefix for a default pipeline
820 /// alias.
821 static bool startsWithDefaultPipelineAliasPrefix(StringRef Name) {
822   return Name.startswith("default") || Name.startswith("thinlto") ||
823          Name.startswith("lto");
824 }
825 
826 /// Tests whether registered callbacks will accept a given pass name.
827 ///
828 /// When parsing a pipeline text, the type of the outermost pipeline may be
829 /// omitted, in which case the type is automatically determined from the first
830 /// pass name in the text. This may be a name that is handled through one of the
831 /// callbacks. We check this through the oridinary parsing callbacks by setting
832 /// up a dummy PassManager in order to not force the client to also handle this
833 /// type of query.
834 template <typename PassManagerT, typename CallbacksT>
835 static bool callbacksAcceptPassName(StringRef Name, CallbacksT &Callbacks) {
836   if (!Callbacks.empty()) {
837     PassManagerT DummyPM;
838     for (auto &CB : Callbacks)
839       if (CB(Name, DummyPM, {}))
840         return true;
841   }
842   return false;
843 }
844 
845 template <typename CallbacksT>
846 static bool isModulePassName(StringRef Name, CallbacksT &Callbacks) {
847   // Manually handle aliases for pre-configured pipeline fragments.
848   if (startsWithDefaultPipelineAliasPrefix(Name))
849     return DefaultAliasRegex.match(Name);
850 
851   // Explicitly handle pass manager names.
852   if (Name == "module")
853     return true;
854   if (Name == "cgscc")
855     return true;
856   if (Name == "function" || Name == "function<eager-inv>")
857     return true;
858 
859   // Explicitly handle custom-parsed pass names.
860   if (parseRepeatPassName(Name))
861     return true;
862 
863 #define MODULE_PASS(NAME, CREATE_PASS)                                         \
864   if (Name == NAME)                                                            \
865     return true;
866 #define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)      \
867   if (checkParametrizedPassName(Name, NAME))                                   \
868     return true;
869 #define MODULE_ANALYSIS(NAME, CREATE_PASS)                                     \
870   if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">")           \
871     return true;
872 #include "PassRegistry.def"
873 
874   return callbacksAcceptPassName<ModulePassManager>(Name, Callbacks);
875 }
876 
877 template <typename CallbacksT>
878 static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks) {
879   // Explicitly handle pass manager names.
880   if (Name == "cgscc")
881     return true;
882   if (Name == "function" || Name == "function<eager-inv>")
883     return true;
884 
885   // Explicitly handle custom-parsed pass names.
886   if (parseRepeatPassName(Name))
887     return true;
888   if (parseDevirtPassName(Name))
889     return true;
890 
891 #define CGSCC_PASS(NAME, CREATE_PASS)                                          \
892   if (Name == NAME)                                                            \
893     return true;
894 #define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)       \
895   if (checkParametrizedPassName(Name, NAME))                                   \
896     return true;
897 #define CGSCC_ANALYSIS(NAME, CREATE_PASS)                                      \
898   if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">")           \
899     return true;
900 #include "PassRegistry.def"
901 
902   return callbacksAcceptPassName<CGSCCPassManager>(Name, Callbacks);
903 }
904 
905 template <typename CallbacksT>
906 static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks) {
907   // Explicitly handle pass manager names.
908   if (Name == "function" || Name == "function<eager-inv>")
909     return true;
910   if (Name == "loop" || Name == "loop-mssa")
911     return true;
912 
913   // Explicitly handle custom-parsed pass names.
914   if (parseRepeatPassName(Name))
915     return true;
916 
917 #define FUNCTION_PASS(NAME, CREATE_PASS)                                       \
918   if (Name == NAME)                                                            \
919     return true;
920 #define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)    \
921   if (checkParametrizedPassName(Name, NAME))                                   \
922     return true;
923 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS)                                   \
924   if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">")           \
925     return true;
926 #include "PassRegistry.def"
927 
928   return callbacksAcceptPassName<FunctionPassManager>(Name, Callbacks);
929 }
930 
931 template <typename CallbacksT>
932 static bool isLoopNestPassName(StringRef Name, CallbacksT &Callbacks,
933                                bool &UseMemorySSA) {
934   UseMemorySSA = false;
935 
936   // Explicitly handle custom-parsed pass names.
937   if (parseRepeatPassName(Name))
938     return true;
939 
940   if (Name == "lnicm") {
941     UseMemorySSA = true;
942     return true;
943   }
944 
945 #define LOOPNEST_PASS(NAME, CREATE_PASS)                                       \
946   if (Name == NAME)                                                            \
947     return true;
948 #include "PassRegistry.def"
949 
950   return callbacksAcceptPassName<LoopPassManager>(Name, Callbacks);
951 }
952 
953 template <typename CallbacksT>
954 static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks,
955                            bool &UseMemorySSA) {
956   UseMemorySSA = false;
957 
958   // Explicitly handle custom-parsed pass names.
959   if (parseRepeatPassName(Name))
960     return true;
961 
962   if (Name == "licm") {
963     UseMemorySSA = true;
964     return true;
965   }
966 
967 #define LOOP_PASS(NAME, CREATE_PASS)                                           \
968   if (Name == NAME)                                                            \
969     return true;
970 #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)        \
971   if (checkParametrizedPassName(Name, NAME))                                   \
972     return true;
973 #define LOOP_ANALYSIS(NAME, CREATE_PASS)                                       \
974   if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">")           \
975     return true;
976 #include "PassRegistry.def"
977 
978   return callbacksAcceptPassName<LoopPassManager>(Name, Callbacks);
979 }
980 
981 Optional<std::vector<PassBuilder::PipelineElement>>
982 PassBuilder::parsePipelineText(StringRef Text) {
983   std::vector<PipelineElement> ResultPipeline;
984 
985   SmallVector<std::vector<PipelineElement> *, 4> PipelineStack = {
986       &ResultPipeline};
987   for (;;) {
988     std::vector<PipelineElement> &Pipeline = *PipelineStack.back();
989     size_t Pos = Text.find_first_of(",()");
990     Pipeline.push_back({Text.substr(0, Pos), {}});
991 
992     // If we have a single terminating name, we're done.
993     if (Pos == Text.npos)
994       break;
995 
996     char Sep = Text[Pos];
997     Text = Text.substr(Pos + 1);
998     if (Sep == ',')
999       // Just a name ending in a comma, continue.
1000       continue;
1001 
1002     if (Sep == '(') {
1003       // Push the inner pipeline onto the stack to continue processing.
1004       PipelineStack.push_back(&Pipeline.back().InnerPipeline);
1005       continue;
1006     }
1007 
1008     assert(Sep == ')' && "Bogus separator!");
1009     // When handling the close parenthesis, we greedily consume them to avoid
1010     // empty strings in the pipeline.
1011     do {
1012       // If we try to pop the outer pipeline we have unbalanced parentheses.
1013       if (PipelineStack.size() == 1)
1014         return None;
1015 
1016       PipelineStack.pop_back();
1017     } while (Text.consume_front(")"));
1018 
1019     // Check if we've finished parsing.
1020     if (Text.empty())
1021       break;
1022 
1023     // Otherwise, the end of an inner pipeline always has to be followed by
1024     // a comma, and then we can continue.
1025     if (!Text.consume_front(","))
1026       return None;
1027   }
1028 
1029   if (PipelineStack.size() > 1)
1030     // Unbalanced paretheses.
1031     return None;
1032 
1033   assert(PipelineStack.back() == &ResultPipeline &&
1034          "Wrong pipeline at the bottom of the stack!");
1035   return {std::move(ResultPipeline)};
1036 }
1037 
1038 Error PassBuilder::parseModulePass(ModulePassManager &MPM,
1039                                    const PipelineElement &E) {
1040   auto &Name = E.Name;
1041   auto &InnerPipeline = E.InnerPipeline;
1042 
1043   // First handle complex passes like the pass managers which carry pipelines.
1044   if (!InnerPipeline.empty()) {
1045     if (Name == "module") {
1046       ModulePassManager NestedMPM;
1047       if (auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1048         return Err;
1049       MPM.addPass(std::move(NestedMPM));
1050       return Error::success();
1051     }
1052     if (Name == "cgscc") {
1053       CGSCCPassManager CGPM;
1054       if (auto Err = parseCGSCCPassPipeline(CGPM, InnerPipeline))
1055         return Err;
1056       MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM)));
1057       return Error::success();
1058     }
1059     if (Name == "function" || Name == "function<eager-inv>") {
1060       FunctionPassManager FPM;
1061       if (auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1062         return Err;
1063       MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM),
1064                                                     Name != "function"));
1065       return Error::success();
1066     }
1067     if (auto Count = parseRepeatPassName(Name)) {
1068       ModulePassManager NestedMPM;
1069       if (auto Err = parseModulePassPipeline(NestedMPM, InnerPipeline))
1070         return Err;
1071       MPM.addPass(createRepeatedPass(*Count, std::move(NestedMPM)));
1072       return Error::success();
1073     }
1074 
1075     for (auto &C : ModulePipelineParsingCallbacks)
1076       if (C(Name, MPM, InnerPipeline))
1077         return Error::success();
1078 
1079     // Normal passes can't have pipelines.
1080     return make_error<StringError>(
1081         formatv("invalid use of '{0}' pass as module pipeline", Name).str(),
1082         inconvertibleErrorCode());
1083     ;
1084   }
1085 
1086   // Manually handle aliases for pre-configured pipeline fragments.
1087   if (startsWithDefaultPipelineAliasPrefix(Name)) {
1088     SmallVector<StringRef, 3> Matches;
1089     if (!DefaultAliasRegex.match(Name, &Matches))
1090       return make_error<StringError>(
1091           formatv("unknown default pipeline alias '{0}'", Name).str(),
1092           inconvertibleErrorCode());
1093 
1094     assert(Matches.size() == 3 && "Must capture two matched strings!");
1095 
1096     OptimizationLevel L = StringSwitch<OptimizationLevel>(Matches[2])
1097                               .Case("O0", OptimizationLevel::O0)
1098                               .Case("O1", OptimizationLevel::O1)
1099                               .Case("O2", OptimizationLevel::O2)
1100                               .Case("O3", OptimizationLevel::O3)
1101                               .Case("Os", OptimizationLevel::Os)
1102                               .Case("Oz", OptimizationLevel::Oz);
1103     if (L == OptimizationLevel::O0 && Matches[1] != "thinlto" &&
1104         Matches[1] != "lto") {
1105       MPM.addPass(buildO0DefaultPipeline(L, Matches[1] == "thinlto-pre-link" ||
1106                                                 Matches[1] == "lto-pre-link"));
1107       return Error::success();
1108     }
1109 
1110     // This is consistent with old pass manager invoked via opt, but
1111     // inconsistent with clang. Clang doesn't enable loop vectorization
1112     // but does enable slp vectorization at Oz.
1113     PTO.LoopVectorization =
1114         L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
1115     PTO.SLPVectorization =
1116         L.getSpeedupLevel() > 1 && L != OptimizationLevel::Oz;
1117 
1118     if (Matches[1] == "default") {
1119       MPM.addPass(buildPerModuleDefaultPipeline(L));
1120     } else if (Matches[1] == "thinlto-pre-link") {
1121       MPM.addPass(buildThinLTOPreLinkDefaultPipeline(L));
1122     } else if (Matches[1] == "thinlto") {
1123       MPM.addPass(buildThinLTODefaultPipeline(L, nullptr));
1124     } else if (Matches[1] == "lto-pre-link") {
1125       MPM.addPass(buildLTOPreLinkDefaultPipeline(L));
1126     } else {
1127       assert(Matches[1] == "lto" && "Not one of the matched options!");
1128       MPM.addPass(buildLTODefaultPipeline(L, nullptr));
1129     }
1130     return Error::success();
1131   }
1132 
1133   // Finally expand the basic registered passes from the .inc file.
1134 #define MODULE_PASS(NAME, CREATE_PASS)                                         \
1135   if (Name == NAME) {                                                          \
1136     MPM.addPass(CREATE_PASS);                                                  \
1137     return Error::success();                                                   \
1138   }
1139 #define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)      \
1140   if (checkParametrizedPassName(Name, NAME)) {                                 \
1141     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1142     if (!Params)                                                               \
1143       return Params.takeError();                                               \
1144     MPM.addPass(CREATE_PASS(Params.get()));                                    \
1145     return Error::success();                                                   \
1146   }
1147 #define MODULE_ANALYSIS(NAME, CREATE_PASS)                                     \
1148   if (Name == "require<" NAME ">") {                                           \
1149     MPM.addPass(                                                               \
1150         RequireAnalysisPass<                                                   \
1151             std::remove_reference<decltype(CREATE_PASS)>::type, Module>());    \
1152     return Error::success();                                                   \
1153   }                                                                            \
1154   if (Name == "invalidate<" NAME ">") {                                        \
1155     MPM.addPass(InvalidateAnalysisPass<                                        \
1156                 std::remove_reference<decltype(CREATE_PASS)>::type>());        \
1157     return Error::success();                                                   \
1158   }
1159 #define CGSCC_PASS(NAME, CREATE_PASS)                                          \
1160   if (Name == NAME) {                                                          \
1161     MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS));         \
1162     return Error::success();                                                   \
1163   }
1164 #define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)       \
1165   if (checkParametrizedPassName(Name, NAME)) {                                 \
1166     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1167     if (!Params)                                                               \
1168       return Params.takeError();                                               \
1169     MPM.addPass(                                                               \
1170         createModuleToPostOrderCGSCCPassAdaptor(CREATE_PASS(Params.get())));   \
1171     return Error::success();                                                   \
1172   }
1173 #define FUNCTION_PASS(NAME, CREATE_PASS)                                       \
1174   if (Name == NAME) {                                                          \
1175     MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS));               \
1176     return Error::success();                                                   \
1177   }
1178 #define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)    \
1179   if (checkParametrizedPassName(Name, NAME)) {                                 \
1180     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1181     if (!Params)                                                               \
1182       return Params.takeError();                                               \
1183     MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
1184     return Error::success();                                                   \
1185   }
1186 #define LOOPNEST_PASS(NAME, CREATE_PASS)                                       \
1187   if (Name == NAME) {                                                          \
1188     MPM.addPass(createModuleToFunctionPassAdaptor(                             \
1189         createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)));          \
1190     return Error::success();                                                   \
1191   }
1192 #define LOOP_PASS(NAME, CREATE_PASS)                                           \
1193   if (Name == NAME) {                                                          \
1194     MPM.addPass(createModuleToFunctionPassAdaptor(                             \
1195         createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)));          \
1196     return Error::success();                                                   \
1197   }
1198 #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)        \
1199   if (checkParametrizedPassName(Name, NAME)) {                                 \
1200     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1201     if (!Params)                                                               \
1202       return Params.takeError();                                               \
1203     MPM.addPass(                                                               \
1204         createModuleToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(     \
1205             CREATE_PASS(Params.get()), false, false)));                        \
1206     return Error::success();                                                   \
1207   }
1208 #include "PassRegistry.def"
1209 
1210   for (auto &C : ModulePipelineParsingCallbacks)
1211     if (C(Name, MPM, InnerPipeline))
1212       return Error::success();
1213   return make_error<StringError>(
1214       formatv("unknown module pass '{0}'", Name).str(),
1215       inconvertibleErrorCode());
1216 }
1217 
1218 Error PassBuilder::parseCGSCCPass(CGSCCPassManager &CGPM,
1219                                   const PipelineElement &E) {
1220   auto &Name = E.Name;
1221   auto &InnerPipeline = E.InnerPipeline;
1222 
1223   // First handle complex passes like the pass managers which carry pipelines.
1224   if (!InnerPipeline.empty()) {
1225     if (Name == "cgscc") {
1226       CGSCCPassManager NestedCGPM;
1227       if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1228         return Err;
1229       // Add the nested pass manager with the appropriate adaptor.
1230       CGPM.addPass(std::move(NestedCGPM));
1231       return Error::success();
1232     }
1233     if (Name == "function" || Name == "function<eager-inv>") {
1234       FunctionPassManager FPM;
1235       if (auto Err = parseFunctionPassPipeline(FPM, InnerPipeline))
1236         return Err;
1237       // Add the nested pass manager with the appropriate adaptor.
1238       CGPM.addPass(
1239           createCGSCCToFunctionPassAdaptor(std::move(FPM), Name != "function"));
1240       return Error::success();
1241     }
1242     if (auto Count = parseRepeatPassName(Name)) {
1243       CGSCCPassManager NestedCGPM;
1244       if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1245         return Err;
1246       CGPM.addPass(createRepeatedPass(*Count, std::move(NestedCGPM)));
1247       return Error::success();
1248     }
1249     if (auto MaxRepetitions = parseDevirtPassName(Name)) {
1250       CGSCCPassManager NestedCGPM;
1251       if (auto Err = parseCGSCCPassPipeline(NestedCGPM, InnerPipeline))
1252         return Err;
1253       CGPM.addPass(
1254           createDevirtSCCRepeatedPass(std::move(NestedCGPM), *MaxRepetitions));
1255       return Error::success();
1256     }
1257 
1258     for (auto &C : CGSCCPipelineParsingCallbacks)
1259       if (C(Name, CGPM, InnerPipeline))
1260         return Error::success();
1261 
1262     // Normal passes can't have pipelines.
1263     return make_error<StringError>(
1264         formatv("invalid use of '{0}' pass as cgscc pipeline", Name).str(),
1265         inconvertibleErrorCode());
1266   }
1267 
1268 // Now expand the basic registered passes from the .inc file.
1269 #define CGSCC_PASS(NAME, CREATE_PASS)                                          \
1270   if (Name == NAME) {                                                          \
1271     CGPM.addPass(CREATE_PASS);                                                 \
1272     return Error::success();                                                   \
1273   }
1274 #define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)       \
1275   if (checkParametrizedPassName(Name, NAME)) {                                 \
1276     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1277     if (!Params)                                                               \
1278       return Params.takeError();                                               \
1279     CGPM.addPass(CREATE_PASS(Params.get()));                                   \
1280     return Error::success();                                                   \
1281   }
1282 #define CGSCC_ANALYSIS(NAME, CREATE_PASS)                                      \
1283   if (Name == "require<" NAME ">") {                                           \
1284     CGPM.addPass(RequireAnalysisPass<                                          \
1285                  std::remove_reference<decltype(CREATE_PASS)>::type,           \
1286                  LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &,    \
1287                  CGSCCUpdateResult &>());                                      \
1288     return Error::success();                                                   \
1289   }                                                                            \
1290   if (Name == "invalidate<" NAME ">") {                                        \
1291     CGPM.addPass(InvalidateAnalysisPass<                                       \
1292                  std::remove_reference<decltype(CREATE_PASS)>::type>());       \
1293     return Error::success();                                                   \
1294   }
1295 #define FUNCTION_PASS(NAME, CREATE_PASS)                                       \
1296   if (Name == NAME) {                                                          \
1297     CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS));               \
1298     return Error::success();                                                   \
1299   }
1300 #define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)    \
1301   if (checkParametrizedPassName(Name, NAME)) {                                 \
1302     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1303     if (!Params)                                                               \
1304       return Params.takeError();                                               \
1305     CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS(Params.get()))); \
1306     return Error::success();                                                   \
1307   }
1308 #define LOOPNEST_PASS(NAME, CREATE_PASS)                                       \
1309   if (Name == NAME) {                                                          \
1310     CGPM.addPass(createCGSCCToFunctionPassAdaptor(                             \
1311         createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)));          \
1312     return Error::success();                                                   \
1313   }
1314 #define LOOP_PASS(NAME, CREATE_PASS)                                           \
1315   if (Name == NAME) {                                                          \
1316     CGPM.addPass(createCGSCCToFunctionPassAdaptor(                             \
1317         createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)));          \
1318     return Error::success();                                                   \
1319   }
1320 #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)        \
1321   if (checkParametrizedPassName(Name, NAME)) {                                 \
1322     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1323     if (!Params)                                                               \
1324       return Params.takeError();                                               \
1325     CGPM.addPass(                                                              \
1326         createCGSCCToFunctionPassAdaptor(createFunctionToLoopPassAdaptor(      \
1327             CREATE_PASS(Params.get()), false, false)));                        \
1328     return Error::success();                                                   \
1329   }
1330 #include "PassRegistry.def"
1331 
1332   for (auto &C : CGSCCPipelineParsingCallbacks)
1333     if (C(Name, CGPM, InnerPipeline))
1334       return Error::success();
1335   return make_error<StringError>(
1336       formatv("unknown cgscc pass '{0}'", Name).str(),
1337       inconvertibleErrorCode());
1338 }
1339 
1340 Error PassBuilder::parseFunctionPass(FunctionPassManager &FPM,
1341                                      const PipelineElement &E) {
1342   auto &Name = E.Name;
1343   auto &InnerPipeline = E.InnerPipeline;
1344 
1345   // First handle complex passes like the pass managers which carry pipelines.
1346   if (!InnerPipeline.empty()) {
1347     if (Name == "function") {
1348       FunctionPassManager NestedFPM;
1349       if (auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
1350         return Err;
1351       // Add the nested pass manager with the appropriate adaptor.
1352       FPM.addPass(std::move(NestedFPM));
1353       return Error::success();
1354     }
1355     if (Name == "loop" || Name == "loop-mssa") {
1356       LoopPassManager LPM;
1357       if (auto Err = parseLoopPassPipeline(LPM, InnerPipeline))
1358         return Err;
1359       // Add the nested pass manager with the appropriate adaptor.
1360       bool UseMemorySSA = (Name == "loop-mssa");
1361       bool UseBFI = llvm::any_of(
1362           InnerPipeline, [](auto Pipeline) { return Pipeline.Name == "licm"; });
1363       bool UseBPI = llvm::any_of(InnerPipeline, [](auto Pipeline) {
1364         return Pipeline.Name == "loop-predication";
1365       });
1366       FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM), UseMemorySSA,
1367                                                   UseBFI, UseBPI));
1368       return Error::success();
1369     }
1370     if (auto Count = parseRepeatPassName(Name)) {
1371       FunctionPassManager NestedFPM;
1372       if (auto Err = parseFunctionPassPipeline(NestedFPM, InnerPipeline))
1373         return Err;
1374       FPM.addPass(createRepeatedPass(*Count, std::move(NestedFPM)));
1375       return Error::success();
1376     }
1377 
1378     for (auto &C : FunctionPipelineParsingCallbacks)
1379       if (C(Name, FPM, InnerPipeline))
1380         return Error::success();
1381 
1382     // Normal passes can't have pipelines.
1383     return make_error<StringError>(
1384         formatv("invalid use of '{0}' pass as function pipeline", Name).str(),
1385         inconvertibleErrorCode());
1386   }
1387 
1388 // Now expand the basic registered passes from the .inc file.
1389 #define FUNCTION_PASS(NAME, CREATE_PASS)                                       \
1390   if (Name == NAME) {                                                          \
1391     FPM.addPass(CREATE_PASS);                                                  \
1392     return Error::success();                                                   \
1393   }
1394 #define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)    \
1395   if (checkParametrizedPassName(Name, NAME)) {                                 \
1396     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1397     if (!Params)                                                               \
1398       return Params.takeError();                                               \
1399     FPM.addPass(CREATE_PASS(Params.get()));                                    \
1400     return Error::success();                                                   \
1401   }
1402 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS)                                   \
1403   if (Name == "require<" NAME ">") {                                           \
1404     FPM.addPass(                                                               \
1405         RequireAnalysisPass<                                                   \
1406             std::remove_reference<decltype(CREATE_PASS)>::type, Function>());  \
1407     return Error::success();                                                   \
1408   }                                                                            \
1409   if (Name == "invalidate<" NAME ">") {                                        \
1410     FPM.addPass(InvalidateAnalysisPass<                                        \
1411                 std::remove_reference<decltype(CREATE_PASS)>::type>());        \
1412     return Error::success();                                                   \
1413   }
1414 // FIXME: UseMemorySSA is set to false. Maybe we could do things like:
1415 //        bool UseMemorySSA = !("canon-freeze" || "loop-predication" ||
1416 //                              "guard-widening");
1417 //        The risk is that it may become obsolete if we're not careful.
1418 #define LOOPNEST_PASS(NAME, CREATE_PASS)                                       \
1419   if (Name == NAME) {                                                          \
1420     FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false));   \
1421     return Error::success();                                                   \
1422   }
1423 #define LOOP_PASS(NAME, CREATE_PASS)                                           \
1424   if (Name == NAME) {                                                          \
1425     FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false));   \
1426     return Error::success();                                                   \
1427   }
1428 #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)        \
1429   if (checkParametrizedPassName(Name, NAME)) {                                 \
1430     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1431     if (!Params)                                                               \
1432       return Params.takeError();                                               \
1433     FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS(Params.get()),     \
1434                                                 false, false));                \
1435     return Error::success();                                                   \
1436   }
1437 #include "PassRegistry.def"
1438 
1439   for (auto &C : FunctionPipelineParsingCallbacks)
1440     if (C(Name, FPM, InnerPipeline))
1441       return Error::success();
1442   return make_error<StringError>(
1443       formatv("unknown function pass '{0}'", Name).str(),
1444       inconvertibleErrorCode());
1445 }
1446 
1447 Error PassBuilder::parseLoopPass(LoopPassManager &LPM,
1448                                  const PipelineElement &E) {
1449   StringRef Name = E.Name;
1450   auto &InnerPipeline = E.InnerPipeline;
1451 
1452   // First handle complex passes like the pass managers which carry pipelines.
1453   if (!InnerPipeline.empty()) {
1454     if (Name == "loop") {
1455       LoopPassManager NestedLPM;
1456       if (auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
1457         return Err;
1458       // Add the nested pass manager with the appropriate adaptor.
1459       LPM.addPass(std::move(NestedLPM));
1460       return Error::success();
1461     }
1462     if (auto Count = parseRepeatPassName(Name)) {
1463       LoopPassManager NestedLPM;
1464       if (auto Err = parseLoopPassPipeline(NestedLPM, InnerPipeline))
1465         return Err;
1466       LPM.addPass(createRepeatedPass(*Count, std::move(NestedLPM)));
1467       return Error::success();
1468     }
1469 
1470     for (auto &C : LoopPipelineParsingCallbacks)
1471       if (C(Name, LPM, InnerPipeline))
1472         return Error::success();
1473 
1474     // Normal passes can't have pipelines.
1475     return make_error<StringError>(
1476         formatv("invalid use of '{0}' pass as loop pipeline", Name).str(),
1477         inconvertibleErrorCode());
1478   }
1479 
1480 // Now expand the basic registered passes from the .inc file.
1481 #define LOOPNEST_PASS(NAME, CREATE_PASS)                                       \
1482   if (Name == NAME) {                                                          \
1483     LPM.addPass(CREATE_PASS);                                                  \
1484     return Error::success();                                                   \
1485   }
1486 #define LOOP_PASS(NAME, CREATE_PASS)                                           \
1487   if (Name == NAME) {                                                          \
1488     LPM.addPass(CREATE_PASS);                                                  \
1489     return Error::success();                                                   \
1490   }
1491 #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)        \
1492   if (checkParametrizedPassName(Name, NAME)) {                                 \
1493     auto Params = parsePassParameters(PARSER, Name, NAME);                     \
1494     if (!Params)                                                               \
1495       return Params.takeError();                                               \
1496     LPM.addPass(CREATE_PASS(Params.get()));                                    \
1497     return Error::success();                                                   \
1498   }
1499 #define LOOP_ANALYSIS(NAME, CREATE_PASS)                                       \
1500   if (Name == "require<" NAME ">") {                                           \
1501     LPM.addPass(RequireAnalysisPass<                                           \
1502                 std::remove_reference<decltype(CREATE_PASS)>::type, Loop,      \
1503                 LoopAnalysisManager, LoopStandardAnalysisResults &,            \
1504                 LPMUpdater &>());                                              \
1505     return Error::success();                                                   \
1506   }                                                                            \
1507   if (Name == "invalidate<" NAME ">") {                                        \
1508     LPM.addPass(InvalidateAnalysisPass<                                        \
1509                 std::remove_reference<decltype(CREATE_PASS)>::type>());        \
1510     return Error::success();                                                   \
1511   }
1512 #include "PassRegistry.def"
1513 
1514   for (auto &C : LoopPipelineParsingCallbacks)
1515     if (C(Name, LPM, InnerPipeline))
1516       return Error::success();
1517   return make_error<StringError>(formatv("unknown loop pass '{0}'", Name).str(),
1518                                  inconvertibleErrorCode());
1519 }
1520 
1521 bool PassBuilder::parseAAPassName(AAManager &AA, StringRef Name) {
1522 #define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS)                               \
1523   if (Name == NAME) {                                                          \
1524     AA.registerModuleAnalysis<                                                 \
1525         std::remove_reference<decltype(CREATE_PASS)>::type>();                 \
1526     return true;                                                               \
1527   }
1528 #define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS)                             \
1529   if (Name == NAME) {                                                          \
1530     AA.registerFunctionAnalysis<                                               \
1531         std::remove_reference<decltype(CREATE_PASS)>::type>();                 \
1532     return true;                                                               \
1533   }
1534 #include "PassRegistry.def"
1535 
1536   for (auto &C : AAParsingCallbacks)
1537     if (C(Name, AA))
1538       return true;
1539   return false;
1540 }
1541 
1542 Error PassBuilder::parseLoopPassPipeline(LoopPassManager &LPM,
1543                                          ArrayRef<PipelineElement> Pipeline) {
1544   for (const auto &Element : Pipeline) {
1545     if (auto Err = parseLoopPass(LPM, Element))
1546       return Err;
1547   }
1548   return Error::success();
1549 }
1550 
1551 Error PassBuilder::parseFunctionPassPipeline(
1552     FunctionPassManager &FPM, ArrayRef<PipelineElement> Pipeline) {
1553   for (const auto &Element : Pipeline) {
1554     if (auto Err = parseFunctionPass(FPM, Element))
1555       return Err;
1556   }
1557   return Error::success();
1558 }
1559 
1560 Error PassBuilder::parseCGSCCPassPipeline(CGSCCPassManager &CGPM,
1561                                           ArrayRef<PipelineElement> Pipeline) {
1562   for (const auto &Element : Pipeline) {
1563     if (auto Err = parseCGSCCPass(CGPM, Element))
1564       return Err;
1565   }
1566   return Error::success();
1567 }
1568 
1569 void PassBuilder::crossRegisterProxies(LoopAnalysisManager &LAM,
1570                                        FunctionAnalysisManager &FAM,
1571                                        CGSCCAnalysisManager &CGAM,
1572                                        ModuleAnalysisManager &MAM) {
1573   MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); });
1574   MAM.registerPass([&] { return CGSCCAnalysisManagerModuleProxy(CGAM); });
1575   CGAM.registerPass([&] { return ModuleAnalysisManagerCGSCCProxy(MAM); });
1576   FAM.registerPass([&] { return CGSCCAnalysisManagerFunctionProxy(CGAM); });
1577   FAM.registerPass([&] { return ModuleAnalysisManagerFunctionProxy(MAM); });
1578   FAM.registerPass([&] { return LoopAnalysisManagerFunctionProxy(LAM); });
1579   LAM.registerPass([&] { return FunctionAnalysisManagerLoopProxy(FAM); });
1580 }
1581 
1582 Error PassBuilder::parseModulePassPipeline(ModulePassManager &MPM,
1583                                            ArrayRef<PipelineElement> Pipeline) {
1584   for (const auto &Element : Pipeline) {
1585     if (auto Err = parseModulePass(MPM, Element))
1586       return Err;
1587   }
1588   return Error::success();
1589 }
1590 
1591 // Primary pass pipeline description parsing routine for a \c ModulePassManager
1592 // FIXME: Should this routine accept a TargetMachine or require the caller to
1593 // pre-populate the analysis managers with target-specific stuff?
1594 Error PassBuilder::parsePassPipeline(ModulePassManager &MPM,
1595                                      StringRef PipelineText) {
1596   auto Pipeline = parsePipelineText(PipelineText);
1597   if (!Pipeline || Pipeline->empty())
1598     return make_error<StringError>(
1599         formatv("invalid pipeline '{0}'", PipelineText).str(),
1600         inconvertibleErrorCode());
1601 
1602   // If the first name isn't at the module layer, wrap the pipeline up
1603   // automatically.
1604   StringRef FirstName = Pipeline->front().Name;
1605 
1606   if (!isModulePassName(FirstName, ModulePipelineParsingCallbacks)) {
1607     bool UseMemorySSA;
1608     if (isCGSCCPassName(FirstName, CGSCCPipelineParsingCallbacks)) {
1609       Pipeline = {{"cgscc", std::move(*Pipeline)}};
1610     } else if (isFunctionPassName(FirstName,
1611                                   FunctionPipelineParsingCallbacks)) {
1612       Pipeline = {{"function", std::move(*Pipeline)}};
1613     } else if (isLoopNestPassName(FirstName, LoopPipelineParsingCallbacks,
1614                                   UseMemorySSA)) {
1615       Pipeline = {{"function", {{UseMemorySSA ? "loop-mssa" : "loop",
1616                                  std::move(*Pipeline)}}}};
1617     } else if (isLoopPassName(FirstName, LoopPipelineParsingCallbacks,
1618                               UseMemorySSA)) {
1619       Pipeline = {{"function", {{UseMemorySSA ? "loop-mssa" : "loop",
1620                                  std::move(*Pipeline)}}}};
1621     } else {
1622       for (auto &C : TopLevelPipelineParsingCallbacks)
1623         if (C(MPM, *Pipeline))
1624           return Error::success();
1625 
1626       // Unknown pass or pipeline name!
1627       auto &InnerPipeline = Pipeline->front().InnerPipeline;
1628       return make_error<StringError>(
1629           formatv("unknown {0} name '{1}'",
1630                   (InnerPipeline.empty() ? "pass" : "pipeline"), FirstName)
1631               .str(),
1632           inconvertibleErrorCode());
1633     }
1634   }
1635 
1636   if (auto Err = parseModulePassPipeline(MPM, *Pipeline))
1637     return Err;
1638   return Error::success();
1639 }
1640 
1641 // Primary pass pipeline description parsing routine for a \c CGSCCPassManager
1642 Error PassBuilder::parsePassPipeline(CGSCCPassManager &CGPM,
1643                                      StringRef PipelineText) {
1644   auto Pipeline = parsePipelineText(PipelineText);
1645   if (!Pipeline || Pipeline->empty())
1646     return make_error<StringError>(
1647         formatv("invalid pipeline '{0}'", PipelineText).str(),
1648         inconvertibleErrorCode());
1649 
1650   StringRef FirstName = Pipeline->front().Name;
1651   if (!isCGSCCPassName(FirstName, CGSCCPipelineParsingCallbacks))
1652     return make_error<StringError>(
1653         formatv("unknown cgscc pass '{0}' in pipeline '{1}'", FirstName,
1654                 PipelineText)
1655             .str(),
1656         inconvertibleErrorCode());
1657 
1658   if (auto Err = parseCGSCCPassPipeline(CGPM, *Pipeline))
1659     return Err;
1660   return Error::success();
1661 }
1662 
1663 // Primary pass pipeline description parsing routine for a \c
1664 // FunctionPassManager
1665 Error PassBuilder::parsePassPipeline(FunctionPassManager &FPM,
1666                                      StringRef PipelineText) {
1667   auto Pipeline = parsePipelineText(PipelineText);
1668   if (!Pipeline || Pipeline->empty())
1669     return make_error<StringError>(
1670         formatv("invalid pipeline '{0}'", PipelineText).str(),
1671         inconvertibleErrorCode());
1672 
1673   StringRef FirstName = Pipeline->front().Name;
1674   if (!isFunctionPassName(FirstName, FunctionPipelineParsingCallbacks))
1675     return make_error<StringError>(
1676         formatv("unknown function pass '{0}' in pipeline '{1}'", FirstName,
1677                 PipelineText)
1678             .str(),
1679         inconvertibleErrorCode());
1680 
1681   if (auto Err = parseFunctionPassPipeline(FPM, *Pipeline))
1682     return Err;
1683   return Error::success();
1684 }
1685 
1686 // Primary pass pipeline description parsing routine for a \c LoopPassManager
1687 Error PassBuilder::parsePassPipeline(LoopPassManager &CGPM,
1688                                      StringRef PipelineText) {
1689   auto Pipeline = parsePipelineText(PipelineText);
1690   if (!Pipeline || Pipeline->empty())
1691     return make_error<StringError>(
1692         formatv("invalid pipeline '{0}'", PipelineText).str(),
1693         inconvertibleErrorCode());
1694 
1695   if (auto Err = parseLoopPassPipeline(CGPM, *Pipeline))
1696     return Err;
1697 
1698   return Error::success();
1699 }
1700 
1701 Error PassBuilder::parseAAPipeline(AAManager &AA, StringRef PipelineText) {
1702   // If the pipeline just consists of the word 'default' just replace the AA
1703   // manager with our default one.
1704   if (PipelineText == "default") {
1705     AA = buildDefaultAAPipeline();
1706     return Error::success();
1707   }
1708 
1709   while (!PipelineText.empty()) {
1710     StringRef Name;
1711     std::tie(Name, PipelineText) = PipelineText.split(',');
1712     if (!parseAAPassName(AA, Name))
1713       return make_error<StringError>(
1714           formatv("unknown alias analysis name '{0}'", Name).str(),
1715           inconvertibleErrorCode());
1716   }
1717 
1718   return Error::success();
1719 }
1720 
1721 bool PassBuilder::isAAPassName(StringRef PassName) {
1722 #define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS)                               \
1723   if (PassName == NAME)                                                        \
1724     return true;
1725 #define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS)                             \
1726   if (PassName == NAME)                                                        \
1727     return true;
1728 #include "PassRegistry.def"
1729   return false;
1730 }
1731 
1732 bool PassBuilder::isAnalysisPassName(StringRef PassName) {
1733 #define MODULE_ANALYSIS(NAME, CREATE_PASS)                                     \
1734   if (PassName == NAME)                                                        \
1735     return true;
1736 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS)                                   \
1737   if (PassName == NAME)                                                        \
1738     return true;
1739 #define LOOP_ANALYSIS(NAME, CREATE_PASS)                                       \
1740   if (PassName == NAME)                                                        \
1741     return true;
1742 #define CGSCC_ANALYSIS(NAME, CREATE_PASS)                                      \
1743   if (PassName == NAME)                                                        \
1744     return true;
1745 #define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS)                               \
1746   if (PassName == NAME)                                                        \
1747     return true;
1748 #define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS)                             \
1749   if (PassName == NAME)                                                        \
1750     return true;
1751 #include "PassRegistry.def"
1752   return false;
1753 }
1754 
1755 static void printPassName(StringRef PassName, raw_ostream &OS) {
1756   OS << "  " << PassName << "\n";
1757 }
1758 static void printPassName(StringRef PassName, StringRef Params,
1759                           raw_ostream &OS) {
1760   OS << "  " << PassName << "<" << Params << ">\n";
1761 }
1762 
1763 void PassBuilder::printPassNames(raw_ostream &OS) {
1764   // TODO: print pass descriptions when they are available
1765 
1766   OS << "Module passes:\n";
1767 #define MODULE_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
1768 #include "PassRegistry.def"
1769 
1770   OS << "Module passes with params:\n";
1771 #define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)      \
1772   printPassName(NAME, PARAMS, OS);
1773 #include "PassRegistry.def"
1774 
1775   OS << "Module analyses:\n";
1776 #define MODULE_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
1777 #include "PassRegistry.def"
1778 
1779   OS << "Module alias analyses:\n";
1780 #define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
1781 #include "PassRegistry.def"
1782 
1783   OS << "CGSCC passes:\n";
1784 #define CGSCC_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
1785 #include "PassRegistry.def"
1786 
1787   OS << "CGSCC passes with params:\n";
1788 #define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)       \
1789   printPassName(NAME, PARAMS, OS);
1790 #include "PassRegistry.def"
1791 
1792   OS << "CGSCC analyses:\n";
1793 #define CGSCC_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
1794 #include "PassRegistry.def"
1795 
1796   OS << "Function passes:\n";
1797 #define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
1798 #include "PassRegistry.def"
1799 
1800   OS << "Function passes with params:\n";
1801 #define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)    \
1802   printPassName(NAME, PARAMS, OS);
1803 #include "PassRegistry.def"
1804 
1805   OS << "Function analyses:\n";
1806 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
1807 #include "PassRegistry.def"
1808 
1809   OS << "Function alias analyses:\n";
1810 #define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
1811 #include "PassRegistry.def"
1812 
1813   OS << "LoopNest passes:\n";
1814 #define LOOPNEST_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
1815 #include "PassRegistry.def"
1816 
1817   OS << "Loop passes:\n";
1818 #define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS);
1819 #include "PassRegistry.def"
1820 
1821   OS << "Loop passes with params:\n";
1822 #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS)        \
1823   printPassName(NAME, PARAMS, OS);
1824 #include "PassRegistry.def"
1825 
1826   OS << "Loop analyses:\n";
1827 #define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS);
1828 #include "PassRegistry.def"
1829 }
1830 
1831 void PassBuilder::registerParseTopLevelPipelineCallback(
1832     const std::function<bool(ModulePassManager &, ArrayRef<PipelineElement>)>
1833         &C) {
1834   TopLevelPipelineParsingCallbacks.push_back(C);
1835 }
1836