Skip to content

Commit 754a8ad

Browse files
authored
[mlir][llvm] Add experimental.vector.interleave2 intrinsic (#79270)
1 parent bc879a9 commit 754a8ad

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,20 @@ def LLVM_vector_extract
969969
}];
970970
}
971971

972+
def LLVM_experimental_vector_interleave2
973+
: LLVM_OneResultIntrOp<"experimental.vector.interleave2",
974+
/*overloadedResults=*/[0], /*overloadedOperands=*/[],
975+
/*traits=*/[
976+
Pure, AllTypesMatch<["vec1", "vec2"]>,
977+
PredOpTrait<
978+
"result has twice as many elements as 'vec1'",
979+
And<[CPred<"getVectorNumElements($res.getType()) == "
980+
"getVectorNumElements($vec1.getType()) * 2">,
981+
CPred<"getVectorElementType($vec1.getType()) == "
982+
"getVectorElementType($res.getType())">]>>,
983+
]>,
984+
Arguments<(ins LLVM_AnyVector:$vec1, LLVM_AnyVector:$vec2)>;
985+
972986
//
973987
// LLVM Vector Predication operations.
974988
//

mlir/test/Dialect/LLVMIR/invalid.mlir

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,44 @@ func.func @extract_scalable_from_fixed_length_vector(%arg0 : vector<16xf32>) {
12181218
%0 = llvm.intr.vector.extract %arg0[0] : vector<[8]xf32> from vector<16xf32>
12191219
}
12201220

1221+
1222+
// -----
1223+
1224+
func.func @experimental_vector_interleave2_bad_type0(%vec1: vector<[2]xf16>, %vec2 : vector<[4]xf16>) {
1225+
// expected-error@+1 {{op failed to verify that all of {vec1, vec2} have same type}}
1226+
%0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[2]xf16>, vector<[4]xf16>) -> vector<[8]xf16>
1227+
return
1228+
}
1229+
1230+
// -----
1231+
1232+
func.func @experimental_vector_interleave2_bad_type1(%vec1: vector<[2]xf16>, %vec2 : vector<[2]xf16>) {
1233+
// expected-error@+1 {{op failed to verify that result has twice as many elements as 'vec1'}}
1234+
%0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[2]xf16>, vector<[2]xf16>) -> vector<[8]xf16>
1235+
return
1236+
}
1237+
1238+
// -----
1239+
1240+
/// result vector type is not scalable.
1241+
1242+
func.func @experimental_vector_interleave2_bad_type2(%vec1: vector<[2]xf16>, %vec2 : vector<[2]xf16>) {
1243+
// expected-error@+1 {{op failed to verify that result has twice as many elements as 'vec1'}}
1244+
%0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[2]xf16>, vector<[2]xf16>) -> vector<4xf16>
1245+
return
1246+
}
1247+
1248+
// -----
1249+
1250+
1251+
/// element type doesn't match.
1252+
1253+
func.func @experimental_vector_interleave2_bad_type3(%vec1: vector<[2]xf16>, %vec2 : vector<[2]xf16>) {
1254+
// expected-error@+1 {{op failed to verify that result has twice as many elements as 'vec1'}}
1255+
%0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[2]xf16>, vector<[2]xf16>) -> vector<[4]xf32>
1256+
return
1257+
}
1258+
12211259
// -----
12221260

12231261
func.func @invalid_bitcast_ptr_to_i64(%arg : !llvm.ptr) {

mlir/test/Dialect/LLVMIR/roundtrip.mlir

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,13 @@ func.func @mixed_vect(%arg0: vector<8xf32>, %arg1: vector<4xf32>, %arg2: vector<
342342
return
343343
}
344344

345+
// CHECK-LABEL: @experimental_vector_interleave2
346+
func.func @experimental_vector_interleave2(%vec1: vector<[4]xf16>, %vec2 : vector<[4]xf16>) {
347+
// CHECK: = "llvm.intr.experimental.vector.interleave2"({{.*}}) : (vector<[4]xf16>, vector<[4]xf16>) -> vector<[8]xf16>
348+
%0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[4]xf16>, vector<[4]xf16>) -> vector<[8]xf16>
349+
return
350+
}
351+
345352
// CHECK-LABEL: @alloca
346353
func.func @alloca(%size : i64) {
347354
// CHECK: llvm.alloca %{{.*}} x i32 : (i64) -> !llvm.ptr

0 commit comments

Comments
 (0)