xref: /llvm-project/clang/test/CodeGen/SystemZ/atomic_is_lock_free.c (revision c568927f3e2e7d9804ea74ecbf11c16c014ddcbc)
1*c568927fSJonas Paulsson // RUN: %clang_cc1 -triple s390x-linux-gnu -O1 -emit-llvm %s -o - | FileCheck %s
2*c568927fSJonas Paulsson //
3*c568927fSJonas Paulsson // Test __atomic_is_lock_free() and friends.
4*c568927fSJonas Paulsson 
5*c568927fSJonas Paulsson #include <stdatomic.h>
6*c568927fSJonas Paulsson #include <stdint.h>
7*c568927fSJonas Paulsson 
8*c568927fSJonas Paulsson typedef __attribute__((aligned(16))) __int128 __int128_Al16;
9*c568927fSJonas Paulsson 
10*c568927fSJonas Paulsson _Atomic __int128 Int128_Atomic;
11*c568927fSJonas Paulsson __int128_Al16    Int128_Al16;
12*c568927fSJonas Paulsson __int128         Int128;
13*c568927fSJonas Paulsson struct { int I[3]; } _Atomic AtomicStruct;
14*c568927fSJonas Paulsson _Atomic long double Atomic_fp128; // Also check the alignment of this.
15*c568927fSJonas Paulsson 
16*c568927fSJonas Paulsson // Check alignments of the variables. @AtomicStruct gets padded and its size
17*c568927fSJonas Paulsson // and alignment becomes 16. Only a power-of-2 size is considered, so 16 (not
18*c568927fSJonas Paulsson // 12) needs to be specified with the intrinsics below.
19*c568927fSJonas Paulsson //
20*c568927fSJonas Paulsson // CHECK: %struct.anon = type { [3 x i32] }
21*c568927fSJonas Paulsson // CHECK: @Int128 = {{.*}} i128 0, align 8
22*c568927fSJonas Paulsson // CHECK: @Int128_Atomic = {{.*}} i128 0, align 16
23*c568927fSJonas Paulsson // CHECK: @Int128_Al16 = {{.*}} i128 0, align 16
24*c568927fSJonas Paulsson // CHECK: @AtomicStruct = {{.*}} { %struct.anon, [4 x i8] } zeroinitializer, align 16
25*c568927fSJonas Paulsson // CHECK: @Atomic_fp128 = {{.*}} fp128 0xL00000000000000000000000000000000, align 16
26*c568927fSJonas Paulsson 
27*c568927fSJonas Paulsson 
28*c568927fSJonas Paulsson // CHECK-LABEL: @fun0
29*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun0()30*c568927fSJonas Paulsson _Bool fun0() {
31*c568927fSJonas Paulsson   return __atomic_is_lock_free(16, &Int128_Atomic);
32*c568927fSJonas Paulsson }
33*c568927fSJonas Paulsson 
34*c568927fSJonas Paulsson // CHECK-LABEL: @fun1
35*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun1()36*c568927fSJonas Paulsson _Bool fun1() {
37*c568927fSJonas Paulsson   return __atomic_always_lock_free(16, &Int128_Atomic);
38*c568927fSJonas Paulsson }
39*c568927fSJonas Paulsson 
40*c568927fSJonas Paulsson // CHECK-LABEL: @fun2
41*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun2()42*c568927fSJonas Paulsson _Bool fun2() {
43*c568927fSJonas Paulsson   return __atomic_is_lock_free(16, &Int128_Al16);
44*c568927fSJonas Paulsson }
45*c568927fSJonas Paulsson 
46*c568927fSJonas Paulsson // CHECK-LABEL: @fun3
47*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun3()48*c568927fSJonas Paulsson _Bool fun3() {
49*c568927fSJonas Paulsson   return __atomic_always_lock_free(16, &Int128_Al16);
50*c568927fSJonas Paulsson }
51*c568927fSJonas Paulsson 
52*c568927fSJonas Paulsson // CHECK-LABEL: @fun4
53*c568927fSJonas Paulsson // CHECK:    call zeroext i1 @__atomic_is_lock_free
fun4()54*c568927fSJonas Paulsson _Bool fun4() {
55*c568927fSJonas Paulsson   return __atomic_is_lock_free(16, &Int128);
56*c568927fSJonas Paulsson }
57*c568927fSJonas Paulsson 
58*c568927fSJonas Paulsson // CHECK-LABEL: @fun5
59*c568927fSJonas Paulsson // CHECK:    ret i1 false
fun5()60*c568927fSJonas Paulsson _Bool fun5() {
61*c568927fSJonas Paulsson   return __atomic_always_lock_free(16, &Int128);
62*c568927fSJonas Paulsson }
63*c568927fSJonas Paulsson 
64*c568927fSJonas Paulsson // CHECK-LABEL: @fun6
65*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun6()66*c568927fSJonas Paulsson _Bool fun6() {
67*c568927fSJonas Paulsson   return __atomic_is_lock_free(16, 0);
68*c568927fSJonas Paulsson }
69*c568927fSJonas Paulsson 
70*c568927fSJonas Paulsson // CHECK-LABEL: @fun7
71*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun7()72*c568927fSJonas Paulsson _Bool fun7() {
73*c568927fSJonas Paulsson   return __atomic_always_lock_free(16, 0);
74*c568927fSJonas Paulsson }
75*c568927fSJonas Paulsson 
76*c568927fSJonas Paulsson // CHECK-LABEL: @fun8
77*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun8()78*c568927fSJonas Paulsson _Bool fun8() {
79*c568927fSJonas Paulsson   return __atomic_is_lock_free(16, &AtomicStruct);
80*c568927fSJonas Paulsson }
81*c568927fSJonas Paulsson 
82*c568927fSJonas Paulsson // CHECK-LABEL: @fun9
83*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun9()84*c568927fSJonas Paulsson _Bool fun9() {
85*c568927fSJonas Paulsson   return __atomic_always_lock_free(16, &AtomicStruct);
86*c568927fSJonas Paulsson }
87*c568927fSJonas Paulsson 
88*c568927fSJonas Paulsson // CHECK-LABEL: @fun10
89*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun10()90*c568927fSJonas Paulsson _Bool fun10() {
91*c568927fSJonas Paulsson   return atomic_is_lock_free(&Int128_Atomic);
92*c568927fSJonas Paulsson }
93*c568927fSJonas Paulsson 
94*c568927fSJonas Paulsson // CHECK-LABEL: @fun11
95*c568927fSJonas Paulsson // CHECK:       ret i1 true
fun11()96*c568927fSJonas Paulsson _Bool fun11() {
97*c568927fSJonas Paulsson   return __c11_atomic_is_lock_free(16);
98*c568927fSJonas Paulsson }
99