diff options
author | Andy Davis <andydavis@google.com> | 2019-11-11 10:32:52 -0800 |
---|---|---|
committer | A. Unique TensorFlower <gardener@tensorflow.org> | 2019-11-11 10:33:27 -0800 |
commit | 5cf6e0ce7f03f9841675b1a9d44232540f3df5cc (patch) | |
tree | ff2fd4639568dc7bdc4fa91132397c154a5e7d8d /mlir/test/IR | |
parent | e04d4bf865b01ec35ecfb98b34372a1dacd70266 (diff) | |
download | bcm5719-llvm-5cf6e0ce7f03f9841675b1a9d44232540f3df5cc.tar.gz bcm5719-llvm-5cf6e0ce7f03f9841675b1a9d44232540f3df5cc.zip |
Adds std.subview operation which takes dynamic offsets, sizes and strides and returns a memref type which represents sub/reduced-size view of its memref argument.
This operation is a companion operation to the std.view operation added as proposed in "Updates to the MLIR MemRefType" RFC.
PiperOrigin-RevId: 279766410
Diffstat (limited to 'mlir/test/IR')
-rw-r--r-- | mlir/test/IR/core-ops.mlir | 37 | ||||
-rw-r--r-- | mlir/test/IR/invalid-ops.mlir | 67 |
2 files changed, 104 insertions, 0 deletions
diff --git a/mlir/test/IR/core-ops.mlir b/mlir/test/IR/core-ops.mlir index 252a13df102..96df40202a3 100644 --- a/mlir/test/IR/core-ops.mlir +++ b/mlir/test/IR/core-ops.mlir @@ -15,6 +15,15 @@ // CHECK-DAG: #[[VIEW_MAP2:map[0-9]+]] = (d0, d1)[s0, s1] -> (d0 * s1 + d1 + s0) // CHECK-DAG: #[[VIEW_MAP3:map[0-9]+]] = (d0, d1)[s0] -> (d0 * s0 + d1) +// CHECK-DAG: #[[BASE_MAP0:map[0-9]+]] = (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2) +// CHECK-DAG: #[[SUBVIEW_MAP0:map[0-9]+]] = (d0, d1, d2)[s0, s1, s2, s3] -> (d0 * s1 + d1 * s2 + d2 * s3 + s0) + +// CHECK-DAG: #[[BASE_MAP1:map[0-9]+]] = (d0)[s0] -> (d0 + s0) +// CHECK-DAG: #[[SUBVIEW_MAP1:map[0-9]+]] = (d0)[s0, s1] -> (d0 * s1 + s0) + +// CHECK-DAG: #[[BASE_MAP2:map[0-9]+]] = (d0, d1) -> (d0 * 22 + d1) +// CHECK-DAG: #[[SUBVIEW_MAP2:map[0-9]+]] = (d0, d1)[s0, s1, s2] -> (d0 * s1 + d1 * s2 + s0) + // CHECK-LABEL: func @func_with_ops(%arg0: f32) { func @func_with_ops(f32) { ^bb0(%a : f32): @@ -506,6 +515,34 @@ func @memref_view(%arg0 : index, %arg1 : index, %arg2 : index) { return } +// CHECK-LABEL: func @memref_subview(%arg0 +func @memref_subview(%arg0 : index, %arg1 : index, %arg2 : index) { + %c0 = constant 0 : index + %c1 = constant 1 : index + + //%2 = alloc() : memref<64xf32, (d0) -> (d0)> + + %0 = alloc() : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> + // CHECK: std.subview %0[%c0, %c0, %c0][%arg0, %arg1, %arg2][%c1, %c1, %c1] : memref<8x16x4xf32, #[[BASE_MAP0]]> to memref<?x?x?xf32, #[[SUBVIEW_MAP0]]> + %1 = subview %0[%c0, %c0, %c0][%arg0, %arg1, %arg2][%c1, %c1, %c1] + : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> to + memref<?x?x?xf32, + (d0, d1, d2)[s0, s1, s2, s3] -> (d0 * s1 + d1 * s2 + d2 * s3 + s0)> + + %2 = alloc()[%arg2] : memref<64xf32, (d0)[s0] -> (d0 + s0)> + // CHECK: std.subview %2[%c1][%arg0][%c1] : memref<64xf32, #[[BASE_MAP1]]> to memref<?xf32, #[[SUBVIEW_MAP1]]> + %3 = subview %2[%c1][%arg0][%c1] + : memref<64xf32, (d0)[s0] -> (d0 + s0)> to + memref<?xf32, (d0)[s0, s1] -> (d0 * s1 + s0)> + + %4 = alloc() : memref<64x22xf32, (d0, d1) -> (d0 * 22 + d1)> + // CHECK: std.subview %4[%c0, %c1][%arg0, %arg1][%c1, %c0] : memref<64x22xf32, #[[BASE_MAP2]]> to memref<?x?xf32, #[[SUBVIEW_MAP2]]> + %5 = subview %4[%c0, %c1][%arg0, %arg1][%c1, %c0] + : memref<64x22xf32, (d0, d1) -> (d0 * 22 + d1)> to + memref<?x?xf32, (d0, d1)[s0, s1, s2] -> (d0 * s1 + d1 * s2 + s0)> + return +} + // CHECK-LABEL: func @test_dimop(%arg0 func @test_dimop(%arg0: tensor<4x4x?xf32>) { // CHECK: %0 = dim %arg0, 2 : tensor<4x4x?xf32> diff --git a/mlir/test/IR/invalid-ops.mlir b/mlir/test/IR/invalid-ops.mlir index ec38ecebb0e..9c1807807c3 100644 --- a/mlir/test/IR/invalid-ops.mlir +++ b/mlir/test/IR/invalid-ops.mlir @@ -976,3 +976,70 @@ func @invalid_view(%arg0 : index, %arg1 : index, %arg2 : index) { return } +// ----- + +func @invalid_subview(%arg0 : index, %arg1 : index, %arg2 : index) { + %0 = alloc() : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2), 2> + // expected-error@+1 {{different memory spaces}} + %1 = subview %0[][%arg2][] + : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2), 2> to + memref<8x?x4xf32, (d0, d1, d2)[s0] -> (d0 * s0 + d1 * 4 + d2)> + return +} + +// ----- + +func @invalid_subview(%arg0 : index, %arg1 : index, %arg2 : index) { + %0 = alloc() : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> + // expected-error@+1 {{is not strided}} + %1 = subview %0[][%arg2][] + : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> to + memref<8x?x4xf32, (d0, d1, d2)[s0] -> (d0 + s0, d1, d2)> + return +} + +// ----- + +func @invalid_subview(%arg0 : index, %arg1 : index, %arg2 : index) { + %0 = alloc() : memref<8x16x4xf32, (d0, d1, d2) -> (d0 + d1, d1 + d2, d2)> + // expected-error@+1 {{is not strided}} + %1 = subview %0[][%arg2][] + : memref<8x16x4xf32, (d0, d1, d2) -> (d0 + d1, d1 + d2, d2)> to + memref<8x?x4xf32, (d0, d1, d2)[s0] -> (d0 * s0 + d1 * 4 + d2)> + return +} + +// ----- + +func @invalid_subview(%arg0 : index, %arg1 : index, %arg2 : index) { + %0 = alloc() : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> + // expected-error@+1 {{incorrect number of operands for type}} + %1 = subview %0[%arg0, %arg1][%arg2][] + : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> to + memref<8x?x4xf32, (d0, d1, d2)[s0] -> (d0 * s0 + d1 * 4 + d2)> + return +} + +// ----- + +func @invalid_subview(%arg0 : index, %arg1 : index, %arg2 : index) { + %0 = alloc() : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> + // expected-error@+1 {{incorrect dynamic strides in view memref type}} + %1 = subview %0[%arg0, %arg1, %arg2][%arg0, %arg1, %arg2][%arg0, %arg1, %arg2] + : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> to + memref<?x?x4xf32, (d0, d1, d2)[s0] -> (d0 * 64 + d1 * 4 + d2 + s0)> + return +} + +// ----- + +func @invalid_subview(%arg0 : index, %arg1 : index, %arg2 : index) { + %0 = alloc() : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> + %c0 = constant 0 : index + %c1 = constant 1 : index + // expected-error@+1 {{subview memref layout map must specify a dynamic offset}} + %1 = subview %0[%c0, %c0, %c0][%arg0, %arg1, %arg2][%c1, %c1, %c1] + : memref<8x16x4xf32, (d0, d1, d2) -> (d0 * 64 + d1 * 4 + d2)> to + memref<?x?x?xf32, (d0, d1, d2)[s0, s1, s2] -> (d0 * s0 + d1 * s1 + d2 * s2)> + return +} |