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

Reply via email to