diff --git a/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp b/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp --- a/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp +++ b/mlir/lib/Dialect/Linalg/Transforms/Tiling.cpp @@ -240,10 +240,15 @@ // Construct (potentially temporary) mins and maxes on which to apply maps // that define tile subviews. SmallVector lbs, subViewSizes; + AffineMap subviewSizeMap = + AffineMap::get(0, 2, {b.getAffineSymbolExpr(0), b.getAffineSymbolExpr(1)}, + b.getContext()); for (unsigned idx = 0, idxIvs = 0, e = tileSizes.size(); idx < e; ++idx) { bool isTiled = !isZero(tileSizes[idx]); lbs.push_back(isTiled ? ivs[idxIvs++] : (Value)std_constant_index(0)); - subViewSizes.push_back(isTiled ? tileSizes[idx] : viewSizes[idx]); + Value subviewSize = + affine_min(subviewSizeMap, ValueRange{tileSizes[idx], viewSizes[idx]}); + subViewSizes.push_back(isTiled ? subviewSize : viewSizes[idx]); } auto *op = linalgOp.getOperation();