| // RUN: mlir-opt -verify-diagnostics -convert-bufferization-to-memref -split-input-file %s | FileCheck %s | |
| // CHECK-LABEL: @conversion_static | |
| func.func @conversion_static(%arg0 : memref<2xf32>) -> memref<2xf32> { | |
| %0 = bufferization.clone %arg0 : memref<2xf32> to memref<2xf32> | |
| memref.dealloc %arg0 : memref<2xf32> | |
| return %0 : memref<2xf32> | |
| } | |
| // CHECK: %[[ALLOC:.*]] = memref.alloc | |
| // CHECK-NEXT: memref.copy %[[ARG:.*]], %[[ALLOC]] | |
| // CHECK-NEXT: memref.dealloc %[[ARG]] | |
| // CHECK-NEXT: return %[[ALLOC]] | |
| // ----- | |
| // CHECK-LABEL: @conversion_dynamic | |
| func.func @conversion_dynamic(%arg0 : memref<?xf32>) -> memref<?xf32> { | |
| %1 = bufferization.clone %arg0 : memref<?xf32> to memref<?xf32> | |
| memref.dealloc %arg0 : memref<?xf32> | |
| return %1 : memref<?xf32> | |
| } | |
| // CHECK: %[[CONST:.*]] = arith.constant | |
| // CHECK: %[[DIM:.*]] = memref.dim %[[ARG:.*]], %[[CONST]] | |
| // CHECK-NEXT: %[[ALLOC:.*]] = memref.alloc(%[[DIM]]) | |
| // CHECK-NEXT: memref.copy %[[ARG]], %[[ALLOC]] | |
| // CHECK-NEXT: memref.dealloc %[[ARG]] | |
| // CHECK-NEXT: return %[[ALLOC]] | |
| // ----- | |
| // CHECK-LABEL: @conversion_unknown | |
| func.func @conversion_unknown(%arg0 : memref<*xf32>) -> memref<*xf32> { | |
| %1 = bufferization.clone %arg0 : memref<*xf32> to memref<*xf32> | |
| memref.dealloc %arg0 : memref<*xf32> | |
| return %1 : memref<*xf32> | |
| } | |
| // CHECK: %[[RANK:.*]] = memref.rank %[[ARG:.*]] | |
| // CHECK-NEXT: %[[ALLOCA:.*]] = memref.alloca(%[[RANK]]) | |
| // CHECK-NEXT: %[[FOR:.*]] = scf.for | |
| // CHECK-NEXT: %[[DIM:.*]] = memref.dim %[[ARG:.*]] %[[ARG:.*]] | |
| // CHECK-NEXT: memref.store %[[DIM:.*]], %[[ALLOCA:.*]][%[[ARG:.*]]] | |
| // CHECK-NEXT: %[[MUL:.*]] = arith.muli %[[ARG:.*]], %[[DIM:.*]] | |
| // CHECK-NEXT: scf.yield %[[MUL:.*]] | |
| // CHECK: %[[ALLOC:.*]] = memref.alloc(%[[FOR:.*]]) | |
| // CHECK-NEXT: %[[RESHAPE:.*]] = memref.reshape %[[ALLOC:.*]] | |
| // CHECK-NEXT: memref.copy | |
| // CHECK-NEXT: memref.dealloc | |
| // CHECK-NEXT: return %[[RESHAPE:.*]] | |
| // ----- | |
| // CHECK-LABEL: func @conversion_with_layout_map( | |
| // CHECK-SAME: %[[ARG:.*]]: memref<?xf32, strided<[?], offset: ?>> | |
| // CHECK: %[[C0:.*]] = arith.constant 0 : index | |
| // CHECK: %[[DIM:.*]] = memref.dim %[[ARG]], %[[C0]] | |
| // CHECK: %[[ALLOC:.*]] = memref.alloc(%[[DIM]]) : memref<?xf32> | |
| // CHECK: %[[CASTED:.*]] = memref.cast %[[ALLOC]] : memref<?xf32> to memref<?xf32, strided<[?], offset: ?>> | |
| // CHECK: memref.copy | |
| // CHECK: memref.dealloc | |
| // CHECK: return %[[CASTED]] | |
| func.func @conversion_with_layout_map(%arg0 : memref<?xf32, strided<[?], offset: ?>>) -> memref<?xf32, strided<[?], offset: ?>> { | |
| %1 = bufferization.clone %arg0 : memref<?xf32, strided<[?], offset: ?>> to memref<?xf32, strided<[?], offset: ?>> | |
| memref.dealloc %arg0 : memref<?xf32, strided<[?], offset: ?>> | |
| return %1 : memref<?xf32, strided<[?], offset: ?>> | |
| } | |
| // ----- | |
| // This bufferization.clone cannot be lowered because a buffer with this layout | |
| // map cannot be allocated (or casted to). | |
| func.func @conversion_with_invalid_layout_map(%arg0 : memref<?xf32, strided<[10], offset: ?>>) | |
| -> memref<?xf32, strided<[10], offset: ?>> { | |
| // expected-error@+1 {{failed to legalize operation 'bufferization.clone' that was explicitly marked illegal}} | |
| %1 = bufferization.clone %arg0 : memref<?xf32, strided<[10], offset: ?>> to memref<?xf32, strided<[10], offset: ?>> | |
| memref.dealloc %arg0 : memref<?xf32, strided<[10], offset: ?>> | |
| return %1 : memref<?xf32, strided<[10], offset: ?>> | |
| } | |
| // ----- | |
| // Test: check that the dealloc lowering pattern is registered. | |
| // CHECK-NOT: func @deallocHelper | |
| // CHECK-LABEL: func @conversion_dealloc_simple | |
| // CHECK-SAME: [[ARG0:%.+]]: memref<2xf32> | |
| // CHECK-SAME: [[ARG1:%.+]]: i1 | |
| func.func @conversion_dealloc_simple(%arg0: memref<2xf32>, %arg1: i1) { | |
| bufferization.dealloc (%arg0 : memref<2xf32>) if (%arg1) | |
| return | |
| } | |
| // CHECK: scf.if [[ARG1]] { | |
| // CHECK-NEXT: memref.dealloc [[ARG0]] : memref<2xf32> | |
| // CHECK-NEXT: } | |
| // CHECK-NEXT: return |