[Mlir-commits] [mlir] [MLIR][FuncToLLVM] Propagate no_inline attribute (PR #143809)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Jun 12 14:51:17 PDT 2025


https://github.com/junfengd-nv updated https://github.com/llvm/llvm-project/pull/143809

>From 2105c345c5a612026f60b0c3e48f524670c61bb0 Mon Sep 17 00:00:00 2001
From: Junfeng Dong <junfengd at nvidia.com>
Date: Wed, 11 Jun 2025 16:34:57 -0700
Subject: [PATCH 1/2] Propagate no_inline attributes

---
 mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp      | 6 ++++++
 mlir/test/Conversion/FuncToLLVM/convert-funcs.mlir | 8 ++++++++
 2 files changed, 14 insertions(+)

diff --git a/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp b/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp
index 328c605add65c..35228fb9c9e72 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 noInlineAttr = "no_inline";
 
 /// Return `true` if the `op` should use bare pointer calling convention.
 static bool shouldUseBarePtrCallConv(Operation *op,
@@ -381,6 +382,11 @@ mlir::convertFuncOpToLLVMFuncOp(FunctionOpInterface funcOp,
     newFuncOp.setMemoryEffectsAttr(memoryAttr);
   }
 
+  // Propagate no_inline attributes
+  if (funcOp->hasAttr(noInlineAttr)) {
+    newFuncOp->setAttr(noInlineAttr, rewriter.getUnitAttr());
+  }
+
   // 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
+}

>From 9d3df5f8345548c0e3b8c9ef63b65847b1fd40e0 Mon Sep 17 00:00:00 2001
From: Junfeng Dong <junfengd at nvidia.com>
Date: Thu, 12 Jun 2025 14:50:05 -0700
Subject: [PATCH 2/2] Use setNoInline method.

---
 mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp b/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp
index 35228fb9c9e72..7170d56069e80 100644
--- a/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp
+++ b/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp
@@ -62,7 +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 noInlineAttr = "no_inline";
+static constexpr StringRef noInlineAttrName = "no_inline";
 
 /// Return `true` if the `op` should use bare pointer calling convention.
 static bool shouldUseBarePtrCallConv(Operation *op,
@@ -383,9 +383,7 @@ mlir::convertFuncOpToLLVMFuncOp(FunctionOpInterface funcOp,
   }
 
   // Propagate no_inline attributes
-  if (funcOp->hasAttr(noInlineAttr)) {
-    newFuncOp->setAttr(noInlineAttr, rewriter.getUnitAttr());
-  }
+  newFuncOp.setNoInline(funcOp->hasAttr(noInlineAttrName));
 
   // Propagate argument/result attributes to all converted arguments/result
   // obtained after converting a given original argument/result.



More information about the Mlir-commits mailing list