[Mlir-commits] [mlir] [mlir][transform] NFC - extract a minimal DomainAndOperandsAffineMapT… (PR #145034)
Nicolas Vasilache
llvmlistbot at llvm.org
Fri Jun 20 05:49:59 PDT 2025
https://github.com/nicolasvasilache created https://github.com/llvm/llvm-project/pull/145034
…ransferInterface out of LinalgStructuredInterface and use that for PadTilingInterface
>From e1cde0dc3583152ab0e9d5f923cbc4f707241984 Mon Sep 17 00:00:00 2001
From: Nicolas Vasilache <nico.vasilache at amd.com>
Date: Fri, 20 Jun 2025 14:42:21 +0200
Subject: [PATCH] [mlir][transform] NFC - extract a minimal
DomainAndOperandsAffineMapTransferInterface out of LinalgStructuredInterface
and use that for PadTilingInterface
---
.../Dialect/Linalg/IR/LinalgInterfaces.td | 89 +++++++++++--------
.../Dialect/Linalg/Transforms/Transforms.h | 18 ++--
.../TransformOps/LinalgTransformOps.cpp | 12 ++-
.../Linalg/Transforms/PadTilingInterface.cpp | 10 ++-
4 files changed, 75 insertions(+), 54 deletions(-)
diff --git a/mlir/include/mlir/Dialect/Linalg/IR/LinalgInterfaces.td b/mlir/include/mlir/Dialect/Linalg/IR/LinalgInterfaces.td
index dbc1ac60e0973..53a9dac389287 100644
--- a/mlir/include/mlir/Dialect/Linalg/IR/LinalgInterfaces.td
+++ b/mlir/include/mlir/Dialect/Linalg/IR/LinalgInterfaces.td
@@ -222,9 +222,60 @@ def LinalgFillOpInterface : OpInterface<"FillOpInterface"> {
];
}
+def DomainAndOperandsAffineMapTransferInterface
+ : OpInterface<"DomainAndOperandsAffineMapTransferInterface"> {
+ let description = [{
+ Interface for operations that connect an iteration domain to operands via
+ affine maps. Provides methods to access indexing maps between iteration
+ domain and operand index spaces.
+ }];
+ let cppNamespace = "::mlir::linalg";
+ let methods = [
+ InterfaceMethod<
+ /*desc=*/[{
+ Return the indexing maps attribute within the current operation.
+ }],
+ /*retTy=*/"ArrayAttr",
+ /*methodName=*/"getIndexingMaps"
+ >,
+ InterfaceMethod<
+ /*desc=*/[{
+ Return the indexing maps within the current operation.
+ }],
+ /*retTy=*/"SmallVector<AffineMap>",
+ /*methodName=*/"getIndexingMapsArray",
+ /*args=*/(ins),
+ /*methodBody=*/"",
+ /*defaultImplementation=*/[{
+ auto range = $_op.getIndexingMaps()
+ .template getAsValueRange<AffineMapAttr>();
+ return {range.begin(), range.end()};
+ }]
+ >,
+ InterfaceMethod<
+ /*desc=*/[{
+ Return the input or output indexing map for `opOperand`.
+ }],
+ /*retTy=*/"AffineMap",
+ /*methodName=*/"getMatchingIndexingMap",
+ /*args=*/(ins "OpOperand*":$opOperand),
+ /*methodBody=*/"",
+ /*defaultImplementation=*/[{
+ assert(opOperand->getOwner() == this->getOperation());
+ auto indexingMaps =
+ $_op.getIndexingMaps().template getAsValueRange<AffineMapAttr>();
+ return *(indexingMaps.begin() + opOperand->getOperandNumber());
+ }]
+ >,
+ ];
+}
+
// The 'LinalgStructuredInterface' provides access to the 'LinalgOp' interface.
def LinalgStructuredInterface
- : OpInterface<"LinalgOp", [DestinationStyleOpInterface]> {
+ : OpInterface<"LinalgOp", [
+ DestinationStyleOpInterface,
+ DomainAndOperandsAffineMapTransferInterface
+ ]> {
let cppNamespace = "::mlir::linalg";
let methods = [
//===------------------------------------------------------------------===//
@@ -465,21 +516,6 @@ def LinalgStructuredInterface
blockArgument.getArgNumber());
}]
>,
- InterfaceMethod<
- /*desc=*/[{
- Return the input or output indexing map for `opOperand`.
- }],
- /*retTy=*/"AffineMap",
- /*methodName=*/"getMatchingIndexingMap",
- /*args=*/(ins "OpOperand*":$opOperand),
- /*methodBody=*/"",
- /*defaultImplementation=*/[{
- assert(opOperand->getOwner() == this->getOperation());
- auto indexingMaps =
- $_op.getIndexingMaps().template getAsValueRange<AffineMapAttr>();
- return *(indexingMaps.begin() + opOperand->getOperandNumber());
- }]
- >,
InterfaceMethod<
/*desc=*/[{
Return the indexing map for a `result`.
@@ -576,27 +612,6 @@ def LinalgStructuredInterface
/*methodBody=*/"",
/*defaultImplementation=*/[{ return success(); }]
>,
- InterfaceMethod<
- /*desc=*/[{
- Return the indexing maps attribute within the current operation.
- }],
- /*retTy=*/"ArrayAttr",
- /*methodName=*/"getIndexingMaps"
- >,
- InterfaceMethod<
- /*desc=*/[{
- Return the indexing maps within the current operation.
- }],
- /*retTy=*/"SmallVector<AffineMap>",
- /*methodName=*/"getIndexingMapsArray",
- /*args=*/(ins),
- /*methodBody=*/"",
- /*defaultImplementation=*/[{
- auto range = $_op.getIndexingMaps()
- .template getAsValueRange<AffineMapAttr>();
- return {range.begin(), range.end()};
- }]
- >,
InterfaceMethod<
/*desc=*/[{
Return true if any of the operands has a dynamic shape.
diff --git a/mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h b/mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h
index 59b7fdeef10b3..b59727f7cbfaa 100644
--- a/mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h
+++ b/mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h
@@ -613,9 +613,9 @@ using PadSizeComputationFunction =
/// Specific helper for Linalg ops.
FailureOr<SmallVector<OpFoldResult>>
-computeLinalgPaddedShape(RewriterBase &rewriter, OpOperand &operandToPad,
- ArrayRef<Range> iterationDomain,
- const PadTilingInterfaceOptions &options);
+computeDomainAndOperandsAffineMapTransferInterfacePaddedShape(
+ RewriterBase &rewriter, OpOperand &operandToPad,
+ ArrayRef<Range> iterationDomain, const PadTilingInterfaceOptions &options);
/// Pad the iterator dimensions `options.paddingDimensions` of `opToPad`.
///
@@ -627,12 +627,12 @@ computeLinalgPaddedShape(RewriterBase &rewriter, OpOperand &operandToPad,
// tensor::PadOp.
/// * The tensor::PadOp is returned on success.
-FailureOr<TilingInterface>
-rewriteAsPaddedOp(RewriterBase &rewriter, TilingInterface opToPad,
- const PadTilingInterfaceOptions &constOptions,
- SmallVector<tensor::PadOp> &padOps,
- PadSizeComputationFunction computePaddingSizeFun =
- &computeLinalgPaddedShape);
+FailureOr<TilingInterface> rewriteAsPaddedOp(
+ RewriterBase &rewriter, TilingInterface opToPad,
+ const PadTilingInterfaceOptions &constOptions,
+ SmallVector<tensor::PadOp> &padOps,
+ PadSizeComputationFunction computePaddingSizeFun =
+ &computeDomainAndOperandsAffineMapTransferInterfacePaddedShape);
namespace detail {
diff --git a/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp b/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
index e627fc83f2ba7..5cbf0bf8500c7 100644
--- a/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
+++ b/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
@@ -2229,10 +2229,14 @@ transform::PadTilingInterfaceOp::apply(transform::TransformRewriter &rewriter,
return diag;
}
- // Only Linalg ops for now, until TilingInterface exposes a loopsToOperand
- // map / C++ APIs to compute the effect of padding on operands.
- if (!isa<LinalgOp>(targetOp.getOperation())) {
- auto diag = emitSilenceableError() << "only LinalgOp supported atm";
+ // Only DomainAndOperandsAffineMapTransferInterface ops for now, until
+ // TilingInterface exposes a loopsToOperand map / C++ APIs to compute the
+ // effect of padding on operands.
+ if (!isa<DomainAndOperandsAffineMapTransferInterface>(
+ targetOp.getOperation())) {
+ auto diag = emitSilenceableError()
+ << "only DomainAndOperandsAffineMapTransferInterface ops "
+ "supported atm";
diag.attachNote(target->getLoc()) << "target op";
return diag;
}
diff --git a/mlir/lib/Dialect/Linalg/Transforms/PadTilingInterface.cpp b/mlir/lib/Dialect/Linalg/Transforms/PadTilingInterface.cpp
index a9d7bc64f2a6b..679f3b8322a1f 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/PadTilingInterface.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/PadTilingInterface.cpp
@@ -155,11 +155,13 @@ SmallVector<OpFoldResult> linalg::computePaddedShape(
return paddedShape;
}
-FailureOr<SmallVector<OpFoldResult>> linalg::computeLinalgPaddedShape(
+FailureOr<SmallVector<OpFoldResult>>
+linalg::computeDomainAndOperandsAffineMapTransferInterfacePaddedShape(
RewriterBase &rewriter, OpOperand &operandToPad,
ArrayRef<Range> iterationDomain, const PadTilingInterfaceOptions &options) {
- auto linalgOp = llvm::dyn_cast<LinalgOp>(operandToPad.getOwner());
- if (!linalgOp)
+ auto transferOp = llvm::dyn_cast<DomainAndOperandsAffineMapTransferInterface>(
+ operandToPad.getOwner());
+ if (!transferOp)
return failure();
// clang-format off
@@ -173,7 +175,7 @@ FailureOr<SmallVector<OpFoldResult>> linalg::computeLinalgPaddedShape(
for (const Range &range : iterationDomain)
loopUpperBounds.push_back(range.size);
- AffineMap indexingMap = linalgOp.getMatchingIndexingMap(&operandToPad);
+ AffineMap indexingMap = transferOp.getMatchingIndexingMap(&operandToPad);
return computePaddedShape(
rewriter, cast<TypedValue<RankedTensorType>>(operandToPad.get()),
indexingMap, loopUpperBounds, options);
More information about the Mlir-commits
mailing list