xref: /llvm-project/mlir/test/Conversion/BufferizationToMemRef/bufferization-to-memref.mlir (revision 28d6aa90b085469e5b6355f8d739df733ebc4400)
1ae1ea0beSJulian Gross// RUN: mlir-opt -verify-diagnostics -convert-bufferization-to-memref -split-input-file %s | FileCheck %s
2ae1ea0beSJulian Gross
3ae1ea0beSJulian Gross// CHECK-LABEL: @conversion_static
43028bf74SRiver Riddlefunc.func @conversion_static(%arg0 : memref<2xf32>) -> memref<2xf32> {
5ae1ea0beSJulian Gross  %0 = bufferization.clone %arg0 : memref<2xf32> to memref<2xf32>
6ae1ea0beSJulian Gross  memref.dealloc %arg0 : memref<2xf32>
7ae1ea0beSJulian Gross  return %0 : memref<2xf32>
8ae1ea0beSJulian Gross}
9ae1ea0beSJulian Gross
10ae1ea0beSJulian Gross// CHECK:      %[[ALLOC:.*]] = memref.alloc
11ae1ea0beSJulian Gross// CHECK-NEXT: memref.copy %[[ARG:.*]], %[[ALLOC]]
12ae1ea0beSJulian Gross// CHECK-NEXT: memref.dealloc %[[ARG]]
13ae1ea0beSJulian Gross// CHECK-NEXT: return %[[ALLOC]]
14ae1ea0beSJulian Gross
15ae1ea0beSJulian Gross// -----
16ae1ea0beSJulian Gross
17ae1ea0beSJulian Gross// CHECK-LABEL: @conversion_dynamic
183028bf74SRiver Riddlefunc.func @conversion_dynamic(%arg0 : memref<?xf32>) -> memref<?xf32> {
19ae1ea0beSJulian Gross  %1 = bufferization.clone %arg0 : memref<?xf32> to memref<?xf32>
20ae1ea0beSJulian Gross  memref.dealloc %arg0 : memref<?xf32>
21ae1ea0beSJulian Gross  return %1 : memref<?xf32>
22ae1ea0beSJulian Gross}
23ae1ea0beSJulian Gross
24ae1ea0beSJulian Gross// CHECK:      %[[CONST:.*]] = arith.constant
25*28d6aa90Sryankima// CHECK:      %[[DIM:.*]] = memref.dim %[[ARG:.*]], %[[CONST]]
26ae1ea0beSJulian Gross// CHECK-NEXT: %[[ALLOC:.*]] = memref.alloc(%[[DIM]])
27ae1ea0beSJulian Gross// CHECK-NEXT: memref.copy %[[ARG]], %[[ALLOC]]
28ae1ea0beSJulian Gross// CHECK-NEXT: memref.dealloc %[[ARG]]
29ae1ea0beSJulian Gross// CHECK-NEXT: return %[[ALLOC]]
30ae1ea0beSJulian Gross
31ae1ea0beSJulian Gross// -----
32ae1ea0beSJulian Gross
33*28d6aa90Sryankima// CHECK-LABEL: @conversion_unknown
343028bf74SRiver Riddlefunc.func @conversion_unknown(%arg0 : memref<*xf32>) -> memref<*xf32> {
35ae1ea0beSJulian Gross  %1 = bufferization.clone %arg0 : memref<*xf32> to memref<*xf32>
36ae1ea0beSJulian Gross  memref.dealloc %arg0 : memref<*xf32>
37ae1ea0beSJulian Gross  return %1 : memref<*xf32>
388dca38d5SMatthias Springer}
398dca38d5SMatthias Springer
40*28d6aa90Sryankima// CHECK:      %[[RANK:.*]] = memref.rank %[[ARG:.*]]
41*28d6aa90Sryankima// CHECK-NEXT: %[[ALLOCA:.*]] = memref.alloca(%[[RANK]])
42*28d6aa90Sryankima// CHECK-NEXT: %[[FOR:.*]] = scf.for
43*28d6aa90Sryankima// CHECK-NEXT: %[[DIM:.*]] = memref.dim %[[ARG:.*]] %[[ARG:.*]]
44*28d6aa90Sryankima// CHECK-NEXT: memref.store %[[DIM:.*]], %[[ALLOCA:.*]][%[[ARG:.*]]]
45*28d6aa90Sryankima// CHECK-NEXT: %[[MUL:.*]] = arith.muli %[[ARG:.*]], %[[DIM:.*]]
46*28d6aa90Sryankima// CHECK-NEXT: scf.yield %[[MUL:.*]]
47*28d6aa90Sryankima// CHECK:      %[[ALLOC:.*]] = memref.alloc(%[[FOR:.*]])
48*28d6aa90Sryankima// CHECK-NEXT: %[[RESHAPE:.*]] = memref.reshape %[[ALLOC:.*]]
49*28d6aa90Sryankima// CHECK-NEXT: memref.copy
50*28d6aa90Sryankima// CHECK-NEXT: memref.dealloc
51*28d6aa90Sryankima// CHECK-NEXT: return %[[RESHAPE:.*]]
52*28d6aa90Sryankima
538dca38d5SMatthias Springer// -----
548dca38d5SMatthias Springer
558dca38d5SMatthias Springer// CHECK-LABEL: func @conversion_with_layout_map(
56f3fae035SAlex Zinenko//  CHECK-SAME:     %[[ARG:.*]]: memref<?xf32, strided<[?], offset: ?>>
578dca38d5SMatthias Springer//       CHECK:   %[[C0:.*]] = arith.constant 0 : index
588dca38d5SMatthias Springer//       CHECK:   %[[DIM:.*]] = memref.dim %[[ARG]], %[[C0]]
598dca38d5SMatthias Springer//       CHECK:   %[[ALLOC:.*]] = memref.alloc(%[[DIM]]) : memref<?xf32>
60f3fae035SAlex Zinenko//       CHECK:   %[[CASTED:.*]] = memref.cast %[[ALLOC]] : memref<?xf32> to memref<?xf32, strided<[?], offset: ?>>
618dca38d5SMatthias Springer//       CHECK:   memref.copy
628dca38d5SMatthias Springer//       CHECK:   memref.dealloc
638dca38d5SMatthias Springer//       CHECK:   return %[[CASTED]]
64f3fae035SAlex Zinenkofunc.func @conversion_with_layout_map(%arg0 : memref<?xf32, strided<[?], offset: ?>>) -> memref<?xf32, strided<[?], offset: ?>> {
65f3fae035SAlex Zinenko  %1 = bufferization.clone %arg0 : memref<?xf32, strided<[?], offset: ?>> to memref<?xf32, strided<[?], offset: ?>>
66f3fae035SAlex Zinenko  memref.dealloc %arg0 : memref<?xf32, strided<[?], offset: ?>>
67f3fae035SAlex Zinenko  return %1 : memref<?xf32, strided<[?], offset: ?>>
688dca38d5SMatthias Springer}
698dca38d5SMatthias Springer
708dca38d5SMatthias Springer// -----
718dca38d5SMatthias Springer
728dca38d5SMatthias Springer// This bufferization.clone cannot be lowered because a buffer with this layout
738dca38d5SMatthias Springer// map cannot be allocated (or casted to).
748dca38d5SMatthias Springer
75f3fae035SAlex Zinenkofunc.func @conversion_with_invalid_layout_map(%arg0 : memref<?xf32, strided<[10], offset: ?>>)
76f3fae035SAlex Zinenko    -> memref<?xf32, strided<[10], offset: ?>> {
778dca38d5SMatthias Springer// expected-error@+1 {{failed to legalize operation 'bufferization.clone' that was explicitly marked illegal}}
78f3fae035SAlex Zinenko  %1 = bufferization.clone %arg0 : memref<?xf32, strided<[10], offset: ?>> to memref<?xf32, strided<[10], offset: ?>>
79f3fae035SAlex Zinenko  memref.dealloc %arg0 : memref<?xf32, strided<[10], offset: ?>>
80f3fae035SAlex Zinenko  return %1 : memref<?xf32, strided<[10], offset: ?>>
81ae1ea0beSJulian Gross}
82660fdedeSMartin Erhart
8307c079a9SMartin Erhart// -----
84950f0944SMartin Erhart// Test: check that the dealloc lowering pattern is registered.
85660fdedeSMartin Erhart
8607c079a9SMartin Erhart// CHECK-NOT: func @deallocHelper
8707c079a9SMartin Erhart// CHECK-LABEL: func @conversion_dealloc_simple
8807c079a9SMartin Erhart// CHECK-SAME: [[ARG0:%.+]]: memref<2xf32>
8907c079a9SMartin Erhart// CHECK-SAME: [[ARG1:%.+]]: i1
904bde084fSMartin Erhartfunc.func @conversion_dealloc_simple(%arg0: memref<2xf32>, %arg1: i1) {
914bde084fSMartin Erhart  bufferization.dealloc (%arg0 : memref<2xf32>) if (%arg1)
924bde084fSMartin Erhart  return
9307c079a9SMartin Erhart}
9407c079a9SMartin Erhart
95f0b0c025Sklensy//      CHECK: scf.if [[ARG1]] {
96f0b0c025Sklensy// CHECK-NEXT:   memref.dealloc [[ARG0]] : memref<2xf32>
97f0b0c025Sklensy// CHECK-NEXT: }
98f0b0c025Sklensy// CHECK-NEXT: return
99