diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 2659471e7e38..a0a13454fab3 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -5390,6 +5390,7 @@ def AtomicCmpXchg : CIR_Op<"atomic.cmp_xchg", CIR_AnyType:$desired, Arg:$succ_order, Arg:$fail_order, + OptionalAttr:$alignment, UnitAttr:$weak, UnitAttr:$is_volatile); @@ -5401,6 +5402,7 @@ def AtomicCmpXchg : CIR_Op<"atomic.cmp_xchg", `success` `=` $succ_order `,` `failure` `=` $fail_order `)` + (`align` `(` $alignment^ `)`)? (`weak` $weak^)? (`volatile` $is_volatile^)? `:` `(` type($old) `,` type($cmp) `)` attr-dict diff --git a/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp b/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp index 62fe88a9d552..49fe86eb17b4 100644 --- a/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenAtomic.cpp @@ -423,7 +423,9 @@ static void emitAtomicCmpXchg(CIRGenFunction &CGF, AtomicExpr *E, bool IsWeak, auto boolTy = builder.getBoolTy(); auto cmpxchg = builder.create( loc, Expected.getType(), boolTy, Ptr.getPointer(), Expected, Desired, - SuccessOrder, FailureOrder); + cir::MemOrderAttr::get(&CGF.getMLIRContext(), SuccessOrder), + cir::MemOrderAttr::get(&CGF.getMLIRContext(), FailureOrder), + builder.getI64IntegerAttr(Ptr.getAlignment().getAsAlign().value())); cmpxchg.setIsVolatile(E->isVolatile()); cmpxchg.setWeak(IsWeak); diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index bb285e4811e3..1b15c8ede925 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -324,8 +324,11 @@ static mlir::Value MakeAtomicCmpXchgValue(CIRGenFunction &cgf, auto op = builder.create( cgf.getLoc(expr->getSourceRange()), cmpVal.getType(), builder.getBoolTy(), destAddr.getPointer(), cmpVal, newVal, - cir::MemOrder::SequentiallyConsistent, - cir::MemOrder::SequentiallyConsistent); + MemOrderAttr::get(&cgf.getMLIRContext(), + cir::MemOrder::SequentiallyConsistent), + MemOrderAttr::get(&cgf.getMLIRContext(), + cir::MemOrder::SequentiallyConsistent), + builder.getI64IntegerAttr(destAddr.getAlignment().getAsAlign().value())); return returnBool ? op.getResult(1) : op.getResult(0); } diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 833d256d0404..651870218ae1 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -3197,6 +3197,7 @@ mlir::LogicalResult CIRToLLVMAtomicCmpXchgLowering::matchAndRewrite( op.getLoc(), adaptor.getPtr(), expected, desired, getLLVMAtomicOrder(adaptor.getSuccOrder()), getLLVMAtomicOrder(adaptor.getFailOrder())); + cmpxchg.setAlignment(adaptor.getAlignment()); cmpxchg.setWeak(adaptor.getWeak()); cmpxchg.setVolatile_(adaptor.getIsVolatile()); diff --git a/clang/test/CIR/CodeGen/atomic-runtime.cpp b/clang/test/CIR/CodeGen/atomic-runtime.cpp index 28220ee0f5e6..cea46849c83e 100644 --- a/clang/test/CIR/CodeGen/atomic-runtime.cpp +++ b/clang/test/CIR/CodeGen/atomic-runtime.cpp @@ -120,7 +120,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(default, []) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = relaxed) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = relaxed) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -131,7 +131,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = acquire) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = acquire) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -142,7 +142,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(equal, [#cir.int<5> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = seq_cst) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = relaxed, failure = seq_cst) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -158,7 +158,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(default, []) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = relaxed) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = relaxed) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -169,7 +169,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = acquire) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = acquire) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -180,7 +180,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(equal, [#cir.int<5> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = seq_cst) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acquire, failure = seq_cst) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -196,7 +196,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(default, []) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = relaxed) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = relaxed) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -207,7 +207,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = acquire) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = acquire) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -218,7 +218,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(equal, [#cir.int<5> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = seq_cst) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = release, failure = seq_cst) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -234,7 +234,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(default, []) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = relaxed) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = relaxed) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -245,7 +245,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = acquire) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = acquire) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -256,7 +256,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(equal, [#cir.int<5> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = seq_cst) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = acq_rel, failure = seq_cst) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -272,7 +272,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(default, []) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = relaxed) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = relaxed) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -283,7 +283,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(anyof, [#cir.int<1> : !s32i, #cir.int<2> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = acquire) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = acquire) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr @@ -294,7 +294,7 @@ bool atomic_compare_exchange_n(int* ptr, int* expected, // CHECK: cir.case(equal, [#cir.int<5> : !s32i]) { // CHECK: %[[expected:.*]] = cir.load %[[expected_addr]] : !cir.ptr, !s32i // CHECK: %[[desired:.*]] = cir.load %[[desired_var]] : !cir.ptr, !s32i -// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = seq_cst) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg(%[[ptr]] : !cir.ptr, %[[expected]] : !s32i, %[[desired]] : !s32i, success = seq_cst, failure = seq_cst) align(4) : (!s32i, !cir.bool) // CHECK: %[[succeeded:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[succeeded]] { // CHECK: cir.store %old, %[[expected_addr]] : !s32i, !cir.ptr diff --git a/clang/test/CIR/CodeGen/atomic-xchg-field.c b/clang/test/CIR/CodeGen/atomic-xchg-field.c index fd9267632344..59b36ba183bb 100644 --- a/clang/test/CIR/CodeGen/atomic-xchg-field.c +++ b/clang/test/CIR/CodeGen/atomic-xchg-field.c @@ -47,7 +47,7 @@ void structAtomicExchange(unsigned referenceCount, wPtr item) { } // CHECK-LABEL: @structAtomicExchange -// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u32i, {{.*}} : !u32i, success = seq_cst, failure = seq_cst) weak : (!u32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u32i, {{.*}} : !u32i, success = seq_cst, failure = seq_cst) align(8) weak : (!u32i, !cir.bool) // LLVM-LABEL: @structAtomicExchange // LLVM: load i32 @@ -55,7 +55,7 @@ void structAtomicExchange(unsigned referenceCount, wPtr item) { // LLVM: store i32 // LLVM: %[[EXP:.*]] = load i32 // LLVM: %[[DES:.*]] = load i32 -// LLVM: %[[RES:.*]] = cmpxchg weak ptr %9, i32 %[[EXP]], i32 %[[DES]] seq_cst seq_cst +// LLVM: %[[RES:.*]] = cmpxchg weak ptr %9, i32 %[[EXP]], i32 %[[DES]] seq_cst seq_cst, align 8 // LLVM: %[[OLD:.*]] = extractvalue { i32, i1 } %[[RES]], 0 // LLVM: %[[CMP:.*]] = extractvalue { i32, i1 } %[[RES]], 1 // LLVM: %[[FAIL:.*]] = xor i1 %[[CMP]], true diff --git a/clang/test/CIR/CodeGen/atomic.cpp b/clang/test/CIR/CodeGen/atomic.cpp index 4f24e947e6c5..8d7b6cdb77ce 100644 --- a/clang/test/CIR/CodeGen/atomic.cpp +++ b/clang/test/CIR/CodeGen/atomic.cpp @@ -261,7 +261,7 @@ bool fd4(struct S *a, struct S *b, struct S *c) { } // CHECK-LABEL: @_Z3fd4P1SS0_S0_ -// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u64i, {{.*}} : !u64i, success = seq_cst, failure = seq_cst) weak : (!u64i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u64i, {{.*}} : !u64i, success = seq_cst, failure = seq_cst) align(8) weak : (!u64i, !cir.bool) // LLVM-LABEL: @_Z3fd4P1SS0_S0_ // LLVM: cmpxchg weak ptr {{.*}}, i64 {{.*}}, i64 {{.*}} seq_cst seq_cst, align 8 @@ -273,7 +273,7 @@ bool fi4a(int *i) { } // CHECK-LABEL: @_Z4fi4aPi -// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s32i, {{.*}} : !s32i, success = acquire, failure = acquire) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s32i, {{.*}} : !s32i, success = acquire, failure = acquire) align(4) : (!s32i, !cir.bool) // LLVM-LABEL: @_Z4fi4aPi // LLVM: %[[RES:.*]] = cmpxchg ptr %7, i32 %8, i32 %9 acquire acquire, align 4 @@ -286,7 +286,7 @@ bool fi4b(int *i) { } // CHECK-LABEL: @_Z4fi4bPi -// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s32i, {{.*}} : !s32i, success = acquire, failure = acquire) weak : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s32i, {{.*}} : !s32i, success = acquire, failure = acquire) align(4) weak : (!s32i, !cir.bool) // LLVM-LABEL: @_Z4fi4bPi // LLVM: %[[R:.*]] = cmpxchg weak ptr {{.*}}, i32 {{.*}}, i32 {{.*}} acquire acquire, align 4 @@ -299,7 +299,7 @@ bool fi4c(atomic_int *i) { } // CHECK-LABEL: @_Z4fi4cPU7_Atomici -// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s32i, {{.*}} : !s32i, success = seq_cst, failure = seq_cst) : (!s32i, !cir.bool) +// CHECK: %old, %cmp = cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s32i, {{.*}} : !s32i, success = seq_cst, failure = seq_cst) align(4) : (!s32i, !cir.bool) // CHECK: %[[CMP:.*]] = cir.unary(not, %cmp) : !cir.bool, !cir.bool // CHECK: cir.if %[[CMP:.*]] { // CHECK: cir.store %old, {{.*}} : !s32i, !cir.ptr @@ -436,14 +436,14 @@ void sub_byte(char* a, char b) { // CHECK: %[[PTR:.*]] = cir.load {{.*}} : !cir.ptr>, !cir.ptr // CHECK: %[[CMP:.*]] = cir.load {{.*}} : !cir.ptr, !s32i // CHECK: %[[UPD:.*]] = cir.load {{.*}} : !cir.ptr, !s32i -// CHECK: %[[OLD:.*]], %[[RES:.*]] = cir.atomic.cmp_xchg(%[[PTR]] : !cir.ptr, %[[CMP]] : !s32i, %[[UPD]] : !s32i, success = seq_cst, failure = seq_cst) : (!s32i, !cir.bool) +// CHECK: %[[OLD:.*]], %[[RES:.*]] = cir.atomic.cmp_xchg(%[[PTR]] : !cir.ptr, %[[CMP]] : !s32i, %[[UPD]] : !s32i, success = seq_cst, failure = seq_cst) align(4) : (!s32i, !cir.bool) // CHECK: cir.store %[[RES]], {{.*}} : !cir.bool, !cir.ptr // LLVM-LABEL: @_Z12cmp_bool_int // LLVM: %[[PTR:.*]] = load ptr // LLVM: %[[CMP:.*]] = load i32 // LLVM: %[[UPD:.*]] = load i32 -// LLVM: %[[RES:.*]] = cmpxchg ptr %[[PTR]], i32 %[[CMP]], i32 %[[UPD]] seq_cst seq_cst +// LLVM: %[[RES:.*]] = cmpxchg ptr %[[PTR]], i32 %[[CMP]], i32 %[[UPD]] seq_cst seq_cst, align 4 // LLVM: %[[TMP:.*]] = extractvalue { i32, i1 } %[[RES]], 1 // LLVM: %[[EXT:.*]] = zext i1 %[[TMP]] to i8 // LLVM: store i8 %[[EXT]], ptr {{.*}} @@ -453,28 +453,28 @@ void cmp_bool_int(int* p, int x, int u) { // CHECK-LABEL: @_Z13cmp_bool_long -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s64i, {{.*}} : !s64i, success = seq_cst, failure = seq_cst) : (!s64i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s64i, {{.*}} : !s64i, success = seq_cst, failure = seq_cst) align(8) : (!s64i, !cir.bool) // LLVM-LABEL: @_Z13cmp_bool_long -// LLVM: cmpxchg ptr {{.*}}, i64 {{.*}}, i64 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i64 {{.*}}, i64 {{.*}} seq_cst seq_cst, align 8 void cmp_bool_long(long* p, long x, long u) { bool r = __sync_bool_compare_and_swap(p, x, u); } // CHECK-LABEL: @_Z14cmp_bool_short -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s16i, {{.*}} : !s16i, success = seq_cst, failure = seq_cst) : (!s16i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s16i, {{.*}} : !s16i, success = seq_cst, failure = seq_cst) align(2) : (!s16i, !cir.bool) // LLVM-LABEL: @_Z14cmp_bool_short -// LLVM: cmpxchg ptr {{.*}}, i16 {{.*}}, i16 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i16 {{.*}}, i16 {{.*}} seq_cst seq_cst, align 2 void cmp_bool_short(short* p, short x, short u) { bool r = __sync_bool_compare_and_swap(p, x, u); } // CHECK-LABEL: @_Z13cmp_bool_byte -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s8i, {{.*}} : !s8i, success = seq_cst, failure = seq_cst) : (!s8i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s8i, {{.*}} : !s8i, success = seq_cst, failure = seq_cst) align(1) : (!s8i, !cir.bool) // LLVM-LABEL: @_Z13cmp_bool_byte -// LLVM: cmpxchg ptr {{.*}}, i8 {{.*}}, i8 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i8 {{.*}}, i8 {{.*}} seq_cst seq_cst, align 1 void cmp_bool_byte(char* p, char x, char u) { bool r = __sync_bool_compare_and_swap(p, x, u); } @@ -483,14 +483,14 @@ void cmp_bool_byte(char* p, char x, char u) { // CHECK: %[[PTR:.*]] = cir.load {{.*}} : !cir.ptr>, !cir.ptr // CHECK: %[[CMP:.*]] = cir.load {{.*}} : !cir.ptr, !s32i // CHECK: %[[UPD:.*]] = cir.load {{.*}} : !cir.ptr, !s32i -// CHECK: %[[OLD:.*]], %[[RES:.*]] = cir.atomic.cmp_xchg(%[[PTR]] : !cir.ptr, %[[CMP]] : !s32i, %[[UPD]] : !s32i, success = seq_cst, failure = seq_cst) : (!s32i, !cir.bool) +// CHECK: %[[OLD:.*]], %[[RES:.*]] = cir.atomic.cmp_xchg(%[[PTR]] : !cir.ptr, %[[CMP]] : !s32i, %[[UPD]] : !s32i, success = seq_cst, failure = seq_cst) align(4) : (!s32i, !cir.bool) // CHECK: cir.store %[[OLD]], {{.*}} : !s32i, !cir.ptr // LLVM-LABEL: @_Z11cmp_val_int // LLVM: %[[PTR:.*]] = load ptr // LLVM: %[[CMP:.*]] = load i32 // LLVM: %[[UPD:.*]] = load i32 -// LLVM: %[[RES:.*]] = cmpxchg ptr %[[PTR]], i32 %[[CMP]], i32 %[[UPD]] seq_cst seq_cst +// LLVM: %[[RES:.*]] = cmpxchg ptr %[[PTR]], i32 %[[CMP]], i32 %[[UPD]] seq_cst seq_cst, align 4 // LLVM: %[[TMP:.*]] = extractvalue { i32, i1 } %[[RES]], 0 // LLVM: store i32 %[[TMP]], ptr {{.*}} void cmp_val_int(int* p, int x, int u) { @@ -498,28 +498,28 @@ void cmp_val_int(int* p, int x, int u) { } // CHECK-LABEL: @_Z12cmp_val_long -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s64i, {{.*}} : !s64i, success = seq_cst, failure = seq_cst) : (!s64i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s64i, {{.*}} : !s64i, success = seq_cst, failure = seq_cst) align(8) : (!s64i, !cir.bool) // LLVM-LABEL: @_Z12cmp_val_long -// LLVM: cmpxchg ptr {{.*}}, i64 {{.*}}, i64 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i64 {{.*}}, i64 {{.*}} seq_cst seq_cst, align 8 void cmp_val_long(long* p, long x, long u) { long r = __sync_val_compare_and_swap(p, x, u); } // CHECK-LABEL: @_Z13cmp_val_short -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s16i, {{.*}} : !s16i, success = seq_cst, failure = seq_cst) : (!s16i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s16i, {{.*}} : !s16i, success = seq_cst, failure = seq_cst) align(2) : (!s16i, !cir.bool) // LLVM-LABEL: @_Z13cmp_val_short -// LLVM: cmpxchg ptr {{.*}}, i16 {{.*}}, i16 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i16 {{.*}}, i16 {{.*}} seq_cst seq_cst, align 2 void cmp_val_short(short* p, short x, short u) { short r = __sync_val_compare_and_swap(p, x, u); } // CHECK-LABEL: @_Z12cmp_val_byte -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s8i, {{.*}} : !s8i, success = seq_cst, failure = seq_cst) : (!s8i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !s8i, {{.*}} : !s8i, success = seq_cst, failure = seq_cst) align(1) : (!s8i, !cir.bool) // LLVM-LABEL: @_Z12cmp_val_byte -// LLVM: cmpxchg ptr {{.*}}, i8 {{.*}}, i8 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i8 {{.*}}, i8 {{.*}} seq_cst seq_cst, align 1 void cmp_val_byte(char* p, char x, char u) { char r = __sync_val_compare_and_swap(p, x, u); } @@ -586,14 +586,14 @@ void sub_uchar(unsigned char* a, char b) { // CHECK: %[[UPD:.*]] = cir.load {{.*}} : !cir.ptr, !s32i // CHECK: %[[UPD_U:.*]] = cir.cast(integral, %[[UPD]] : !s32i), !u32i // CHECK: %[[OLD:.*]], %[[RES:.*]] = cir.atomic.cmp_xchg(%[[PTR]] : !cir.ptr, %[[CMP_U]] : -// CHECK-SAME: !u32i, %[[UPD_U]] : !u32i, success = seq_cst, failure = seq_cst) : (!u32i, !cir.bool) +// CHECK-SAME: !u32i, %[[UPD_U]] : !u32i, success = seq_cst, failure = seq_cst) align(4) : (!u32i, !cir.bool) // CHECK: cir.store %[[RES]], {{.*}} : !cir.bool, !cir.ptr // LLVM-LABEL: @_Z13cmp_bool_uint // LLVM: %[[PTR:.*]] = load ptr // LLVM: %[[CMP:.*]] = load i32 // LLVM: %[[UPD:.*]] = load i32 -// LLVM: %[[RES:.*]] = cmpxchg ptr %[[PTR]], i32 %[[CMP]], i32 %[[UPD]] seq_cst seq_cst +// LLVM: %[[RES:.*]] = cmpxchg ptr %[[PTR]], i32 %[[CMP]], i32 %[[UPD]] seq_cst seq_cst, align 4 // LLVM: %[[TMP:.*]] = extractvalue { i32, i1 } %[[RES]], 1 // LLVM: %[[EXT:.*]] = zext i1 %[[TMP]] to i8 // LLVM: store i8 %[[EXT]], ptr {{.*}} @@ -602,19 +602,19 @@ void cmp_bool_uint(unsigned int* p, int x, int u) { } // CHECK-LABEL: @_Z15cmp_bool_ushort -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u16i, {{.*}} : !u16i, success = seq_cst, failure = seq_cst) : (!u16i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u16i, {{.*}} : !u16i, success = seq_cst, failure = seq_cst) align(2) : (!u16i, !cir.bool) // LLVM-LABEL: @_Z15cmp_bool_ushort -// LLVM: cmpxchg ptr {{.*}}, i16 {{.*}}, i16 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i16 {{.*}}, i16 {{.*}} seq_cst seq_cst, align 2 void cmp_bool_ushort(unsigned short* p, short x, short u) { bool r = __sync_bool_compare_and_swap(p, x, u); } // CHECK-LABEL: @_Z14cmp_bool_ulong -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u64i, {{.*}} : !u64i, success = seq_cst, failure = seq_cst) : (!u64i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u64i, {{.*}} : !u64i, success = seq_cst, failure = seq_cst) align(8) : (!u64i, !cir.bool) // LLVM-LABEL: @_Z14cmp_bool_ulong -// LLVM: cmpxchg ptr {{.*}}, i64 {{.*}}, i64 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i64 {{.*}}, i64 {{.*}} seq_cst seq_cst, align 8 void cmp_bool_ulong(unsigned long* p, long x, long u) { bool r = __sync_bool_compare_and_swap(p, x, u); } @@ -626,7 +626,7 @@ void cmp_bool_ulong(unsigned long* p, long x, long u) { // CHECK: %[[UPD:.*]] = cir.load {{.*}} : !cir.ptr, !s32i // CHECK: %[[UPD_U:.*]] = cir.cast(integral, %[[UPD]] : !s32i), !u32i // CHECK: %[[OLD:.*]], %[[RES:.*]] = cir.atomic.cmp_xchg(%[[PTR]] : !cir.ptr, %[[CMP_U]] : -// CHECK-SAME: !u32i, %[[UPD_U]] : !u32i, success = seq_cst, failure = seq_cst) : (!u32i, !cir.bool) +// CHECK-SAME: !u32i, %[[UPD_U]] : !u32i, success = seq_cst, failure = seq_cst) align(4) : (!u32i, !cir.bool) // CHECK: %[[R:.*]] = cir.cast(integral, %[[OLD]] : !u32i), !s32i // CHECK: cir.store %[[R]], {{.*}} : !s32i, !cir.ptr @@ -634,7 +634,7 @@ void cmp_bool_ulong(unsigned long* p, long x, long u) { // LLVM: %[[PTR:.*]] = load ptr // LLVM: %[[CMP:.*]] = load i32 // LLVM: %[[UPD:.*]] = load i32 -// LLVM: %[[RES:.*]] = cmpxchg ptr %[[PTR]], i32 %[[CMP]], i32 %[[UPD]] seq_cst seq_cst +// LLVM: %[[RES:.*]] = cmpxchg ptr %[[PTR]], i32 %[[CMP]], i32 %[[UPD]] seq_cst seq_cst, align 4 // LLVM: %[[TMP:.*]] = extractvalue { i32, i1 } %[[RES]], 0 // LLVM: store i32 %[[TMP]], ptr {{.*}} void cmp_val_uint(unsigned int* p, int x, int u) { @@ -642,19 +642,19 @@ void cmp_val_uint(unsigned int* p, int x, int u) { } // CHECK-LABEL: @_Z14cmp_val_ushort -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u16i, {{.*}} : !u16i, success = seq_cst, failure = seq_cst) : (!u16i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u16i, {{.*}} : !u16i, success = seq_cst, failure = seq_cst) align(2) : (!u16i, !cir.bool) // LLVM-LABEL: @_Z14cmp_val_ushort -// LLVM: cmpxchg ptr {{.*}}, i16 {{.*}}, i16 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i16 {{.*}}, i16 {{.*}} seq_cst seq_cst, align 2 void cmp_val_ushort(unsigned short* p, short x, short u) { short r = __sync_val_compare_and_swap(p, x, u); } // CHECK-LABEL: @_Z13cmp_val_ulong -// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u64i, {{.*}} : !u64i, success = seq_cst, failure = seq_cst) : (!u64i, !cir.bool) +// CHECK: cir.atomic.cmp_xchg({{.*}} : !cir.ptr, {{.*}} : !u64i, {{.*}} : !u64i, success = seq_cst, failure = seq_cst) align(8) : (!u64i, !cir.bool) // LLVM-LABEL: @_Z13cmp_val_ulong -// LLVM: cmpxchg ptr {{.*}}, i64 {{.*}}, i64 {{.*}} seq_cst seq_cst +// LLVM: cmpxchg ptr {{.*}}, i64 {{.*}}, i64 {{.*}} seq_cst seq_cst, align 8 void cmp_val_ulong(unsigned long* p, long x, long u) { long r = __sync_val_compare_and_swap(p, x, u); }