Skip to content

Commit c4409e1

Browse files
authored
[CIR][CIRGen] Add alignment attribute to AtomicCmpXchg (#1327)
There is an `alignment` attribute in MLIR's LLVMIR Dialect https://github.com/llvm/clangir/blob/a7383c9d05165d16edba857ddc86e5d29d94d2cc/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td#L1880 When Clang builds IR, it adds an alignment automatically https://github.com/llvm/clangir/blob/a7383c9d05165d16edba857ddc86e5d29d94d2cc/clang/lib/CodeGen/CGBuilder.h#L168-L177 This PR does the same thing for ClangIR. Closes: #1275
1 parent 37fab7c commit c4409e1

File tree

7 files changed

+60
-52
lines changed

7 files changed

+60
-52
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5390,6 +5390,7 @@ def AtomicCmpXchg : CIR_Op<"atomic.cmp_xchg",
53905390
CIR_AnyType:$desired,
53915391
Arg<MemOrder, "success memory order">:$succ_order,
53925392
Arg<MemOrder, "failure memory order">:$fail_order,
5393+
OptionalAttr<I64Attr>:$alignment,
53935394
UnitAttr:$weak,
53945395
UnitAttr:$is_volatile);
53955396

@@ -5401,6 +5402,7 @@ def AtomicCmpXchg : CIR_Op<"atomic.cmp_xchg",
54015402
`success` `=` $succ_order `,`
54025403
`failure` `=` $fail_order
54035404
`)`
5405+
(`align` `(` $alignment^ `)`)?
54045406
(`weak` $weak^)?
54055407
(`volatile` $is_volatile^)?
54065408
`:` `(` type($old) `,` type($cmp) `)` attr-dict

clang/lib/CIR/CodeGen/CIRGenAtomic.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,9 @@ static void emitAtomicCmpXchg(CIRGenFunction &CGF, AtomicExpr *E, bool IsWeak,
423423
auto boolTy = builder.getBoolTy();
424424
auto cmpxchg = builder.create<cir::AtomicCmpXchg>(
425425
loc, Expected.getType(), boolTy, Ptr.getPointer(), Expected, Desired,
426-
SuccessOrder, FailureOrder);
426+
cir::MemOrderAttr::get(&CGF.getMLIRContext(), SuccessOrder),
427+
cir::MemOrderAttr::get(&CGF.getMLIRContext(), FailureOrder),
428+
builder.getI64IntegerAttr(Ptr.getAlignment().getAsAlign().value()));
427429
cmpxchg.setIsVolatile(E->isVolatile());
428430
cmpxchg.setWeak(IsWeak);
429431

clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,8 +324,11 @@ static mlir::Value MakeAtomicCmpXchgValue(CIRGenFunction &cgf,
324324
auto op = builder.create<cir::AtomicCmpXchg>(
325325
cgf.getLoc(expr->getSourceRange()), cmpVal.getType(), builder.getBoolTy(),
326326
destAddr.getPointer(), cmpVal, newVal,
327-
cir::MemOrder::SequentiallyConsistent,
328-
cir::MemOrder::SequentiallyConsistent);
327+
MemOrderAttr::get(&cgf.getMLIRContext(),
328+
cir::MemOrder::SequentiallyConsistent),
329+
MemOrderAttr::get(&cgf.getMLIRContext(),
330+
cir::MemOrder::SequentiallyConsistent),
331+
builder.getI64IntegerAttr(destAddr.getAlignment().getAsAlign().value()));
329332

330333
return returnBool ? op.getResult(1) : op.getResult(0);
331334
}

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3202,6 +3202,7 @@ mlir::LogicalResult CIRToLLVMAtomicCmpXchgLowering::matchAndRewrite(
32023202
op.getLoc(), adaptor.getPtr(), expected, desired,
32033203
getLLVMAtomicOrder(adaptor.getSuccOrder()),
32043204
getLLVMAtomicOrder(adaptor.getFailOrder()));
3205+
cmpxchg.setAlignment(adaptor.getAlignment());
32053206
cmpxchg.setWeak(adaptor.getWeak());
32063207
cmpxchg.setVolatile_(adaptor.getIsVolatile());
32073208

clang/test/CIR/CodeGen/atomic-runtime.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
120120
// CHECK: cir.case(default, []) {
121121
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
122122
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
123-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = relaxed) : (!s32i, !cir.bool)
123+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = relaxed) align(4) : (!s32i, !cir.bool)
124124
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
125125
// CHECK: cir.if %[[succeeded]] {
126126
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -131,7 +131,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
131131
// CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) {
132132
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
133133
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
134-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = acquire) : (!s32i, !cir.bool)
134+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = acquire) align(4) : (!s32i, !cir.bool)
135135
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
136136
// CHECK: cir.if %[[succeeded]] {
137137
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -142,7 +142,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
142142
// CHECK: cir.case(equal, [#cir.int<5> : !s32i]) {
143143
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
144144
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
145-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = seq_cst) : (!s32i, !cir.bool)
145+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = seq_cst) align(4) : (!s32i, !cir.bool)
146146
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
147147
// CHECK: cir.if %[[succeeded]] {
148148
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -158,7 +158,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
158158
// CHECK: cir.case(default, []) {
159159
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
160160
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
161-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = relaxed) : (!s32i, !cir.bool)
161+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = relaxed) align(4) : (!s32i, !cir.bool)
162162
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
163163
// CHECK: cir.if %[[succeeded]] {
164164
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -169,7 +169,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
169169
// CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) {
170170
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
171171
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
172-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = acquire) : (!s32i, !cir.bool)
172+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = acquire) align(4) : (!s32i, !cir.bool)
173173
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
174174
// CHECK: cir.if %[[succeeded]] {
175175
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -180,7 +180,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
180180
// CHECK: cir.case(equal, [#cir.int<5> : !s32i]) {
181181
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
182182
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
183-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = seq_cst) : (!s32i, !cir.bool)
183+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = seq_cst) align(4) : (!s32i, !cir.bool)
184184
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
185185
// CHECK: cir.if %[[succeeded]] {
186186
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -196,7 +196,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
196196
// CHECK: cir.case(default, []) {
197197
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
198198
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
199-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = relaxed) : (!s32i, !cir.bool)
199+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = relaxed) align(4) : (!s32i, !cir.bool)
200200
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
201201
// CHECK: cir.if %[[succeeded]] {
202202
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -207,7 +207,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
207207
// CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) {
208208
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
209209
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
210-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = acquire) : (!s32i, !cir.bool)
210+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = acquire) align(4) : (!s32i, !cir.bool)
211211
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
212212
// CHECK: cir.if %[[succeeded]] {
213213
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -218,7 +218,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
218218
// CHECK: cir.case(equal, [#cir.int<5> : !s32i]) {
219219
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
220220
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
221-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = seq_cst) : (!s32i, !cir.bool)
221+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = seq_cst) align(4) : (!s32i, !cir.bool)
222222
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
223223
// CHECK: cir.if %[[succeeded]] {
224224
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -234,7 +234,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
234234
// CHECK: cir.case(default, []) {
235235
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
236236
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
237-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = relaxed) : (!s32i, !cir.bool)
237+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = relaxed) align(4) : (!s32i, !cir.bool)
238238
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
239239
// CHECK: cir.if %[[succeeded]] {
240240
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -245,7 +245,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
245245
// CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) {
246246
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
247247
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
248-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = acquire) : (!s32i, !cir.bool)
248+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = acquire) align(4) : (!s32i, !cir.bool)
249249
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
250250
// CHECK: cir.if %[[succeeded]] {
251251
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -256,7 +256,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
256256
// CHECK: cir.case(equal, [#cir.int<5> : !s32i]) {
257257
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
258258
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
259-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = seq_cst) : (!s32i, !cir.bool)
259+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = seq_cst) align(4) : (!s32i, !cir.bool)
260260
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
261261
// CHECK: cir.if %[[succeeded]] {
262262
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -272,7 +272,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
272272
// CHECK: cir.case(default, []) {
273273
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
274274
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
275-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = relaxed) : (!s32i, !cir.bool)
275+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = relaxed) align(4) : (!s32i, !cir.bool)
276276
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
277277
// CHECK: cir.if %[[succeeded]] {
278278
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -283,7 +283,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
283283
// CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) {
284284
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
285285
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
286-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = acquire) : (!s32i, !cir.bool)
286+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = acquire) align(4) : (!s32i, !cir.bool)
287287
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
288288
// CHECK: cir.if %[[succeeded]] {
289289
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>
@@ -294,7 +294,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected,
294294
// CHECK: cir.case(equal, [#cir.int<5> : !s32i]) {
295295
// CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr<!s32i>, !s32i
296296
// CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr<!s32i>, !s32i
297-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = seq_cst) : (!s32i, !cir.bool)
297+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr<!s32i>, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = seq_cst) align(4) : (!s32i, !cir.bool)
298298
// CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool
299299
// CHECK: cir.if %[[succeeded]] {
300300
// CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr<!s32i>

clang/test/CIR/CodeGen/atomic-xchg-field.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ void structAtomicExchange(unsigned referenceCount, wPtr item) {
4747
}
4848

4949
// CHECK-LABEL: @structAtomicExchange
50-
// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr<!u32i>, {{.*}} : !u32i, {{.*}} : !u32i, success = seq_cst, failure = seq_cst) weak : (!u32i, !cir.bool)
50+
// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr<!u32i>, {{.*}} : !u32i, {{.*}} : !u32i, success = seq_cst, failure = seq_cst) align(8) weak : (!u32i, !cir.bool)
5151

5252
// LLVM-LABEL: @structAtomicExchange
5353
// LLVM: load i32
5454
// LLVM: add i32
5555
// LLVM: store i32
5656
// LLVM: %[[EXP:.*]] = load i32
5757
// LLVM: %[[DES:.*]] = load i32
58-
// LLVM: %[[RES:.*]] = cmpxchg weak ptr %9, i32 %[[EXP]], i32 %[[DES]] seq_cst seq_cst
58+
// LLVM: %[[RES:.*]] = cmpxchg weak ptr %9, i32 %[[EXP]], i32 %[[DES]] seq_cst seq_cst, align 8
5959
// LLVM: %[[OLD:.*]] = extractvalue { i32, i1 } %[[RES]], 0
6060
// LLVM: %[[CMP:.*]] = extractvalue { i32, i1 } %[[RES]], 1
6161
// LLVM: %[[FAIL:.*]] = xor i1 %[[CMP]], true

0 commit comments

Comments
 (0)