Issue 83276
Summary [mlir][bufferization] Incorrect bufferization with LayoutMapOption::IdentityLayoutMap
Labels mlir
Assignees
Reporter ryan-holt-1
    `OneShotBufferize` incorrectly casts away non-unit layouts on function call arguments when running with the `LayoutMapOption::IdentityLayoutMap` option.

Reproducer:
```
// RUN: mlir-opt %s --one-shot-bufferize='bufferize-function-boundaries function-boundary-type-conversion=identity-layout-map

func.func @caller(%arg0: tensor<5xf32>, %offset: index, %size: index) -> (f32) {
 %extracted_slice = tensor.extract_slice %arg0[%offset] [%size] [1] : tensor<5xf32> to tensor<?xf32>
    %result = func.call @callee(%extracted_slice) : (tensor<?xf32>) -> (f32)
    return %result : f32
}
func.func private @callee(%arg0: tensor<?xf32>) -> (f32) {
 %0 = arith.constant 0 : index
    %extracted = tensor.extract %arg0[%0] : tensor<?xf32>
    return %extracted : f32
}
```

results in:

```
  func.func @caller(%arg0: memref<5xf32>, %arg1: index, %arg2: index) -> f32 {
    %subview = memref.subview %arg0[%arg1] [%arg2] [1] : memref<5xf32> to memref<?xf32, strided<[1], offset: ?>>
    %cast = memref.cast %subview : memref<?xf32, strided<[1], offset: ?>> to memref<?xf32> 
    %0 = call @callee(%cast) : (memref<?xf32>) -> f32
 return %0 : f32
  }
  func.func private @callee(%arg0: memref<?xf32>) -> f32 {
    %c0 = arith.constant 0 : index
    %0 = memref.load %arg0[%c0] : memref<?xf32>
    return %0 : f32
  }
```

Notice the `memref.cast` is eliminating the layout. This will cause `callee` to load the wrong value when `%offset` is non-zero. I would have expected a new allocation and a copy at the callsite instead of the `memref.cast`. The doc for `LayoutMapOption` indicates that a copy would be the expected behavior as well.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to