[Mlir-commits] [mlir] [mlir][Vector] Add a dedicated Transform Dialect op for `UnrollContractPattern` (PR #230543)
Federico Bruzzone
llvmlistbot at llvm.org
Mon Oct 12 16:45:57 PDT 2026
================
@@ -168,6 +168,38 @@ void transform::ApplyUnrollFromElementsPatternsOp::populatePatterns(
vector::populateVectorFromElementsUnrollPatterns(patterns);
}
+void transform::ApplyUnrollContractPatternsOp::populatePatterns(
+ RewritePatternSet &patterns) {
+ int64_t m = getM();
+ int64_t n = getN();
+ int64_t k = getK();
+
+ auto nativeShapeFn =
+ [m, n, k](Operation *op) -> std::optional<SmallVector<int64_t>> {
+ return SmallVector<int64_t>({m, n, k});
+ };
+
+ vector::populateVectorContractUnrollPatterns(
+ patterns, vector::UnrollVectorOptions()
+ .setNativeShapeFn(nativeShapeFn)
+ .setFilterConstraint([](Operation *op) {
+ auto contract = dyn_cast<vector::ContractionOp>(op);
+ if (!contract)
+ return failure();
+
+ if (contract.getIteratorTypesArray() !=
+ SmallVector<vector::IteratorType>{
+ vector::IteratorType::parallel,
+ vector::IteratorType::parallel,
+ vector::IteratorType::reduction})
+ return failure();
----------------
FedericoBruzzone wrote:
If we want to avoid a new stack allocation for `SmallVector`, but a little bit less readable:
```suggestion
auto iterators = contract.getIteratorTypesArray();
if (iterators.size() != 3 ||
iterators[0] != vector::IteratorType::parallel ||
iterators[1] != vector::IteratorType::parallel ||
iterators[2] != vector::IteratorType::reduction)
return failure();
```
_Don't merge it. it's not formatted correctly_
https://github.com/llvm/llvm-project/pull/230543
More information about the Mlir-commits
mailing list