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:$res_attrs, OptionalAttr:$aliasee, CIR_OptionalPriorityAttr:$global_ctor_priority, - CIR_OptionalPriorityAttr:$global_dtor_priority); + CIR_OptionalPriorityAttr:$global_dtor_priority, + OptionalAttr:$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()) { + func.setInliningAttr(cir::InlineAttr::get( + builder.getContext(), cir::InlineKind::NoInline)); + } + // Check for explicit always_inline attribute + else if (fd->hasAttr()) { + 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(