From 4c78a3db8d82eb6bfb862597578609817160cf45 Mon Sep 17 00:00:00 2001 From: Simon Camphausen Date: Mon, 10 Jun 2024 13:40:24 +0200 Subject: [PATCH 1/2] [mlir][EmitC] Fix call ops with zero arguments in func to emitc conversion (#94936) --- mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp | 2 +- .../Conversion/FuncToEmitC/func-to-emitc.mlir | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp b/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp index 29c64487a2bc09..f2ea9add77d871 100644 --- a/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp +++ b/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp @@ -31,7 +31,7 @@ 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"); diff --git a/mlir/test/Conversion/FuncToEmitC/func-to-emitc.mlir b/mlir/test/Conversion/FuncToEmitC/func-to-emitc.mlir index 854d8f3604f442..0552426a07219f 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 +} From cfb75994bb3c1d707fa1dc0d2d1caab573a12039 Mon Sep 17 00:00:00 2001 From: Matthias Gehre Date: Fri, 28 Jun 2024 14:06:19 +0200 Subject: [PATCH 2/2] FuncToEmitC: fix crash when there are no results --- mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp b/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp index f2ea9add77d871..8dbf15e4174d31 100644 --- a/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp +++ b/mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp @@ -37,16 +37,13 @@ class CallOpConversion final : public OpConversionPattern { 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(); }