blob: f582de146baaeaf09bb5f0b67c053903532aa295 [file] [log] [blame]
// RUN: mlir-opt %s -vector-lower-to-llvm-dialect | FileCheck %s
func @vec_1d(%arg0: vector<4xf32>, %arg1: vector<8xf32>) -> vector<8xf32> {
%2 = vector.outerproduct %arg0, %arg1 : vector<4xf32>, vector<8xf32>
%3 = vector.extractelement %2[0 : i32]: vector<4x8xf32>
return %3 : vector<8xf32>
}
// CHECK-LABEL: vec_1d
// CHECK: llvm.undef : !llvm<"[4 x <8 x float>]">
// CHECK-5: llvm.shufflevector {{.*}}, {{.*}} [0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32] : !llvm<"<4 x float>">, !llvm<"<4 x float>">
// CHECK: llvm.fmul {{.*}}, {{.*}} : !llvm<"<8 x float>">
// CHECK: llvm.insertvalue {{.*}}, {{.*}}[0] : !llvm<"[4 x <8 x float>]">
// CHECK: llvm.extractvalue {{.*}}[0 : i32] : !llvm<"[4 x <8 x float>]">
// CHECK: llvm.return {{.*}} : !llvm<"<8 x float>">
func @vec_2d(%arg0: vector<4xf32>, %arg1: vector<8xf32>) -> vector<4x8xf32> {
%2 = vector.outerproduct %arg0, %arg1 : vector<4xf32>, vector<8xf32>
return %2 : vector<4x8xf32>
}
// CHECK-LABEL: vec_2d
// CHECK: llvm.undef : !llvm<"[4 x <8 x float>]">
// CHECK-4: llvm.shufflevector {{.*}}, {{.*}} [0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32, 0 : i32] : !llvm<"<4 x float>">, !llvm<"<4 x float>">
// CHECK: llvm.fmul {{.*}}, {{.*}} : !llvm<"<8 x float>">
// CHECK: llvm.insertvalue {{.*}}, {{.*}}[0] : !llvm<"[4 x <8 x float>]">
// CHECK: llvm.return {{.*}} : !llvm<"[4 x <8 x float>]">
func @vec_3d(%arg0: vector<4x8x16xf32>) -> vector<8x16xf32> {
%0 = vector.extractelement %arg0[0 : i32]: vector<4x8x16xf32>
return %0 : vector<8x16xf32>
}
// CHECK-LABEL: vec_3d
// CHECK: llvm.extractvalue %{{.*}}[0 : i32] : !llvm<"[4 x [8 x <16 x float>]]">
// CHECK: llvm.return %{{.*}} : !llvm<"[8 x <16 x float>]">