Skip to content

Commit b55f155

Browse files
committed
add interleave-to-shuffle pattern
1 parent e9f53e4 commit b55f155

File tree

6 files changed

+72
-0
lines changed

6 files changed

+72
-0
lines changed

mlir/include/mlir/Dialect/Vector/TransformOps/VectorTransformOps.td

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,20 @@ def ApplyLowerInterleavePatternsOp : Op<Transform_Dialect,
306306
let assemblyFormat = "attr-dict";
307307
}
308308

309+
def ApplyInterleaveToShufflePatternsOp : Op<Transform_Dialect,
310+
"apply_patterns.vector.interleave_to_shuffle",
311+
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {
312+
let description = [{
313+
Indicates that 1D vector interleave operations should be rewritten as
314+
vector shuffle operations.
315+
316+
This is motivated by some current codegen backends not handling vector
317+
interleave operations.
318+
}];
319+
320+
let assemblyFormat = "attr-dict";
321+
}
322+
309323
def ApplyRewriteNarrowTypePatternsOp : Op<Transform_Dialect,
310324
"apply_patterns.vector.rewrite_narrow_types",
311325
[DeclareOpInterfaceMethods<PatternDescriptorOpInterface>]> {

mlir/include/mlir/Dialect/Vector/Transforms/LoweringPatterns.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,9 @@ void populateVectorInterleaveLoweringPatterns(RewritePatternSet &patterns,
273273
int64_t targetRank = 1,
274274
PatternBenefit benefit = 1);
275275

276+
void populateVectorInterleaveToShufflePatterns(RewritePatternSet &patterns,
277+
PatternBenefit benefit = 1);
278+
276279
} // namespace vector
277280
} // namespace mlir
278281
#endif // MLIR_DIALECT_VECTOR_TRANSFORMS_LOWERINGPATTERNS_H

mlir/lib/Conversion/VectorToSPIRV/VectorToSPIRV.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "mlir/Dialect/SPIRV/IR/SPIRVTypes.h"
1919
#include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h"
2020
#include "mlir/Dialect/Vector/IR/VectorOps.h"
21+
#include "mlir/Dialect/Vector/Transforms/LoweringPatterns.h"
2122
#include "mlir/IR/Attributes.h"
2223
#include "mlir/IR/BuiltinAttributes.h"
2324
#include "mlir/IR/BuiltinTypes.h"
@@ -828,6 +829,9 @@ void mlir::populateVectorToSPIRVPatterns(SPIRVTypeConverter &typeConverter,
828829
// than the generic one that extracts all elements.
829830
patterns.add<VectorReductionToFPDotProd>(typeConverter, patterns.getContext(),
830831
PatternBenefit(2));
832+
833+
// Need this until vector.interleave is handled.
834+
vector::populateVectorInterleaveToShufflePatterns(patterns);
831835
}
832836

833837
void mlir::populateVectorReductionToSPIRVDotProductPatterns(

mlir/lib/Dialect/Vector/TransformOps/VectorTransformOps.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ void transform::ApplyLowerInterleavePatternsOp::populatePatterns(
164164
vector::populateVectorInterleaveLoweringPatterns(patterns);
165165
}
166166

167+
void transform::ApplyInterleaveToShufflePatternsOp::populatePatterns(
168+
RewritePatternSet &patterns) {
169+
vector::populateVectorInterleaveToShufflePatterns(patterns);
170+
}
171+
167172
void transform::ApplyRewriteNarrowTypePatternsOp::populatePatterns(
168173
RewritePatternSet &patterns) {
169174
populateVectorNarrowTypeRewritePatterns(patterns);

mlir/lib/Dialect/Vector/Transforms/LowerVectorInterleave.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
1717
#include "mlir/IR/BuiltinTypes.h"
1818
#include "mlir/IR/PatternMatch.h"
19+
#include "mlir/Support/LogicalResult.h"
1920

2021
#define DEBUG_TYPE "vector-interleave-lowering"
2122

@@ -77,9 +78,33 @@ class UnrollInterleaveOp : public OpRewritePattern<vector::InterleaveOp> {
7778
int64_t targetRank = 1;
7879
};
7980

81+
class InterleaveToShuffle : public OpRewritePattern<vector::InterleaveOp> {
82+
public:
83+
InterleaveToShuffle(MLIRContext *context, PatternBenefit benefit = 1)
84+
: OpRewritePattern(context, benefit){};
85+
86+
LogicalResult matchAndRewrite(vector::InterleaveOp op,
87+
PatternRewriter &rewriter) const override {
88+
VectorType sourceType = op.getSourceVectorType();
89+
if (sourceType.getRank() != 1) {
90+
return failure();
91+
}
92+
rewriter.replaceOpWithNewOp<ShuffleOp>(
93+
op, op.getLhs(), op.getRhs(),
94+
llvm::map_to_vector(llvm::seq<int64_t>(2 * sourceType.getNumElements()),
95+
[](int64_t i) { return i / 2; }));
96+
return success();
97+
}
98+
};
99+
80100
} // namespace
81101

82102
void mlir::vector::populateVectorInterleaveLoweringPatterns(
83103
RewritePatternSet &patterns, int64_t targetRank, PatternBenefit benefit) {
84104
patterns.add<UnrollInterleaveOp>(targetRank, patterns.getContext(), benefit);
85105
}
106+
107+
void mlir::vector::populateVectorInterleaveToShufflePatterns(
108+
RewritePatternSet &patterns, PatternBenefit benefit) {
109+
patterns.add<InterleaveToShuffle>(patterns.getContext(), benefit);
110+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: mlir-opt %s --transform-interpreter | FileCheck %s
2+
3+
// CHECK-LABEL: @vector_interleave_to_shuffle
4+
func.func @vector_interleave_to_shuffle(%a: vector<7xi16>, %b: vector<7xi16>) -> vector<14xi16>
5+
{
6+
%0 = vector.interleave %a, %b : vector<7xi16>
7+
return %0 : vector<14xi16>
8+
}
9+
// CHECK: vector.shuffle %arg0, %arg1 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6] : vector<7xi16>, vector<7xi16>
10+
11+
module attributes {transform.with_named_sequence} {
12+
transform.named_sequence @__transform_main(%module_op: !transform.any_op {transform.readonly}) {
13+
%f = transform.structured.match ops{["func.func"]} in %module_op
14+
: (!transform.any_op) -> !transform.any_op
15+
16+
transform.apply_patterns to %f {
17+
transform.apply_patterns.vector.interleave_to_shuffle
18+
} : !transform.any_op
19+
transform.yield
20+
}
21+
}

0 commit comments

Comments
 (0)