From 94ca21db47c6b92245f9df79a37ab6505da11b1b Mon Sep 17 00:00:00 2001 From: Matthias Springer Date: Tue, 5 Dec 2023 15:18:11 +0900 Subject: [PATCH] [mlir][linalg] Fix invalid IR in `FoldInsertPadIntoFill` `FoldInsertPadIntoFill` used to generate an invalid `tensor.insert_slice` op: ``` error: expected type to be 'tensor' or a rank-reduced version. (size mismatch) ``` This commit fixes tests such as `mlir/test/Dialect/Linalg/canonicalize.mlir` when verifying the IR after each pattern application (#74270). --- mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp index 58af9995548e9..86e5215d72ac5 100644 --- a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp +++ b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp @@ -716,11 +716,16 @@ struct FoldInsertPadIntoFill : public OpRewritePattern { rewriter, loc, addMap, {std::get<0>(p), std::get<1>(p)})); } + RankedTensorType srcPadType = srcPadOp.getSourceType(); SmallVector newSizes; - for (int i = 0, e = srcPadOp.getSourceType().getRank(); i < e; ++i) { - newSizes.push_back( - rewriter.create(loc, srcPadOp.getSource(), i) - .getResult()); + for (int i = 0, e = srcPadType.getRank(); i < e; ++i) { + if (srcPadType.isDynamicDim(i)) { + newSizes.push_back( + rewriter.create(loc, srcPadOp.getSource(), i) + .getResult()); + } else { + newSizes.push_back(rewriter.getIndexAttr(srcPadType.getDimSize(i))); + } } rewriter.replaceOpWithNewOp(