Files
clang-p2996/mlir/test/Integration/Dialect/Vector/CPU/test-transpose.mlir
Mehdi Amini 99b0032ce0 Move the MLIR integration tests as a subdirectory of test (NFC)
This does not change the behavior directly: the tests only run when
`-DMLIR_INCLUDE_INTEGRATION_TESTS=ON` is configured. However running
`ninja check-mlir` will not run all the tests within a single
lit invocation. The previous behavior would wait for all the integration
tests to complete before starting to run the first regular test. The
test results were also reported separately. This change is unifying all
of this and allow concurrent execution of the integration tests with
regular non-regression and unit-tests.

Differential Revision: https://reviews.llvm.org/D97241
2021-02-23 05:55:47 +00:00

121 lines
4.9 KiB
MLIR

// 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
}