diff --git a/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp b/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp index 328c605add65c..7170d56069e80 100644 --- a/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp +++ b/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp @@ -62,6 +62,7 @@ using namespace mlir; static constexpr StringRef varargsAttrName = "func.varargs"; static constexpr StringRef linkageAttrName = "llvm.linkage"; static constexpr StringRef barePtrAttrName = "llvm.bareptr"; +static constexpr StringRef noInlineAttrName = "no_inline"; /// Return `true` if the `op` should use bare pointer calling convention. static bool shouldUseBarePtrCallConv(Operation *op, @@ -381,6 +382,9 @@ mlir::convertFuncOpToLLVMFuncOp(FunctionOpInterface funcOp, newFuncOp.setMemoryEffectsAttr(memoryAttr); } + // Propagate no_inline attributes + newFuncOp.setNoInline(funcOp->hasAttr(noInlineAttrName)); + // Propagate argument/result attributes to all converted arguments/result // obtained after converting a given original argument/result. if (ArrayAttr resAttrDicts = funcOp.getAllResultAttrs()) { diff --git a/mlir/test/Conversion/FuncToLLVM/convert-funcs.mlir b/mlir/test/Conversion/FuncToLLVM/convert-funcs.mlir index ae1dc70d0686b..b4e6cdffb7640 100644 --- a/mlir/test/Conversion/FuncToLLVM/convert-funcs.mlir +++ b/mlir/test/Conversion/FuncToLLVM/convert-funcs.mlir @@ -96,3 +96,11 @@ func.func private @badllvmlinkage(i32) attributes { "llvm.linkage" = 3 : i64 } / func.func @variadic_func(%arg0: i32) attributes { "func.varargs" = true, "llvm.emit_c_interface" } { return } + +// ----- + +// Check that no_inline attribute is propagated from func::FuncOp to LLVM::LLVMFuncOp +// CHECK-LABEL: llvm.func @func_with_noinline(%arg0: i32) attributes {no_inline} +func.func @func_with_noinline(%arg0: i32) attributes { no_inline } { + return +}