@@ -1240,8 +1240,8 @@ module attributes {transform.with_named_sequence} {
1240
1240
1241
1241
// -----
1242
1242
1243
- // CHECK-LABEL: func @red_max_2d (
1244
- func.func @red_max_2d (%arg0: tensor <4 x4 xf32 >) -> tensor <4 xf32 > {
1243
+ // CHECK-LABEL: func @red_maximumf_2d (
1244
+ func.func @red_maximumf_2d (%arg0: tensor <4 x4 xf32 >) -> tensor <4 xf32 > {
1245
1245
// CHECK: %[[CMINF:.+]] = arith.constant dense<-3.402820e+38> : vector<4xf32>
1246
1246
// CHECK: tensor.empty() : tensor<4xf32>
1247
1247
// CHECK: vector.multi_reduction <maximumf>, {{.*}}, %[[CMINF]] [1] : vector<4x4xf32> to vector<4xf32>
@@ -1272,8 +1272,40 @@ module attributes {transform.with_named_sequence} {
1272
1272
1273
1273
// -----
1274
1274
1275
- // CHECK-LABEL: func @red_min_2d(
1276
- func.func @red_min_2d (%arg0: tensor <4 x4 xf32 >) -> tensor <4 xf32 > {
1275
+ // CHECK-LABEL: func @red_maxnumf_2d(
1276
+ func.func @red_maxnumf_2d (%arg0: tensor <4 x4 xf32 >) -> tensor <4 xf32 > {
1277
+ // CHECK: %[[CMINF:.+]] = arith.constant dense<-3.402820e+38> : vector<4xf32>
1278
+ // CHECK: tensor.empty() : tensor<4xf32>
1279
+ // CHECK: vector.multi_reduction <maxnumf>, {{.*}}, %[[CMINF]] [1] : vector<4x4xf32> to vector<4xf32>
1280
+ // CHECK: vector.transfer_write {{.*}} : vector<4xf32>, tensor<4xf32>
1281
+ %ident = arith.constant -3.40282e+38 : f32
1282
+ %init = tensor.empty () : tensor <4 xf32 >
1283
+ %fill = linalg.fill ins (%ident : f32 ) outs (%init : tensor <4 xf32 >) -> tensor <4 xf32 >
1284
+ %red = linalg.generic {index ing_maps = [affine_map <(d0 , d1 ) -> (d0 , d1 )>,
1285
+ affine_map <(d0 , d1 ) -> (d0 )>],
1286
+ iterator_types = [" parallel" , " reduction" ]}
1287
+ ins (%arg0 : tensor <4 x4 xf32 >) outs (%fill : tensor <4 xf32 >) {
1288
+ ^bb0 (%in0: f32 , %out0: f32 ):
1289
+ %max = arith.maxnumf %in0 , %out0 : f32
1290
+ linalg.yield %max : f32
1291
+ } -> tensor <4 xf32 >
1292
+ return %red : tensor <4 xf32 >
1293
+ }
1294
+
1295
+
1296
+ module attributes {transform.with_named_sequence } {
1297
+ transform.named_sequence @__transform_main (%arg1: !transform.any_op {transform.readonly }) {
1298
+ %3 = transform.structured.match ops {[" linalg.generic" ]} in %arg1 : (!transform.any_op ) -> !transform.any_op
1299
+ %4 = transform.get_parent_op %3 {isolated_from_above } : (!transform.any_op ) -> !transform.any_op
1300
+ %5 = transform.structured.vectorize_children_and_apply_patterns %4 { vectorize_padding } : (!transform.any_op ) -> !transform.any_op
1301
+ transform.yield
1302
+ }
1303
+ }
1304
+
1305
+ // -----
1306
+
1307
+ // CHECK-LABEL: func @red_minimumf_2d(
1308
+ func.func @red_minimumf_2d (%arg0: tensor <4 x4 xf32 >) -> tensor <4 xf32 > {
1277
1309
// CHECK: %[[CMAXF:.+]] = arith.constant dense<3.402820e+38> : vector<4xf32>
1278
1310
// CHECK: tensor.empty() : tensor<4xf32>
1279
1311
// CHECK: vector.transfer_read {{.*}} : tensor<4x4xf32>, vector<4x4xf32>
@@ -1294,6 +1326,39 @@ func.func @red_min_2d(%arg0: tensor<4x4xf32>) -> tensor<4xf32> {
1294
1326
}
1295
1327
1296
1328
1329
+ module attributes {transform.with_named_sequence } {
1330
+ transform.named_sequence @__transform_main (%arg1: !transform.any_op {transform.readonly }) {
1331
+ %3 = transform.structured.match ops {[" linalg.generic" ]} in %arg1 : (!transform.any_op ) -> !transform.any_op
1332
+ %4 = transform.get_parent_op %3 {isolated_from_above } : (!transform.any_op ) -> !transform.any_op
1333
+ %5 = transform.structured.vectorize_children_and_apply_patterns %4 : (!transform.any_op ) -> !transform.any_op
1334
+ transform.yield
1335
+ }
1336
+ }
1337
+
1338
+ // -----
1339
+
1340
+ // CHECK-LABEL: func @red_minnumf_2d(
1341
+ func.func @red_minnumf_2d (%arg0: tensor <4 x4 xf32 >) -> tensor <4 xf32 > {
1342
+ // CHECK: %[[CMAXF:.+]] = arith.constant dense<3.402820e+38> : vector<4xf32>
1343
+ // CHECK: tensor.empty() : tensor<4xf32>
1344
+ // CHECK: vector.transfer_read {{.*}} : tensor<4x4xf32>, vector<4x4xf32>
1345
+ // CHECK: vector.multi_reduction <minnumf>, {{.*}}, %[[CMAXF]] [1] : vector<4x4xf32> to vector<4xf32>
1346
+ // CHECK: vector.transfer_write {{.*}} : vector<4xf32>, tensor<4xf32>
1347
+ %maxf32 = arith.constant 3.40282e+38 : f32
1348
+ %init = tensor.empty () : tensor <4 xf32 >
1349
+ %fill = linalg.fill ins (%maxf32 : f32 ) outs (%init : tensor <4 xf32 >) -> tensor <4 xf32 >
1350
+ %red = linalg.generic {index ing_maps = [affine_map <(d0 , d1 ) -> (d0 , d1 )>,
1351
+ affine_map <(d0 , d1 ) -> (d0 )>],
1352
+ iterator_types = [" parallel" , " reduction" ]}
1353
+ ins (%arg0 : tensor <4 x4 xf32 >) outs (%fill : tensor <4 xf32 >) {
1354
+ ^bb0 (%in0: f32 , %out0: f32 ):
1355
+ %min = arith.minnumf %out0 , %in0 : f32
1356
+ linalg.yield %min : f32
1357
+ } -> tensor <4 xf32 >
1358
+ return %red : tensor <4 xf32 >
1359
+ }
1360
+
1361
+
1297
1362
module attributes {transform.with_named_sequence } {
1298
1363
transform.named_sequence @__transform_main (%arg1: !transform.any_op {transform.readonly }) {
1299
1364
%3 = transform.structured.match ops {[" linalg.generic" ]} in %arg1 : (!transform.any_op ) -> !transform.any_op
0 commit comments