MLIR 24.0.0git
VectorTransformOps.cpp
Go to the documentation of this file.
1//===- VectorTransformOps.cpp - Implementation of Vector transform ops ----===//
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
10
23
24using namespace mlir;
25using namespace mlir::vector;
26using namespace mlir::transform;
27
28//===----------------------------------------------------------------------===//
29// Apply...ConversionPatternsOp
30//===----------------------------------------------------------------------===//
31
32void transform::ApplyVectorToLLVMConversionPatternsOp::populatePatterns(
33 TypeConverter &typeConverter, RewritePatternSet &patterns) {
35 static_cast<LLVMTypeConverter &>(typeConverter), patterns,
36 getReassociateFpReductions(), getForce_32bitVectorIndices(),
37 getUseVectorAlignment());
38}
39
40LogicalResult
41transform::ApplyVectorToLLVMConversionPatternsOp::verifyTypeConverter(
42 transform::TypeConverterBuilderOpInterface builder) {
43 if (builder.getTypeConverterType() != "LLVMTypeConverter")
44 return emitOpError("expected LLVMTypeConverter");
45 return success();
46}
47
48void transform::ApplyVectorLinearizeConversionPatternsOp::populatePatterns(
49 TypeConverter &typeConverter, RewritePatternSet &patterns) {
51 vector::populateVectorLinearizeBasePatterns(typeConverter, target, patterns);
52 if (getShuffleLikeOps())
53 vector::populateVectorLinearizeShuffleLikeOpsPatterns(typeConverter, target,
54 patterns);
55}
56
57void transform::ApplyVectorLinearizeConversionPatternsOp::
58 populateConversionTargetRules(const TypeConverter &typeConverter,
59 ConversionTarget &conversionTarget) {
60 // The legality rules need a mutable converter; they keep their own copy.
61 TypeConverter linearizer;
62 vector::populateForVectorLinearize(linearizer, conversionTarget);
63 if (std::optional<int64_t> bitwidth = getTargetVectorBitwidth())
64 vector::populateVectorLinearizeBitWidthTargetRules(conversionTarget,
65 *bitwidth);
66}
67
68LogicalResult
69transform::ApplyVectorLinearizeConversionPatternsOp::verifyTypeConverter(
70 transform::TypeConverterBuilderOpInterface builder) {
71 if (builder.getTypeConverterType() !=
72 VectorLinearizeTypeConverterOp::getTypeConverterType())
73 return emitOpError("expected VectorLinearizeTypeConverter");
74 return success();
75}
76
77std::unique_ptr<TypeConverter>
78transform::VectorLinearizeTypeConverterOp::getTypeConverter() {
79 auto typeConverter = std::make_unique<TypeConverter>();
81 vector::populateForVectorLinearize(*typeConverter, target);
82 return typeConverter;
83}
84
85StringRef transform::VectorLinearizeTypeConverterOp::getTypeConverterType() {
86 return "VectorLinearizeTypeConverter";
87}
88
89//===----------------------------------------------------------------------===//
90// Apply...PatternsOp
91//===----------------------------------------------------------------------===//
92
93void transform::ApplyCastAwayVectorLeadingOneDimPatternsOp::populatePatterns(
94 RewritePatternSet &patterns) {
95 vector::populateCastAwayVectorLeadingOneDimPatterns(patterns);
96}
97
98void transform::ApplyFoldArithExtensionPatternsOp::populatePatterns(
99 RewritePatternSet &patterns) {
101}
102
103void transform::ApplyFoldElementwiseToVectorPatternsOp::populatePatterns(
104 RewritePatternSet &patterns) {
106}
107
108void transform::ApplyVectorReductionToContractPatternsOp::populatePatterns(
109 RewritePatternSet &patterns) {
111}
112
113void transform::ApplyLowerCreateMaskPatternsOp::populatePatterns(
114 RewritePatternSet &patterns) {
116}
117
118void transform::ApplyRankReducingSubviewPatternsOp::populatePatterns(
119 RewritePatternSet &patterns) {
120 vector::populateVectorTransferDropUnitDimsPatterns(patterns);
121}
122
123void transform::ApplyTransferPermutationPatternsOp::populatePatterns(
124 RewritePatternSet &patterns) {
126}
127
128void transform::ApplyDropUnitDimWithShapeCastPatternsOp::populatePatterns(
129 RewritePatternSet &patterns) {
130 vector::populateDropUnitDimWithShapeCastPatterns(patterns);
131}
132
133void transform::ApplyDropInnerMostUnitDimsFromXferOpsPatternsOp::
134 populatePatterns(RewritePatternSet &patterns) {
136}
137
138void transform::ApplyLowerBitCastPatternsOp::populatePatterns(
139 RewritePatternSet &patterns) {
141}
142
143void transform::ApplyLowerBroadcastPatternsOp::populatePatterns(
144 RewritePatternSet &patterns) {
146}
147
148void transform::ApplyLowerContractionPatternsOp::populatePatterns(
149 RewritePatternSet &patterns) {
150 populateVectorContractLoweringPatterns(patterns, getLoweringStrategy(),
151 /*benefit=*/1,
152 /*disableOuterProductLowering=*/true);
153}
154
155void transform::ApplyLowerMasksPatternsOp::populatePatterns(
156 RewritePatternSet &patterns) {
158}
159
160void transform::ApplyLowerMaskedTransfersPatternsOp::populatePatterns(
161 RewritePatternSet &patterns) {
163}
164
165void transform::ApplyMaterializeMasksPatternsOp::populatePatterns(
166 RewritePatternSet &patterns) {
167 populateVectorMaskMaterializationPatterns(patterns,
168 /*force32BitVectorIndices=*/false);
169}
170
171//===----------------------------------------------------------------------===//
172// Multi-reduction patterns
173//===----------------------------------------------------------------------===//
174void transform::ApplyReorderMultiReductionPatternsOp::populatePatterns(
175 RewritePatternSet &patterns) {
176 vector::VectorTransformsOptions vectorTransformOptions;
177 vectorTransformOptions.setVectorMultiReductionLowering(getLoweringStrategy());
179 patterns, vectorTransformOptions.vectorMultiReductionLowering);
180}
181
182void transform::ApplyMultiReductionFlatteningPatternsOp::populatePatterns(
183 RewritePatternSet &patterns) {
184 vector::VectorTransformsOptions vectorTransformOptions;
185 vectorTransformOptions.setVectorMultiReductionLowering(getLoweringStrategy());
187 patterns, vectorTransformOptions.vectorMultiReductionLowering);
188}
189
190void transform::ApplyMultiReductionUnrollingPatternsOp::populatePatterns(
191 RewritePatternSet &patterns) {
192 vector::VectorTransformsOptions vectorTransformOptions;
193 vectorTransformOptions.setVectorMultiReductionLowering(getLoweringStrategy());
195 patterns, vectorTransformOptions.vectorMultiReductionLowering);
196}
197
198void transform::ApplyLowerOuterProductPatternsOp::populatePatterns(
199 RewritePatternSet &patterns) {
201}
202
203void transform::ApplyLowerGatherPatternsOp::populatePatterns(
204 RewritePatternSet &patterns) {
206}
207
208void transform::ApplyUnrollFromElementsPatternsOp::populatePatterns(
209 RewritePatternSet &patterns) {
210 vector::populateVectorFromElementsUnrollPatterns(patterns);
211}
212
213void transform::ApplyUnrollContractPatternsOp::populatePatterns(
214 RewritePatternSet &patterns) {
215 int64_t m = getM();
216 int64_t n = getN();
217 int64_t k = getK();
218
219 auto nativeShapeFn =
220 [m, n, k](Operation *op) -> std::optional<SmallVector<int64_t>> {
221 return SmallVector<int64_t>({m, n, k});
222 };
223
224 auto constraint = [](Operation *op) {
225 auto contract = dyn_cast<vector::ContractionOp>(op);
226 if (!contract)
227 return failure();
228
229 auto iterators = contract.getIteratorTypesArray();
230 if (iterators.size() != 3 ||
231 iterators[0] != vector::IteratorType::parallel ||
232 iterators[1] != vector::IteratorType::parallel ||
233 iterators[2] != vector::IteratorType::reduction)
234 return failure();
235
236 auto type = dyn_cast<VectorType>(contract.getType());
237 if (!type || type.getRank() != 2)
238 return failure();
239 return success();
240 };
241
242 vector::populateVectorContractUnrollPatterns(
244 .setNativeShapeFn(nativeShapeFn)
245 .setFilterConstraint(constraint));
246}
247
248void transform::ApplyUnrollToElementsPatternsOp::populatePatterns(
249 RewritePatternSet &patterns) {
250 vector::populateVectorToElementsUnrollPatterns(patterns);
251}
252
253void transform::ApplyLowerScanPatternsOp::populatePatterns(
254 RewritePatternSet &patterns) {
256}
257
258void transform::ApplyLowerShapeCastPatternsOp::populatePatterns(
259 RewritePatternSet &patterns) {
261}
262
263void transform::ApplyLowerStepPatternsOp::populatePatterns(
264 RewritePatternSet &patterns) {
266}
267
268void transform::ApplyLowerTransferPatternsOp::populatePatterns(
269 RewritePatternSet &patterns) {
271 getMaxTransferRank());
272}
273
274void transform::ApplyLowerTransposePatternsOp::populatePatterns(
275 RewritePatternSet &patterns) {
277 getLoweringStrategy());
278 if (getAvx2LoweringStrategy()) {
279 auto avx2LoweringOptions = x86::avx2::LoweringOptions().setTransposeOptions(
280 x86::avx2::TransposeLoweringOptions().lower4x8xf32(true).lower8x8xf32(
281 true));
283 patterns, avx2LoweringOptions, /*benefit=*/10);
284 }
285}
286
287void transform::ApplyLowerInterleavePatternsOp::populatePatterns(
288 RewritePatternSet &patterns) {
290}
291
292void transform::ApplyInterleaveAndDeinterleaveToShufflePatternsOp::
293 populatePatterns(RewritePatternSet &patterns) {
296}
297
298void transform::ApplyRewriteNarrowTypePatternsOp::populatePatterns(
299 RewritePatternSet &patterns) {
300 populateVectorNarrowTypeRewritePatterns(patterns);
301 populateVectorTransposeNarrowTypeRewritePatterns(patterns);
302}
303
304void transform::ApplySplitTransferFullPartialPatternsOp::populatePatterns(
305 RewritePatternSet &patterns) {
306 vector::VectorTransformsOptions vectorTransformOptions;
307 vectorTransformOptions.setVectorTransferSplit(getSplitTransferStrategy());
308 populateVectorTransferFullPartialPatterns(patterns, vectorTransformOptions);
309}
310
311void transform::ApplyTransferToScfPatternsOp::populatePatterns(
312 RewritePatternSet &patterns) {
313 VectorTransferToSCFOptions vectorTransferToSCFOptions =
315 .enableFullUnroll(getFullUnroll())
316 .setTargetRank(getMaxTransferRank());
317 populateVectorToSCFConversionPatterns(patterns, vectorTransferToSCFOptions);
318}
319
320void transform::ApplySinkVectorPatternsOp::populatePatterns(
321 RewritePatternSet &patterns) {
323}
324
325void transform::ApplySinkVectorMemPatternsOp::populatePatterns(
326 RewritePatternSet &patterns) {
327 vector::populateSinkVectorMemOpsPatterns(patterns);
328}
329
330void transform::ApplyFlattenVectorTransferOpsPatternsOp::populatePatterns(
331 RewritePatternSet &patterns) {
332 vector::populateFlattenVectorTransferPatterns(patterns,
333 getTargetVectorBitwidth());
334}
335
336//===----------------------------------------------------------------------===//
337// Transform op registration
338//===----------------------------------------------------------------------===//
339
340namespace {
341/// Registers new ops and declares PDL as dependent dialect since the additional
342/// ops are using PDL types for operands and results.
343class VectorTransformDialectExtension
345 VectorTransformDialectExtension> {
346public:
347 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(VectorTransformDialectExtension)
348
349 VectorTransformDialectExtension() {
350 declareGeneratedDialect<vector::VectorDialect>();
351 declareGeneratedDialect<arith::ArithDialect>();
352 declareGeneratedDialect<LLVM::LLVMDialect>();
353 registerTransformOps<
354#define GET_OP_LIST
355#include "mlir/Dialect/Vector/TransformOps/VectorTransformOps.cpp.inc"
356 >();
357 }
358};
359} // namespace
360
361#define GET_OP_CLASSES
362#include "mlir/Dialect/Vector/TransformOps/VectorTransformOps.cpp.inc"
363
365 DialectRegistry &registry) {
366 registry.addExtensions<VectorTransformDialectExtension>();
367}
return success()
static uint64_t getIndexBitwidth(DataLayoutEntryListRef params)
Returns the bitwidth of the index type if specified in the param list.
b getContext())
static void contract(RootOrderingGraph &graph, ArrayRef< Value > cycle, const DenseMap< Value, unsigned > &parentDepths, DenseMap< Value, Value > &actualSource, DenseMap< Value, Value > &actualTarget)
Contracts the specified cycle in the given graph in-place.
#define MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(CLASS_NAME)
Definition TypeID.h:331
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
void addExtensions()
Add the given extensions to the registry.
Conversion from types to the LLVM IR dialect.
Operation is the basic unit of execution within MLIR.
Definition Operation.h:87
Base class for extensions of the Transform dialect that supports injecting operations into the Transf...
uint64_t getN(LevelType lt)
Definition Enums.h:442
uint64_t getM(LevelType lt)
Definition Enums.h:443
void populateVectorTransferPermutationMapLoweringPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Collect a set of transfer read/write lowering patterns that simplify the permutation map (e....
void populateElementwiseToVectorOpsPatterns(RewritePatternSet &patterns)
Collect a set of patterns that fold elementwise op on vectors to the vector dialect.
void populateVectorInterleaveToShufflePatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
void populateVectorShapeCastLoweringPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorGatherLoweringPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorTransferLoweringPatterns(RewritePatternSet &patterns, std::optional< unsigned > maxTransferRank=std::nullopt, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateDropInnerMostUnitDimsXferOpPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Collect a set of patterns to collapse the most inner unit dims in xfer Ops.
void registerTransformDialectExtension(DialectRegistry &registry)
void populateVectorTransposeLoweringPatterns(RewritePatternSet &patterns, VectorTransposeLowering vectorTransposeLowering, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateFoldArithExtensionPatterns(RewritePatternSet &patterns)
Collect a set of patterns that fold arithmetic extension on floating point into vector contract for t...
void populateSinkVectorOpsPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Patterns that remove redundant Vector Ops by re-ordering them with e.g.
void populateVectorMultiReductionUnrollingPatterns(RewritePatternSet &patterns, VectorMultiReductionLowering options, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorBroadcastLoweringPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorBitCastLoweringPatterns(RewritePatternSet &patterns, int64_t targetRank=1, PatternBenefit benefit=1)
Populates the pattern set with the following patterns:
void populateVectorMultiReductionFlatteningPatterns(RewritePatternSet &patterns, VectorMultiReductionLowering options, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorOuterProductLoweringPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorMaskOpLoweringPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorReductionToContractPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Collect patterns to convert reduction op to vector.contract and fold transpose/broadcast ops into the...
void populateVectorStepLoweringPatterns(RewritePatternSet &patterns, unsigned indexBitwidth=64, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorTransferFullPartialPatterns(RewritePatternSet &patterns, const VectorTransformsOptions &options)
Populate patterns with the following patterns.
void populateVectorMaskLoweringPatternsForSideEffectingOps(RewritePatternSet &patterns)
Populates instances of MaskOpRewritePattern to lower masked operations with vector....
void populateVectorInterleaveLoweringPatterns(RewritePatternSet &patterns, int64_t targetRank=1, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorDeinterleaveToShufflePatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
void populateVectorContractLoweringPatterns(RewritePatternSet &patterns, VectorContractLowering vectorContractLoweringOption, PatternBenefit benefit=1, bool disableOuterProductLowering=false)
Populate the pattern set with the following patterns:
void populateVectorMultiReductionReorderPatterns(RewritePatternSet &patterns, VectorMultiReductionLowering options, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateVectorScanLoweringPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
void populateSpecializedTransposeLoweringPatterns(RewritePatternSet &patterns, LoweringOptions options=LoweringOptions(), int benefit=10)
Insert specialized transpose lowering patterns.
Include the generated interface declarations.
void populateVectorToLLVMConversionPatterns(const LLVMTypeConverter &converter, RewritePatternSet &patterns, bool reassociateFPReductions=false, bool force32BitVectorIndices=false, bool useVectorAlignment=false, bool enableGEPInboundsNuw=false)
Collect a set of patterns to convert from the Vector dialect to LLVM.
void populateVectorToSCFConversionPatterns(RewritePatternSet &patterns, const VectorTransferToSCFOptions &options=VectorTransferToSCFOptions())
Collect a set of patterns to convert from the Vector dialect to SCF + func.
When lowering an N-d vector transfer op to an (N-1)-d vector transfer op, a temporary buffer is creat...
Definition VectorToSCF.h:52
VectorTransferToSCFOptions & setTargetRank(unsigned r)
Definition VectorToSCF.h:55
VectorTransferToSCFOptions & enableFullUnroll(bool u=true)
Definition VectorToSCF.h:68
Options that control the vector unrolling.
Structure to control the behavior of vector transform patterns.
VectorMultiReductionLowering vectorMultiReductionLowering
Option to control the lowering of vector.multi_reduction.
VectorTransformsOptions & setVectorMultiReductionLowering(VectorMultiReductionLowering opt)
VectorTransformsOptions & setVectorTransferSplit(VectorTransferSplit opt)
Options for controlling specialized AVX2 lowerings.
Definition Transforms.h:200
LoweringOptions & setTransposeOptions(TransposeLoweringOptions options)
Definition Transforms.h:203
Structure to control the behavior of specialized AVX2 transpose lowering.
Definition Transforms.h:186