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