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 @@ -159,8 +159,13 @@ // Initial tile sizes may be too big, only take the first nLoops. tileSizes = tileSizes.take_front(nLoops); - if (llvm::all_of(tileSizes, isZero)) - return failure(); + if (llvm::all_of(tileSizes, isZero)) { + TiledLinalgOp tiledOp; + tiledOp.op = cast(b.clone(*op.getOperation())); + tiledOp.tensorResults.assign(tiledOp.op->result_begin(), + tiledOp.op->result_end()); + return tiledOp; + } // 1. Build the tiled loop ranges. auto allShapeSizes = op.createFlatListOfOperandDims(b, op.getLoc()); diff --git a/mlir/test/Dialect/Linalg/tile-zero.mlir b/mlir/test/Dialect/Linalg/tile-zero.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Dialect/Linalg/tile-zero.mlir @@ -0,0 +1,12 @@ +// RUN: mlir-opt -test-linalg-transform-patterns=test-tile-pattern %s | FileCheck %s + +func @matmul_zero_tile( + %arg0: tensor, %arg1 : tensor, %arg2 : tensor) -> tensor { + %0 = linalg.matmul {__internal_linalg_transform__ = "tile"} + ins(%arg0, %arg1 : tensor, tensor) + outs(%arg2 : tensor) -> tensor + return %0 : tensor +} +// CHECK-LABEL: matmul_zero_tile +// CHECK: linalg.matmul +// CHECK-NOT: __internal_linalg_transform__