[clang] 1cbfd51 - [CIR] Change the 'inline_kind' enum to have an explicit attribute (#215335)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 10 15:02:32 PDT 2026
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 at +2{{failed to parse CIR_InlineKindAttr parameter 'value' which is to be a `::cir::InlineKind`}}
+ // expected-error at 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
+}
More information about the cfe-commits
mailing list