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
