-
Notifications
You must be signed in to change notification settings - Fork 13.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[MLIR] Adding 'inline_hint' attribute on LLMV::CallOp #134582
[MLIR] Adding 'inline_hint' attribute on LLMV::CallOp #134582
Conversation
@llvm/pr-subscribers-mlir Author: Jean-Didier PAILLEUX (JDPailleux) ChangesAddition of Full diff: https://github.com/llvm/llvm-project/pull/134582.diff 6 Files Affected:
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index 423cf948b03e1..01b08650a1a27 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -787,7 +787,8 @@ def LLVM_CallOp : LLVM_MemAccessOpBase<"call",
OptionalAttr<DictArrayAttr>:$arg_attrs,
OptionalAttr<DictArrayAttr>:$res_attrs,
OptionalAttr<UnitAttr>:$no_inline,
- OptionalAttr<UnitAttr>:$always_inline);
+ OptionalAttr<UnitAttr>:$always_inline,
+ OptionalAttr<UnitAttr>:$inline_hint);
// 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 252bdd1425d5e..8337a44f7f774 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -1038,7 +1038,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state, TypeRange results,
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
- /*no_inline=*/nullptr, /*always_inline=*/nullptr);
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr,
+ /*inline_hint=*/nullptr);
}
void CallOp::build(OpBuilder &builder, OperationState &state,
@@ -1067,7 +1068,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*access_groups=*/nullptr,
/*alias_scopes=*/nullptr, /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
- /*no_inline=*/nullptr, /*always_inline=*/nullptr);
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr,
+ /*inline_hint=*/nullptr);
}
void CallOp::build(OpBuilder &builder, OperationState &state,
@@ -1082,7 +1084,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
- /*no_inline=*/nullptr, /*always_inline=*/nullptr);
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr,
+ /*inline_hint=*/nullptr);
}
void CallOp::build(OpBuilder &builder, OperationState &state, LLVMFuncOp func,
@@ -1097,7 +1100,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state, LLVMFuncOp func,
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
- /*no_inline=*/nullptr, /*always_inline=*/nullptr);
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr,
+ /*inline_hint=*/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 10b68a333bcbd..f737533a1d9b5 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
@@ -323,6 +323,8 @@ convertOperationImpl(Operation &opInst, llvm::IRBuilderBase &builder,
call->addFnAttr(llvm::Attribute::NoInline);
if (callOp.getAlwaysInlineAttr())
call->addFnAttr(llvm::Attribute::AlwaysInline);
+ if (callOp.getInlineHintAttr())
+ call->addFnAttr(llvm::Attribute::InlineHint);
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 ea141d8b07284..8d48f1549bbaf 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -2334,6 +2334,7 @@ LogicalResult ModuleImport::convertCallAttributes(llvm::CallInst *inst,
op.setNoInline(callAttrs.getFnAttr(llvm::Attribute::NoInline).isValid());
op.setAlwaysInline(
callAttrs.getFnAttr(llvm::Attribute::AlwaysInline).isValid());
+ op.setInlineHint(callAttrs.getFnAttr(llvm::Attribute::InlineHint).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
index 96c61e6e31da8..24f96815ac4c3 100644
--- a/mlir/test/Target/LLVMIR/Import/call-attributes.ll
+++ b/mlir/test/Target/LLVMIR/Import/call-attributes.ll
@@ -23,3 +23,16 @@ define void @test_call_alwaysinline() {
}
attributes #0 = { alwaysinline }
+
+// -----
+
+declare void @f()
+
+; CHECK-LABEL: @test_call_inlinehint
+; CHECK: llvm.call @f() {inline_hint} : () -> ()
+define void @test_call_inlinehint() {
+ call void @f() #0
+ ret void
+}
+
+attributes #0 = { inlinehint }
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index cbd41efdc3015..6bfd17cbc170b 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -2649,6 +2649,21 @@ llvm.func @always_inline_call() {
// CHECK: #[[ATTRS]]
// CHECK-SAME: alwaysinline
+// -----
+
+llvm.func @f()
+
+// CHECK-LABEL: @inline_hint_call
+// CHECK: call void @f() #[[ATTRS:[0-9]+]]
+llvm.func @inline_hint_call() {
+ llvm.call @f() {inline_hint} : () -> ()
+ llvm.return
+}
+
+// CHECK: #[[ATTRS]]
+// CHECK-SAME: inlinehint
+
+
// -----
|
@llvm/pr-subscribers-mlir-llvm Author: Jean-Didier PAILLEUX (JDPailleux) ChangesAddition of Full diff: https://github.com/llvm/llvm-project/pull/134582.diff 6 Files Affected:
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index 423cf948b03e1..01b08650a1a27 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -787,7 +787,8 @@ def LLVM_CallOp : LLVM_MemAccessOpBase<"call",
OptionalAttr<DictArrayAttr>:$arg_attrs,
OptionalAttr<DictArrayAttr>:$res_attrs,
OptionalAttr<UnitAttr>:$no_inline,
- OptionalAttr<UnitAttr>:$always_inline);
+ OptionalAttr<UnitAttr>:$always_inline,
+ OptionalAttr<UnitAttr>:$inline_hint);
// 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 252bdd1425d5e..8337a44f7f774 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -1038,7 +1038,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state, TypeRange results,
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
- /*no_inline=*/nullptr, /*always_inline=*/nullptr);
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr,
+ /*inline_hint=*/nullptr);
}
void CallOp::build(OpBuilder &builder, OperationState &state,
@@ -1067,7 +1068,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*access_groups=*/nullptr,
/*alias_scopes=*/nullptr, /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
- /*no_inline=*/nullptr, /*always_inline=*/nullptr);
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr,
+ /*inline_hint=*/nullptr);
}
void CallOp::build(OpBuilder &builder, OperationState &state,
@@ -1082,7 +1084,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
- /*no_inline=*/nullptr, /*always_inline=*/nullptr);
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr,
+ /*inline_hint=*/nullptr);
}
void CallOp::build(OpBuilder &builder, OperationState &state, LLVMFuncOp func,
@@ -1097,7 +1100,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state, LLVMFuncOp func,
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
- /*no_inline=*/nullptr, /*always_inline=*/nullptr);
+ /*no_inline=*/nullptr, /*always_inline=*/nullptr,
+ /*inline_hint=*/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 10b68a333bcbd..f737533a1d9b5 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
@@ -323,6 +323,8 @@ convertOperationImpl(Operation &opInst, llvm::IRBuilderBase &builder,
call->addFnAttr(llvm::Attribute::NoInline);
if (callOp.getAlwaysInlineAttr())
call->addFnAttr(llvm::Attribute::AlwaysInline);
+ if (callOp.getInlineHintAttr())
+ call->addFnAttr(llvm::Attribute::InlineHint);
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 ea141d8b07284..8d48f1549bbaf 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -2334,6 +2334,7 @@ LogicalResult ModuleImport::convertCallAttributes(llvm::CallInst *inst,
op.setNoInline(callAttrs.getFnAttr(llvm::Attribute::NoInline).isValid());
op.setAlwaysInline(
callAttrs.getFnAttr(llvm::Attribute::AlwaysInline).isValid());
+ op.setInlineHint(callAttrs.getFnAttr(llvm::Attribute::InlineHint).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
index 96c61e6e31da8..24f96815ac4c3 100644
--- a/mlir/test/Target/LLVMIR/Import/call-attributes.ll
+++ b/mlir/test/Target/LLVMIR/Import/call-attributes.ll
@@ -23,3 +23,16 @@ define void @test_call_alwaysinline() {
}
attributes #0 = { alwaysinline }
+
+// -----
+
+declare void @f()
+
+; CHECK-LABEL: @test_call_inlinehint
+; CHECK: llvm.call @f() {inline_hint} : () -> ()
+define void @test_call_inlinehint() {
+ call void @f() #0
+ ret void
+}
+
+attributes #0 = { inlinehint }
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index cbd41efdc3015..6bfd17cbc170b 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -2649,6 +2649,21 @@ llvm.func @always_inline_call() {
// CHECK: #[[ATTRS]]
// CHECK-SAME: alwaysinline
+// -----
+
+llvm.func @f()
+
+// CHECK-LABEL: @inline_hint_call
+// CHECK: call void @f() #[[ATTRS:[0-9]+]]
+llvm.func @inline_hint_call() {
+ llvm.call @f() {inline_hint} : () -> ()
+ llvm.return
+}
+
+// CHECK: #[[ATTRS]]
+// CHECK-SAME: inlinehint
+
+
// -----
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM modulo nit.
LGTM. you can wait for one more approval. |
63b6019
to
10b0773
Compare
10b0773
to
91a03d8
Compare
91a03d8
to
aaa0be0
Compare
Addition of `inlinehint` attributes for CallOps in MLIR in order to be able to say to a function call that the inlining is desirable without having the attribute on the FuncOp.
Addition of
inlinehint
attributes for CallOps in MLIR in order to be able to say to a function call that the inlining is desirable without having the attribute on the FuncOp.