[clang] [CIR] Preserve volatile semantics for atomic operations (PR #220874)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 3 04:09:30 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Steffen Larsen (steffenlarsen)
<details>
<summary>Changes</summary>
This commit fixes the preservation of volatile semantics for atomic RMW operations in CIR CodeGen.
---
Full diff: https://github.com/llvm/llvm-project/pull/220874.diff
3 Files Affected:
- (modified) clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp (+2-2)
- (modified) clang/test/CIR/CodeGen/atomic-scoped.c (+13)
- (modified) clang/test/CIR/CodeGen/atomic.c (+28)
``````````diff
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 233e6aaa15adb..1cea870626de1 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -1230,7 +1230,7 @@ mlir::LogicalResult CIRToLLVMAtomicXchgOpLowering::matchAndRewrite(
llvm::StringRef llvmSyncScope = getLLVMSyncScope(adaptor.getSyncScope());
rewriter.replaceOpWithNewOp<mlir::LLVM::AtomicRMWOp>(
op, mlir::LLVM::AtomicBinOp::xchg, adaptor.getPtr(), adaptor.getVal(),
- llvmOrder, llvmSyncScope);
+ llvmOrder, llvmSyncScope, /*alignment=*/0, op.getIsVolatile());
return mlir::success();
}
@@ -1428,7 +1428,7 @@ mlir::LogicalResult CIRToLLVMAtomicFetchOpLowering::matchAndRewrite(
getLLVMAtomicBinOp(op.getBinop(), isInt, isSignedInt);
auto rmwVal = mlir::LLVM::AtomicRMWOp::create(
rewriter, op.getLoc(), llvmBinOp, adaptor.getPtr(), adaptor.getVal(),
- llvmOrder, llvmSyncScope);
+ llvmOrder, llvmSyncScope, /*alignment=*/0, op.getIsVolatile());
mlir::Value result = rmwVal.getResult();
if (!op.getFetchFirst()) {
diff --git a/clang/test/CIR/CodeGen/atomic-scoped.c b/clang/test/CIR/CodeGen/atomic-scoped.c
index 991f19bcbbd7c..aa7571d83cdc5 100644
--- a/clang/test/CIR/CodeGen/atomic-scoped.c
+++ b/clang/test/CIR/CodeGen/atomic-scoped.c
@@ -119,6 +119,19 @@ void scoped_atomic_exchange_n(int *ptr, int value) {
// OGCG: %{{.+}} = atomicrmw xchg ptr %{{.+}}, i32 %{{.+}} monotonic, align 4
}
+void scoped_atomic_exchange_n_volatile(volatile int *ptr, int value) {
+ // CIR-BEFORE-TL-LABEL: @scoped_atomic_exchange_n_volatile
+ // CIR-LABEL: @scoped_atomic_exchange_n_volatile
+ // LLVM-LABEL: @scoped_atomic_exchange_n_volatile
+ // OGCG-LABEL: @scoped_atomic_exchange_n_volatile
+
+ __scoped_atomic_exchange_n(ptr, value, __ATOMIC_RELAXED, __MEMORY_SCOPE_SYSTEM);
+ // CIR-BEFORE-TL: cir.atomic.xchg relaxed syncscope(system) volatile %{{.+}}, %{{.+}} : (!cir.ptr<!s32i>, !s32i) -> !s32i
+ // CIR: %{{.+}} = cir.atomic.xchg relaxed syncscope(system) volatile %{{.+}}, %{{.+}} : (!cir.ptr<!s32i>, !s32i) -> !s32i
+ // LLVM: %{{.+}} = atomicrmw volatile xchg ptr %{{.+}}, i32 %{{.+}} monotonic, align 4
+ // OGCG: %{{.+}} = atomicrmw volatile xchg ptr %{{.+}}, i32 %{{.+}} monotonic, align 4
+}
+
void scoped_atomic_cmpxchg(int *ptr, int *expected, int *desired) {
// CIR-BEFORE-TL-LABEL: @scoped_atomic_cmpxchg
// CIR-LABEL: @scoped_atomic_cmpxchg
diff --git a/clang/test/CIR/CodeGen/atomic.c b/clang/test/CIR/CodeGen/atomic.c
index 96a84eeac4929..21b99331fb417 100644
--- a/clang/test/CIR/CodeGen/atomic.c
+++ b/clang/test/CIR/CodeGen/atomic.c
@@ -929,6 +929,19 @@ void atomic_exchange_n(int *ptr, int value) {
// OGCG: %{{.+}} = atomicrmw xchg ptr %{{.+}}, i32 %{{.+}} seq_cst, align 4
}
+int atomic_exchange_n_volatile(volatile int *ptr, int value) {
+ // CIR-LABEL: @atomic_exchange_n_volatile
+ // LLVM-LABEL: @atomic_exchange_n_volatile
+ // OGCG-LABEL: @atomic_exchange_n_volatile
+
+ return __atomic_exchange_n(ptr, value, __ATOMIC_SEQ_CST);
+ // CIR: %{{.+}} = cir.atomic.xchg seq_cst syncscope(system) volatile %{{.+}}, %{{.+}} : (!cir.ptr<!s32i>, !s32i) -> !s32i
+
+ // LLVM: %{{.+}} = atomicrmw volatile xchg ptr %{{.+}}, i32 %{{.+}} seq_cst, align 4
+
+ // OGCG: %{{.+}} = atomicrmw volatile xchg ptr %{{.+}}, i32 %{{.+}} seq_cst, align 4
+}
+
void test_and_set(void *p) {
// CIR-LABEL: @test_and_set
// LLVM-LABEL: @test_and_set
@@ -1057,6 +1070,21 @@ int atomic_fetch_add(int *ptr, int value) {
// OGCG-NEXT: store i32 %[[RES]], ptr %{{.+}}, align 4
}
+int atomic_fetch_add_volatile(volatile int *ptr, int value) {
+ // CIR-LABEL: @atomic_fetch_add_volatile
+ // LLVM-LABEL: @atomic_fetch_add_volatile
+ // OGCG-LABEL: @atomic_fetch_add_volatile
+
+ return __atomic_fetch_add(ptr, value, __ATOMIC_SEQ_CST);
+ // CIR: %{{.+}} = cir.atomic.fetch add seq_cst syncscope(system) fetch_first %{{.+}}, %{{.+}} volatile : (!cir.ptr<!s32i>, !s32i) -> !s32i
+
+ // LLVM: %[[RES:.+]] = atomicrmw volatile add ptr %{{.+}}, i32 %{{.+}} seq_cst, align 4
+ // LLVM-NEXT: store i32 %[[RES]], ptr %{{.+}}, align 4
+
+ // OGCG: %[[RES:.+]] = atomicrmw volatile add ptr %{{.+}}, i32 %{{.+}} seq_cst, align 4
+ // OGCG-NEXT: store i32 %[[RES]], ptr %{{.+}}, align 4
+}
+
int *atomic_fetch_add_ptr(int **ptr, __PTRDIFF_TYPE__ value) {
// CIR-LABEL: @atomic_fetch_add_ptr
// LLVM-LABEL: @atomic_fetch_add_ptr
``````````
</details>
https://github.com/llvm/llvm-project/pull/220874
More information about the cfe-commits
mailing list