[Mlir-commits] [mlir] e29609a - [mlir][Vector] Add interleave(splat, splat) -> wide splat fold (#215255)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Tue Aug 11 01:25:15 PDT 2026


Author: Bryth
Date: 2026-08-11T10:25:10+02:00
New Revision: e29609a344a7488bcdbcb77443ce137f5e5a00e4

URL: https://github.com/llvm/llvm-project/commit/e29609a344a7488bcdbcb77443ce137f5e5a00e4
DIFF: https://github.com/llvm/llvm-project/commit/e29609a344a7488bcdbcb77443ce137f5e5a00e4.diff

LOG: [mlir][Vector] Add interleave(splat, splat) -> wide splat fold (#215255)

Added: 
    

Modified: 
    mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
    mlir/lib/Dialect/Vector/IR/VectorOps.cpp
    mlir/test/Dialect/Vector/canonicalize.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
index 24fdb4f0bb258..5f701cfcbd1b7 100644
--- a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
+++ b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
@@ -585,6 +585,7 @@ def Vector_InterleaveOp :
     }
   }];
   let hasCanonicalizer = 1;
+  let hasFolder = 1;
 }
 
 class ResultIsHalfSourceVectorType<string result> : TypesMatchWith<

diff  --git a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
index 35e93ef81516d..7dbe1847f077d 100644
--- a/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
+++ b/mlir/lib/Dialect/Vector/IR/VectorOps.cpp
@@ -8493,6 +8493,15 @@ void InterleaveOp::getCanonicalizationPatterns(RewritePatternSet &results,
   results.add<InterleaveDeinterleaveFolder>(context);
 }
 
+OpFoldResult InterleaveOp::fold(FoldAdaptor adaptor) {
+  // interleave(splat(x), splat(x)) -> widened splat(x)
+  auto splat = dyn_cast_if_present<SplatElementsAttr>(adaptor.getLhs());
+  if (!splat || adaptor.getLhs() != adaptor.getRhs())
+    return {};
+  return SplatElementsAttr::get(getResultVectorType(),
+                                splat.getSplatValue<Attribute>());
+}
+
 std::optional<SmallVector<int64_t, 4>> InterleaveOp::getShapeForUnroll() {
   return llvm::to_vector<4>(getResultVectorType().getShape());
 }

diff  --git a/mlir/test/Dialect/Vector/canonicalize.mlir b/mlir/test/Dialect/Vector/canonicalize.mlir
index bb1729cd7c3bc..20ce397f10b22 100644
--- a/mlir/test/Dialect/Vector/canonicalize.mlir
+++ b/mlir/test/Dialect/Vector/canonicalize.mlir
@@ -4453,3 +4453,14 @@ func.func @interleave_deinterleave_fold(%arg0: vector<4xf32>) -> vector<4xf32> {
   %result = vector.interleave %even, %odd : vector<2xf32> -> vector<4xf32>
   return %result : vector<4xf32>
 }
+
+// -----
+
+// CHECK-LABEL: @interleave_splat
+//       CHECK:   %[[C:.*]] = arith.constant dense<0.000000e+00> : vector<[4]xf32>
+//       CHECK:   return %[[C]]
+func.func @interleave_splat() -> vector<[4]xf32> {
+  %cst = arith.constant dense<0.0> : vector<[2]xf32>
+  %0 = vector.interleave %cst, %cst : vector<[2]xf32> -> vector<[4]xf32>
+  return %0 : vector<[4]xf32>
+}


        


More information about the Mlir-commits mailing list