xref: /llvm-project/mlir/test/Conversion/BufferizationToMemRef/bufferization-to-memref.mlir (revision 28d6aa90b085469e5b6355f8d739df733ebc4400)
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:      %[[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
33// CHECK-LABEL: @conversion_unknown
34func.func @conversion_unknown(%arg0 : memref<*xf32>) -> memref<*xf32> {
35  %1 = bufferization.clone %arg0 : memref<*xf32> to memref<*xf32>
36  memref.dealloc %arg0 : memref<*xf32>
37  return %1 : memref<*xf32>
38}
39
40// CHECK:      %[[RANK:.*]] = memref.rank %[[ARG:.*]]
41// CHECK-NEXT: %[[ALLOCA:.*]] = memref.alloca(%[[RANK]])
42// CHECK-NEXT: %[[FOR:.*]] = scf.for
43// CHECK-NEXT: %[[DIM:.*]] = memref.dim %[[ARG:.*]] %[[ARG:.*]]
44// CHECK-NEXT: memref.store %[[DIM:.*]], %[[ALLOCA:.*]][%[[ARG:.*]]]
45// CHECK-NEXT: %[[MUL:.*]] = arith.muli %[[ARG:.*]], %[[DIM:.*]]
46// CHECK-NEXT: scf.yield %[[MUL:.*]]
47// CHECK:      %[[ALLOC:.*]] = memref.alloc(%[[FOR:.*]])
48// CHECK-NEXT: %[[RESHAPE:.*]] = memref.reshape %[[ALLOC:.*]]
49// CHECK-NEXT: memref.copy
50// CHECK-NEXT: memref.dealloc
51// CHECK-NEXT: return %[[RESHAPE:.*]]
52
53// -----
54
55// CHECK-LABEL: func @conversion_with_layout_map(
56//  CHECK-SAME:     %[[ARG:.*]]: memref<?xf32, strided<[?], offset: ?>>
57//       CHECK:   %[[C0:.*]] = arith.constant 0 : index
58//       CHECK:   %[[DIM:.*]] = memref.dim %[[ARG]], %[[C0]]
59//       CHECK:   %[[ALLOC:.*]] = memref.alloc(%[[DIM]]) : memref<?xf32>
60//       CHECK:   %[[CASTED:.*]] = memref.cast %[[ALLOC]] : memref<?xf32> to memref<?xf32, strided<[?], offset: ?>>
61//       CHECK:   memref.copy
62//       CHECK:   memref.dealloc
63//       CHECK:   return %[[CASTED]]
64func.func @conversion_with_layout_map(%arg0 : memref<?xf32, strided<[?], offset: ?>>) -> memref<?xf32, strided<[?], offset: ?>> {
65  %1 = bufferization.clone %arg0 : memref<?xf32, strided<[?], offset: ?>> to memref<?xf32, strided<[?], offset: ?>>
66  memref.dealloc %arg0 : memref<?xf32, strided<[?], offset: ?>>
67  return %1 : memref<?xf32, strided<[?], offset: ?>>
68}
69
70// -----
71
72// This bufferization.clone cannot be lowered because a buffer with this layout
73// map cannot be allocated (or casted to).
74
75func.func @conversion_with_invalid_layout_map(%arg0 : memref<?xf32, strided<[10], offset: ?>>)
76    -> memref<?xf32, strided<[10], offset: ?>> {
77// expected-error@+1 {{failed to legalize operation 'bufferization.clone' that was explicitly marked illegal}}
78  %1 = bufferization.clone %arg0 : memref<?xf32, strided<[10], offset: ?>> to memref<?xf32, strided<[10], offset: ?>>
79  memref.dealloc %arg0 : memref<?xf32, strided<[10], offset: ?>>
80  return %1 : memref<?xf32, strided<[10], offset: ?>>
81}
82
83// -----
84// Test: check that the dealloc lowering pattern is registered.
85
86// CHECK-NOT: func @deallocHelper
87// CHECK-LABEL: func @conversion_dealloc_simple
88// CHECK-SAME: [[ARG0:%.+]]: memref<2xf32>
89// CHECK-SAME: [[ARG1:%.+]]: i1
90func.func @conversion_dealloc_simple(%arg0: memref<2xf32>, %arg1: i1) {
91  bufferization.dealloc (%arg0 : memref<2xf32>) if (%arg1)
92  return
93}
94
95//      CHECK: scf.if [[ARG1]] {
96// CHECK-NEXT:   memref.dealloc [[ARG0]] : memref<2xf32>
97// CHECK-NEXT: }
98// CHECK-NEXT: return
99