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