Home | History | Annotate | Line # | Download | only in Passes
      1 //===- Parsing, selection, and construction of pass pipelines --*- C++ -*--===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 /// \file
      9 ///
     10 /// Interfaces for registering analysis passes, producing common pass manager
     11 /// configurations, and parsing of pass pipelines.
     12 ///
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_PASSES_PASSBUILDER_H
     16 #define LLVM_PASSES_PASSBUILDER_H
     17 
     18 #include "llvm/ADT/Optional.h"
     19 #include "llvm/Analysis/CGSCCPassManager.h"
     20 #include "llvm/IR/PassManager.h"
     21 #include "llvm/Support/Error.h"
     22 #include "llvm/Support/raw_ostream.h"
     23 #include "llvm/Transforms/IPO/Inliner.h"
     24 #include "llvm/Transforms/Instrumentation.h"
     25 #include "llvm/Transforms/Scalar/LoopPassManager.h"
     26 #include <vector>
     27 
     28 namespace llvm {
     29 class StringRef;
     30 class AAManager;
     31 class TargetMachine;
     32 class ModuleSummaryIndex;
     33 
     34 /// A struct capturing PGO tunables.
     35 struct PGOOptions {
     36   enum PGOAction { NoAction, IRInstr, IRUse, SampleUse };
     37   enum CSPGOAction { NoCSAction, CSIRInstr, CSIRUse };
     38   PGOOptions(std::string ProfileFile = "", std::string CSProfileGenFile = "",
     39              std::string ProfileRemappingFile = "", PGOAction Action = NoAction,
     40              CSPGOAction CSAction = NoCSAction,
     41              bool DebugInfoForProfiling = false,
     42              bool PseudoProbeForProfiling = false)
     43       : ProfileFile(ProfileFile), CSProfileGenFile(CSProfileGenFile),
     44         ProfileRemappingFile(ProfileRemappingFile), Action(Action),
     45         CSAction(CSAction), DebugInfoForProfiling(DebugInfoForProfiling ||
     46                                                   (Action == SampleUse &&
     47                                                    !PseudoProbeForProfiling)),
     48         PseudoProbeForProfiling(PseudoProbeForProfiling) {
     49     // Note, we do allow ProfileFile.empty() for Action=IRUse LTO can
     50     // callback with IRUse action without ProfileFile.
     51 
     52     // If there is a CSAction, PGOAction cannot be IRInstr or SampleUse.
     53     assert(this->CSAction == NoCSAction ||
     54            (this->Action != IRInstr && this->Action != SampleUse));
     55 
     56     // For CSIRInstr, CSProfileGenFile also needs to be nonempty.
     57     assert(this->CSAction != CSIRInstr || !this->CSProfileGenFile.empty());
     58 
     59     // If CSAction is CSIRUse, PGOAction needs to be IRUse as they share
     60     // a profile.
     61     assert(this->CSAction != CSIRUse || this->Action == IRUse);
     62 
     63     // If neither Action nor CSAction, DebugInfoForProfiling or
     64     // PseudoProbeForProfiling needs to be true.
     65     assert(this->Action != NoAction || this->CSAction != NoCSAction ||
     66            this->DebugInfoForProfiling || this->PseudoProbeForProfiling);
     67 
     68     // Pseudo probe emission does not work with -fdebug-info-for-profiling since
     69     // they both use the discriminator field of debug lines but for different
     70     // purposes.
     71     if (this->DebugInfoForProfiling && this->PseudoProbeForProfiling) {
     72       report_fatal_error(
     73           "Pseudo probes cannot be used with -debug-info-for-profiling", false);
     74     }
     75   }
     76   std::string ProfileFile;
     77   std::string CSProfileGenFile;
     78   std::string ProfileRemappingFile;
     79   PGOAction Action;
     80   CSPGOAction CSAction;
     81   bool DebugInfoForProfiling;
     82   bool PseudoProbeForProfiling;
     83 };
     84 
     85 /// Tunable parameters for passes in the default pipelines.
     86 class PipelineTuningOptions {
     87 public:
     88   /// Constructor sets pipeline tuning defaults based on cl::opts. Each option
     89   /// can be set in the PassBuilder when using a LLVM as a library.
     90   PipelineTuningOptions();
     91 
     92   /// Tuning option to set loop interleaving on/off, set based on opt level.
     93   bool LoopInterleaving;
     94 
     95   /// Tuning option to enable/disable loop vectorization, set based on opt
     96   /// level.
     97   bool LoopVectorization;
     98 
     99   /// Tuning option to enable/disable slp loop vectorization, set based on opt
    100   /// level.
    101   bool SLPVectorization;
    102 
    103   /// Tuning option to enable/disable loop unrolling. Its default value is true.
    104   bool LoopUnrolling;
    105 
    106   /// Tuning option to forget all SCEV loops in LoopUnroll. Its default value
    107   /// is that of the flag: `-forget-scev-loop-unroll`.
    108   bool ForgetAllSCEVInLoopUnroll;
    109 
    110   /// Tuning option to enable/disable coroutine intrinsic lowering. Its default
    111   /// value is false. Frontends such as Clang may enable this conditionally. For
    112   /// example, Clang enables this option if the flags `-std=c++2a` or above, or
    113   /// `-fcoroutines-ts`, have been specified.
    114   bool Coroutines;
    115 
    116   /// Tuning option to cap the number of calls to retrive clobbering accesses in
    117   /// MemorySSA, in LICM.
    118   unsigned LicmMssaOptCap;
    119 
    120   /// Tuning option to disable promotion to scalars in LICM with MemorySSA, if
    121   /// the number of access is too large.
    122   unsigned LicmMssaNoAccForPromotionCap;
    123 
    124   /// Tuning option to enable/disable call graph profile. Its default value is
    125   /// that of the flag: `-enable-npm-call-graph-profile`.
    126   bool CallGraphProfile;
    127 
    128   /// Tuning option to enable/disable function merging. Its default value is
    129   /// false.
    130   bool MergeFunctions;
    131 };
    132 
    133 /// This class provides access to building LLVM's passes.
    134 ///
    135 /// Its members provide the baseline state available to passes during their
    136 /// construction. The \c PassRegistry.def file specifies how to construct all
    137 /// of the built-in passes, and those may reference these members during
    138 /// construction.
    139 class PassBuilder {
    140   TargetMachine *TM;
    141   PipelineTuningOptions PTO;
    142   Optional<PGOOptions> PGOOpt;
    143   PassInstrumentationCallbacks *PIC;
    144 
    145 public:
    146   /// A struct to capture parsed pass pipeline names.
    147   ///
    148   /// A pipeline is defined as a series of names, each of which may in itself
    149   /// recursively contain a nested pipeline. A name is either the name of a pass
    150   /// (e.g. "instcombine") or the name of a pipeline type (e.g. "cgscc"). If the
    151   /// name is the name of a pass, the InnerPipeline is empty, since passes
    152   /// cannot contain inner pipelines. See parsePassPipeline() for a more
    153   /// detailed description of the textual pipeline format.
    154   struct PipelineElement {
    155     StringRef Name;
    156     std::vector<PipelineElement> InnerPipeline;
    157   };
    158 
    159   /// LLVM-provided high-level optimization levels.
    160   ///
    161   /// This enumerates the LLVM-provided high-level optimization levels. Each
    162   /// level has a specific goal and rationale.
    163   class OptimizationLevel final {
    164     unsigned SpeedLevel = 2;
    165     unsigned SizeLevel = 0;
    166     OptimizationLevel(unsigned SpeedLevel, unsigned SizeLevel)
    167         : SpeedLevel(SpeedLevel), SizeLevel(SizeLevel) {
    168       // Check that only valid combinations are passed.
    169       assert(SpeedLevel <= 3 &&
    170              "Optimization level for speed should be 0, 1, 2, or 3");
    171       assert(SizeLevel <= 2 &&
    172              "Optimization level for size should be 0, 1, or 2");
    173       assert((SizeLevel == 0 || SpeedLevel == 2) &&
    174              "Optimize for size should be encoded with speedup level == 2");
    175     }
    176 
    177   public:
    178     OptimizationLevel() = default;
    179     /// Disable as many optimizations as possible. This doesn't completely
    180     /// disable the optimizer in all cases, for example always_inline functions
    181     /// can be required to be inlined for correctness.
    182     static const OptimizationLevel O0;
    183 
    184     /// Optimize quickly without destroying debuggability.
    185     ///
    186     /// This level is tuned to produce a result from the optimizer as quickly
    187     /// as possible and to avoid destroying debuggability. This tends to result
    188     /// in a very good development mode where the compiled code will be
    189     /// immediately executed as part of testing. As a consequence, where
    190     /// possible, we would like to produce efficient-to-execute code, but not
    191     /// if it significantly slows down compilation or would prevent even basic
    192     /// debugging of the resulting binary.
    193     ///
    194     /// As an example, complex loop transformations such as versioning,
    195     /// vectorization, or fusion don't make sense here due to the degree to
    196     /// which the executed code differs from the source code, and the compile
    197     /// time cost.
    198     static const OptimizationLevel O1;
    199     /// Optimize for fast execution as much as possible without triggering
    200     /// significant incremental compile time or code size growth.
    201     ///
    202     /// The key idea is that optimizations at this level should "pay for
    203     /// themselves". So if an optimization increases compile time by 5% or
    204     /// increases code size by 5% for a particular benchmark, that benchmark
    205     /// should also be one which sees a 5% runtime improvement. If the compile
    206     /// time or code size penalties happen on average across a diverse range of
    207     /// LLVM users' benchmarks, then the improvements should as well.
    208     ///
    209     /// And no matter what, the compile time needs to not grow superlinearly
    210     /// with the size of input to LLVM so that users can control the runtime of
    211     /// the optimizer in this mode.
    212     ///
    213     /// This is expected to be a good default optimization level for the vast
    214     /// majority of users.
    215     static const OptimizationLevel O2;
    216     /// Optimize for fast execution as much as possible.
    217     ///
    218     /// This mode is significantly more aggressive in trading off compile time
    219     /// and code size to get execution time improvements. The core idea is that
    220     /// this mode should include any optimization that helps execution time on
    221     /// balance across a diverse collection of benchmarks, even if it increases
    222     /// code size or compile time for some benchmarks without corresponding
    223     /// improvements to execution time.
    224     ///
    225     /// Despite being willing to trade more compile time off to get improved
    226     /// execution time, this mode still tries to avoid superlinear growth in
    227     /// order to make even significantly slower compile times at least scale
    228     /// reasonably. This does not preclude very substantial constant factor
    229     /// costs though.
    230     static const OptimizationLevel O3;
    231     /// Similar to \c O2 but tries to optimize for small code size instead of
    232     /// fast execution without triggering significant incremental execution
    233     /// time slowdowns.
    234     ///
    235     /// The logic here is exactly the same as \c O2, but with code size and
    236     /// execution time metrics swapped.
    237     ///
    238     /// A consequence of the different core goal is that this should in general
    239     /// produce substantially smaller executables that still run in
    240     /// a reasonable amount of time.
    241     static const OptimizationLevel Os;
    242     /// A very specialized mode that will optimize for code size at any and all
    243     /// costs.
    244     ///
    245     /// This is useful primarily when there are absolute size limitations and
    246     /// any effort taken to reduce the size is worth it regardless of the
    247     /// execution time impact. You should expect this level to produce rather
    248     /// slow, but very small, code.
    249     static const OptimizationLevel Oz;
    250 
    251     bool isOptimizingForSpeed() const {
    252       return SizeLevel == 0 && SpeedLevel > 0;
    253     }
    254 
    255     bool isOptimizingForSize() const { return SizeLevel > 0; }
    256 
    257     bool operator==(const OptimizationLevel &Other) const {
    258       return SizeLevel == Other.SizeLevel && SpeedLevel == Other.SpeedLevel;
    259     }
    260     bool operator!=(const OptimizationLevel &Other) const {
    261       return SizeLevel != Other.SizeLevel || SpeedLevel != Other.SpeedLevel;
    262     }
    263 
    264     unsigned getSpeedupLevel() const { return SpeedLevel; }
    265 
    266     unsigned getSizeLevel() const { return SizeLevel; }
    267   };
    268 
    269   explicit PassBuilder(TargetMachine *TM = nullptr,
    270                        PipelineTuningOptions PTO = PipelineTuningOptions(),
    271                        Optional<PGOOptions> PGOOpt = None,
    272                        PassInstrumentationCallbacks *PIC = nullptr);
    273 
    274   /// Cross register the analysis managers through their proxies.
    275   ///
    276   /// This is an interface that can be used to cross register each
    277   /// AnalysisManager with all the others analysis managers.
    278   void crossRegisterProxies(LoopAnalysisManager &LAM,
    279                             FunctionAnalysisManager &FAM,
    280                             CGSCCAnalysisManager &CGAM,
    281                             ModuleAnalysisManager &MAM);
    282 
    283   /// Registers all available module analysis passes.
    284   ///
    285   /// This is an interface that can be used to populate a \c
    286   /// ModuleAnalysisManager with all registered module analyses. Callers can
    287   /// still manually register any additional analyses. Callers can also
    288   /// pre-register analyses and this will not override those.
    289   void registerModuleAnalyses(ModuleAnalysisManager &MAM);
    290 
    291   /// Registers all available CGSCC analysis passes.
    292   ///
    293   /// This is an interface that can be used to populate a \c CGSCCAnalysisManager
    294   /// with all registered CGSCC analyses. Callers can still manually register any
    295   /// additional analyses. Callers can also pre-register analyses and this will
    296   /// not override those.
    297   void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM);
    298 
    299   /// Registers all available function analysis passes.
    300   ///
    301   /// This is an interface that can be used to populate a \c
    302   /// FunctionAnalysisManager with all registered function analyses. Callers can
    303   /// still manually register any additional analyses. Callers can also
    304   /// pre-register analyses and this will not override those.
    305   void registerFunctionAnalyses(FunctionAnalysisManager &FAM);
    306 
    307   /// Registers all available loop analysis passes.
    308   ///
    309   /// This is an interface that can be used to populate a \c LoopAnalysisManager
    310   /// with all registered loop analyses. Callers can still manually register any
    311   /// additional analyses.
    312   void registerLoopAnalyses(LoopAnalysisManager &LAM);
    313 
    314   /// Construct the core LLVM function canonicalization and simplification
    315   /// pipeline.
    316   ///
    317   /// This is a long pipeline and uses most of the per-function optimization
    318   /// passes in LLVM to canonicalize and simplify the IR. It is suitable to run
    319   /// repeatedly over the IR and is not expected to destroy important
    320   /// information about the semantics of the IR.
    321   ///
    322   /// Note that \p Level cannot be `O0` here. The pipelines produced are
    323   /// only intended for use when attempting to optimize code. If frontends
    324   /// require some transformations for semantic reasons, they should explicitly
    325   /// build them.
    326   ///
    327   /// \p Phase indicates the current ThinLTO phase.
    328   FunctionPassManager
    329   buildFunctionSimplificationPipeline(OptimizationLevel Level,
    330                                       ThinOrFullLTOPhase Phase);
    331 
    332   /// Construct the core LLVM module canonicalization and simplification
    333   /// pipeline.
    334   ///
    335   /// This pipeline focuses on canonicalizing and simplifying the entire module
    336   /// of IR. Much like the function simplification pipeline above, it is
    337   /// suitable to run repeatedly over the IR and is not expected to destroy
    338   /// important information. It does, however, perform inlining and other
    339   /// heuristic based simplifications that are not strictly reversible.
    340   ///
    341   /// Note that \p Level cannot be `O0` here. The pipelines produced are
    342   /// only intended for use when attempting to optimize code. If frontends
    343   /// require some transformations for semantic reasons, they should explicitly
    344   /// build them.
    345   ///
    346   /// \p Phase indicates the current ThinLTO phase.
    347   ModulePassManager buildModuleSimplificationPipeline(OptimizationLevel Level,
    348                                                       ThinOrFullLTOPhase Phase);
    349 
    350   /// Construct the module pipeline that performs inlining as well as
    351   /// the inlining-driven cleanups.
    352   ModuleInlinerWrapperPass buildInlinerPipeline(OptimizationLevel Level,
    353                                                 ThinOrFullLTOPhase Phase);
    354 
    355   /// Construct the core LLVM module optimization pipeline.
    356   ///
    357   /// This pipeline focuses on optimizing the execution speed of the IR. It
    358   /// uses cost modeling and thresholds to balance code growth against runtime
    359   /// improvements. It includes vectorization and other information destroying
    360   /// transformations. It also cannot generally be run repeatedly on a module
    361   /// without potentially seriously regressing either runtime performance of
    362   /// the code or serious code size growth.
    363   ///
    364   /// Note that \p Level cannot be `O0` here. The pipelines produced are
    365   /// only intended for use when attempting to optimize code. If frontends
    366   /// require some transformations for semantic reasons, they should explicitly
    367   /// build them.
    368   ModulePassManager buildModuleOptimizationPipeline(OptimizationLevel Level,
    369                                                     bool LTOPreLink = false);
    370 
    371   /// Build a per-module default optimization pipeline.
    372   ///
    373   /// This provides a good default optimization pipeline for per-module
    374   /// optimization and code generation without any link-time optimization. It
    375   /// typically correspond to frontend "-O[123]" options for optimization
    376   /// levels \c O1, \c O2 and \c O3 resp.
    377   ///
    378   /// Note that \p Level cannot be `O0` here. The pipelines produced are
    379   /// only intended for use when attempting to optimize code. If frontends
    380   /// require some transformations for semantic reasons, they should explicitly
    381   /// build them.
    382   ModulePassManager buildPerModuleDefaultPipeline(OptimizationLevel Level,
    383                                                   bool LTOPreLink = false);
    384 
    385   /// Build a pre-link, ThinLTO-targeting default optimization pipeline to
    386   /// a pass manager.
    387   ///
    388   /// This adds the pre-link optimizations tuned to prepare a module for
    389   /// a ThinLTO run. It works to minimize the IR which needs to be analyzed
    390   /// without making irreversible decisions which could be made better during
    391   /// the LTO run.
    392   ///
    393   /// Note that \p Level cannot be `O0` here. The pipelines produced are
    394   /// only intended for use when attempting to optimize code. If frontends
    395   /// require some transformations for semantic reasons, they should explicitly
    396   /// build them.
    397   ModulePassManager buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level);
    398 
    399   /// Build an ThinLTO default optimization pipeline to a pass manager.
    400   ///
    401   /// This provides a good default optimization pipeline for link-time
    402   /// optimization and code generation. It is particularly tuned to fit well
    403   /// when IR coming into the LTO phase was first run through \c
    404   /// addPreLinkLTODefaultPipeline, and the two coordinate closely.
    405   ///
    406   /// Note that \p Level cannot be `O0` here. The pipelines produced are
    407   /// only intended for use when attempting to optimize code. If frontends
    408   /// require some transformations for semantic reasons, they should explicitly
    409   /// build them.
    410   ModulePassManager
    411   buildThinLTODefaultPipeline(OptimizationLevel Level,
    412                               const ModuleSummaryIndex *ImportSummary);
    413 
    414   /// Build a pre-link, LTO-targeting default optimization pipeline to a pass
    415   /// manager.
    416   ///
    417   /// This adds the pre-link optimizations tuned to work well with a later LTO
    418   /// run. It works to minimize the IR which needs to be analyzed without
    419   /// making irreversible decisions which could be made better during the LTO
    420   /// run.
    421   ///
    422   /// Note that \p Level cannot be `O0` here. The pipelines produced are
    423   /// only intended for use when attempting to optimize code. If frontends
    424   /// require some transformations for semantic reasons, they should explicitly
    425   /// build them.
    426   ModulePassManager buildLTOPreLinkDefaultPipeline(OptimizationLevel Level);
    427 
    428   /// Build an LTO default optimization pipeline to a pass manager.
    429   ///
    430   /// This provides a good default optimization pipeline for link-time
    431   /// optimization and code generation. It is particularly tuned to fit well
    432   /// when IR coming into the LTO phase was first run through \c
    433   /// addPreLinkLTODefaultPipeline, and the two coordinate closely.
    434   ///
    435   /// Note that \p Level cannot be `O0` here. The pipelines produced are
    436   /// only intended for use when attempting to optimize code. If frontends
    437   /// require some transformations for semantic reasons, they should explicitly
    438   /// build them.
    439   ModulePassManager buildLTODefaultPipeline(OptimizationLevel Level,
    440                                             ModuleSummaryIndex *ExportSummary);
    441 
    442   /// Build an O0 pipeline with the minimal semantically required passes.
    443   ///
    444   /// This should only be used for non-LTO and LTO pre-link pipelines.
    445   ModulePassManager buildO0DefaultPipeline(OptimizationLevel Level,
    446                                            bool LTOPreLink = false);
    447 
    448   /// Build the default `AAManager` with the default alias analysis pipeline
    449   /// registered.
    450   ///
    451   /// This also adds target-specific alias analyses registered via
    452   /// TargetMachine::registerDefaultAliasAnalyses().
    453   AAManager buildDefaultAAPipeline();
    454 
    455   /// Parse a textual pass pipeline description into a \c
    456   /// ModulePassManager.
    457   ///
    458   /// The format of the textual pass pipeline description looks something like:
    459   ///
    460   ///   module(function(instcombine,sroa),dce,cgscc(inliner,function(...)),...)
    461   ///
    462   /// Pass managers have ()s describing the nest structure of passes. All passes
    463   /// are comma separated. As a special shortcut, if the very first pass is not
    464   /// a module pass (as a module pass manager is), this will automatically form
    465   /// the shortest stack of pass managers that allow inserting that first pass.
    466   /// So, assuming function passes 'fpassN', CGSCC passes 'cgpassN', and loop
    467   /// passes 'lpassN', all of these are valid:
    468   ///
    469   ///   fpass1,fpass2,fpass3
    470   ///   cgpass1,cgpass2,cgpass3
    471   ///   lpass1,lpass2,lpass3
    472   ///
    473   /// And they are equivalent to the following (resp.):
    474   ///
    475   ///   module(function(fpass1,fpass2,fpass3))
    476   ///   module(cgscc(cgpass1,cgpass2,cgpass3))
    477   ///   module(function(loop(lpass1,lpass2,lpass3)))
    478   ///
    479   /// This shortcut is especially useful for debugging and testing small pass
    480   /// combinations.
    481   ///
    482   /// The sequence of passes aren't necessarily the exact same kind of pass.
    483   /// You can mix different levels implicitly if adaptor passes are defined to
    484   /// make them work. For example,
    485   ///
    486   ///   mpass1,fpass1,fpass2,mpass2,lpass1
    487   ///
    488   /// This pipeline uses only one pass manager: the top-level module manager.
    489   /// fpass1,fpass2 and lpass1 are added into the the top-level module manager
    490   /// using only adaptor passes. No nested function/loop pass managers are
    491   /// added. The purpose is to allow easy pass testing when the user
    492   /// specifically want the pass to run under a adaptor directly. This is
    493   /// preferred when a pipeline is largely of one type, but one or just a few
    494   /// passes are of different types(See PassBuilder.cpp for examples).
    495   Error parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText);
    496 
    497   /// {{@ Parse a textual pass pipeline description into a specific PassManager
    498   ///
    499   /// Automatic deduction of an appropriate pass manager stack is not supported.
    500   /// For example, to insert a loop pass 'lpass' into a FunctionPassManager,
    501   /// this is the valid pipeline text:
    502   ///
    503   ///   function(lpass)
    504   Error parsePassPipeline(CGSCCPassManager &CGPM, StringRef PipelineText);
    505   Error parsePassPipeline(FunctionPassManager &FPM, StringRef PipelineText);
    506   Error parsePassPipeline(LoopPassManager &LPM, StringRef PipelineText);
    507   /// @}}
    508 
    509   /// Parse a textual alias analysis pipeline into the provided AA manager.
    510   ///
    511   /// The format of the textual AA pipeline is a comma separated list of AA
    512   /// pass names:
    513   ///
    514   ///   basic-aa,globals-aa,...
    515   ///
    516   /// The AA manager is set up such that the provided alias analyses are tried
    517   /// in the order specified. See the \c AAManaager documentation for details
    518   /// about the logic used. This routine just provides the textual mapping
    519   /// between AA names and the analyses to register with the manager.
    520   ///
    521   /// Returns false if the text cannot be parsed cleanly. The specific state of
    522   /// the \p AA manager is unspecified if such an error is encountered and this
    523   /// returns false.
    524   Error parseAAPipeline(AAManager &AA, StringRef PipelineText);
    525 
    526   /// Returns true if the pass name is the name of an alias analysis pass.
    527   bool isAAPassName(StringRef PassName);
    528 
    529   /// Returns true if the pass name is the name of a (non-alias) analysis pass.
    530   bool isAnalysisPassName(StringRef PassName);
    531 
    532   /// Print pass names.
    533   void printPassNames(raw_ostream &OS);
    534 
    535   /// Register a callback for a default optimizer pipeline extension
    536   /// point
    537   ///
    538   /// This extension point allows adding passes that perform peephole
    539   /// optimizations similar to the instruction combiner. These passes will be
    540   /// inserted after each instance of the instruction combiner pass.
    541   void registerPeepholeEPCallback(
    542       const std::function<void(FunctionPassManager &, OptimizationLevel)> &C) {
    543     PeepholeEPCallbacks.push_back(C);
    544   }
    545 
    546   /// Register a callback for a default optimizer pipeline extension
    547   /// point
    548   ///
    549   /// This extension point allows adding late loop canonicalization and
    550   /// simplification passes. This is the last point in the loop optimization
    551   /// pipeline before loop deletion. Each pass added
    552   /// here must be an instance of LoopPass.
    553   /// This is the place to add passes that can remove loops, such as target-
    554   /// specific loop idiom recognition.
    555   void registerLateLoopOptimizationsEPCallback(
    556       const std::function<void(LoopPassManager &, OptimizationLevel)> &C) {
    557     LateLoopOptimizationsEPCallbacks.push_back(C);
    558   }
    559 
    560   /// Register a callback for a default optimizer pipeline extension
    561   /// point
    562   ///
    563   /// This extension point allows adding loop passes to the end of the loop
    564   /// optimizer.
    565   void registerLoopOptimizerEndEPCallback(
    566       const std::function<void(LoopPassManager &, OptimizationLevel)> &C) {
    567     LoopOptimizerEndEPCallbacks.push_back(C);
    568   }
    569 
    570   /// Register a callback for a default optimizer pipeline extension
    571   /// point
    572   ///
    573   /// This extension point allows adding optimization passes after most of the
    574   /// main optimizations, but before the last cleanup-ish optimizations.
    575   void registerScalarOptimizerLateEPCallback(
    576       const std::function<void(FunctionPassManager &, OptimizationLevel)> &C) {
    577     ScalarOptimizerLateEPCallbacks.push_back(C);
    578   }
    579 
    580   /// Register a callback for a default optimizer pipeline extension
    581   /// point
    582   ///
    583   /// This extension point allows adding CallGraphSCC passes at the end of the
    584   /// main CallGraphSCC passes and before any function simplification passes run
    585   /// by CGPassManager.
    586   void registerCGSCCOptimizerLateEPCallback(
    587       const std::function<void(CGSCCPassManager &, OptimizationLevel)> &C) {
    588     CGSCCOptimizerLateEPCallbacks.push_back(C);
    589   }
    590 
    591   /// Register a callback for a default optimizer pipeline extension
    592   /// point
    593   ///
    594   /// This extension point allows adding optimization passes before the
    595   /// vectorizer and other highly target specific optimization passes are
    596   /// executed.
    597   void registerVectorizerStartEPCallback(
    598       const std::function<void(FunctionPassManager &, OptimizationLevel)> &C) {
    599     VectorizerStartEPCallbacks.push_back(C);
    600   }
    601 
    602   /// Register a callback for a default optimizer pipeline extension point.
    603   ///
    604   /// This extension point allows adding optimization once at the start of the
    605   /// pipeline. This does not apply to 'backend' compiles (LTO and ThinLTO
    606   /// link-time pipelines).
    607   void registerPipelineStartEPCallback(
    608       const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
    609     PipelineStartEPCallbacks.push_back(C);
    610   }
    611 
    612   /// Register a callback for a default optimizer pipeline extension point.
    613   ///
    614   /// This extension point allows adding optimization right after passes that do
    615   /// basic simplification of the input IR.
    616   void registerPipelineEarlySimplificationEPCallback(
    617       const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
    618     PipelineEarlySimplificationEPCallbacks.push_back(C);
    619   }
    620 
    621   /// Register a callback for a default optimizer pipeline extension point
    622   ///
    623   /// This extension point allows adding optimizations at the very end of the
    624   /// function optimization pipeline.
    625   void registerOptimizerLastEPCallback(
    626       const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
    627     OptimizerLastEPCallbacks.push_back(C);
    628   }
    629 
    630   /// Register a callback for parsing an AliasAnalysis Name to populate
    631   /// the given AAManager \p AA
    632   void registerParseAACallback(
    633       const std::function<bool(StringRef Name, AAManager &AA)> &C) {
    634     AAParsingCallbacks.push_back(C);
    635   }
    636 
    637   /// {{@ Register callbacks for analysis registration with this PassBuilder
    638   /// instance.
    639   /// Callees register their analyses with the given AnalysisManager objects.
    640   void registerAnalysisRegistrationCallback(
    641       const std::function<void(CGSCCAnalysisManager &)> &C) {
    642     CGSCCAnalysisRegistrationCallbacks.push_back(C);
    643   }
    644   void registerAnalysisRegistrationCallback(
    645       const std::function<void(FunctionAnalysisManager &)> &C) {
    646     FunctionAnalysisRegistrationCallbacks.push_back(C);
    647   }
    648   void registerAnalysisRegistrationCallback(
    649       const std::function<void(LoopAnalysisManager &)> &C) {
    650     LoopAnalysisRegistrationCallbacks.push_back(C);
    651   }
    652   void registerAnalysisRegistrationCallback(
    653       const std::function<void(ModuleAnalysisManager &)> &C) {
    654     ModuleAnalysisRegistrationCallbacks.push_back(C);
    655   }
    656   /// @}}
    657 
    658   /// {{@ Register pipeline parsing callbacks with this pass builder instance.
    659   /// Using these callbacks, callers can parse both a single pass name, as well
    660   /// as entire sub-pipelines, and populate the PassManager instance
    661   /// accordingly.
    662   void registerPipelineParsingCallback(
    663       const std::function<bool(StringRef Name, CGSCCPassManager &,
    664                                ArrayRef<PipelineElement>)> &C) {
    665     CGSCCPipelineParsingCallbacks.push_back(C);
    666   }
    667   void registerPipelineParsingCallback(
    668       const std::function<bool(StringRef Name, FunctionPassManager &,
    669                                ArrayRef<PipelineElement>)> &C) {
    670     FunctionPipelineParsingCallbacks.push_back(C);
    671   }
    672   void registerPipelineParsingCallback(
    673       const std::function<bool(StringRef Name, LoopPassManager &,
    674                                ArrayRef<PipelineElement>)> &C) {
    675     LoopPipelineParsingCallbacks.push_back(C);
    676   }
    677   void registerPipelineParsingCallback(
    678       const std::function<bool(StringRef Name, ModulePassManager &,
    679                                ArrayRef<PipelineElement>)> &C) {
    680     ModulePipelineParsingCallbacks.push_back(C);
    681   }
    682   /// @}}
    683 
    684   /// Register a callback for a top-level pipeline entry.
    685   ///
    686   /// If the PassManager type is not given at the top level of the pipeline
    687   /// text, this Callback should be used to determine the appropriate stack of
    688   /// PassManagers and populate the passed ModulePassManager.
    689   void registerParseTopLevelPipelineCallback(
    690       const std::function<bool(ModulePassManager &, ArrayRef<PipelineElement>)>
    691           &C);
    692 
    693   /// Add PGOInstrumenation passes for O0 only.
    694   void addPGOInstrPassesForO0(ModulePassManager &MPM, bool RunProfileGen,
    695                               bool IsCS, std::string ProfileFile,
    696                               std::string ProfileRemappingFile);
    697 
    698   /// Returns PIC. External libraries can use this to register pass
    699   /// instrumentation callbacks.
    700   PassInstrumentationCallbacks *getPassInstrumentationCallbacks() const {
    701     return PIC;
    702   }
    703 
    704 private:
    705   // O1 pass pipeline
    706   FunctionPassManager
    707   buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
    708                                         ThinOrFullLTOPhase Phase);
    709 
    710   void addRequiredLTOPreLinkPasses(ModulePassManager &MPM);
    711 
    712   void addVectorPasses(OptimizationLevel Level, FunctionPassManager &FPM,
    713                        bool IsLTO);
    714 
    715   static Optional<std::vector<PipelineElement>>
    716   parsePipelineText(StringRef Text);
    717 
    718   Error parseModulePass(ModulePassManager &MPM, const PipelineElement &E);
    719   Error parseCGSCCPass(CGSCCPassManager &CGPM, const PipelineElement &E);
    720   Error parseFunctionPass(FunctionPassManager &FPM, const PipelineElement &E);
    721   Error parseLoopPass(LoopPassManager &LPM, const PipelineElement &E);
    722   bool parseAAPassName(AAManager &AA, StringRef Name);
    723 
    724   Error parseLoopPassPipeline(LoopPassManager &LPM,
    725                               ArrayRef<PipelineElement> Pipeline);
    726   Error parseFunctionPassPipeline(FunctionPassManager &FPM,
    727                                   ArrayRef<PipelineElement> Pipeline);
    728   Error parseCGSCCPassPipeline(CGSCCPassManager &CGPM,
    729                                ArrayRef<PipelineElement> Pipeline);
    730   Error parseModulePassPipeline(ModulePassManager &MPM,
    731                                 ArrayRef<PipelineElement> Pipeline);
    732 
    733   void addPGOInstrPasses(ModulePassManager &MPM, OptimizationLevel Level,
    734                          bool RunProfileGen, bool IsCS, std::string ProfileFile,
    735                          std::string ProfileRemappingFile);
    736   void invokePeepholeEPCallbacks(FunctionPassManager &, OptimizationLevel);
    737 
    738   // Extension Point callbacks
    739   SmallVector<std::function<void(FunctionPassManager &, OptimizationLevel)>, 2>
    740       PeepholeEPCallbacks;
    741   SmallVector<std::function<void(LoopPassManager &, OptimizationLevel)>, 2>
    742       LateLoopOptimizationsEPCallbacks;
    743   SmallVector<std::function<void(LoopPassManager &, OptimizationLevel)>, 2>
    744       LoopOptimizerEndEPCallbacks;
    745   SmallVector<std::function<void(FunctionPassManager &, OptimizationLevel)>, 2>
    746       ScalarOptimizerLateEPCallbacks;
    747   SmallVector<std::function<void(CGSCCPassManager &, OptimizationLevel)>, 2>
    748       CGSCCOptimizerLateEPCallbacks;
    749   SmallVector<std::function<void(FunctionPassManager &, OptimizationLevel)>, 2>
    750       VectorizerStartEPCallbacks;
    751   SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
    752       OptimizerLastEPCallbacks;
    753   // Module callbacks
    754   SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
    755       PipelineStartEPCallbacks;
    756   SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
    757       PipelineEarlySimplificationEPCallbacks;
    758 
    759   SmallVector<std::function<void(ModuleAnalysisManager &)>, 2>
    760       ModuleAnalysisRegistrationCallbacks;
    761   SmallVector<std::function<bool(StringRef, ModulePassManager &,
    762                                  ArrayRef<PipelineElement>)>,
    763               2>
    764       ModulePipelineParsingCallbacks;
    765   SmallVector<
    766       std::function<bool(ModulePassManager &, ArrayRef<PipelineElement>)>, 2>
    767       TopLevelPipelineParsingCallbacks;
    768   // CGSCC callbacks
    769   SmallVector<std::function<void(CGSCCAnalysisManager &)>, 2>
    770       CGSCCAnalysisRegistrationCallbacks;
    771   SmallVector<std::function<bool(StringRef, CGSCCPassManager &,
    772                                  ArrayRef<PipelineElement>)>,
    773               2>
    774       CGSCCPipelineParsingCallbacks;
    775   // Function callbacks
    776   SmallVector<std::function<void(FunctionAnalysisManager &)>, 2>
    777       FunctionAnalysisRegistrationCallbacks;
    778   SmallVector<std::function<bool(StringRef, FunctionPassManager &,
    779                                  ArrayRef<PipelineElement>)>,
    780               2>
    781       FunctionPipelineParsingCallbacks;
    782   // Loop callbacks
    783   SmallVector<std::function<void(LoopAnalysisManager &)>, 2>
    784       LoopAnalysisRegistrationCallbacks;
    785   SmallVector<std::function<bool(StringRef, LoopPassManager &,
    786                                  ArrayRef<PipelineElement>)>,
    787               2>
    788       LoopPipelineParsingCallbacks;
    789   // AA callbacks
    790   SmallVector<std::function<bool(StringRef Name, AAManager &AA)>, 2>
    791       AAParsingCallbacks;
    792 };
    793 
    794 /// This utility template takes care of adding require<> and invalidate<>
    795 /// passes for an analysis to a given \c PassManager. It is intended to be used
    796 /// during parsing of a pass pipeline when parsing a single PipelineName.
    797 /// When registering a new function analysis FancyAnalysis with the pass
    798 /// pipeline name "fancy-analysis", a matching ParsePipelineCallback could look
    799 /// like this:
    800 ///
    801 /// static bool parseFunctionPipeline(StringRef Name, FunctionPassManager &FPM,
    802 ///                                   ArrayRef<PipelineElement> P) {
    803 ///   if (parseAnalysisUtilityPasses<FancyAnalysis>("fancy-analysis", Name,
    804 ///                                                 FPM))
    805 ///     return true;
    806 ///   return false;
    807 /// }
    808 template <typename AnalysisT, typename IRUnitT, typename AnalysisManagerT,
    809           typename... ExtraArgTs>
    810 bool parseAnalysisUtilityPasses(
    811     StringRef AnalysisName, StringRef PipelineName,
    812     PassManager<IRUnitT, AnalysisManagerT, ExtraArgTs...> &PM) {
    813   if (!PipelineName.endswith(">"))
    814     return false;
    815   // See if this is an invalidate<> pass name
    816   if (PipelineName.startswith("invalidate<")) {
    817     PipelineName = PipelineName.substr(11, PipelineName.size() - 12);
    818     if (PipelineName != AnalysisName)
    819       return false;
    820     PM.addPass(InvalidateAnalysisPass<AnalysisT>());
    821     return true;
    822   }
    823 
    824   // See if this is a require<> pass name
    825   if (PipelineName.startswith("require<")) {
    826     PipelineName = PipelineName.substr(8, PipelineName.size() - 9);
    827     if (PipelineName != AnalysisName)
    828       return false;
    829     PM.addPass(RequireAnalysisPass<AnalysisT, IRUnitT, AnalysisManagerT,
    830                                    ExtraArgTs...>());
    831     return true;
    832   }
    833 
    834   return false;
    835 }
    836 }
    837 
    838 #endif
    839