1// RUN: mlir-opt -verify-diagnostics -convert-bufferization-to-memref -split-input-file %s | FileCheck %s
2
3// CHECK-LABEL: @conversion_static
4func.func @conversion_static(%arg0 : memref<2xf32>) -> memref<2xf32> {
5  %0 = bufferization.clone %arg0 : memref<2xf32> to memref<2xf32>
6  memref.dealloc %arg0 : memref<2xf32>
7  return %0 : memref<2xf32>
8}
9
10// CHECK:      %[[ALLOC:.*]] = memref.alloc
11// CHECK-NEXT: memref.copy %[[ARG:.*]], %[[ALLOC]]
12// CHECK-NEXT: memref.dealloc %[[ARG]]
13// CHECK-NEXT: return %[[ALLOC]]
14
15// -----
16
17// CHECK-LABEL: @conversion_dynamic
18func.func @conversion_dynamic(%arg0 : memref<?xf32>) -> memref<?xf32> {
19  %1 = bufferization.clone %arg0 : memref<?xf32> to memref<?xf32>
20  memref.dealloc %arg0 : memref<?xf32>
21  return %1 : memref<?xf32>
22}
23
24// CHECK:      %[[CONST:.*]] = arith.constant
25// CHECK-NEXT: %[[DIM:.*]] = memref.dim %[[ARG:.*]], %[[CONST]]
26// CHECK-NEXT: %[[ALLOC:.*]] = memref.alloc(%[[DIM]])
27// CHECK-NEXT: memref.copy %[[ARG]], %[[ALLOC]]
28// CHECK-NEXT: memref.dealloc %[[ARG]]
29// CHECK-NEXT: return %[[ALLOC]]
30
31// -----
32
33func.func @conversion_unknown(%arg0 : memref<*xf32>) -> memref<*xf32> {
34// expected-error@+1 {{failed to legalize operation 'bufferization.clone' that was explicitly marked illegal}}
35  %1 = bufferization.clone %arg0 : memref<*xf32> to memref<*xf32>
36  memref.dealloc %arg0 : memref<*xf32>
37  return %1 : memref<*xf32>
38}
39
40// -----
41
42// CHECK: #[[$MAP:.*]] = affine_map<(d0)[s0, s1] -> (d0 * s1 + s0)>
43#map = affine_map<(d0)[s0, s1] -> (d0 * s1 + s0)>
44// CHECK-LABEL: func @conversion_with_layout_map(
45//  CHECK-SAME:     %[[ARG:.*]]: memref<?xf32, #[[$MAP]]>
46//       CHECK:   %[[C0:.*]] = arith.constant 0 : index
47//       CHECK:   %[[DIM:.*]] = memref.dim %[[ARG]], %[[C0]]
48//       CHECK:   %[[ALLOC:.*]] = memref.alloc(%[[DIM]]) : memref<?xf32>
49//       CHECK:   %[[CASTED:.*]] = memref.cast %[[ALLOC]] : memref<?xf32> to memref<?xf32, #[[$MAP]]>
50//       CHECK:   memref.copy
51//       CHECK:   memref.dealloc
52//       CHECK:   return %[[CASTED]]
53func.func @conversion_with_layout_map(%arg0 : memref<?xf32, #map>) -> memref<?xf32, #map> {
54  %1 = bufferization.clone %arg0 : memref<?xf32, #map> to memref<?xf32, #map>
55  memref.dealloc %arg0 : memref<?xf32, #map>
56  return %1 : memref<?xf32, #map>
57}
58
59// -----
60
61// This bufferization.clone cannot be lowered because a buffer with this layout
62// map cannot be allocated (or casted to).
63
64#map2 = affine_map<(d0)[s0] -> (d0 * 10 + s0)>
65func.func @conversion_with_invalid_layout_map(%arg0 : memref<?xf32, #map2>)
66    -> memref<?xf32, #map2> {
67// expected-error@+1 {{failed to legalize operation 'bufferization.clone' that was explicitly marked illegal}}
68  %1 = bufferization.clone %arg0 : memref<?xf32, #map2> to memref<?xf32, #map2>
69  memref.dealloc %arg0 : memref<?xf32, #map2>
70  return %1 : memref<?xf32, #map2>
71}
72