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