diff --git a/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp b/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp index 29c64487a2bc0..8dbf15e4174d3 100644 --- a/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp +++ b/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp @@ -31,22 +31,19 @@ class CallOpConversion final : public OpConversionPattern { LogicalResult matchAndRewrite(func::CallOp callOp, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override { - // Multiple results func was not converted to `emitc.func`. + // Multiple results func cannot be converted to `emitc.func`. if (callOp.getNumResults() > 1) return rewriter.notifyMatchFailure( callOp, "only functions with zero or one result can be converted"); // Convert the original function results. - Type resultTy = nullptr; - if (callOp.getNumResults()) { - resultTy = typeConverter->convertType(callOp.getResult(0).getType()); - if (!resultTy) - return rewriter.notifyMatchFailure( - callOp, "function return type conversion failed"); + SmallVector types; + if (failed(typeConverter->convertTypes(callOp.getResultTypes(), types))) { + return rewriter.notifyMatchFailure( + callOp, "function return type conversion failed"); } - rewriter.replaceOpWithNewOp( - callOp, resultTy, adaptor.getOperands(), callOp->getAttrs()); + callOp, types, adaptor.getOperands(), callOp->getAttrs()); return success(); } diff --git a/mlir/test/Conversion/FuncToEmitC/func-to-emitc.mlir b/mlir/test/Conversion/FuncToEmitC/func-to-emitc.mlir index 854d8f3604f44..0552426a07219 100644 --- a/mlir/test/Conversion/FuncToEmitC/func-to-emitc.mlir +++ b/mlir/test/Conversion/FuncToEmitC/func-to-emitc.mlir @@ -88,3 +88,19 @@ func.func @index_args_only(%i: index) -> f32 { %0 = arith.constant 0.0 : f32 return %0 : f32 } + +// ----- + +// CHECK-LABEL: emitc.func private @return_void() attributes {specifiers = ["static"]} +// CHECK-NEXT: emitc.return +func.func private @return_void() { + return +} + +// CHECK-LABEL: emitc.func @call() +// CHECK-NEXT: emitc.call @return_void() : () -> () +// CHECK-NEXT: emitc.return +func.func @call() { + call @return_void() : () -> () + return +}