blob: b5825ee5bffd72f99cf0b3708d22cf580e40e249 [file] [log] [blame]
Nicolas Vasilache11fb8d02022-03-21 20:33:30 +01001// 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
7func @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
17pdl.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
26iree_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
46module @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
89func @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
99pdl.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
108iree_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
128module @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}