Lines Matching refs:memref

3 // This file tests whether the memref type having non-trivial map layouts
8 %A = memref.alloc() : memref<64x256xf32, affine_map<(d0, d1) -> (d1, d0)>>
11 %1 = affine.load %A[%i, %j] : memref<64x256xf32, affine_map<(d0, d1) -> (d1, d0)>>
15 memref.dealloc %A : memref<64x256xf32, affine_map<(d0, d1) -> (d1, d0)>>
18 // The old memref alloc should disappear.
19 // CHECK-NOT: memref<64x256xf32>
20 // CHECK: [[MEM:%[0-9]+]] = memref.alloc() : memref<256x64xf32>
23 // CHECK-NEXT: affine.load [[MEM]][%[[J]], %[[I]]] : memref<256x64xf32>
27 // CHECK-NEXT: memref.dealloc [[MEM]]
32 // CHECK-NEXT: memref.alloc() : memref<65xf32>
33 %A = memref.alloc() : memref<64xf32, affine_map<(d0) -> (d0 + 1)>>
34 // CHECK-NEXT: affine.load %{{.*}}[symbol(%arg0) + 1] : memref<65xf32>
35 affine.load %A[%idx] : memref<64xf32, affine_map<(d0) -> (d0 + 1)>>
37 %1 = affine.load %A[%i] : memref<64xf32, affine_map<(d0) -> (d0 + 1)>>
39 // CHECK: %{{.*}} = affine.load %{{.*}}[%arg{{.*}} + 1] : memref<65xf32>
46 // CHECK-NOT: memref<64x128x256xf32,
47 %A = memref.alloc() : memref<64x128x256xf32, affine_map<(d0, d1, d2) -> (d2, d0, d1)>>
54 … %1 = affine.load %A[%i, %j, %k] : memref<64x128x256xf32, affine_map<(d0, d1, d2) -> (d2, d0, d1)>>
55 // CHECK: %{{.*}} = affine.load %{{.*}}[%[[K]], %[[I]], %[[J]]] : memref<256x64x128xf32>
65 %A = memref.alloc() : memref<64x128xf32, affine_map<(d0, d1) -> (d0, -d1 - 10)>>
66 // CHECK: %{{.*}} = memref.alloc() : memref<64x128xf32,
73 // CHECK: memref.alloc() : memref<8x32x8x16xf32>
74 …%A = memref.alloc() : memref<64x512xf32, affine_map<(d0, d1) -> (d0 floordiv 8, d1 floordiv 16, d0…
76 …%1 = affine.load %A[%idx, %idx] : memref<64x512xf32, affine_map<(d0, d1) -> (d0 floordiv 8, d1 flo…
84 %A = memref.alloc() : memref<64x128xf32, affine_map<(d0, d1) -> (2*d0, 4*d1)>>
89 // CHECK: affine.load %{{.*}}[%[[IV0]] * 2, %[[IV1]] * 4] : memref<127x509xf32>
90 %1 = affine.load %A[%i, %j] : memref<64x128xf32, affine_map<(d0, d1) -> (2*d0, 4*d1)>>
100 %A = memref.alloc() : memref<2x5xf32, affine_map<(d0, d1) -> (3*d0 + 17*d1)>>
105 // CHECK: affine.load %{{.*}}[%[[IV0]] * 3 + %[[IV1]] * 17] : memref<72xf32>
106 %1 = affine.load %A[%i, %j] : memref<2x5xf32, affine_map<(d0, d1) -> (3*d0 + 17*d1)>>
117 // CHECK: memref.alloc() : memref<100xf32>
118 %A = memref.alloc()[%s] : memref<10x10xf32, affine_map<(d0,d1)[s0] -> (10*d0 + d1)>>
121 // CHECK: affine.load %{{.*}}[%{{.*}} * 10 + %{{.*}}] : memref<100xf32>
122 %1 = affine.load %A[%i, %j] : memref<10x10xf32, affine_map<(d0,d1)[s0] -> (10*d0 + d1)>>
132 …%A = memref.alloc()[%s0, %s1] : memref<256x1024xf32, affine_map<(d0, d1)[s0, s1] -> (d0*s0 + d1*s1…
135 // CHECK: memref<256x1024xf32, #map{{[0-9]+}}>
136 affine.load %A[%i, %j] : memref<256x1024xf32, affine_map<(d0, d1)[s0, s1] -> (d0*s0 + d1*s1)>>
144 …%A = memref.alloc() {alignment = 32 : i64}: memref<64x128x256xf32, affine_map<(d0, d1, d2) -> (d2,…
145 // CHECK-NEXT: memref.alloc() {alignment = 32 : i64} : memref<256x64x128xf32>
151 // Following test cases check the inter-procedural memref normalization.
155 …-SAME: (%[[A:arg[0-9]+]]: memref<4x4xf64>, %[[B:arg[0-9]+]]: f64, %[[C:arg[0-9]+]]: memref<2x4xf6…
156 func.func @multiple_argument_type(%A: memref<16xf64, #tile>, %B: f64, %C: memref<8xf64, #tile>, %D:…
157 %a = affine.load %A[0] : memref<16xf64, #tile>
159 affine.store %p, %A[10] : memref<16xf64, #tile>
160 call @single_argument_type(%C): (memref<8xf64, #tile>) -> ()
164 // CHECK: %[[a:[0-9]+]] = affine.load %[[A]][0, 0] : memref<4x4xf64>
166 // CHECK: affine.store %[[p]], %[[A]][2, 2] : memref<4x4xf64>
167 // CHECK: call @single_argument_type(%[[C]]) : (memref<2x4xf64>) -> ()
170 // Test case 2: Check normalization for single memref argument in a function.
172 // CHECK-SAME: (%[[C:arg[0-9]+]]: memref<2x4xf64>)
173 func.func @single_argument_type(%C : memref<8xf64, #tile>) {
174 %a = memref.alloc(): memref<8xf64, #tile>
175 %b = memref.alloc(): memref<16xf64, #tile>
177 %e = memref.alloc(): memref<24xf64>
178 call @single_argument_type(%a): (memref<8xf64, #tile>) -> ()
179 call @single_argument_type(%C): (memref<8xf64, #tile>) -> ()
180 …call @multiple_argument_type(%b, %d, %a, %e): (memref<16xf64, #tile>, f64, memref<8xf64, #tile>, m…
184 // CHECK: %[[a:[0-9]+]] = memref.alloc() : memref<2x4xf64>
185 // CHECK: %[[b:[0-9]+]] = memref.alloc() : memref<4x4xf64>
187 // CHECK: %[[e:[0-9]+]] = memref.alloc() : memref<24xf64>
188 // CHECK: call @single_argument_type(%[[a]]) : (memref<2x4xf64>) -> ()
189 // CHECK: call @single_argument_type(%[[C]]) : (memref<2x4xf64>) -> ()
190 …ltiple_argument_type(%[[b]], %cst, %[[a]], %[[e]]) : (memref<4x4xf64>, f64, memref<2x4xf64>, memre…
192 // Test case 3: Check function returning any other type except memref.
194 // CHECK-SAME: (%[[C:arg[0-9]+]]: memref<2x4xf64>) -> i1
195 func.func @non_memref_ret(%A: memref<8xf64, #tile>) -> i1 {
200 // Test cases here onwards deal with normalization of memref in function signature, caller site.
202 // Test case 4: Check successful memref normalization in case of inter/intra-recursive calls.
204 // CHECK-SAME: (%[[A:arg[0-9]+]]: memref<4x4xf64>, %[[B:arg[0-9]+]]: f64, %[[C:arg[0-9]+]]: memref<…
205 func.func @ret_multiple_argument_type(%A: memref<16xf64, #tile>, %B: f64, %C: memref<8xf64, #tile>)…
206 %a = affine.load %A[0] : memref<16xf64, #tile>
211 …1, %res2 = call @ret_single_argument_type(%C) : (memref<8xf64, #tile>) -> (memref<16xf64, #tile>,
212 return %res2, %p: memref<8xf64, #tile>, f64
214 return %C, %p: memref<8xf64, #tile>, f64
217 // CHECK: %[[a:[0-9]+]] = affine.load %[[A]][0, 0] : memref<4x4xf64>
222 …0-9]+]]:2 = call @ret_single_argument_type(%[[C]]) : (memref<2x4xf64>) -> (memref<4x4xf64>, memref
223 // CHECK: return %[[res]]#1, %[[p]] : memref<2x4xf64>, f64
225 // CHECK: return %{{.*}}, %{{.*}} : memref<2x4xf64>, f64
228 // CHECK-SAME: (%[[C:arg[0-9]+]]: memref<2x4xf64>) -> (memref<4x4xf64>, memref<2x4xf64>)
229 func.func @ret_single_argument_type(%C: memref<8xf64, #tile>) -> (memref<16xf64, #tile>, memref<8xf…
230 %a = memref.alloc() : memref<8xf64, #tile>
231 %b = memref.alloc() : memref<16xf64, #tile>
233 …call @ret_single_argument_type(%a) : (memref<8xf64, #tile>) -> (memref<16xf64, #tile>, memref<8xf6…
234 …call @ret_single_argument_type(%C) : (memref<8xf64, #tile>) -> (memref<16xf64, #tile>, memref<8xf6…
235 …ll @ret_multiple_argument_type(%b, %d, %a) : (memref<16xf64, #tile>, f64, memref<8xf64, #tile>) ->…
236 …%res4 = call @ret_single_argument_type(%res1) : (memref<8xf64, #tile>) -> (memref<16xf64, #tile>,
237 return %b, %a: memref<16xf64, #tile>, memref<8xf64, #tile>
240 // CHECK: %[[a:[0-9]+]] = memref.alloc() : memref<2x4xf64>
241 // CHECK: %[[b:[0-9]+]] = memref.alloc() : memref<4x4xf64>
243 …0-9]+]]:2 = call @ret_single_argument_type(%[[a]]) : (memref<2x4xf64>) -> (memref<4x4xf64>, memref
244 …0-9]+]]:2 = call @ret_single_argument_type(%[[C]]) : (memref<2x4xf64>) -> (memref<4x4xf64>, memref
245 …ret_multiple_argument_type(%[[b]], %cst, %[[a]]) : (memref<4x4xf64>, f64, memref<2x4xf64>) -> (mem…
246 …]]:2 = call @ret_single_argument_type(%[[resC]]#0) : (memref<2x4xf64>) -> (memref<4x4xf64>, memref
247 // CHECK: return %{{.*}}, %{{.*}} : memref<4x4xf64>, memref<2x4xf64>
251 // CHECK-SAME: (%[[A:arg[0-9]+]]: memref<2x4xf64>)
252 func.func @func_A(%A: memref<8xf64, #tile>) {
253 call @func_B(%A) : (memref<8xf64, #tile>) -> ()
256 // CHECK: call @func_B(%[[A]]) : (memref<2x4xf64>) -> ()
259 // CHECK-SAME: (%[[A:arg[0-9]+]]: memref<2x4xf64>)
260 func.func @func_B(%A: memref<8xf64, #tile>) {
261 call @func_C(%A) : (memref<8xf64, #tile>) -> ()
264 // CHECK: call @func_C(%[[A]]) : (memref<2x4xf64>) -> ()
267 // CHECK-SAME: (%[[A:arg[0-9]+]]: memref<2x4xf64>)
268 func.func @func_C(%A: memref<8xf64, #tile>) {
274 // CHECK-SAME: (%[[A:arg[0-9]+]]: memref<8xf64, #map{{[0-9]+}}>)
275 func.func @some_func_A(%A: memref<8xf64, #tile>) {
276 call @some_func_B(%A) : (memref<8xf64, #tile>) -> ()
279 // CHECK: call @some_func_B(%[[A]]) : (memref<8xf64, #map{{[0-9]+}}>) -> ()
282 // CHECK-SAME: (%[[A:arg[0-9]+]]: memref<8xf64, #map{{[0-9]+}}>)
283 func.func @some_func_B(%A: memref<8xf64, #tile>) {
284 "test.test"(%A) : (memref<8xf64, #tile>) -> ()
285 call @some_func_C(%A) : (memref<8xf64, #tile>) -> ()
288 // CHECK: call @some_func_C(%[[A]]) : (memref<8xf64, #map{{[0-9]+}}>) -> ()
291 // CHECK-SAME: (%[[A:arg[0-9]+]]: memref<8xf64, #map{{[0-9]+}}>)
292 func.func @some_func_C(%A: memref<8xf64, #tile>) {
298 // CHECK-SAME: (memref<4x4xf64>)
299 func.func private @external_func_A(memref<16xf64, #tile>) -> ()
302 // CHECK-SAME: (memref<4x4xf64>, f64) -> memref<2x4xf64>
303 func.func private @external_func_B(memref<16xf64, #tile>, f64) -> (memref<8xf64, #tile>)
307 %a = memref.alloc() : memref<16xf64, #tile>
308 call @external_func_A(%a) : (memref<16xf64, #tile>) -> ()
311 // CHECK: %[[a:[0-9]+]] = memref.alloc() : memref<4x4xf64>
312 // CHECK: call @external_func_A(%[[a]]) : (memref<4x4xf64>) -> ()
315 // CHECK-SAME: (%[[A:arg[0-9]+]]: memref<4x4xf64>, %[[B:arg[0-9]+]]: f64) -> memref<2x4xf64>
316 func.func @use_value_of_external(%A: memref<16xf64, #tile>, %B: f64) -> (memref<8xf64, #tile>) {
317 %res = call @external_func_B(%A, %B) : (memref<16xf64, #tile>, f64) -> (memref<8xf64, #tile>)
318 return %res : memref<8xf64, #tile>
320 …: %[[res:[0-9]+]] = call @external_func_B(%[[A]], %[[B]]) : (memref<4x4xf64>, f64) -> memref<2x4xf…
321 // CHECK: return %{{.*}} : memref<2x4xf64>
324 func.func @affine_parallel_norm() -> memref<8xf32, #tile> {
326 %a = memref.alloc() : memref<8xf32, #tile>
327 // CHECK: affine.parallel (%{{.*}}) = (0) to (8) reduce ("assign") -> (memref<2x4xf32>)
328 %1 = affine.parallel (%i) = (0) to (8) reduce ("assign") -> memref<8xf32, #tile> {
329 affine.store %c, %a[%i] : memref<8xf32, #tile>
330 // CHECK: affine.yield %{{.*}} : memref<2x4xf32>
331 affine.yield %a : memref<8xf32, #tile>
333 return %1 : memref<8xf32, #tile>