[Mlir-commits] [mlir] 15cfe4a - [MLIR] Adding 'no_inline' and 'always_inline' attributes on LLMV::CallOp (#133726)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Apr 1 06:48:29 PDT 2025
Author: Jean-Didier PAILLEUX
Date: 2025-04-01T15:48:25+02:00
New Revision: 15cfe4a77495a6053cc9818247fe520da2bb3e5f
URL: https://github.com/llvm/llvm-project/commit/15cfe4a77495a6053cc9818247fe520da2bb3e5f
DIFF: https://github.com/llvm/llvm-project/commit/15cfe4a77495a6053cc9818247fe520da2bb3e5f.diff
LOG: [MLIR] Adding 'no_inline' and 'always_inline' attributes on LLMV::CallOp (#133726)
Addition of `no_inline` and `always_inline` attributes for CallOps in
MLIR in order to be able to inline or not directly the call of a
function without having the attribute on the `FuncOp`.
The addition of these attributes will be used in a future PR in Flang
(`[NO]INLINE` directive).
Added:
mlir/test/Target/LLVMIR/Import/call-attributes.ll
Modified:
mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
mlir/lib/Target/LLVMIR/ModuleImport.cpp
mlir/test/Target/LLVMIR/llvmir.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index 707e23194061b..423cf948b03e1 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -771,23 +771,23 @@ def LLVM_CallOp : LLVM_MemAccessOpBase<"call",
}];
dag args = (ins OptionalAttr<TypeAttrOf<LLVM_FunctionType>>:$var_callee_type,
- OptionalAttr<FlatSymbolRefAttr>:$callee,
- Variadic<LLVM_Type>:$callee_operands,
- DefaultValuedAttr<LLVM_FastmathFlagsAttr,
- "{}">:$fastmathFlags,
- OptionalAttr<DenseI32ArrayAttr>:$branch_weights,
- DefaultValuedAttr<CConv, "CConv::C">:$CConv,
- DefaultValuedAttr<TailCallKind, "TailCallKind::None">:$TailCallKind,
- OptionalAttr<LLVM_MemoryEffectsAttr>:$memory_effects,
- OptionalAttr<UnitAttr>:$convergent,
- OptionalAttr<UnitAttr>:$no_unwind,
- OptionalAttr<UnitAttr>:$will_return,
- VariadicOfVariadic<LLVM_Type,
- "op_bundle_sizes">:$op_bundle_operands,
- DenseI32ArrayAttr:$op_bundle_sizes,
- OptionalAttr<ArrayAttr>:$op_bundle_tags,
- OptionalAttr<DictArrayAttr>:$arg_attrs,
- OptionalAttr<DictArrayAttr>:$res_attrs);
+ OptionalAttr<FlatSymbolRefAttr>:$callee,
+ Variadic<LLVM_Type>:$callee_operands,
+ DefaultValuedAttr<LLVM_FastmathFlagsAttr, "{}">:$fastmathFlags,
+ OptionalAttr<DenseI32ArrayAttr>:$branch_weights,
+ DefaultValuedAttr<CConv, "CConv::C">:$CConv,
+ DefaultValuedAttr<TailCallKind, "TailCallKind::None">:$TailCallKind,
+ OptionalAttr<LLVM_MemoryEffectsAttr>:$memory_effects,
+ OptionalAttr<UnitAttr>:$convergent,
+ OptionalAttr<UnitAttr>:$no_unwind,
+ OptionalAttr<UnitAttr>:$will_return,
+ VariadicOfVariadic<LLVM_Type, "op_bundle_sizes">:$op_bundle_operands,
+ DenseI32ArrayAttr:$op_bundle_sizes,
+ OptionalAttr<ArrayAttr>:$op_bundle_tags,
+ OptionalAttr<DictArrayAttr>:$arg_attrs,
+ OptionalAttr<DictArrayAttr>:$res_attrs,
+ OptionalAttr<UnitAttr>:$no_inline,
+ OptionalAttr<UnitAttr>:$always_inline);
// Append the aliasing related attributes defined in LLVM_MemAccessOpBase.
let arguments = !con(args, aliasAttrs);
let results = (outs Optional<LLVM_Type>:$result);
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index 1c43173f31345..252bdd1425d5e 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -1037,7 +1037,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state, TypeRange results,
/*op_bundle_operands=*/{}, /*op_bundle_tags=*/{},
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
- /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
+ /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr);
}
void CallOp::build(OpBuilder &builder, OperationState &state,
@@ -1065,7 +1066,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
/*op_bundle_operands=*/{}, /*op_bundle_tags=*/{},
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*access_groups=*/nullptr,
- /*alias_scopes=*/nullptr, /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
+ /*alias_scopes=*/nullptr, /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr);
}
void CallOp::build(OpBuilder &builder, OperationState &state,
@@ -1079,7 +1081,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
/*op_bundle_operands=*/{}, /*op_bundle_tags=*/{},
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
- /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
+ /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr);
}
void CallOp::build(OpBuilder &builder, OperationState &state, LLVMFuncOp func,
@@ -1093,7 +1096,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state, LLVMFuncOp func,
/*op_bundle_operands=*/{}, /*op_bundle_tags=*/{},
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
- /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
+ /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr);
}
CallInterfaceCallable CallOp::getCallableForCallee() {
diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
index f8fa22253bea8..10b68a333bcbd 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
@@ -319,6 +319,10 @@ convertOperationImpl(Operation &opInst, llvm::IRBuilderBase &builder,
call->addFnAttr(llvm::Attribute::NoUnwind);
if (callOp.getWillReturnAttr())
call->addFnAttr(llvm::Attribute::WillReturn);
+ if (callOp.getNoInlineAttr())
+ call->addFnAttr(llvm::Attribute::NoInline);
+ if (callOp.getAlwaysInlineAttr())
+ call->addFnAttr(llvm::Attribute::AlwaysInline);
if (failed(convertParameterAndResultAttrs(callOp, call, moduleTranslation)))
return failure();
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index c0711f7dded71..ea141d8b07284 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -2331,6 +2331,9 @@ LogicalResult ModuleImport::convertCallAttributes(llvm::CallInst *inst,
op.setConvergent(callAttrs.getFnAttr(llvm::Attribute::Convergent).isValid());
op.setNoUnwind(callAttrs.getFnAttr(llvm::Attribute::NoUnwind).isValid());
op.setWillReturn(callAttrs.getFnAttr(llvm::Attribute::WillReturn).isValid());
+ op.setNoInline(callAttrs.getFnAttr(llvm::Attribute::NoInline).isValid());
+ op.setAlwaysInline(
+ callAttrs.getFnAttr(llvm::Attribute::AlwaysInline).isValid());
llvm::MemoryEffects memEffects = inst->getMemoryEffects();
ModRefInfo othermem = convertModRefInfoFromLLVM(
diff --git a/mlir/test/Target/LLVMIR/Import/call-attributes.ll b/mlir/test/Target/LLVMIR/Import/call-attributes.ll
new file mode 100644
index 0000000000000..96c61e6e31da8
--- /dev/null
+++ b/mlir/test/Target/LLVMIR/Import/call-attributes.ll
@@ -0,0 +1,25 @@
+; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s
+
+declare void @f()
+
+; CHECK-LABEL: @test_call_noinline
+; CHECK: llvm.call @f() {no_inline} : () -> ()
+define void @test_call_noinline() {
+ call void @f() #0
+ ret void
+}
+
+attributes #0 = { noinline }
+
+// -----
+
+declare void @f()
+
+; CHECK-LABEL: @test_call_alwaysinline
+; CHECK: llvm.call @f() {always_inline} : () -> ()
+define void @test_call_alwaysinline() {
+ call void @f() #0
+ ret void
+}
+
+attributes #0 = { alwaysinline }
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index 0238c95835a0f..cbd41efdc3015 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -2621,6 +2621,35 @@ llvm.func @willreturn_call() {
// CHECK: #[[ATTRS]]
// CHECK-SAME: willreturn
+// -----
+
+llvm.func @f()
+
+// CHECK-LABEL: @no_inline_call
+// CHECK: call void @f() #[[ATTRS:[0-9]+]]
+llvm.func @no_inline_call() {
+ llvm.call @f() {no_inline} : () -> ()
+ llvm.return
+}
+
+// CHECK: #[[ATTRS]]
+// CHECK-SAME: noinline
+
+// -----
+
+llvm.func @f()
+
+// CHECK-LABEL: @always_inline_call
+// CHECK: call void @f() #[[ATTRS:[0-9]+]]
+llvm.func @always_inline_call() {
+ llvm.call @f() {always_inline} : () -> ()
+ llvm.return
+}
+
+// CHECK: #[[ATTRS]]
+// CHECK-SAME: alwaysinline
+
+
// -----
llvm.func @fa()
More information about the Mlir-commits
mailing list