CIRCT  20.0.0git
Passes.h
Go to the documentation of this file.
1 //===- Passes.h - Pass Entrypoints ------------------------------*- 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 //
9 // This header file defines prototypes for CIRCT transformation passes.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef CIRCT_TRANSFORMS_PASSES_H
14 #define CIRCT_TRANSFORMS_PASSES_H
15 
17 #include "mlir/Dialect/Affine/IR/AffineOps.h"
18 #include "mlir/IR/BuiltinOps.h"
19 #include "mlir/Pass/Pass.h"
20 #include <limits>
21 
22 namespace circt {
23 
24 //===----------------------------------------------------------------------===//
25 // Passes
26 //===----------------------------------------------------------------------===//
27 
28 #define GEN_PASS_DECL
29 
31  // Specify the format for op count data emission
32  Readable,
34  JSON
35 };
36 
37 #include "circt/Transforms/Passes.h.inc"
38 
39 std::unique_ptr<mlir::Pass> createMapArithToCombPass();
40 std::unique_ptr<mlir::Pass> createFlattenMemRefPass();
41 std::unique_ptr<mlir::Pass> createFlattenMemRefCallsPass();
42 std::unique_ptr<mlir::Pass> createStripDebugInfoWithPredPass(
43  const std::function<bool(mlir::Location)> &pred);
44 std::unique_ptr<mlir::Pass> createMaximizeSSAPass();
45 std::unique_ptr<mlir::Pass> createInsertMergeBlocksPass();
46 std::unique_ptr<mlir::Pass> createPrintOpCountPass();
47 std::unique_ptr<mlir::Pass>
48 createMemoryBankingPass(std::optional<unsigned> bankingFactor = std::nullopt);
49 std::unique_ptr<mlir::Pass> createIndexSwitchToIfPass();
50 
51 //===----------------------------------------------------------------------===//
52 // Utility functions.
53 //===----------------------------------------------------------------------===//
54 
55 // Returns true if the provided memref is considered unidimensional (having a
56 // shape of size 1).
57 bool isUniDimensional(mlir::MemRefType memref);
58 
59 // Returns true if the region is into maximal SSA form i.e., if all the values
60 // within the region are in maximal SSA form.
61 bool isRegionSSAMaximized(Region &region);
62 
63 /// Strategy class to control the behavior of SSA maximization. The class
64 /// exposes overridable filter functions to dynamically select which blocks,
65 /// block arguments, operations, and operation results should be put into
66 /// maximal SSA form. All filter functions should return true whenever the
67 /// entity they operate on should be considered for SSA maximization. By
68 /// default, all filter functions always return true.
70 public:
71  /// Determines whether a block should have the values it defines (i.e., block
72  /// arguments and operation results within the block) SSA maximized.
73  virtual bool maximizeBlock(Block *block);
74  /// Determines whether a block argument should be SSA maximized.
75  virtual bool maximizeArgument(BlockArgument arg);
76  /// Determines whether an operation should have its results SSA maximized.
77  virtual bool maximizeOp(Operation *op);
78  /// Determines whether an operation's result should be SSA maximized.
79  virtual bool maximizeResult(OpResult res);
80 
81  virtual ~SSAMaximizationStrategy() = default;
82 };
83 
84 /// Converts a single value within a function into maximal SSA form. This
85 /// removes any implicit dataflow of this specific value within the enclosing
86 /// function. The function adds new block arguments wherever necessary to carry
87 /// the value explicitly between blocks.
88 /// Succeeds when it was possible to convert the value into maximal SSA form.
89 LogicalResult maximizeSSA(Value value, PatternRewriter &rewriter);
90 
91 /// Considers all of an operation's results for SSA maximization, following a
92 /// provided strategy. This removes any implicit dataflow of the selected
93 /// operation's results within the enclosing function. The function adds new
94 /// block arguments wherever necessary to carry the results explicitly between
95 /// blocks. Succeeds when it was possible to convert the selected operation's
96 /// results into maximal SSA form.
97 LogicalResult maximizeSSA(Operation *op, SSAMaximizationStrategy &strategy,
98  PatternRewriter &rewriter);
99 
100 /// Considers all values defined by a block (i.e., block arguments and operation
101 /// results within the block) for SSA maximization, following a provided
102 /// strategy. This removes any implicit dataflow of the selected values within
103 /// the enclosing function. The function adds new block arguments wherever
104 /// necessary to carry the values explicitly between blocks. Succeeds when it
105 /// was possible to convert the selected values defined by the block into
106 /// maximal SSA form.
107 LogicalResult maximizeSSA(Block *block, SSAMaximizationStrategy &strategy,
108  PatternRewriter &rewriter);
109 
110 /// Considers all blocks within a region for SSA maximization, following a
111 /// provided strategy. This removes any implicit dataflow of the values defined
112 /// by selected blocks within the region. The function adds new block arguments
113 /// wherever necessary to carry the region's values explicitly between blocks.
114 /// Succeeds when it was possible to convert all of the values defined by
115 /// selected blocks into maximal SSA form.
116 LogicalResult maximizeSSA(Region &region, SSAMaximizationStrategy &strategy,
117  PatternRewriter &rewriter);
118 
119 /// Manually run merge block insertion on a region.
120 ///
121 /// This transformation does treat loops like a single block and thus does not
122 /// affect them.
123 LogicalResult insertMergeBlocks(mlir::Region &r,
124  mlir::ConversionPatternRewriter &rewriter);
125 
126 //===----------------------------------------------------------------------===//
127 // Registration
128 //===----------------------------------------------------------------------===//
129 
130 /// Generate the code for registering passes.
131 #define GEN_PASS_REGISTRATION
132 #include "circt/Transforms/Passes.h.inc"
133 
134 } // namespace circt
135 
136 #endif // CIRCT_TRANSFORMS_PASSES_H
Strategy strategy
Strategy class to control the behavior of SSA maximization.
Definition: Passes.h:69
virtual bool maximizeResult(OpResult res)
Determines whether an operation's result should be SSA maximized.
Definition: MaximizeSSA.cpp:81
virtual ~SSAMaximizationStrategy()=default
virtual bool maximizeArgument(BlockArgument arg)
Determines whether a block argument should be SSA maximized.
Definition: MaximizeSSA.cpp:77
virtual bool maximizeBlock(Block *block)
Determines whether a block should have the values it defines (i.e., block arguments and operation res...
Definition: MaximizeSSA.cpp:74
virtual bool maximizeOp(Operation *op)
Determines whether an operation should have its results SSA maximized.
Definition: MaximizeSSA.cpp:80
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Definition: DebugAnalysis.h:21
std::unique_ptr< mlir::Pass > createMaximizeSSAPass()
std::unique_ptr< mlir::Pass > createPrintOpCountPass()
std::unique_ptr< mlir::Pass > createMemoryBankingPass(std::optional< unsigned > bankingFactor=std::nullopt)
std::unique_ptr< mlir::Pass > createInsertMergeBlocksPass()
std::unique_ptr< mlir::Pass > createIndexSwitchToIfPass()
std::unique_ptr< mlir::Pass > createMapArithToCombPass()
mlir::LogicalResult insertMergeBlocks(mlir::Region &r, mlir::ConversionPatternRewriter &rewriter)
Insert additional blocks that serve as counterparts to the blocks that diverged the control flow.
LogicalResult maximizeSSA(Value value, PatternRewriter &rewriter)
Converts a single value within a function into maximal SSA form.
Definition: MaximizeSSA.cpp:85
std::unique_ptr< mlir::Pass > createFlattenMemRefPass()
OpCountEmissionFormat
Definition: Passes.h:30
bool isUniDimensional(mlir::MemRefType memref)
bool isRegionSSAMaximized(Region &region)
Definition: MaximizeSSA.cpp:61
std::unique_ptr< mlir::Pass > createFlattenMemRefCallsPass()
std::unique_ptr< mlir::Pass > createStripDebugInfoWithPredPass(const std::function< bool(mlir::Location)> &pred)
Creates a pass to strip debug information from a function.