1
- // RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin9 | FileCheck %s
1
+ // RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin9 | FileCheck %s --check-prefixes=CHECK,X86
2
+ // RUN: %clang_cc1 %s -emit-llvm -o - -triple=s390x-linux-gnu | FileCheck %s --check-prefixes=CHECK,SYSTEMZ
2
3
3
4
// CHECK: @[[NONSTATIC_GLOB_POINTER_FROM_INT:.+]] = global ptr null
4
5
// CHECK: @[[GLOB_POINTER:.+]] = internal global ptr null
5
6
// CHECK: @[[GLOB_POINTER_FROM_INT:.+]] = internal global ptr null
6
7
// CHECK: @[[GLOB_INT:.+]] = internal global i32 0
7
8
// CHECK: @[[GLOB_FLT:.+]] = internal global float {{[0e\+-\.]+}}, align
9
+ // CHECK: @[[GLOB_DBL:.+]] = internal global double {{[0e\+-\.]+}}, align
10
+ // X86: @[[GLOB_LONGDBL:.+]] = internal global x86_fp80 {{[0xK]+}}, align
11
+ // SYSTEMZ: @[[GLOB_LONGDBL:.+]] = internal global fp128 {{[0xL]+}}, align
8
12
9
13
int atomic (void ) {
10
14
// non-sensical test for sync functions
@@ -79,8 +83,10 @@ int atomic(void) {
79
83
// CHECK: atomicrmw nand ptr %valc, i8 6 seq_cst, align 1
80
84
81
85
__sync_val_compare_and_swap ((void * * )0 , (void * )0 , (void * )0 );
82
- // CHECK: [[PAIR:%[a-z0-9_.]+]] = cmpxchg ptr null, i32 0, i32 0 seq_cst seq_cst, align 4
83
- // CHECK: extractvalue { i32, i1 } [[PAIR]], 0
86
+ // X86: [[PAIR:%[a-z0-9_.]+]] = cmpxchg ptr null, i32 0, i32 0 seq_cst seq_cst, align 4
87
+ // X86-NEXT: extractvalue { i32, i1 } [[PAIR]], 0
88
+ // SYSTEMZ: [[PAIR:%[a-z0-9_.]+]] = cmpxchg ptr null, i64 0, i64 0 seq_cst seq_cst, align 8
89
+ // SYSTEMZ-NEXT: extractvalue { i64, i1 } [[PAIR]], 0
84
90
85
91
if ( __sync_val_compare_and_swap (& valb , 0 , 1 )) {
86
92
// CHECK: [[PAIR:%[a-z0-9_.]+]] = cmpxchg ptr %valb, i8 0, i8 1 seq_cst seq_cst, align 1
@@ -90,13 +96,15 @@ int atomic(void) {
90
96
}
91
97
92
98
__sync_bool_compare_and_swap ((void * * )0 , (void * )0 , (void * )0 );
93
- // CHECK: cmpxchg ptr null, i32 0, i32 0 seq_cst seq_cst, align 4
99
+ // X86: cmpxchg ptr null, i32 0, i32 0 seq_cst seq_cst, align 4
100
+ // SYSTEMZ: cmpxchg ptr null, i64 0, i64 0 seq_cst seq_cst, align 8
94
101
95
102
__sync_lock_release (& val );
96
103
// CHECK: store atomic i32 0, {{.*}} release, align 4
97
104
98
105
__sync_lock_release (& ptrval );
99
- // CHECK: store atomic i32 0, {{.*}} release, align 4
106
+ // X86: store atomic i32 0, {{.*}} release, align 4
107
+ // SYSTEMZ: store atomic i64 0, {{.*}} release, align 8
100
108
101
109
__sync_synchronize ();
102
110
// CHECK: fence seq_cst
@@ -131,16 +139,25 @@ static _Atomic(int *) glob_pointer_from_int = 0;
131
139
_Atomic(int * ) nonstatic_glob_pointer_from_int = 0LL ;
132
140
static _Atomic int glob_int = 0 ;
133
141
static _Atomic float glob_flt = 0.0f ;
142
+ static _Atomic double glob_dbl = 0.0f ;
143
+ static _Atomic long double glob_longdbl = 0.0f ;
134
144
135
145
void force_global_uses (void ) {
146
+ // X86: %atomic-temp = alloca x86_fp80, align 16
136
147
(void )glob_pointer ;
137
148
// CHECK: load atomic ptr, ptr @[[GLOB_POINTER]] seq_cst
138
149
(void )glob_pointer_from_int ;
139
150
// CHECK-NEXT: load atomic ptr, ptr @[[GLOB_POINTER_FROM_INT]] seq_cst
140
151
(void )nonstatic_glob_pointer_from_int ;
141
152
// CHECK-NEXT: load atomic ptr, ptr @[[NONSTATIC_GLOB_POINTER_FROM_INT]] seq_cst
142
153
(void )glob_int ;
143
- // CHECK: load atomic i32, ptr @[[GLOB_INT]] seq_cst
154
+ // CHECK-NEXT : load atomic i32, ptr @[[GLOB_INT]] seq_cst
144
155
(void )glob_flt ;
145
- // CHECK: load atomic float, ptr @[[GLOB_FLT]] seq_cst
156
+ // CHECK-NEXT: load atomic float, ptr @[[GLOB_FLT]] seq_cst
157
+ (void )glob_dbl ;
158
+ // CHECK-NEXT: load atomic double, ptr @[[GLOB_DBL]] seq_cst
159
+ (void )glob_longdbl ;
160
+ // X86: call void @__atomic_load(i32 noundef 16, ptr noundef @glob_longdbl, ptr noundef %atomic-temp
161
+ // X86-NEXT: %0 = load x86_fp80, ptr %atomic-temp, align 16
162
+ // SYSTEMZ: load atomic fp128, ptr @[[GLOB_LONGDBL]] seq_cst
146
163
}
0 commit comments