summaryrefslogtreecommitdiffstats
path: root/mlir/test/Dialect/VectorOps
diff options
context:
space:
mode:
authorNicolas Vasilache <ntv@google.com>2019-11-14 08:10:36 -0800
committerA. Unique TensorFlower <gardener@tensorflow.org>2019-11-14 08:15:23 -0800
commitf2b6ae99913d0049c7929160aed5f213b1081abb (patch)
tree41ccb1f9a181eaada07f21cbc7da75ef2d229575 /mlir/test/Dialect/VectorOps
parent7c28de4aef6da3ab2f53118ecf717e56c68352e7 (diff)
downloadbcm5719-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.mlir143
-rw-r--r--mlir/test/Dialect/VectorOps/ops.mlir22
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>
OpenPOWER on IntegriCloud