My Project
Pass.h
Go to the documentation of this file.
1 //===- Pass.h - Base classes for compiler passes ----------------*- 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_PASS_H
10 #define MLIR_PASS_PASS_H
11 
12 #include "mlir/IR/Function.h"
14 #include "mlir/Pass/PassRegistry.h"
16 #include "llvm/ADT/PointerIntPair.h"
17 #include "llvm/ADT/Statistic.h"
18 
19 namespace mlir {
20 namespace detail {
25  : irAndPassFailed(ir, false), analysisManager(analysisManager) {}
26 
29  llvm::PointerIntPair<Operation *, 1, bool> irAndPassFailed;
30 
33 
36 };
37 } // namespace detail
38 
41 class Pass {
42 public:
43  virtual ~Pass() = default;
44 
46  const PassID *getPassID() const { return passID; }
47 
49  static const PassInfo *lookupPassInfo(const PassID *passID);
50  template <typename PassT> static const PassInfo *lookupPassInfo() {
51  return lookupPassInfo(PassID::getID<PassT>());
52  }
53 
55  const PassInfo *lookupPassInfo() const { return lookupPassInfo(getPassID()); }
56 
58  virtual StringRef getName() = 0;
59 
62  Optional<StringRef> getOpName() const { return opName; }
63 
64  //===--------------------------------------------------------------------===//
65  // Options
66  //===--------------------------------------------------------------------===//
67 
69  template <typename DataType>
70  struct Option : public detail::PassOptions::Option<DataType> {
71  template <typename... Args>
72  Option(Pass &parent, StringRef arg, Args &&... args)
73  : detail::PassOptions::Option<DataType>(parent.passOptions, arg,
74  std::forward<Args>(args)...) {}
76  };
79  template <typename DataType>
80  struct ListOption : public detail::PassOptions::ListOption<DataType> {
81  template <typename... Args>
82  ListOption(Pass &parent, StringRef arg, Args &&... args)
83  : detail::PassOptions::ListOption<DataType>(
84  parent.passOptions, arg, std::forward<Args>(args)...) {}
86  };
87 
89  LogicalResult initializeOptions(StringRef options);
90 
93  void printAsTextualPipeline(raw_ostream &os);
94 
95  //===--------------------------------------------------------------------===//
96  // Statistics
97  //===--------------------------------------------------------------------===//
98 
103  class Statistic : public llvm::Statistic {
104  public:
107  Statistic(Pass *owner, const char *name, const char *description);
108 
110  Statistic &operator=(unsigned value);
111 
112  private:
114  using llvm::Statistic::getDebugType;
115  };
116 
118  ArrayRef<Statistic *> getStatistics() const { return statistics; }
120 
121 protected:
122  explicit Pass(const PassID *passID, Optional<StringRef> opName = llvm::None)
123  : passID(passID), opName(opName) {}
124 
127  assert(passState && "pass state was never initialized");
128  return *passState;
129  }
130 
132  MLIRContext &getContext() { return *getOperation()->getContext(); }
133 
135  virtual void runOnOperation() = 0;
136 
138  virtual std::unique_ptr<Pass> clone() const = 0;
139 
142  return getPassState().irAndPassFailed.getPointer();
143  }
144 
147  return getPassState().analysisManager;
148  }
149 
152  void copyOptionValuesFrom(const Pass *other);
153 
154 private:
156  LLVM_NODISCARD
158 
161  virtual void anchor();
162 
164  const PassID *passID;
165 
168  Optional<StringRef> opName;
169 
172 
174  std::vector<Statistic *> statistics;
175 
177  detail::PassOptions passOptions;
178 
180  friend class OpPassManager;
181 };
182 
183 //===----------------------------------------------------------------------===//
184 // Pass Model Definitions
185 //===----------------------------------------------------------------------===//
186 namespace detail {
189 template <typename PassT, typename BasePassT>
190 class PassModel : public BasePassT {
191 public:
193  static bool classof(const Pass *pass) {
194  return pass->getPassID() == PassID::getID<PassT>();
195  }
196 
197 protected:
199  : BasePassT(PassID::getID<PassT>(), opName) {}
200 
204  this->getPassState().irAndPassFailed.setInt(true);
205  }
206 
208  template <typename AnalysisT> AnalysisT &getAnalysis() {
209  return this->getAnalysisManager().template getAnalysis<AnalysisT>();
210  }
211 
214  template <typename AnalysisT>
216  return this->getAnalysisManager().template getCachedAnalysis<AnalysisT>();
217  }
218 
221  this->getPassState().preservedAnalyses.preserveAll();
222  }
223 
225  template <typename... AnalysesT> void markAnalysesPreserved() {
226  this->getPassState().preservedAnalyses.template preserve<AnalysesT...>();
227  }
229  this->getPassState().preservedAnalyses.preserve(id);
230  }
231 
233  StringRef getName() override {
234  StringRef name = llvm::getTypeName<PassT>();
235  if (!name.consume_front("mlir::"))
236  name.consume_front("(anonymous namespace)::");
237  return name;
238  }
239 
241  std::unique_ptr<Pass> clone() const override {
242  auto newInst = std::make_unique<PassT>(*static_cast<const PassT *>(this));
243  newInst->copyOptionValuesFrom(this);
244  return newInst;
245  }
246 
248  template <typename AnalysisT>
251  return this->getAnalysisManager()
252  .template getCachedParentAnalysis<AnalysisT>(parent);
253  }
254  template <typename AnalysisT>
256  return this->getAnalysisManager()
257  .template getCachedParentAnalysis<AnalysisT>(
258  this->getOperation()->getParentOp());
259  }
260 
262  template <typename AnalysisT>
265  return this->getAnalysisManager()
266  .template getCachedChildAnalysis<AnalysisT>(child);
267  }
268 
271  template <typename AnalysisT> AnalysisT &getChildAnalysis(Operation *child) {
272  return this->getAnalysisManager().template getChildAnalysis<AnalysisT>(
273  child);
274  }
275 };
276 } // end namespace detail
277 
280 template <typename OpT> class OpPassBase : public Pass {
281 public:
282  using Pass::Pass;
283 
285  static bool classof(const Pass *pass) {
286  return pass->getOpName() == OpT::getOperationName();
287  }
288 };
289 
300 template <typename PassT, typename OpT = void>
301 class OperationPass : public detail::PassModel<PassT, OpPassBase<OpT>> {
302 protected:
304  : detail::PassModel<PassT, OpPassBase<OpT>>(OpT::getOperationName()) {}
305 
307  OpT getOperation() { return cast<OpT>(Pass::getOperation()); }
308 };
309 
320 template <typename PassT>
321 struct OperationPass<PassT, void> : public detail::PassModel<PassT, Pass> {};
322 
327 template <typename T> struct FunctionPass : public OperationPass<T, FuncOp> {
329  virtual void runOnFunction() = 0;
330 
332  void runOnOperation() final {
333  if (!getFunction().isExternal())
334  runOnFunction();
335  }
336 
338  FuncOp getFunction() { return this->getOperation(); }
339 };
340 
345 template <typename T> struct ModulePass : public OperationPass<T, ModuleOp> {
347  virtual void runOnModule() = 0;
348 
350  void runOnOperation() final { runOnModule(); }
351 
353  ModuleOp getModule() { return this->getOperation(); }
354 };
355 } // end namespace mlir
356 
357 #endif // MLIR_PASS_PASS_H
Definition: Pass.h:80
Definition: InferTypeOpInterface.cpp:20
void markAnalysesPreserved(const AnalysisID *id)
Definition: Pass.h:228
Definition: STLExtras.h:95
Definition: Operation.h:27
Optional< std::reference_wrapper< AnalysisT > > getCachedParentAnalysis()
Definition: Pass.h:255
FuncOp getFunction()
Return the current module being transformed.
Definition: Pass.h:338
Definition: PassOptions.h:141
PassExecutionState(Operation *ir, AnalysisManager analysisManager)
Definition: Pass.h:24
Pass(const PassID *passID, Optional< StringRef > opName=llvm::None)
Definition: Pass.h:122
StringRef getName() override
Returns the derived pass name.
Definition: Pass.h:233
Definition: AnalysisManager.h:217
This class represents a specific pass option, with a provided data type.
Definition: Pass.h:70
Definition: LLVM.h:40
Optional< std::reference_wrapper< AnalysisT > > getCachedParentAnalysis(Operation *parent)
Returns the analysis for the parent operation if it exists.
Definition: Pass.h:250
llvm::PointerIntPair< Operation *, 1, bool > irAndPassFailed
Definition: Pass.h:29
void runOnOperation() final
The polymorphic API that runs the pass over the currently held operation.
Definition: Pass.h:350
MLIRContext & getContext()
Return the MLIR context for the current function being transformed.
Definition: Pass.h:132
Definition: Pass.h:345
PassModel(Optional< StringRef > opName=llvm::None)
Definition: Pass.h:198
void signalPassFailure()
Definition: Pass.h:203
Definition: Pass.h:301
Definition: LogicalResult.h:18
Definition: LLVM.h:37
void markAllAnalysesPreserved()
Mark all analyses as preserved.
Definition: Pass.h:220
Definition: Function.h:32
AnalysisT & getChildAnalysis(Operation *child)
Definition: Pass.h:271
Definition: LLVM.h:38
AnalysisManager analysisManager
The analysis manager for the operation.
Definition: Pass.h:32
OperationPass()
Definition: Pass.h:303
Optional< StringRef > getOpName() const
Definition: Pass.h:62
A utility class to represent the analyses that are known to be preserved.
Definition: AnalysisManager.h:30
This class represents a specific pass option, with a provided data type.
Definition: PassOptions.h:105
Definition: Module.h:29
OpT getOperation()
Return the current operation being transformed.
Definition: Pass.h:307
detail::PreservedAnalyses preservedAnalyses
The set of preserved analyses for the current execution.
Definition: Pass.h:35
const PassID * getPassID() const
Returns the unique identifier that corresponds to this pass.
Definition: Pass.h:46
static bool classof(const Pass *pass)
Support isa/dyn_cast functionality for the derived pass class.
Definition: Pass.h:193
Definition: Pass.h:327
static bool classof(const Pass *pass)
Support isa/dyn_cast functionality.
Definition: Pass.h:285
Base container class and manager for all pass options.
Definition: PassOptions.h:28
void markAnalysesPreserved()
Mark the provided analyses as preserved.
Definition: Pass.h:225
AnalysisManager getAnalysisManager()
Returns the current analysis manager.
Definition: Pass.h:146
Definition: Passes.h:23
ListOption(Pass &parent, StringRef arg, Args &&... args)
Definition: Pass.h:82
Operation * getOperation()
Return the current operation being transformed.
Definition: Pass.h:141
A structure to represent the information for a derived pass class.
Definition: PassRegistry.h:83
MutableArrayRef< Statistic * > getStatistics()
Definition: Pass.h:119
Definition: Pass.h:41
Definition: MLIRContext.h:34
Option(Pass &parent, StringRef arg, Args &&... args)
Definition: Pass.h:72
detail::PassExecutionState & getPassState()
Returns the current pass state.
Definition: Pass.h:126
Definition: StandardTypes.h:63
Optional< std::reference_wrapper< AnalysisT > > getCachedAnalysis()
Definition: Pass.h:215
std::unique_ptr< Pass > clone() const override
A clone method to create a copy of this pass.
Definition: Pass.h:241
const PassInfo * lookupPassInfo() const
Returns the pass info for this pass.
Definition: Pass.h:55
Optional< std::reference_wrapper< AnalysisT > > getCachedChildAnalysis(Operation *child)
Returns the analysis for the given child operation if it exists.
Definition: Pass.h:264
ArrayRef< Statistic * > getStatistics() const
Returns the main statistics for this pass instance.
Definition: Pass.h:118
AnalysisT & getAnalysis()
Query an analysis for the current ir unit.
Definition: Pass.h:208
void runOnOperation() final
The polymorphic API that runs the pass over the currently held operation.
Definition: Pass.h:332
static const PassInfo * lookupPassInfo()
Definition: Pass.h:50
Definition: PassManager.h:44
Definition: Pass.h:190
Definition: Pass.h:103
ModuleOp getModule()
Return the current module being transformed.
Definition: Pass.h:353