Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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