My Project
PassManager.h
Go to the documentation of this file.
1 //===- PassManager.h - Pass Management Interface ----------------*- C++ -*-===//
2 //
3 // Part of the MLIR 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 
9 #ifndef MLIR_PASS_PASSMANAGER_H
10 #define MLIR_PASS_PASSMANAGER_H
11 
13 #include "llvm/ADT/Optional.h"
14 #include "llvm/ADT/SmallVector.h"
15 #include "llvm/ADT/iterator.h"
16 
17 #include <vector>
18 
19 namespace llvm {
20 class Any;
21 } // end namespace llvm
22 
23 namespace mlir {
24 class AnalysisManager;
25 class MLIRContext;
26 class ModuleOp;
27 class OperationName;
28 class Operation;
29 class Pass;
30 class PassInstrumentation;
31 class PassInstrumentor;
32 
33 namespace detail {
34 struct OpPassManagerImpl;
35 } // end namespace detail
36 
37 //===----------------------------------------------------------------------===//
38 // OpPassManager
39 //===----------------------------------------------------------------------===//
40 
45 public:
47  OpPassManager(const OpPassManager &rhs);
48  ~OpPassManager();
49  OpPassManager &operator=(const OpPassManager &rhs);
50 
52  using pass_iterator =
53  llvm::pointee_iterator<std::vector<std::unique_ptr<Pass>>::iterator>;
54  pass_iterator begin();
55  pass_iterator end();
56  iterator_range<pass_iterator> getPasses() { return {begin(), end()}; }
57 
60 
63  OpPassManager &nest(const OperationName &nestedName);
64  OpPassManager &nest(StringRef nestedName);
65  template <typename OpT> OpPassManager &nest() {
66  return nest(OpT::getOperationName());
67  }
68 
71  void addPass(std::unique_ptr<Pass> pass);
72 
75  template <typename OpT> void addNestedPass(std::unique_ptr<Pass> pass) {
76  nest<OpT>().addPass(std::move(pass));
77  }
78 
80  size_t size() const;
81 
83  MLIRContext *getContext() const;
84 
86  const OperationName &getOpName() const;
87 
89  detail::OpPassManagerImpl &getImpl();
90 
95  void printAsTextualPipeline(raw_ostream &os);
96 
98  void mergeStatisticsInto(OpPassManager &other);
99 
100 private:
101  OpPassManager(OperationName name, bool disableThreads, bool verifyPasses);
102 
104  std::unique_ptr<detail::OpPassManagerImpl> impl;
105 
107  friend class PassManager;
108 };
109 
110 //===----------------------------------------------------------------------===//
111 // PassManager
112 //===----------------------------------------------------------------------===//
113 
116 enum class PassDisplayMode {
117  // In this mode the results are displayed in a list sorted by total,
118  // with each pass/analysis instance aggregated into one unique result.
119  List,
120 
121  // In this mode the results are displayed in a nested pipeline view that
122  // mirrors the internal pass pipeline that is being executed in the pass
123  // manager.
124  Pipeline,
125 };
126 
128 class PassManager : public OpPassManager {
129 public:
130  // If verifyPasses is true, the verifier is run after each pass.
131  PassManager(MLIRContext *ctx, bool verifyPasses = true);
132  ~PassManager();
133 
135  LLVM_NODISCARD
136  LogicalResult run(ModuleOp module);
137 
139  void disableMultithreading(bool disable = true);
140 
144  void enableCrashReproducerGeneration(StringRef outputFile);
145 
146  //===--------------------------------------------------------------------===//
147  // Instrumentations
148  //===--------------------------------------------------------------------===//
149 
151  void addInstrumentation(std::unique_ptr<PassInstrumentation> pi);
152 
153  //===--------------------------------------------------------------------===//
154  // IR Printing
155 
158  public:
160 
170  explicit IRPrinterConfig(bool printModuleScope = false,
171  bool printAfterOnlyOnChange = false);
172  virtual ~IRPrinterConfig();
173 
178  virtual void printBeforeIfEnabled(Pass *pass, Operation *operation,
179  PrintCallbackFn printCallback);
180 
185  virtual void printAfterIfEnabled(Pass *pass, Operation *operation,
186  PrintCallbackFn printCallback);
187 
189  bool shouldPrintAtModuleScope() const { return printModuleScope; }
190 
193  bool shouldPrintAfterOnlyOnChange() const { return printAfterOnlyOnChange; }
194 
195  private:
197  bool printModuleScope;
198 
201  bool printAfterOnlyOnChange;
202  };
203 
206  void enableIRPrinting(std::unique_ptr<IRPrinterConfig> config);
207 
219  void enableIRPrinting(
220  std::function<bool(Pass *, Operation *)> shouldPrintBeforePass,
221  std::function<bool(Pass *, Operation *)> shouldPrintAfterPass,
222  bool printModuleScope, bool printAfterOnlyOnChange, raw_ostream &out);
223 
224  //===--------------------------------------------------------------------===//
225  // Pass Timing
226 
232  void enableTiming(PassDisplayMode displayMode = PassDisplayMode::Pipeline);
233 
236  void
237  enableStatistics(PassDisplayMode displayMode = PassDisplayMode::Pipeline);
238 
239 private:
241  void dumpStatistics();
242 
244  bool passTiming : 1;
245 
247  Optional<PassDisplayMode> passStatisticsMode;
248 
250  std::unique_ptr<PassInstrumentor> instrumentor;
251 
253  Optional<std::string> crashReproducerFileName;
254 };
255 
260 
264 } // end namespace mlir
265 
266 #endif // MLIR_PASS_PASSMANAGER_H
OpPassManager & nest()
Definition: PassManager.h:65
Definition: InferTypeOpInterface.cpp:20
Definition: PassRegistry.cpp:413
Definition: Operation.h:27
Definition: Pass.cpp:114
The main pass manager and pipeline builder.
Definition: PassManager.h:128
Definition: LLVM.h:49
Definition: AnalysisManager.h:217
Definition: QuantTypes.h:36
iterator_range< pass_iterator > getPasses()
Definition: PassManager.h:56
Definition: LLVM.h:40
PassDisplayMode
Definition: PassManager.h:116
void addNestedPass(std::unique_ptr< Pass > pass)
Definition: PassManager.h:75
Definition: LogicalResult.h:18
llvm::pointee_iterator< std::vector< std::unique_ptr< Pass > >::iterator > pass_iterator
Iterator over the passes in this pass manager.
Definition: PassManager.h:53
Definition: Module.h:29
bool shouldPrintAfterOnlyOnChange() const
Definition: PassManager.h:193
Definition: LLVM.h:50
void registerPassManagerCLOptions()
Definition: PassManagerOptions.cpp:147
Definition: Pass.h:41
Definition: MLIRContext.h:34
A configuration struct provided to the IR printer instrumentation.
Definition: PassManager.h:157
void applyPassManagerCLOptions(PassManager &pm)
Definition: PassManagerOptions.cpp:153
Definition: OperationSupport.h:203
bool shouldPrintAtModuleScope() const
Returns true if the IR should always be printed at the top-level scope.
Definition: PassManager.h:189
Definition: PassManager.h:44