Author: Erich Keane Date: 2026-08-10T22:02:24Z New Revision: 1cbfd515a779fe200eb92a90edba2e46127d439d
URL: https://github.com/llvm/llvm-project/commit/1cbfd515a779fe200eb92a90edba2e46127d439d DIFF: https://github.com/llvm/llvm-project/commit/1cbfd515a779fe200eb92a90edba2e46127d439d.diff LOG: [CIR] Change the 'inline_kind' enum to have an explicit attribute (#215335) If we use the builtin automatic inline-kind here, we don't get to have it printed reasonably/normally. This patch adds the 'genSpecializedAttr=0' and adds an explicit attribute so we print it as an enum value. Added: Modified: clang/include/clang/CIR/Dialect/IR/CIRAttrs.td clang/include/clang/CIR/Dialect/IR/CIROps.td clang/lib/CIR/Dialect/IR/CIRDialect.cpp clang/test/CIR/CodeGen/callsite-inline-attributes.cpp clang/test/CIR/IR/inline-attrs.cir clang/test/CIR/IR/invalid-call.cir Removed: ################################################################################ diff --git a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td index 71585cd83fb66..253421ab764ff 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td +++ b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td @@ -1688,14 +1688,23 @@ def CIR_TypeInfoAttr : CIR_ValueLikeAttr<"TypeInfo", "typeinfo"> { }]; } //===----------------------------------------------------------------------===// -// InlineAttr +// InlineKindAttr //===----------------------------------------------------------------------===// def CIR_InlineKind : CIR_I32EnumAttr<"InlineKind", "inlineKind", [ I32EnumAttrCase<"NoInline", 1, "no_inline">, I32EnumAttrCase<"AlwaysInline", 2, "always_inline">, I32EnumAttrCase<"InlineHint", 3, "inline_hint"> -]>; +]> { + let genSpecializedAttr = 0; +} + +def CIR_InlineKindAttr: CIR_EnumAttr<CIR_InlineKind, "inline_kind"> { + let summary = "Inline kind attribute"; + let description = [{ Inline Kind attributes. `no_inline` and `always_inline` + spellings correspond to the attributes of the same name, and `inline_hint` + is the `inline` keyword in the language.}]; +} //===----------------------------------------------------------------------===// // CatchAllAttr & UnwindAttr diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 88e869f7c2c4d..599ea50c85267 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -4221,7 +4221,7 @@ def CIR_FuncOp : CIR_Op<"func", [ TypeAttrOf<CIR_FuncType>:$function_type, UnitAttr:$builtin, UnitAttr:$coroutine, - OptionalAttr<CIR_InlineKind>:$inline_kind, + OptionalAttr<CIR_InlineKindAttr>:$inline_kind, UnitAttr:$lambda, UnitAttr:$no_proto, UnitAttr:$dso_local, @@ -4540,7 +4540,7 @@ class CIR_CallOpBase<string mnemonic, list<Trait> extra_traits = []> dag commonArgs = (ins OptionalAttr<FlatSymbolRefAttr>:$callee, Variadic<CIR_AnyType>:$args, UnitAttr:$nothrow, - OptionalAttr<CIR_InlineKind>:$inline_kind, + OptionalAttr<CIR_InlineKindAttr>:$inline_kind, UnitAttr:$musttail, DefaultValuedAttr<CIR_SideEffect, "SideEffect::All">:$side_effect, OptionalAttr<DictArrayAttr>:$arg_attrs, diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index cd94219655e02..6b7724d3ea06a 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -258,6 +258,7 @@ void printInlineKindAttr(OpAsmPrinter &p, cir::InlineKindAttr inlineKindAttr) { p << " " << stringifyInlineKind(inlineKindAttr.getValue()); } } + //===----------------------------------------------------------------------===// // CIR Custom Parsers/Printers //===----------------------------------------------------------------------===// diff --git a/clang/test/CIR/CodeGen/callsite-inline-attributes.cpp b/clang/test/CIR/CodeGen/callsite-inline-attributes.cpp index 06422d36539c6..13a4fcfbb690c 100644 --- a/clang/test/CIR/CodeGen/callsite-inline-attributes.cpp +++ b/clang/test/CIR/CodeGen/callsite-inline-attributes.cpp @@ -14,39 +14,39 @@ void caller() { [[clang::always_inline]] callee(); - // CIR: cir.call @_Z6calleev() {inline_kind = 2 : i32} + // CIR: cir.call @_Z6calleev() {inline_kind = #cir.inline_kind<always_inline>} // LLVM: call void @_Z6calleev() #[[ALWAYSINLINE:.*]] [[clang::noinline]] callee(); - // CIR: cir.call @_Z6calleev() {inline_kind = 1 : i32} + // CIR: cir.call @_Z6calleev() {inline_kind = #cir.inline_kind<no_inline>} // LLVM: call void @_Z6calleev() #[[NOINLINE:.*]] [[clang::always_inline]] fptr(); - // CIR: cir.call %{{.*}}() {inline_kind = 2 : i32} + // CIR: cir.call %{{.*}}() {inline_kind = #cir.inline_kind<always_inline>} // LLVM: call void %{{.*}}() #[[ALWAYSINLINE]] [[clang::noinline]] fptr(); - // CIR: cir.call %{{.*}}() {inline_kind = 1 : i32} + // CIR: cir.call %{{.*}}() {inline_kind = #cir.inline_kind<no_inline>} // LLVM: call void %{{.*}}() #[[NOINLINE]] [[clang::always_inline]] { callee(); - // CIR: cir.call @_Z6calleev() {inline_kind = 2 : i32} + // CIR: cir.call @_Z6calleev() {inline_kind = #cir.inline_kind<always_inline>} // LLVM: call void @_Z6calleev() #[[ALWAYSINLINE]] fptr(); - // CIR: cir.call %{{.*}}() {inline_kind = 2 : i32} + // CIR: cir.call %{{.*}}() {inline_kind = #cir.inline_kind<always_inline>} // LLVM: call void %{{.*}}() #[[ALWAYSINLINE]] } [[clang::noinline]] { callee(); - // CIR: cir.call @_Z6calleev() {inline_kind = 1 : i32} + // CIR: cir.call @_Z6calleev() {inline_kind = #cir.inline_kind<no_inline>} // LLVM: call void @_Z6calleev() #[[NOINLINE]] fptr(); - // CIR: cir.call %{{.*}}() {inline_kind = 1 : i32} + // CIR: cir.call %{{.*}}() {inline_kind = #cir.inline_kind<no_inline>} // LLVM: call void %{{.*}}() #[[NOINLINE]] } } diff --git a/clang/test/CIR/IR/inline-attrs.cir b/clang/test/CIR/IR/inline-attrs.cir index b1437a975eb78..5a09432532927 100644 --- a/clang/test/CIR/IR/inline-attrs.cir +++ b/clang/test/CIR/IR/inline-attrs.cir @@ -36,5 +36,21 @@ module { // CHECK: cir.func inline_hint private @inline_hint_decl(!s32i) -> !s32i cir.func inline_hint private @inline_hint_decl(!s32i) -> !s32i + + cir.func private @callee() +// // CHECK-LABEL: cir.func no_inline dso_local @caller() + cir.func no_inline dso_local @caller() { + cir.call @callee() {inline_kind = #cir.inline_kind<always_inline>} : () -> () + // CHECK: cir.call @callee() {inline_kind = #cir.inline_kind<always_inline>} : () -> () + cir.call @callee() {inline_kind = #cir.inline_kind<no_inline>} : () -> () + // CHECK: cir.call @callee() {inline_kind = #cir.inline_kind<no_inline>} : () -> () + cir.call @callee() {inline_kind = #cir.inline_kind<inline_hint>} : () -> () + // CHECK: cir.call @callee() {inline_kind = #cir.inline_kind<inline_hint>} : () -> () + cir.call @callee() {inline_kind = 2} : () -> () + // CHECK: cir.call @callee() : () -> () + cir.call @callee() {inline_kind = 6} : () -> () + // CHECK: cir.call @callee() : () -> () + cir.return + } } diff --git a/clang/test/CIR/IR/invalid-call.cir b/clang/test/CIR/IR/invalid-call.cir index a9c7e38f73af6..e7ac24ea0bae0 100644 --- a/clang/test/CIR/IR/invalid-call.cir +++ b/clang/test/CIR/IR/invalid-call.cir @@ -80,3 +80,27 @@ cir.func @f13() { cir.call @f12(%0) : (!s32i) -> () cir.return } + +// ----- + +!s32i = !cir.int<s, 32> + +cir.func private @f14() +cir.func @f15() { + %0 = cir.const #cir.int<1> : !s32i + cir.call @f14() : () { inline_kind = 1 } () -> () + cir.call @f14() : () { inline_kind = 6 } () -> () + cir.return +} + +// ----- + +!s32i = !cir.int<s, 32> + +cir.func private @f16() +cir.func @f17() { + // expected-error@+2{{failed to parse CIR_InlineKindAttr parameter 'value' which is to be a `::cir::InlineKind`}} + // expected-error@below{{expected ::cir::InlineKind to be one of: no_inline, always_inline, inline_hint}} + cir.call @f16() { inline_kind = #cir.inline_kind<nonsense> } : () -> () + cir.return +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
