diff options
Diffstat (limited to 'mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp')
| -rw-r--r-- | mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp b/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp index 2277989bf841..b548f8ce8b56 100644 --- a/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp +++ b/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp @@ -657,21 +657,29 @@ getResultTilePosition(RewriterBase &rewriter, int64_t index, Value tiledResult, resultOffset, resultSize); case scf::SCFTilingOptions::ReductionTilingStrategy:: PartialReductionOuterReduction: { - // TODO: This does not work for non identity accesses to the result tile. - // The proper fix is to add a getPartialResultTilePosition method to - // PartialReductionOpInterface. - resultOffset = - SmallVector<OpFoldResult>(offsets.size(), rewriter.getIndexAttr(0)); - for (size_t i = 0; i < offsets.size(); i++) { - resultSize.push_back( - tensor::getMixedSize(rewriter, op.getLoc(), tiledResult, i)); + auto redOp = dyn_cast<PartialReductionOpInterface>(op.getOperation()); + if (!redOp) { + return rewriter.notifyMatchFailure( + op, "PartialReductionOuterReduction tiling strategy is only supported" + "for operations implementing PartialReductionOpInterface"); } - return success(); + // Get reduction dimensions. + // TODO: PartialReductionOpInterface should really query TilingInterface + // itself and find reduction dimensions. + SmallVector<int> reductionDims; + for (auto [idx, iteratorType] : + llvm::enumerate(op.getLoopIteratorTypes())) { + if (iteratorType == utils::IteratorType::reduction) + reductionDims.push_back(idx); + } + return redOp.getPartialResultTilePosition(rewriter, index, offsets, sizes, + resultOffset, resultSize, + reductionDims); + } default: return rewriter.notifyMatchFailure(op, "unhandled reduction tiling strategy"); } - } } static FailureOr<MergeResult> |
