[Mlir-commits] [mlir] [mlir][VectorOps] Add vector.interleave operation (1/4) (PR #80965)
Benjamin Maxwell
llvmlistbot at llvm.org
Wed Feb 7 05:26:47 PST 2024
================
@@ -478,6 +478,69 @@ def Vector_ShuffleOp :
let hasCanonicalizer = 1;
}
+def Vector_InterleaveOp :
+ Vector_Op<"interleave", [Pure,
+ AllTypesMatch<["lhs", "rhs"]>,
+ TypesMatchWith<
+ "type of 'result' is double the width of the inputs",
+ "lhs", "result",
+ [{
+ [&]() -> ::mlir::VectorType {
+ auto vectorType = ::llvm::cast<mlir::VectorType>($_self);
+ ::mlir::VectorType::Builder builder(vectorType);
+ if (vectorType.getRank() == 0) {
+ static constexpr int64_t v2xty_shape[] = { 2 };
+ return builder.setShape(v2xty_shape);
+ }
+ auto lastDim = vectorType.getRank() - 1;
+ return builder.setDim(lastDim, vectorType.getDimSize(lastDim) * 2);
+ }()
+ }]>]> {
+ let summary = "constructs a vector by interleaving two input vectors";
+ let description = [{
+ The interleave operation constructs a new vector by interleaving the
+ elements from the trailing (or final) dimension of two input vectors,
+ returning a new vector where the trailing dimension is twice the size.
+
+ Note that for the n-D case this differs from the interleaving possible with
----------------
MacDue wrote:
So, in short:
1. There's basically no support for `shufflevector`, `vector.shuffle`, etc for scalable vectors
2. I believe so
For `2`., while you can hack it and claim to arbitrary pattern means interleave for scalable vectors, there's no pattern that'd actually make sense with the current semantics of `vector.shuffle`. So I think that's just adding tricky edge cases in the meaning of the op.
https://github.com/llvm/llvm-project/pull/80965
More information about the Mlir-commits
mailing list