xref: /llvm-project/llvm/include/llvm/CodeGen/TargetPassConfig.h (revision eec21ccee0950d52926a79685573db1996e3ba5b)
1 //===- TargetPassConfig.h - Code Generation pass options --------*- 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 /// Target-Independent Code Generator Pass Configuration Options pass.
10 ///
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CODEGEN_TARGETPASSCONFIG_H
14 #define LLVM_CODEGEN_TARGETPASSCONFIG_H
15 
16 #include "llvm/Pass.h"
17 #include "llvm/Support/CodeGen.h"
18 #include "llvm/Support/Error.h"
19 #include <cassert>
20 #include <string>
21 
22 namespace llvm {
23 
24 class TargetMachine;
25 struct MachineSchedContext;
26 class PassConfigImpl;
27 class ScheduleDAGInstrs;
28 class CSEConfigBase;
29 class PassInstrumentationCallbacks;
30 
31 // The old pass manager infrastructure is hidden in a legacy namespace now.
32 namespace legacy {
33 
34 class PassManagerBase;
35 
36 } // end namespace legacy
37 
38 using legacy::PassManagerBase;
39 
40 /// Discriminated union of Pass ID types.
41 ///
42 /// The PassConfig API prefers dealing with IDs because they are safer and more
43 /// efficient. IDs decouple configuration from instantiation. This way, when a
44 /// pass is overriden, it isn't unnecessarily instantiated. It is also unsafe to
45 /// refer to a Pass pointer after adding it to a pass manager, which deletes
46 /// redundant pass instances.
47 ///
48 /// However, it is convient to directly instantiate target passes with
49 /// non-default ctors. These often don't have a registered PassInfo. Rather than
50 /// force all target passes to implement the pass registry boilerplate, allow
51 /// the PassConfig API to handle either type.
52 ///
53 /// AnalysisID is sadly char*, so PointerIntPair won't work.
54 class IdentifyingPassPtr {
55   union {
56     AnalysisID ID;
57     Pass *P;
58   };
59   bool IsInstance = false;
60 
61 public:
62   IdentifyingPassPtr() : P(nullptr) {}
63   IdentifyingPassPtr(AnalysisID IDPtr) : ID(IDPtr) {}
64   IdentifyingPassPtr(Pass *InstancePtr) : P(InstancePtr), IsInstance(true) {}
65 
66   bool isValid() const { return P; }
67   bool isInstance() const { return IsInstance; }
68 
69   AnalysisID getID() const {
70     assert(!IsInstance && "Not a Pass ID");
71     return ID;
72   }
73 
74   Pass *getInstance() const {
75     assert(IsInstance && "Not a Pass Instance");
76     return P;
77   }
78 };
79 
80 
81 /// Target-Independent Code Generator Pass Configuration Options.
82 ///
83 /// This is an ImmutablePass solely for the purpose of exposing CodeGen options
84 /// to the internals of other CodeGen passes.
85 class TargetPassConfig : public ImmutablePass {
86 private:
87   PassManagerBase *PM = nullptr;
88   AnalysisID StartBefore = nullptr;
89   AnalysisID StartAfter = nullptr;
90   AnalysisID StopBefore = nullptr;
91   AnalysisID StopAfter = nullptr;
92 
93   unsigned StartBeforeInstanceNum = 0;
94   unsigned StartBeforeCount = 0;
95 
96   unsigned StartAfterInstanceNum = 0;
97   unsigned StartAfterCount = 0;
98 
99   unsigned StopBeforeInstanceNum = 0;
100   unsigned StopBeforeCount = 0;
101 
102   unsigned StopAfterInstanceNum = 0;
103   unsigned StopAfterCount = 0;
104 
105   bool Started = true;
106   bool Stopped = false;
107   bool AddingMachinePasses = false;
108   bool DebugifyIsSafe = true;
109 
110   /// Set the StartAfter, StartBefore and StopAfter passes to allow running only
111   /// a portion of the normal code-gen pass sequence.
112   ///
113   /// If the StartAfter and StartBefore pass ID is zero, then compilation will
114   /// begin at the normal point; otherwise, clear the Started flag to indicate
115   /// that passes should not be added until the starting pass is seen.  If the
116   /// Stop pass ID is zero, then compilation will continue to the end.
117   ///
118   /// This function expects that at least one of the StartAfter or the
119   /// StartBefore pass IDs is null.
120   void setStartStopPasses();
121 
122 protected:
123   TargetMachine *TM;
124   PassConfigImpl *Impl = nullptr; // Internal data structures
125   bool Initialized = false; // Flagged after all passes are configured.
126 
127   // Target Pass Options
128   // Targets provide a default setting, user flags override.
129   bool DisableVerify = false;
130 
131   /// Default setting for -enable-tail-merge on this target.
132   bool EnableTailMerge = true;
133 
134   /// Enable sinking of instructions in MachineSink where a computation can be
135   /// folded into the addressing mode of a memory load/store instruction or
136   /// replace a copy.
137   bool EnableSinkAndFold = false;
138 
139   /// Require processing of functions such that callees are generated before
140   /// callers.
141   bool RequireCodeGenSCCOrder = false;
142 
143   /// Enable LoopTermFold immediately after LSR
144   bool EnableLoopTermFold = false;
145 
146   /// Add the actual instruction selection passes. This does not include
147   /// preparation passes on IR.
148   bool addCoreISelPasses();
149 
150 public:
151   TargetPassConfig(TargetMachine &TM, PassManagerBase &PM);
152   // Dummy constructor.
153   TargetPassConfig();
154 
155   ~TargetPassConfig() override;
156 
157   static char ID;
158 
159   /// Get the right type of TargetMachine for this target.
160   template<typename TMC> TMC &getTM() const {
161     return *static_cast<TMC*>(TM);
162   }
163 
164   //
165   void setInitialized() { Initialized = true; }
166 
167   CodeGenOptLevel getOptLevel() const;
168 
169   /// Returns true if one of the `-start-after`, `-start-before`, `-stop-after`
170   /// or `-stop-before` options is set.
171   static bool hasLimitedCodeGenPipeline();
172 
173   /// Returns true if none of the `-stop-before` and `-stop-after` options is
174   /// set.
175   static bool willCompleteCodeGenPipeline();
176 
177   /// If hasLimitedCodeGenPipeline is true, this method returns
178   /// a string with the name of the options that caused this
179   /// pipeline to be limited.
180   static std::string getLimitedCodeGenPipelineReason();
181 
182   struct StartStopInfo {
183     bool StartAfter;
184     bool StopAfter;
185     unsigned StartInstanceNum;
186     unsigned StopInstanceNum;
187     StringRef StartPass;
188     StringRef StopPass;
189   };
190 
191   /// Returns pass name in `-stop-before` or `-stop-after`
192   /// NOTE: New pass manager migration only
193   static Expected<StartStopInfo>
194   getStartStopInfo(PassInstrumentationCallbacks &PIC);
195 
196   void setDisableVerify(bool Disable) { setOpt(DisableVerify, Disable); }
197 
198   bool getEnableTailMerge() const { return EnableTailMerge; }
199   void setEnableTailMerge(bool Enable) { setOpt(EnableTailMerge, Enable); }
200 
201   bool getEnableSinkAndFold() const { return EnableSinkAndFold; }
202   void setEnableSinkAndFold(bool Enable) { setOpt(EnableSinkAndFold, Enable); }
203 
204   bool requiresCodeGenSCCOrder() const { return RequireCodeGenSCCOrder; }
205   void setRequiresCodeGenSCCOrder(bool Enable = true) {
206     setOpt(RequireCodeGenSCCOrder, Enable);
207   }
208 
209   /// Allow the target to override a specific pass without overriding the pass
210   /// pipeline. When passes are added to the standard pipeline at the
211   /// point where StandardID is expected, add TargetID in its place.
212   void substitutePass(AnalysisID StandardID, IdentifyingPassPtr TargetID);
213 
214   /// Insert InsertedPassID pass after TargetPassID pass.
215   void insertPass(AnalysisID TargetPassID, IdentifyingPassPtr InsertedPassID);
216 
217   /// Allow the target to enable a specific standard pass by default.
218   void enablePass(AnalysisID PassID) { substitutePass(PassID, PassID); }
219 
220   /// Allow the target to disable a specific standard pass by default.
221   void disablePass(AnalysisID PassID) {
222     substitutePass(PassID, IdentifyingPassPtr());
223   }
224 
225   /// Return the pass substituted for StandardID by the target.
226   /// If no substitution exists, return StandardID.
227   IdentifyingPassPtr getPassSubstitution(AnalysisID StandardID) const;
228 
229   /// Return true if the pass has been substituted by the target or
230   /// overridden on the command line.
231   bool isPassSubstitutedOrOverridden(AnalysisID ID) const;
232 
233   /// Return true if the optimized regalloc pipeline is enabled.
234   bool getOptimizeRegAlloc() const;
235 
236   /// Return true if the default global register allocator is in use and
237   /// has not be overriden on the command line with '-regalloc=...'
238   bool usingDefaultRegAlloc() const;
239 
240   /// High level function that adds all passes necessary to go from llvm IR
241   /// representation to the MI representation.
242   /// Adds IR based lowering and target specific optimization passes and finally
243   /// the core instruction selection passes.
244   /// \returns true if an error occurred, false otherwise.
245   bool addISelPasses();
246 
247   /// Add common target configurable passes that perform LLVM IR to IR
248   /// transforms following machine independent optimization.
249   virtual void addIRPasses();
250 
251   /// Add passes to lower exception handling for the code generator.
252   void addPassesToHandleExceptions();
253 
254   /// Add pass to prepare the LLVM IR for code generation. This should be done
255   /// before exception handling preparation passes.
256   virtual void addCodeGenPrepare();
257 
258   /// Add common passes that perform LLVM IR to IR transforms in preparation for
259   /// instruction selection.
260   virtual void addISelPrepare();
261 
262   /// addInstSelector - This method should install an instruction selector pass,
263   /// which converts from LLVM code to machine instructions.
264   virtual bool addInstSelector() {
265     return true;
266   }
267 
268   /// This method should install an IR translator pass, which converts from
269   /// LLVM code to machine instructions with possibly generic opcodes.
270   virtual bool addIRTranslator() { return true; }
271 
272   /// This method may be implemented by targets that want to run passes
273   /// immediately before legalization.
274   virtual void addPreLegalizeMachineIR() {}
275 
276   /// This method should install a legalize pass, which converts the instruction
277   /// sequence into one that can be selected by the target.
278   virtual bool addLegalizeMachineIR() { return true; }
279 
280   /// This method may be implemented by targets that want to run passes
281   /// immediately before the register bank selection.
282   virtual void addPreRegBankSelect() {}
283 
284   /// This method should install a register bank selector pass, which
285   /// assigns register banks to virtual registers without a register
286   /// class or register banks.
287   virtual bool addRegBankSelect() { return true; }
288 
289   /// This method may be implemented by targets that want to run passes
290   /// immediately before the (global) instruction selection.
291   virtual void addPreGlobalInstructionSelect() {}
292 
293   /// This method should install a (global) instruction selector pass, which
294   /// converts possibly generic instructions to fully target-specific
295   /// instructions, thereby constraining all generic virtual registers to
296   /// register classes.
297   virtual bool addGlobalInstructionSelect() { return true; }
298 
299   /// Add the complete, standard set of LLVM CodeGen passes.
300   /// Fully developed targets will not generally override this.
301   virtual void addMachinePasses();
302 
303   /// Create an instance of ScheduleDAGInstrs to be run within the standard
304   /// MachineScheduler pass for this function and target at the current
305   /// optimization level.
306   ///
307   /// This can also be used to plug a new MachineSchedStrategy into an instance
308   /// of the standard ScheduleDAGMI:
309   ///   return new ScheduleDAGMI(C, std::make_unique<MyStrategy>(C), /*RemoveKillFlags=*/false)
310   ///
311   /// Return NULL to select the default (generic) machine scheduler.
312   virtual ScheduleDAGInstrs *
313   createMachineScheduler(MachineSchedContext *C) const {
314     return nullptr;
315   }
316 
317   /// Similar to createMachineScheduler but used when postRA machine scheduling
318   /// is enabled.
319   virtual ScheduleDAGInstrs *
320   createPostMachineScheduler(MachineSchedContext *C) const {
321     return nullptr;
322   }
323 
324   /// printAndVerify - Add a pass to dump then verify the machine function, if
325   /// those steps are enabled.
326   void printAndVerify(const std::string &Banner);
327 
328   /// Add a pass to print the machine function if printing is enabled.
329   void addPrintPass(const std::string &Banner);
330 
331   /// Add a pass to perform basic verification of the machine function if
332   /// verification is enabled.
333   void addVerifyPass(const std::string &Banner);
334 
335   /// Add a pass to add synthesized debug info to the MIR.
336   void addDebugifyPass();
337 
338   /// Add a pass to remove debug info from the MIR.
339   void addStripDebugPass();
340 
341   /// Add a pass to check synthesized debug info for MIR.
342   void addCheckDebugPass();
343 
344   /// Add standard passes before a pass that's about to be added. For example,
345   /// the DebugifyMachineModulePass if it is enabled.
346   void addMachinePrePasses(bool AllowDebugify = true);
347 
348   /// Add standard passes after a pass that has just been added. For example,
349   /// the MachineVerifier if it is enabled.
350   void addMachinePostPasses(const std::string &Banner);
351 
352   /// Check whether or not GlobalISel should abort on error.
353   /// When this is disabled, GlobalISel will fall back on SDISel instead of
354   /// erroring out.
355   bool isGlobalISelAbortEnabled() const;
356 
357   /// Check whether or not a diagnostic should be emitted when GlobalISel
358   /// uses the fallback path. In other words, it will emit a diagnostic
359   /// when GlobalISel failed and isGlobalISelAbortEnabled is false.
360   virtual bool reportDiagnosticWhenGlobalISelFallback() const;
361 
362   /// Check whether continuous CSE should be enabled in GISel passes.
363   /// By default, it's enabled for non O0 levels.
364   virtual bool isGISelCSEEnabled() const;
365 
366   /// Returns the CSEConfig object to use for the current optimization level.
367   virtual std::unique_ptr<CSEConfigBase> getCSEConfig() const;
368 
369 protected:
370   // Helper to verify the analysis is really immutable.
371   void setOpt(bool &Opt, bool Val);
372 
373   /// Return true if register allocator is specified by -regalloc=override.
374   bool isCustomizedRegAlloc();
375 
376   /// Methods with trivial inline returns are convenient points in the common
377   /// codegen pass pipeline where targets may insert passes. Methods with
378   /// out-of-line standard implementations are major CodeGen stages called by
379   /// addMachinePasses. Some targets may override major stages when inserting
380   /// passes is insufficient, but maintaining overriden stages is more work.
381   ///
382 
383   /// addPreISelPasses - This method should add any "last minute" LLVM->LLVM
384   /// passes (which are run just before instruction selector).
385   virtual bool addPreISel() {
386     return true;
387   }
388 
389   /// addMachineSSAOptimization - Add standard passes that optimize machine
390   /// instructions in SSA form.
391   virtual void addMachineSSAOptimization();
392 
393   /// Add passes that optimize instruction level parallelism for out-of-order
394   /// targets. These passes are run while the machine code is still in SSA
395   /// form, so they can use MachineTraceMetrics to control their heuristics.
396   ///
397   /// All passes added here should preserve the MachineDominatorTree,
398   /// MachineLoopInfo, and MachineTraceMetrics analyses.
399   virtual bool addILPOpts() {
400     return false;
401   }
402 
403   /// This method may be implemented by targets that want to run passes
404   /// immediately before register allocation.
405   virtual void addPreRegAlloc() { }
406 
407   /// createTargetRegisterAllocator - Create the register allocator pass for
408   /// this target at the current optimization level.
409   virtual FunctionPass *createTargetRegisterAllocator(bool Optimized);
410 
411   /// addFastRegAlloc - Add the minimum set of target-independent passes that
412   /// are required for fast register allocation.
413   virtual void addFastRegAlloc();
414 
415   /// addOptimizedRegAlloc - Add passes related to register allocation.
416   /// CodeGenTargetMachineImpl provides standard regalloc passes for most
417   /// targets.
418   virtual void addOptimizedRegAlloc();
419 
420   /// addPreRewrite - Add passes to the optimized register allocation pipeline
421   /// after register allocation is complete, but before virtual registers are
422   /// rewritten to physical registers.
423   ///
424   /// These passes must preserve VirtRegMap and LiveIntervals, and when running
425   /// after RABasic or RAGreedy, they should take advantage of LiveRegMatrix.
426   /// When these passes run, VirtRegMap contains legal physreg assignments for
427   /// all virtual registers.
428   ///
429   /// Note if the target overloads addRegAssignAndRewriteOptimized, this may not
430   /// be honored. This is also not generally used for the fast variant,
431   /// where the allocation and rewriting are done in one pass.
432   virtual bool addPreRewrite() {
433     return false;
434   }
435 
436   /// addPostFastRegAllocRewrite - Add passes to the optimized register
437   /// allocation pipeline after fast register allocation is complete.
438   virtual bool addPostFastRegAllocRewrite() { return false; }
439 
440   /// Add passes to be run immediately after virtual registers are rewritten
441   /// to physical registers.
442   virtual void addPostRewrite() { }
443 
444   /// This method may be implemented by targets that want to run passes after
445   /// register allocation pass pipeline but before prolog-epilog insertion.
446   virtual void addPostRegAlloc() { }
447 
448   /// Add passes that optimize machine instructions after register allocation.
449   virtual void addMachineLateOptimization();
450 
451   /// This method may be implemented by targets that want to run passes after
452   /// prolog-epilog insertion and before the second instruction scheduling pass.
453   virtual void addPreSched2() { }
454 
455   /// addGCPasses - Add late codegen passes that analyze code for garbage
456   /// collection. This should return true if GC info should be printed after
457   /// these passes.
458   virtual bool addGCPasses();
459 
460   /// Add standard basic block placement passes.
461   virtual void addBlockPlacement();
462 
463   /// This pass may be implemented by targets that want to run passes
464   /// immediately before machine code is emitted.
465   virtual void addPreEmitPass() { }
466 
467   /// This pass may be implemented by targets that want to run passes
468   /// immediately after basic block sections are assigned.
469   virtual void addPostBBSections() {}
470 
471   /// Targets may add passes immediately before machine code is emitted in this
472   /// callback. This is called even later than `addPreEmitPass`.
473   // FIXME: Rename `addPreEmitPass` to something more sensible given its actual
474   // position and remove the `2` suffix here as this callback is what
475   // `addPreEmitPass` *should* be but in reality isn't.
476   virtual void addPreEmitPass2() {}
477 
478   /// Utilities for targets to add passes to the pass manager.
479   ///
480 
481   /// Add a CodeGen pass at this point in the pipeline after checking overrides.
482   /// Return the pass that was added, or zero if no pass was added.
483   AnalysisID addPass(AnalysisID PassID);
484 
485   /// Add a pass to the PassManager if that pass is supposed to be run, as
486   /// determined by the StartAfter and StopAfter options. Takes ownership of the
487   /// pass.
488   void addPass(Pass *P);
489 
490   /// addMachinePasses helper to create the target-selected or overriden
491   /// regalloc pass.
492   virtual FunctionPass *createRegAllocPass(bool Optimized);
493 
494   /// Add core register allocator passes which do the actual register assignment
495   /// and rewriting. \returns true if any passes were added.
496   virtual bool addRegAssignAndRewriteFast();
497   virtual bool addRegAssignAndRewriteOptimized();
498 };
499 
500 void registerCodeGenCallback(PassInstrumentationCallbacks &PIC,
501                              TargetMachine &);
502 
503 } // end namespace llvm
504 
505 #endif // LLVM_CODEGEN_TARGETPASSCONFIG_H
506