Skip to content

Commit 15cfe4a

Browse files
authored
[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).
1 parent 513a91a commit 15cfe4a

File tree

6 files changed

+86
-21
lines changed

6 files changed

+86
-21
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -771,23 +771,23 @@ def LLVM_CallOp : LLVM_MemAccessOpBase<"call",
771771
}];
772772

773773
dag args = (ins OptionalAttr<TypeAttrOf<LLVM_FunctionType>>:$var_callee_type,
774-
OptionalAttr<FlatSymbolRefAttr>:$callee,
775-
Variadic<LLVM_Type>:$callee_operands,
776-
DefaultValuedAttr<LLVM_FastmathFlagsAttr,
777-
"{}">:$fastmathFlags,
778-
OptionalAttr<DenseI32ArrayAttr>:$branch_weights,
779-
DefaultValuedAttr<CConv, "CConv::C">:$CConv,
780-
DefaultValuedAttr<TailCallKind, "TailCallKind::None">:$TailCallKind,
781-
OptionalAttr<LLVM_MemoryEffectsAttr>:$memory_effects,
782-
OptionalAttr<UnitAttr>:$convergent,
783-
OptionalAttr<UnitAttr>:$no_unwind,
784-
OptionalAttr<UnitAttr>:$will_return,
785-
VariadicOfVariadic<LLVM_Type,
786-
"op_bundle_sizes">:$op_bundle_operands,
787-
DenseI32ArrayAttr:$op_bundle_sizes,
788-
OptionalAttr<ArrayAttr>:$op_bundle_tags,
789-
OptionalAttr<DictArrayAttr>:$arg_attrs,
790-
OptionalAttr<DictArrayAttr>:$res_attrs);
774+
OptionalAttr<FlatSymbolRefAttr>:$callee,
775+
Variadic<LLVM_Type>:$callee_operands,
776+
DefaultValuedAttr<LLVM_FastmathFlagsAttr, "{}">:$fastmathFlags,
777+
OptionalAttr<DenseI32ArrayAttr>:$branch_weights,
778+
DefaultValuedAttr<CConv, "CConv::C">:$CConv,
779+
DefaultValuedAttr<TailCallKind, "TailCallKind::None">:$TailCallKind,
780+
OptionalAttr<LLVM_MemoryEffectsAttr>:$memory_effects,
781+
OptionalAttr<UnitAttr>:$convergent,
782+
OptionalAttr<UnitAttr>:$no_unwind,
783+
OptionalAttr<UnitAttr>:$will_return,
784+
VariadicOfVariadic<LLVM_Type, "op_bundle_sizes">:$op_bundle_operands,
785+
DenseI32ArrayAttr:$op_bundle_sizes,
786+
OptionalAttr<ArrayAttr>:$op_bundle_tags,
787+
OptionalAttr<DictArrayAttr>:$arg_attrs,
788+
OptionalAttr<DictArrayAttr>:$res_attrs,
789+
OptionalAttr<UnitAttr>:$no_inline,
790+
OptionalAttr<UnitAttr>:$always_inline);
791791
// Append the aliasing related attributes defined in LLVM_MemAccessOpBase.
792792
let arguments = !con(args, aliasAttrs);
793793
let results = (outs Optional<LLVM_Type>:$result);

mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state, TypeRange results,
10371037
/*op_bundle_operands=*/{}, /*op_bundle_tags=*/{},
10381038
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
10391039
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
1040-
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
1040+
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
1041+
/*no_inline=*/nullptr, /*always_inline=*/nullptr);
10411042
}
10421043

10431044
void CallOp::build(OpBuilder &builder, OperationState &state,
@@ -1065,7 +1066,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
10651066
/*op_bundle_operands=*/{}, /*op_bundle_tags=*/{},
10661067
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
10671068
/*access_groups=*/nullptr,
1068-
/*alias_scopes=*/nullptr, /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
1069+
/*alias_scopes=*/nullptr, /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
1070+
/*no_inline=*/nullptr, /*always_inline=*/nullptr);
10691071
}
10701072

10711073
void CallOp::build(OpBuilder &builder, OperationState &state,
@@ -1079,7 +1081,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
10791081
/*op_bundle_operands=*/{}, /*op_bundle_tags=*/{},
10801082
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
10811083
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
1082-
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
1084+
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
1085+
/*no_inline=*/nullptr, /*always_inline=*/nullptr);
10831086
}
10841087

10851088
void CallOp::build(OpBuilder &builder, OperationState &state, LLVMFuncOp func,
@@ -1093,7 +1096,8 @@ void CallOp::build(OpBuilder &builder, OperationState &state, LLVMFuncOp func,
10931096
/*op_bundle_operands=*/{}, /*op_bundle_tags=*/{},
10941097
/*access_groups=*/nullptr, /*alias_scopes=*/nullptr,
10951098
/*arg_attrs=*/nullptr, /*res_attrs=*/nullptr,
1096-
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
1099+
/*noalias_scopes=*/nullptr, /*tbaa=*/nullptr,
1100+
/*no_inline=*/nullptr, /*always_inline=*/nullptr);
10971101
}
10981102

10991103
CallInterfaceCallable CallOp::getCallableForCallee() {

mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,10 @@ convertOperationImpl(Operation &opInst, llvm::IRBuilderBase &builder,
319319
call->addFnAttr(llvm::Attribute::NoUnwind);
320320
if (callOp.getWillReturnAttr())
321321
call->addFnAttr(llvm::Attribute::WillReturn);
322+
if (callOp.getNoInlineAttr())
323+
call->addFnAttr(llvm::Attribute::NoInline);
324+
if (callOp.getAlwaysInlineAttr())
325+
call->addFnAttr(llvm::Attribute::AlwaysInline);
322326

323327
if (failed(convertParameterAndResultAttrs(callOp, call, moduleTranslation)))
324328
return failure();

mlir/lib/Target/LLVMIR/ModuleImport.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2331,6 +2331,9 @@ LogicalResult ModuleImport::convertCallAttributes(llvm::CallInst *inst,
23312331
op.setConvergent(callAttrs.getFnAttr(llvm::Attribute::Convergent).isValid());
23322332
op.setNoUnwind(callAttrs.getFnAttr(llvm::Attribute::NoUnwind).isValid());
23332333
op.setWillReturn(callAttrs.getFnAttr(llvm::Attribute::WillReturn).isValid());
2334+
op.setNoInline(callAttrs.getFnAttr(llvm::Attribute::NoInline).isValid());
2335+
op.setAlwaysInline(
2336+
callAttrs.getFnAttr(llvm::Attribute::AlwaysInline).isValid());
23342337

23352338
llvm::MemoryEffects memEffects = inst->getMemoryEffects();
23362339
ModRefInfo othermem = convertModRefInfoFromLLVM(
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s
2+
3+
declare void @f()
4+
5+
; CHECK-LABEL: @test_call_noinline
6+
; CHECK: llvm.call @f() {no_inline} : () -> ()
7+
define void @test_call_noinline() {
8+
call void @f() #0
9+
ret void
10+
}
11+
12+
attributes #0 = { noinline }
13+
14+
// -----
15+
16+
declare void @f()
17+
18+
; CHECK-LABEL: @test_call_alwaysinline
19+
; CHECK: llvm.call @f() {always_inline} : () -> ()
20+
define void @test_call_alwaysinline() {
21+
call void @f() #0
22+
ret void
23+
}
24+
25+
attributes #0 = { alwaysinline }

mlir/test/Target/LLVMIR/llvmir.mlir

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2621,6 +2621,35 @@ llvm.func @willreturn_call() {
26212621
// CHECK: #[[ATTRS]]
26222622
// CHECK-SAME: willreturn
26232623

2624+
// -----
2625+
2626+
llvm.func @f()
2627+
2628+
// CHECK-LABEL: @no_inline_call
2629+
// CHECK: call void @f() #[[ATTRS:[0-9]+]]
2630+
llvm.func @no_inline_call() {
2631+
llvm.call @f() {no_inline} : () -> ()
2632+
llvm.return
2633+
}
2634+
2635+
// CHECK: #[[ATTRS]]
2636+
// CHECK-SAME: noinline
2637+
2638+
// -----
2639+
2640+
llvm.func @f()
2641+
2642+
// CHECK-LABEL: @always_inline_call
2643+
// CHECK: call void @f() #[[ATTRS:[0-9]+]]
2644+
llvm.func @always_inline_call() {
2645+
llvm.call @f() {always_inline} : () -> ()
2646+
llvm.return
2647+
}
2648+
2649+
// CHECK: #[[ATTRS]]
2650+
// CHECK-SAME: alwaysinline
2651+
2652+
26242653
// -----
26252654

26262655
llvm.func @fa()

0 commit comments

Comments
 (0)