OffsetSizeAndStrideOpInterface now have the ability to specify only a leading subset of offset, sizes, strides operands/attributes. The size of that leading subset must be limited by the corresponding entry in `getArrayAttrMaxRanks` to avoid overflows. Missing trailing dimensions are assumed to span the whole range (i.e. [0 .. dim)). This brings more natural semantics to slice-like op on top of subview and is a simplifies to removing all uses of SliceOp in dependent projects. Differential revision: https://reviews.llvm.org/D95441
64 lines
2.5 KiB
MLIR
64 lines
2.5 KiB
MLIR
// RUN: mlir-opt %s -convert-std-to-llvm | \
|
|
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
|
|
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext | FileCheck %s
|
|
|
|
global_memref "private" constant @__constant_5x3xf32 : memref<5x3xf32> =
|
|
dense<[[0.0, 1.0, 2.0],
|
|
[3.0, 4.0, 5.0],
|
|
[6.0, 7.0, 8.0],
|
|
[9.0, 10.0, 11.0],
|
|
[12.0, 13.0, 14.0]]>
|
|
|
|
func @main() {
|
|
%0 = get_global_memref @__constant_5x3xf32 : memref<5x3xf32>
|
|
|
|
/// Subview with only leading operands.
|
|
%1 = subview %0[2][3][1]: memref<5x3xf32> to memref<3x3xf32, offset: 6, strides: [3, 1]>
|
|
%unranked = memref_cast %1 : memref<3x3xf32, offset: 6, strides: [3, 1]> to memref<*xf32>
|
|
call @print_memref_f32(%unranked) : (memref<*xf32>) -> ()
|
|
|
|
// CHECK: Unranked Memref base@ = {{0x[-9a-f]*}}
|
|
// CHECK-SAME: rank = 2 offset = 6 sizes = [3, 3] strides = [3, 1] data =
|
|
// CHECK-NEXT: [
|
|
// CHECK-SAME: [6, 7, 8],
|
|
// CHECK-NEXT: [9, 10, 11],
|
|
// CHECK-NEXT: [12, 13, 14]
|
|
// CHECK-SAME: ]
|
|
|
|
/// Regular subview.
|
|
%2 = subview %0[0, 2][5, 1][1, 1]: memref<5x3xf32> to memref<5x1xf32, offset: 2, strides: [3, 1]>
|
|
%unranked2 = memref_cast %2 : memref<5x1xf32, offset: 2, strides: [3, 1]> to memref<*xf32>
|
|
call @print_memref_f32(%unranked2) : (memref<*xf32>) -> ()
|
|
|
|
// CHECK: Unranked Memref base@ = {{0x[-9a-f]*}}
|
|
// CHECK-SAME: rank = 2 offset = 2 sizes = [5, 1] strides = [3, 1] data =
|
|
// CHECK-NEXT: [
|
|
// CHECK-SAME: [2],
|
|
// CHECK-NEXT: [5],
|
|
// CHECK-NEXT: [8],
|
|
// CHECK-NEXT: [11],
|
|
// CHECK-NEXT: [14]
|
|
// CHECK-SAME: ]
|
|
|
|
/// Rank-reducing subview.
|
|
%3 = subview %0[0, 2][5, 1][1, 1]: memref<5x3xf32> to memref<5xf32, offset: 2, strides: [3]>
|
|
%unranked3 = memref_cast %3 : memref<5xf32, offset: 2, strides: [3]> to memref<*xf32>
|
|
call @print_memref_f32(%unranked3) : (memref<*xf32>) -> ()
|
|
|
|
// CHECK: Unranked Memref base@ = {{0x[-9a-f]*}}
|
|
// CHECK-SAME: rank = 1 offset = 2 sizes = [5] strides = [3] data =
|
|
// CHECK-NEXT: [2, 5, 8, 11, 14]
|
|
|
|
/// Rank-reducing subview with only leading operands.
|
|
%4 = subview %0[1][1][1]: memref<5x3xf32> to memref<3xf32, offset: 3, strides: [1]>
|
|
%unranked4 = memref_cast %4 : memref<3xf32, offset: 3, strides: [1]> to memref<*xf32>
|
|
call @print_memref_f32(%unranked4) : (memref<*xf32>) -> ()
|
|
// CHECK: Unranked Memref base@ = {{0x[-9a-f]*}}
|
|
// CHECK-SAME: rank = 1 offset = 3 sizes = [3] strides = [1] data =
|
|
// CHECK-NEXT: [3, 4, 5]
|
|
|
|
return
|
|
}
|
|
|
|
func private @print_memref_f32(%ptr : memref<*xf32>)
|