MLIR  22.0.0git
Passes.h
Go to the documentation of this file.
1 //===- Passes.h - Sparse tensor pass entry points ---------------*- 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 of all sparse tensor passes.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_DIALECT_SPARSETENSOR_TRANSFORMS_PASSES_H_
14 #define MLIR_DIALECT_SPARSETENSOR_TRANSFORMS_PASSES_H_
15 
17 #include "mlir/IR/PatternMatch.h"
18 #include "mlir/Pass/Pass.h"
20 
21 //===----------------------------------------------------------------------===//
22 // Include the generated pass header (which needs some early definitions).
23 //===----------------------------------------------------------------------===//
24 
25 namespace mlir {
26 
27 namespace bufferization {
28 struct OneShotBufferizationOptions;
29 } // namespace bufferization
30 
31 /// Defines a parallelization strategy. Any independent loop is a candidate
32 /// for parallelization. The loop is made parallel if (1) allowed by the
33 /// strategy (e.g., AnyStorageOuterLoop considers either a dense or sparse
34 /// outermost loop only), and (2) the generated code is an actual for-loop
35 /// (and not a co-iterating while-loop).
37  kNone,
42 };
43 
44 /// Defines a scope for reinterpret map pass.
45 enum class ReinterpretMapScope {
46  kAll, // reinterprets all applicable operations
47  kGenericOnly, // reinterprets only linalg.generic
48  kExceptGeneric, // reinterprets operation other than linalg.generic
49 };
50 
51 /// Defines a scope for reinterpret map pass.
52 enum class SparseEmitStrategy {
53  kFunctional, // generate fully inlined (and functional) sparse iteration
54  kSparseIterator, // generate (experimental) loop using sparse iterator.
55  kDebugInterface, // generate only place-holder for sparse iteration
56 };
57 
58 namespace sparse_tensor {
59 
60 /// Defines a strategy for loop ordering during sparse code generation.
61 enum class LoopOrderingStrategy : unsigned {
62  kDefault, ///< Default strategy (eagerly selects last loop in topological
63  ///< sort).
64 };
65 
66 } // namespace sparse_tensor
67 
68 #define GEN_PASS_DECL
69 #include "mlir/Dialect/SparseTensor/Transforms/Passes.h.inc"
70 
71 //===----------------------------------------------------------------------===//
72 // The SparseAssembler pass.
73 //===----------------------------------------------------------------------===//
74 
75 void populateSparseAssembler(RewritePatternSet &patterns, bool directOut);
76 
77 std::unique_ptr<Pass> createSparseAssembler();
78 std::unique_ptr<Pass> createSparseAssembler(bool directOut);
79 
80 //===----------------------------------------------------------------------===//
81 // The SparseReinterpretMap pass.
82 //===----------------------------------------------------------------------===//
83 
88 
89 std::unique_ptr<Pass> createSparseReinterpretMapPass();
90 std::unique_ptr<Pass> createSparseReinterpretMapPass(ReinterpretMapScope scope);
91 std::unique_ptr<Pass>
94 
95 //===----------------------------------------------------------------------===//
96 // The PreSparsificationRewriting pass.
97 //===----------------------------------------------------------------------===//
98 
100 
101 std::unique_ptr<Pass> createPreSparsificationRewritePass();
102 
103 //===----------------------------------------------------------------------===//
104 // The Sparsification pass.
105 //===----------------------------------------------------------------------===//
106 
107 /// Options for the Sparsification pass.
110  bool enableRT)
112  enableRuntimeLibrary(enableRT) {}
113 
116 
120 
124 };
125 
126 /// Sets up sparsification rewriting rules with the given options.
130 
131 std::unique_ptr<Pass> createSparsificationPass();
132 std::unique_ptr<Pass>
134 
135 //===----------------------------------------------------------------------===//
136 // The StageSparseOperations pass.
137 //===----------------------------------------------------------------------===//
138 
139 /// Sets up StageSparseOperation rewriting rules.
141 
142 std::unique_ptr<Pass> createStageSparseOperationsPass();
143 
144 //===----------------------------------------------------------------------===//
145 // The LowerSparseOpsToForeach pass.
146 //===----------------------------------------------------------------------===//
147 
149  bool enableRT, bool enableConvert);
150 
151 std::unique_ptr<Pass> createLowerSparseOpsToForeachPass();
152 std::unique_ptr<Pass> createLowerSparseOpsToForeachPass(bool enableRT,
153  bool enableConvert);
154 
155 //===----------------------------------------------------------------------===//
156 // The LowerForeachToSCF pass.
157 //===----------------------------------------------------------------------===//
158 
160 
161 std::unique_ptr<Pass> createLowerForeachToSCFPass();
162 
163 //===----------------------------------------------------------------------===//
164 // The LowerSparseIterationToSCF pass.
165 //===----------------------------------------------------------------------===//
166 
167 /// Type converter for iter_space and iterator.
170 };
171 
174 
175 std::unique_ptr<Pass> createLowerSparseIterationToSCFPass();
176 
177 //===----------------------------------------------------------------------===//
178 // The SparseTensorConversion pass.
179 //===----------------------------------------------------------------------===//
180 
181 /// Sparse tensor type converter into an opaque pointer.
183 public:
185 };
186 
187 /// Sets up sparse tensor conversion rules.
188 void populateSparseTensorConversionPatterns(const TypeConverter &typeConverter,
190 
191 std::unique_ptr<Pass> createSparseTensorConversionPass();
192 
193 //===----------------------------------------------------------------------===//
194 // The SparseTensorCodegen pass.
195 //===----------------------------------------------------------------------===//
196 
197 /// Sparse tensor type converter into an actual buffer.
199 public:
201 };
202 
203 /// Sets up sparse tensor codegen rules.
204 void populateSparseTensorCodegenPatterns(const TypeConverter &typeConverter,
206  bool createSparseDeallocs,
207  bool enableBufferInitialization);
208 
209 std::unique_ptr<Pass> createSparseTensorCodegenPass();
210 std::unique_ptr<Pass>
211 createSparseTensorCodegenPass(bool createSparseDeallocs,
212  bool enableBufferInitialization);
213 
214 //===----------------------------------------------------------------------===//
215 // The SparseBufferRewrite pass.
216 //===----------------------------------------------------------------------===//
217 
219  bool enableBufferInitialization);
220 
221 std::unique_ptr<Pass> createSparseBufferRewritePass();
222 std::unique_ptr<Pass>
223 createSparseBufferRewritePass(bool enableBufferInitialization);
224 
225 //===----------------------------------------------------------------------===//
226 // The SparseVectorization pass.
227 //===----------------------------------------------------------------------===//
228 
230  unsigned vectorLength,
231  bool enableVLAVectorization,
232  bool enableSIMDIndex32);
233 
234 std::unique_ptr<Pass> createSparseVectorizationPass();
235 std::unique_ptr<Pass> createSparseVectorizationPass(unsigned vectorLength,
236  bool enableVLAVectorization,
237  bool enableSIMDIndex32);
238 
239 //===----------------------------------------------------------------------===//
240 // The SparseGPU pass.
241 //===----------------------------------------------------------------------===//
242 
244  unsigned numThreads);
245 
247  bool enableRT);
248 
249 std::unique_ptr<Pass> createSparseGPUCodegenPass();
250 std::unique_ptr<Pass> createSparseGPUCodegenPass(unsigned numThreads,
251  bool enableRT);
252 
253 //===----------------------------------------------------------------------===//
254 // The SparseStorageSpecifierToLLVM pass.
255 //===----------------------------------------------------------------------===//
256 
258 public:
260 };
261 
264 std::unique_ptr<Pass> createStorageSpecifierToLLVMPass();
265 
266 //===----------------------------------------------------------------------===//
267 // The mini-pipeline for sparsification and bufferization.
268 //===----------------------------------------------------------------------===//
269 
272 
273 std::unique_ptr<Pass> createSparsificationAndBufferizationPass();
274 
275 std::unique_ptr<Pass> createSparsificationAndBufferizationPass(
276  const bufferization::OneShotBufferizationOptions &bufferizationOptions,
277  const SparsificationOptions &sparsificationOptions,
278  bool createSparseDeallocs, bool enableRuntimeLibrary,
279  bool enableBufferInitialization, unsigned vectorLength,
280  bool enableVLAVectorization, bool enableSIMDIndex32, bool enableGPULibgen,
281  SparseEmitStrategy emitStrategy,
282  SparseParallelizationStrategy parallelizationStrategy);
283 
284 //===----------------------------------------------------------------------===//
285 // Sparse Iteration Transform Passes
286 //===----------------------------------------------------------------------===//
287 
288 std::unique_ptr<Pass> createSparseSpaceCollapsePass();
289 
290 //===----------------------------------------------------------------------===//
291 // Registration.
292 //===----------------------------------------------------------------------===//
293 
294 /// Generate the code for registering passes.
295 #define GEN_PASS_REGISTRATION
296 #include "mlir/Dialect/SparseTensor/Transforms/Passes.h.inc"
297 
298 } // namespace mlir
299 
300 #endif // MLIR_DIALECT_SPARSETENSOR_TRANSFORMS_PASSES_H_
static llvm::ManagedStatic< PassManagerOptions > options
Sparse tensor type converter into an actual buffer.
Definition: Passes.h:198
Sparse tensor type converter into an opaque pointer.
Definition: Passes.h:182
Type conversion class.
LoopOrderingStrategy
Defines a strategy for loop ordering during sparse code generation.
Definition: Passes.h:61
@ kDefault
Default strategy (eagerly selects last loop in topological sort).
Include the generated interface declarations.
std::unique_ptr< Pass > createSparseVectorizationPass()
std::unique_ptr< Pass > createSparseAssembler()
void populateStorageSpecifierToLLVMPatterns(const TypeConverter &converter, RewritePatternSet &patterns)
std::unique_ptr< Pass > createLowerSparseOpsToForeachPass()
std::unique_ptr< Pass > createSparseTensorCodegenPass()
void populateSparseTensorCodegenPatterns(const TypeConverter &typeConverter, RewritePatternSet &patterns, bool createSparseDeallocs, bool enableBufferInitialization)
Sets up sparse tensor codegen rules.
std::unique_ptr< Pass > createSparseGPUCodegenPass()
std::unique_ptr< Pass > createSparseSpaceCollapsePass()
bufferization::OneShotBufferizationOptions getBufferizationOptionsForSparsification(bool analysisOnly)
std::unique_ptr< Pass > createSparseReinterpretMapPass()
void populateSparseGPULibgenPatterns(RewritePatternSet &patterns, bool enableRT)
std::unique_ptr< Pass > createSparseTensorConversionPass()
std::unique_ptr< Pass > createSparseBufferRewritePass()
std::unique_ptr< Pass > createSparsificationAndBufferizationPass()
void populateSparseTensorConversionPatterns(const TypeConverter &typeConverter, RewritePatternSet &patterns)
Sets up sparse tensor conversion rules.
void populateSparseBufferRewriting(RewritePatternSet &patterns, bool enableBufferInitialization)
void populatePreSparsificationRewriting(RewritePatternSet &patterns)
void populateSparseVectorizationPatterns(RewritePatternSet &patterns, unsigned vectorLength, bool enableVLAVectorization, bool enableSIMDIndex32)
Populates the given patterns list with vectorization rules.
SparseParallelizationStrategy
Defines a parallelization strategy.
Definition: Passes.h:36
ReinterpretMapScope
Defines a scope for reinterpret map pass.
Definition: Passes.h:45
void populateSparsificationPatterns(RewritePatternSet &patterns, const SparsificationOptions &options=SparsificationOptions())
Sets up sparsification rewriting rules with the given options.
const FrozenRewritePatternSet & patterns
void populateLowerSparseIterationToSCFPatterns(const TypeConverter &converter, RewritePatternSet &patterns)
SparseEmitStrategy
Defines a scope for reinterpret map pass.
Definition: Passes.h:52
void populateLowerSparseOpsToForeachPatterns(RewritePatternSet &patterns, bool enableRT, bool enableConvert)
std::unique_ptr< Pass > createStorageSpecifierToLLVMPass()
std::unique_ptr< Pass > createPreSparsificationRewritePass()
std::unique_ptr< Pass > createLowerForeachToSCFPass()
void populateSparseAssembler(RewritePatternSet &patterns, bool directOut)
void populateStageSparseOperationsPatterns(RewritePatternSet &patterns)
Sets up StageSparseOperation rewriting rules.
std::unique_ptr< Pass > createLowerSparseIterationToSCFPass()
void populateSparseGPUCodegenPatterns(RewritePatternSet &patterns, unsigned numThreads)
std::unique_ptr< Pass > createStageSparseOperationsPass()
std::unique_ptr< Pass > createSparsificationPass()
void populateSparseReinterpretMap(RewritePatternSet &patterns, ReinterpretMapScope scope, sparse_tensor::LoopOrderingStrategy strategy=sparse_tensor::LoopOrderingStrategy::kDefault)
void populateLowerForeachToSCFPatterns(RewritePatternSet &patterns)
Type converter for iter_space and iterator.
Definition: Passes.h:168
Options for the Sparsification pass.
Definition: Passes.h:108
SparseEmitStrategy sparseEmitStrategy
Definition: Passes.h:122
SparseParallelizationStrategy parallelizationStrategy
Definition: Passes.h:121
SparsificationOptions(SparseParallelizationStrategy p, SparseEmitStrategy d, bool enableRT)
Definition: Passes.h:109
SparsificationOptions(SparseParallelizationStrategy p, bool enableRT)
Definition: Passes.h:114
Options for analysis-enabled bufferization.