diff options
author | Nicolas Vasilache <ntv@google.com> | 2020-09-21 15:30:42 -0400 |
---|---|---|
committer | Nicolas Vasilache <ntv@google.com> | 2020-09-22 04:13:22 -0400 |
commit | ed229132f1c4ea2ba0644fc345d8279e47a00565 (patch) | |
tree | ddd4c9f341131c15e1c2d33c8c7181cb5142e313 /mlir/test/Transforms | |
parent | 0304c6da1006f6b472a1e5c1d8776a9f35c9439d (diff) | |
download | llvm-ed229132f1c4ea2ba0644fc345d8279e47a00565.zip llvm-ed229132f1c4ea2ba0644fc345d8279e47a00565.tar.gz llvm-ed229132f1c4ea2ba0644fc345d8279e47a00565.tar.bz2 |
[mlir][Linalg] Uniformize linalg.generic with named ops.
This revision allows representing a reduction at the level of linalg on tensors for generic ops by uniformizing with the named ops approach.
Diffstat (limited to 'mlir/test/Transforms')
4 files changed, 180 insertions, 165 deletions
diff --git a/mlir/test/Transforms/buffer-placement-preparation-allowed-memref-results.mlir b/mlir/test/Transforms/buffer-placement-preparation-allowed-memref-results.mlir index e1dacdf..b9b5d88 100644 --- a/mlir/test/Transforms/buffer-placement-preparation-allowed-memref-results.mlir +++ b/mlir/test/Transforms/buffer-placement-preparation-allowed-memref-results.mlir @@ -19,15 +19,13 @@ func @void_function_signature_conversion(%arg0: tensor<4x8xf32>) { func @complex_signature_conversion(%arg0: tensor<5xf32>, %arg1: memref<10xf32>, %arg2: i1, %arg3: f16) -> (i1, tensor<5xf32>, memref<10xf32>, memref<15xf32>, f16) { %0 = alloc() : memref<15xf32> %1 = linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"] - } %arg0 { + iterator_types = ["parallel"]} + ins(%arg0 : tensor<5xf32>) { ^bb0(%gen1_arg0: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: tensor<5xf32> -> tensor<5xf32> + } -> tensor<5xf32> return %arg2, %1, %arg1, %0, %arg3 : i1, tensor<5xf32>, memref<10xf32>, memref<15xf32>, f16 } // CHECK: (%[[ARG0:.*]]: memref<5xf32>, %[[ARG1:.*]]: memref<10xf32>, %[[ARG2:.*]]: i1, %[[ARG3:.*]]: f16) diff --git a/mlir/test/Transforms/buffer-placement-preparation.mlir b/mlir/test/Transforms/buffer-placement-preparation.mlir index b1cfdfd..4fcd225 100644 --- a/mlir/test/Transforms/buffer-placement-preparation.mlir +++ b/mlir/test/Transforms/buffer-placement-preparation.mlir @@ -17,11 +17,12 @@ func @func_signature_conversion(%arg0: tensor<4x8xf32>) { // CHECK-LABEL: func @memref_in_function_results func @memref_in_function_results(%arg0: tensor<5xf32>, %arg1: memref<10xf32>) -> (tensor<5xf32>, memref<10xf32>, memref<15xf32>) { %0 = alloc() : memref<15xf32> - %1 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg0 { + %1 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg0 : tensor<5xf32>) { ^bb0(%gen1_arg0: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: tensor<5xf32> -> tensor<5xf32> + } -> tensor<5xf32> return %1, %arg1, %0 : tensor<5xf32>, memref<10xf32>, memref<15xf32> } // CHECK: (%[[ARG0:.*]]: memref<5xf32>, %[[ARG1:.*]]: memref<10xf32>, %[[RESULT:.*]]: memref<5xf32>) @@ -97,23 +98,25 @@ func @func_and_block_signature_conversion(%arg0 : tensor<2xf32>, %cond : i1, %ar // CHECK-LABEL: func @compute_allocs_position_simple func @compute_allocs_position_simple(%cond: i1, %arg0: tensor<2xf32>) -> tensor<2xf32>{ - %0 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg0 { + %0 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg0 : tensor<2xf32>) { ^bb0(%gen1_arg0: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: tensor<2xf32> -> tensor<2xf32> - %1 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %0 { + } -> tensor<2xf32> + %1 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%0 : tensor<2xf32>) { ^bb0(%gen2_arg0: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: tensor<2xf32> -> tensor<2xf32> + } -> tensor<2xf32> return %1 : tensor<2xf32> } // CHECK: (%{{.*}}: {{.*}}, %[[ARG0:.*]]: memref<2xf32>, // CHECK-NEXT: %[[FIRST_ALLOC:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ARG0]], %[[FIRST_ALLOC]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ARG0]]{{.*}} outs(%[[FIRST_ALLOC]] // CHECK: %[[SECOND_ALLOC:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[FIRST_ALLOC]], %[[SECOND_ALLOC]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[FIRST_ALLOC]]{{.*}} outs(%[[SECOND_ALLOC]] // ----- @@ -123,78 +126,86 @@ func @compute_allocs_position_simple(%cond: i1, %arg0: tensor<2xf32>) -> tensor< // CHECK-LABEL: func @compute_allocs_position func @compute_allocs_position(%cond: i1, %arg0: tensor<2xf32>) -> tensor<2xf32>{ - %0 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg0 { + %0 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg0 : tensor<2xf32>) { ^bb0(%gen1_arg0: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: tensor<2xf32> -> tensor<2xf32> - %1 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %0 { + } -> tensor<2xf32> + %1 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%0 : tensor<2xf32>) { ^bb0(%gen2_arg0: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: tensor<2xf32> -> tensor<2xf32> + } -> tensor<2xf32> cond_br %cond, ^bb1(%arg0, %0: tensor<2xf32>, tensor<2xf32>), ^bb2(%0, %arg0: tensor<2xf32>, tensor<2xf32>) ^bb1(%arg1 : tensor<2xf32>, %arg2 : tensor<2xf32>): - %2 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg0 { + %2 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg0 : tensor<2xf32>) { ^bb0(%gen3_arg0: f32): %tmp3 = exp %gen3_arg0 : f32 linalg.yield %tmp3 : f32 - }: tensor<2xf32> -> tensor<2xf32> - %3 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %2 { + } -> tensor<2xf32> + %3 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%2 : tensor<2xf32>) { ^bb0(%gen4_arg0: f32): %tmp4 = exp %gen4_arg0 : f32 linalg.yield %tmp4 : f32 - }: tensor<2xf32> -> tensor<2xf32> + } -> tensor<2xf32> br ^exit(%arg1, %arg2 : tensor<2xf32>, tensor<2xf32>) ^bb2(%arg3 : tensor<2xf32>, %arg4 : tensor<2xf32>): - %4 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg0 { + %4 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg0 : tensor<2xf32>) { ^bb0(%gen5_arg0: f32): %tmp5 = exp %gen5_arg0 : f32 linalg.yield %tmp5 : f32 - }: tensor<2xf32> -> tensor<2xf32> - %5 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %4 { + } -> tensor<2xf32> + %5 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%4 : tensor<2xf32>) { ^bb0(%gen6_arg0: f32): %tmp6 = exp %gen6_arg0 : f32 linalg.yield %tmp6 : f32 - }: tensor<2xf32> -> tensor<2xf32> + } -> tensor<2xf32> br ^exit(%arg3, %arg4 : tensor<2xf32>, tensor<2xf32>) ^exit(%arg5 : tensor<2xf32>, %arg6 : tensor<2xf32>): - %6 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg0 { + %6 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg0 : tensor<2xf32>) { ^bb0(%gen7_arg0: f32): %tmp7 = exp %gen7_arg0 : f32 linalg.yield %tmp7 : f32 - }: tensor<2xf32> -> tensor<2xf32> - %7 = linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %6 { + } -> tensor<2xf32> + %7 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%6 : tensor<2xf32>) { ^bb0(%gen8_arg0: f32): %tmp8 = exp %gen8_arg0 : f32 linalg.yield %tmp8 : f32 - }: tensor<2xf32> -> tensor<2xf32> + } -> tensor<2xf32> return %7 : tensor<2xf32> } // CHECK: (%{{.*}}: {{.*}}, %[[ARG0:.*]]: memref<2xf32>, // CHECK-NEXT: %[[ALLOC0:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ARG0]], %[[ALLOC0]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ARG0]]{{.*}} outs(%[[ALLOC0]] // CHECK: %[[ALLOC1:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ALLOC0]], %[[ALLOC1]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ALLOC0]]{{.*}} outs(%[[ALLOC1]] // CHECK: cond_br %{{.*}}, ^[[BB0:.*]]({{.*}}), ^[[BB1:.*]]( // CHECK-NEXT: ^[[BB0]] // CHECK-NEXT: %[[ALLOC2:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ARG0]], %[[ALLOC2]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ARG0]]{{.*}} outs(%[[ALLOC2]] // CHECK: %[[ALLOC3:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ALLOC2]], %[[ALLOC3]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ALLOC2]]{{.*}} outs(%[[ALLOC3]] // CHECK: br ^[[EXIT:.*]]({{.*}}) // CHECK-NEXT: ^[[BB1]] // CHECK-NEXT: %[[ALLOC4:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ARG0]], %[[ALLOC4]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ARG0]]{{.*}} outs(%[[ALLOC4]] // CHECK: %[[ALLOC5:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ALLOC4]], %[[ALLOC5]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ALLOC4]]{{.*}} outs(%[[ALLOC5]] // CHECK: br ^[[EXIT]] // CHECK-NEXT: ^[[EXIT]] // CHECK-NEXT: %[[ALLOC6:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ARG0]], %[[ALLOC6]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ARG0]]{{.*}} outs(%[[ALLOC6]] // CHECK: %[[ALLOC7:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ALLOC6]], %[[ALLOC7]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ALLOC6]]{{.*}} outs(%[[ALLOC7]] // ----- @@ -211,16 +222,12 @@ func @compute_allocs_position(%cond: i1, %arg0: tensor<2xf32>) -> tensor<2xf32>{ // CHECK-LABEL: func @callee func @callee(%arg1: tensor<5xf32>) -> tensor<5xf32> { - %0 = linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, - indexing_maps = [#map0, #map0], - iterator_types = ["parallel"] - } %arg1 { + %0 = linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg1 : tensor<5xf32>) { ^bb0(%gen1_arg0: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: tensor<5xf32> -> tensor<5xf32> + } -> tensor<5xf32> return %0 : tensor<5xf32> } // CHECK: (%[[CALLEE_ARG:.*]]: memref<5xf32>, %[[CALLEE_RESULT:.*]]: memref<5xf32>) diff --git a/mlir/test/Transforms/buffer-placement.mlir b/mlir/test/Transforms/buffer-placement.mlir index e03f8c9..d8b7de3 100644 --- a/mlir/test/Transforms/buffer-placement.mlir +++ b/mlir/test/Transforms/buffer-placement.mlir @@ -24,14 +24,14 @@ func @condBranch(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { ^bb2: %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %0 { + iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } br ^bb3(%0 : memref<2xf32>) ^bb3(%1: memref<2xf32>): "linalg.copy"(%1, %arg2) : (memref<2xf32>, memref<2xf32>) -> () @@ -73,14 +73,14 @@ func @condBranchDynamicType( ^bb2(%0: index): %1 = alloc(%0) : memref<?xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %1 { + iterator_types = ["parallel"]} + ins(%arg1: memref<?xf32>) + outs(%1: memref<?xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<?xf32>, memref<?xf32> + } br ^bb3(%1 : memref<?xf32>) ^bb3(%2: memref<?xf32>): "linalg.copy"(%2, %arg2) : (memref<?xf32>, memref<?xf32>) -> () @@ -141,14 +141,14 @@ func @condBranchDynamicTypeNested( ^bb2(%0: index): %1 = alloc(%0) : memref<?xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %1 { + iterator_types = ["parallel"]} + ins(%arg1: memref<?xf32>) + outs(%1: memref<?xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<?xf32>, memref<?xf32> + } cond_br %arg0, ^bb3, ^bb4 ^bb3: br ^bb5(%1 : memref<?xf32>) @@ -224,14 +224,14 @@ func @criticalEdge(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { ^bb1: %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %0 { + iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } br ^bb2(%0 : memref<2xf32>) ^bb2(%1: memref<2xf32>): "linalg.copy"(%1, %arg2) : (memref<2xf32>, memref<2xf32>) -> () @@ -262,14 +262,14 @@ func @criticalEdge(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { func @invCriticalEdge(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %0 { + iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } cond_br %arg0, ^bb1, ^bb2(%arg1 : memref<2xf32>) ^bb1: br ^bb2(%0 : memref<2xf32>) @@ -300,14 +300,14 @@ func @invCriticalEdge(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { func @ifElse(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %0 { + iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } cond_br %arg0, ^bb1(%arg1, %0 : memref<2xf32>, memref<2xf32>), ^bb2(%0, %arg1 : memref<2xf32>, memref<2xf32>) @@ -318,14 +318,14 @@ func @ifElse(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { ^bb3(%5: memref<2xf32>, %6: memref<2xf32>): %7 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %5, %7 { + iterator_types = ["parallel"]} + ins(%5: memref<2xf32>) + outs(%7: memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } "linalg.copy"(%7, %arg2) : (memref<2xf32>, memref<2xf32>) -> () return } @@ -357,14 +357,14 @@ func @ifElse(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { func @ifElseNoUsers(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %0 { + iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } cond_br %arg0, ^bb1(%arg1, %0 : memref<2xf32>, memref<2xf32>), ^bb2(%0, %arg1 : memref<2xf32>, memref<2xf32>) @@ -401,14 +401,14 @@ func @ifElseNoUsers(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { func @ifElseNested(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %0 { + iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } cond_br %arg0, ^bb1(%arg1, %0 : memref<2xf32>, memref<2xf32>), ^bb2(%0, %arg1 : memref<2xf32>, memref<2xf32>) @@ -423,14 +423,14 @@ func @ifElseNested(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { ^bb5(%7: memref<2xf32>, %8: memref<2xf32>): %9 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %7, %9 { + iterator_types = ["parallel"]} + ins(%7: memref<2xf32>) + outs(%9: memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } "linalg.copy"(%9, %arg2) : (memref<2xf32>, memref<2xf32>) -> () return } @@ -456,32 +456,32 @@ func @ifElseNested(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { func @redundantOperations(%arg0: memref<2xf32>) { %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg0, %0 { + iterator_types = ["parallel"]} + ins(%arg0: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } %1 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %0, %1 { + iterator_types = ["parallel"]} + ins(%0: memref<2xf32>) + outs(%1: memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } return } // CHECK: (%[[ARG0:.*]]: {{.*}}) // CHECK-NEXT: %[[FIRST_ALLOC:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[ARG0]], %[[FIRST_ALLOC]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[ARG0]]{{.*}}outs(%[[FIRST_ALLOC]] // CHECK: %[[SECOND_ALLOC:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{.*}} %[[FIRST_ALLOC]], %[[SECOND_ALLOC]] +// CHECK-NEXT: linalg.generic {{.*}} ins(%[[FIRST_ALLOC]]{{.*}}outs(%[[SECOND_ALLOC]] // CHECK: dealloc // CHECK-NEXT: dealloc // CHECK-NEXT: return @@ -509,26 +509,26 @@ func @moving_alloc_and_inserting_missing_dealloc( ^bb1: %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg0, %0 { + iterator_types = ["parallel"]} + ins(%arg0: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } br ^exit(%0 : memref<2xf32>) ^bb2: %1 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg0, %1 { + iterator_types = ["parallel"]} + ins(%arg0: memref<2xf32>) + outs(%1: memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } br ^exit(%1 : memref<2xf32>) ^exit(%arg2: memref<2xf32>): "linalg.copy"(%arg2, %arg1) : (memref<2xf32>, memref<2xf32>) -> () @@ -567,14 +567,14 @@ func @moving_invalid_dealloc_op_complex( ^bb2: %1 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg0, %1 { + iterator_types = ["parallel"]} + ins(%arg0: memref<2xf32>) + outs(%1: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } dealloc %1 : memref<2xf32> br ^exit(%1 : memref<2xf32>) ^exit(%arg2: memref<2xf32>): @@ -599,14 +599,14 @@ func @inserting_missing_dealloc_simple( %arg1: memref<2xf32>) { %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg0, %0 { + iterator_types = ["parallel"]} + ins(%arg0: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } "linalg.copy"(%0, %arg1) : (memref<2xf32>, memref<2xf32>) -> () return } @@ -625,14 +625,14 @@ func @inserting_missing_dealloc_simple( func @moving_invalid_dealloc_op(%arg0 : memref<2xf32>, %arg1: memref<2xf32>) { %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg0, %0 { + iterator_types = ["parallel"]} + ins(%arg0: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } dealloc %0 : memref<2xf32> "linalg.copy"(%0, %arg1) : (memref<2xf32>, memref<2xf32>) -> () return @@ -659,17 +659,21 @@ func @nested_regions_and_cond_branch(%arg0: i1, %arg1: memref<2xf32>, %arg2: mem br ^bb3(%arg1 : memref<2xf32>) ^bb2: %0 = alloc() : memref<2xf32> - linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg1, %0 { + linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %1 = alloc() : memref<2xf32> - linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg1, %1 { + linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%1: memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } br ^bb3(%0 : memref<2xf32>) ^bb3(%1: memref<2xf32>): "linalg.copy"(%1, %arg2) : (memref<2xf32>, memref<2xf32>) -> () @@ -679,9 +683,9 @@ func @nested_regions_and_cond_branch(%arg0: i1, %arg1: memref<2xf32>, %arg2: mem // CHECK-NEXT: %[[GENERIC1_ALLOC:.*]] = alloc() // CHECK-NEXT: cond_br %[[cond]], ^[[BB1:.*]], ^[[BB2:.*]] // CHECK: ^[[BB2]]: -// CHECK-NEXT: linalg.generic {{{.*}}} %[[ARG1]], %[[GENERIC1_ALLOC]] +// CHECK-NEXT: linalg.generic {{{.*}}} ins(%[[ARG1]]{{.*}}outs(%[[GENERIC1_ALLOC]] // CHECK: %[[GENERIC2_ALLOC:.*]] = alloc() -// CHECK-NEXT: linalg.generic {{{.*}}} %[[ARG1]], %[[GENERIC2_ALLOC]] +// CHECK-NEXT: linalg.generic {{{.*}}} ins(%[[ARG1]]{{.*}}outs(%[[GENERIC2_ALLOC]] // CHECK: dealloc %[[GENERIC2_ALLOC]] // CHECK-NEXT: %{{.*}} = exp // CHECK: ^[[BB3:.*]]({{.*}}): @@ -701,11 +705,13 @@ func @nested_regions_and_cond_branch(%arg0: i1, %arg1: memref<2xf32>, %arg2: mem func @memref_in_function_results(%arg0: memref<5xf32>, %arg1: memref<10xf32>, %arg2: memref<5xf32>) -> (memref<10xf32>, memref<15xf32>) { %x = alloc() : memref<15xf32> %y = alloc() : memref<5xf32> - linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg0, %y { + linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg0: memref<5xf32>) + outs(%y: memref<5xf32>) { ^bb0(%arg3: f32, %arg4: f32): %2 = exp %arg3 : f32 linalg.yield %2 : f32 - }: memref<5xf32>, memref<5xf32> + } linalg.copy(%y, %arg2) : memref<5xf32>, memref<5xf32> return %arg1, %x : memref<10xf32>, memref<15xf32> } @@ -946,14 +952,14 @@ func @condBranchAlloca(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { ^bb2: %0 = alloca() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %0 { + iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } br ^bb3(%0 : memref<2xf32>) ^bb3(%1: memref<2xf32>): "linalg.copy"(%1, %arg2) : (memref<2xf32>, memref<2xf32>) -> () @@ -975,14 +981,14 @@ func @condBranchAlloca(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { func @ifElseAlloca(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { %0 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %0 { + iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } cond_br %arg0, ^bb1(%arg1, %0 : memref<2xf32>, memref<2xf32>), ^bb2(%0, %arg1 : memref<2xf32>, memref<2xf32>) @@ -993,14 +999,14 @@ func @ifElseAlloca(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { ^bb3(%5: memref<2xf32>, %6: memref<2xf32>): %7 = alloca() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %5, %7 { + iterator_types = ["parallel"]} + ins(%5: memref<2xf32>) + outs(%7: memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } "linalg.copy"(%7, %arg2) : (memref<2xf32>, memref<2xf32>) -> () return } @@ -1021,14 +1027,14 @@ func @ifElseAlloca(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { func @ifElseNestedAlloca(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) { %0 = alloca() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg1, %0 { + iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } cond_br %arg0, ^bb1(%arg1, %0 : memref<2xf32>, memref<2xf32>), ^bb2(%0, %arg1 : memref<2xf32>, memref<2xf32>) @@ -1043,14 +1049,14 @@ func @ifElseNestedAlloca(%arg0: i1, %arg1: memref<2xf32>, %arg2: memref<2xf32>) ^bb5(%7: memref<2xf32>, %8: memref<2xf32>): %9 = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %7, %9 { + iterator_types = ["parallel"]} + ins(%7: memref<2xf32>) + outs(%9: memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } "linalg.copy"(%9, %arg2) : (memref<2xf32>, memref<2xf32>) -> () return } @@ -1074,17 +1080,21 @@ func @nestedRegionsAndCondBranchAlloca(%arg0: i1, %arg1: memref<2xf32>, %arg2: m br ^bb3(%arg1 : memref<2xf32>) ^bb2: %0 = alloc() : memref<2xf32> - linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg1, %0 { + linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%0: memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %1 = alloca() : memref<2xf32> - linalg.generic {args_in = 1 : i64, args_out = 1 : i64, indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} %arg1, %1 { + linalg.generic {indexing_maps = [#map0, #map0], iterator_types = ["parallel"]} + ins(%arg1: memref<2xf32>) + outs(%1: memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } br ^bb3(%0 : memref<2xf32>) ^bb3(%1: memref<2xf32>): "linalg.copy"(%1, %arg2) : (memref<2xf32>, memref<2xf32>) -> () @@ -1094,9 +1104,9 @@ func @nestedRegionsAndCondBranchAlloca(%arg0: i1, %arg1: memref<2xf32>, %arg2: m // CHECK-NEXT: %[[ALLOC:.*]] = alloc() // CHECK-NEXT: cond_br %[[cond]], ^[[BB1:.*]], ^[[BB2:.*]] // CHECK: ^[[BB2]]: -// CHECK-NEXT: linalg.generic {{{.*}}} %[[ARG1]], %[[ALLOC]] +// CHECK-NEXT: linalg.generic {{{.*}}} ins(%[[ARG1]]{{.*}}outs(%[[ALLOC]] // CHECK: %[[ALLOCA:.*]] = alloca() -// CHECK-NEXT: linalg.generic {{{.*}}} %[[ARG1]], %[[ALLOCA]] +// CHECK-NEXT: linalg.generic {{{.*}}} ins(%[[ARG1]]{{.*}}outs(%[[ALLOCA]] // CHECK: %{{.*}} = exp // CHECK: ^[[BB3:.*]]({{.*}}): // CHECK: linalg.copy diff --git a/mlir/test/Transforms/copy-removal.mlir b/mlir/test/Transforms/copy-removal.mlir index a0d1193..1a8ea02 100644 --- a/mlir/test/Transforms/copy-removal.mlir +++ b/mlir/test/Transforms/copy-removal.mlir @@ -157,14 +157,14 @@ func @test_with_temp_usage_after_copy() -> memref<5xf32> { %temp = alloc() : memref<5xf32> linalg.copy(%ret, %temp) : memref<5xf32>, memref<5xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %temp, %res { + iterator_types = ["parallel"]} + ins(%temp : memref<5xf32>) + outs(%res : memref<5xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<5xf32>, memref<5xf32> + } dealloc %ret : memref<5xf32> return %temp : memref<5xf32> } @@ -231,18 +231,18 @@ func @test_ReuseCopyTargetAsSource(%arg0: memref<2xf32>, %result: memref<2xf32>) // CHECK-NOT: %{{.*}} = alloc %temp = alloc() : memref<2xf32> // CHECK-NEXT: linalg.generic - // CHECK-SAME: %[[ARG0]], %[[RES]] + // CHECK-SAME: ins(%[[ARG0]]{{.*}}outs(%[[RES]] // CHECK-NOT: linalg.copy(%{{.*}}, %[[RES]]) // CHECK-NOT: dealloc %{{.*}} linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg0, %temp { + iterator_types = ["parallel"]} + ins(%arg0 : memref<2xf32>) + outs(%temp : memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } "linalg.copy"(%temp, %result) : (memref<2xf32>, memref<2xf32>) -> () dealloc %temp : memref<2xf32> // CHECK: return @@ -261,23 +261,23 @@ func @test_ReuseCopyTargetAsSource(%arg0: memref<2xf32>){ %to = alloc() : memref<2xf32> %temp = alloc() : memref<2xf32> linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg0, %temp { + iterator_types = ["parallel"]} + ins(%arg0 : memref<2xf32>) + outs(%temp : memref<2xf32>) { ^bb0(%gen1_arg0: f32, %gen1_arg1: f32): %tmp1 = exp %gen1_arg0 : f32 linalg.yield %tmp1 : f32 - }: memref<2xf32>, memref<2xf32> + } linalg.generic { - args_in = 1 : i64, - args_out = 1 : i64, indexing_maps = [#map0, #map0], - iterator_types = ["parallel"]} %arg0, %to { + iterator_types = ["parallel"]} + ins(%arg0 : memref<2xf32>) + outs(%to : memref<2xf32>) { ^bb0(%gen2_arg0: f32, %gen2_arg1: f32): %tmp2 = exp %gen2_arg0 : f32 linalg.yield %tmp2 : f32 - }: memref<2xf32>, memref<2xf32> + } // CHECK: linalg.copy "linalg.copy"(%temp, %to) : (memref<2xf32>, memref<2xf32>) -> () dealloc %temp : memref<2xf32> |