Skip to content

Commit 4088ded

Browse files
authored
[CIR] Make optnone explicit function attribute (#2036)
1 parent 2aced5d commit 4088ded

File tree

16 files changed

+52
-56
lines changed

16 files changed

+52
-56
lines changed

clang/include/clang/CIR/Dialect/IR/CIRAttrs.td

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,10 +1205,6 @@ def CIR_InlineKind : CIR_I32EnumAttr<"InlineKind", "inlineKind", [
12051205
// Unit Function Attributes
12061206
//===----------------------------------------------------------------------===//
12071207

1208-
def CIR_OptNoneAttr : CIR_UnitAttr<"OptNone", "optnone"> {
1209-
let storageType = [{ OptNoneAttr }];
1210-
}
1211-
12121208
def CIR_NoThrowAttr : CIR_UnitAttr<"NoThrow", "nothrow"> {
12131209
let storageType = [{ NoThrowAttr }];
12141210
}

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4104,6 +4104,7 @@ def FuncOp : CIR_Op<"func", [
41044104
OptionalAttr<CIR_InlineKind>:$inline_kind,
41054105
UnitAttr:$lambda,
41064106
UnitAttr:$no_proto,
4107+
UnitAttr:$opt_none,
41074108
UnitAttr:$dso_local,
41084109
DefaultValuedAttr<
41094110
CIR_GlobalLinkageKind, "GlobalLinkageKind::ExternalLinkage"

clang/lib/CIR/CodeGen/CIRGenModule.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2932,8 +2932,7 @@ void CIRGenModule::setCIRFunctionAttributesForDefinition(const Decl *decl,
29322932
} else if ((shouldAddOptNone || decl->hasAttr<OptimizeNoneAttr>()) &&
29332933
!isAlwaysInline) {
29342934
// Add optnone, but do so only if the function isn't always_inline.
2935-
auto optNoneAttr = cir::OptNoneAttr::get(&getMLIRContext());
2936-
attrs.set(optNoneAttr.getMnemonic(), optNoneAttr);
2935+
f.setOptNone(true);
29372936

29382937
// OptimizeNone implies noinline; we should not be inlining such functions.
29392938
f.setInlineKind(cir::InlineKind::NoInline);

clang/lib/CIR/Dialect/IR/CIRDialect.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2686,6 +2686,7 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
26862686
auto lambdaNameAttr = getLambdaAttrName(state.name);
26872687
auto visNameAttr = getSymVisibilityAttrName(state.name);
26882688
auto noProtoNameAttr = getNoProtoAttrName(state.name);
2689+
auto optNoneNameAttr = getOptNoneAttrName(state.name);
26892690
auto visibilityNameAttr = getGlobalVisibilityAttrName(state.name);
26902691
auto dsoLocalNameAttr = getDsoLocalAttrName(state.name);
26912692
auto annotationsNameAttr = getAnnotationsAttrName(state.name);
@@ -2707,6 +2708,8 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
27072708
state.addAttribute(lambdaNameAttr, parser.getBuilder().getUnitAttr());
27082709
if (parser.parseOptionalKeyword(noProtoNameAttr).succeeded())
27092710
state.addAttribute(noProtoNameAttr, parser.getBuilder().getUnitAttr());
2711+
if (parser.parseOptionalKeyword("optnone").succeeded())
2712+
state.addAttribute(optNoneNameAttr, parser.getBuilder().getUnitAttr());
27102713

27112714
// TODO: Missing comdat
27122715
assert(!cir::MissingFeatures::setComdat());
@@ -2945,6 +2948,9 @@ void cir::FuncOp::print(OpAsmPrinter &p) {
29452948
if (getNoProto())
29462949
p << " no_proto";
29472950

2951+
if (getOptNone())
2952+
p << " optnone";
2953+
29482954
if (getComdat())
29492955
p << " comdat";
29502956

@@ -3001,6 +3007,7 @@ void cir::FuncOp::print(OpAsmPrinter &p) {
30013007
getLinkageAttrName(),
30023008
getCallingConvAttrName(),
30033009
getNoProtoAttrName(),
3010+
getOptNoneAttrName(),
30043011
getSymVisibilityAttrName(),
30053012
getArgAttrsAttrName(),
30063013
getResAttrsAttrName(),

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2369,6 +2369,7 @@ void CIRToLLVMFuncOpLowering::lowerFuncAttributes(
23692369
name == func.getFunctionTypeAttrName() ||
23702370
name == getLinkageAttrNameString() ||
23712371
name == func.getCallingConvAttrName() ||
2372+
name == func.getOptNoneAttrName() ||
23722373
name == func.getDsoLocalAttrName() ||
23732374
name == func.getInlineKindAttrName() ||
23742375
(filterArgAndResAttrs && (name == func.getArgAttrsAttrName() ||
@@ -2494,20 +2495,13 @@ mlir::LogicalResult CIRToLLVMFuncOpLowering::matchAndRewrite(
24942495
mlir::SymbolRefAttr(), attributes);
24952496

24962497
if (std::optional<cir::InlineKind> inlineKind = op.getInlineKind()) {
2497-
switch (*inlineKind) {
2498-
case cir::InlineKind::NoInline:
2499-
fn.setNoInline(true);
2500-
break;
2501-
case cir::InlineKind::AlwaysInline:
2502-
fn.setAlwaysInline(true);
2503-
break;
2504-
case cir::InlineKind::InlineHint:
2505-
fn.setInlineHint(true);
2506-
break;
2507-
default:
2508-
llvm_unreachable("Unknown inline kind");
2509-
}
2498+
fn.setNoInline(*inlineKind == cir::InlineKind::NoInline);
2499+
fn.setInlineHint(*inlineKind == cir::InlineKind::InlineHint);
2500+
fn.setAlwaysInline(*inlineKind == cir::InlineKind::AlwaysInline);
25102501
}
2502+
2503+
fn.setOptimizeNone(op.getOptNone());
2504+
25112505
// Lower CIR attributes for arguments.
25122506
for (unsigned index = 0; index < fnType.getNumInputs(); index++) {
25132507
mlir::DictionaryAttr cirAttrs = op.getArgAttrDict(index);
@@ -2540,6 +2534,9 @@ mlir::LogicalResult CIRToLLVMFuncOpLowering::matchAndRewrite(
25402534
getContext(), lowerCIRVisibilityToLLVMVisibility(
25412535
op.getGlobalVisibilityAttr().getValue())));
25422536

2537+
// Handle optnone attribute
2538+
fn.setOptimizeNone(op.getOptNone());
2539+
25432540
rewriter.inlineRegionBefore(op.getBody(), fn.getBody(), fn.end());
25442541
if (failed(rewriter.convertRegionTypes(&fn.getBody(), *typeConverter,
25452542
&signatureConversion)))

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVMIR.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,7 @@ class CIRDialectLLVMIRTranslationInterface
100100
if (auto extraAttr = mlir::dyn_cast<cir::ExtraFuncAttributesAttr>(
101101
attribute.getValue())) {
102102
for (auto attr : extraAttr.getElements()) {
103-
if (mlir::dyn_cast<cir::OptNoneAttr>(attr.getValue())) {
104-
llvmFunc->addFnAttr(llvm::Attribute::OptimizeNone);
105-
} else if (mlir::dyn_cast<cir::NoThrowAttr>(attr.getValue())) {
103+
if (mlir::dyn_cast<cir::NoThrowAttr>(attr.getValue())) {
106104
llvmFunc->addFnAttr(llvm::Attribute::NoUnwind);
107105
} else if (mlir::dyn_cast<cir::ConvergentAttr>(attr.getValue())) {
108106
llvmFunc->addFnAttr(llvm::Attribute::Convergent);

clang/test/CIR/CodeGen/call-extra-attrs.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,13 @@ int s2(int a, int b) {
1818
return s1(a, b);
1919
}
2020

21-
// CIR: #fn_attr = #cir<extra({nothrow = #cir.nothrow, optnone = #cir.optnone})>
22-
// CIR: #fn_attr1 = #cir<extra({nothrow = #cir.nothrow})>
21+
// CIR: #fn_attr = #cir<extra({nothrow = #cir.nothrow})>
2322

24-
// CIR: cir.func{{.*}} no_inline {{.*}} @_Z2s0ii(%{{.*}}, %{{.*}}) -> {{.*}} extra(#fn_attr)
25-
// CIR: cir.func{{.*}} no_inline {{.*}} @_Z2s1ii(%{{.*}}, %{{.*}}) -> {{.*}} extra(#fn_attr)
26-
// CIR: cir.call @_Z2s0ii(%{{.*}}, %{{.*}}) : ({{.*}}, {{.*}}) -> {{.*}} extra(#fn_attr1)
27-
// CIR: cir.func {{.*}} @_Z2s2ii(%{{.*}}, %{{.*}}) -> {{.*}} extra(#fn_attr)
28-
// CHECK-NOT: cir.call @_Z2s1ii(%{{.*}}, %{{.*}}) : ({{.*}}, {{.*}}) -> {{.*}} extra(#fn_attr{{.*}})
23+
// CIR: cir.func{{.*}} no_inline optnone {{.*}} @_Z2s0ii(%{{.*}}, %{{.*}}) -> {{.*}} extra(#fn_attr)
24+
// CIR: cir.func{{.*}} no_inline optnone {{.*}} @_Z2s1ii(%{{.*}}, %{{.*}}) -> {{.*}} extra(#fn_attr)
25+
// CIR: cir.call @_Z2s0ii(%{{.*}}, %{{.*}}) : ({{.*}}, {{.*}}) -> {{.*}} extra(#fn_attr)
26+
// CIR: cir.func {{.*}} optnone {{.*}} @_Z2s2ii(%{{.*}}, %{{.*}}) -> {{.*}}
27+
// CHECK-NOT: cir.call @_Z2s1ii(%{{.*}}, %{{.*}}) : ({{.*}}, {{.*}}) -> {{.*}} extra(#fn_attr)
2928

3029
// LLVM: define dso_local i32 @_Z2s0ii(i32 %0, i32 %1) #[[#ATTR1:]]
3130
// LLVM: define dso_local i32 @_Z2s1ii(i32 %0, i32 %1) #[[#ATTR1:]]

clang/test/CIR/CodeGen/dynamic-cast.mlir

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ module @"/Users/henrichlauko/src/clangir/clang/test/CIR/CodeGen/dynamic-cast.cpp
2121
cir.global constant external @_ZTI7Derived = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv120__si_class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS7Derived> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI4Base> : !cir.ptr<!u8i>}> : !rec_anon_struct {alignment = 8 : i64} loc(#loc28)
2222
cir.func private @__dynamic_cast(!cir.ptr<!void>, !cir.ptr<!u8i>, !cir.ptr<!u8i>, !s64i) -> !cir.ptr<!void> loc(#loc)
2323
cir.func private @__cxa_bad_cast() loc(#loc)
24-
cir.func no_inline dso_local @_Z8ptr_castP4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc5, #loc6])) -> !cir.ptr<!rec_Derived> {nothrow = #cir.nothrow, optnone = #cir.optnone} {
24+
cir.func no_inline dso_local optnone @_Z8ptr_castP4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc5, #loc6])) -> !cir.ptr<!rec_Derived> {nothrow = #cir.nothrow} {
2525
%0 = cir.alloca !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>>, ["b", init] {alignment = 8 : i64} loc(#loc30)
2626
%1 = cir.alloca !cir.ptr<!rec_Derived>, !cir.ptr<!cir.ptr<!rec_Derived>>, ["__retval"] {alignment = 8 : i64} loc(#loc4)
2727
cir.store %arg0, %0 : !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>> loc(#loc7)
@@ -43,7 +43,7 @@ module @"/Users/henrichlauko/src/clangir/clang/test/CIR/CodeGen/dynamic-cast.cpp
4343
%5 = cir.load %1 : !cir.ptr<!cir.ptr<!rec_Derived>>, !cir.ptr<!rec_Derived> loc(#loc31)
4444
cir.return %5 : !cir.ptr<!rec_Derived> loc(#loc31)
4545
} loc(#loc29)
46-
cir.func no_inline dso_local @_Z8ref_castR4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc12, #loc13])) -> !cir.ptr<!rec_Derived> {nothrow = #cir.nothrow, optnone = #cir.optnone} {
46+
cir.func no_inline dso_local optnone @_Z8ref_castR4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc12, #loc13])) -> !cir.ptr<!rec_Derived> {nothrow = #cir.nothrow} {
4747
%0 = cir.alloca !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>>, ["b", init, const] {alignment = 8 : i64} loc(#loc33)
4848
%1 = cir.alloca !cir.ptr<!rec_Derived>, !cir.ptr<!cir.ptr<!rec_Derived>>, ["__retval"] {alignment = 8 : i64} loc(#loc11)
4949
cir.store %arg0, %0 : !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>> loc(#loc14)
@@ -64,7 +64,7 @@ module @"/Users/henrichlauko/src/clangir/clang/test/CIR/CodeGen/dynamic-cast.cpp
6464
%11 = cir.load %1 : !cir.ptr<!cir.ptr<!rec_Derived>>, !cir.ptr<!rec_Derived> loc(#loc35)
6565
cir.return %11 : !cir.ptr<!rec_Derived> loc(#loc35)
6666
} loc(#loc32)
67-
cir.func no_inline dso_local @_Z20ptr_cast_to_completeP4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc21, #loc22])) -> !cir.ptr<!void> {nothrow = #cir.nothrow, optnone = #cir.optnone} {
67+
cir.func no_inline dso_local optnone @_Z20ptr_cast_to_completeP4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc21, #loc22])) -> !cir.ptr<!void> {nothrow = #cir.nothrow} {
6868
%0 = cir.alloca !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>>, ["ptr", init] {alignment = 8 : i64} loc(#loc37)
6969
%1 = cir.alloca !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>, ["__retval"] {alignment = 8 : i64} loc(#loc20)
7070
cir.store %arg0, %0 : !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>> loc(#loc23)

clang/test/CIR/CodeGen/lambda.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ void fn() {
1515
// CHECK-DAG: !rec_anon2E8 = !cir.record<class "anon.8" {!cir.ptr<!rec_A>}>
1616
// CHECK-DAG: module
1717

18-
// CHECK: cir.func no_inline lambda internal private dso_local @_ZZ2fnvENK3$_0clEv{{.*}})
18+
// CHECK: cir.func no_inline lambda optnone internal private dso_local @_ZZ2fnvENK3$_0clEv{{.*}})
1919

2020
// CHECK: cir.func {{.*}} @_Z2fnv()
2121
// CHECK-NEXT: %0 = cir.alloca !rec_anon2E0, !cir.ptr<!rec_anon2E0>, ["a"]
@@ -41,7 +41,7 @@ void l0() {
4141
a();
4242
}
4343

44-
// CHECK: cir.func no_inline lambda internal private dso_local @_ZZ2l0vENK3$_0clEv({{.*}})
44+
// CHECK: cir.func no_inline lambda optnone internal private dso_local @_ZZ2l0vENK3$_0clEv({{.*}})
4545

4646
// CHECK: %0 = cir.alloca !cir.ptr<!rec_anon2E2>, !cir.ptr<!cir.ptr<!rec_anon2E2>>, ["this", init] {alignment = 8 : i64}
4747
// CHECK: cir.store{{.*}} %arg0, %0 : !cir.ptr<!rec_anon2E2>, !cir.ptr<!cir.ptr<!rec_anon2E2>>
@@ -197,13 +197,13 @@ int g3() {
197197
}
198198

199199
// lambda operator()
200-
// CHECK: cir.func no_inline lambda internal private dso_local @_ZZ2g3vENK3$_0clERKi{{.*}}!s32i extra
200+
// CHECK: cir.func no_inline lambda optnone internal private dso_local @_ZZ2g3vENK3$_0clERKi{{.*}}!s32i extra
201201

202202
// lambda __invoke()
203-
// CHECK: cir.func no_inline internal private dso_local @_ZZ2g3vEN3$_08__invokeERKi
203+
// CHECK: cir.func no_inline optnone internal private dso_local @_ZZ2g3vEN3$_08__invokeERKi
204204

205205
// lambda operator int (*)(int const&)()
206-
// CHECK: cir.func no_inline internal private dso_local @_ZZ2g3vENK3$_0cvPFiRKiEEv
206+
// CHECK: cir.func no_inline optnone internal private dso_local @_ZZ2g3vENK3$_0cvPFiRKiEEv
207207

208208
// CHECK-LABEL: @_Z2g3v()
209209
// CHECK: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}

clang/test/CIR/CodeGen/linkage.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ int foo(void) {
1414
return bar(5);
1515
}
1616

17-
// CIR-O0: cir.func no_inline internal private {{.*}} @bar
17+
// CIR-O0: cir.func no_inline optnone internal private {{.*}} @bar
1818
// CIR-O1: cir.func internal private {{.*}} @bar
1919
// CIR: cir.func {{.*}} @foo
2020

0 commit comments

Comments
 (0)