Nicolas Vasilache | 11fb8d0 | 2022-03-21 20:33:30 +0100 | [diff] [blame^] | 1 | // RUN: iree-dialects-opt -linalg-transform-expert-expansion -split-input-file %s | FileCheck %s --check-prefix=EXPAND |
| 2 | // RUN: iree-dialects-opt -linalg-transform-expert-expansion -linalg-interp-transforms -split-input-file %s | FileCheck %s |
| 3 | |
| 4 | // CHECK-LABEL: func @matmul_tensors |
| 5 | // CHECK-NOT: linalg |
| 6 | // CHECK: llvm |
| 7 | func @matmul_tensors( |
| 8 | %arg0: tensor<128x128xf32>, %arg1: tensor<128x128xf32>, %arg2: tensor<128x128xf32> { linalg.inplaceable = true}) |
| 9 | -> tensor<128x128xf32> { |
| 10 | %0 = linalg.matmul ins(%arg0, %arg1: tensor<128x128xf32>, tensor<128x128xf32>) |
| 11 | outs(%arg2: tensor<128x128xf32>) |
| 12 | -> tensor<128x128xf32> |
| 13 | |
| 14 | return %0 : tensor<128x128xf32> |
| 15 | } |
| 16 | |
| 17 | pdl.pattern @pdl_target : benefit(1) { |
| 18 | %args = operands |
| 19 | %results = types |
| 20 | %0 = operation "linalg.matmul"(%args : !pdl.range<value>) -> (%results : !pdl.range<type>) |
| 21 | apply_native_constraint "nestedInFunc"[@matmul_tensors](%0 : !pdl.operation) |
| 22 | // TODO: we don't want this, but it is the required terminator for pdl.pattern |
| 23 | rewrite %0 with "iree_linalg_transform.apply" |
| 24 | } |
| 25 | |
| 26 | iree_linalg_transform.sequence { |
| 27 | // This should match the strategy below. |
| 28 | // EXPAND-NOT: expert apply |
| 29 | // EXPAND: %[[OP:.*]] = match @pdl_target |
| 30 | // EXPAND: %[[HANDLE:.*]] = tile %[[OP]] {sizes = [4, 4, 4]} |
| 31 | // EXPAND: %[[HANDLE2:.*]] = vectorize %[[HANDLE]] {vectorize_padding = true} |
| 32 | // EXPAND: bufferize |
| 33 | // EXPAND: lower_vectors {multireduction_lowering = "innerreduce"} |
| 34 | // EXPAND: lower_to_llvm |
| 35 | %0 = match @pdl_target |
| 36 | expert apply "single_tiling" to %0 |
| 37 | { |
| 38 | tile_sizes = [4, 4, 4], |
| 39 | vectorize_padding = true, |
| 40 | multireduction_lowering = "innerreduce" |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | // CHECK-NOT: @strategies |
| 45 | // EXPAND-NOT: @strategies |
| 46 | module @strategies { |
| 47 | pdl.pattern @single_tiling_matcher : benefit(1) { |
| 48 | %tile_sizes = attribute |
| 49 | %vectorize_padding = attribute |
| 50 | %multireduction_lowering = attribute |
| 51 | %name = attribute : "single_tiling" |
| 52 | %type = type : !pdl.operation |
| 53 | %target = operand : %type |
| 54 | %transformed = type |
| 55 | %root = operation "iree_linalg_transform.expert"(%target : !pdl.value) { |
| 56 | "expertName" = %name, |
| 57 | "tile_sizes" = %tile_sizes, |
| 58 | "vectorize_padding" = %vectorize_padding, |
| 59 | "multireduction_lowering" = %multireduction_lowering |
| 60 | } -> (%transformed : !pdl.type) |
| 61 | |
| 62 | rewrite %root { |
| 63 | %tile = operation "iree_linalg_transform.tile"(%target : !pdl.value) { |
| 64 | "sizes" = %tile_sizes |
| 65 | } -> (%transformed : !pdl.type) |
| 66 | %handle = result 0 of %tile |
| 67 | |
| 68 | %vectorize = operation "iree_linalg_transform.vectorize"(%handle : !pdl.value) { |
| 69 | "vectorize_padding" = %vectorize_padding |
| 70 | } -> (%transformed : !pdl.type) |
| 71 | %handle2 = result 0 of %vectorize |
| 72 | |
| 73 | %bufferize = operation "iree_linalg_transform.bufferize" |
| 74 | %lower_vectors = operation "iree_linalg_transform.lower_vectors" { |
| 75 | "multireduction_lowering" = %multireduction_lowering |
| 76 | } |
| 77 | %lower_to_llvm = operation "iree_linalg_transform.lower_to_llvm" |
| 78 | |
| 79 | replace %root with (%handle2 : !pdl.value) |
| 80 | } |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | // ----- |
| 85 | |
| 86 | // CHECK-LABEL: func @matmul_tensors2 |
| 87 | // CHECK-NOT: linalg |
| 88 | // CHECK: llvm |
| 89 | func @matmul_tensors2( |
| 90 | %arg0: tensor<128x128xf32>, %arg1: tensor<128x128xf32>, %arg2: tensor<128x128xf32> { linalg.inplaceable = true}) |
| 91 | -> tensor<128x128xf32> { |
| 92 | %0 = linalg.matmul ins(%arg0, %arg1: tensor<128x128xf32>, tensor<128x128xf32>) |
| 93 | outs(%arg2: tensor<128x128xf32>) |
| 94 | -> tensor<128x128xf32> |
| 95 | |
| 96 | return %0 : tensor<128x128xf32> |
| 97 | } |
| 98 | |
| 99 | pdl.pattern @pdl_target2 : benefit(1) { |
| 100 | %args = pdl.operands |
| 101 | %results = pdl.types |
| 102 | %0 = pdl.operation "linalg.matmul"(%args : !pdl.range<value>) -> (%results : !pdl.range<type>) |
| 103 | pdl.apply_native_constraint "nestedInFunc"[@matmul_tensors2](%0 : !pdl.operation) |
| 104 | // TODO: we don't want this, but it is the required terminator for pdl.pattern |
| 105 | pdl.rewrite %0 with "iree_linalg_transform.apply" |
| 106 | } |
| 107 | |
| 108 | iree_linalg_transform.sequence { |
| 109 | // This should match the strategy below. |
| 110 | // EXPAND-NOT: expert apply |
| 111 | // EXPAND: %[[OP:.*]] = match @pdl_target2 |
| 112 | // EXPAND: %[[HANDLE:.*]] = tile %[[OP]] {sizes = [32, 8, 8]} |
| 113 | // EXPAND: %[[HANDLE2:.*]] = tile %[[HANDLE]] {sizes = [4, 4, 4]} |
| 114 | // EXPAND: %[[HANDLE3:.*]] = vectorize %[[HANDLE2]] {vectorize_padding = false} |
| 115 | // EXPAND: bufferize |
| 116 | // EXPAND: lower_vectors {multireduction_lowering = "innerparallel"} |
| 117 | // EXPAND: lower_to_llvm |
| 118 | %0 = match @pdl_target2 |
| 119 | %1 = tile %0 {sizes = [32, 8, 8]} |
| 120 | expert apply "single_tiling" to %1 |
| 121 | { |
| 122 | tile_sizes = [4, 4, 4], |
| 123 | vectorize_padding = false, |
| 124 | multireduction_lowering = "innerparallel" |
| 125 | } |
| 126 | } |
| 127 | |
| 128 | module @strategies { |
| 129 | pdl.pattern @single_tiling_operand : benefit(1) { |
| 130 | %tile_sizes = attribute |
| 131 | %vectorize_padding = attribute |
| 132 | %multireduction_lowering = attribute |
| 133 | %name = attribute : "single_tiling" |
| 134 | %type = type : !pdl.operation |
| 135 | %target = operand : %type |
| 136 | %transformed = type |
| 137 | %root = operation "iree_linalg_transform.expert"(%target : !pdl.value) { |
| 138 | "expertName" = %name, |
| 139 | "tile_sizes" = %tile_sizes, |
| 140 | "vectorize_padding" = %vectorize_padding, |
| 141 | "multireduction_lowering" = %multireduction_lowering |
| 142 | } -> (%transformed : !pdl.type) |
| 143 | |
| 144 | rewrite %root { |
| 145 | %tile = operation "iree_linalg_transform.tile"(%target : !pdl.value) { |
| 146 | "sizes" = %tile_sizes |
| 147 | } -> (%transformed : !pdl.type) |
| 148 | %handle = result 0 of %tile |
| 149 | |
| 150 | %vectorize = operation "iree_linalg_transform.vectorize"(%handle : !pdl.value) { |
| 151 | "vectorize_padding" = %vectorize_padding |
| 152 | } -> (%transformed : !pdl.type) |
| 153 | %handle2 = result 0 of %vectorize |
| 154 | |
| 155 | %bufferize = operation "iree_linalg_transform.bufferize" |
| 156 | %lower_vectors = operation "iree_linalg_transform.lower_vectors" { |
| 157 | "multireduction_lowering" = %multireduction_lowering |
| 158 | } |
| 159 | %lower_to_llvm = operation "iree_linalg_transform.lower_to_llvm" |
| 160 | |
| 161 | replace %root with (%handle2 : !pdl.value) |
| 162 | } |
| 163 | } |
| 164 | } |