[clang] [CIR] Add functionality for inline functions (PR #167135)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Nov 8 04:50:57 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clangir
Author: None (rashmika0220)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/167135.diff
3 Files Affected:
- (modified) clang/include/clang/CIR/Dialect/IR/CIROps.td (+2-1)
- (modified) clang/lib/CIR/CodeGen/CIRGenModule.cpp (+17)
- (modified) clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp (+5-5)
``````````diff
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 6f9a69e697cc3..707b5ff88a356 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -2521,7 +2521,8 @@ def CIR_FuncOp : CIR_Op<"func", [
OptionalAttr<DictArrayAttr>:$res_attrs,
OptionalAttr<FlatSymbolRefAttr>:$aliasee,
CIR_OptionalPriorityAttr:$global_ctor_priority,
- CIR_OptionalPriorityAttr:$global_dtor_priority);
+ CIR_OptionalPriorityAttr:$global_dtor_priority,
+ OptionalAttr<CIR_InlineAttr>:$inlining);
let regions = (region AnyRegion:$body);
diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
index 9f9b2db4771df..c4c260e9e5fe8 100644
--- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
@@ -1928,6 +1928,23 @@ void CIRGenModule::setFunctionAttributes(GlobalDecl globalDecl,
"available body!");
assert(!cir::MissingFeatures::attributeNoBuiltin());
}
+
+ // Handle inline-related attributes (noinline, always_inline, inline hint)
+ // Check for explicit noinline attribute - this takes highest precedence
+ if (fd->hasAttr<NoInlineAttr>()) {
+ func.setInliningAttr(cir::InlineAttr::get(
+ builder.getContext(), cir::InlineKind::NoInline));
+ }
+ // Check for explicit always_inline attribute
+ else if (fd->hasAttr<AlwaysInlineAttr>()) {
+ func.setInliningAttr(cir::InlineAttr::get(
+ builder.getContext(), cir::InlineKind::AlwaysInline));
+ }
+ // Check for inline keyword (provides inline hint)
+ else if (fd->isInlined()) {
+ func.setInliningAttr(cir::InlineAttr::get(
+ builder.getContext(), cir::InlineKind::InlineHint));
+ }
}
void CIRGenModule::setCIRFunctionAttributesForDefinition(
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index ba967a43ce59a..84af42258e1ed 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -1800,7 +1800,7 @@ void CIRToLLVMFuncOpLowering::lowerFuncAttributes(
attr.getName() == getLinkageAttrNameString() ||
attr.getName() == func.getGlobalVisibilityAttrName() ||
attr.getName() == func.getDsoLocalAttrName() ||
- attr.getName() == func.getInlineKindAttrName() ||
+ attr.getName() == func.getInliningAttrName() ||
(filterArgAndResAttrs &&
(attr.getName() == func.getArgAttrsAttrName() ||
attr.getName() == func.getResAttrsAttrName())))
@@ -1885,10 +1885,10 @@ mlir::LogicalResult CIRToLLVMFuncOpLowering::matchAndRewrite(
assert(!cir::MissingFeatures::opFuncMultipleReturnVals());
- if (auto inlineKind = op.getInlineKind()) {
- fn.setNoInline(inlineKind == cir::InlineKind::NoInline);
- fn.setInlineHint(inlineKind == cir::InlineKind::InlineHint);
- fn.setAlwaysInline(inlineKind == cir::InlineKind::AlwaysInline);
+ if (auto inlining = op.getInlining()) {
+ fn.setNoInline(*inlining == cir::InlineKind::NoInline);
+ fn.setInlineHint(*inlining == cir::InlineKind::InlineHint);
+ fn.setAlwaysInline(*inlining == cir::InlineKind::AlwaysInline);
}
fn.setVisibility_Attr(mlir::LLVM::VisibilityAttr::get(
``````````
</details>
https://github.com/llvm/llvm-project/pull/167135
More information about the cfe-commits
mailing list