diff options
| author | Nicolas Vasilache <ntv@google.com> | 2019-11-14 08:10:36 -0800 |
|---|---|---|
| committer | A. Unique TensorFlower <gardener@tensorflow.org> | 2019-11-14 08:15:23 -0800 |
| commit | f2b6ae99913d0049c7929160aed5f213b1081abb (patch) | |
| tree | 41ccb1f9a181eaada07f21cbc7da75ef2d229575 /mlir/test/Dialect/VectorOps | |
| parent | 7c28de4aef6da3ab2f53118ecf717e56c68352e7 (diff) | |
| download | bcm5719-llvm-f2b6ae99913d0049c7929160aed5f213b1081abb.tar.gz bcm5719-llvm-f2b6ae99913d0049c7929160aed5f213b1081abb.zip | |
Move VectorOps to Tablegen - (almost) NFC
This CL moves VectorOps to Tablegen and cleans up the implementation.
This is almost NFC but 2 changes occur:
1. an interface change occurs in the padding value specification in vector_transfer_read:
the value becomes non-optional. As a shortcut we currently use %f0 for all paddings.
This should become an OpInterface for vectorization in the future.
2. the return type of vector.type_cast is trivial and simplified to `memref<vector<...>>`
Relevant roundtrip and invalid tests that used to sit in core are moved to the vector dialect.
The op documentation is moved to the .td file.
PiperOrigin-RevId: 280430869
Diffstat (limited to 'mlir/test/Dialect/VectorOps')
| -rw-r--r-- | mlir/test/Dialect/VectorOps/invalid.mlir | 143 | ||||
| -rw-r--r-- | mlir/test/Dialect/VectorOps/ops.mlir | 22 |
2 files changed, 165 insertions, 0 deletions
diff --git a/mlir/test/Dialect/VectorOps/invalid.mlir b/mlir/test/Dialect/VectorOps/invalid.mlir index ca339e7362a..2db4cf53384 100644 --- a/mlir/test/Dialect/VectorOps/invalid.mlir +++ b/mlir/test/Dialect/VectorOps/invalid.mlir @@ -96,3 +96,146 @@ func @outerproduct_operand_3_result_type_generic(%arg0: vector<4xf32>, %arg1: ve // expected-error@+1 {{expected operand #3 of same type as result type}} %1 = "vector.outerproduct" (%arg0, %arg1, %arg2) : (vector<4xf32>, vector<8xf32>, vector<4x16xf32>) -> (vector<4x8xf32>) } + +// ----- + +func @test_vector.transfer_read(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant 3.0 : f32 + // expected-error@+1 {{two types required}} + %0 = vector.transfer_read %arg0[%c3, %c3], %cst { permutation_map = ()->(0) } : memref<?x?xf32> +} + +// ----- + +func @test_vector.transfer_read(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant 3.0 : f32 + // expected-error@+1 {{requires 2 indices}} + %0 = vector.transfer_read %arg0[%c3, %c3, %c3], %cst { permutation_map = ()->(0) } : memref<?x?xf32>, vector<128xf32> +} + +// ----- + +func @test_vector.transfer_read(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant 3.0 : f32 + // expected-error@+1 {{requires attribute 'permutation_map'}} + %0 = vector.transfer_read %arg0[%c3, %c3], %cst {perm = (d0)->(d0)} : memref<?x?xf32>, vector<128xf32> +} + +// ----- + +func @test_vector.transfer_read(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant 3.0 : f32 + // expected-error@+1 {{requires a permutation_map with input dims of the same rank as the memref type}} + %0 = vector.transfer_read %arg0[%c3, %c3], %cst {permutation_map = (d0)->(d0)} : memref<?x?xf32>, vector<128xf32> +} + +// ----- + +func @test_vector.transfer_read(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant 3.0 : f32 + // expected-error@+1 {{requires a permutation_map with result dims of the same rank as the vector type}} + %0 = vector.transfer_read %arg0[%c3, %c3], %cst {permutation_map = (d0, d1)->(d0, d1)} : memref<?x?xf32>, vector<128xf32> +} + +// ----- + +func @test_vector.transfer_read(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant 3.0 : f32 + // expected-error@+1 {{requires a projected permutation_map (at most one dim or the zero constant can appear in each result)}} + %0 = vector.transfer_read %arg0[%c3, %c3], %cst {permutation_map = (d0, d1)->(d0 + d1)} : memref<?x?xf32>, vector<128xf32> +} + +// ----- + +func @test_vector.transfer_read(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant 3.0 : f32 + // expected-error@+1 {{requires a projected permutation_map (at most one dim or the zero constant can appear in each result)}} + %0 = vector.transfer_read %arg0[%c3, %c3], %cst {permutation_map = (d0, d1)->(d0 + 1)} : memref<?x?xf32>, vector<128xf32> +} + +// ----- + +func @test_vector.transfer_read(%arg0: memref<?x?x?xf32>) { + %c3 = constant 3 : index + %cst = constant 3.0 : f32 + // expected-error@+1 {{requires a permutation_map that is a permutation (found one dim used more than once)}} + %0 = vector.transfer_read %arg0[%c3, %c3, %c3], %cst {permutation_map = (d0, d1, d2)->(d0, d0)} : memref<?x?x?xf32>, vector<3x7xf32> +} + +// ----- + +func @test_vector.transfer_write(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant dense<3.0> : vector<128 x f32> + // expected-error@+1 {{expected 5 operand types but had 4}} + %0 = "vector.transfer_write"(%cst, %arg0, %c3, %c3, %c3) {permutation_map = ()->(0)} : (vector<128xf32>, memref<?x?xf32>, index, index) -> () +} + +// ----- + +func @test_vector.transfer_write(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant dense<3.0> : vector<128 x f32> + // expected-error@+1 {{requires 2 indices}} + vector.transfer_write %cst, %arg0[%c3, %c3, %c3] {permutation_map = ()->(0)} : vector<128xf32>, memref<?x?xf32> +} + +// ----- + +func @test_vector.transfer_write(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant dense<3.0> : vector<128 x f32> + // expected-error@+1 {{requires attribute 'permutation_map'}} + vector.transfer_write %cst, %arg0[%c3, %c3] {perm = (d0)->(d0)} : vector<128xf32>, memref<?x?xf32> +} + +// ----- + +func @test_vector.transfer_write(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant dense<3.0> : vector<128 x f32> + // expected-error@+1 {{requires a permutation_map with input dims of the same rank as the memref type}} + vector.transfer_write %cst, %arg0[%c3, %c3] {permutation_map = (d0)->(d0)} : vector<128xf32>, memref<?x?xf32> +} + +// ----- + +func @test_vector.transfer_write(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant dense<3.0> : vector<128 x f32> + // expected-error@+1 {{requires a permutation_map with result dims of the same rank as the vector type}} + vector.transfer_write %cst, %arg0[%c3, %c3] {permutation_map = (d0, d1)->(d0, d1)} : vector<128xf32>, memref<?x?xf32> +} + +// ----- + +func @test_vector.transfer_write(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant dense<3.0> : vector<128 x f32> + // expected-error@+1 {{requires a projected permutation_map (at most one dim or the zero constant can appear in each result)}} + vector.transfer_write %cst, %arg0[%c3, %c3] {permutation_map = (d0, d1)->(d0 + d1)} : vector<128xf32>, memref<?x?xf32> +} + +// ----- + +func @test_vector.transfer_write(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant dense<3.0> : vector<128 x f32> + // expected-error@+1 {{requires a projected permutation_map (at most one dim or the zero constant can appear in each result)}} + vector.transfer_write %cst, %arg0[%c3, %c3] {permutation_map = (d0, d1)->(d0 + 1)} : vector<128xf32>, memref<?x?xf32> +} +// ----- + +func @test_vector.transfer_write(%arg0: memref<?x?x?xf32>) { + %c3 = constant 3 : index + %cst = constant dense<3.0> : vector<3 x 7 x f32> + // expected-error@+1 {{requires a permutation_map that is a permutation (found one dim used more than once)}} + vector.transfer_write %cst, %arg0[%c3, %c3, %c3] {permutation_map = (d0, d1, d2)->(d0, d0)} : vector<3x7xf32>, memref<?x?x?xf32> +} diff --git a/mlir/test/Dialect/VectorOps/ops.mlir b/mlir/test/Dialect/VectorOps/ops.mlir index 067345af0d9..77d40f5e84d 100644 --- a/mlir/test/Dialect/VectorOps/ops.mlir +++ b/mlir/test/Dialect/VectorOps/ops.mlir @@ -1,5 +1,27 @@ // RUN: mlir-opt %s | mlir-opt | FileCheck %s +// CHECK-LABEL: func @vector_transfer_ops( +func @vector_transfer_ops(%arg0: memref<?x?xf32>) { + %c3 = constant 3 : index + %cst = constant 3.0 : f32 + %f0 = constant 0.0 : f32 + // + // CHECK: %0 = vector.transfer_read + %0 = vector.transfer_read %arg0[%c3, %c3], %f0 {permutation_map = (d0, d1)->(d0)} : memref<?x?xf32>, vector<128xf32> + // CHECK: %1 = vector.transfer_read + %1 = vector.transfer_read %arg0[%c3, %c3], %f0 {permutation_map = (d0, d1)->(d1, d0)} : memref<?x?xf32>, vector<3x7xf32> + // CHECK: vector.transfer_read + %2 = vector.transfer_read %arg0[%c3, %c3], %cst {permutation_map = (d0, d1)->(d0)} : memref<?x?xf32>, vector<128xf32> + // CHECK: vector.transfer_read + %3 = vector.transfer_read %arg0[%c3, %c3], %cst {permutation_map = (d0, d1)->(d1)} : memref<?x?xf32>, vector<128xf32> + // + // CHECK: vector.transfer_write + vector.transfer_write %0, %arg0[%c3, %c3] {permutation_map = (d0, d1)->(d0)} : vector<128xf32>, memref<?x?xf32> + // CHECK: vector.transfer_write + vector.transfer_write %1, %arg0[%c3, %c3] {permutation_map = (d0, d1)->(d1, d0)} : vector<3x7xf32>, memref<?x?xf32> + return +} + // CHECK-LABEL: extractelement func @extractelement(%arg0: vector<4x8x16xf32>) -> (vector<8x16xf32>, vector<16xf32>, f32) { // CHECK: vector.extractelement {{.*}}[3 : i32] : vector<4x8x16xf32> |

