[Mlir-commits] [mlir] [mlir][Transforms] Handle attributes in 1-to-many function conversions (PR #162579)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Oct 9 01:24:52 PDT 2025
https://github.com/peterbell10 updated https://github.com/llvm/llvm-project/pull/162579
>From 732ebeda0f1328f0aea1a9d3cc78c728e659cef8 Mon Sep 17 00:00:00 2001
From: Peter Bell <peterbell10 at openai.com>
Date: Thu, 9 Oct 2025 02:13:11 +0100
Subject: [PATCH 1/2] [mlir][Transforms] Handle attributes in 1-to-many
function conversions
Function attributes are associated to the argument index, which may
change during a 1-to-many type conversion but is currently not being
updated by the conversion pattern.
The results is that attributes get applied to the wrong arguments after
the conversion.
Happy to add a lit test, if you can suggest a good place for it.
---
.../Transforms/Utils/DialectConversion.cpp | 32 ++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index 3a23bbfd70eac..ec8d0971f2bbe 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -3789,6 +3789,27 @@ TypeConverter::convertTypeAttribute(Type type, Attribute attr) const {
// FunctionOpInterfaceSignatureConversion
//===----------------------------------------------------------------------===//
+static SmallVector<Attribute>
+convertFuncOpAttrs(FunctionOpInterface funcOp,
+ TypeConverter::SignatureConversion &sigConv,
+ FunctionType newType) {
+ if (newType.getNumInputs() == funcOp.getNumArguments()) {
+ return {};
+ }
+ ArrayAttr allArgAttrs = funcOp.getAllArgAttrs();
+ if (!allArgAttrs)
+ return {};
+
+ SmallVector<Attribute> newAttrs(newType.getNumInputs());
+ for (auto i : llvm::seq(allArgAttrs.size())) {
+ auto mapping = sigConv.getInputMapping(i);
+ assert(mapping.has_value());
+ auto outIdx = mapping->inputNo;
+ newAttrs[outIdx] = allArgAttrs[i];
+ }
+ return newAttrs;
+}
+
static LogicalResult convertFuncOpTypes(FunctionOpInterface funcOp,
const TypeConverter &typeConverter,
ConversionPatternRewriter &rewriter) {
@@ -3809,7 +3830,16 @@ static LogicalResult convertFuncOpTypes(FunctionOpInterface funcOp,
auto newType = FunctionType::get(rewriter.getContext(),
result.getConvertedTypes(), newResults);
- rewriter.modifyOpInPlace(funcOp, [&] { funcOp.setType(newType); });
+ // If using 1-to-n type conversion, we must re-map argument attributes
+ // to the corresponding new argument index.
+ auto newArgAttrs = convertFuncOpAttrs(funcOp, result, newType);
+
+ rewriter.modifyOpInPlace(funcOp, [&] {
+ funcOp.setType(newType);
+ if (!newArgAttrs.empty()) {
+ funcOp.setAllArgAttrs(newArgAttrs);
+ }
+ });
return success();
}
>From ed9821a62eb26b16977874c0ac3ed42a825aebdb Mon Sep 17 00:00:00 2001
From: Peter Bell <peterbell10 at openai.com>
Date: Thu, 9 Oct 2025 09:24:28 +0100
Subject: [PATCH 2/2] Lint
---
mlir/lib/Transforms/Utils/DialectConversion.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index ec8d0971f2bbe..c7fdef74d33bf 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -3830,7 +3830,7 @@ static LogicalResult convertFuncOpTypes(FunctionOpInterface funcOp,
auto newType = FunctionType::get(rewriter.getContext(),
result.getConvertedTypes(), newResults);
- // If using 1-to-n type conversion, we must re-map argument attributes
+ // If using 1-to-n type conversion, we must re-map argument attributes
// to the corresponding new argument index.
auto newArgAttrs = convertFuncOpAttrs(funcOp, result, newType);
More information about the Mlir-commits
mailing list