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