1f89bb3c0SAlexander Belyaev// RUN: mlir-opt %s -finalizing-bufferize -split-input-file -verify-diagnostics | FileCheck %s 2f89bb3c0SAlexander Belyaev 3f89bb3c0SAlexander Belyaev// CHECK-LABEL: func @eliminate_materializations( 4f89bb3c0SAlexander Belyaev// CHECK-SAME: %[[ARG:.*]]: memref<f32>) -> memref<f32> { 5b2f50042SMatthias Springer// CHECK: return %[[ARG]] : memref<f32> 6*412b8850SRiver Riddlefunc.func @eliminate_materializations(%arg0: memref<f32>) -> memref<f32> { 7f89bb3c0SAlexander Belyaev %0 = bufferization.to_tensor %arg0 : memref<f32> 8f89bb3c0SAlexander Belyaev %1 = bufferization.to_memref %0 : memref<f32> 9f89bb3c0SAlexander Belyaev return %1 : memref<f32> 10f89bb3c0SAlexander Belyaev} 11f89bb3c0SAlexander Belyaev 12f89bb3c0SAlexander Belyaev// ----- 13f89bb3c0SAlexander Belyaev 14*412b8850SRiver Riddlefunc.func @unable_to_convert_lone_buffer_cast() -> memref<f32> { 15f89bb3c0SAlexander Belyaev // expected-error @+1 {{failed to legalize operation 'test.source'}} 16f89bb3c0SAlexander Belyaev %0 = "test.source"() : () -> tensor<f32> 17f89bb3c0SAlexander Belyaev %1 = bufferization.to_memref %0 : memref<f32> 18f89bb3c0SAlexander Belyaev return %1 : memref<f32> 19f89bb3c0SAlexander Belyaev} 20f89bb3c0SAlexander Belyaev 21f89bb3c0SAlexander Belyaev// ----- 22f89bb3c0SAlexander Belyaev 23*412b8850SRiver Riddlefunc.func @unable_to_convert_lone_tensor_load(%arg0: memref<f32>) { 24f89bb3c0SAlexander Belyaev %0 = bufferization.to_tensor %arg0 : memref<f32> 25f89bb3c0SAlexander Belyaev // expected-error @+1 {{failed to legalize operation 'test.sink'}} 26f89bb3c0SAlexander Belyaev "test.sink"(%0) : (tensor<f32>) -> () 27f89bb3c0SAlexander Belyaev return 28f89bb3c0SAlexander Belyaev} 29fa7c8cb4SMatthias Springer 30fa7c8cb4SMatthias Springer// ----- 31fa7c8cb4SMatthias Springer 32fa7c8cb4SMatthias Springer// CHECK: #[[$map1:.*]] = affine_map<(d0)[s0] -> (d0 + s0)> 33fa7c8cb4SMatthias Springer// CHECK-LABEL: func @dyn_layout_to_no_layout_cast( 34fa7c8cb4SMatthias Springer// CHECK-SAME: %[[arg:.*]]: memref<?xf32, #[[$map1]]>) 35fa7c8cb4SMatthias Springer// CHECK: %[[c0:.*]] = arith.constant 0 : index 36fa7c8cb4SMatthias Springer// CHECK: %[[dim:.*]] = memref.dim %[[arg]], %[[c0]] 37fa7c8cb4SMatthias Springer// CHECK: %[[alloc:.*]] = memref.alloc(%[[dim]]) : memref<?xf32> 38fa7c8cb4SMatthias Springer// CHECK: memref.copy %[[arg]], %[[alloc]] 39fa7c8cb4SMatthias Springer// CHECK: return %[[alloc]] 40fa7c8cb4SMatthias Springer#map1 = affine_map<(d0)[s0] -> (d0 + s0)> 41*412b8850SRiver Riddlefunc.func @dyn_layout_to_no_layout_cast(%m: memref<?xf32, #map1>) -> memref<?xf32> { 42fa7c8cb4SMatthias Springer %0 = bufferization.to_tensor %m : memref<?xf32, #map1> 43fa7c8cb4SMatthias Springer %1 = bufferization.to_memref %0 : memref<?xf32> 44fa7c8cb4SMatthias Springer return %1 : memref<?xf32> 45fa7c8cb4SMatthias Springer} 46fa7c8cb4SMatthias Springer 47fa7c8cb4SMatthias Springer// ----- 48fa7c8cb4SMatthias Springer 49fa7c8cb4SMatthias Springer// CHECK: #[[$map2:.*]] = affine_map<(d0)[s0] -> (d0 * 100 + s0)> 50fa7c8cb4SMatthias Springer// CHECK-LABEL: func @fancy_layout_to_no_layout_cast( 51fa7c8cb4SMatthias Springer// CHECK-SAME: %[[arg:.*]]: memref<?xf32, #[[$map2]]>) 52fa7c8cb4SMatthias Springer// CHECK: %[[c0:.*]] = arith.constant 0 : index 53fa7c8cb4SMatthias Springer// CHECK: %[[dim:.*]] = memref.dim %[[arg]], %[[c0]] 54fa7c8cb4SMatthias Springer// CHECK: %[[alloc:.*]] = memref.alloc(%[[dim]]) : memref<?xf32> 55fa7c8cb4SMatthias Springer// CHECK: memref.copy %[[arg]], %[[alloc]] 56fa7c8cb4SMatthias Springer// CHECK: return %[[alloc]] 57fa7c8cb4SMatthias Springer#map2 = affine_map<(d0)[s0] -> (d0 * 100 + s0)> 58*412b8850SRiver Riddlefunc.func @fancy_layout_to_no_layout_cast(%m: memref<?xf32, #map2>) -> memref<?xf32> { 59fa7c8cb4SMatthias Springer %0 = bufferization.to_tensor %m : memref<?xf32, #map2> 60fa7c8cb4SMatthias Springer %1 = bufferization.to_memref %0 : memref<?xf32> 61fa7c8cb4SMatthias Springer return %1 : memref<?xf32> 62fa7c8cb4SMatthias Springer} 63fa7c8cb4SMatthias Springer 64fa7c8cb4SMatthias Springer// ----- 65fa7c8cb4SMatthias Springer 66fa7c8cb4SMatthias Springer// CHECK: #[[$map3:.*]] = affine_map<(d0)[s0] -> (d0 + 25)> 67fa7c8cb4SMatthias Springer// CHECK-LABEL: func @static_layout_to_no_layout_cast( 68fa7c8cb4SMatthias Springer// CHECK-SAME: %[[arg:.*]]: memref<?xf32, #[[$map3]]>) 69fa7c8cb4SMatthias Springer// CHECK: %[[c0:.*]] = arith.constant 0 : index 70fa7c8cb4SMatthias Springer// CHECK: %[[dim:.*]] = memref.dim %[[arg]], %[[c0]] 71fa7c8cb4SMatthias Springer// CHECK: %[[alloc:.*]] = memref.alloc(%[[dim]]) : memref<?xf32> 72fa7c8cb4SMatthias Springer// CHECK: memref.copy %[[arg]], %[[alloc]] 73fa7c8cb4SMatthias Springer// CHECK: return %[[alloc]] 74fa7c8cb4SMatthias Springer#map3 = affine_map<(d0)[s0] -> (d0 + 25)> 75*412b8850SRiver Riddlefunc.func @static_layout_to_no_layout_cast(%m: memref<?xf32, #map3>) -> memref<?xf32> { 76fa7c8cb4SMatthias Springer %0 = bufferization.to_tensor %m : memref<?xf32, #map3> 77fa7c8cb4SMatthias Springer %1 = bufferization.to_memref %0 : memref<?xf32> 78fa7c8cb4SMatthias Springer return %1 : memref<?xf32> 79fa7c8cb4SMatthias Springer} 80fa7c8cb4SMatthias Springer 81fa7c8cb4SMatthias Springer// ----- 82fa7c8cb4SMatthias Springer 83fa7c8cb4SMatthias Springer// TODO: to_memref with layout maps not supported yet. This should fold to a 84fa7c8cb4SMatthias Springer// memref.cast. 85fa7c8cb4SMatthias Springer#map4 = affine_map<(d0)[s0] -> (d0 + s0)> 86*412b8850SRiver Riddlefunc.func @no_layout_to_dyn_layout_cast(%m: memref<?xf32>) -> memref<?xf32, #map4> { 87fa7c8cb4SMatthias Springer %0 = bufferization.to_tensor %m : memref<?xf32> 88fa7c8cb4SMatthias Springer // expected-error @+1 {{failed to materialize conversion for result #0 of operation 'bufferization.to_memref' that remained live after conversion}} 89fa7c8cb4SMatthias Springer %1 = bufferization.to_memref %0 : memref<?xf32, #map4> 90fa7c8cb4SMatthias Springer // expected-note @+1 {{see existing live user here}} 91fa7c8cb4SMatthias Springer return %1 : memref<?xf32, #map4> 92fa7c8cb4SMatthias Springer} 93fa7c8cb4SMatthias Springer 94fa7c8cb4SMatthias Springer// ----- 95fa7c8cb4SMatthias Springer 96*412b8850SRiver Riddlefunc.func @illegal_unranked_to_rank(%m: memref<*xf32>) -> memref<?xf32> { 97fa7c8cb4SMatthias Springer // expected-note @+1 {{prior use here}} 98fa7c8cb4SMatthias Springer %0 = bufferization.to_tensor %m : memref<*xf32> 99fa7c8cb4SMatthias Springer // expected-error @+1 {{expects different type than prior uses: 'tensor<?xf32>' vs 'tensor<*xf32>'}} 100fa7c8cb4SMatthias Springer %1 = bufferization.to_memref %0 : memref<?xf32> 101fa7c8cb4SMatthias Springer return %1 : memref<?xf32> 102fa7c8cb4SMatthias Springer} 103