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