Skip to content

Commit e1685eb

Browse files
authored
[mlir][llvm] Add llvm.vector.deinterleave2 intrinsic (llvm#91986)
Adds the LLVM vector.deinterleave2 intrinsic to the MLIR LLVM dialect. The deinterleave2 intrinsic takes a vector and returns two vectors with the first having even elements and the second with odd elements from the input vector. The inverse of vector.interleave2.
1 parent bf7a0f9 commit e1685eb

File tree

4 files changed

+35
-0
lines changed

4 files changed

+35
-0
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,12 @@ def LLVM_vector_interleave2
10741074
]>,
10751075
Arguments<(ins LLVM_AnyVector:$vec1, LLVM_AnyVector:$vec2)>;
10761076

1077+
def LLVM_vector_deinterleave2
1078+
: LLVM_OneResultIntrOp<"vector.deinterleave2",
1079+
/*overloadedResults=*/[], /*overloadedOperands=*/[0],
1080+
/*traits=*/[Pure]>,
1081+
Arguments<(ins LLVM_AnyVector:$vec)>;
1082+
10771083
//
10781084
// LLVM Vector Predication operations.
10791085
//

mlir/test/Dialect/LLVMIR/roundtrip.mlir

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,13 @@ func.func @vector_interleave2(%vec1: vector<[4]xf16>, %vec2 : vector<[4]xf16>) {
349349
return
350350
}
351351

352+
// CHECK-LABEL: @vector_deinterleave2
353+
func.func @vector_deinterleave2(%vec: vector<[8]xf16>) {
354+
// CHECK: = "llvm.intr.vector.deinterleave2"({{.*}}) : (vector<[8]xf16>) -> !llvm.struct<(vector<[4]xf16>, vector<[4]xf16>)>
355+
%0 = "llvm.intr.vector.deinterleave2"(%vec) : (vector<[8]xf16>) -> !llvm.struct<(vector<[4]xf16>, vector<[4]xf16>)>
356+
return
357+
}
358+
352359
// CHECK-LABEL: @alloca
353360
func.func @alloca(%size : i64) {
354361
// CHECK: llvm.alloca %{{.*}} x i32 : (i64) -> !llvm.ptr

mlir/test/Target/LLVMIR/Import/intrinsic.ll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,15 @@ define void @vector_extract(<vscale x 4 x float> %0) {
786786
ret void
787787
}
788788

789+
; CHECK-LABEL: llvm.func @vector_deinterleave2
790+
define void @vector_deinterleave2(<4 x double> %0, <vscale x 8 x i32> %1) {
791+
; CHECK: "llvm.intr.vector.deinterleave2"(%{{.*}}) : (vector<4xf64>) -> !llvm.struct<(vector<2xf64>, vector<2xf64>)>
792+
%3 = call { <2 x double>, <2 x double> } @llvm.vector.deinterleave2.v4f64(<4 x double> %0);
793+
; CHECK: "llvm.intr.vector.deinterleave2"(%{{.*}}) : (!llvm.vec<? x 8 x i32>) -> !llvm.struct<(vec<? x 4 x i32>, vec<? x 4 x i32>)>
794+
%4 = call { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.vector.deinterleave2.nxv8i32(<vscale x 8 x i32> %1);
795+
ret void
796+
}
797+
789798
; CHECK-LABEL: llvm.func @vector_predication_intrinsics
790799
define void @vector_predication_intrinsics(<8 x i32> %0, <8 x i32> %1, <8 x float> %2, <8 x float> %3, <8 x i64> %4, <8 x double> %5, <8 x ptr> %6, i32 %7, float %8, ptr %9, ptr %10, <8 x i1> %11, i32 %12) {
791800
; CHECK: "llvm.intr.vp.add"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>

mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,17 @@ llvm.func @vector_insert_extract(%f256: vector<8xi32>, %f128: vector<4xi32>,
942942
llvm.return
943943
}
944944

945+
// CHECK-LABEL: @vector_deinterleave2
946+
llvm.func @vector_deinterleave2(%vec1: vector<4xf64>, %vec2: vector<[8]xi32>) {
947+
// CHECK: call { <2 x double>, <2 x double> } @llvm.vector.deinterleave2.v4f64(<4 x double> %{{.*}})
948+
%0 = "llvm.intr.vector.deinterleave2" (%vec1) :
949+
(vector<4xf64>) -> !llvm.struct<(vector<2xf64>, vector<2xf64>)>
950+
// CHECK: call { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.vector.deinterleave2.nxv8i32(<vscale x 8 x i32> %{{.*}})
951+
%1 = "llvm.intr.vector.deinterleave2" (%vec2) :
952+
(vector<[8]xi32>) -> !llvm.struct<(vector<[4]xi32>, vector<[4]xi32>)>
953+
llvm.return
954+
}
955+
945956
// CHECK-LABEL: @lifetime
946957
llvm.func @lifetime(%p: !llvm.ptr) {
947958
// CHECK: call void @llvm.lifetime.start
@@ -1148,6 +1159,8 @@ llvm.func @experimental_constrained_fptrunc(%s: f64, %v: vector<4xf32>) {
11481159
// CHECK-DAG: declare <8 x i32> @llvm.vector.extract.v8i32.nxv4i32(<vscale x 4 x i32>, i64 immarg)
11491160
// CHECK-DAG: declare <4 x i32> @llvm.vector.extract.v4i32.nxv4i32(<vscale x 4 x i32>, i64 immarg)
11501161
// CHECK-DAG: declare <2 x i32> @llvm.vector.extract.v2i32.v8i32(<8 x i32>, i64 immarg)
1162+
// CHECK-DAG: declare { <2 x double>, <2 x double> } @llvm.vector.deinterleave2.v4f64(<4 x double>)
1163+
// CHECK-DAG: declare { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.vector.deinterleave2.nxv8i32(<vscale x 8 x i32>)
11511164
// CHECK-DAG: declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
11521165
// CHECK-DAG: declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
11531166
// CHECK-DAG: declare ptr @llvm.invariant.start.p0(i64 immarg, ptr nocapture)

0 commit comments

Comments
 (0)