Skip to content

Commit 37d338a

Browse files
committed
set inbounds to true only for dynamic dims, adress comments
Signed-off-by: Ege Beysel <[email protected]>
1 parent 9987bcc commit 37d338a

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed

mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -525,13 +525,30 @@ VectorizationState::maskOperation(RewriterBase &rewriter, Operation *opToMask,
525525
if (!mask) {
526526
LDBG() << "No mask required";
527527
if (assumeDynamicDimsMatchVecSizes) {
528-
LDBG() << "Assuming dynamic dimensions match vector sizes!";
529-
// Set inbounds to all-true.
530528
llvm::TypeSwitch<Operation *>(opToMask)
531529
.Case<vector::TransferReadOp, vector::TransferWriteOp>(
532530
[&](auto xferOp) {
533-
SmallVector<bool> inBoundsMap(xferOp.getInBounds().size(),
534-
true);
531+
// For vector.transfer_read and vector.transfer_write, there is
532+
// also the `in-bounds` attribute that has to be set explicitly
533+
// to true. Otherwise, "out-of-bounds" access will be assumed
534+
// and masks will be generated while lowering these.
535+
LDBG() << "Assuming dynamic dimensions match vector sizes and "
536+
"setting their in-bounds to true!";
537+
SmallVector<bool> inBoundsMap = xferOp.getInBoundsValues();
538+
ShapedType xferType = xferOp.getShapedType();
539+
AffineMap permMap = xferOp.getPermutationMap();
540+
// Only set the in-bounds values to true for dynamic dims.
541+
// Different mechanisms will set these accordingly for the
542+
// static dims.
543+
for (unsigned i = 0; i < xferOp.getTransferRank(); i++) {
544+
auto dimExpr = dyn_cast<AffineDimExpr>(permMap.getResult(i));
545+
// Skip broadcast dimensions.
546+
if (!dimExpr)
547+
continue;
548+
unsigned pos = dimExpr.getPosition();
549+
if (xferType.isDynamicDim(pos))
550+
inBoundsMap[i] = true;
551+
}
535552
rewriter.modifyOpInPlace(xferOp, [&]() {
536553
xferOp.setInBoundsAttr(
537554
rewriter.getBoolArrayAttr(inBoundsMap));

mlir/test/Dialect/Linalg/vectorization/linalg-ops.mlir

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -919,15 +919,16 @@ func.func @mmt4d_scalable_with_assume(%A: memref<16x16x8x1xf32>, %B: memref<16x1
919919
// CHECK-SAME: %[[C_IN:.*]]: memref<16x16x8x?xf32>) {
920920
// CHECK-NOT: mask
921921
// CHECK: %[[VEC_A:.*]] = vector.transfer_read %[[A]]
922-
// CHECK-SAME: in_bounds = [true, true, true, true, true, true]{{.*}} : memref<16x16x8x1xf32>, vector<16x16x16x8x[4]x1xf32>
922+
// CHECK-SAME: memref<16x16x8x1xf32>, vector<16x16x16x8x[4]x1xf32>
923923
// CHECK: %[[VEC_B:.*]] = vector.transfer_read %[[B]]
924-
// CHECK-SAME: in_bounds = [true, true, true, true, true, true]{{.*}} : memref<16x16x?x1xf32>, vector<16x16x16x8x[4]x1xf32>
924+
// `in-bounds` are set to true for dynamic dims with assume, static sizes will be inferred elsewhere.
925+
// CHECK-SAME: in_bounds = [false, false, false, false, true, false]{{.*}} : memref<16x16x?x1xf32>, vector<16x16x16x8x[4]x1xf32>
925926
// CHECK: %[[VEC_C:.*]] = vector.transfer_read %[[C_IN]]
926-
// CHECK-SAME: in_bounds = [true, true, true, true]{{.*}} : memref<16x16x8x?xf32>, vector<16x16x8x[4]xf32>
927+
// CHECK-SAME: in_bounds = [false, false, false, true]{{.*}} : memref<16x16x8x?xf32>, vector<16x16x8x[4]xf32>
927928
// CHECK: %[[MUL:.*]] = arith.mulf %[[VEC_A]], %[[VEC_B]] : vector<16x16x16x8x[4]x1xf32>
928929
// CHECK: %[[RED:.*]] = vector.multi_reduction <add>, %[[MUL]], %[[VEC_C]] [2, 5] : vector<16x16x16x8x[4]x1xf32> to vector<16x16x8x[4]xf32>
929930
// CHECK: vector.transfer_write %[[RED]], %[[C_IN]]
930-
// CHECK-SAME: in_bounds = [true, true, true, true]{{.*}} : vector<16x16x8x[4]xf32>, memref<16x16x8x?xf32>
931+
// CHECK-SAME: in_bounds = [false, false, false, true]{{.*}} : vector<16x16x8x[4]xf32>, memref<16x16x8x?xf32>
931932

932933
module attributes {transform.with_named_sequence} {
933934
transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) {
@@ -1016,15 +1017,16 @@ func.func @batch_mmt4d_scalable_with_assume(%A: memref<2x16x16x8x1xf32>, %B: mem
10161017
// CHECK-SAME: %[[C_IN:.*]]: memref<2x16x16x8x?xf32>) {
10171018
// CHECK-NOT: mask
10181019
// CHECK: %[[VEC_A:.*]] = vector.transfer_read %[[A]]
1019-
// CHECK-SAME: in_bounds = [true, true, true, true, true, true, true]{{.*}} : memref<2x16x16x8x1xf32>, vector<2x16x16x16x8x[4]x1xf32>
1020+
// CHECK-SAME: memref<2x16x16x8x1xf32>, vector<2x16x16x16x8x[4]x1xf32>
10201021
// CHECK: %[[VEC_B:.*]] = vector.transfer_read %[[B]]
1021-
// CHECK-SAME: in_bounds = [true, true, true, true, true, true, true]{{.*}} : memref<2x16x16x?x1xf32>, vector<2x16x16x16x8x[4]x1xf32>
1022+
// `in-bounds` are set to true for dynamic dims with assume, static sizes will be inferred elsewhere.
1023+
// CHECK-SAME: in_bounds = [false, false, false, false, false, true, false]{{.*}} : memref<2x16x16x?x1xf32>, vector<2x16x16x16x8x[4]x1xf32>
10221024
// CHECK: %[[VEC_C:.*]] = vector.transfer_read %[[C_IN]]
1023-
// CHECK-SAME: in_bounds = [true, true, true, true, true]{{.*}} : memref<2x16x16x8x?xf32>, vector<2x16x16x8x[4]xf32>
1025+
// CHECK-SAME: in_bounds = [false, false, false, false, true]{{.*}} : memref<2x16x16x8x?xf32>, vector<2x16x16x8x[4]xf32>
10241026
// CHECK: %[[MUL:.*]] = arith.mulf %[[VEC_A]], %[[VEC_B]] : vector<2x16x16x16x8x[4]x1xf32>
10251027
// CHECK: %[[RED:.*]] = vector.multi_reduction <add>, %[[MUL]], %[[VEC_C]] [3, 6] : vector<2x16x16x16x8x[4]x1xf32> to vector<2x16x16x8x[4]xf32>
10261028
// CHECK: vector.transfer_write %[[RED]], %[[C_IN]]
1027-
// CHECK-SAME: in_bounds = [true, true, true, true, true]{{.*}} : vector<2x16x16x8x[4]xf32>, memref<2x16x16x8x?xf32>
1029+
// CHECK-SAME: in_bounds = [false, false, false, false, true]{{.*}} : vector<2x16x16x8x[4]xf32>, memref<2x16x16x8x?xf32>
10281030

10291031
module attributes {transform.with_named_sequence} {
10301032
transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) {

0 commit comments

Comments
 (0)