https://github.com/Lancern created 
https://github.com/llvm/llvm-project/pull/189688

This patch adds support for the following builtin functions:

- `__scoped_atomic_fetch_uinc`
- `__scoped_atomic_fetch_udec`

>From d0c181d4d5b6d2a8a6bd8c3c3f6ce130ce76abf9 Mon Sep 17 00:00:00 2001
From: Sirui Mu <[email protected]>
Date: Tue, 31 Mar 2026 23:01:13 +0800
Subject: [PATCH] [CIR] Scoped atomic fetch uinc/dec

This patch adds support for the following builtin functions:

- `__scoped_atomic_fetch_uinc`
- `__scoped_atomic_fetch_udec`
---
 clang/lib/CIR/CodeGen/CIRGenAtomic.cpp |  2 ++
 clang/test/CIR/CodeGen/atomic-scoped.c | 38 ++++++++++++++++++++++++++
 2 files changed, 40 insertions(+)

diff --git a/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp 
b/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp
index 6fca3cd0444aa..6119a2770fe09 100644
--- a/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp
@@ -1011,6 +1011,8 @@ RValue CIRGenFunction::emitAtomicExpr(AtomicExpr *e) {
   case AtomicExpr::AO__scoped_atomic_exchange_n:
   case AtomicExpr::AO__atomic_fetch_uinc:
   case AtomicExpr::AO__atomic_fetch_udec:
+  case AtomicExpr::AO__scoped_atomic_fetch_uinc:
+  case AtomicExpr::AO__scoped_atomic_fetch_udec:
     val1 = emitValToTemp(*this, e->getVal1());
     break;
   }
diff --git a/clang/test/CIR/CodeGen/atomic-scoped.c 
b/clang/test/CIR/CodeGen/atomic-scoped.c
index 67445c69896c8..18a945a7ffa5a 100644
--- a/clang/test/CIR/CodeGen/atomic-scoped.c
+++ b/clang/test/CIR/CodeGen/atomic-scoped.c
@@ -500,3 +500,41 @@ void scoped_atomic_nand_fetch(int *ptr, int *value) {
   // LLVM: atomicrmw nand ptr %{{.+}}, i32 %{{.+}} seq_cst, align 4
   // OGCG: atomicrmw nand ptr %{{.+}}, i32 %{{.+}} seq_cst, align 4
 }
+
+void scoped_atomic_fetch_uinc(int *ptr, int value) {
+  // CIR-LABEL: @scoped_atomic_fetch_uinc
+  // LLVM-LABEL: @scoped_atomic_fetch_uinc
+  // OGCG-LABEL: @scoped_atomic_fetch_uinc
+
+  __scoped_atomic_fetch_uinc(ptr, value, __ATOMIC_SEQ_CST, 
__MEMORY_SCOPE_SINGLE);
+  // CIR-BEFORE-TL: %{{.+}} = cir.atomic.fetch uinc_wrap seq_cst 
syncscope(single_thread) fetch_first %{{.+}}, %{{.+}} : (!cir.ptr<!s32i>, 
!s32i) -> !s32i
+  // CIR: %{{.+}} = cir.atomic.fetch uinc_wrap seq_cst syncscope(system) 
fetch_first %{{.+}}, %{{.+}} : (!cir.ptr<!s32i>, !s32i) -> !s32i
+
+  // LLVM: %[[RES:.+]] = atomicrmw uinc_wrap ptr %{{.+}}, i32 %{{.+}} seq_cst, 
align 4
+  // OGCG: %[[RES:.+]] = atomicrmw uinc_wrap ptr %{{.+}}, i32 %{{.+}} seq_cst, 
align 4
+
+  __scoped_atomic_fetch_uinc(ptr, value, __ATOMIC_SEQ_CST, 
__MEMORY_SCOPE_SYSTEM);
+  // CIR: %{{.+}} = cir.atomic.fetch uinc_wrap seq_cst syncscope(system) 
fetch_first %{{.+}}, %{{.+}} : (!cir.ptr<!s32i>, !s32i) -> !s32i
+
+  // LLVM: %[[RES:.+]] = atomicrmw uinc_wrap ptr %{{.+}}, i32 %{{.+}} seq_cst, 
align 4
+  // OGCG: %[[RES:.+]] = atomicrmw uinc_wrap ptr %{{.+}}, i32 %{{.+}} seq_cst, 
align 4
+}
+
+void scoped_atomic_fetch_udec(int *ptr, int value) {
+  // CIR-LABEL: @scoped_atomic_fetch_udec
+  // LLVM-LABEL: @scoped_atomic_fetch_udec
+  // OGCG-LABEL: @scoped_atomic_fetch_udec
+
+  __scoped_atomic_fetch_udec(ptr, value, __ATOMIC_SEQ_CST, 
__MEMORY_SCOPE_SINGLE);
+  // CIR-BEFORE-TL: %{{.+}} = cir.atomic.fetch udec_wrap seq_cst 
syncscope(single_thread) fetch_first %{{.+}}, %{{.+}} : (!cir.ptr<!s32i>, 
!s32i) -> !s32i
+  // CIR: %{{.+}} = cir.atomic.fetch udec_wrap seq_cst syncscope(system) 
fetch_first %{{.+}}, %{{.+}} : (!cir.ptr<!s32i>, !s32i) -> !s32i
+
+  // LLVM: %[[RES:.+]] = atomicrmw udec_wrap ptr %{{.+}}, i32 %{{.+}} seq_cst, 
align 4
+  // OGCG: %[[RES:.+]] = atomicrmw udec_wrap ptr %{{.+}}, i32 %{{.+}} seq_cst, 
align 4
+
+  __scoped_atomic_fetch_udec(ptr, value, __ATOMIC_SEQ_CST, 
__MEMORY_SCOPE_SYSTEM);
+  // CIR: %{{.+}} = cir.atomic.fetch udec_wrap seq_cst syncscope(system) 
fetch_first %{{.+}}, %{{.+}} : (!cir.ptr<!s32i>, !s32i) -> !s32i
+
+  // LLVM: %[[RES:.+]] = atomicrmw udec_wrap ptr %{{.+}}, i32 %{{.+}} seq_cst, 
align 4
+  // OGCG: %[[RES:.+]] = atomicrmw udec_wrap ptr %{{.+}}, i32 %{{.+}} seq_cst, 
align 4
+}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to