[Mlir-commits] [mlir] 91801a7 - [mlir] [integration-test] [VectorOps] Start an integration test directory for MLIR
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Jun 15 11:06:08 PDT 2020
Author: aartbik
Date: 2020-06-15T11:05:58-07:00
New Revision: 91801a7c34d08931498304d93fd718aeeff2cbc7
URL: https://github.com/llvm/llvm-project/commit/91801a7c34d08931498304d93fd718aeeff2cbc7
DIFF: https://github.com/llvm/llvm-project/commit/91801a7c34d08931498304d93fd718aeeff2cbc7.diff
LOG: [mlir] [integration-test] [VectorOps] Start an integration test directory for MLIR
Summary:
This CL introduces an integration test directory for MLIR in general, with
vector dialect integration tests in particular as a first working suite. To
run all the integration tests (and currently just the vector suite):
$ cmake --build . --target check-mlir-integration
[0/1] Running the MLIR integration tests
Testing Time: 0.24s
Passed: 22
The general call is to contribute to this integration test directory with more
tests and other suites, running end-to-end examples that may be too heavy for
the regular test directory, but should be tested occasionally to verify the
health of MLIR.
Background discussion at:
https://llvm.discourse.group/t/vectorops-rfc-add-suite-of-integration-tests-for-vector-dialect-operations/1213/
Reviewers: nicolasvasilache, reidtatge, andydavis1, rriddle, ftynse, mehdi_amini, jpienaar, stephenneuendorffer
Reviewed By: nicolasvasilache, stephenneuendorffer
Subscribers: mgorny, mehdi_amini, rriddle, jpienaar, shauheen, antiagainst, nicolasvasilache, arpith-jacob, mgester, lucyrfox, liufengdb, stephenneuendorffer, Joonsoo, grosul1, frgossen, Kayjukh, jurahul, msifontes
Tags: #mlir
Differential Revision: https://reviews.llvm.org/D81626
Added:
mlir/integration_test/CMakeLists.txt
mlir/integration_test/Dialect/Vector/CPU/lit.local.cfg
mlir/integration_test/Dialect/Vector/CPU/test-broadcast.mlir
mlir/integration_test/Dialect/Vector/CPU/test-constant-mask.mlir
mlir/integration_test/Dialect/Vector/CPU/test-contraction.mlir
mlir/integration_test/Dialect/Vector/CPU/test-extract-slices.mlir
mlir/integration_test/Dialect/Vector/CPU/test-extract-strided-slice.mlir
mlir/integration_test/Dialect/Vector/CPU/test-flat-transpose-col.mlir
mlir/integration_test/Dialect/Vector/CPU/test-flat-transpose-row.mlir
mlir/integration_test/Dialect/Vector/CPU/test-fma.mlir
mlir/integration_test/Dialect/Vector/CPU/test-insert-slices.mlir
mlir/integration_test/Dialect/Vector/CPU/test-insert-strided-slice.mlir
mlir/integration_test/Dialect/Vector/CPU/test-matrix-multiply-col.mlir
mlir/integration_test/Dialect/Vector/CPU/test-matrix-multiply-row.mlir
mlir/integration_test/Dialect/Vector/CPU/test-outerproduct.mlir
mlir/integration_test/Dialect/Vector/CPU/test-reductions-f32.mlir
mlir/integration_test/Dialect/Vector/CPU/test-reductions-f64.mlir
mlir/integration_test/Dialect/Vector/CPU/test-reductions-i32.mlir
mlir/integration_test/Dialect/Vector/CPU/test-reductions-i64.mlir
mlir/integration_test/Dialect/Vector/CPU/test-shape-cast.mlir
mlir/integration_test/Dialect/Vector/CPU/test-shuffle.mlir
mlir/integration_test/Dialect/Vector/CPU/test-transfer-read.mlir
mlir/integration_test/Dialect/Vector/CPU/test-transfer-write.mlir
mlir/integration_test/Dialect/Vector/CPU/test-transpose.mlir
mlir/integration_test/lit.cfg.py
mlir/integration_test/lit.site.cfg.py.in
Modified:
mlir/CMakeLists.txt
Removed:
################################################################################
diff --git a/mlir/CMakeLists.txt b/mlir/CMakeLists.txt
index 291a7f26d3cc..df219d5dd603 100644
--- a/mlir/CMakeLists.txt
+++ b/mlir/CMakeLists.txt
@@ -48,6 +48,10 @@ option(MLIR_INCLUDE_TESTS
"Generate build targets for the MLIR unit tests."
${LLVM_INCLUDE_TESTS})
+option(MLIR_INCLUDE_INTEGRATION_TESTS
+ "Generate build targets for the MLIR integration tests."
+ ${LLVM_INCLUDE_TESTS})
+
include_directories( "include")
include_directories( ${MLIR_INCLUDE_DIR})
@@ -63,6 +67,10 @@ if (MLIR_INCLUDE_TESTS)
add_subdirectory(unittests)
add_subdirectory(test)
endif()
+if (MLIR_INCLUDE_INTEGRATION_TESTS)
+ add_definitions(-DMLIR_INCLUDE_INTEGRATION_TESTS)
+ add_subdirectory(integration_test)
+endif()
# Tools needs to come late to ensure that MLIR_ALL_LIBS is populated.
# Generally things after this point may depend on MLIR_ALL_LIBS or libMLIR.so.
add_subdirectory(tools)
diff --git a/mlir/integration_test/CMakeLists.txt b/mlir/integration_test/CMakeLists.txt
new file mode 100644
index 000000000000..d2a768da1a3e
--- /dev/null
+++ b/mlir/integration_test/CMakeLists.txt
@@ -0,0 +1,26 @@
+# Passed to lit.site.cfg.py.in to set up the path where to find the libraries.
+set(MLIR_INTEGRATION_TEST_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
+
+set(MLIR_INTEGRATION_TEST_DEPENDS
+ FileCheck count not
+ mlir-cpu-runner
+ mlir-opt
+ mlir_runner_utils
+ mlir_c_runner_utils
+ )
+
+configure_lit_site_cfg(
+ ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
+ ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py
+ ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py
+ )
+
+add_lit_testsuite(check-mlir-integration "Running the MLIR integration tests"
+ ${CMAKE_CURRENT_BINARY_DIR}
+ DEPENDS ${MLIR_INTEGRATION_TEST_DEPENDS}
+ )
+set_target_properties(check-mlir-integration PROPERTIES FOLDER "integration_test")
+
+add_lit_testsuites(MLIR_INTEGRATION ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS ${MLIR_INTEGRATION_TEST_DEPENDS}
+ )
diff --git a/mlir/integration_test/Dialect/Vector/CPU/lit.local.cfg b/mlir/integration_test/Dialect/Vector/CPU/lit.local.cfg
new file mode 100644
index 000000000000..83247d7e3744
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/lit.local.cfg
@@ -0,0 +1,5 @@
+import sys
+
+# No JIT on win32.
+if sys.platform == 'win32':
+ config.unsupported = True
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-broadcast.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-broadcast.mlir
new file mode 100644
index 000000000000..d0e4beabb763
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-broadcast.mlir
@@ -0,0 +1,82 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %i = constant 2147483647: i32
+ %l = constant 9223372036854775807 : i64
+
+ %f0 = constant 0.0: f32
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %f5 = constant 5.0: f32
+
+ // Test simple broadcasts.
+ %vi = vector.broadcast %i : i32 to vector<2xi32>
+ %vl = vector.broadcast %l : i64 to vector<2xi64>
+ %vf = vector.broadcast %f1 : f32 to vector<2x2x2xf32>
+ vector.print %vi : vector<2xi32>
+ vector.print %vl : vector<2xi64>
+ vector.print %vf : vector<2x2x2xf32>
+ // CHECK: ( 2147483647, 2147483647 )
+ // CHECK: ( 9223372036854775807, 9223372036854775807 )
+ // CHECK: ( ( ( 1, 1 ), ( 1, 1 ) ), ( ( 1, 1 ), ( 1, 1 ) ) )
+
+ // Test "duplication" in leading dimensions.
+ %v0 = vector.broadcast %f1 : f32 to vector<4xf32>
+ %v1 = vector.insert %f2, %v0[1] : f32 into vector<4xf32>
+ %v2 = vector.insert %f3, %v1[2] : f32 into vector<4xf32>
+ %v3 = vector.insert %f4, %v2[3] : f32 into vector<4xf32>
+ %v4 = vector.broadcast %v3 : vector<4xf32> to vector<3x4xf32>
+ %v5 = vector.broadcast %v3 : vector<4xf32> to vector<2x2x4xf32>
+ vector.print %v3 : vector<4xf32>
+ vector.print %v4 : vector<3x4xf32>
+ vector.print %v5 : vector<2x2x4xf32>
+ // CHECK: ( 1, 2, 3, 4 )
+ // CHECK: ( ( 1, 2, 3, 4 ), ( 1, 2, 3, 4 ), ( 1, 2, 3, 4 ) )
+ // CHECK: ( ( ( 1, 2, 3, 4 ), ( 1, 2, 3, 4 ) ), ( ( 1, 2, 3, 4 ), ( 1, 2, 3, 4 ) ) )
+
+ // Test straightforward "stretch" on a 1-D "scalar".
+ %x = vector.broadcast %f5 : f32 to vector<1xf32>
+ %y = vector.broadcast %x : vector<1xf32> to vector<8xf32>
+ vector.print %y : vector<8xf32>
+ // CHECK : ( 5, 5, 5, 5, 5, 5, 5, 5 )
+
+ // Test "stretch" in leading dimension.
+ %s = vector.broadcast %v3 : vector<4xf32> to vector<1x4xf32>
+ %t = vector.broadcast %s : vector<1x4xf32> to vector<3x4xf32>
+ vector.print %s : vector<1x4xf32>
+ vector.print %t : vector<3x4xf32>
+ // CHECK: ( ( 1, 2, 3, 4 ) )
+ // CHECK: ( ( 1, 2, 3, 4 ), ( 1, 2, 3, 4 ), ( 1, 2, 3, 4 ) )
+
+ // Test "stretch" in trailing dimension.
+ %a0 = vector.broadcast %f1 : f32 to vector<3x1xf32>
+ %a1 = vector.insert %f2, %a0[1, 0] : f32 into vector<3x1xf32>
+ %a2 = vector.insert %f3, %a1[2, 0] : f32 into vector<3x1xf32>
+ %a3 = vector.broadcast %a2 : vector<3x1xf32> to vector<3x4xf32>
+ vector.print %a2 : vector<3x1xf32>
+ vector.print %a3 : vector<3x4xf32>
+ // CHECK: ( ( 1 ), ( 2 ), ( 3 ) )
+ // CHECK: ( ( 1, 1, 1, 1 ), ( 2, 2, 2, 2 ), ( 3, 3, 3, 3 ) )
+
+ // Test "stretch" in middle dimension.
+ %m0 = vector.broadcast %f0 : f32 to vector<3x1x2xf32>
+ %m1 = vector.insert %f1, %m0[0, 0, 1] : f32 into vector<3x1x2xf32>
+ %m2 = vector.insert %f2, %m1[1, 0, 0] : f32 into vector<3x1x2xf32>
+ %m3 = vector.insert %f3, %m2[1, 0, 1] : f32 into vector<3x1x2xf32>
+ %m4 = vector.insert %f4, %m3[2, 0, 0] : f32 into vector<3x1x2xf32>
+ %m5 = vector.insert %f5, %m4[2, 0, 1] : f32 into vector<3x1x2xf32>
+ %m6 = vector.broadcast %m5 : vector<3x1x2xf32> to vector<3x4x2xf32>
+ vector.print %m5 : vector<3x1x2xf32>
+ vector.print %m6 : vector<3x4x2xf32>
+ // CHECK: ( ( ( 0, 1 ) ), ( ( 2, 3 ) ), ( ( 4, 5 ) ) )
+ // CHECK: ( ( ( 0, 1 ), ( 0, 1 ), ( 0, 1 ), ( 0, 1 ) ),
+ // CHECK-SAME: ( ( 2, 3 ), ( 2, 3 ), ( 2, 3 ), ( 2, 3 ) ),
+ // CHECK-SAME: ( ( 4, 5 ), ( 4, 5 ), ( 4, 5 ), ( 4, 5 ) ) )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-constant-mask.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-constant-mask.mlir
new file mode 100644
index 000000000000..ebdd71e985ae
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-constant-mask.mlir
@@ -0,0 +1,49 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %0 = vector.constant_mask [4] : vector<8xi1>
+ vector.print %0 : vector<8xi1>
+ // CHECK: ( 1, 1, 1, 1, 0, 0, 0, 0 )
+
+ %1 = vector.constant_mask [1, 3] : vector<4x4xi1>
+ vector.print %1 : vector<4x4xi1>
+ // CHECK: ( ( 1, 1, 1, 0 ), ( 0, 0, 0, 0 ), ( 0, 0, 0, 0 ), ( 0, 0, 0, 0 ) )
+
+ %2 = vector.constant_mask [2, 2] : vector<4x4xi1>
+ vector.print %2 : vector<4x4xi1>
+ // CHECK: ( ( 1, 1, 0, 0 ), ( 1, 1, 0, 0 ), ( 0, 0, 0, 0 ), ( 0, 0, 0, 0 ) )
+
+ %3 = vector.constant_mask [2, 4] : vector<4x4xi1>
+ vector.print %3 : vector<4x4xi1>
+ // CHECK: ( ( 1, 1, 1, 1 ), ( 1, 1, 1, 1 ), ( 0, 0, 0, 0 ), ( 0, 0, 0, 0 ) )
+
+ %4 = vector.constant_mask [3, 1] : vector<4x4xi1>
+ vector.print %4 : vector<4x4xi1>
+ // CHECK: ( ( 1, 0, 0, 0 ), ( 1, 0, 0, 0 ), ( 1, 0, 0, 0 ), ( 0, 0, 0, 0 ) )
+
+ %5 = vector.constant_mask [3, 2] : vector<4x4xi1>
+ vector.print %5 : vector<4x4xi1>
+ // CHECK: ( ( 1, 1, 0, 0 ), ( 1, 1, 0, 0 ), ( 1, 1, 0, 0 ), ( 0, 0, 0, 0 ) )
+
+ %6 = vector.constant_mask [4, 3] : vector<4x4xi1>
+ vector.print %6 : vector<4x4xi1>
+ // CHECK: ( ( 1, 1, 1, 0 ), ( 1, 1, 1, 0 ), ( 1, 1, 1, 0 ), ( 1, 1, 1, 0 ) )
+
+ %7 = vector.constant_mask [4, 4] : vector<4x4xi1>
+ vector.print %7 : vector<4x4xi1>
+ // CHECK: ( ( 1, 1, 1, 1 ), ( 1, 1, 1, 1 ), ( 1, 1, 1, 1 ), ( 1, 1, 1, 1 ) )
+
+ %8 = vector.constant_mask [1, 2, 3] : vector<2x3x4xi1>
+ vector.print %8 : vector<2x3x4xi1>
+ // CHECK: ( ( ( 1, 1, 1, 0 ), ( 1, 1, 1, 0 ), ( 0, 0, 0, 0 ) ), ( ( 0, 0, 0, 0 ), ( 0, 0, 0, 0 ), ( 0, 0, 0, 0 ) ) )
+
+ %9 = vector.constant_mask [2, 2, 3] : vector<2x3x4xi1>
+ vector.print %9 : vector<2x3x4xi1>
+ // CHECK: ( ( ( 1, 1, 1, 0 ), ( 1, 1, 1, 0 ), ( 0, 0, 0, 0 ) ), ( ( 1, 1, 1, 0 ), ( 1, 1, 1, 0 ), ( 0, 0, 0, 0 ) ) )
+
+ return
+}
+
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-contraction.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-contraction.mlir
new file mode 100644
index 000000000000..e45cc57bf3ef
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-contraction.mlir
@@ -0,0 +1,383 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+#dotp_accesses = [
+ affine_map<(i) -> (i)>,
+ affine_map<(i) -> (i)>,
+ affine_map<(i) -> ()>
+]
+#dotp_trait = {
+ indexing_maps = #dotp_accesses,
+ iterator_types = ["reduction"]
+}
+
+#matvec_accesses = [
+ affine_map<(i, j) -> (i, j)>,
+ affine_map<(i, j) -> (j)>,
+ affine_map<(i, j) -> (i)>
+]
+#matvec_trait = {
+ indexing_maps = #matvec_accesses,
+ iterator_types = ["parallel", "reduction"]
+}
+
+#mattransvec_accesses = [
+ affine_map<(i, j) -> (j, i)>,
+ affine_map<(i, j) -> (j)>,
+ affine_map<(i, j) -> (i)>
+]
+#mattransvec_trait = {
+ indexing_maps = #mattransvec_accesses,
+ iterator_types = ["parallel", "reduction"]
+}
+
+#matmat_accesses = [
+ affine_map<(i, j, k) -> (i, k)>,
+ affine_map<(i, j, k) -> (k, j)>,
+ affine_map<(i, j, k) -> (i, j)>
+]
+#matmat_trait = {
+ indexing_maps = #matmat_accesses,
+ iterator_types = ["parallel", "parallel", "reduction"]
+}
+
+#mattransmat_accesses = [
+ affine_map<(i, j, k) -> (k, i)>,
+ affine_map<(i, j, k) -> (k, j)>,
+ affine_map<(i, j, k) -> (i, j)>
+]
+#mattransmat_trait = {
+ indexing_maps = #mattransmat_accesses,
+ iterator_types = ["parallel", "parallel", "reduction"]
+}
+
+#matmattrans_accesses = [
+ affine_map<(i, j, k) -> (i, k)>,
+ affine_map<(i, j, k) -> (j, k)>,
+ affine_map<(i, j, k) -> (i, j)>
+]
+#matmattrans_trait = {
+ indexing_maps = #matmattrans_accesses,
+ iterator_types = ["parallel", "parallel", "reduction"]
+}
+
+#mattransmattrans_accesses = [
+ affine_map<(i, j, k) -> (k, i)>,
+ affine_map<(i, j, k) -> (j, k)>,
+ affine_map<(i, j, k) -> (i, j)>
+]
+#mattransmattrans_trait = {
+ indexing_maps = #mattransmattrans_accesses,
+ iterator_types = ["parallel", "parallel", "reduction"]
+}
+
+#matmat_then_trans_accesses = [
+ affine_map<(i, j, k) -> (i, k)>,
+ affine_map<(i, j, k) -> (k, j)>,
+ affine_map<(i, j, k) -> (j, i)>
+]
+#matmat_then_trans_trait = {
+ indexing_maps = #matmat_then_trans_accesses,
+ iterator_types = ["parallel", "parallel", "reduction"]
+}
+
+#contract2d_accesses = [
+ affine_map<(i, j) -> (i, j)>,
+ affine_map<(i, j) -> (i, j)>,
+ affine_map<(i, j) -> ()>
+]
+#contract2d_trait = {
+ indexing_maps = #contract2d_accesses,
+ iterator_types = ["reduction", "reduction"]
+}
+
+#contract2d_alt_accesses = [
+ affine_map<(i, j) -> (j, i)>,
+ affine_map<(i, j) -> (j, i)>,
+ affine_map<(i, j) -> ()>
+]
+#contract2d_alt_trait = {
+ indexing_maps = #contract2d_alt_accesses,
+ iterator_types = ["reduction", "reduction"]
+}
+
+#contract2d_trans_accesses = [
+ affine_map<(i, j) -> (i, j)>,
+ affine_map<(i, j) -> (j, i)>,
+ affine_map<(i, j) -> ()>
+]
+#contract2d_trans_trait = {
+ indexing_maps = #contract2d_trans_accesses,
+ iterator_types = ["reduction", "reduction"]
+}
+
+#contract2d_trans_alt_accesses = [
+ affine_map<(i, j) -> (j, i)>,
+ affine_map<(i, j) -> (i, j)>,
+ affine_map<(i, j) -> ()>
+]
+#contract2d_trans_alt_trait = {
+ indexing_maps = #contract2d_trans_alt_accesses,
+ iterator_types = ["reduction", "reduction"]
+}
+
+#column_major_matmat_accesses = [
+ affine_map<(i, j, k) -> (k, j)>,
+ affine_map<(i, j, k) -> (i, k)>,
+ affine_map<(i, j, k) -> (j, i)>
+]
+#column_major_matmat_trait = {
+ indexing_maps = #column_major_matmat_accesses,
+ iterator_types = ["parallel", "parallel", "reduction"]
+}
+
+func @entry() {
+ %f0 = constant 0.0: f32
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %f5 = constant 5.0: f32
+ %f6 = constant 6.0: f32
+ %f7 = constant 7.0: f32
+ %f8 = constant 8.0: f32
+
+ // Zero vectors.
+ %z1 = vector.broadcast %f0 : f32 to vector<2xf32>
+ %z2 = vector.broadcast %f0 : f32 to vector<2x2xf32>
+ %z3 = vector.broadcast %f0 : f32 to vector<3x4xf32>
+
+ // Construct test vectors.
+ %0 = vector.broadcast %f1 : f32 to vector<2xf32>
+ %a = vector.insert %f2, %0[1] : f32 into vector<2xf32>
+ %1 = vector.broadcast %f3 : f32 to vector<2xf32>
+ %b = vector.insert %f4, %1[1] : f32 into vector<2xf32>
+ %2 = vector.broadcast %f5 : f32 to vector<2xf32>
+ %c = vector.insert %f6, %2[1] : f32 into vector<2xf32>
+ %3 = vector.broadcast %f7 : f32 to vector<2xf32>
+ %d = vector.insert %f8, %3[1] : f32 into vector<2xf32>
+
+ vector.print %a : vector<2xf32>
+ vector.print %b : vector<2xf32>
+ vector.print %c : vector<2xf32>
+ vector.print %d : vector<2xf32>
+ //
+ // test vectors:
+ //
+ // CHECK: ( 1, 2 )
+ // CHECK: ( 3, 4 )
+ // CHECK: ( 5, 6 )
+ // CHECK: ( 7, 8 )
+
+ // Construct test matrices.
+ %4 = vector.broadcast %f0 : f32 to vector<2x2xf32>
+ %5 = vector.insert %a, %4[0] : vector<2xf32> into vector<2x2xf32>
+ %A = vector.insert %b, %5[1] : vector<2xf32> into vector<2x2xf32>
+ %6 = vector.broadcast %f0 : f32 to vector<2x2xf32>
+ %7 = vector.insert %c, %6[0] : vector<2xf32> into vector<2x2xf32>
+ %B = vector.insert %d, %7[1] : vector<2xf32> into vector<2x2xf32>
+ %8 = vector.broadcast %f0 : f32 to vector<3x2xf32>
+ %9 = vector.insert %a, %8[0] : vector<2xf32> into vector<3x2xf32>
+ %10 = vector.insert %b, %9[1] : vector<2xf32> into vector<3x2xf32>
+ %C = vector.insert %c, %10[2] : vector<2xf32> into vector<3x2xf32>
+ %11 = vector.tuple %A, %B : vector<2x2xf32>, vector<2x2xf32>
+ %D = vector.insert_slices %11, [2, 2], [1, 1]
+ : tuple<vector<2x2xf32>, vector<2x2xf32>> into vector<2x4xf32>
+
+ vector.print %A : vector<2x2xf32>
+ vector.print %B : vector<2x2xf32>
+ vector.print %C : vector<3x2xf32>
+ vector.print %D : vector<2x4xf32>
+ //
+ // test matrices:
+ //
+ // CHECK: ( ( 1, 2 ), ( 3, 4 ) )
+ // CHECK: ( ( 5, 6 ), ( 7, 8 ) )
+ // CHECK: ( ( 1, 2 ), ( 3, 4 ), ( 5, 6 ) )
+ // CHECK: ( ( 1, 2, 5, 6 ), ( 3, 4, 7, 8 ) )
+
+ // Contraction: dot-product a x b
+ %dp1 = vector.contract #dotp_trait %a, %b, %f0
+ : vector<2xf32>, vector<2xf32> into f32
+ %dp2 = vector.contract #dotp_trait %a, %b, %f1
+ : vector<2xf32>, vector<2xf32> into f32
+
+ vector.print %dp1 : f32
+ vector.print %dp2 : f32
+ //
+ // dot products:
+ //
+ // CHECK: 11
+ // CHECK: 12
+
+ // Contraction: matrix-vector A x c
+ %mv1 = vector.contract #matvec_trait %A, %c, %z1
+ : vector<2x2xf32>, vector<2xf32> into vector<2xf32>
+ %mv2 = vector.contract #matvec_trait %A, %c, %a
+ : vector<2x2xf32>, vector<2xf32> into vector<2xf32>
+
+ vector.print %mv1 : vector<2xf32>
+ vector.print %mv2 : vector<2xf32>
+ //
+ // matrix x vector:
+ //
+ // CHECK: ( 17, 39 )
+ // CHECK: ( 18, 41 )
+
+ // Contraction: matrix-trans-vector A^T x c
+ %mv3 = vector.contract #mattransvec_trait %A, %c, %z1
+ : vector<2x2xf32>, vector<2xf32> into vector<2xf32>
+ %mv4 = vector.contract #mattransvec_trait %A, %c, %a
+ : vector<2x2xf32>, vector<2xf32> into vector<2xf32>
+
+ vector.print %mv3 : vector<2xf32>
+ vector.print %mv4 : vector<2xf32>
+ //
+ // matrix x vector:
+ //
+ // CHECK: ( 23, 34 )
+ // CHECK: ( 24, 36 )
+
+ // Contraction: matrix-matrix A x B
+ %mm1 = vector.contract #matmat_trait %A, %B, %z2
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+ %mm2 = vector.contract #matmat_trait %A, %B, %A
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+
+ vector.print %mm1 : vector<2x2xf32>
+ vector.print %mm2 : vector<2x2xf32>
+ //
+ // matrix x matrix:
+ //
+ // CHECK: ( ( 19, 22 ), ( 43, 50 ) )
+ // CHECK: ( ( 20, 24 ), ( 46, 54 ) )
+
+ // Contraction: matrix-matrix A x B where A, B, C have column-major layout.
+ // ( 1 * 5 + 3 * 6 = 23, 2 * 5 + 4 * 6 = 34)
+ // ( 1 * 7 + 3 * 8 = 31, 2 * 7 + 4 * 8 = 46)
+ // +
+ // ( ( 1, 2 ), ( 3, 4 ) )
+ %llvm_matrix_column_major_mm0 =
+ vector.contract #column_major_matmat_trait %A, %B, %z2
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+ %llvm_matrix_column_major_mm1 =
+ vector.contract #column_major_matmat_trait %A, %B, %A
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+
+ vector.print %llvm_matrix_column_major_mm0 : vector<2x2xf32>
+ vector.print %llvm_matrix_column_major_mm1 : vector<2x2xf32>
+ //
+ // matrix x matrix:
+ //
+ // CHECK: ( ( 23, 31 ), ( 34, 46 ) )
+ // CHECK: ( ( 24, 33 ), ( 37, 50 ) )
+
+ // Contraction: matrix-trans-matrix A^T x B
+ %mm3 = vector.contract #mattransmat_trait %A, %B, %z2
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+ %mm4 = vector.contract #mattransmat_trait %A, %B, %A
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+
+ vector.print %mm3 : vector<2x2xf32>
+ vector.print %mm4 : vector<2x2xf32>
+ //
+ // matrix x matrix:
+ //
+ // CHECK: ( ( 26, 30 ), ( 38, 44 ) )
+ // CHECK: ( ( 27, 32 ), ( 41, 48 ) )
+
+ // Contraction: matrix-matrix-trans A x B^T
+ %mm5 = vector.contract #matmattrans_trait %A, %B, %z2
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+ %mm6 = vector.contract #matmattrans_trait %A, %B, %A
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+
+ vector.print %mm5 : vector<2x2xf32>
+ vector.print %mm6 : vector<2x2xf32>
+ //
+ // matrix x matrix:
+ //
+ // CHECK: ( ( 17, 23 ), ( 39, 53 ) )
+ // CHECK: ( ( 18, 25 ), ( 42, 57 ) )
+
+ // Contraction: matrix-trans-matrix-trans A^T x B^T
+ %mm7 = vector.contract #mattransmattrans_trait %A, %B, %z2
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+ %mm8 = vector.contract #mattransmattrans_trait %A, %B, %A
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+
+ vector.print %mm7 : vector<2x2xf32>
+ vector.print %mm8 : vector<2x2xf32>
+ //
+ // matrix x matrix:
+ //
+ // CHECK: ( ( 23, 31 ), ( 34, 46 ) )
+ // CHECK: ( ( 24, 33 ), ( 37, 50 ) )
+
+ // Contraction: matrix-matrix-then-trans (A x B)^T
+ %mm9 = vector.contract #matmat_then_trans_trait %A, %B, %z2
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+ %mm10 = vector.contract #matmat_then_trans_trait %A, %B, %A
+ : vector<2x2xf32>, vector<2x2xf32> into vector<2x2xf32>
+
+ vector.print %mm9 : vector<2x2xf32>
+ vector.print %mm10 : vector<2x2xf32>
+ //
+ // matrix x matrix:
+ //
+ // CHECK: ( ( 19, 43 ), ( 22, 50 ) )
+ // CHECK: ( ( 20, 45 ), ( 25, 54 ) )
+
+ // Contraction: matrix-matrix C x D
+ %mm11 = vector.contract #matmat_trait %C, %D, %z3
+ : vector<3x2xf32>, vector<2x4xf32> into vector<3x4xf32>
+ %mm12 = vector.contract #matmat_trait %C, %D, %mm11
+ : vector<3x2xf32>, vector<2x4xf32> into vector<3x4xf32>
+
+ vector.print %mm11 : vector<3x4xf32>
+ vector.print %mm12 : vector<3x4xf32>
+ // CHECK: ( ( 7, 10, 19, 22 ), ( 15, 22, 43, 50 ), ( 23, 34, 67, 78 ) )
+ // CHECK: ( ( 14, 20, 38, 44 ), ( 30, 44, 86, 100 ), ( 46, 68, 134, 156 ) )
+
+ // Contractions in 2D.
+ %c1 = vector.contract #contract2d_trait %A, %B, %f0
+ : vector<2x2xf32>, vector<2x2xf32> into f32
+ %c2 = vector.contract #contract2d_trait %A, %B, %f1
+ : vector<2x2xf32>, vector<2x2xf32> into f32
+ %c3 = vector.contract #contract2d_alt_trait %A, %B, %f0
+ : vector<2x2xf32>, vector<2x2xf32> into f32
+ %c4 = vector.contract #contract2d_alt_trait %A, %B, %f1
+ : vector<2x2xf32>, vector<2x2xf32> into f32
+ %c5 = vector.contract #contract2d_trans_trait %A, %B, %f0
+ : vector<2x2xf32>, vector<2x2xf32> into f32
+ %c6 = vector.contract #contract2d_trans_trait %A, %B, %f1
+ : vector<2x2xf32>, vector<2x2xf32> into f32
+ %c7 = vector.contract #contract2d_trans_alt_trait %A, %B, %f0
+ : vector<2x2xf32>, vector<2x2xf32> into f32
+ %c8 = vector.contract #contract2d_trans_alt_trait %A, %B, %f1
+ : vector<2x2xf32>, vector<2x2xf32> into f32
+
+ vector.print %c1 : f32
+ vector.print %c2 : f32
+ vector.print %c3 : f32
+ vector.print %c4 : f32
+ vector.print %c5 : f32
+ vector.print %c6 : f32
+ vector.print %c7 : f32
+ vector.print %c8 : f32
+ //
+ // 2D contractions:
+ //
+ // CHECK: 70
+ // CHECK: 71
+ // CHECK: 70
+ // CHECK: 71
+ // CHECK: 69
+ // CHECK: 70
+ // CHECK: 69
+ // CHECK: 70
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-extract-slices.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-extract-slices.mlir
new file mode 100644
index 000000000000..908654f1fa5b
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-extract-slices.mlir
@@ -0,0 +1,79 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f0 = constant 0.0: f32
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %f5 = constant 5.0: f32
+ %f6 = constant 6.0: f32
+ %f7 = constant 7.0: f32
+ %f8 = constant 8.0: f32
+ %f9 = constant 9.0: f32
+ %f10 = constant 10.0: f32
+ %f11 = constant 11.0: f32
+ %f12 = constant 12.0: f32
+ %f13 = constant 13.0: f32
+ %f14 = constant 14.0: f32
+ %f15 = constant 15.0: f32
+
+ %a0 = vector.broadcast %f0 : f32 to vector<4x4xf32>
+ %a1 = vector.insert %f0, %a0[0, 0] : f32 into vector<4x4xf32>
+ %a2 = vector.insert %f1, %a1[0, 1] : f32 into vector<4x4xf32>
+ %a3 = vector.insert %f2, %a2[0, 2] : f32 into vector<4x4xf32>
+ %a4 = vector.insert %f3, %a3[0, 3] : f32 into vector<4x4xf32>
+ %a5 = vector.insert %f4, %a4[1, 0] : f32 into vector<4x4xf32>
+ %a6 = vector.insert %f5, %a5[1, 1] : f32 into vector<4x4xf32>
+ %a7 = vector.insert %f6, %a6[1, 2] : f32 into vector<4x4xf32>
+ %a8 = vector.insert %f7, %a7[1, 3] : f32 into vector<4x4xf32>
+ %a9 = vector.insert %f8, %a8[2, 0] : f32 into vector<4x4xf32>
+ %a10 = vector.insert %f9, %a9[2, 1] : f32 into vector<4x4xf32>
+ %a11 = vector.insert %f10, %a10[2, 2] : f32 into vector<4x4xf32>
+ %a12 = vector.insert %f11, %a11[2, 3] : f32 into vector<4x4xf32>
+ %a13 = vector.insert %f12, %a12[3, 0] : f32 into vector<4x4xf32>
+ %a14 = vector.insert %f13, %a13[3, 1] : f32 into vector<4x4xf32>
+ %a15 = vector.insert %f14, %a14[3, 2] : f32 into vector<4x4xf32>
+ %a16 = vector.insert %f15, %a15[3, 3] : f32 into vector<4x4xf32>
+
+ vector.print %a16 : vector<4x4xf32>
+ //
+ // test matrix:
+ //
+ // CHECK: ( ( 0, 1, 2, 3 ), ( 4, 5, 6, 7 ), ( 8, 9, 10, 11 ), ( 12, 13, 14, 15 ) )
+
+ // Tile 4x4 with 3x3 as follows:
+ //
+ // +--------+--+
+ // +0 1 2| 3|
+ // |4 5 6| 7|
+ // |8 9 10|11|
+ // +--------+--+
+ // |12 13 14|15|
+ // +--------+--+
+ //
+ %es = vector.extract_slices %a16, [3, 3], [1, 1] :
+ vector<4x4xf32> into tuple<vector<3x3xf32>, vector<3x1xf32>, vector<1x3xf32>, vector<1x1xf32>>
+
+ %0 = vector.tuple_get %es, 0 : tuple<vector<3x3xf32>, vector<3x1xf32>, vector<1x3xf32>, vector<1x1xf32>>
+ %1 = vector.tuple_get %es, 1 : tuple<vector<3x3xf32>, vector<3x1xf32>, vector<1x3xf32>, vector<1x1xf32>>
+ %2 = vector.tuple_get %es, 2 : tuple<vector<3x3xf32>, vector<3x1xf32>, vector<1x3xf32>, vector<1x1xf32>>
+ %3 = vector.tuple_get %es, 3 : tuple<vector<3x3xf32>, vector<3x1xf32>, vector<1x3xf32>, vector<1x1xf32>>
+
+ vector.print %0 : vector<3x3xf32>
+ vector.print %1 : vector<3x1xf32>
+ vector.print %2 : vector<1x3xf32>
+ vector.print %3 : vector<1x1xf32>
+ //
+ // extract slices:
+ //
+ // CHECK: ( ( 0, 1, 2 ), ( 4, 5, 6 ), ( 8, 9, 10 ) )
+ // CHECK: ( ( 3 ), ( 7 ), ( 11 ) )
+ // CHECK: ( ( 12, 13, 14 ) )
+ // CHECK: ( ( 15 ) )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-extract-strided-slice.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-extract-strided-slice.mlir
new file mode 100644
index 000000000000..4087bb7db14b
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-extract-strided-slice.mlir
@@ -0,0 +1,32 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f0 = constant 0.0: f32
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %v1 = vector.broadcast %f1 : f32 to vector<8xf32>
+ %v2 = vector.broadcast %f2 : f32 to vector<8xf32>
+ %v3 = vector.broadcast %f3 : f32 to vector<8xf32>
+ %v4 = vector.broadcast %f4 : f32 to vector<8xf32>
+
+ %a0 = vector.broadcast %f0 : f32 to vector<4x4x8xf32>
+ %a1 = vector.insert %v1, %a0[1, 1] : vector<8xf32> into vector<4x4x8xf32>
+ %a2 = vector.insert %v2, %a1[1, 2] : vector<8xf32> into vector<4x4x8xf32>
+ %a3 = vector.insert %v3, %a2[2, 1] : vector<8xf32> into vector<4x4x8xf32>
+ %a4 = vector.insert %v4, %a3[2, 2] : vector<8xf32> into vector<4x4x8xf32>
+
+ %ss = vector.extract_strided_slice %a4 {offsets = [1, 1], sizes = [2, 2], strides = [1, 1]} : vector<4x4x8xf32> to vector<2x2x8xf32>
+
+ vector.print %ss : vector<2x2x8xf32>
+ //
+ // extract strided slice:
+ //
+ // CHECK: ( ( ( 1, 1, 1, 1, 1, 1, 1, 1 ), ( 2, 2, 2, 2, 2, 2, 2, 2 ) ), ( ( 3, 3, 3, 3, 3, 3, 3, 3 ), ( 4, 4, 4, 4, 4, 4, 4, 4 ) ) )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-flat-transpose-col.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-flat-transpose-col.mlir
new file mode 100644
index 000000000000..2d8972a4631d
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-flat-transpose-col.mlir
@@ -0,0 +1,78 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -lower-matrix-intrinsics -matrix-allow-contract -matrix-default-layout=column-major \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f0 = constant 0.0: f64
+ %f1 = constant 1.0: f64
+ %f2 = constant 2.0: f64
+ %f3 = constant 3.0: f64
+ %f4 = constant 4.0: f64
+ %f5 = constant 5.0: f64
+ %f6 = constant 6.0: f64
+ %f7 = constant 7.0: f64
+
+ // Construct test vectors.
+ %0 = vector.broadcast %f0 : f64 to vector<4xf64>
+ %1 = vector.insert %f1, %0[1] : f64 into vector<4xf64>
+ %2 = vector.insert %f2, %1[2] : f64 into vector<4xf64>
+ %a = vector.insert %f3, %2[3] : f64 into vector<4xf64>
+ %3 = vector.broadcast %f4 : f64 to vector<4xf64>
+ %4 = vector.insert %f5, %3[1] : f64 into vector<4xf64>
+ %5 = vector.insert %f6, %4[2] : f64 into vector<4xf64>
+ %b = vector.insert %f7, %5[3] : f64 into vector<4xf64>
+ %6 = vector.broadcast %f0 : f64 to vector<6xf64>
+ %7 = vector.insert %f1, %6[1] : f64 into vector<6xf64>
+ %8 = vector.insert %f2, %7[2] : f64 into vector<6xf64>
+ %9 = vector.insert %f3, %8[3] : f64 into vector<6xf64>
+ %10 = vector.insert %f4, %9[4] : f64 into vector<6xf64>
+ %c = vector.insert %f5, %10[5] : f64 into vector<6xf64>
+
+ vector.print %a : vector<4xf64>
+ vector.print %b : vector<4xf64>
+ vector.print %c : vector<6xf64>
+ //
+ // Test vectors:
+ //
+ // CHECK: ( 0, 1, 2, 3 )
+ // CHECK: ( 4, 5, 6, 7 )
+ // CHECK: ( 0, 1, 2, 3, 4, 5 )
+
+ // Performs matrix transpositions interpreting the vectors as
+ // flattened column-major 2-D matrices.
+ //
+ // ( 0, 2 ) ( 0, 1 ) | /|
+ // ( 1, 3 ) -> ( 2, 3 ) |/ | column-major!
+ //
+ // ( 4, 6 ) ( 4, 5 )
+ // ( 5, 7 ) -> ( 6, 7 )
+ //
+ // ( 0, 2, 4 ) ( 0, 1 )
+ // ( 1, 3, 5 ) -> ( 2, 3 )
+ // ( 4, 5 )
+ //
+ // ( 0, 3 ) ( 0, 1, 2 )
+ // ( 1, 4 ) -> ( 3, 4, 5 )
+ // ( 2, 5 )
+ //
+ %d = vector.flat_transpose %a { rows = 2: i32, columns = 2: i32 } : vector<4xf64> -> vector<4xf64>
+ %e = vector.flat_transpose %b { rows = 2: i32, columns = 2: i32 } : vector<4xf64> -> vector<4xf64>
+ %f = vector.flat_transpose %c { rows = 2: i32, columns = 3: i32 } : vector<6xf64> -> vector<6xf64>
+ %g = vector.flat_transpose %c { rows = 3: i32, columns = 2: i32 } : vector<6xf64> -> vector<6xf64>
+
+ vector.print %d : vector<4xf64>
+ vector.print %e : vector<4xf64>
+ vector.print %f : vector<6xf64>
+ vector.print %g : vector<6xf64>
+ //
+ // Transposed results:
+ //
+ // CHECK: ( 0, 2, 1, 3 )
+ // CHECK: ( 4, 6, 5, 7 )
+ // CHECK: ( 0, 2, 4, 1, 3, 5 )
+ // CHECK: ( 0, 3, 1, 4, 2, 5 )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-flat-transpose-row.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-flat-transpose-row.mlir
new file mode 100644
index 000000000000..23007ef1adc2
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-flat-transpose-row.mlir
@@ -0,0 +1,78 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -lower-matrix-intrinsics -matrix-allow-contract -matrix-default-layout=row-major \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f0 = constant 0.0: f64
+ %f1 = constant 1.0: f64
+ %f2 = constant 2.0: f64
+ %f3 = constant 3.0: f64
+ %f4 = constant 4.0: f64
+ %f5 = constant 5.0: f64
+ %f6 = constant 6.0: f64
+ %f7 = constant 7.0: f64
+
+ // Construct test vectors.
+ %0 = vector.broadcast %f0 : f64 to vector<4xf64>
+ %1 = vector.insert %f1, %0[1] : f64 into vector<4xf64>
+ %2 = vector.insert %f2, %1[2] : f64 into vector<4xf64>
+ %a = vector.insert %f3, %2[3] : f64 into vector<4xf64>
+ %3 = vector.broadcast %f4 : f64 to vector<4xf64>
+ %4 = vector.insert %f5, %3[1] : f64 into vector<4xf64>
+ %5 = vector.insert %f6, %4[2] : f64 into vector<4xf64>
+ %b = vector.insert %f7, %5[3] : f64 into vector<4xf64>
+ %6 = vector.broadcast %f0 : f64 to vector<6xf64>
+ %7 = vector.insert %f1, %6[1] : f64 into vector<6xf64>
+ %8 = vector.insert %f2, %7[2] : f64 into vector<6xf64>
+ %9 = vector.insert %f3, %8[3] : f64 into vector<6xf64>
+ %10 = vector.insert %f4, %9[4] : f64 into vector<6xf64>
+ %c = vector.insert %f5, %10[5] : f64 into vector<6xf64>
+
+ vector.print %a : vector<4xf64>
+ vector.print %b : vector<4xf64>
+ vector.print %c : vector<6xf64>
+ //
+ // Test vectors:
+ //
+ // CHECK: ( 0, 1, 2, 3 )
+ // CHECK: ( 4, 5, 6, 7 )
+ // CHECK: ( 0, 1, 2, 3, 4, 5 )
+
+ // Performs matrix transpositions interpreting the vectors as
+ // flattened row-major 2-D matrices.
+ //
+ // ( 0, 1 ) ( 0, 2 )
+ // ( 2, 3 ) -> ( 1, 3 )
+ //
+ // ( 4, 5 ) ( 4, 6 )
+ // ( 6, 7 ) -> ( 5, 7 )
+ //
+ // ( 0, 1, 2 ) ( 0, 3 )
+ // ( 3, 4, 5 ) -> ( 1, 4 )
+ // ( 2, 5 )
+ //
+ // ( 0, 1 ) ( 0, 2, 4 )
+ // ( 2, 3 ) -> ( 1, 3, 5 )
+ // ( 4, 5 )
+ //
+ %d = vector.flat_transpose %a { rows = 2: i32, columns = 2: i32 } : vector<4xf64> -> vector<4xf64>
+ %e = vector.flat_transpose %b { rows = 2: i32, columns = 2: i32 } : vector<4xf64> -> vector<4xf64>
+ %f = vector.flat_transpose %c { rows = 2: i32, columns = 3: i32 } : vector<6xf64> -> vector<6xf64>
+ %g = vector.flat_transpose %c { rows = 3: i32, columns = 2: i32 } : vector<6xf64> -> vector<6xf64>
+
+ vector.print %d : vector<4xf64>
+ vector.print %e : vector<4xf64>
+ vector.print %f : vector<6xf64>
+ vector.print %g : vector<6xf64>
+ //
+ // Transposed results:
+ //
+ // CHECK: ( 0, 2, 1, 3 )
+ // CHECK: ( 4, 6, 5, 7 )
+ // CHECK: ( 0, 3, 1, 4, 2, 5 )
+ // CHECK: ( 0, 2, 4, 1, 3, 5 )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-fma.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-fma.mlir
new file mode 100644
index 000000000000..94cf9e6f220a
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-fma.mlir
@@ -0,0 +1,28 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f1 = constant 1.0: f32
+ %f3 = constant 3.0: f32
+ %f7 = constant 7.0: f32
+ %v1 = vector.broadcast %f1 : f32 to vector<8xf32>
+ %v3 = vector.broadcast %f3 : f32 to vector<8xf32>
+ %v7 = vector.broadcast %f7 : f32 to vector<8xf32>
+ vector.print %v1 : vector<8xf32>
+ vector.print %v3 : vector<8xf32>
+ vector.print %v7 : vector<8xf32>
+ //
+ // test vectors:
+ //
+ // CHECK: ( 1, 1, 1, 1, 1, 1, 1, 1 )
+ // CHECK: ( 3, 3, 3, 3, 3, 3, 3, 3 )
+ // CHECK: ( 7, 7, 7, 7, 7, 7, 7, 7 )
+
+ %v = vector.fma %v3, %v7, %v1: vector<8xf32>
+ vector.print %v : vector<8xf32>
+ // CHECK: ( 22, 22, 22, 22, 22, 22, 22, 22 )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-insert-slices.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-insert-slices.mlir
new file mode 100644
index 000000000000..9c3c0e4bcbb0
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-insert-slices.mlir
@@ -0,0 +1,72 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f0 = constant 0.0: f32
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %f5 = constant 5.0: f32
+ %f6 = constant 6.0: f32
+ %f7 = constant 7.0: f32
+ %f8 = constant 8.0: f32
+ %f9 = constant 9.0: f32
+ %f10 = constant 10.0: f32
+ %f11 = constant 11.0: f32
+ %f12 = constant 12.0: f32
+ %f13 = constant 13.0: f32
+ %f14 = constant 14.0: f32
+ %f15 = constant 15.0: f32
+
+ %a0 = vector.broadcast %f0 : f32 to vector<3x3xf32>
+ %a1 = vector.insert %f0, %a0[0, 0] : f32 into vector<3x3xf32>
+ %a2 = vector.insert %f1, %a1[0, 1] : f32 into vector<3x3xf32>
+ %a3 = vector.insert %f2, %a2[0, 2] : f32 into vector<3x3xf32>
+ %a4 = vector.insert %f4, %a3[1, 0] : f32 into vector<3x3xf32>
+ %a5 = vector.insert %f5, %a4[1, 1] : f32 into vector<3x3xf32>
+ %a6 = vector.insert %f6, %a5[1, 2] : f32 into vector<3x3xf32>
+ %a7 = vector.insert %f8, %a6[2, 0] : f32 into vector<3x3xf32>
+ %a8 = vector.insert %f9, %a7[2, 1] : f32 into vector<3x3xf32>
+ %a9 = vector.insert %f10, %a8[2, 2] : f32 into vector<3x3xf32>
+
+ %b0 = vector.broadcast %f0 : f32 to vector<3x1xf32>
+ %b1 = vector.insert %f3, %b0[0, 0] : f32 into vector<3x1xf32>
+ %b2 = vector.insert %f7, %b1[1, 0] : f32 into vector<3x1xf32>
+ %b3 = vector.insert %f11, %b2[2, 0] : f32 into vector<3x1xf32>
+
+ %c0 = vector.broadcast %f0 : f32 to vector<1x3xf32>
+ %c1 = vector.insert %f12, %c0[0, 0] : f32 into vector<1x3xf32>
+ %c2 = vector.insert %f13, %c1[0, 1] : f32 into vector<1x3xf32>
+ %c3 = vector.insert %f14, %c2[0, 2] : f32 into vector<1x3xf32>
+
+ %d0 = vector.broadcast %f0 : f32 to vector<1x1xf32>
+ %d1 = vector.insert %f15, %d0[0, 0] : f32 into vector<1x1xf32>
+
+ vector.print %a9 : vector<3x3xf32>
+ vector.print %b3 : vector<3x1xf32>
+ vector.print %c3 : vector<1x3xf32>
+ vector.print %d1 : vector<1x1xf32>
+ //
+ // input slices:
+ //
+ // CHECK: ( ( 0, 1, 2 ), ( 4, 5, 6 ), ( 8, 9, 10 ) )
+ // CHECK: ( ( 3 ), ( 7 ), ( 11 ) )
+ // CHECK: ( ( 12, 13, 14 ) )
+ // CHECK: ( ( 15 ) )
+
+ %vt = vector.tuple %a9, %b3, %c3, %d1 :
+ vector<3x3xf32>, vector<3x1xf32>, vector<1x3xf32>, vector<1x1xf32>
+ %is = vector.insert_slices %vt, [3, 3], [1, 1] :
+ tuple<vector<3x3xf32>, vector<3x1xf32>, vector<1x3xf32>, vector<1x1xf32>> into vector<4x4xf32>
+
+ vector.print %is : vector<4x4xf32>
+ //
+ // insert slices:
+ //
+ // CHECK: ( ( 0, 1, 2, 3 ), ( 4, 5, 6, 7 ), ( 8, 9, 10, 11 ), ( 12, 13, 14, 15 ) )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-insert-strided-slice.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-insert-strided-slice.mlir
new file mode 100644
index 000000000000..a07d93691c26
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-insert-strided-slice.mlir
@@ -0,0 +1,36 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %v1 = vector.broadcast %f1 : f32 to vector<4xf32>
+ %v2 = vector.broadcast %f2 : f32 to vector<3xf32>
+ %v3 = vector.broadcast %f3 : f32 to vector<4x4xf32>
+ %v4 = vector.broadcast %f4 : f32 to vector<1xf32>
+
+ %s1 = vector.insert_strided_slice %v1, %v3 {offsets = [2, 0], strides = [1]} : vector<4xf32> into vector<4x4xf32>
+ %s2 = vector.insert_strided_slice %v2, %s1 {offsets = [1, 1], strides = [1]} : vector<3xf32> into vector<4x4xf32>
+ %s3 = vector.insert_strided_slice %v2, %s2 {offsets = [0, 0], strides = [1]} : vector<3xf32> into vector<4x4xf32>
+ %s4 = vector.insert_strided_slice %v4, %s3 {offsets = [3, 3], strides = [1]} : vector<1xf32> into vector<4x4xf32>
+
+ vector.print %v3 : vector<4x4xf32>
+ vector.print %s1 : vector<4x4xf32>
+ vector.print %s2 : vector<4x4xf32>
+ vector.print %s3 : vector<4x4xf32>
+ vector.print %s4 : vector<4x4xf32>
+ //
+ // insert strided slice:
+ //
+ // CHECK: ( ( 3, 3, 3, 3 ), ( 3, 3, 3, 3 ), ( 3, 3, 3, 3 ), ( 3, 3, 3, 3 ) )
+ // CHECK: ( ( 3, 3, 3, 3 ), ( 3, 3, 3, 3 ), ( 1, 1, 1, 1 ), ( 3, 3, 3, 3 ) )
+ // CHECK: ( ( 3, 3, 3, 3 ), ( 3, 2, 2, 2 ), ( 1, 1, 1, 1 ), ( 3, 3, 3, 3 ) )
+ // CHECK: ( ( 2, 2, 2, 3 ), ( 3, 2, 2, 2 ), ( 1, 1, 1, 1 ), ( 3, 3, 3, 3 ) )
+ // CHECK: ( ( 2, 2, 2, 3 ), ( 3, 2, 2, 2 ), ( 1, 1, 1, 1 ), ( 3, 3, 3, 4 ) )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-matrix-multiply-col.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-matrix-multiply-col.mlir
new file mode 100644
index 000000000000..dee088604e10
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-matrix-multiply-col.mlir
@@ -0,0 +1,53 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -lower-matrix-intrinsics -matrix-allow-contract -matrix-default-layout=column-major \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f0 = constant 0.0: f64
+ %f1 = constant 1.0: f64
+ %f2 = constant 2.0: f64
+ %f3 = constant 3.0: f64
+ %f4 = constant 4.0: f64
+ %f5 = constant 5.0: f64
+ %f6 = constant 6.0: f64
+ %f7 = constant 7.0: f64
+
+ // Construct test vectors.
+ %0 = vector.broadcast %f0 : f64 to vector<4xf64>
+ %1 = vector.insert %f1, %0[1] : f64 into vector<4xf64>
+ %2 = vector.insert %f2, %1[2] : f64 into vector<4xf64>
+ %a = vector.insert %f3, %2[3] : f64 into vector<4xf64>
+ %3 = vector.broadcast %f4 : f64 to vector<4xf64>
+ %4 = vector.insert %f5, %3[1] : f64 into vector<4xf64>
+ %5 = vector.insert %f6, %4[2] : f64 into vector<4xf64>
+ %b = vector.insert %f7, %5[3] : f64 into vector<4xf64>
+
+ vector.print %a : vector<4xf64>
+ vector.print %b : vector<4xf64>
+ //
+ // test vectors:
+ //
+ // CHECK: ( 0, 1, 2, 3 )
+ // CHECK: ( 4, 5, 6, 7 )
+
+ // Performs matrix x matrix, interpreting the vectors as
+ // flattened column-major 2-D matrices.
+ //
+ // ( 0, 2 ) (4, 6) ( 10, 14 ) | /|
+ // x = |/ | column-major!
+ // ( 1, 3 ) (5, 7) ( 19, 27 )
+ //
+ %c = vector.matrix_multiply %a, %b
+ { lhs_rows = 2: i32, lhs_columns = 2: i32 , rhs_columns = 2: i32 }
+ : (vector<4xf64>, vector<4xf64>) -> vector<4xf64>
+
+ vector.print %c : vector<4xf64>
+ //
+ // matrix x matrix:
+ //
+ // CHECK: ( 10, 19, 14, 27 )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-matrix-multiply-row.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-matrix-multiply-row.mlir
new file mode 100644
index 000000000000..736c3ac9a49a
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-matrix-multiply-row.mlir
@@ -0,0 +1,53 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -lower-matrix-intrinsics -matrix-allow-contract -matrix-default-layout=row-major \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f0 = constant 0.0: f64
+ %f1 = constant 1.0: f64
+ %f2 = constant 2.0: f64
+ %f3 = constant 3.0: f64
+ %f4 = constant 4.0: f64
+ %f5 = constant 5.0: f64
+ %f6 = constant 6.0: f64
+ %f7 = constant 7.0: f64
+
+ // Construct test vectors.
+ %0 = vector.broadcast %f0 : f64 to vector<4xf64>
+ %1 = vector.insert %f1, %0[1] : f64 into vector<4xf64>
+ %2 = vector.insert %f2, %1[2] : f64 into vector<4xf64>
+ %a = vector.insert %f3, %2[3] : f64 into vector<4xf64>
+ %3 = vector.broadcast %f4 : f64 to vector<4xf64>
+ %4 = vector.insert %f5, %3[1] : f64 into vector<4xf64>
+ %5 = vector.insert %f6, %4[2] : f64 into vector<4xf64>
+ %b = vector.insert %f7, %5[3] : f64 into vector<4xf64>
+
+ vector.print %a : vector<4xf64>
+ vector.print %b : vector<4xf64>
+ //
+ // test vectors:
+ //
+ // CHECK: ( 0, 1, 2, 3 )
+ // CHECK: ( 4, 5, 6, 7 )
+
+ // Performs matrix x matrix, interpreting the vectors as
+ // flattened row-major 2-D matrices.
+ //
+ // ( 0, 1 ) (4, 5) ( 6, 7 )
+ // x =
+ // ( 2, 3 ) (6, 7) ( 26, 31 )
+ //
+ %c = vector.matrix_multiply %a, %b
+ { lhs_rows = 2: i32, lhs_columns = 2: i32 , rhs_columns = 2: i32 }
+ : (vector<4xf64>, vector<4xf64>) -> vector<4xf64>
+
+ vector.print %c : vector<4xf64>
+ //
+ // matrix x matrix:
+ //
+ // CHECK: ( 6, 7, 26, 31 )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-outerproduct.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-outerproduct.mlir
new file mode 100644
index 000000000000..a6470c656f8c
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-outerproduct.mlir
@@ -0,0 +1,76 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+!vector_type_A = type vector<8xf32>
+!vector_type_B = type vector<8xf32>
+!vector_type_C = type vector<8x8xf32>
+
+!vector_type_X = type vector<2xf32>
+!vector_type_Y = type vector<3xf32>
+!vector_type_Z = type vector<2x3xf32>
+
+func @vector_outerproduct_splat_8x8(%fa: f32, %fb: f32, %fc: f32) -> !vector_type_C {
+ %a = splat %fa: !vector_type_A
+ %b = splat %fb: !vector_type_B
+ %c = splat %fc: !vector_type_C
+ %d = vector.outerproduct %a, %b, %c : !vector_type_A, !vector_type_B
+ return %d: !vector_type_C
+}
+
+func @vector_outerproduct_vec_2x3(%x : !vector_type_X,
+ %y : !vector_type_Y) -> !vector_type_Z {
+ %o = vector.outerproduct %x, %y : !vector_type_X, !vector_type_Y
+ return %o: !vector_type_Z
+}
+
+func @vector_outerproduct_vec_2x3_acc(%x : !vector_type_X,
+ %y : !vector_type_Y,
+ %z : !vector_type_Z) -> !vector_type_Z {
+ %o = vector.outerproduct %x, %y, %z : !vector_type_X, !vector_type_Y
+ return %o: !vector_type_Z
+}
+
+func @entry() {
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %f5 = constant 5.0: f32
+ %f10 = constant 10.0: f32
+
+ // Simple case, splat scalars into vectors, then take outer product.
+ %v = call @vector_outerproduct_splat_8x8(%f1, %f2, %f10)
+ : (f32, f32, f32) -> (!vector_type_C)
+ vector.print %v : !vector_type_C
+ //
+ // outer product 8x8:
+ //
+ // CHECK-COUNT-8: ( 12, 12, 12, 12, 12, 12, 12, 12 )
+
+ // Direct outerproduct on vectors with
diff erent size.
+ %0 = vector.broadcast %f1 : f32 to !vector_type_X
+ %x = vector.insert %f2, %0[1] : f32 into !vector_type_X
+ %1 = vector.broadcast %f3 : f32 to !vector_type_Y
+ %2 = vector.insert %f4, %1[1] : f32 into !vector_type_Y
+ %y = vector.insert %f5, %2[2] : f32 into !vector_type_Y
+
+ %p = call @vector_outerproduct_vec_2x3(%x, %y)
+ : (!vector_type_X, !vector_type_Y) -> (!vector_type_Z)
+ vector.print %p : !vector_type_Z
+ //
+ // outer product 2x3:
+ //
+ // CHECK: ( ( 3, 4, 5 ), ( 6, 8, 10 ) )
+
+ %q = call @vector_outerproduct_vec_2x3_acc(%x, %y, %p)
+ : (!vector_type_X, !vector_type_Y, !vector_type_Z) -> (!vector_type_Z)
+ vector.print %q : !vector_type_Z
+ //
+ // outer product 2x3:
+ //
+ // CHECK: ( ( 6, 8, 10 ), ( 12, 16, 20 ) )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-reductions-f32.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-reductions-f32.mlir
new file mode 100644
index 000000000000..abe5935c2f16
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-reductions-f32.mlir
@@ -0,0 +1,50 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ // Construct test vector.
+ %f1 = constant 1.5: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %f5 = constant 5.0: f32
+ %f6 = constant -1.0: f32
+ %f7 = constant -2.0: f32
+ %f8 = constant -4.0: f32
+ %f9 = constant -0.25: f32
+ %f10 = constant -16.0: f32
+ %v0 = vector.broadcast %f1 : f32 to vector<10xf32>
+ %v1 = vector.insert %f2, %v0[1] : f32 into vector<10xf32>
+ %v2 = vector.insert %f3, %v1[2] : f32 into vector<10xf32>
+ %v3 = vector.insert %f4, %v2[3] : f32 into vector<10xf32>
+ %v4 = vector.insert %f5, %v3[4] : f32 into vector<10xf32>
+ %v5 = vector.insert %f6, %v4[5] : f32 into vector<10xf32>
+ %v6 = vector.insert %f7, %v5[6] : f32 into vector<10xf32>
+ %v7 = vector.insert %f8, %v6[7] : f32 into vector<10xf32>
+ %v8 = vector.insert %f9, %v7[8] : f32 into vector<10xf32>
+ %v9 = vector.insert %f10, %v8[9] : f32 into vector<10xf32>
+ vector.print %v9 : vector<10xf32>
+ //
+ // test vector:
+ //
+ // CHECK: ( 1.5, 2, 3, 4, 5, -1, -2, -4, -0.25, -16 )
+
+ // Various vector reductions. Not full functional unit tests, but
+ // a simple integration test to see if the code runs end-to-end.
+ %0 = vector.reduction "add", %v9 : vector<10xf32> into f32
+ vector.print %0 : f32
+ // CHECK: -7.75
+ %1 = vector.reduction "mul", %v9 : vector<10xf32> into f32
+ vector.print %1 : f32
+ // CHECK: -5760
+ %2 = vector.reduction "min", %v9 : vector<10xf32> into f32
+ vector.print %2 : f32
+ // CHECK: -16
+ %3 = vector.reduction "max", %v9 : vector<10xf32> into f32
+ vector.print %3 : f32
+ // CHECK: 5
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-reductions-f64.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-reductions-f64.mlir
new file mode 100644
index 000000000000..260b9cd4f387
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-reductions-f64.mlir
@@ -0,0 +1,50 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ // Construct test vector.
+ %f1 = constant 1.5: f64
+ %f2 = constant 2.0: f64
+ %f3 = constant 3.0: f64
+ %f4 = constant 4.0: f64
+ %f5 = constant 5.0: f64
+ %f6 = constant -1.0: f64
+ %f7 = constant -2.0: f64
+ %f8 = constant -4.0: f64
+ %f9 = constant -0.25: f64
+ %f10 = constant -16.0: f64
+ %v0 = vector.broadcast %f1 : f64 to vector<10xf64>
+ %v1 = vector.insert %f2, %v0[1] : f64 into vector<10xf64>
+ %v2 = vector.insert %f3, %v1[2] : f64 into vector<10xf64>
+ %v3 = vector.insert %f4, %v2[3] : f64 into vector<10xf64>
+ %v4 = vector.insert %f5, %v3[4] : f64 into vector<10xf64>
+ %v5 = vector.insert %f6, %v4[5] : f64 into vector<10xf64>
+ %v6 = vector.insert %f7, %v5[6] : f64 into vector<10xf64>
+ %v7 = vector.insert %f8, %v6[7] : f64 into vector<10xf64>
+ %v8 = vector.insert %f9, %v7[8] : f64 into vector<10xf64>
+ %v9 = vector.insert %f10, %v8[9] : f64 into vector<10xf64>
+ vector.print %v9 : vector<10xf64>
+ //
+ // test vector:
+ //
+ // CHECK: ( 1.5, 2, 3, 4, 5, -1, -2, -4, -0.25, -16 )
+
+ // Various vector reductions. Not full functional unit tests, but
+ // a simple integration test to see if the code runs end-to-end.
+ %0 = vector.reduction "add", %v9 : vector<10xf64> into f64
+ vector.print %0 : f64
+ // CHECK: -7.75
+ %1 = vector.reduction "mul", %v9 : vector<10xf64> into f64
+ vector.print %1 : f64
+ // CHECK: -5760
+ %2 = vector.reduction "min", %v9 : vector<10xf64> into f64
+ vector.print %2 : f64
+ // CHECK: -16
+ %3 = vector.reduction "max", %v9 : vector<10xf64> into f64
+ vector.print %3 : f64
+ // CHECK: 5
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-reductions-i32.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-reductions-i32.mlir
new file mode 100644
index 000000000000..592a0859ed59
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-reductions-i32.mlir
@@ -0,0 +1,59 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ // Construct test vector.
+ %i1 = constant 1: i32
+ %i2 = constant 2: i32
+ %i3 = constant 3: i32
+ %i4 = constant 4: i32
+ %i5 = constant 5: i32
+ %i6 = constant -1: i32
+ %i7 = constant -2: i32
+ %i8 = constant -4: i32
+ %i9 = constant -80: i32
+ %i10 = constant -16: i32
+ %v0 = vector.broadcast %i1 : i32 to vector<10xi32>
+ %v1 = vector.insert %i2, %v0[1] : i32 into vector<10xi32>
+ %v2 = vector.insert %i3, %v1[2] : i32 into vector<10xi32>
+ %v3 = vector.insert %i4, %v2[3] : i32 into vector<10xi32>
+ %v4 = vector.insert %i5, %v3[4] : i32 into vector<10xi32>
+ %v5 = vector.insert %i6, %v4[5] : i32 into vector<10xi32>
+ %v6 = vector.insert %i7, %v5[6] : i32 into vector<10xi32>
+ %v7 = vector.insert %i8, %v6[7] : i32 into vector<10xi32>
+ %v8 = vector.insert %i9, %v7[8] : i32 into vector<10xi32>
+ %v9 = vector.insert %i10, %v8[9] : i32 into vector<10xi32>
+ vector.print %v9 : vector<10xi32>
+ //
+ // test vector:
+ //
+ // CHECK: ( 1, 2, 3, 4, 5, -1, -2, -4, -80, -16 )
+
+ // Various vector reductions. Not full functional unit tests, but
+ // a simple integration test to see if the code runs end-to-end.
+ %0 = vector.reduction "add", %v9 : vector<10xi32> into i32
+ vector.print %0 : i32
+ // CHECK: -88
+ %1 = vector.reduction "mul", %v9 : vector<10xi32> into i32
+ vector.print %1 : i32
+ // CHECK: -1228800
+ %2 = vector.reduction "min", %v9 : vector<10xi32> into i32
+ vector.print %2 : i32
+ // CHECK: -80
+ %3 = vector.reduction "max", %v9 : vector<10xi32> into i32
+ vector.print %3 : i32
+ // CHECK: 5
+ %4 = vector.reduction "and", %v9 : vector<10xi32> into i32
+ vector.print %4 : i32
+ // CHECK: 0
+ %5 = vector.reduction "or", %v9 : vector<10xi32> into i32
+ vector.print %5 : i32
+ // CHECK: -1
+ %6 = vector.reduction "xor", %v9 : vector<10xi32> into i32
+ vector.print %6 : i32
+ // CHECK: -68
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-reductions-i64.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-reductions-i64.mlir
new file mode 100644
index 000000000000..b29ad9325566
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-reductions-i64.mlir
@@ -0,0 +1,59 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ // Construct test vector.
+ %i1 = constant 1: i64
+ %i2 = constant 2: i64
+ %i3 = constant 3: i64
+ %i4 = constant 4: i64
+ %i5 = constant 5: i64
+ %i6 = constant -1: i64
+ %i7 = constant -2: i64
+ %i8 = constant -4: i64
+ %i9 = constant -80: i64
+ %i10 = constant -16: i64
+ %v0 = vector.broadcast %i1 : i64 to vector<10xi64>
+ %v1 = vector.insert %i2, %v0[1] : i64 into vector<10xi64>
+ %v2 = vector.insert %i3, %v1[2] : i64 into vector<10xi64>
+ %v3 = vector.insert %i4, %v2[3] : i64 into vector<10xi64>
+ %v4 = vector.insert %i5, %v3[4] : i64 into vector<10xi64>
+ %v5 = vector.insert %i6, %v4[5] : i64 into vector<10xi64>
+ %v6 = vector.insert %i7, %v5[6] : i64 into vector<10xi64>
+ %v7 = vector.insert %i8, %v6[7] : i64 into vector<10xi64>
+ %v8 = vector.insert %i9, %v7[8] : i64 into vector<10xi64>
+ %v9 = vector.insert %i10, %v8[9] : i64 into vector<10xi64>
+ vector.print %v9 : vector<10xi64>
+ //
+ // test vector:
+ //
+ // CHECK: ( 1, 2, 3, 4, 5, -1, -2, -4, -80, -16 )
+
+ // Various vector reductions. Not full functional unit tests, but
+ // a simple integration test to see if the code runs end-to-end.
+ %0 = vector.reduction "add", %v9 : vector<10xi64> into i64
+ vector.print %0 : i64
+ // CHECK: -88
+ %1 = vector.reduction "mul", %v9 : vector<10xi64> into i64
+ vector.print %1 : i64
+ // CHECK: -1228800
+ %2 = vector.reduction "min", %v9 : vector<10xi64> into i64
+ vector.print %2 : i64
+ // CHECK: -80
+ %3 = vector.reduction "max", %v9 : vector<10xi64> into i64
+ vector.print %3 : i64
+ // CHECK: 5
+ %4 = vector.reduction "and", %v9 : vector<10xi64> into i64
+ vector.print %4 : i64
+ // CHECK: 0
+ %5 = vector.reduction "or", %v9 : vector<10xi64> into i64
+ vector.print %5 : i64
+ // CHECK: -1
+ %6 = vector.reduction "xor", %v9 : vector<10xi64> into i64
+ vector.print %6 : i64
+ // CHECK: -68
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-shape-cast.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-shape-cast.mlir
new file mode 100644
index 000000000000..ba30f7e7435d
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-shape-cast.mlir
@@ -0,0 +1,44 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %f5 = constant 5.0: f32
+ %f6 = constant 6.0: f32
+
+ // Construct test vector.
+ %0 = vector.broadcast %f1 : f32 to vector<3x2xf32>
+ %1 = vector.insert %f2, %0[0, 1] : f32 into vector<3x2xf32>
+ %2 = vector.insert %f3, %1[1, 0] : f32 into vector<3x2xf32>
+ %3 = vector.insert %f4, %2[1, 1] : f32 into vector<3x2xf32>
+ %4 = vector.insert %f5, %3[2, 0] : f32 into vector<3x2xf32>
+ %x = vector.insert %f6, %4[2, 1] : f32 into vector<3x2xf32>
+ vector.print %x : vector<3x2xf32>
+ // CHECK: ( ( 1, 2 ), ( 3, 4 ), ( 5, 6 ) )
+
+ // Reshapes.
+ %a = vector.shape_cast %x : vector<3x2xf32> to vector<3x2xf32>
+ %b = vector.shape_cast %x : vector<3x2xf32> to vector<2x3xf32>
+ %c = vector.shape_cast %x : vector<3x2xf32> to vector<6xf32>
+ %d = vector.shape_cast %c : vector<6xf32> to vector<2x3xf32>
+ %e = vector.shape_cast %c : vector<6xf32> to vector<3x2xf32>
+
+ // Reshaped vectors:
+ // CHECK: ( ( 1, 2 ), ( 3, 4 ), ( 5, 6 ) )
+ // CHECK: ( ( 1, 2, 3 ), ( 4, 5, 6 ) )
+ // CHECK: ( 1, 2, 3, 4, 5, 6 )
+ // CHECK: ( ( 1, 2, 3 ), ( 4, 5, 6 ) )
+ // CHECK: ( ( 1, 2 ), ( 3, 4 ), ( 5, 6 ) )
+ vector.print %a : vector<3x2xf32>
+ vector.print %b : vector<2x3xf32>
+ vector.print %c : vector<6xf32>
+ vector.print %d : vector<2x3xf32>
+ vector.print %e : vector<3x2xf32>
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-shuffle.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-shuffle.mlir
new file mode 100644
index 000000000000..f9720ceeae4a
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-shuffle.mlir
@@ -0,0 +1,24 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %v1 = vector.broadcast %f1 : f32 to vector<2x4xf32>
+ %v2 = vector.broadcast %f2 : f32 to vector<2x4xf32>
+ vector.print %v1 : vector<2x4xf32>
+ vector.print %v2 : vector<2x4xf32>
+ //
+ // test vectors:
+ //
+ // CHECK: ( ( 1, 1, 1, 1 ), ( 1, 1, 1, 1 ) )
+ // CHECK: ( ( 2, 2, 2, 2 ), ( 2, 2, 2, 2 ) )
+
+ %v3 = vector.shuffle %v1, %v2 [3, 1, 2] : vector<2x4xf32>, vector<2x4xf32>
+ vector.print %v3 : vector<3x4xf32>
+ // CHECK: ( ( 2, 2, 2, 2 ), ( 1, 1, 1, 1 ), ( 2, 2, 2, 2 ) )
+
+ return
+}
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-transfer-read.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-transfer-read.mlir
new file mode 100644
index 000000000000..f8934f06c0fd
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-transfer-read.mlir
@@ -0,0 +1,51 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @transfer_read_1d(%A : memref<?xf32>, %base: index) {
+ %fm42 = constant -42.0: f32
+ %f = vector.transfer_read %A[%base], %fm42
+ {permutation_map = affine_map<(d0) -> (d0)>} :
+ memref<?xf32>, vector<13xf32>
+ vector.print %f: vector<13xf32>
+ return
+}
+
+func @transfer_write_1d(%A : memref<?xf32>, %base: index) {
+ %f0 = constant 0.0 : f32
+ %vf0 = splat %f0 : vector<4xf32>
+ vector.transfer_write %vf0, %A[%base]
+ {permutation_map = affine_map<(d0) -> (d0)>} :
+ vector<4xf32>, memref<?xf32>
+ return
+}
+
+func @entry() {
+ %c0 = constant 0: index
+ %c1 = constant 1: index
+ %c2 = constant 2: index
+ %c3 = constant 3: index
+ %c4 = constant 4: index
+ %c5 = constant 5: index
+ %A = alloc(%c5) : memref<?xf32>
+ scf.for %i = %c0 to %c5 step %c1 {
+ %i32 = index_cast %i : index to i32
+ %fi = sitofp %i32 : i32 to f32
+ store %fi, %A[%i] : memref<?xf32>
+ }
+ // On input, memory contains [[ 0, 1, 2, 3, 4, xxx garbage xxx ]]
+ // Read shifted by 2 and pad with -42:
+ // ( 2, 3, 4, -42, ..., -42)
+ call @transfer_read_1d(%A, %c2) : (memref<?xf32>, index) -> ()
+ // Write into memory shifted by 3
+ // memory contains [[ 0, 1, 2, 0, 0, xxx garbage xxx ]]
+ call @transfer_write_1d(%A, %c3) : (memref<?xf32>, index) -> ()
+ // Read shifted by 0 and pad with -42:
+ // ( 0, 1, 2, 0, 0, -42, ..., -42)
+ call @transfer_read_1d(%A, %c0) : (memref<?xf32>, index) -> ()
+ return
+}
+
+// CHECK: ( 2, 3, 4, -42, -42, -42, -42, -42, -42, -42, -42, -42, -42 )
+// CHECK: ( 0, 1, 2, 0, 0, -42, -42, -42, -42, -42, -42, -42, -42 )
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-transfer-write.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-transfer-write.mlir
new file mode 100644
index 000000000000..57163700fc99
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-transfer-write.mlir
@@ -0,0 +1,101 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @transfer_write16_1d(%A : memref<?xf32>, %base: index) {
+ %f = constant 16.0 : f32
+ %v = splat %f : vector<16xf32>
+ vector.transfer_write %v, %A[%base]
+ {permutation_map = affine_map<(d0) -> (d0)>}
+ : vector<16xf32>, memref<?xf32>
+ return
+}
+
+func @transfer_write13_1d(%A : memref<?xf32>, %base: index) {
+ %f = constant 13.0 : f32
+ %v = splat %f : vector<13xf32>
+ vector.transfer_write %v, %A[%base]
+ {permutation_map = affine_map<(d0) -> (d0)>}
+ : vector<13xf32>, memref<?xf32>
+ return
+}
+
+func @transfer_write17_1d(%A : memref<?xf32>, %base: index) {
+ %f = constant 17.0 : f32
+ %v = splat %f : vector<17xf32>
+ vector.transfer_write %v, %A[%base]
+ {permutation_map = affine_map<(d0) -> (d0)>}
+ : vector<17xf32>, memref<?xf32>
+ return
+}
+
+func @transfer_read_1d(%A : memref<?xf32>) -> vector<32xf32> {
+ %z = constant 0: index
+ %f = constant 0.0: f32
+ %r = vector.transfer_read %A[%z], %f
+ {permutation_map = affine_map<(d0) -> (d0)>}
+ : memref<?xf32>, vector<32xf32>
+ return %r : vector<32xf32>
+}
+
+func @entry() {
+ %c0 = constant 0: index
+ %c1 = constant 1: index
+ %c32 = constant 32: index
+ %A = alloc(%c32) {alignment=64} : memref<?xf32>
+ scf.for %i = %c0 to %c32 step %c1 {
+ %f = constant 0.0: f32
+ store %f, %A[%i] : memref<?xf32>
+ }
+
+ // On input, memory contains all zeros.
+ %0 = call @transfer_read_1d(%A) : (memref<?xf32>) -> (vector<32xf32>)
+ vector.print %0 : vector<32xf32>
+
+ // Overwrite with 16 values of 16 at base 4.
+ %c4 = constant 4: index
+ call @transfer_write16_1d(%A, %c4) : (memref<?xf32>, index) -> ()
+ %1 = call @transfer_read_1d(%A) : (memref<?xf32>) -> (vector<32xf32>)
+ vector.print %1 : vector<32xf32>
+
+ // Overwrite with 13 values of 13 at base 3.
+ %c3 = constant 3: index
+ call @transfer_write13_1d(%A, %c3) : (memref<?xf32>, index) -> ()
+ %2 = call @transfer_read_1d(%A) : (memref<?xf32>) -> (vector<32xf32>)
+ vector.print %2 : vector<32xf32>
+
+ // Overwrite with 17 values of 17 at base 7.
+ %c7 = constant 7: index
+ call @transfer_write17_1d(%A, %c3) : (memref<?xf32>, index) -> ()
+ %3 = call @transfer_read_1d(%A) : (memref<?xf32>) -> (vector<32xf32>)
+ vector.print %3 : vector<32xf32>
+
+ // Overwrite with 13 values of 13 at base 8.
+ %c8 = constant 8: index
+ call @transfer_write13_1d(%A, %c8) : (memref<?xf32>, index) -> ()
+ %4 = call @transfer_read_1d(%A) : (memref<?xf32>) -> (vector<32xf32>)
+ vector.print %4 : vector<32xf32>
+
+ // Overwrite with 17 values of 17 at base 14.
+ %c14 = constant 14: index
+ call @transfer_write17_1d(%A, %c14) : (memref<?xf32>, index) -> ()
+ %5 = call @transfer_read_1d(%A) : (memref<?xf32>) -> (vector<32xf32>)
+ vector.print %5 : vector<32xf32>
+
+ // Overwrite with 13 values of 13 at base 19.
+ %c19 = constant 19: index
+ call @transfer_write13_1d(%A, %c19) : (memref<?xf32>, index) -> ()
+ %6 = call @transfer_read_1d(%A) : (memref<?xf32>) -> (vector<32xf32>)
+ vector.print %6 : vector<32xf32>
+
+ return
+}
+
+// CHECK: ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
+// CHECK: ( 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
+// CHECK: ( 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
+// CHECK: ( 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
+// CHECK: ( 0, 0, 0, 17, 17, 17, 17, 17, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
+// CHECK: ( 0, 0, 0, 17, 17, 17, 17, 17, 13, 13, 13, 13, 13, 13, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0 )
+// CHECK: ( 0, 0, 0, 17, 17, 17, 17, 17, 13, 13, 13, 13, 13, 13, 17, 17, 17, 17, 17, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 )
diff --git a/mlir/integration_test/Dialect/Vector/CPU/test-transpose.mlir b/mlir/integration_test/Dialect/Vector/CPU/test-transpose.mlir
new file mode 100644
index 000000000000..8f44bb17a18d
--- /dev/null
+++ b/mlir/integration_test/Dialect/Vector/CPU/test-transpose.mlir
@@ -0,0 +1,120 @@
+// RUN: mlir-opt %s -convert-scf-to-std -convert-vector-to-llvm -convert-std-to-llvm | \
+// RUN: mlir-cpu-runner -e entry -entry-point-result=void \
+// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \
+// RUN: FileCheck %s
+
+func @entry() {
+ %f0 = constant 0.0: f32
+ %f1 = constant 1.0: f32
+ %f2 = constant 2.0: f32
+ %f3 = constant 3.0: f32
+ %f4 = constant 4.0: f32
+ %f5 = constant 5.0: f32
+ %f6 = constant 6.0: f32
+ %f7 = constant 7.0: f32
+ %f8 = constant 8.0: f32
+
+ // Construct test vectors and matrices.
+ %0 = vector.broadcast %f1 : f32 to vector<2xf32>
+ %a = vector.insert %f2, %0[1] : f32 into vector<2xf32>
+ %1 = vector.broadcast %f3 : f32 to vector<2xf32>
+ %b = vector.insert %f4, %1[1] : f32 into vector<2xf32>
+ %2 = vector.broadcast %f5 : f32 to vector<2xf32>
+ %c = vector.insert %f6, %2[1] : f32 into vector<2xf32>
+ %3 = vector.broadcast %f7 : f32 to vector<2xf32>
+ %d = vector.insert %f8, %3[1] : f32 into vector<2xf32>
+ %4 = vector.broadcast %f0 : f32 to vector<2x2xf32>
+ %5 = vector.insert %a, %4[0] : vector<2xf32> into vector<2x2xf32>
+ %A = vector.insert %b, %5[1] : vector<2xf32> into vector<2x2xf32>
+ %6 = vector.broadcast %f0 : f32 to vector<2x2xf32>
+ %7 = vector.insert %c, %6[0] : vector<2xf32> into vector<2x2xf32>
+ %B = vector.insert %d, %7[1] : vector<2xf32> into vector<2x2xf32>
+ %8 = vector.broadcast %f0 : f32 to vector<3x2xf32>
+ %9 = vector.insert %a, %8[0] : vector<2xf32> into vector<3x2xf32>
+ %10 = vector.insert %b, %9[1] : vector<2xf32> into vector<3x2xf32>
+ %C = vector.insert %c, %10[2] : vector<2xf32> into vector<3x2xf32>
+ %11 = vector.tuple %A, %B : vector<2x2xf32>, vector<2x2xf32>
+ %D = vector.insert_slices %11, [2, 2], [1, 1]
+ : tuple<vector<2x2xf32>, vector<2x2xf32>> into vector<2x4xf32>
+
+ vector.print %A : vector<2x2xf32>
+ vector.print %B : vector<2x2xf32>
+ vector.print %C : vector<3x2xf32>
+ vector.print %D : vector<2x4xf32>
+ //
+ // test matrices:
+ //
+ // CHECK: ( ( 1, 2 ), ( 3, 4 ) )
+ // CHECK: ( ( 5, 6 ), ( 7, 8 ) )
+ // CHECK: ( ( 1, 2 ), ( 3, 4 ), ( 5, 6 ) )
+ // CHECK: ( ( 1, 2, 5, 6 ), ( 3, 4, 7, 8 ) )
+
+ %tA = vector.transpose %A, [1, 0] : vector<2x2xf32> to vector<2x2xf32>
+ %tB = vector.transpose %B, [1, 0] : vector<2x2xf32> to vector<2x2xf32>
+ %tC = vector.transpose %C, [1, 0] : vector<3x2xf32> to vector<2x3xf32>
+ %tD = vector.transpose %D, [1, 0] : vector<2x4xf32> to vector<4x2xf32>
+
+ vector.print %tA : vector<2x2xf32>
+ vector.print %tB : vector<2x2xf32>
+ vector.print %tC : vector<2x3xf32>
+ vector.print %tD : vector<4x2xf32>
+ //
+ // transposed matrices:
+ //
+ // CHECK: ( ( 1, 3 ), ( 2, 4 ) )
+ // CHECK: ( ( 5, 7 ), ( 6, 8 ) )
+ // CHECK: ( ( 1, 3, 5 ), ( 2, 4, 6 ) )
+ // CHECK: ( ( 1, 3 ), ( 2, 4 ), ( 5, 7 ), ( 6, 8 ) )
+
+ %idD = vector.transpose %D, [0, 1] : vector<2x4xf32> to vector<2x4xf32>
+ %ttD = vector.transpose %tD, [1, 0] : vector<4x2xf32> to vector<2x4xf32>
+
+ vector.print %idD : vector<2x4xf32>
+ vector.print %ttD : vector<2x4xf32>
+ //
+ // back to original after transpose matrices:
+ //
+ // CHECK: ( ( 1, 2, 5, 6 ), ( 3, 4, 7, 8 ) )
+ // CHECK: ( ( 1, 2, 5, 6 ), ( 3, 4, 7, 8 ) )
+
+ // Construct test tensor.
+ %p = vector.broadcast %f1 : f32 to vector<2x2x2xf32>
+ %q = vector.insert %f2, %p[0, 0, 1] : f32 into vector<2x2x2xf32>
+ %r = vector.insert %f3, %q[0, 1, 0] : f32 into vector<2x2x2xf32>
+ %s = vector.insert %f4, %r[0, 1, 1] : f32 into vector<2x2x2xf32>
+ %t = vector.insert %f5, %s[1, 0, 0] : f32 into vector<2x2x2xf32>
+ %u = vector.insert %f6, %t[1, 0, 1] : f32 into vector<2x2x2xf32>
+ %v = vector.insert %f7, %u[1, 1, 0] : f32 into vector<2x2x2xf32>
+ %w = vector.insert %f8, %v[1, 1, 1] : f32 into vector<2x2x2xf32>
+
+ vector.print %w : vector<2x2x2xf32>
+ //
+ // test tensors:
+ //
+ // CHECK: ( ( ( 1, 2 ), ( 3, 4 ) ), ( ( 5, 6 ), ( 7, 8 ) ) )
+
+ %tP = vector.transpose %w, [0, 1, 2] : vector<2x2x2xf32> to vector<2x2x2xf32>
+ %tQ = vector.transpose %w, [0, 2, 1] : vector<2x2x2xf32> to vector<2x2x2xf32>
+ %tR = vector.transpose %w, [1, 0, 2] : vector<2x2x2xf32> to vector<2x2x2xf32>
+ %tS = vector.transpose %w, [2, 0, 1] : vector<2x2x2xf32> to vector<2x2x2xf32>
+ %tT = vector.transpose %w, [1, 2, 0] : vector<2x2x2xf32> to vector<2x2x2xf32>
+ %tU = vector.transpose %w, [2, 1, 0] : vector<2x2x2xf32> to vector<2x2x2xf32>
+
+ vector.print %tP : vector<2x2x2xf32>
+ vector.print %tQ : vector<2x2x2xf32>
+ vector.print %tR : vector<2x2x2xf32>
+ vector.print %tS : vector<2x2x2xf32>
+ vector.print %tT : vector<2x2x2xf32>
+ vector.print %tU : vector<2x2x2xf32>
+ //
+ // transposed tensors:
+ //
+ // CHECK: ( ( ( 1, 2 ), ( 3, 4 ) ), ( ( 5, 6 ), ( 7, 8 ) ) )
+ // CHECK: ( ( ( 1, 3 ), ( 2, 4 ) ), ( ( 5, 7 ), ( 6, 8 ) ) )
+ // CHECK: ( ( ( 1, 2 ), ( 5, 6 ) ), ( ( 3, 4 ), ( 7, 8 ) ) )
+ // CHECK: ( ( ( 1, 3 ), ( 5, 7 ) ), ( ( 2, 4 ), ( 6, 8 ) ) )
+ // CHECK: ( ( ( 1, 5 ), ( 2, 6 ) ), ( ( 3, 7 ), ( 4, 8 ) ) )
+ // CHECK: ( ( ( 1, 5 ), ( 3, 7 ) ), ( ( 2, 6 ), ( 4, 8 ) ) )
+
+ return
+}
diff --git a/mlir/integration_test/lit.cfg.py b/mlir/integration_test/lit.cfg.py
new file mode 100644
index 000000000000..7651af85c8aa
--- /dev/null
+++ b/mlir/integration_test/lit.cfg.py
@@ -0,0 +1,58 @@
+# -*- Python -*-
+
+import os
+import platform
+import re
+import subprocess
+import tempfile
+
+import lit.formats
+import lit.util
+
+from lit.llvm import llvm_config
+from lit.llvm.subst import ToolSubst
+
+# Configuration file for the 'lit' integration test runner.
+
+# name: The name of this integration test suite.
+config.name = 'MLIR_INTEGRATION'
+
+config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell)
+
+# suffixes: A list of file extensions to treat as integration test files.
+config.suffixes = ['.mlir']
+
+# test_source_root: The root path where integration tests are located.
+config.test_source_root = os.path.dirname(__file__)
+
+# test_exec_root: The root path where integration tests should be run.
+config.test_exec_root = os.path.join(config.mlir_obj_root, 'integration_test')
+
+config.substitutions.append(('%PATH%', config.environment['PATH']))
+config.substitutions.append(('%shlibext', config.llvm_shlib_ext))
+config.substitutions.append(('%mlir_src_root', config.mlir_src_root))
+
+llvm_config.with_system_environment(['HOME', 'INCLUDE', 'LIB', 'TMP', 'TEMP'])
+
+llvm_config.use_default_substitutions()
+
+# excludes: A list of directories to exclude from the integraiton testsuite.
+config.excludes = ['CMakeLists.txt', 'README.txt', 'LICENSE.txt']
+
+# Tweak the PATH to include the tools dir.
+llvm_config.with_environment('PATH', config.llvm_tools_dir, append_path=True)
+tool_dirs = [config.mlir_tools_dir, config.llvm_tools_dir]
+tools = [
+ 'mlir-opt',
+ 'mlir-cpu-runner',
+]
+
+# The following tools are optional.
+tools.extend([
+ ToolSubst(
+ '%mlir_integration_test_dir',
+ config.mlir_integration_test_dir,
+ unresolved='ignore'),
+])
+
+llvm_config.add_tool_substitutions(tools, tool_dirs)
diff --git a/mlir/integration_test/lit.site.cfg.py.in b/mlir/integration_test/lit.site.cfg.py.in
new file mode 100644
index 000000000000..bd0ccf4cce24
--- /dev/null
+++ b/mlir/integration_test/lit.site.cfg.py.in
@@ -0,0 +1,51 @@
+ at LIT_SITE_CFG_IN_HEADER@
+
+import sys
+
+config.host_triple = "@LLVM_HOST_TRIPLE@"
+config.target_triple = "@TARGET_TRIPLE@"
+config.llvm_src_root = "@LLVM_SOURCE_DIR@"
+config.llvm_obj_root = "@LLVM_BINARY_DIR@"
+config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
+config.llvm_lib_dir = "@LLVM_LIBRARY_DIR@"
+config.llvm_shlib_dir = "@SHLIBDIR@"
+config.llvm_shlib_ext = "@SHLIBEXT@"
+config.llvm_exe_ext = "@EXEEXT@"
+config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@"
+config.python_executable = "@PYTHON_EXECUTABLE@"
+config.gold_executable = "@GOLD_EXECUTABLE@"
+config.ld64_executable = "@LD64_EXECUTABLE@"
+config.enable_shared = @ENABLE_SHARED@
+config.enable_assertions = @ENABLE_ASSERTIONS@
+config.targets_to_build = "@TARGETS_TO_BUILD@"
+config.native_target = "@LLVM_NATIVE_ARCH@"
+config.llvm_bindings = "@LLVM_BINDINGS@".split(' ')
+config.host_os = "@HOST_OS@"
+config.host_cc = "@HOST_CC@"
+config.host_cxx = "@HOST_CXX@"
+config.host_cmake = "@CMAKE_COMMAND@"
+# Note: ldflags can contain double-quoted paths, so must use single quotes here.
+config.host_ldflags = '@HOST_LDFLAGS@'
+config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
+config.llvm_host_triple = '@LLVM_HOST_TRIPLE@'
+config.host_arch = "@HOST_ARCH@"
+config.mlir_src_root = "@MLIR_SOURCE_DIR@"
+config.mlir_obj_root = "@MLIR_BINARY_DIR@"
+config.mlir_tools_dir = "@MLIR_TOOLS_DIR@"
+config.mlir_integration_test_dir = "@MLIR_INTEGRATION_TEST_DIR@"
+
+# Support substitution of the tools_dir with user parameters. This is
+# used when we can't determine the tool dir at configuration time.
+try:
+ config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params
+ config.llvm_shlib_dir = config.llvm_shlib_dir % lit_config.params
+except KeyError:
+ e = sys.exc_info()[1]
+ key, = e.args
+ lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key))
+
+import lit.llvm
+lit.llvm.initialize(lit_config, config)
+
+# Let the main config do the real work.
+lit_config.load_config(config, "@MLIR_SOURCE_DIR@/integration_test/lit.cfg.py")
More information about the Mlir-commits
mailing list