From 88a3dc0ee88009a145e8daa875235650f07554c9 Mon Sep 17 00:00:00 2001 From: Alex Zinenko Date: Thu, 26 Jan 2023 14:02:34 +0000 Subject: [PATCH] [mlir] fail gracefull in CallOpSignatureConversion Previously, the CallOpSignatureConversion pattern would assert if function signature change affected the number of results. Fail the pattern instead and let the caller propagate failure. Fixes #60186. Reviewed By: mehdi_amini Differential Revision: https://reviews.llvm.org/D142624 --- mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp | 5 +++++ mlir/test/Transforms/test-legalizer.mlir | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp b/mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp index aec86ab..a69bc77 100644 --- a/mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp +++ b/mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp @@ -29,6 +29,11 @@ struct CallOpSignatureConversion : public OpConversionPattern { convertedResults))) return failure(); + // If this isn't a one-to-one type mapping, we don't know how to aggregate + // the results. + if (callOp->getNumResults() != convertedResults.size()) + return failure(); + // Substitute with the new result types from the corresponding FuncType // conversion. rewriter.replaceOpWithNewOp( diff --git a/mlir/test/Transforms/test-legalizer.mlir b/mlir/test/Transforms/test-legalizer.mlir index 45960a6..06bd5b6 100644 --- a/mlir/test/Transforms/test-legalizer.mlir +++ b/mlir/test/Transforms/test-legalizer.mlir @@ -317,3 +317,16 @@ func.func @typemismatch(%arg: f32) -> i32 { %0 = "test.passthrough_fold"(%arg) : (f32) -> (i32) "test.return"(%0) : (i32) -> () } + +// ----- + +// expected-remark @below {{applyPartialConversion failed}} +module { + func.func private @callee(%0 : f32) -> f32 + + func.func @caller( %arg: f32) { + // expected-error @below {{failed to legalize}} + %1 = func.call @callee(%arg) : (f32) -> f32 + return + } +} -- 2.7.4