[Mlir-commits] [mlir] 754a8ad - [mlir][llvm] Add experimental.vector.interleave2 intrinsic (#79270)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Jan 29 05:22:14 PST 2024
Author: Cullen Rhodes
Date: 2024-01-29T13:22:11Z
New Revision: 754a8add57098ef71e4a51a9caa0cc175e94377d
URL: https://github.com/llvm/llvm-project/commit/754a8add57098ef71e4a51a9caa0cc175e94377d
DIFF: https://github.com/llvm/llvm-project/commit/754a8add57098ef71e4a51a9caa0cc175e94377d.diff
LOG: [mlir][llvm] Add experimental.vector.interleave2 intrinsic (#79270)
Added:
Modified:
mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
mlir/test/Dialect/LLVMIR/invalid.mlir
mlir/test/Dialect/LLVMIR/roundtrip.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
index a4f08fb92da9035..feb3578fe2d4966 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
@@ -969,6 +969,20 @@ def LLVM_vector_extract
}];
}
+def LLVM_experimental_vector_interleave2
+ : LLVM_OneResultIntrOp<"experimental.vector.interleave2",
+ /*overloadedResults=*/[0], /*overloadedOperands=*/[],
+ /*traits=*/[
+ Pure, AllTypesMatch<["vec1", "vec2"]>,
+ PredOpTrait<
+ "result has twice as many elements as 'vec1'",
+ And<[CPred<"getVectorNumElements($res.getType()) == "
+ "getVectorNumElements($vec1.getType()) * 2">,
+ CPred<"getVectorElementType($vec1.getType()) == "
+ "getVectorElementType($res.getType())">]>>,
+ ]>,
+ Arguments<(ins LLVM_AnyVector:$vec1, LLVM_AnyVector:$vec2)>;
+
//
// LLVM Vector Predication operations.
//
diff --git a/mlir/test/Dialect/LLVMIR/invalid.mlir b/mlir/test/Dialect/LLVMIR/invalid.mlir
index d72ff8ca3c3aa7d..de1ab9db8e8df8d 100644
--- a/mlir/test/Dialect/LLVMIR/invalid.mlir
+++ b/mlir/test/Dialect/LLVMIR/invalid.mlir
@@ -1218,6 +1218,44 @@ func.func @extract_scalable_from_fixed_length_vector(%arg0 : vector<16xf32>) {
%0 = llvm.intr.vector.extract %arg0[0] : vector<[8]xf32> from vector<16xf32>
}
+
+// -----
+
+func.func @experimental_vector_interleave2_bad_type0(%vec1: vector<[2]xf16>, %vec2 : vector<[4]xf16>) {
+ // expected-error at +1 {{op failed to verify that all of {vec1, vec2} have same type}}
+ %0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[2]xf16>, vector<[4]xf16>) -> vector<[8]xf16>
+ return
+}
+
+// -----
+
+func.func @experimental_vector_interleave2_bad_type1(%vec1: vector<[2]xf16>, %vec2 : vector<[2]xf16>) {
+ // expected-error at +1 {{op failed to verify that result has twice as many elements as 'vec1'}}
+ %0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[2]xf16>, vector<[2]xf16>) -> vector<[8]xf16>
+ return
+}
+
+// -----
+
+/// result vector type is not scalable.
+
+func.func @experimental_vector_interleave2_bad_type2(%vec1: vector<[2]xf16>, %vec2 : vector<[2]xf16>) {
+ // expected-error at +1 {{op failed to verify that result has twice as many elements as 'vec1'}}
+ %0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[2]xf16>, vector<[2]xf16>) -> vector<4xf16>
+ return
+}
+
+// -----
+
+
+/// element type doesn't match.
+
+func.func @experimental_vector_interleave2_bad_type3(%vec1: vector<[2]xf16>, %vec2 : vector<[2]xf16>) {
+ // expected-error at +1 {{op failed to verify that result has twice as many elements as 'vec1'}}
+ %0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[2]xf16>, vector<[2]xf16>) -> vector<[4]xf32>
+ return
+}
+
// -----
func.func @invalid_bitcast_ptr_to_i64(%arg : !llvm.ptr) {
diff --git a/mlir/test/Dialect/LLVMIR/roundtrip.mlir b/mlir/test/Dialect/LLVMIR/roundtrip.mlir
index 1958dd56bab7ad7..b157cf001418425 100644
--- a/mlir/test/Dialect/LLVMIR/roundtrip.mlir
+++ b/mlir/test/Dialect/LLVMIR/roundtrip.mlir
@@ -342,6 +342,13 @@ func.func @mixed_vect(%arg0: vector<8xf32>, %arg1: vector<4xf32>, %arg2: vector<
return
}
+// CHECK-LABEL: @experimental_vector_interleave2
+func.func @experimental_vector_interleave2(%vec1: vector<[4]xf16>, %vec2 : vector<[4]xf16>) {
+ // CHECK: = "llvm.intr.experimental.vector.interleave2"({{.*}}) : (vector<[4]xf16>, vector<[4]xf16>) -> vector<[8]xf16>
+ %0 = "llvm.intr.experimental.vector.interleave2"(%vec1, %vec2) : (vector<[4]xf16>, vector<[4]xf16>) -> vector<[8]xf16>
+ return
+}
+
// CHECK-LABEL: @alloca
func.func @alloca(%size : i64) {
// CHECK: llvm.alloca %{{.*}} x i32 : (i64) -> !llvm.ptr
More information about the Mlir-commits
mailing list