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