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