1// RUN: mlir-opt %s -one-shot-bufferize="allow-return-memref allow-unknown-ops" -split-input-file | FileCheck %s 2 3// Run fuzzer with different seeds. 4// RUN: mlir-opt %s -one-shot-bufferize="allow-return-memref test-analysis-only analysis-fuzzer-seed=23" -split-input-file -o /dev/null 5// RUN: mlir-opt %s -one-shot-bufferize="allow-return-memref test-analysis-only analysis-fuzzer-seed=59" -split-input-file -o /dev/null 6// RUN: mlir-opt %s -one-shot-bufferize="allow-return-memref test-analysis-only analysis-fuzzer-seed=91" -split-input-file -o /dev/null 7 8// CHECK-LABEL: func @use_tensor_func_arg( 9// CHECK-SAME: %[[A:.*]]: tensor<?xf32> 10func @use_tensor_func_arg(%A : tensor<?xf32>) -> (vector<4xf32>) { 11 %c0 = arith.constant 0 : index 12 %f0 = arith.constant 0.0 : f32 13 14 // CHECK: %[[A_memref:.*]] = bufferization.to_memref %[[A]] 15 // CHECK: %[[res:.*]] = vector.transfer_read %[[A_memref]] 16 %0 = vector.transfer_read %A[%c0], %f0 : tensor<?xf32>, vector<4xf32> 17 18 // CHECK: return %[[res]] 19 return %0 : vector<4xf32> 20} 21 22// ----- 23 24// CHECK-LABEL: func @return_tensor( 25// CHECK-SAME: %[[A:.*]]: tensor<?xf32> 26func @return_tensor(%A : tensor<?xf32>, %v : vector<4xf32>) -> (tensor<?xf32>) { 27 %c0 = arith.constant 0 : index 28 29 // CHECK: %[[A_memref:.*]] = bufferization.to_memref %[[A]] 30 // CHECK: %[[dim:.*]] = tensor.dim %[[A]] 31 // CHECK: %[[alloc:.*]] = memref.alloc(%[[dim]]) 32 // CHECK: %[[casted:.*]] = memref.cast %[[alloc]] 33 // CHECK: memref.copy %[[A_memref]], %[[alloc]] 34 // CHECK: vector.transfer_write %{{.*}}, %[[alloc]] 35 // CHECK: %[[res_tensor:.*]] = bufferization.to_tensor %[[casted]] 36 %0 = vector.transfer_write %v, %A[%c0] : vector<4xf32>, tensor<?xf32> 37 38 // CHECK: return %[[res_tensor]] 39 return %0 : tensor<?xf32> 40} 41 42// ----- 43 44// CHECK-LABEL: func @func_without_tensor_args 45func @func_without_tensor_args(%v : vector<10xf32>) -> () { 46 // CHECK: %[[alloc:.*]] = memref.alloc() 47 %0 = linalg.init_tensor[10] : tensor<10xf32> 48 49 %c0 = arith.constant 0 : index 50 // CHECK: vector.transfer_write %{{.*}}, %[[alloc]] 51 %1 = vector.transfer_write %v, %0[%c0] : vector<10xf32>, tensor<10xf32> 52 53 %cst = arith.constant 0.0 : f32 54 // CHECK: vector.transfer_read %[[alloc]] 55 %r = vector.transfer_read %1[%c0], %cst : tensor<10xf32>, vector<11xf32> 56 57 vector.print %r : vector<11xf32> 58 return 59} 60 61// ----- 62 63// CHECK-LABEL: func private @private_func 64func private @private_func(tensor<?xf32>) -> () 65 66// CHECK-LABEL: func @empty_func() 67func @empty_func() -> () { 68 return 69} 70 71 72