diff --git a/mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp b/mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp --- a/mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp +++ b/mlir/lib/Dialect/Func/Transforms/FuncConversions.cpp @@ -29,6 +29,11 @@ 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 --- a/mlir/test/Transforms/test-legalizer.mlir +++ b/mlir/test/Transforms/test-legalizer.mlir @@ -317,3 +317,16 @@ %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 + } +}