1
1
// RUN: mlir-opt %s --transform-interpreter --split-input-file | FileCheck %s
2
2
3
+ // TODO: Review the usage of `in_bounds` and remove where not affecting the
4
+ // generated output.
5
+
3
6
/// CHECK: #[[$MAP:.*]] = affine_map<(d0, d1, d2, d3) -> (d1, 0, d3)>
4
7
5
8
///----------------------------------------------------------------------------------------
@@ -106,8 +109,8 @@ func.func @xfer_write_minor_identity_transposed_map_masked(
106
109
/// (neither a minor identity nor transposed minor identity map)
107
110
/// OUT 1: vector.broadcast + vector.transfer_write
108
111
/// (transposed minor identity)
109
- /// OUT 2: vector.transfer_write -> vector.broadcast + vector.transpose + vector.transfer_write
110
- /// (minor identity)
112
+ /// OUT 2: vector.transfer_write -> vector.broadcast + vector.transpose
113
+ /// + vector.transfer_write (minor identity)
111
114
///----------------------------------------------------------------------------------------
112
115
113
116
// CHECK-LABEL: func.func @xfer_write_non_minor_identity(
@@ -233,16 +236,16 @@ func.func @xfer_write_non_minor_identity_masked_scalable(
233
236
// CHECK-LABEL: func @xfer_write_non_minor_identity_masked_2
234
237
// CHECK-SAME: %[[DEST:.*]]: tensor<?x?x?x?xf32>
235
238
// CHECK-SAME: %[[VEC:.*]]: vector<14x8x16xf32>
236
- // CHECK-SAME: %[[DIM:.*]]: index, %[[IDX:.*]]: index) -> tensor<?x?x?x?xf32>
239
+ // CHECK-SAME: %[[MASK:.*]]: vector<14x8x16xi1>
240
+ // CHECK-SAME: %[[DIM:.*]]: index
237
241
// CHECK-NOT: vector.broadcast
238
- // CHECK: vector.mask %0 { vector.transfer_write %[[VEC]], %[[DEST]]{{.*}} : vector<14x8x16xf32>, tensor<?x?x?x?xf32> } : vector<14x8x16xi1> -> tensor<?x?x?x?xf32>
242
+ // CHECK: vector.mask %[[MASK]] { vector.transfer_write %[[VEC]], %[[DEST]]{{.*}} : vector<14x8x16xf32>, tensor<?x?x?x?xf32> } : vector<14x8x16xi1> -> tensor<?x?x?x?xf32>
239
243
func.func @xfer_write_non_minor_identity_masked_2 (
240
244
%dest : tensor <?x?x?x?xf32 >,
241
245
%vec : vector <14 x8 x16 xf32 >,
242
- %dim : index ,
246
+ %mask: vector < 14 x 8 x 16 x i1 > ,
243
247
%idx: index ) -> tensor <?x?x?x?xf32 > {
244
248
245
- %mask = vector.create_mask %dim , %dim , %dim : vector <14 x8 x16 xi1 >
246
249
%res = vector.mask %mask {
247
250
vector.transfer_write %vec , %dest [%idx , %idx , %idx , %idx ] {
248
251
in_bounds = [false , false , true ],
@@ -259,29 +262,27 @@ func.func @xfer_write_non_minor_identity_masked_2(
259
262
///
260
263
/// IN: vector.transfer_read
261
264
/// (_transposed_ minor identity permutation map, with 0 or more broadcast dims)
262
- /// OUT: vector.transpose + vector.transfer_write
265
+ /// OUT: vector.transfer_read + vector.broadcast + vector.transpose
263
266
/// (minor identity permutation map with 0 or more leading broadcast dims)
264
267
///----------------------------------------------------------------------------------------
265
268
/// TODO: Inner broadcast dim - see also the block at the bottom of this file
266
269
267
- // CHECK-LABEL: func.func @xfer_read_minor_identity_tranposed_with_mask
270
+ // CHECK-LABEL: func.func @xfer_read_minor_identity_transposed_with_mask
268
271
// CHECK-SAME: %[[MEM:.*]]: memref<?x?xf32>,
269
- // CHECK-SAME: %[[DIM_1:.*]]: index, %[[DIM_2:.*]]: index, %[[IDX:.*]]: index) -> vector<8x4x2xf32> {
272
+ // CHECK-SAME: %[[MASK:.*]]: vector<2x4xi1>
273
+ // CHECK-SAME: %[[IDX:.*]]: index
270
274
// CHECK: %[[PASS_THROUGH:.*]] = arith.constant 0.000000e+00 : f32
271
- // CHECK: %[[MASK:.*]] = vector.create_mask %[[DIM_2]], %[[DIM_1]] : vector<2x4xi1>
272
275
// CHECK: %[[T_READ:.*]] = vector.transfer_read %[[MEM]]{{\[}}%[[IDX]], %[[IDX]]], %[[PASS_THROUGH]], %[[MASK]] {in_bounds = [true, true]} : memref<?x?xf32>, vector<2x4xf32>
273
276
// CHECK: %[[BCAST:.*]] = vector.broadcast %[[T_READ]] : vector<2x4xf32> to vector<8x2x4xf32>
274
277
// CHECK: %[[TRANSPOSE:.*]] = vector.transpose %[[BCAST]], [0, 2, 1] : vector<8x2x4xf32> to vector<8x4x2xf32>
275
278
// CHECK: return %[[TRANSPOSE]] : vector<8x4x2xf32>
276
- func.func @xfer_read_minor_identity_tranposed_with_mask (
279
+ func.func @xfer_read_minor_identity_transposed_with_mask (
277
280
%mem: memref <?x?xf32 >,
278
- %dim_1: index ,
279
- %dim_2: index ,
281
+ %mask: vector <2 x4 xi1 >,
280
282
%idx: index ) -> (vector <8 x4 x2 xf32 >) {
281
283
282
284
%pad = arith.constant 0.000000e+00 : f32
283
285
284
- %mask = vector.create_mask %dim_2 , %dim_1 : vector <2 x4 xi1 >
285
286
%res = vector.transfer_read %mem [%idx , %idx ], %pad , %mask {
286
287
in_bounds = [true , true , true ],
287
288
permutation_map = affine_map <(d0 , d1 ) -> (0 , d1 , d0 )>
@@ -290,24 +291,22 @@ func.func @xfer_read_minor_identity_tranposed_with_mask(
290
291
return %res : vector <8 x4 x2 xf32 >
291
292
}
292
293
293
- // CHECK-LABEL: func.func @xfer_read_minor_identity_tranposed_with_mask_scalable (
294
+ // CHECK-LABEL: func.func @xfer_read_minor_identity_transposed_with_mask_scalable (
294
295
// CHECK-SAME: %[[MEM:.*]]: memref<?x?xf32>,
295
- // CHECK-SAME: %[[DIM_1:.*]]: index, %[[DIM_2:.*]]: index, %[[IDX:.*]]: index) -> vector<8x[4]x2xf32> {
296
+ // CHECK-SAME: %[[MASK:.*]]: vector<2x[4]xi1>
297
+ // CHECK-SAME: %[[IDX:.*]]: index
296
298
// CHECK: %[[PAD:.*]] = arith.constant 0.000000e+00 : f32
297
- // CHECK: %[[MASK:.*]] = vector.create_mask %[[DIM_2]], %[[DIM_1]] : vector<2x[4]xi1>
298
299
// CHECK: %[[T_READ:.*]] = vector.transfer_read %[[MEM]]{{\[}}%[[IDX]], %[[IDX]]], %[[PAD]], %[[MASK]] {in_bounds = [true, true]} : memref<?x?xf32>, vector<2x[4]xf32>
299
300
// CHECK: %[[BCAST:.*]] = vector.broadcast %[[T_READ]] : vector<2x[4]xf32> to vector<8x2x[4]xf32>
300
301
// CHECK: %[[TRANSPOSE:.*]] = vector.transpose %[[BCAST]], [0, 2, 1] : vector<8x2x[4]xf32> to vector<8x[4]x2xf32>
301
302
// CHECK: return %[[TRANSPOSE]] : vector<8x[4]x2xf32>
302
- func.func @xfer_read_minor_identity_tranposed_with_mask_scalable (
303
+ func.func @xfer_read_minor_identity_transposed_with_mask_scalable (
303
304
%mem: memref <?x?xf32 >,
304
- %dim_1: index ,
305
- %dim_2: index ,
305
+ %mask: vector <2 x[4 ]xi1 >,
306
306
%idx: index ) -> (vector <8 x[4 ]x2 xf32 >) {
307
307
308
308
%pad = arith.constant 0.000000e+00 : f32
309
309
310
- %mask = vector.create_mask %dim_2 , %dim_1 : vector <2 x[4 ]xi1 >
311
310
%res = vector.transfer_read %mem [%idx , %idx ], %pad , %mask {
312
311
in_bounds = [true , true , true ],
313
312
permutation_map = affine_map <(d0 , d1 ) -> (0 , d1 , d0 )>
@@ -319,24 +318,26 @@ func.func @xfer_read_minor_identity_tranposed_with_mask_scalable(
319
318
// Masked version is not supported
320
319
321
320
// CHECK-LABEL: func @xfer_read_minor_identity_transposed_masked(
322
- // CHECK-SAME: %[[DEST:.*]]: tensor<?x1xf32>,
323
- // CHECK-SAME: %[[MASK:.*]]: vector<4x1xi1>
321
+ // CHECK-SAME: %[[DEST:.*]]: tensor<?x?xf32>,
322
+ // CHECK-SAME: %[[MASK:.*]]: vector<2x4xi1>
323
+ // CHECK-SAME: %[[IDX:.*]]: index
324
324
// CHECK-NOT: vector.transpose
325
- // CHECK: vector.mask %[[MASK]] { vector.transfer_read %[[DEST]]{{.*}}: tensor<?x1xf32 >, vector<1x4x4xf32 > } : vector<4x1xi1 > -> vector<1x4x4xf32 >
325
+ // CHECK: vector.mask %[[MASK]] { vector.transfer_read %[[DEST]]{{.*}}: tensor<?x?xf32 >, vector<8x4x2xf32 > } : vector<2x4xi1 > -> vector<8x4x2xf32 >
326
326
func.func @xfer_read_minor_identity_transposed_masked (
327
- %dest: tensor <?x 1 x f32 >,
328
- %mask : vector <4 x 1 x i1 >,
329
- %idx: index ) {
327
+ %dest: tensor <?x?x f32 >,
328
+ %mask: vector <2 x 4 x i1 >,
329
+ %idx: index ) -> ( vector < 8 x 4 x 2 x f32 >) {
330
330
331
331
%pad = arith.constant 0.000000e+00 : f32
332
- %3 = vector.mask %mask {
332
+
333
+ %res = vector.mask %mask {
333
334
vector.transfer_read %dest [%idx , %idx ], %pad {
334
- permutation_map = affine_map <(d0 , d1 ) -> (d1 , 0 , d0 )>
335
- } : tensor <?x1 xf32 >, vector <1 x4 x4 xf32 >
336
- } : vector <4 x1 xi1 > -> vector <1 x4 x4 xf32 >
335
+ in_bounds = [true , true , true ],
336
+ permutation_map = affine_map <(d0 , d1 ) -> (0 , d1 , d0 )>
337
+ } : tensor <?x?xf32 >, vector <8 x4 x2 xf32 >
338
+ } : vector <2 x4 xi1 > -> vector <8 x4 x2 xf32 >
337
339
338
- " test.some_use" (%3 ) : (vector <1 x4 x4 xf32 >) -> ()
339
- return
340
+ return %res : vector <8 x4 x2 xf32 >
340
341
}
341
342
342
343
// CHECK-LABEL: func.func @xfer_read_minor_identity_transposed_masked_scalable(
@@ -346,7 +347,7 @@ func.func @xfer_read_minor_identity_transposed_masked(
346
347
// CHECK: %[[T_READ:.*]] = vector.mask %[[MASK]] { vector.transfer_read %[[DEST]]{{.*}} : tensor<?x?xf32>, vector<8x[4]x2xf32> } : vector<2x[4]xi1> -> vector<8x[4]x2xf32>
347
348
func.func @xfer_read_minor_identity_transposed_masked_scalable (
348
349
%dest: tensor <?x?xf32 >,
349
- %mask : vector <2 x[4 ]xi1 >,
350
+ %mask: vector <2 x[4 ]xi1 >,
350
351
%idx: index ) -> vector <8 x[4 ]x2 xf32 > {
351
352
352
353
%pad = arith.constant 0.000000e+00 : f32
@@ -388,17 +389,16 @@ func.func @xfer_read_minor_identitiy_bcast_dims_scalable(
388
389
389
390
// CHECK-LABEL: func.func @xfer_read_minor_identitiy_bcast_dims_masked
390
391
// CHECK-SAME: %[[MEM:.*]]: memref<?x?x?x?xf32>,
391
- // CHECK-SAME: %[[DIM :.*]]: index,
392
+ // CHECK-SAME: %[[MASK :.*]]: vector<[4]x3xi1>
392
393
// CHECK-SAME: %[[IDX:.*]]: index) -> vector<8x[4]x2x3xf32> {
393
394
// CHECK-NOT: vector.broadcast
394
- // CHECK: %[[MASK:.*]] = vector.mask %0 { vector.transfer_read %[[MEM]]{{.*}} : memref<?x?x?x?xf32>, vector<8x[4]x2x3xf32> } : vector<[4]x3xi1> -> vector<8x[4]x2x3xf32>
395
+ // CHECK: vector.mask %[[MASK]] { vector.transfer_read %[[MEM]]{{.*}} : memref<?x?x?x?xf32>, vector<8x[4]x2x3xf32> } : vector<[4]x3xi1> -> vector<8x[4]x2x3xf32>
395
396
func.func @xfer_read_minor_identitiy_bcast_dims_masked (
396
397
%mem: memref <?x?x?x?xf32 >,
397
- %dim: index ,
398
+ %mask: vector <[ 4 ]x 3 x i1 > ,
398
399
%idx: index ) -> vector <8 x[4 ]x2 x3 xf32 > {
399
400
400
401
%pad = arith.constant 0.000000e+00 : f32
401
- %mask = vector.create_mask %dim , %dim: vector <[4 ]x3 xi1 >
402
402
403
403
%res = vector.mask %mask {
404
404
vector.transfer_read %mem [%idx , %idx , %idx , %idx ], %pad {
0 commit comments