Files
clang-p2996/clang/test/CodeGenCXX/atomic-inline.cpp
James Y Knight 8043d5a964 NFC: update clang tests to check ordering and alignment for atomicrmw/cmpxchg.
The ability to specify alignment was recently added, and it's an
important property which we should ensure is set as expected by
Clang. (Especially before making further changes to Clang's code in
this area.) But, because it's on the end of the lines, the existing
tests all ignore it.

Therefore, update all the tests to also verify the expected alignment
for atomicrmw and cmpxchg. While I was in there, I also updated uses
of 'load atomic' and 'store atomic', and added the memory ordering,
where that was missing.
2021-02-11 17:35:09 -05:00

69 lines
1.8 KiB
C++

// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - -triple=x86_64-linux-gnu | FileCheck %s
// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - -triple=x86_64-linux-gnu -target-cpu core2 | FileCheck %s --check-prefix=CORE2
// Check the atomic code generation for cpu targets w/wo cx16 support.
struct alignas(8) AM8 {
int f1, f2;
};
AM8 m8;
AM8 load8() {
AM8 am;
// CHECK-LABEL: @_Z5load8v
// CHECK: load atomic i64, {{.*}} monotonic, align 8
// CORE2-LABEL: @_Z5load8v
// CORE2: load atomic i64, {{.*}} monotonic, align 8
__atomic_load(&m8, &am, 0);
return am;
}
AM8 s8;
void store8() {
// CHECK-LABEL: @_Z6store8v
// CHECK: store atomic i64 {{.*}} monotonic, align 8
// CORE2-LABEL: @_Z6store8v
// CORE2: store atomic i64 {{.*}} monotonic, align 8
__atomic_store(&m8, &s8, 0);
}
bool cmpxchg8() {
AM8 am;
// CHECK-LABEL: @_Z8cmpxchg8v
// CHECK: cmpxchg i64* {{.*}} monotonic, align 8
// CORE2-LABEL: @_Z8cmpxchg8v
// CORE2: cmpxchg i64* {{.*}} monotonic, align 8
return __atomic_compare_exchange(&m8, &s8, &am, 0, 0, 0);
}
struct alignas(16) AM16 {
long f1, f2;
};
AM16 m16;
AM16 load16() {
AM16 am;
// CHECK-LABEL: @_Z6load16v
// CHECK: call void @__atomic_load
// CORE2-LABEL: @_Z6load16v
// CORE2: load atomic i128, {{.*}} monotonic, align 16
__atomic_load(&m16, &am, 0);
return am;
}
AM16 s16;
void store16() {
// CHECK-LABEL: @_Z7store16v
// CHECK: call void @__atomic_store
// CORE2-LABEL: @_Z7store16v
// CORE2: store atomic i128 {{.*}} monotonic, align 16
__atomic_store(&m16, &s16, 0);
}
bool cmpxchg16() {
AM16 am;
// CHECK-LABEL: @_Z9cmpxchg16v
// CHECK: call zeroext i1 @__atomic_compare_exchange
// CORE2-LABEL: @_Z9cmpxchg16v
// CORE2: cmpxchg i128* {{.*}} monotonic monotonic, align 16
return __atomic_compare_exchange(&m16, &s16, &am, 0, 0, 0);
}