177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-macosx10.9.0 | FileCheck %s
277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// Also test serialization of atomic operations here, to avoid duplicating the
477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// test.
577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// RUN: %clang_cc1 %s -emit-pch -o %t -triple=x86_64-apple-macosx10.9.0
677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// RUN: %clang_cc1 %s -include-pch %t -triple=x86_64-apple-macosx10.9.0 -emit-llvm -o - | FileCheck %s
777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson#ifndef ALREADY_INCLUDED
877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson#define ALREADY_INCLUDED
977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
1077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// Basic IRGen tests for __c11_atomic_* and GNU __atomic_*
1177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
1277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsontypedef enum memory_order {
1377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  memory_order_relaxed, memory_order_consume, memory_order_acquire,
1477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  memory_order_release, memory_order_acq_rel, memory_order_seq_cst
1577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson} memory_order;
1677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
1777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint fi1(_Atomic(int) *i) {
1877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi1
1977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: load atomic i32* {{.*}} seq_cst
2077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_load(i, memory_order_seq_cst);
2177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
2277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
2377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint fi1a(int *i) {
2477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi1a
2577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: load atomic i32* {{.*}} seq_cst
2677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  int v;
2777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_load(i, &v, memory_order_seq_cst);
2877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return v;
2977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
3077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
3177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint fi1b(int *i) {
3277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi1b
3377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: load atomic i32* {{.*}} seq_cst
3477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __atomic_load_n(i, memory_order_seq_cst);
3577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
3677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
3777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonvoid fi2(_Atomic(int) *i) {
3877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi2
3977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store atomic i32 {{.*}} seq_cst
4077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __c11_atomic_store(i, 1, memory_order_seq_cst);
4177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
4277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
4377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonvoid fi2a(int *i) {
4477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi2a
4577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store atomic i32 {{.*}} seq_cst
4677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  int v = 1;
4777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_store(i, &v, memory_order_seq_cst);
4877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
4977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
5077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonvoid fi2b(int *i) {
5177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi2b
5277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store atomic i32 {{.*}} seq_cst
5377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_store_n(i, 1, memory_order_seq_cst);
5477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
5577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
5677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint fi3(_Atomic(int) *i) {
5777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi3
5877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw and
5977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK-NOT: and
6077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_fetch_and(i, 1, memory_order_seq_cst);
6177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
6277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
6377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint fi3a(int *i) {
6477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi3a
6577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw xor
6677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK-NOT: xor
6777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __atomic_fetch_xor(i, 1, memory_order_seq_cst);
6877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
6977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
7077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint fi3b(int *i) {
7177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi3b
7277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw add
7377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: add
7477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __atomic_add_fetch(i, 1, memory_order_seq_cst);
7577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
7677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
7777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint fi3c(int *i) {
7877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi3c
7977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw nand
8077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK-NOT: and
8177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __atomic_fetch_nand(i, 1, memory_order_seq_cst);
8277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
8377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
8477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint fi3d(int *i) {
8577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi3d
8677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw nand
8777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: and
8877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: xor
8977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __atomic_nand_fetch(i, 1, memory_order_seq_cst);
9077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
9177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
9277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson_Bool fi4(_Atomic(int) *i) {
9377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi4
9477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: cmpxchg i32*
9577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  int cmp = 0;
9677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_compare_exchange_strong(i, &cmp, 1, memory_order_acquire, memory_order_acquire);
9777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
9877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
9977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson_Bool fi4a(int *i) {
10077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi4
10177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: cmpxchg i32*
10277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  int cmp = 0;
10377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  int desired = 1;
10477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __atomic_compare_exchange(i, &cmp, &desired, 0, memory_order_acquire, memory_order_acquire);
10577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
10677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
10777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson_Bool fi4b(int *i) {
10877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fi4
109ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: cmpxchg weak i32*
11077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  int cmp = 0;
11177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __atomic_compare_exchange_n(i, &cmp, 1, 1, memory_order_acquire, memory_order_acquire);
11277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
11377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
11477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonfloat ff1(_Atomic(float) *d) {
11577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @ff1
11677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: load atomic i32* {{.*}} monotonic
11777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_load(d, memory_order_relaxed);
11877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
11977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
12077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonvoid ff2(_Atomic(float) *d) {
12177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @ff2
12277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store atomic i32 {{.*}} release
12377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __c11_atomic_store(d, 1, memory_order_release);
12477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
12577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
12677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonfloat ff3(_Atomic(float) *d) {
12777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_exchange(d, 2, memory_order_seq_cst);
12877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
12977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
13077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint* fp1(_Atomic(int*) *p) {
13177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fp1
13277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: load atomic i64* {{.*}} seq_cst
13377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_load(p, memory_order_seq_cst);
13477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
13577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
13677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint* fp2(_Atomic(int*) *p) {
13777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fp2
13877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store i64 4
13977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw add {{.*}} monotonic
14077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_fetch_add(p, 1, memory_order_relaxed);
14177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
14277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
14377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint *fp2a(int **p) {
14477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fp2a
14577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store i64 4
14677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw sub {{.*}} monotonic
14777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // Note, the GNU builtins do not multiply by sizeof(T)!
14877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __atomic_fetch_sub(p, 4, memory_order_relaxed);
14977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
15077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
15177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson_Complex float fc(_Atomic(_Complex float) *c) {
15277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fc
15377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw xchg i64*
15477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_exchange(c, 2, memory_order_seq_cst);
15577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
15677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
15777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsontypedef struct X { int x; } X;
15877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob WilsonX fs(_Atomic(X) *c) {
15977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fs
16077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw xchg i32*
16177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_exchange(c, (X){2}, memory_order_seq_cst);
16277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
16377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
16477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob WilsonX fsa(X *c, X *d) {
16577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fsa
16677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw xchg i32*
16777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  X ret;
16877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_exchange(c, d, &ret, memory_order_seq_cst);
16977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return ret;
17077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
17177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
17277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson_Bool fsb(_Bool *c) {
17377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @fsb
17477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw xchg i8*
17577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __atomic_exchange_n(c, 1, memory_order_seq_cst);
17677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
17777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
17877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonchar flag1;
17977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonvolatile char flag2;
18077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonvoid test_and_set() {
18177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw xchg i8* @flag1, i8 1 seq_cst
18277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_test_and_set(&flag1, memory_order_seq_cst);
18377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: atomicrmw volatile xchg i8* @flag2, i8 1 acquire
18477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_test_and_set(&flag2, memory_order_acquire);
18577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store atomic volatile i8 0, i8* @flag2 release
18677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_clear(&flag2, memory_order_release);
18777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store atomic i8 0, i8* @flag1 seq_cst
18877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_clear(&flag1, memory_order_seq_cst);
18977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
19077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
19177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonstruct Sixteen {
19277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  char c[16];
19377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson} sixteen;
19477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonstruct Seventeen {
19577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  char c[17];
19677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson} seventeen;
19777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
19877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint lock_free(struct Incomplete *incomplete) {
19977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @lock_free
20077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
20177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call i32 @__atomic_is_lock_free(i64 3, i8* null)
20277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __c11_atomic_is_lock_free(3);
20377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
20477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call i32 @__atomic_is_lock_free(i64 16, i8* {{.*}}@sixteen{{.*}})
20577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_is_lock_free(16, &sixteen);
20677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
20777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call i32 @__atomic_is_lock_free(i64 17, i8* {{.*}}@seventeen{{.*}})
20877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_is_lock_free(17, &seventeen);
20977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
21077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call i32 @__atomic_is_lock_free(i64 4, {{.*}})
21177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_is_lock_free(4, incomplete);
21277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
21377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  char cs[20];
21477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call i32 @__atomic_is_lock_free(i64 4, {{.*}})
21577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_is_lock_free(4, cs+1);
21677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
21777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK-NOT: call
21877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_always_lock_free(3, 0);
21977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_always_lock_free(16, 0);
22077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_always_lock_free(17, 0);
22177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_always_lock_free(16, &sixteen);
22277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_always_lock_free(17, &seventeen);
22377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
22477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  int n;
22577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_is_lock_free(4, &n);
22677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
22777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: ret i32 1
22877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_is_lock_free(sizeof(_Atomic(int)));
22977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
23077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
23177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// Tests for atomic operations on big values.  These should call the functions
23277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// defined here:
23377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// http://gcc.gnu.org/wiki/Atomic/GCCMM/LIbrary#The_Library_interface
23477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
23577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonstruct foo {
23677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  int big[128];
23777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson};
23877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonstruct bar {
23977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  char c[3];
24077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson};
24177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
24277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonstruct bar smallThing, thing1, thing2;
24377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonstruct foo bigThing;
24477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson_Atomic(struct foo) bigAtomic;
24577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
24677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonvoid structAtomicStore() {
24777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @structAtomicStore
24877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  struct foo f = {0};
24977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __c11_atomic_store(&bigAtomic, f, 5);
25077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call void @__atomic_store(i64 512, i8* bitcast ({{.*}} @bigAtomic to i8*),
25177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
25277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  struct bar b = {0};
25377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_store(&smallThing, &b, 5);
25477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call void @__atomic_store(i64 3, i8* {{.*}} @smallThing
25577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
25677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_store(&bigThing, &f, 5);
25777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call void @__atomic_store(i64 512, i8* {{.*}} @bigThing
25877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
25977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonvoid structAtomicLoad() {
26077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @structAtomicLoad
26177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  struct foo f = __c11_atomic_load(&bigAtomic, 5);
26277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call void @__atomic_load(i64 512, i8* bitcast ({{.*}} @bigAtomic to i8*),
26377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
26477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  struct bar b;
26577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_load(&smallThing, &b, 5);
26677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call void @__atomic_load(i64 3, i8* {{.*}} @smallThing
26777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
26877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_load(&bigThing, &f, 5);
26977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call void @__atomic_load(i64 512, i8* {{.*}} @bigThing
27077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
27177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonstruct foo structAtomicExchange() {
27277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @structAtomicExchange
27377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  struct foo f = {0};
27477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  struct foo old;
27577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __atomic_exchange(&f, &bigThing, &old, 5);
27677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call void @__atomic_exchange(i64 512, {{.*}}, i8* bitcast ({{.*}} @bigThing to i8*),
27777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
27877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return __c11_atomic_exchange(&bigAtomic, f, 5);
27977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call void @__atomic_exchange(i64 512, i8* bitcast ({{.*}} @bigAtomic to i8*),
28077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
28177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonint structAtomicCmpExchange() {
28277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: @structAtomicCmpExchange
28377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  _Bool x = __atomic_compare_exchange(&smallThing, &thing1, &thing2, 1, 5, 5);
28477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call zeroext i1 @__atomic_compare_exchange(i64 3, {{.*}} @smallThing{{.*}} @thing1{{.*}} @thing2
28577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
28677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  struct foo f = {0};
28777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  struct foo g = {0};
28877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  g.big[12] = 12;
28977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  return x & __c11_atomic_compare_exchange_strong(&bigAtomic, &f, g, 5, 5);
29077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: call zeroext i1 @__atomic_compare_exchange(i64 512, i8* bitcast ({{.*}} @bigAtomic to i8*),
29177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
29277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
29377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// Check that no atomic operations are used in any initialisation of _Atomic
29477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// types.
29577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson_Atomic(int) atomic_init_i = 42;
29677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
29777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson// CHECK: @atomic_init_foo
29877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilsonvoid atomic_init_foo()
29977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson{
30077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK-NOT: }
30177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK-NOT: atomic
30277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store
30377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  _Atomic(int) j = 12;
30477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
30577534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK-NOT: }
30677534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK-NOT: atomic
30777534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: store
30877534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  __c11_atomic_init(&j, 42);
30977534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
31077534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK-NOT: atomic
31177534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson  // CHECK: }
31277534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson}
31377534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson
31477534c7051b30f0443b3f79e3dfe6b1d8e66b957Bob Wilson#endif
315