Skip to content

Commit 1ede503

Browse files
authored
[MLIR][Vector] Implement TransferReadOfExtractSliceOp as MaskableOpRewritePattern (#91960)
Split of #90835 Adds support for `TransferReadOfExtractSliceOpFolder` when the `TransferReadOp` is inside a `MaskOp`.
1 parent f05c068 commit 1ede503

File tree

3 files changed

+34
-11
lines changed

3 files changed

+34
-11
lines changed

mlir/lib/Dialect/Tensor/Transforms/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,6 @@ add_mlir_dialect_library(MLIRTensorTransforms
3939
MLIRTilingInterface
4040
MLIRTransforms
4141
MLIRVectorDialect
42+
MLIRVectorUtils
4243
MLIRValueBoundsOpInterface
4344
)

mlir/lib/Dialect/Tensor/Transforms/FoldTensorSubsetOps.cpp

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "mlir/Dialect/Tensor/Transforms/Transforms.h"
1919
#include "mlir/Dialect/Utils/IndexingUtils.h"
2020
#include "mlir/Dialect/Vector/IR/VectorOps.h"
21+
#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
2122
#include "mlir/IR/AffineMap.h"
2223
#include "mlir/IR/BuiltinAttributes.h"
2324
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
@@ -48,12 +49,14 @@ static Value getTensorOperand(tensor::InsertSliceOp op) {
4849
namespace {
4950
/// Merge extract_slice operation with load/transferRead operation.
5051
class TransferReadOfExtractSliceOpFolder final
51-
: public OpRewritePattern<vector::TransferReadOp> {
52+
: public vector::MaskableOpRewritePattern<vector::TransferReadOp> {
5253
public:
53-
using OpRewritePattern<vector::TransferReadOp>::OpRewritePattern;
54+
using MaskableOpRewritePattern::MaskableOpRewritePattern;
5455

55-
LogicalResult matchAndRewrite(vector::TransferReadOp readOp,
56-
PatternRewriter &rewriter) const override;
56+
FailureOr<mlir::Value>
57+
matchAndRewriteMaskableOp(vector::TransferReadOp readOp,
58+
vector::MaskingOpInterface maskOp,
59+
PatternRewriter &rewriter) const override;
5760
};
5861

5962
/// Merge insert_slice operation with store/transferWriteOp operation.
@@ -84,8 +87,10 @@ static LogicalResult preconditionsFoldExtractOrInsertWithTransferOp(
8487
return success();
8588
}
8689

87-
LogicalResult TransferReadOfExtractSliceOpFolder::matchAndRewrite(
88-
vector::TransferReadOp readOp, PatternRewriter &rewriter) const {
90+
FailureOr<mlir::Value>
91+
TransferReadOfExtractSliceOpFolder::matchAndRewriteMaskableOp(
92+
vector::TransferReadOp readOp, vector::MaskingOpInterface maskOp,
93+
PatternRewriter &rewriter) const {
8994
auto extractSliceOp =
9095
getTensorOperand(readOp).getDefiningOp<tensor::ExtractSliceOp>();
9196
if (!extractSliceOp)
@@ -95,7 +100,7 @@ LogicalResult TransferReadOfExtractSliceOpFolder::matchAndRewrite(
95100
preconditionsFoldExtractOrInsertWithTransferOp(rewriter, readOp,
96101
extractSliceOp);
97102
if (failed(preconditionResult))
98-
return preconditionResult;
103+
return rewriter.notifyMatchFailure(readOp, "Failed preconditions");
99104

100105
SmallVector<Value> indices(readOp.getIndices().begin(),
101106
readOp.getIndices().end());
@@ -105,15 +110,17 @@ LogicalResult TransferReadOfExtractSliceOpFolder::matchAndRewrite(
105110
extractSliceOp.getMixedStrides(), extractSliceOp.getDroppedDims(),
106111
indices, sourceIndices);
107112

108-
rewriter.replaceOpWithNewOp<vector::TransferReadOp>(
109-
readOp, readOp.getVectorType(), extractSliceOp.getSource(), sourceIndices,
113+
Operation *newOp = rewriter.create<vector::TransferReadOp>(
114+
readOp.getLoc(), readOp.getVectorType(), extractSliceOp.getSource(),
115+
sourceIndices,
110116
AffineMapAttr::get(expandDimsToRank(
111117
readOp.getPermutationMap(), extractSliceOp.getSourceType().getRank(),
112118
extractSliceOp.getDroppedDims())),
113119
readOp.getPadding(),
114120
/*mask=*/Value(), readOp.getInBoundsAttr());
115-
116-
return success();
121+
if (maskOp)
122+
newOp = mlir::vector::maskOperation(rewriter, newOp, maskOp.getMask());
123+
return newOp->getResults()[0];
117124
}
118125

119126
LogicalResult InsertSliceOfTransferWriteOpFolder::matchAndRewrite(

mlir/test/Dialect/Tensor/fold-tensor-subset-ops-into-vector-transfers.mlir

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,21 @@ func.func @transfer_read_of_extract_slice_non_leading_rank_reduction(%t : tensor
7575
return %1 : vector<5x6xf32>
7676
}
7777

78+
// CHECK-LABEL: func @masked_transfer_read_of_extract_slice
79+
// CHECK-SAME: %[[t:.*]]: tensor<?x?xf32>, %[[s1:.*]]: index, %[[s2:.*]]: index
80+
// CHECK-DAG: %[[m:.*]] = vector.create_mask{{.*}} : vector<5x6xi1>
81+
// CHECK-DAG: %[[a:.*]] = affine.apply {{.*}}[[s1]]
82+
// CHECK: vector.mask %[[m]] { vector.transfer_read %[[t]]{{.*}}: tensor<?x?xf32>, vector<5x6xf32> } : vector<5x6xi1> -> vector<5x6xf32>
83+
func.func @masked_transfer_read_of_extract_slice(%t : tensor<?x?xf32>, %s1 : index, %s2 : index) -> vector<5x6xf32> {
84+
%c3 = arith.constant 3 : index
85+
%c4 = arith.constant 4 : index
86+
%cst = arith.constant 0.0 : f32
87+
%0 = tensor.extract_slice %t[5, %s1] [10, %s2] [1, 1] : tensor<?x?xf32> to tensor<10x?xf32>
88+
%mask = vector.create_mask %c3, %c4 : vector<5x6xi1>
89+
%1 = vector.mask %mask {vector.transfer_read %0[%c3, %c4], %cst {in_bounds = [true, true]} : tensor<10x?xf32>, vector<5x6xf32>} : vector<5x6xi1> -> vector<5x6xf32>
90+
return %1 : vector<5x6xf32>
91+
}
92+
7893
// CHECK-LABEL: func @insert_slice_of_transfer_write(
7994
// CHECK-SAME: %[[t1:.*]]: tensor<?x12xf32>, %[[v:.*]]: vector<5x6xf32>, %[[s:.*]]: index
8095
// CHECK: %[[c3:.*]] = arith.constant 3 : index

0 commit comments

Comments
 (0)