Skip to content

Commit a2bc0ca

Browse files
authored
[CIR] More atomic load and store (#155168)
This patch adds support for `__atomic_load_n` and `__atomic_store_n` that were missed by #153814.
1 parent 4e0afa6 commit a2bc0ca

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

clang/lib/CIR/CodeGen/CIRGenAtomic.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ static void emitAtomicOp(CIRGenFunction &cgf, AtomicExpr *expr, Address dest,
265265
llvm_unreachable("already handled!");
266266

267267
case AtomicExpr::AO__c11_atomic_load:
268+
case AtomicExpr::AO__atomic_load_n:
268269
case AtomicExpr::AO__atomic_load: {
269270
cir::LoadOp load =
270271
builder.createLoad(loc, ptr, /*isVolatile=*/expr->isVolatile());
@@ -278,6 +279,7 @@ static void emitAtomicOp(CIRGenFunction &cgf, AtomicExpr *expr, Address dest,
278279
}
279280

280281
case AtomicExpr::AO__c11_atomic_store:
282+
case AtomicExpr::AO__atomic_store_n:
281283
case AtomicExpr::AO__atomic_store: {
282284
cir::LoadOp loadVal1 = builder.createLoad(loc, val1);
283285

@@ -305,13 +307,11 @@ static void emitAtomicOp(CIRGenFunction &cgf, AtomicExpr *expr, Address dest,
305307

306308
case AtomicExpr::AO__opencl_atomic_load:
307309
case AtomicExpr::AO__hip_atomic_load:
308-
case AtomicExpr::AO__atomic_load_n:
309310
case AtomicExpr::AO__scoped_atomic_load_n:
310311
case AtomicExpr::AO__scoped_atomic_load:
311312

312313
case AtomicExpr::AO__opencl_atomic_store:
313314
case AtomicExpr::AO__hip_atomic_store:
314-
case AtomicExpr::AO__atomic_store_n:
315315
case AtomicExpr::AO__scoped_atomic_store:
316316
case AtomicExpr::AO__scoped_atomic_store_n:
317317

@@ -450,6 +450,7 @@ RValue CIRGenFunction::emitAtomicExpr(AtomicExpr *e) {
450450
case AtomicExpr::AO__c11_atomic_init:
451451
llvm_unreachable("already handled above with emitAtomicInit");
452452

453+
case AtomicExpr::AO__atomic_load_n:
453454
case AtomicExpr::AO__c11_atomic_load:
454455
break;
455456

@@ -461,6 +462,7 @@ RValue CIRGenFunction::emitAtomicExpr(AtomicExpr *e) {
461462
val1 = emitPointerWithAlignment(e->getVal1());
462463
break;
463464

465+
case AtomicExpr::AO__atomic_store_n:
464466
case AtomicExpr::AO__c11_atomic_store:
465467
val1 = emitValToTemp(*this, e->getVal1());
466468
break;
@@ -507,9 +509,20 @@ RValue CIRGenFunction::emitAtomicExpr(AtomicExpr *e) {
507509
}
508510

509511
bool isStore = e->getOp() == AtomicExpr::AO__c11_atomic_store ||
510-
e->getOp() == AtomicExpr::AO__atomic_store;
512+
e->getOp() == AtomicExpr::AO__opencl_atomic_store ||
513+
e->getOp() == AtomicExpr::AO__hip_atomic_store ||
514+
e->getOp() == AtomicExpr::AO__atomic_store ||
515+
e->getOp() == AtomicExpr::AO__atomic_store_n ||
516+
e->getOp() == AtomicExpr::AO__scoped_atomic_store ||
517+
e->getOp() == AtomicExpr::AO__scoped_atomic_store_n ||
518+
e->getOp() == AtomicExpr::AO__atomic_clear;
511519
bool isLoad = e->getOp() == AtomicExpr::AO__c11_atomic_load ||
512-
e->getOp() == AtomicExpr::AO__atomic_load;
520+
e->getOp() == AtomicExpr::AO__opencl_atomic_load ||
521+
e->getOp() == AtomicExpr::AO__hip_atomic_load ||
522+
e->getOp() == AtomicExpr::AO__atomic_load ||
523+
e->getOp() == AtomicExpr::AO__atomic_load_n ||
524+
e->getOp() == AtomicExpr::AO__scoped_atomic_load ||
525+
e->getOp() == AtomicExpr::AO__scoped_atomic_load_n;
513526

514527
if (!order) {
515528
// We have evaluated the memory order as an integer constant in orderConst.

clang/test/CIR/CodeGen/atomic.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,35 @@ void load(int *ptr) {
7575
// OGCG: %{{.+}} = load atomic i32, ptr %{{.+}} seq_cst, align 4
7676
// OGCG: }
7777

78+
void load_n(int *ptr) {
79+
int a;
80+
a = __atomic_load_n(ptr, __ATOMIC_RELAXED);
81+
a = __atomic_load_n(ptr, __ATOMIC_CONSUME);
82+
a = __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
83+
a = __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
84+
}
85+
86+
// CIR-LABEL: @load_n
87+
// CIR: %{{.+}} = cir.load align(4) atomic(relaxed) %{{.+}} : !cir.ptr<!s32i>, !s32i
88+
// CIR: %{{.+}} = cir.load align(4) atomic(consume) %{{.+}} : !cir.ptr<!s32i>, !s32i
89+
// CIR: %{{.+}} = cir.load align(4) atomic(acquire) %{{.+}} : !cir.ptr<!s32i>, !s32i
90+
// CIR: %{{.+}} = cir.load align(4) atomic(seq_cst) %{{.+}} : !cir.ptr<!s32i>, !s32i
91+
// CIR: }
92+
93+
// LLVM-LABEL: @load_n
94+
// LLVM: %{{.+}} = load atomic i32, ptr %{{.+}} monotonic, align 4
95+
// LLVM: %{{.+}} = load atomic i32, ptr %{{.+}} acquire, align 4
96+
// LLVM: %{{.+}} = load atomic i32, ptr %{{.+}} acquire, align 4
97+
// LLVM: %{{.+}} = load atomic i32, ptr %{{.+}} seq_cst, align 4
98+
// LLVM: }
99+
100+
// OGCG-LABEL: @load_n
101+
// OGCG: %{{.+}} = load atomic i32, ptr %{{.+}} monotonic, align 4
102+
// OGCG: %{{.+}} = load atomic i32, ptr %{{.+}} acquire, align 4
103+
// OGCG: %{{.+}} = load atomic i32, ptr %{{.+}} acquire, align 4
104+
// OGCG: %{{.+}} = load atomic i32, ptr %{{.+}} seq_cst, align 4
105+
// OGCG: }
106+
78107
void c11_load(_Atomic(int) *ptr) {
79108
__c11_atomic_load(ptr, __ATOMIC_RELAXED);
80109
__c11_atomic_load(ptr, __ATOMIC_CONSUME);
@@ -127,6 +156,30 @@ void store(int *ptr, int x) {
127156
// OGCG: store atomic i32 %{{.+}}, ptr %{{.+}} seq_cst, align 4
128157
// OGCG: }
129158

159+
void store_n(int *ptr, int x) {
160+
__atomic_store_n(ptr, x, __ATOMIC_RELAXED);
161+
__atomic_store_n(ptr, x, __ATOMIC_RELEASE);
162+
__atomic_store_n(ptr, x, __ATOMIC_SEQ_CST);
163+
}
164+
165+
// CIR-LABEL: @store_n
166+
// CIR: cir.store align(4) atomic(relaxed) %{{.+}}, %{{.+}} : !s32i, !cir.ptr<!s32i>
167+
// CIR: cir.store align(4) atomic(release) %{{.+}}, %{{.+}} : !s32i, !cir.ptr<!s32i>
168+
// CIR: cir.store align(4) atomic(seq_cst) %{{.+}}, %{{.+}} : !s32i, !cir.ptr<!s32i>
169+
// CIR: }
170+
171+
// LLVM-LABEL: @store_n
172+
// LLVM: store atomic i32 %{{.+}}, ptr %{{.+}} monotonic, align 4
173+
// LLVM: store atomic i32 %{{.+}}, ptr %{{.+}} release, align 4
174+
// LLVM: store atomic i32 %{{.+}}, ptr %{{.+}} seq_cst, align 4
175+
// LLVM: }
176+
177+
// OGCG-LABEL: @store_n
178+
// OGCG: store atomic i32 %{{.+}}, ptr %{{.+}} monotonic, align 4
179+
// OGCG: store atomic i32 %{{.+}}, ptr %{{.+}} release, align 4
180+
// OGCG: store atomic i32 %{{.+}}, ptr %{{.+}} seq_cst, align 4
181+
// OGCG: }
182+
130183
void c11_store(_Atomic(int) *ptr, int x) {
131184
__c11_atomic_store(ptr, x, __ATOMIC_RELAXED);
132185
__c11_atomic_store(ptr, x, __ATOMIC_RELEASE);

0 commit comments

Comments
 (0)