xref: /freebsd/contrib/llvm-project/llvm/include/llvm/Passes/CodeGenPassBuilder.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===- Construction of codegen 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 producing common pass manager configurations.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_PASSES_CODEGENPASSBUILDER_H
15 #define LLVM_PASSES_CODEGENPASSBUILDER_H
16 
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/Analysis/AliasAnalysis.h"
20 #include "llvm/Analysis/BasicAliasAnalysis.h"
21 #include "llvm/Analysis/CGSCCPassManager.h"
22 #include "llvm/Analysis/ProfileSummaryInfo.h"
23 #include "llvm/Analysis/ScopedNoAliasAA.h"
24 #include "llvm/Analysis/TargetTransformInfo.h"
25 #include "llvm/Analysis/TypeBasedAliasAnalysis.h"
26 #include "llvm/CodeGen/AssignmentTrackingAnalysis.h"
27 #include "llvm/CodeGen/BranchFoldingPass.h"
28 #include "llvm/CodeGen/CallBrPrepare.h"
29 #include "llvm/CodeGen/CodeGenPrepare.h"
30 #include "llvm/CodeGen/DeadMachineInstructionElim.h"
31 #include "llvm/CodeGen/DetectDeadLanes.h"
32 #include "llvm/CodeGen/DwarfEHPrepare.h"
33 #include "llvm/CodeGen/EarlyIfConversion.h"
34 #include "llvm/CodeGen/ExpandFp.h"
35 #include "llvm/CodeGen/ExpandLargeDivRem.h"
36 #include "llvm/CodeGen/ExpandMemCmp.h"
37 #include "llvm/CodeGen/ExpandPostRAPseudos.h"
38 #include "llvm/CodeGen/ExpandReductions.h"
39 #include "llvm/CodeGen/FEntryInserter.h"
40 #include "llvm/CodeGen/FinalizeISel.h"
41 #include "llvm/CodeGen/FixupStatepointCallerSaved.h"
42 #include "llvm/CodeGen/GCMetadata.h"
43 #include "llvm/CodeGen/GlobalMerge.h"
44 #include "llvm/CodeGen/GlobalMergeFunctions.h"
45 #include "llvm/CodeGen/IndirectBrExpand.h"
46 #include "llvm/CodeGen/InitUndef.h"
47 #include "llvm/CodeGen/InterleavedAccess.h"
48 #include "llvm/CodeGen/InterleavedLoadCombine.h"
49 #include "llvm/CodeGen/JMCInstrumenter.h"
50 #include "llvm/CodeGen/LiveDebugValuesPass.h"
51 #include "llvm/CodeGen/LiveIntervals.h"
52 #include "llvm/CodeGen/LiveVariables.h"
53 #include "llvm/CodeGen/LocalStackSlotAllocation.h"
54 #include "llvm/CodeGen/LowerEmuTLS.h"
55 #include "llvm/CodeGen/MIRPrinter.h"
56 #include "llvm/CodeGen/MachineBlockPlacement.h"
57 #include "llvm/CodeGen/MachineCSE.h"
58 #include "llvm/CodeGen/MachineCopyPropagation.h"
59 #include "llvm/CodeGen/MachineFunctionAnalysis.h"
60 #include "llvm/CodeGen/MachineLICM.h"
61 #include "llvm/CodeGen/MachineLateInstrsCleanup.h"
62 #include "llvm/CodeGen/MachineModuleInfo.h"
63 #include "llvm/CodeGen/MachinePassManager.h"
64 #include "llvm/CodeGen/MachineScheduler.h"
65 #include "llvm/CodeGen/MachineSink.h"
66 #include "llvm/CodeGen/MachineVerifier.h"
67 #include "llvm/CodeGen/OptimizePHIs.h"
68 #include "llvm/CodeGen/PEI.h"
69 #include "llvm/CodeGen/PHIElimination.h"
70 #include "llvm/CodeGen/PatchableFunction.h"
71 #include "llvm/CodeGen/PeepholeOptimizer.h"
72 #include "llvm/CodeGen/PostRAMachineSink.h"
73 #include "llvm/CodeGen/PostRASchedulerList.h"
74 #include "llvm/CodeGen/PreISelIntrinsicLowering.h"
75 #include "llvm/CodeGen/RegAllocEvictionAdvisor.h"
76 #include "llvm/CodeGen/RegAllocFast.h"
77 #include "llvm/CodeGen/RegAllocGreedyPass.h"
78 #include "llvm/CodeGen/RegUsageInfoCollector.h"
79 #include "llvm/CodeGen/RegUsageInfoPropagate.h"
80 #include "llvm/CodeGen/RegisterCoalescerPass.h"
81 #include "llvm/CodeGen/RegisterUsageInfo.h"
82 #include "llvm/CodeGen/RemoveLoadsIntoFakeUses.h"
83 #include "llvm/CodeGen/RemoveRedundantDebugValues.h"
84 #include "llvm/CodeGen/RenameIndependentSubregs.h"
85 #include "llvm/CodeGen/ReplaceWithVeclib.h"
86 #include "llvm/CodeGen/SafeStack.h"
87 #include "llvm/CodeGen/SanitizerBinaryMetadata.h"
88 #include "llvm/CodeGen/SelectOptimize.h"
89 #include "llvm/CodeGen/ShadowStackGCLowering.h"
90 #include "llvm/CodeGen/ShrinkWrap.h"
91 #include "llvm/CodeGen/SjLjEHPrepare.h"
92 #include "llvm/CodeGen/StackColoring.h"
93 #include "llvm/CodeGen/StackFrameLayoutAnalysisPass.h"
94 #include "llvm/CodeGen/StackProtector.h"
95 #include "llvm/CodeGen/StackSlotColoring.h"
96 #include "llvm/CodeGen/TailDuplication.h"
97 #include "llvm/CodeGen/TargetPassConfig.h"
98 #include "llvm/CodeGen/TwoAddressInstructionPass.h"
99 #include "llvm/CodeGen/UnreachableBlockElim.h"
100 #include "llvm/CodeGen/VirtRegMap.h"
101 #include "llvm/CodeGen/WasmEHPrepare.h"
102 #include "llvm/CodeGen/WinEHPrepare.h"
103 #include "llvm/CodeGen/XRayInstrumentation.h"
104 #include "llvm/IR/PassManager.h"
105 #include "llvm/IR/Verifier.h"
106 #include "llvm/IRPrinter/IRPrintingPasses.h"
107 #include "llvm/MC/MCAsmInfo.h"
108 #include "llvm/MC/MCTargetOptions.h"
109 #include "llvm/Support/CodeGen.h"
110 #include "llvm/Support/Debug.h"
111 #include "llvm/Support/Error.h"
112 #include "llvm/Support/ErrorHandling.h"
113 #include "llvm/Target/CGPassBuilderOption.h"
114 #include "llvm/Target/TargetMachine.h"
115 #include "llvm/Transforms/CFGuard.h"
116 #include "llvm/Transforms/Scalar/ConstantHoisting.h"
117 #include "llvm/Transforms/Scalar/LoopPassManager.h"
118 #include "llvm/Transforms/Scalar/LoopStrengthReduce.h"
119 #include "llvm/Transforms/Scalar/LowerConstantIntrinsics.h"
120 #include "llvm/Transforms/Scalar/MergeICmps.h"
121 #include "llvm/Transforms/Scalar/PartiallyInlineLibCalls.h"
122 #include "llvm/Transforms/Scalar/ScalarizeMaskedMemIntrin.h"
123 #include "llvm/Transforms/Utils/EntryExitInstrumenter.h"
124 #include "llvm/Transforms/Utils/LowerInvoke.h"
125 #include <cassert>
126 #include <type_traits>
127 #include <utility>
128 
129 namespace llvm {
130 
131 // FIXME: Dummy target independent passes definitions that have not yet been
132 // ported to new pass manager. Once they do, remove these.
133 #define DUMMY_FUNCTION_PASS(NAME, PASS_NAME)                                   \
134   struct PASS_NAME : public PassInfoMixin<PASS_NAME> {                         \
135     template <typename... Ts> PASS_NAME(Ts &&...) {}                           \
136     PreservedAnalyses run(Function &, FunctionAnalysisManager &) {             \
137       return PreservedAnalyses::all();                                         \
138     }                                                                          \
139   };
140 #define DUMMY_MACHINE_MODULE_PASS(NAME, PASS_NAME)                             \
141   struct PASS_NAME : public PassInfoMixin<PASS_NAME> {                         \
142     template <typename... Ts> PASS_NAME(Ts &&...) {}                           \
143     PreservedAnalyses run(Module &, ModuleAnalysisManager &) {                 \
144       return PreservedAnalyses::all();                                         \
145     }                                                                          \
146   };
147 #define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME)                           \
148   struct PASS_NAME : public PassInfoMixin<PASS_NAME> {                         \
149     template <typename... Ts> PASS_NAME(Ts &&...) {}                           \
150     PreservedAnalyses run(MachineFunction &,                                   \
151                           MachineFunctionAnalysisManager &) {                  \
152       return PreservedAnalyses::all();                                         \
153     }                                                                          \
154   };
155 #include "llvm/Passes/MachinePassRegistry.def"
156 
157 /// This class provides access to building LLVM's passes.
158 ///
159 /// Its members provide the baseline state available to passes during their
160 /// construction. The \c MachinePassRegistry.def file specifies how to construct
161 /// all of the built-in passes, and those may reference these members during
162 /// construction.
163 template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
164 public:
CodeGenPassBuilder(TargetMachineT & TM,const CGPassBuilderOption & Opts,PassInstrumentationCallbacks * PIC)165   explicit CodeGenPassBuilder(TargetMachineT &TM,
166                               const CGPassBuilderOption &Opts,
167                               PassInstrumentationCallbacks *PIC)
168       : TM(TM), Opt(Opts), PIC(PIC) {
169     // Target could set CGPassBuilderOption::MISchedPostRA to true to achieve
170     //     substitutePass(&PostRASchedulerID, &PostMachineSchedulerID)
171 
172     // Target should override TM.Options.EnableIPRA in their target-specific
173     // LLVMTM ctor. See TargetMachine::setGlobalISel for example.
174     if (Opt.EnableIPRA) {
175       TM.Options.EnableIPRA = *Opt.EnableIPRA;
176     } else {
177       // If not explicitly specified, use target default.
178       TM.Options.EnableIPRA |= TM.useIPRA();
179     }
180 
181     if (Opt.EnableGlobalISelAbort)
182       TM.Options.GlobalISelAbort = *Opt.EnableGlobalISelAbort;
183 
184     if (!Opt.OptimizeRegAlloc)
185       Opt.OptimizeRegAlloc = getOptLevel() != CodeGenOptLevel::None;
186   }
187 
188   Error buildPipeline(ModulePassManager &MPM, raw_pwrite_stream &Out,
189                       raw_pwrite_stream *DwoOut,
190                       CodeGenFileType FileType) const;
191 
getPassInstrumentationCallbacks()192   PassInstrumentationCallbacks *getPassInstrumentationCallbacks() const {
193     return PIC;
194   }
195 
196 protected:
197   template <typename PassT>
198   using is_module_pass_t = decltype(std::declval<PassT &>().run(
199       std::declval<Module &>(), std::declval<ModuleAnalysisManager &>()));
200 
201   template <typename PassT>
202   using is_function_pass_t = decltype(std::declval<PassT &>().run(
203       std::declval<Function &>(), std::declval<FunctionAnalysisManager &>()));
204 
205   template <typename PassT>
206   using is_machine_function_pass_t = decltype(std::declval<PassT &>().run(
207       std::declval<MachineFunction &>(),
208       std::declval<MachineFunctionAnalysisManager &>()));
209 
210   // Function object to maintain state while adding codegen IR passes.
211   // TODO: add a Function -> MachineFunction adaptor and merge
212   // AddIRPass/AddMachinePass so we can have a function pipeline that runs both
213   // function passes and machine function passes.
214   class AddIRPass {
215   public:
AddIRPass(ModulePassManager & MPM,const DerivedT & PB)216     AddIRPass(ModulePassManager &MPM, const DerivedT &PB) : MPM(MPM), PB(PB) {}
~AddIRPass()217     ~AddIRPass() { flushFPMToMPM(); }
218 
219     template <typename PassT>
operator()220     void operator()(PassT &&Pass, bool Force = false,
221                     StringRef Name = PassT::name()) {
222       static_assert((is_detected<is_function_pass_t, PassT>::value ||
223                      is_detected<is_module_pass_t, PassT>::value) &&
224                     "Only module pass and function pass are supported.");
225       if (!Force && !PB.runBeforeAdding(Name))
226         return;
227 
228       // Add Function Pass
229       if constexpr (is_detected<is_function_pass_t, PassT>::value) {
230         FPM.addPass(std::forward<PassT>(Pass));
231       } else {
232         // Add Module Pass
233         flushFPMToMPM();
234         MPM.addPass(std::forward<PassT>(Pass));
235       }
236     }
237 
238     /// Setting this will add passes to the CGSCC pass manager.
requireCGSCCOrder()239     void requireCGSCCOrder() {
240       if (PB.AddInCGSCCOrder)
241         return;
242       flushFPMToMPM();
243       PB.AddInCGSCCOrder = true;
244     }
245 
246     /// Stop adding passes to the CGSCC pass manager.
247     /// Existing passes won't be removed.
stopAddingInCGSCCOrder()248     void stopAddingInCGSCCOrder() {
249       if (!PB.AddInCGSCCOrder)
250         return;
251       flushFPMToMPM();
252       PB.AddInCGSCCOrder = false;
253     }
254 
255   private:
flushFPMToMPM()256     void flushFPMToMPM() {
257       if (FPM.isEmpty())
258         return;
259       if (PB.AddInCGSCCOrder) {
260         MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(
261             createCGSCCToFunctionPassAdaptor(std::move(FPM))));
262       } else {
263         MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
264       }
265       FPM = FunctionPassManager();
266     }
267     ModulePassManager &MPM;
268     FunctionPassManager FPM;
269     const DerivedT &PB;
270   };
271 
272   // Function object to maintain state while adding codegen machine passes.
273   class AddMachinePass {
274   public:
AddMachinePass(ModulePassManager & MPM,const DerivedT & PB)275     AddMachinePass(ModulePassManager &MPM, const DerivedT &PB)
276         : MPM(MPM), PB(PB) {}
~AddMachinePass()277     ~AddMachinePass() {
278       if (MFPM.isEmpty())
279         return;
280 
281       FunctionPassManager FPM;
282       FPM.addPass(createFunctionToMachineFunctionPassAdaptor(std::move(MFPM)));
283       FPM.addPass(InvalidateAnalysisPass<MachineFunctionAnalysis>());
284       if (this->PB.AddInCGSCCOrder) {
285         MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(
286             createCGSCCToFunctionPassAdaptor(std::move(FPM))));
287       } else
288         MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
289     }
290 
291     template <typename PassT>
operator()292     void operator()(PassT &&Pass, bool Force = false,
293                     StringRef Name = PassT::name()) {
294       static_assert((is_detected<is_machine_function_pass_t, PassT>::value ||
295                      is_detected<is_module_pass_t, PassT>::value) &&
296                     "Only module pass and function pass are supported.");
297 
298       if (!Force && !PB.runBeforeAdding(Name))
299         return;
300 
301       // Add Function Pass
302       if constexpr (is_detected<is_machine_function_pass_t, PassT>::value) {
303         MFPM.addPass(std::forward<PassT>(Pass));
304       } else {
305         // Add Module Pass
306         flushMFPMToMPM();
307         MPM.addPass(std::forward<PassT>(Pass));
308       }
309 
310       for (auto &C : PB.AfterCallbacks)
311         C(Name, MFPM);
312     }
313 
314     /// Setting this will add passes to the CGSCC pass manager.
requireCGSCCOrder()315     void requireCGSCCOrder() {
316       if (PB.AddInCGSCCOrder)
317         return;
318       flushMFPMToMPM();
319       PB.AddInCGSCCOrder = true;
320     }
321 
322     /// Stop adding passes to the CGSCC pass manager.
323     /// Existing passes won't be removed.
stopAddingInCGSCCOrder()324     void stopAddingInCGSCCOrder() {
325       if (!PB.AddInCGSCCOrder)
326         return;
327       flushMFPMToMPM();
328       PB.AddInCGSCCOrder = false;
329     }
330 
331   private:
flushMFPMToMPM()332     void flushMFPMToMPM() {
333       if (MFPM.isEmpty())
334         return;
335 
336       if (PB.AddInCGSCCOrder) {
337         MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(
338             createCGSCCToFunctionPassAdaptor(
339                 createFunctionToMachineFunctionPassAdaptor(std::move(MFPM)))));
340       } else {
341         MPM.addPass(createModuleToFunctionPassAdaptor(
342             createFunctionToMachineFunctionPassAdaptor(std::move(MFPM))));
343       }
344       MFPM = MachineFunctionPassManager();
345     }
346 
347     ModulePassManager &MPM;
348     MachineFunctionPassManager MFPM;
349     const DerivedT &PB;
350   };
351 
352   TargetMachineT &TM;
353   CGPassBuilderOption Opt;
354   PassInstrumentationCallbacks *PIC;
355 
getTM()356   template <typename TMC> TMC &getTM() const { return static_cast<TMC &>(TM); }
getOptLevel()357   CodeGenOptLevel getOptLevel() const { return TM.getOptLevel(); }
358 
359   /// Check whether or not GlobalISel should abort on error.
360   /// When this is disabled, GlobalISel will fall back on SDISel instead of
361   /// erroring out.
isGlobalISelAbortEnabled()362   bool isGlobalISelAbortEnabled() const {
363     return TM.Options.GlobalISelAbort == GlobalISelAbortMode::Enable;
364   }
365 
366   /// Check whether or not a diagnostic should be emitted when GlobalISel
367   /// uses the fallback path. In other words, it will emit a diagnostic
368   /// when GlobalISel failed and isGlobalISelAbortEnabled is false.
reportDiagnosticWhenGlobalISelFallback()369   bool reportDiagnosticWhenGlobalISelFallback() const {
370     return TM.Options.GlobalISelAbort == GlobalISelAbortMode::DisableWithDiag;
371   }
372 
373   /// addInstSelector - This method should install an instruction selector pass,
374   /// which converts from LLVM code to machine instructions.
addInstSelector(AddMachinePass &)375   Error addInstSelector(AddMachinePass &) const {
376     return make_error<StringError>("addInstSelector is not overridden",
377                                    inconvertibleErrorCode());
378   }
379 
380   /// Target can override this to add GlobalMergePass before all IR passes.
addGlobalMergePass(AddIRPass &)381   void addGlobalMergePass(AddIRPass &) const {}
382 
383   /// Add passes that optimize instruction level parallelism for out-of-order
384   /// targets. These passes are run while the machine code is still in SSA
385   /// form, so they can use MachineTraceMetrics to control their heuristics.
386   ///
387   /// All passes added here should preserve the MachineDominatorTree,
388   /// MachineLoopInfo, and MachineTraceMetrics analyses.
addILPOpts(AddMachinePass &)389   void addILPOpts(AddMachinePass &) const {}
390 
391   /// This method may be implemented by targets that want to run passes
392   /// immediately before register allocation.
addPreRegAlloc(AddMachinePass &)393   void addPreRegAlloc(AddMachinePass &) const {}
394 
395   /// addPreRewrite - Add passes to the optimized register allocation pipeline
396   /// after register allocation is complete, but before virtual registers are
397   /// rewritten to physical registers.
398   ///
399   /// These passes must preserve VirtRegMap and LiveIntervals, and when running
400   /// after RABasic or RAGreedy, they should take advantage of LiveRegMatrix.
401   /// When these passes run, VirtRegMap contains legal physreg assignments for
402   /// all virtual registers.
403   ///
404   /// Note if the target overloads addRegAssignAndRewriteOptimized, this may not
405   /// be honored. This is also not generally used for the fast variant,
406   /// where the allocation and rewriting are done in one pass.
addPreRewrite(AddMachinePass &)407   void addPreRewrite(AddMachinePass &) const {}
408 
409   /// Add passes to be run immediately after virtual registers are rewritten
410   /// to physical registers.
addPostRewrite(AddMachinePass &)411   void addPostRewrite(AddMachinePass &) const {}
412 
413   /// This method may be implemented by targets that want to run passes after
414   /// register allocation pass pipeline but before prolog-epilog insertion.
addPostRegAlloc(AddMachinePass &)415   void addPostRegAlloc(AddMachinePass &) const {}
416 
417   /// This method may be implemented by targets that want to run passes after
418   /// prolog-epilog insertion and before the second instruction scheduling pass.
addPreSched2(AddMachinePass &)419   void addPreSched2(AddMachinePass &) const {}
420 
421   /// This pass may be implemented by targets that want to run passes
422   /// immediately before machine code is emitted.
addPreEmitPass(AddMachinePass &)423   void addPreEmitPass(AddMachinePass &) const {}
424 
425   /// Targets may add passes immediately before machine code is emitted in this
426   /// callback. This is called even later than `addPreEmitPass`.
427   // FIXME: Rename `addPreEmitPass` to something more sensible given its actual
428   // position and remove the `2` suffix here as this callback is what
429   // `addPreEmitPass` *should* be but in reality isn't.
addPreEmitPass2(AddMachinePass &)430   void addPreEmitPass2(AddMachinePass &) const {}
431 
432   /// {{@ For GlobalISel
433   ///
434 
435   /// addPreISel - This method should add any "last minute" LLVM->LLVM
436   /// passes (which are run just before instruction selector).
addPreISel(AddIRPass &)437   void addPreISel(AddIRPass &) const {
438     llvm_unreachable("addPreISel is not overridden");
439   }
440 
441   /// This method should install an IR translator pass, which converts from
442   /// LLVM code to machine instructions with possibly generic opcodes.
addIRTranslator(AddMachinePass &)443   Error addIRTranslator(AddMachinePass &) const {
444     return make_error<StringError>("addIRTranslator is not overridden",
445                                    inconvertibleErrorCode());
446   }
447 
448   /// This method may be implemented by targets that want to run passes
449   /// immediately before legalization.
addPreLegalizeMachineIR(AddMachinePass &)450   void addPreLegalizeMachineIR(AddMachinePass &) const {}
451 
452   /// This method should install a legalize pass, which converts the instruction
453   /// sequence into one that can be selected by the target.
addLegalizeMachineIR(AddMachinePass &)454   Error addLegalizeMachineIR(AddMachinePass &) const {
455     return make_error<StringError>("addLegalizeMachineIR is not overridden",
456                                    inconvertibleErrorCode());
457   }
458 
459   /// This method may be implemented by targets that want to run passes
460   /// immediately before the register bank selection.
addPreRegBankSelect(AddMachinePass &)461   void addPreRegBankSelect(AddMachinePass &) const {}
462 
463   /// This method should install a register bank selector pass, which
464   /// assigns register banks to virtual registers without a register
465   /// class or register banks.
addRegBankSelect(AddMachinePass &)466   Error addRegBankSelect(AddMachinePass &) const {
467     return make_error<StringError>("addRegBankSelect is not overridden",
468                                    inconvertibleErrorCode());
469   }
470 
471   /// This method may be implemented by targets that want to run passes
472   /// immediately before the (global) instruction selection.
addPreGlobalInstructionSelect(AddMachinePass &)473   void addPreGlobalInstructionSelect(AddMachinePass &) const {}
474 
475   /// This method should install a (global) instruction selector pass, which
476   /// converts possibly generic instructions to fully target-specific
477   /// instructions, thereby constraining all generic virtual registers to
478   /// register classes.
addGlobalInstructionSelect(AddMachinePass &)479   Error addGlobalInstructionSelect(AddMachinePass &) const {
480     return make_error<StringError>(
481         "addGlobalInstructionSelect is not overridden",
482         inconvertibleErrorCode());
483   }
484   /// @}}
485 
486   /// High level function that adds all passes necessary to go from llvm IR
487   /// representation to the MI representation.
488   /// Adds IR based lowering and target specific optimization passes and finally
489   /// the core instruction selection passes.
490   void addISelPasses(AddIRPass &) const;
491 
492   /// Add the actual instruction selection passes. This does not include
493   /// preparation passes on IR.
494   Error addCoreISelPasses(AddMachinePass &) const;
495 
496   /// Add the complete, standard set of LLVM CodeGen passes.
497   /// Fully developed targets will not generally override this.
498   Error addMachinePasses(AddMachinePass &) const;
499 
500   /// Add passes to lower exception handling for the code generator.
501   void addPassesToHandleExceptions(AddIRPass &) const;
502 
503   /// Add common target configurable passes that perform LLVM IR to IR
504   /// transforms following machine independent optimization.
505   void addIRPasses(AddIRPass &) const;
506 
507   /// Add pass to prepare the LLVM IR for code generation. This should be done
508   /// before exception handling preparation passes.
509   void addCodeGenPrepare(AddIRPass &) const;
510 
511   /// Add common passes that perform LLVM IR to IR transforms in preparation for
512   /// instruction selection.
513   void addISelPrepare(AddIRPass &) const;
514 
515   /// Methods with trivial inline returns are convenient points in the common
516   /// codegen pass pipeline where targets may insert passes. Methods with
517   /// out-of-line standard implementations are major CodeGen stages called by
518   /// addMachinePasses. Some targets may override major stages when inserting
519   /// passes is insufficient, but maintaining overriden stages is more work.
520   ///
521 
522   /// addMachineSSAOptimization - Add standard passes that optimize machine
523   /// instructions in SSA form.
524   void addMachineSSAOptimization(AddMachinePass &) const;
525 
526   /// addFastRegAlloc - Add the minimum set of target-independent passes that
527   /// are required for fast register allocation.
528   Error addFastRegAlloc(AddMachinePass &) const;
529 
530   /// addOptimizedRegAlloc - Add passes related to register allocation.
531   /// CodeGenTargetMachineImpl provides standard regalloc passes for most
532   /// targets.
533   void addOptimizedRegAlloc(AddMachinePass &) const;
534 
535   /// Add passes that optimize machine instructions after register allocation.
536   void addMachineLateOptimization(AddMachinePass &) const;
537 
538   /// addGCPasses - Add late codegen passes that analyze code for garbage
539   /// collection. This should return true if GC info should be printed after
540   /// these passes.
addGCPasses(AddMachinePass &)541   void addGCPasses(AddMachinePass &) const {}
542 
543   /// Add standard basic block placement passes.
544   void addBlockPlacement(AddMachinePass &) const;
545 
546   using CreateMCStreamer =
547       std::function<Expected<std::unique_ptr<MCStreamer>>(MCContext &)>;
addAsmPrinter(AddMachinePass &,CreateMCStreamer)548   void addAsmPrinter(AddMachinePass &, CreateMCStreamer) const {
549     llvm_unreachable("addAsmPrinter is not overridden");
550   }
551 
552   /// Utilities for targets to add passes to the pass manager.
553   ///
554 
555   /// createTargetRegisterAllocator - Create the register allocator pass for
556   /// this target at the current optimization level.
557   void addTargetRegisterAllocator(AddMachinePass &, bool Optimized) const;
558 
559   /// addMachinePasses helper to create the target-selected or overriden
560   /// regalloc pass.
561   void addRegAllocPass(AddMachinePass &, bool Optimized) const;
562 
563   /// Add core register alloator passes which do the actual register assignment
564   /// and rewriting. \returns true if any passes were added.
565   Error addRegAssignmentFast(AddMachinePass &) const;
566   Error addRegAssignmentOptimized(AddMachinePass &) const;
567 
568   /// Allow the target to disable a specific pass by default.
569   /// Backend can declare unwanted passes in constructor.
disablePass()570   template <typename... PassTs> void disablePass() {
571     BeforeCallbacks.emplace_back(
572         [](StringRef Name) { return ((Name != PassTs::name()) && ...); });
573   }
574 
575   /// Insert InsertedPass pass after TargetPass pass.
576   /// Only machine function passes are supported.
577   template <typename TargetPassT, typename InsertedPassT>
insertPass(InsertedPassT && Pass)578   void insertPass(InsertedPassT &&Pass) const {
579     AfterCallbacks.emplace_back(
580         [&](StringRef Name, MachineFunctionPassManager &MFPM) mutable {
581           if (Name == TargetPassT::name())
582             MFPM.addPass(std::forward<InsertedPassT>(Pass));
583         });
584   }
585 
586 private:
derived()587   DerivedT &derived() { return static_cast<DerivedT &>(*this); }
derived()588   const DerivedT &derived() const {
589     return static_cast<const DerivedT &>(*this);
590   }
591 
runBeforeAdding(StringRef Name)592   bool runBeforeAdding(StringRef Name) const {
593     bool ShouldAdd = true;
594     for (auto &C : BeforeCallbacks)
595       ShouldAdd &= C(Name);
596     return ShouldAdd;
597   }
598 
599   void setStartStopPasses(const TargetPassConfig::StartStopInfo &Info) const;
600 
601   Error verifyStartStop(const TargetPassConfig::StartStopInfo &Info) const;
602 
603   mutable SmallVector<llvm::unique_function<bool(StringRef)>, 4>
604       BeforeCallbacks;
605   mutable SmallVector<
606       llvm::unique_function<void(StringRef, MachineFunctionPassManager &)>, 4>
607       AfterCallbacks;
608 
609   /// Helper variable for `-start-before/-start-after/-stop-before/-stop-after`
610   mutable bool Started = true;
611   mutable bool Stopped = true;
612   mutable bool AddInCGSCCOrder = false;
613 };
614 
615 template <typename Derived, typename TargetMachineT>
buildPipeline(ModulePassManager & MPM,raw_pwrite_stream & Out,raw_pwrite_stream * DwoOut,CodeGenFileType FileType)616 Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline(
617     ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
618     CodeGenFileType FileType) const {
619   auto StartStopInfo = TargetPassConfig::getStartStopInfo(*PIC);
620   if (!StartStopInfo)
621     return StartStopInfo.takeError();
622   setStartStopPasses(*StartStopInfo);
623 
624   bool PrintAsm = TargetPassConfig::willCompleteCodeGenPipeline();
625   bool PrintMIR = !PrintAsm && FileType != CodeGenFileType::Null;
626 
627   {
628     AddIRPass addIRPass(MPM, derived());
629     addIRPass(RequireAnalysisPass<MachineModuleAnalysis, Module>(),
630               /*Force=*/true);
631     addIRPass(RequireAnalysisPass<ProfileSummaryAnalysis, Module>(),
632               /*Force=*/true);
633     addIRPass(RequireAnalysisPass<CollectorMetadataAnalysis, Module>(),
634               /*Force=*/true);
635     addISelPasses(addIRPass);
636   }
637 
638   AddMachinePass addPass(MPM, derived());
639 
640   if (PrintMIR)
641     addPass(PrintMIRPreparePass(Out), /*Force=*/true);
642 
643   if (auto Err = addCoreISelPasses(addPass))
644     return std::move(Err);
645 
646   if (auto Err = derived().addMachinePasses(addPass))
647     return std::move(Err);
648 
649   if (!Opt.DisableVerify)
650     addPass(MachineVerifierPass());
651 
652   if (PrintAsm) {
653     derived().addAsmPrinter(
654         addPass, [this, &Out, DwoOut, FileType](MCContext &Ctx) {
655           return this->TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
656         });
657   }
658 
659   if (PrintMIR)
660     addPass(PrintMIRPass(Out), /*Force=*/true);
661 
662   return verifyStartStop(*StartStopInfo);
663 }
664 
665 template <typename Derived, typename TargetMachineT>
setStartStopPasses(const TargetPassConfig::StartStopInfo & Info)666 void CodeGenPassBuilder<Derived, TargetMachineT>::setStartStopPasses(
667     const TargetPassConfig::StartStopInfo &Info) const {
668   if (!Info.StartPass.empty()) {
669     Started = false;
670     BeforeCallbacks.emplace_back([this, &Info, AfterFlag = Info.StartAfter,
671                                   Count = 0u](StringRef ClassName) mutable {
672       if (Count == Info.StartInstanceNum) {
673         if (AfterFlag) {
674           AfterFlag = false;
675           Started = true;
676         }
677         return Started;
678       }
679 
680       auto PassName = PIC->getPassNameForClassName(ClassName);
681       if (Info.StartPass == PassName && ++Count == Info.StartInstanceNum)
682         Started = !Info.StartAfter;
683 
684       return Started;
685     });
686   }
687 
688   if (!Info.StopPass.empty()) {
689     Stopped = false;
690     BeforeCallbacks.emplace_back([this, &Info, AfterFlag = Info.StopAfter,
691                                   Count = 0u](StringRef ClassName) mutable {
692       if (Count == Info.StopInstanceNum) {
693         if (AfterFlag) {
694           AfterFlag = false;
695           Stopped = true;
696         }
697         return !Stopped;
698       }
699 
700       auto PassName = PIC->getPassNameForClassName(ClassName);
701       if (Info.StopPass == PassName && ++Count == Info.StopInstanceNum)
702         Stopped = !Info.StopAfter;
703       return !Stopped;
704     });
705   }
706 }
707 
708 template <typename Derived, typename TargetMachineT>
verifyStartStop(const TargetPassConfig::StartStopInfo & Info)709 Error CodeGenPassBuilder<Derived, TargetMachineT>::verifyStartStop(
710     const TargetPassConfig::StartStopInfo &Info) const {
711   if (Started && Stopped)
712     return Error::success();
713 
714   if (!Started)
715     return make_error<StringError>(
716         "Can't find start pass \"" + Info.StartPass + "\".",
717         std::make_error_code(std::errc::invalid_argument));
718   if (!Stopped)
719     return make_error<StringError>(
720         "Can't find stop pass \"" + Info.StopPass + "\".",
721         std::make_error_code(std::errc::invalid_argument));
722   return Error::success();
723 }
724 
725 template <typename Derived, typename TargetMachineT>
addISelPasses(AddIRPass & addPass)726 void CodeGenPassBuilder<Derived, TargetMachineT>::addISelPasses(
727     AddIRPass &addPass) const {
728   derived().addGlobalMergePass(addPass);
729   if (TM.useEmulatedTLS())
730     addPass(LowerEmuTLSPass());
731 
732   addPass(PreISelIntrinsicLoweringPass(&TM));
733   addPass(ExpandLargeDivRemPass(&TM));
734   addPass(ExpandFpPass(&TM));
735 
736   derived().addIRPasses(addPass);
737   derived().addCodeGenPrepare(addPass);
738   addPassesToHandleExceptions(addPass);
739   derived().addISelPrepare(addPass);
740 }
741 
742 /// Add common target configurable passes that perform LLVM IR to IR transforms
743 /// following machine independent optimization.
744 template <typename Derived, typename TargetMachineT>
addIRPasses(AddIRPass & addPass)745 void CodeGenPassBuilder<Derived, TargetMachineT>::addIRPasses(
746     AddIRPass &addPass) const {
747   // Before running any passes, run the verifier to determine if the input
748   // coming from the front-end and/or optimizer is valid.
749   if (!Opt.DisableVerify)
750     addPass(VerifierPass(), /*Force=*/true);
751 
752   // Run loop strength reduction before anything else.
753   if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableLSR) {
754     addPass(createFunctionToLoopPassAdaptor(LoopStrengthReducePass(),
755                                             /*UseMemorySSA=*/true));
756   }
757 
758   if (getOptLevel() != CodeGenOptLevel::None) {
759     // The MergeICmpsPass tries to create memcmp calls by grouping sequences of
760     // loads and compares. ExpandMemCmpPass then tries to expand those calls
761     // into optimally-sized loads and compares. The transforms are enabled by a
762     // target lowering hook.
763     if (!Opt.DisableMergeICmps)
764       addPass(MergeICmpsPass());
765     addPass(ExpandMemCmpPass(&TM));
766   }
767 
768   // Run GC lowering passes for builtin collectors
769   // TODO: add a pass insertion point here
770   addPass(GCLoweringPass());
771   addPass(ShadowStackGCLoweringPass());
772   addPass(LowerConstantIntrinsicsPass());
773 
774   // Make sure that no unreachable blocks are instruction selected.
775   addPass(UnreachableBlockElimPass());
776 
777   // Prepare expensive constants for SelectionDAG.
778   if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableConstantHoisting)
779     addPass(ConstantHoistingPass());
780 
781   // Replace calls to LLVM intrinsics (e.g., exp, log) operating on vector
782   // operands with calls to the corresponding functions in a vector library.
783   if (getOptLevel() != CodeGenOptLevel::None)
784     addPass(ReplaceWithVeclib());
785 
786   if (getOptLevel() != CodeGenOptLevel::None &&
787       !Opt.DisablePartialLibcallInlining)
788     addPass(PartiallyInlineLibCallsPass());
789 
790   // Instrument function entry and exit, e.g. with calls to mcount().
791   addPass(EntryExitInstrumenterPass(/*PostInlining=*/true));
792 
793   // Add scalarization of target's unsupported masked memory intrinsics pass.
794   // the unsupported intrinsic will be replaced with a chain of basic blocks,
795   // that stores/loads element one-by-one if the appropriate mask bit is set.
796   addPass(ScalarizeMaskedMemIntrinPass());
797 
798   // Expand reduction intrinsics into shuffle sequences if the target wants to.
799   addPass(ExpandReductionsPass());
800 
801   // Convert conditional moves to conditional jumps when profitable.
802   if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableSelectOptimize)
803     addPass(SelectOptimizePass(&TM));
804 
805   if (Opt.EnableGlobalMergeFunc)
806     addPass(GlobalMergeFuncPass());
807 }
808 
809 /// Turn exception handling constructs into something the code generators can
810 /// handle.
811 template <typename Derived, typename TargetMachineT>
addPassesToHandleExceptions(AddIRPass & addPass)812 void CodeGenPassBuilder<Derived, TargetMachineT>::addPassesToHandleExceptions(
813     AddIRPass &addPass) const {
814   const MCAsmInfo *MCAI = TM.getMCAsmInfo();
815   assert(MCAI && "No MCAsmInfo");
816   switch (MCAI->getExceptionHandlingType()) {
817   case ExceptionHandling::SjLj:
818     // SjLj piggy-backs on dwarf for this bit. The cleanups done apply to both
819     // Dwarf EH prepare needs to be run after SjLj prepare. Otherwise,
820     // catch info can get misplaced when a selector ends up more than one block
821     // removed from the parent invoke(s). This could happen when a landing
822     // pad is shared by multiple invokes and is also a target of a normal
823     // edge from elsewhere.
824     addPass(SjLjEHPreparePass(&TM));
825     [[fallthrough]];
826   case ExceptionHandling::DwarfCFI:
827   case ExceptionHandling::ARM:
828   case ExceptionHandling::AIX:
829   case ExceptionHandling::ZOS:
830     addPass(DwarfEHPreparePass(&TM));
831     break;
832   case ExceptionHandling::WinEH:
833     // We support using both GCC-style and MSVC-style exceptions on Windows, so
834     // add both preparation passes. Each pass will only actually run if it
835     // recognizes the personality function.
836     addPass(WinEHPreparePass());
837     addPass(DwarfEHPreparePass(&TM));
838     break;
839   case ExceptionHandling::Wasm:
840     // Wasm EH uses Windows EH instructions, but it does not need to demote PHIs
841     // on catchpads and cleanuppads because it does not outline them into
842     // funclets. Catchswitch blocks are not lowered in SelectionDAG, so we
843     // should remove PHIs there.
844     addPass(WinEHPreparePass(/*DemoteCatchSwitchPHIOnly=*/false));
845     addPass(WasmEHPreparePass());
846     break;
847   case ExceptionHandling::None:
848     addPass(LowerInvokePass());
849 
850     // The lower invoke pass may create unreachable code. Remove it.
851     addPass(UnreachableBlockElimPass());
852     break;
853   }
854 }
855 
856 /// Add pass to prepare the LLVM IR for code generation. This should be done
857 /// before exception handling preparation passes.
858 template <typename Derived, typename TargetMachineT>
addCodeGenPrepare(AddIRPass & addPass)859 void CodeGenPassBuilder<Derived, TargetMachineT>::addCodeGenPrepare(
860     AddIRPass &addPass) const {
861   if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableCGP)
862     addPass(CodeGenPreparePass(&TM));
863   // TODO: Default ctor'd RewriteSymbolPass is no-op.
864   // addPass(RewriteSymbolPass());
865 }
866 
867 /// Add common passes that perform LLVM IR to IR transforms in preparation for
868 /// instruction selection.
869 template <typename Derived, typename TargetMachineT>
addISelPrepare(AddIRPass & addPass)870 void CodeGenPassBuilder<Derived, TargetMachineT>::addISelPrepare(
871     AddIRPass &addPass) const {
872   derived().addPreISel(addPass);
873 
874   if (Opt.RequiresCodeGenSCCOrder)
875     addPass.requireCGSCCOrder();
876 
877   addPass(CallBrPreparePass());
878   // Add both the safe stack and the stack protection passes: each of them will
879   // only protect functions that have corresponding attributes.
880   addPass(SafeStackPass(&TM));
881   addPass(StackProtectorPass(&TM));
882 
883   if (Opt.PrintISelInput)
884     addPass(PrintFunctionPass(dbgs(),
885                               "\n\n*** Final LLVM Code input to ISel ***\n"));
886 
887   // All passes which modify the LLVM IR are now complete; run the verifier
888   // to ensure that the IR is valid.
889   if (!Opt.DisableVerify)
890     addPass(VerifierPass(), /*Force=*/true);
891 }
892 
893 template <typename Derived, typename TargetMachineT>
addCoreISelPasses(AddMachinePass & addPass)894 Error CodeGenPassBuilder<Derived, TargetMachineT>::addCoreISelPasses(
895     AddMachinePass &addPass) const {
896   // Enable FastISel with -fast-isel, but allow that to be overridden.
897   TM.setO0WantsFastISel(Opt.EnableFastISelOption.value_or(true));
898 
899   // Determine an instruction selector.
900   enum class SelectorType { SelectionDAG, FastISel, GlobalISel };
901   SelectorType Selector;
902 
903   if (Opt.EnableFastISelOption && *Opt.EnableFastISelOption == true)
904     Selector = SelectorType::FastISel;
905   else if ((Opt.EnableGlobalISelOption &&
906             *Opt.EnableGlobalISelOption == true) ||
907            (TM.Options.EnableGlobalISel &&
908             (!Opt.EnableGlobalISelOption ||
909              *Opt.EnableGlobalISelOption == false)))
910     Selector = SelectorType::GlobalISel;
911   else if (TM.getOptLevel() == CodeGenOptLevel::None && TM.getO0WantsFastISel())
912     Selector = SelectorType::FastISel;
913   else
914     Selector = SelectorType::SelectionDAG;
915 
916   // Set consistently TM.Options.EnableFastISel and EnableGlobalISel.
917   if (Selector == SelectorType::FastISel) {
918     TM.setFastISel(true);
919     TM.setGlobalISel(false);
920   } else if (Selector == SelectorType::GlobalISel) {
921     TM.setFastISel(false);
922     TM.setGlobalISel(true);
923   }
924 
925   // Add instruction selector passes.
926   if (Selector == SelectorType::GlobalISel) {
927     if (auto Err = derived().addIRTranslator(addPass))
928       return std::move(Err);
929 
930     derived().addPreLegalizeMachineIR(addPass);
931 
932     if (auto Err = derived().addLegalizeMachineIR(addPass))
933       return std::move(Err);
934 
935     // Before running the register bank selector, ask the target if it
936     // wants to run some passes.
937     derived().addPreRegBankSelect(addPass);
938 
939     if (auto Err = derived().addRegBankSelect(addPass))
940       return std::move(Err);
941 
942     derived().addPreGlobalInstructionSelect(addPass);
943 
944     if (auto Err = derived().addGlobalInstructionSelect(addPass))
945       return std::move(Err);
946 
947     // Pass to reset the MachineFunction if the ISel failed.
948     addPass(ResetMachineFunctionPass(reportDiagnosticWhenGlobalISelFallback(),
949                                      isGlobalISelAbortEnabled()));
950 
951     // Provide a fallback path when we do not want to abort on
952     // not-yet-supported input.
953     if (!isGlobalISelAbortEnabled())
954       if (auto Err = derived().addInstSelector(addPass))
955         return std::move(Err);
956 
957   } else if (auto Err = derived().addInstSelector(addPass))
958     return std::move(Err);
959 
960   // Expand pseudo-instructions emitted by ISel. Don't run the verifier before
961   // FinalizeISel.
962   addPass(FinalizeISelPass());
963 
964   // // Print the instruction selected machine code...
965   // printAndVerify("After Instruction Selection");
966 
967   return Error::success();
968 }
969 
970 /// Add the complete set of target-independent postISel code generator passes.
971 ///
972 /// This can be read as the standard order of major LLVM CodeGen stages. Stages
973 /// with nontrivial configuration or multiple passes are broken out below in
974 /// add%Stage routines.
975 ///
976 /// Any CodeGenPassBuilder<Derived, TargetMachine>::addXX routine may be
977 /// overriden by the Target. The addPre/Post methods with empty header
978 /// implementations allow injecting target-specific fixups just before or after
979 /// major stages. Additionally, targets have the flexibility to change pass
980 /// order within a stage by overriding default implementation of add%Stage
981 /// routines below. Each technique has maintainability tradeoffs because
982 /// alternate pass orders are not well supported. addPre/Post works better if
983 /// the target pass is easily tied to a common pass. But if it has subtle
984 /// dependencies on multiple passes, the target should override the stage
985 /// instead.
986 template <typename Derived, typename TargetMachineT>
addMachinePasses(AddMachinePass & addPass)987 Error CodeGenPassBuilder<Derived, TargetMachineT>::addMachinePasses(
988     AddMachinePass &addPass) const {
989   // Add passes that optimize machine instructions in SSA form.
990   if (getOptLevel() != CodeGenOptLevel::None) {
991     derived().addMachineSSAOptimization(addPass);
992   } else {
993     // If the target requests it, assign local variables to stack slots relative
994     // to one another and simplify frame index references where possible.
995     addPass(LocalStackSlotAllocationPass());
996   }
997 
998   if (TM.Options.EnableIPRA) {
999     addPass(RequireAnalysisPass<PhysicalRegisterUsageAnalysis, Module>());
1000     addPass(RegUsageInfoPropagationPass());
1001   }
1002   // Run pre-ra passes.
1003   derived().addPreRegAlloc(addPass);
1004 
1005   // Run register allocation and passes that are tightly coupled with it,
1006   // including phi elimination and scheduling.
1007   if (*Opt.OptimizeRegAlloc) {
1008     derived().addOptimizedRegAlloc(addPass);
1009   } else {
1010     if (auto Err = derived().addFastRegAlloc(addPass))
1011       return Err;
1012   }
1013 
1014   // Run post-ra passes.
1015   derived().addPostRegAlloc(addPass);
1016 
1017   addPass(RemoveRedundantDebugValuesPass());
1018   addPass(FixupStatepointCallerSavedPass());
1019 
1020   // Insert prolog/epilog code.  Eliminate abstract frame index references...
1021   if (getOptLevel() != CodeGenOptLevel::None) {
1022     addPass(PostRAMachineSinkingPass());
1023     addPass(ShrinkWrapPass());
1024   }
1025 
1026   addPass(PrologEpilogInserterPass());
1027 
1028   /// Add passes that optimize machine instructions after register allocation.
1029   if (getOptLevel() != CodeGenOptLevel::None)
1030     derived().addMachineLateOptimization(addPass);
1031 
1032   // Expand pseudo instructions before second scheduling pass.
1033   addPass(ExpandPostRAPseudosPass());
1034 
1035   // Run pre-sched2 passes.
1036   derived().addPreSched2(addPass);
1037 
1038   if (Opt.EnableImplicitNullChecks)
1039     addPass(ImplicitNullChecksPass());
1040 
1041   // Second pass scheduler.
1042   // Let Target optionally insert this pass by itself at some other
1043   // point.
1044   if (getOptLevel() != CodeGenOptLevel::None &&
1045       !TM.targetSchedulesPostRAScheduling()) {
1046     if (Opt.MISchedPostRA)
1047       addPass(PostMachineSchedulerPass(&TM));
1048     else
1049       addPass(PostRASchedulerPass(&TM));
1050   }
1051 
1052   // GC
1053   derived().addGCPasses(addPass);
1054 
1055   // Basic block placement.
1056   if (getOptLevel() != CodeGenOptLevel::None)
1057     derived().addBlockPlacement(addPass);
1058 
1059   // Insert before XRay Instrumentation.
1060   addPass(FEntryInserterPass());
1061 
1062   addPass(XRayInstrumentationPass());
1063   addPass(PatchableFunctionPass());
1064 
1065   derived().addPreEmitPass(addPass);
1066 
1067   if (TM.Options.EnableIPRA)
1068     // Collect register usage information and produce a register mask of
1069     // clobbered registers, to be used to optimize call sites.
1070     addPass(RegUsageInfoCollectorPass());
1071 
1072   addPass(FuncletLayoutPass());
1073 
1074   addPass(RemoveLoadsIntoFakeUsesPass());
1075   addPass(StackMapLivenessPass());
1076   addPass(LiveDebugValuesPass(
1077       getTM<TargetMachine>().Options.ShouldEmitDebugEntryValues()));
1078   addPass(MachineSanitizerBinaryMetadataPass());
1079 
1080   if (TM.Options.EnableMachineOutliner &&
1081       getOptLevel() != CodeGenOptLevel::None &&
1082       Opt.EnableMachineOutliner != RunOutliner::NeverOutline) {
1083     bool RunOnAllFunctions =
1084         (Opt.EnableMachineOutliner == RunOutliner::AlwaysOutline);
1085     bool AddOutliner = RunOnAllFunctions || TM.Options.SupportsDefaultOutlining;
1086     if (AddOutliner)
1087       addPass(MachineOutlinerPass(RunOnAllFunctions));
1088   }
1089 
1090   addPass(StackFrameLayoutAnalysisPass());
1091 
1092   // Add passes that directly emit MI after all other MI passes.
1093   derived().addPreEmitPass2(addPass);
1094 
1095   return Error::success();
1096 }
1097 
1098 /// Add passes that optimize machine instructions in SSA form.
1099 template <typename Derived, typename TargetMachineT>
addMachineSSAOptimization(AddMachinePass & addPass)1100 void CodeGenPassBuilder<Derived, TargetMachineT>::addMachineSSAOptimization(
1101     AddMachinePass &addPass) const {
1102   // Pre-ra tail duplication.
1103   addPass(EarlyTailDuplicatePass());
1104 
1105   // Optimize PHIs before DCE: removing dead PHI cycles may make more
1106   // instructions dead.
1107   addPass(OptimizePHIsPass());
1108 
1109   // This pass merges large allocas. StackSlotColoring is a different pass
1110   // which merges spill slots.
1111   addPass(StackColoringPass());
1112 
1113   // If the target requests it, assign local variables to stack slots relative
1114   // to one another and simplify frame index references where possible.
1115   addPass(LocalStackSlotAllocationPass());
1116 
1117   // With optimization, dead code should already be eliminated. However
1118   // there is one known exception: lowered code for arguments that are only
1119   // used by tail calls, where the tail calls reuse the incoming stack
1120   // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll).
1121   addPass(DeadMachineInstructionElimPass());
1122 
1123   // Allow targets to insert passes that improve instruction level parallelism,
1124   // like if-conversion. Such passes will typically need dominator trees and
1125   // loop info, just like LICM and CSE below.
1126   derived().addILPOpts(addPass);
1127 
1128   addPass(EarlyMachineLICMPass());
1129   addPass(MachineCSEPass());
1130 
1131   addPass(MachineSinkingPass(Opt.EnableSinkAndFold));
1132 
1133   addPass(PeepholeOptimizerPass());
1134   // Clean-up the dead code that may have been generated by peephole
1135   // rewriting.
1136   addPass(DeadMachineInstructionElimPass());
1137 }
1138 
1139 //===---------------------------------------------------------------------===//
1140 /// Register Allocation Pass Configuration
1141 //===---------------------------------------------------------------------===//
1142 
1143 /// Instantiate the default register allocator pass for this target for either
1144 /// the optimized or unoptimized allocation path. This will be added to the pass
1145 /// manager by addFastRegAlloc in the unoptimized case or addOptimizedRegAlloc
1146 /// in the optimized case.
1147 ///
1148 /// A target that uses the standard regalloc pass order for fast or optimized
1149 /// allocation may still override this for per-target regalloc
1150 /// selection. But -regalloc-npm=... always takes precedence.
1151 /// If a target does not want to allow users to set -regalloc-npm=... at all,
1152 /// check if Opt.RegAlloc == RegAllocType::Unset.
1153 template <typename Derived, typename TargetMachineT>
addTargetRegisterAllocator(AddMachinePass & addPass,bool Optimized)1154 void CodeGenPassBuilder<Derived, TargetMachineT>::addTargetRegisterAllocator(
1155     AddMachinePass &addPass, bool Optimized) const {
1156   if (Optimized)
1157     addPass(RAGreedyPass());
1158   else
1159     addPass(RegAllocFastPass());
1160 }
1161 
1162 /// Find and instantiate the register allocation pass requested by this target
1163 /// at the current optimization level.  Different register allocators are
1164 /// defined as separate passes because they may require different analysis.
1165 ///
1166 /// This helper ensures that the -regalloc-npm= option is always available,
1167 /// even for targets that override the default allocator.
1168 template <typename Derived, typename TargetMachineT>
addRegAllocPass(AddMachinePass & addPass,bool Optimized)1169 void CodeGenPassBuilder<Derived, TargetMachineT>::addRegAllocPass(
1170     AddMachinePass &addPass, bool Optimized) const {
1171   // Use the specified -regalloc-npm={basic|greedy|fast|pbqp}
1172   if (Opt.RegAlloc > RegAllocType::Default) {
1173     switch (Opt.RegAlloc) {
1174     case RegAllocType::Fast:
1175       addPass(RegAllocFastPass());
1176       break;
1177     case RegAllocType::Greedy:
1178       addPass(RAGreedyPass());
1179       break;
1180     default:
1181       reportFatalUsageError("register allocator not supported yet");
1182     }
1183     return;
1184   }
1185   // -regalloc=default or unspecified, so pick based on the optimization level
1186   // or ask the target for the regalloc pass.
1187   derived().addTargetRegisterAllocator(addPass, Optimized);
1188 }
1189 
1190 template <typename Derived, typename TargetMachineT>
addRegAssignmentFast(AddMachinePass & addPass)1191 Error CodeGenPassBuilder<Derived, TargetMachineT>::addRegAssignmentFast(
1192     AddMachinePass &addPass) const {
1193   // TODO: Ensure allocator is default or fast.
1194   addRegAllocPass(addPass, false);
1195   return Error::success();
1196 }
1197 
1198 template <typename Derived, typename TargetMachineT>
addRegAssignmentOptimized(AddMachinePass & addPass)1199 Error CodeGenPassBuilder<Derived, TargetMachineT>::addRegAssignmentOptimized(
1200     AddMachinePass &addPass) const {
1201   // Add the selected register allocation pass.
1202   addRegAllocPass(addPass, true);
1203 
1204   // Allow targets to change the register assignments before rewriting.
1205   derived().addPreRewrite(addPass);
1206 
1207   // Finally rewrite virtual registers.
1208   addPass(VirtRegRewriterPass());
1209   // Perform stack slot coloring and post-ra machine LICM.
1210   //
1211   // FIXME: Re-enable coloring with register when it's capable of adding
1212   // kill markers.
1213   addPass(StackSlotColoringPass());
1214 
1215   return Error::success();
1216 }
1217 
1218 /// Add the minimum set of target-independent passes that are required for
1219 /// register allocation. No coalescing or scheduling.
1220 template <typename Derived, typename TargetMachineT>
addFastRegAlloc(AddMachinePass & addPass)1221 Error CodeGenPassBuilder<Derived, TargetMachineT>::addFastRegAlloc(
1222     AddMachinePass &addPass) const {
1223   addPass(PHIEliminationPass());
1224   addPass(TwoAddressInstructionPass());
1225   return derived().addRegAssignmentFast(addPass);
1226 }
1227 
1228 /// Add standard target-independent passes that are tightly coupled with
1229 /// optimized register allocation, including coalescing, machine instruction
1230 /// scheduling, and register allocation itself.
1231 template <typename Derived, typename TargetMachineT>
addOptimizedRegAlloc(AddMachinePass & addPass)1232 void CodeGenPassBuilder<Derived, TargetMachineT>::addOptimizedRegAlloc(
1233     AddMachinePass &addPass) const {
1234   addPass(DetectDeadLanesPass());
1235 
1236   addPass(InitUndefPass());
1237 
1238   addPass(ProcessImplicitDefsPass());
1239 
1240   // LiveVariables currently requires pure SSA form.
1241   //
1242   // FIXME: Once TwoAddressInstruction pass no longer uses kill flags,
1243   // LiveVariables can be removed completely, and LiveIntervals can be directly
1244   // computed. (We still either need to regenerate kill flags after regalloc, or
1245   // preferably fix the scavenger to not depend on them).
1246   // FIXME: UnreachableMachineBlockElim is a dependant pass of LiveVariables.
1247   // When LiveVariables is removed this has to be removed/moved either.
1248   // Explicit addition of UnreachableMachineBlockElim allows stopping before or
1249   // after it with -stop-before/-stop-after.
1250   addPass(UnreachableMachineBlockElimPass());
1251   addPass(RequireAnalysisPass<LiveVariablesAnalysis, MachineFunction>());
1252 
1253   // Edge splitting is smarter with machine loop info.
1254   addPass(RequireAnalysisPass<MachineLoopAnalysis, MachineFunction>());
1255   addPass(PHIEliminationPass());
1256 
1257   // Eventually, we want to run LiveIntervals before PHI elimination.
1258   if (Opt.EarlyLiveIntervals)
1259     addPass(RequireAnalysisPass<LiveIntervalsAnalysis, MachineFunction>());
1260 
1261   addPass(TwoAddressInstructionPass());
1262   addPass(RegisterCoalescerPass());
1263 
1264   // The machine scheduler may accidentally create disconnected components
1265   // when moving subregister definitions around, avoid this by splitting them to
1266   // separate vregs before. Splitting can also improve reg. allocation quality.
1267   addPass(RenameIndependentSubregsPass());
1268 
1269   // PreRA instruction scheduling.
1270   addPass(MachineSchedulerPass(&TM));
1271 
1272   if (auto E = derived().addRegAssignmentOptimized(addPass)) {
1273     // addRegAssignmentOptimized did not add a reg alloc pass, so do nothing.
1274     return;
1275   }
1276   // Allow targets to expand pseudo instructions depending on the choice of
1277   // registers before MachineCopyPropagation.
1278   derived().addPostRewrite(addPass);
1279 
1280   // Copy propagate to forward register uses and try to eliminate COPYs that
1281   // were not coalesced.
1282   addPass(MachineCopyPropagationPass());
1283 
1284   // Run post-ra machine LICM to hoist reloads / remats.
1285   //
1286   // FIXME: can this move into MachineLateOptimization?
1287   addPass(MachineLICMPass());
1288 }
1289 
1290 //===---------------------------------------------------------------------===//
1291 /// Post RegAlloc Pass Configuration
1292 //===---------------------------------------------------------------------===//
1293 
1294 /// Add passes that optimize machine instructions after register allocation.
1295 template <typename Derived, typename TargetMachineT>
addMachineLateOptimization(AddMachinePass & addPass)1296 void CodeGenPassBuilder<Derived, TargetMachineT>::addMachineLateOptimization(
1297     AddMachinePass &addPass) const {
1298   // Branch folding must be run after regalloc and prolog/epilog insertion.
1299   addPass(BranchFolderPass(Opt.EnableTailMerge));
1300 
1301   // Tail duplication.
1302   // Note that duplicating tail just increases code size and degrades
1303   // performance for targets that require Structured Control Flow.
1304   // In addition it can also make CFG irreducible. Thus we disable it.
1305   if (!TM.requiresStructuredCFG())
1306     addPass(TailDuplicatePass());
1307 
1308   // Cleanup of redundant (identical) address/immediate loads.
1309   addPass(MachineLateInstrsCleanupPass());
1310 
1311   // Copy propagation.
1312   addPass(MachineCopyPropagationPass());
1313 }
1314 
1315 /// Add standard basic block placement passes.
1316 template <typename Derived, typename TargetMachineT>
addBlockPlacement(AddMachinePass & addPass)1317 void CodeGenPassBuilder<Derived, TargetMachineT>::addBlockPlacement(
1318     AddMachinePass &addPass) const {
1319   addPass(MachineBlockPlacementPass(Opt.EnableTailMerge));
1320   // Run a separate pass to collect block placement statistics.
1321   if (Opt.EnableBlockPlacementStats)
1322     addPass(MachineBlockPlacementStatsPass());
1323 }
1324 
1325 } // namespace llvm
1326 
1327 #endif // LLVM_PASSES_CODEGENPASSBUILDER_H
1328