DI: Require subprogram definitions to be distinct
[oota-llvm.git] / test / Instrumentation / ThreadSanitizer / atomic.ll
1 ; RUN: opt < %s -tsan -S | FileCheck %s
2 ; Check that atomic memory operations are converted to calls into ThreadSanitizer runtime.
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
4
5 define i8 @atomic8_load_unordered(i8* %a) nounwind uwtable {
6 entry:
7   %0 = load atomic i8, i8* %a unordered, align 1, !dbg !7
8   ret i8 %0, !dbg !7
9 }
10 ; CHECK-LABEL: atomic8_load_unordered
11 ; CHECK: call i8 @__tsan_atomic8_load(i8* %a, i32 0), !dbg
12
13 define i8 @atomic8_load_monotonic(i8* %a) nounwind uwtable {
14 entry:
15   %0 = load atomic i8, i8* %a monotonic, align 1, !dbg !7
16   ret i8 %0, !dbg !7
17 }
18 ; CHECK-LABEL: atomic8_load_monotonic
19 ; CHECK: call i8 @__tsan_atomic8_load(i8* %a, i32 0), !dbg
20
21 define i8 @atomic8_load_acquire(i8* %a) nounwind uwtable {
22 entry:
23   %0 = load atomic i8, i8* %a acquire, align 1, !dbg !7
24   ret i8 %0, !dbg !7
25 }
26 ; CHECK-LABEL: atomic8_load_acquire
27 ; CHECK: call i8 @__tsan_atomic8_load(i8* %a, i32 2), !dbg
28
29 define i8 @atomic8_load_seq_cst(i8* %a) nounwind uwtable {
30 entry:
31   %0 = load atomic i8, i8* %a seq_cst, align 1, !dbg !7
32   ret i8 %0, !dbg !7
33 }
34 ; CHECK-LABEL: atomic8_load_seq_cst
35 ; CHECK: call i8 @__tsan_atomic8_load(i8* %a, i32 5), !dbg
36
37 define void @atomic8_store_unordered(i8* %a) nounwind uwtable {
38 entry:
39   store atomic i8 0, i8* %a unordered, align 1, !dbg !7
40   ret void, !dbg !7
41 }
42 ; CHECK-LABEL: atomic8_store_unordered
43 ; CHECK: call void @__tsan_atomic8_store(i8* %a, i8 0, i32 0), !dbg
44
45 define void @atomic8_store_monotonic(i8* %a) nounwind uwtable {
46 entry:
47   store atomic i8 0, i8* %a monotonic, align 1, !dbg !7
48   ret void, !dbg !7
49 }
50 ; CHECK-LABEL: atomic8_store_monotonic
51 ; CHECK: call void @__tsan_atomic8_store(i8* %a, i8 0, i32 0), !dbg
52
53 define void @atomic8_store_release(i8* %a) nounwind uwtable {
54 entry:
55   store atomic i8 0, i8* %a release, align 1, !dbg !7
56   ret void, !dbg !7
57 }
58 ; CHECK-LABEL: atomic8_store_release
59 ; CHECK: call void @__tsan_atomic8_store(i8* %a, i8 0, i32 3), !dbg
60
61 define void @atomic8_store_seq_cst(i8* %a) nounwind uwtable {
62 entry:
63   store atomic i8 0, i8* %a seq_cst, align 1, !dbg !7
64   ret void, !dbg !7
65 }
66 ; CHECK-LABEL: atomic8_store_seq_cst
67 ; CHECK: call void @__tsan_atomic8_store(i8* %a, i8 0, i32 5), !dbg
68
69 define void @atomic8_xchg_monotonic(i8* %a) nounwind uwtable {
70 entry:
71   atomicrmw xchg i8* %a, i8 0 monotonic, !dbg !7
72   ret void, !dbg !7
73 }
74 ; CHECK-LABEL: atomic8_xchg_monotonic
75 ; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 0), !dbg
76
77 define void @atomic8_add_monotonic(i8* %a) nounwind uwtable {
78 entry:
79   atomicrmw add i8* %a, i8 0 monotonic, !dbg !7
80   ret void, !dbg !7
81 }
82 ; CHECK-LABEL: atomic8_add_monotonic
83 ; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 0), !dbg
84
85 define void @atomic8_sub_monotonic(i8* %a) nounwind uwtable {
86 entry:
87   atomicrmw sub i8* %a, i8 0 monotonic, !dbg !7
88   ret void, !dbg !7
89 }
90 ; CHECK-LABEL: atomic8_sub_monotonic
91 ; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 0), !dbg
92
93 define void @atomic8_and_monotonic(i8* %a) nounwind uwtable {
94 entry:
95   atomicrmw and i8* %a, i8 0 monotonic, !dbg !7
96   ret void, !dbg !7
97 }
98 ; CHECK-LABEL: atomic8_and_monotonic
99 ; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 0), !dbg
100
101 define void @atomic8_or_monotonic(i8* %a) nounwind uwtable {
102 entry:
103   atomicrmw or i8* %a, i8 0 monotonic, !dbg !7
104   ret void, !dbg !7
105 }
106 ; CHECK-LABEL: atomic8_or_monotonic
107 ; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 0), !dbg
108
109 define void @atomic8_xor_monotonic(i8* %a) nounwind uwtable {
110 entry:
111   atomicrmw xor i8* %a, i8 0 monotonic, !dbg !7
112   ret void, !dbg !7
113 }
114 ; CHECK-LABEL: atomic8_xor_monotonic
115 ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 0), !dbg
116
117 define void @atomic8_nand_monotonic(i8* %a) nounwind uwtable {
118 entry:
119   atomicrmw nand i8* %a, i8 0 monotonic, !dbg !7
120   ret void, !dbg !7
121 }
122 ; CHECK-LABEL: atomic8_nand_monotonic
123 ; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 0), !dbg
124
125 define void @atomic8_xchg_acquire(i8* %a) nounwind uwtable {
126 entry:
127   atomicrmw xchg i8* %a, i8 0 acquire, !dbg !7
128   ret void, !dbg !7
129 }
130 ; CHECK-LABEL: atomic8_xchg_acquire
131 ; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 2), !dbg
132
133 define void @atomic8_add_acquire(i8* %a) nounwind uwtable {
134 entry:
135   atomicrmw add i8* %a, i8 0 acquire, !dbg !7
136   ret void, !dbg !7
137 }
138 ; CHECK-LABEL: atomic8_add_acquire
139 ; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 2), !dbg
140
141 define void @atomic8_sub_acquire(i8* %a) nounwind uwtable {
142 entry:
143   atomicrmw sub i8* %a, i8 0 acquire, !dbg !7
144   ret void, !dbg !7
145 }
146 ; CHECK-LABEL: atomic8_sub_acquire
147 ; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 2), !dbg
148
149 define void @atomic8_and_acquire(i8* %a) nounwind uwtable {
150 entry:
151   atomicrmw and i8* %a, i8 0 acquire, !dbg !7
152   ret void, !dbg !7
153 }
154 ; CHECK-LABEL: atomic8_and_acquire
155 ; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 2), !dbg
156
157 define void @atomic8_or_acquire(i8* %a) nounwind uwtable {
158 entry:
159   atomicrmw or i8* %a, i8 0 acquire, !dbg !7
160   ret void, !dbg !7
161 }
162 ; CHECK-LABEL: atomic8_or_acquire
163 ; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 2), !dbg
164
165 define void @atomic8_xor_acquire(i8* %a) nounwind uwtable {
166 entry:
167   atomicrmw xor i8* %a, i8 0 acquire, !dbg !7
168   ret void, !dbg !7
169 }
170 ; CHECK-LABEL: atomic8_xor_acquire
171 ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 2), !dbg
172
173 define void @atomic8_nand_acquire(i8* %a) nounwind uwtable {
174 entry:
175   atomicrmw nand i8* %a, i8 0 acquire, !dbg !7
176   ret void, !dbg !7
177 }
178 ; CHECK-LABEL: atomic8_nand_acquire
179 ; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 2), !dbg
180
181 define void @atomic8_xchg_release(i8* %a) nounwind uwtable {
182 entry:
183   atomicrmw xchg i8* %a, i8 0 release, !dbg !7
184   ret void, !dbg !7
185 }
186 ; CHECK-LABEL: atomic8_xchg_release
187 ; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 3), !dbg
188
189 define void @atomic8_add_release(i8* %a) nounwind uwtable {
190 entry:
191   atomicrmw add i8* %a, i8 0 release, !dbg !7
192   ret void, !dbg !7
193 }
194 ; CHECK-LABEL: atomic8_add_release
195 ; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 3), !dbg
196
197 define void @atomic8_sub_release(i8* %a) nounwind uwtable {
198 entry:
199   atomicrmw sub i8* %a, i8 0 release, !dbg !7
200   ret void, !dbg !7
201 }
202 ; CHECK-LABEL: atomic8_sub_release
203 ; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 3), !dbg
204
205 define void @atomic8_and_release(i8* %a) nounwind uwtable {
206 entry:
207   atomicrmw and i8* %a, i8 0 release, !dbg !7
208   ret void, !dbg !7
209 }
210 ; CHECK-LABEL: atomic8_and_release
211 ; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 3), !dbg
212
213 define void @atomic8_or_release(i8* %a) nounwind uwtable {
214 entry:
215   atomicrmw or i8* %a, i8 0 release, !dbg !7
216   ret void, !dbg !7
217 }
218 ; CHECK-LABEL: atomic8_or_release
219 ; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 3), !dbg
220
221 define void @atomic8_xor_release(i8* %a) nounwind uwtable {
222 entry:
223   atomicrmw xor i8* %a, i8 0 release, !dbg !7
224   ret void, !dbg !7
225 }
226 ; CHECK-LABEL: atomic8_xor_release
227 ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 3), !dbg
228
229 define void @atomic8_nand_release(i8* %a) nounwind uwtable {
230 entry:
231   atomicrmw nand i8* %a, i8 0 release, !dbg !7
232   ret void, !dbg !7
233 }
234 ; CHECK-LABEL: atomic8_nand_release
235 ; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 3), !dbg
236
237 define void @atomic8_xchg_acq_rel(i8* %a) nounwind uwtable {
238 entry:
239   atomicrmw xchg i8* %a, i8 0 acq_rel, !dbg !7
240   ret void, !dbg !7
241 }
242 ; CHECK-LABEL: atomic8_xchg_acq_rel
243 ; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 4), !dbg
244
245 define void @atomic8_add_acq_rel(i8* %a) nounwind uwtable {
246 entry:
247   atomicrmw add i8* %a, i8 0 acq_rel, !dbg !7
248   ret void, !dbg !7
249 }
250 ; CHECK-LABEL: atomic8_add_acq_rel
251 ; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 4), !dbg
252
253 define void @atomic8_sub_acq_rel(i8* %a) nounwind uwtable {
254 entry:
255   atomicrmw sub i8* %a, i8 0 acq_rel, !dbg !7
256   ret void, !dbg !7
257 }
258 ; CHECK-LABEL: atomic8_sub_acq_rel
259 ; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 4), !dbg
260
261 define void @atomic8_and_acq_rel(i8* %a) nounwind uwtable {
262 entry:
263   atomicrmw and i8* %a, i8 0 acq_rel, !dbg !7
264   ret void, !dbg !7
265 }
266 ; CHECK-LABEL: atomic8_and_acq_rel
267 ; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 4), !dbg
268
269 define void @atomic8_or_acq_rel(i8* %a) nounwind uwtable {
270 entry:
271   atomicrmw or i8* %a, i8 0 acq_rel, !dbg !7
272   ret void, !dbg !7
273 }
274 ; CHECK-LABEL: atomic8_or_acq_rel
275 ; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 4), !dbg
276
277 define void @atomic8_xor_acq_rel(i8* %a) nounwind uwtable {
278 entry:
279   atomicrmw xor i8* %a, i8 0 acq_rel, !dbg !7
280   ret void, !dbg !7
281 }
282 ; CHECK-LABEL: atomic8_xor_acq_rel
283 ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 4), !dbg
284
285 define void @atomic8_nand_acq_rel(i8* %a) nounwind uwtable {
286 entry:
287   atomicrmw nand i8* %a, i8 0 acq_rel, !dbg !7
288   ret void, !dbg !7
289 }
290 ; CHECK-LABEL: atomic8_nand_acq_rel
291 ; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 4), !dbg
292
293 define void @atomic8_xchg_seq_cst(i8* %a) nounwind uwtable {
294 entry:
295   atomicrmw xchg i8* %a, i8 0 seq_cst, !dbg !7
296   ret void, !dbg !7
297 }
298 ; CHECK-LABEL: atomic8_xchg_seq_cst
299 ; CHECK: call i8 @__tsan_atomic8_exchange(i8* %a, i8 0, i32 5), !dbg
300
301 define void @atomic8_add_seq_cst(i8* %a) nounwind uwtable {
302 entry:
303   atomicrmw add i8* %a, i8 0 seq_cst, !dbg !7
304   ret void, !dbg !7
305 }
306 ; CHECK-LABEL: atomic8_add_seq_cst
307 ; CHECK: call i8 @__tsan_atomic8_fetch_add(i8* %a, i8 0, i32 5), !dbg
308
309 define void @atomic8_sub_seq_cst(i8* %a) nounwind uwtable {
310 entry:
311   atomicrmw sub i8* %a, i8 0 seq_cst, !dbg !7
312   ret void, !dbg !7
313 }
314 ; CHECK-LABEL: atomic8_sub_seq_cst
315 ; CHECK: call i8 @__tsan_atomic8_fetch_sub(i8* %a, i8 0, i32 5), !dbg
316
317 define void @atomic8_and_seq_cst(i8* %a) nounwind uwtable {
318 entry:
319   atomicrmw and i8* %a, i8 0 seq_cst, !dbg !7
320   ret void, !dbg !7
321 }
322 ; CHECK-LABEL: atomic8_and_seq_cst
323 ; CHECK: call i8 @__tsan_atomic8_fetch_and(i8* %a, i8 0, i32 5), !dbg
324
325 define void @atomic8_or_seq_cst(i8* %a) nounwind uwtable {
326 entry:
327   atomicrmw or i8* %a, i8 0 seq_cst, !dbg !7
328   ret void, !dbg !7
329 }
330 ; CHECK-LABEL: atomic8_or_seq_cst
331 ; CHECK: call i8 @__tsan_atomic8_fetch_or(i8* %a, i8 0, i32 5), !dbg
332
333 define void @atomic8_xor_seq_cst(i8* %a) nounwind uwtable {
334 entry:
335   atomicrmw xor i8* %a, i8 0 seq_cst, !dbg !7
336   ret void, !dbg !7
337 }
338 ; CHECK-LABEL: atomic8_xor_seq_cst
339 ; CHECK: call i8 @__tsan_atomic8_fetch_xor(i8* %a, i8 0, i32 5), !dbg
340
341 define void @atomic8_nand_seq_cst(i8* %a) nounwind uwtable {
342 entry:
343   atomicrmw nand i8* %a, i8 0 seq_cst, !dbg !7
344   ret void, !dbg !7
345 }
346 ; CHECK-LABEL: atomic8_nand_seq_cst
347 ; CHECK: call i8 @__tsan_atomic8_fetch_nand(i8* %a, i8 0, i32 5), !dbg
348
349 define void @atomic8_cas_monotonic(i8* %a) nounwind uwtable {
350 entry:
351   cmpxchg i8* %a, i8 0, i8 1 monotonic monotonic, !dbg !7
352   ret void, !dbg !7
353 }
354 ; CHECK-LABEL: atomic8_cas_monotonic
355 ; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 0, i32 0), !dbg
356
357 define void @atomic8_cas_acquire(i8* %a) nounwind uwtable {
358 entry:
359   cmpxchg i8* %a, i8 0, i8 1 acquire acquire, !dbg !7
360   ret void, !dbg !7
361 }
362 ; CHECK-LABEL: atomic8_cas_acquire
363 ; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 2, i32 2), !dbg
364
365 define void @atomic8_cas_release(i8* %a) nounwind uwtable {
366 entry:
367   cmpxchg i8* %a, i8 0, i8 1 release monotonic, !dbg !7
368   ret void, !dbg !7
369 }
370 ; CHECK-LABEL: atomic8_cas_release
371 ; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 3, i32 0), !dbg
372
373 define void @atomic8_cas_acq_rel(i8* %a) nounwind uwtable {
374 entry:
375   cmpxchg i8* %a, i8 0, i8 1 acq_rel acquire, !dbg !7
376   ret void, !dbg !7
377 }
378 ; CHECK-LABEL: atomic8_cas_acq_rel
379 ; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 4, i32 2), !dbg
380
381 define void @atomic8_cas_seq_cst(i8* %a) nounwind uwtable {
382 entry:
383   cmpxchg i8* %a, i8 0, i8 1 seq_cst seq_cst, !dbg !7
384   ret void, !dbg !7
385 }
386 ; CHECK-LABEL: atomic8_cas_seq_cst
387 ; CHECK: call i8 @__tsan_atomic8_compare_exchange_val(i8* %a, i8 0, i8 1, i32 5, i32 5), !dbg
388
389 define i16 @atomic16_load_unordered(i16* %a) nounwind uwtable {
390 entry:
391   %0 = load atomic i16, i16* %a unordered, align 2, !dbg !7
392   ret i16 %0, !dbg !7
393 }
394 ; CHECK-LABEL: atomic16_load_unordered
395 ; CHECK: call i16 @__tsan_atomic16_load(i16* %a, i32 0), !dbg
396
397 define i16 @atomic16_load_monotonic(i16* %a) nounwind uwtable {
398 entry:
399   %0 = load atomic i16, i16* %a monotonic, align 2, !dbg !7
400   ret i16 %0, !dbg !7
401 }
402 ; CHECK-LABEL: atomic16_load_monotonic
403 ; CHECK: call i16 @__tsan_atomic16_load(i16* %a, i32 0), !dbg
404
405 define i16 @atomic16_load_acquire(i16* %a) nounwind uwtable {
406 entry:
407   %0 = load atomic i16, i16* %a acquire, align 2, !dbg !7
408   ret i16 %0, !dbg !7
409 }
410 ; CHECK-LABEL: atomic16_load_acquire
411 ; CHECK: call i16 @__tsan_atomic16_load(i16* %a, i32 2), !dbg
412
413 define i16 @atomic16_load_seq_cst(i16* %a) nounwind uwtable {
414 entry:
415   %0 = load atomic i16, i16* %a seq_cst, align 2, !dbg !7
416   ret i16 %0, !dbg !7
417 }
418 ; CHECK-LABEL: atomic16_load_seq_cst
419 ; CHECK: call i16 @__tsan_atomic16_load(i16* %a, i32 5), !dbg
420
421 define void @atomic16_store_unordered(i16* %a) nounwind uwtable {
422 entry:
423   store atomic i16 0, i16* %a unordered, align 2, !dbg !7
424   ret void, !dbg !7
425 }
426 ; CHECK-LABEL: atomic16_store_unordered
427 ; CHECK: call void @__tsan_atomic16_store(i16* %a, i16 0, i32 0), !dbg
428
429 define void @atomic16_store_monotonic(i16* %a) nounwind uwtable {
430 entry:
431   store atomic i16 0, i16* %a monotonic, align 2, !dbg !7
432   ret void, !dbg !7
433 }
434 ; CHECK-LABEL: atomic16_store_monotonic
435 ; CHECK: call void @__tsan_atomic16_store(i16* %a, i16 0, i32 0), !dbg
436
437 define void @atomic16_store_release(i16* %a) nounwind uwtable {
438 entry:
439   store atomic i16 0, i16* %a release, align 2, !dbg !7
440   ret void, !dbg !7
441 }
442 ; CHECK-LABEL: atomic16_store_release
443 ; CHECK: call void @__tsan_atomic16_store(i16* %a, i16 0, i32 3), !dbg
444
445 define void @atomic16_store_seq_cst(i16* %a) nounwind uwtable {
446 entry:
447   store atomic i16 0, i16* %a seq_cst, align 2, !dbg !7
448   ret void, !dbg !7
449 }
450 ; CHECK-LABEL: atomic16_store_seq_cst
451 ; CHECK: call void @__tsan_atomic16_store(i16* %a, i16 0, i32 5), !dbg
452
453 define void @atomic16_xchg_monotonic(i16* %a) nounwind uwtable {
454 entry:
455   atomicrmw xchg i16* %a, i16 0 monotonic, !dbg !7
456   ret void, !dbg !7
457 }
458 ; CHECK-LABEL: atomic16_xchg_monotonic
459 ; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 0), !dbg
460
461 define void @atomic16_add_monotonic(i16* %a) nounwind uwtable {
462 entry:
463   atomicrmw add i16* %a, i16 0 monotonic, !dbg !7
464   ret void, !dbg !7
465 }
466 ; CHECK-LABEL: atomic16_add_monotonic
467 ; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 0), !dbg
468
469 define void @atomic16_sub_monotonic(i16* %a) nounwind uwtable {
470 entry:
471   atomicrmw sub i16* %a, i16 0 monotonic, !dbg !7
472   ret void, !dbg !7
473 }
474 ; CHECK-LABEL: atomic16_sub_monotonic
475 ; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 0), !dbg
476
477 define void @atomic16_and_monotonic(i16* %a) nounwind uwtable {
478 entry:
479   atomicrmw and i16* %a, i16 0 monotonic, !dbg !7
480   ret void, !dbg !7
481 }
482 ; CHECK-LABEL: atomic16_and_monotonic
483 ; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 0), !dbg
484
485 define void @atomic16_or_monotonic(i16* %a) nounwind uwtable {
486 entry:
487   atomicrmw or i16* %a, i16 0 monotonic, !dbg !7
488   ret void, !dbg !7
489 }
490 ; CHECK-LABEL: atomic16_or_monotonic
491 ; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 0), !dbg
492
493 define void @atomic16_xor_monotonic(i16* %a) nounwind uwtable {
494 entry:
495   atomicrmw xor i16* %a, i16 0 monotonic, !dbg !7
496   ret void, !dbg !7
497 }
498 ; CHECK-LABEL: atomic16_xor_monotonic
499 ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 0), !dbg
500
501 define void @atomic16_nand_monotonic(i16* %a) nounwind uwtable {
502 entry:
503   atomicrmw nand i16* %a, i16 0 monotonic, !dbg !7
504   ret void, !dbg !7
505 }
506 ; CHECK-LABEL: atomic16_nand_monotonic
507 ; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 0), !dbg
508
509 define void @atomic16_xchg_acquire(i16* %a) nounwind uwtable {
510 entry:
511   atomicrmw xchg i16* %a, i16 0 acquire, !dbg !7
512   ret void, !dbg !7
513 }
514 ; CHECK-LABEL: atomic16_xchg_acquire
515 ; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 2), !dbg
516
517 define void @atomic16_add_acquire(i16* %a) nounwind uwtable {
518 entry:
519   atomicrmw add i16* %a, i16 0 acquire, !dbg !7
520   ret void, !dbg !7
521 }
522 ; CHECK-LABEL: atomic16_add_acquire
523 ; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 2), !dbg
524
525 define void @atomic16_sub_acquire(i16* %a) nounwind uwtable {
526 entry:
527   atomicrmw sub i16* %a, i16 0 acquire, !dbg !7
528   ret void, !dbg !7
529 }
530 ; CHECK-LABEL: atomic16_sub_acquire
531 ; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 2), !dbg
532
533 define void @atomic16_and_acquire(i16* %a) nounwind uwtable {
534 entry:
535   atomicrmw and i16* %a, i16 0 acquire, !dbg !7
536   ret void, !dbg !7
537 }
538 ; CHECK-LABEL: atomic16_and_acquire
539 ; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 2), !dbg
540
541 define void @atomic16_or_acquire(i16* %a) nounwind uwtable {
542 entry:
543   atomicrmw or i16* %a, i16 0 acquire, !dbg !7
544   ret void, !dbg !7
545 }
546 ; CHECK-LABEL: atomic16_or_acquire
547 ; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 2), !dbg
548
549 define void @atomic16_xor_acquire(i16* %a) nounwind uwtable {
550 entry:
551   atomicrmw xor i16* %a, i16 0 acquire, !dbg !7
552   ret void, !dbg !7
553 }
554 ; CHECK-LABEL: atomic16_xor_acquire
555 ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 2), !dbg
556
557 define void @atomic16_nand_acquire(i16* %a) nounwind uwtable {
558 entry:
559   atomicrmw nand i16* %a, i16 0 acquire, !dbg !7
560   ret void, !dbg !7
561 }
562 ; CHECK-LABEL: atomic16_nand_acquire
563 ; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 2), !dbg
564
565 define void @atomic16_xchg_release(i16* %a) nounwind uwtable {
566 entry:
567   atomicrmw xchg i16* %a, i16 0 release, !dbg !7
568   ret void, !dbg !7
569 }
570 ; CHECK-LABEL: atomic16_xchg_release
571 ; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 3), !dbg
572
573 define void @atomic16_add_release(i16* %a) nounwind uwtable {
574 entry:
575   atomicrmw add i16* %a, i16 0 release, !dbg !7
576   ret void, !dbg !7
577 }
578 ; CHECK-LABEL: atomic16_add_release
579 ; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 3), !dbg
580
581 define void @atomic16_sub_release(i16* %a) nounwind uwtable {
582 entry:
583   atomicrmw sub i16* %a, i16 0 release, !dbg !7
584   ret void, !dbg !7
585 }
586 ; CHECK-LABEL: atomic16_sub_release
587 ; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 3), !dbg
588
589 define void @atomic16_and_release(i16* %a) nounwind uwtable {
590 entry:
591   atomicrmw and i16* %a, i16 0 release, !dbg !7
592   ret void, !dbg !7
593 }
594 ; CHECK-LABEL: atomic16_and_release
595 ; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 3), !dbg
596
597 define void @atomic16_or_release(i16* %a) nounwind uwtable {
598 entry:
599   atomicrmw or i16* %a, i16 0 release, !dbg !7
600   ret void, !dbg !7
601 }
602 ; CHECK-LABEL: atomic16_or_release
603 ; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 3), !dbg
604
605 define void @atomic16_xor_release(i16* %a) nounwind uwtable {
606 entry:
607   atomicrmw xor i16* %a, i16 0 release, !dbg !7
608   ret void, !dbg !7
609 }
610 ; CHECK-LABEL: atomic16_xor_release
611 ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 3), !dbg
612
613 define void @atomic16_nand_release(i16* %a) nounwind uwtable {
614 entry:
615   atomicrmw nand i16* %a, i16 0 release, !dbg !7
616   ret void, !dbg !7
617 }
618 ; CHECK-LABEL: atomic16_nand_release
619 ; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 3), !dbg
620
621 define void @atomic16_xchg_acq_rel(i16* %a) nounwind uwtable {
622 entry:
623   atomicrmw xchg i16* %a, i16 0 acq_rel, !dbg !7
624   ret void, !dbg !7
625 }
626 ; CHECK-LABEL: atomic16_xchg_acq_rel
627 ; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 4), !dbg
628
629 define void @atomic16_add_acq_rel(i16* %a) nounwind uwtable {
630 entry:
631   atomicrmw add i16* %a, i16 0 acq_rel, !dbg !7
632   ret void, !dbg !7
633 }
634 ; CHECK-LABEL: atomic16_add_acq_rel
635 ; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 4), !dbg
636
637 define void @atomic16_sub_acq_rel(i16* %a) nounwind uwtable {
638 entry:
639   atomicrmw sub i16* %a, i16 0 acq_rel, !dbg !7
640   ret void, !dbg !7
641 }
642 ; CHECK-LABEL: atomic16_sub_acq_rel
643 ; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 4), !dbg
644
645 define void @atomic16_and_acq_rel(i16* %a) nounwind uwtable {
646 entry:
647   atomicrmw and i16* %a, i16 0 acq_rel, !dbg !7
648   ret void, !dbg !7
649 }
650 ; CHECK-LABEL: atomic16_and_acq_rel
651 ; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 4), !dbg
652
653 define void @atomic16_or_acq_rel(i16* %a) nounwind uwtable {
654 entry:
655   atomicrmw or i16* %a, i16 0 acq_rel, !dbg !7
656   ret void, !dbg !7
657 }
658 ; CHECK-LABEL: atomic16_or_acq_rel
659 ; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 4), !dbg
660
661 define void @atomic16_xor_acq_rel(i16* %a) nounwind uwtable {
662 entry:
663   atomicrmw xor i16* %a, i16 0 acq_rel, !dbg !7
664   ret void, !dbg !7
665 }
666 ; CHECK-LABEL: atomic16_xor_acq_rel
667 ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 4), !dbg
668
669 define void @atomic16_nand_acq_rel(i16* %a) nounwind uwtable {
670 entry:
671   atomicrmw nand i16* %a, i16 0 acq_rel, !dbg !7
672   ret void, !dbg !7
673 }
674 ; CHECK-LABEL: atomic16_nand_acq_rel
675 ; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 4), !dbg
676
677 define void @atomic16_xchg_seq_cst(i16* %a) nounwind uwtable {
678 entry:
679   atomicrmw xchg i16* %a, i16 0 seq_cst, !dbg !7
680   ret void, !dbg !7
681 }
682 ; CHECK-LABEL: atomic16_xchg_seq_cst
683 ; CHECK: call i16 @__tsan_atomic16_exchange(i16* %a, i16 0, i32 5), !dbg
684
685 define void @atomic16_add_seq_cst(i16* %a) nounwind uwtable {
686 entry:
687   atomicrmw add i16* %a, i16 0 seq_cst, !dbg !7
688   ret void, !dbg !7
689 }
690 ; CHECK-LABEL: atomic16_add_seq_cst
691 ; CHECK: call i16 @__tsan_atomic16_fetch_add(i16* %a, i16 0, i32 5), !dbg
692
693 define void @atomic16_sub_seq_cst(i16* %a) nounwind uwtable {
694 entry:
695   atomicrmw sub i16* %a, i16 0 seq_cst, !dbg !7
696   ret void, !dbg !7
697 }
698 ; CHECK-LABEL: atomic16_sub_seq_cst
699 ; CHECK: call i16 @__tsan_atomic16_fetch_sub(i16* %a, i16 0, i32 5), !dbg
700
701 define void @atomic16_and_seq_cst(i16* %a) nounwind uwtable {
702 entry:
703   atomicrmw and i16* %a, i16 0 seq_cst, !dbg !7
704   ret void, !dbg !7
705 }
706 ; CHECK-LABEL: atomic16_and_seq_cst
707 ; CHECK: call i16 @__tsan_atomic16_fetch_and(i16* %a, i16 0, i32 5), !dbg
708
709 define void @atomic16_or_seq_cst(i16* %a) nounwind uwtable {
710 entry:
711   atomicrmw or i16* %a, i16 0 seq_cst, !dbg !7
712   ret void, !dbg !7
713 }
714 ; CHECK-LABEL: atomic16_or_seq_cst
715 ; CHECK: call i16 @__tsan_atomic16_fetch_or(i16* %a, i16 0, i32 5), !dbg
716
717 define void @atomic16_xor_seq_cst(i16* %a) nounwind uwtable {
718 entry:
719   atomicrmw xor i16* %a, i16 0 seq_cst, !dbg !7
720   ret void, !dbg !7
721 }
722 ; CHECK-LABEL: atomic16_xor_seq_cst
723 ; CHECK: call i16 @__tsan_atomic16_fetch_xor(i16* %a, i16 0, i32 5), !dbg
724
725 define void @atomic16_nand_seq_cst(i16* %a) nounwind uwtable {
726 entry:
727   atomicrmw nand i16* %a, i16 0 seq_cst, !dbg !7
728   ret void, !dbg !7
729 }
730 ; CHECK-LABEL: atomic16_nand_seq_cst
731 ; CHECK: call i16 @__tsan_atomic16_fetch_nand(i16* %a, i16 0, i32 5), !dbg
732
733 define void @atomic16_cas_monotonic(i16* %a) nounwind uwtable {
734 entry:
735   cmpxchg i16* %a, i16 0, i16 1 monotonic monotonic, !dbg !7
736   ret void, !dbg !7
737 }
738 ; CHECK-LABEL: atomic16_cas_monotonic
739 ; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 0, i32 0), !dbg
740
741 define void @atomic16_cas_acquire(i16* %a) nounwind uwtable {
742 entry:
743   cmpxchg i16* %a, i16 0, i16 1 acquire acquire, !dbg !7
744   ret void, !dbg !7
745 }
746 ; CHECK-LABEL: atomic16_cas_acquire
747 ; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 2, i32 2), !dbg
748
749 define void @atomic16_cas_release(i16* %a) nounwind uwtable {
750 entry:
751   cmpxchg i16* %a, i16 0, i16 1 release monotonic, !dbg !7
752   ret void, !dbg !7
753 }
754 ; CHECK-LABEL: atomic16_cas_release
755 ; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 3, i32 0), !dbg
756
757 define void @atomic16_cas_acq_rel(i16* %a) nounwind uwtable {
758 entry:
759   cmpxchg i16* %a, i16 0, i16 1 acq_rel acquire, !dbg !7
760   ret void, !dbg !7
761 }
762 ; CHECK-LABEL: atomic16_cas_acq_rel
763 ; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 4, i32 2), !dbg
764
765 define void @atomic16_cas_seq_cst(i16* %a) nounwind uwtable {
766 entry:
767   cmpxchg i16* %a, i16 0, i16 1 seq_cst seq_cst, !dbg !7
768   ret void, !dbg !7
769 }
770 ; CHECK-LABEL: atomic16_cas_seq_cst
771 ; CHECK: call i16 @__tsan_atomic16_compare_exchange_val(i16* %a, i16 0, i16 1, i32 5, i32 5), !dbg
772
773 define i32 @atomic32_load_unordered(i32* %a) nounwind uwtable {
774 entry:
775   %0 = load atomic i32, i32* %a unordered, align 4, !dbg !7
776   ret i32 %0, !dbg !7
777 }
778 ; CHECK-LABEL: atomic32_load_unordered
779 ; CHECK: call i32 @__tsan_atomic32_load(i32* %a, i32 0), !dbg
780
781 define i32 @atomic32_load_monotonic(i32* %a) nounwind uwtable {
782 entry:
783   %0 = load atomic i32, i32* %a monotonic, align 4, !dbg !7
784   ret i32 %0, !dbg !7
785 }
786 ; CHECK-LABEL: atomic32_load_monotonic
787 ; CHECK: call i32 @__tsan_atomic32_load(i32* %a, i32 0), !dbg
788
789 define i32 @atomic32_load_acquire(i32* %a) nounwind uwtable {
790 entry:
791   %0 = load atomic i32, i32* %a acquire, align 4, !dbg !7
792   ret i32 %0, !dbg !7
793 }
794 ; CHECK-LABEL: atomic32_load_acquire
795 ; CHECK: call i32 @__tsan_atomic32_load(i32* %a, i32 2), !dbg
796
797 define i32 @atomic32_load_seq_cst(i32* %a) nounwind uwtable {
798 entry:
799   %0 = load atomic i32, i32* %a seq_cst, align 4, !dbg !7
800   ret i32 %0, !dbg !7
801 }
802 ; CHECK-LABEL: atomic32_load_seq_cst
803 ; CHECK: call i32 @__tsan_atomic32_load(i32* %a, i32 5), !dbg
804
805 define void @atomic32_store_unordered(i32* %a) nounwind uwtable {
806 entry:
807   store atomic i32 0, i32* %a unordered, align 4, !dbg !7
808   ret void, !dbg !7
809 }
810 ; CHECK-LABEL: atomic32_store_unordered
811 ; CHECK: call void @__tsan_atomic32_store(i32* %a, i32 0, i32 0), !dbg
812
813 define void @atomic32_store_monotonic(i32* %a) nounwind uwtable {
814 entry:
815   store atomic i32 0, i32* %a monotonic, align 4, !dbg !7
816   ret void, !dbg !7
817 }
818 ; CHECK-LABEL: atomic32_store_monotonic
819 ; CHECK: call void @__tsan_atomic32_store(i32* %a, i32 0, i32 0), !dbg
820
821 define void @atomic32_store_release(i32* %a) nounwind uwtable {
822 entry:
823   store atomic i32 0, i32* %a release, align 4, !dbg !7
824   ret void, !dbg !7
825 }
826 ; CHECK-LABEL: atomic32_store_release
827 ; CHECK: call void @__tsan_atomic32_store(i32* %a, i32 0, i32 3), !dbg
828
829 define void @atomic32_store_seq_cst(i32* %a) nounwind uwtable {
830 entry:
831   store atomic i32 0, i32* %a seq_cst, align 4, !dbg !7
832   ret void, !dbg !7
833 }
834 ; CHECK-LABEL: atomic32_store_seq_cst
835 ; CHECK: call void @__tsan_atomic32_store(i32* %a, i32 0, i32 5), !dbg
836
837 define void @atomic32_xchg_monotonic(i32* %a) nounwind uwtable {
838 entry:
839   atomicrmw xchg i32* %a, i32 0 monotonic, !dbg !7
840   ret void, !dbg !7
841 }
842 ; CHECK-LABEL: atomic32_xchg_monotonic
843 ; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 0), !dbg
844
845 define void @atomic32_add_monotonic(i32* %a) nounwind uwtable {
846 entry:
847   atomicrmw add i32* %a, i32 0 monotonic, !dbg !7
848   ret void, !dbg !7
849 }
850 ; CHECK-LABEL: atomic32_add_monotonic
851 ; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 0), !dbg
852
853 define void @atomic32_sub_monotonic(i32* %a) nounwind uwtable {
854 entry:
855   atomicrmw sub i32* %a, i32 0 monotonic, !dbg !7
856   ret void, !dbg !7
857 }
858 ; CHECK-LABEL: atomic32_sub_monotonic
859 ; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 0), !dbg
860
861 define void @atomic32_and_monotonic(i32* %a) nounwind uwtable {
862 entry:
863   atomicrmw and i32* %a, i32 0 monotonic, !dbg !7
864   ret void, !dbg !7
865 }
866 ; CHECK-LABEL: atomic32_and_monotonic
867 ; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 0), !dbg
868
869 define void @atomic32_or_monotonic(i32* %a) nounwind uwtable {
870 entry:
871   atomicrmw or i32* %a, i32 0 monotonic, !dbg !7
872   ret void, !dbg !7
873 }
874 ; CHECK-LABEL: atomic32_or_monotonic
875 ; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 0), !dbg
876
877 define void @atomic32_xor_monotonic(i32* %a) nounwind uwtable {
878 entry:
879   atomicrmw xor i32* %a, i32 0 monotonic, !dbg !7
880   ret void, !dbg !7
881 }
882 ; CHECK-LABEL: atomic32_xor_monotonic
883 ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 0), !dbg
884
885 define void @atomic32_nand_monotonic(i32* %a) nounwind uwtable {
886 entry:
887   atomicrmw nand i32* %a, i32 0 monotonic, !dbg !7
888   ret void, !dbg !7
889 }
890 ; CHECK-LABEL: atomic32_nand_monotonic
891 ; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 0), !dbg
892
893 define void @atomic32_xchg_acquire(i32* %a) nounwind uwtable {
894 entry:
895   atomicrmw xchg i32* %a, i32 0 acquire, !dbg !7
896   ret void, !dbg !7
897 }
898 ; CHECK-LABEL: atomic32_xchg_acquire
899 ; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 2), !dbg
900
901 define void @atomic32_add_acquire(i32* %a) nounwind uwtable {
902 entry:
903   atomicrmw add i32* %a, i32 0 acquire, !dbg !7
904   ret void, !dbg !7
905 }
906 ; CHECK-LABEL: atomic32_add_acquire
907 ; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 2), !dbg
908
909 define void @atomic32_sub_acquire(i32* %a) nounwind uwtable {
910 entry:
911   atomicrmw sub i32* %a, i32 0 acquire, !dbg !7
912   ret void, !dbg !7
913 }
914 ; CHECK-LABEL: atomic32_sub_acquire
915 ; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 2), !dbg
916
917 define void @atomic32_and_acquire(i32* %a) nounwind uwtable {
918 entry:
919   atomicrmw and i32* %a, i32 0 acquire, !dbg !7
920   ret void, !dbg !7
921 }
922 ; CHECK-LABEL: atomic32_and_acquire
923 ; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 2), !dbg
924
925 define void @atomic32_or_acquire(i32* %a) nounwind uwtable {
926 entry:
927   atomicrmw or i32* %a, i32 0 acquire, !dbg !7
928   ret void, !dbg !7
929 }
930 ; CHECK-LABEL: atomic32_or_acquire
931 ; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 2), !dbg
932
933 define void @atomic32_xor_acquire(i32* %a) nounwind uwtable {
934 entry:
935   atomicrmw xor i32* %a, i32 0 acquire, !dbg !7
936   ret void, !dbg !7
937 }
938 ; CHECK-LABEL: atomic32_xor_acquire
939 ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 2), !dbg
940
941 define void @atomic32_nand_acquire(i32* %a) nounwind uwtable {
942 entry:
943   atomicrmw nand i32* %a, i32 0 acquire, !dbg !7
944   ret void, !dbg !7
945 }
946 ; CHECK-LABEL: atomic32_nand_acquire
947 ; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 2), !dbg
948
949 define void @atomic32_xchg_release(i32* %a) nounwind uwtable {
950 entry:
951   atomicrmw xchg i32* %a, i32 0 release, !dbg !7
952   ret void, !dbg !7
953 }
954 ; CHECK-LABEL: atomic32_xchg_release
955 ; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 3), !dbg
956
957 define void @atomic32_add_release(i32* %a) nounwind uwtable {
958 entry:
959   atomicrmw add i32* %a, i32 0 release, !dbg !7
960   ret void, !dbg !7
961 }
962 ; CHECK-LABEL: atomic32_add_release
963 ; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 3), !dbg
964
965 define void @atomic32_sub_release(i32* %a) nounwind uwtable {
966 entry:
967   atomicrmw sub i32* %a, i32 0 release, !dbg !7
968   ret void, !dbg !7
969 }
970 ; CHECK-LABEL: atomic32_sub_release
971 ; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 3), !dbg
972
973 define void @atomic32_and_release(i32* %a) nounwind uwtable {
974 entry:
975   atomicrmw and i32* %a, i32 0 release, !dbg !7
976   ret void, !dbg !7
977 }
978 ; CHECK-LABEL: atomic32_and_release
979 ; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 3), !dbg
980
981 define void @atomic32_or_release(i32* %a) nounwind uwtable {
982 entry:
983   atomicrmw or i32* %a, i32 0 release, !dbg !7
984   ret void, !dbg !7
985 }
986 ; CHECK-LABEL: atomic32_or_release
987 ; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 3), !dbg
988
989 define void @atomic32_xor_release(i32* %a) nounwind uwtable {
990 entry:
991   atomicrmw xor i32* %a, i32 0 release, !dbg !7
992   ret void, !dbg !7
993 }
994 ; CHECK-LABEL: atomic32_xor_release
995 ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 3), !dbg
996
997 define void @atomic32_nand_release(i32* %a) nounwind uwtable {
998 entry:
999   atomicrmw nand i32* %a, i32 0 release, !dbg !7
1000   ret void, !dbg !7
1001 }
1002 ; CHECK-LABEL: atomic32_nand_release
1003 ; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 3), !dbg
1004
1005 define void @atomic32_xchg_acq_rel(i32* %a) nounwind uwtable {
1006 entry:
1007   atomicrmw xchg i32* %a, i32 0 acq_rel, !dbg !7
1008   ret void, !dbg !7
1009 }
1010 ; CHECK-LABEL: atomic32_xchg_acq_rel
1011 ; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 4), !dbg
1012
1013 define void @atomic32_add_acq_rel(i32* %a) nounwind uwtable {
1014 entry:
1015   atomicrmw add i32* %a, i32 0 acq_rel, !dbg !7
1016   ret void, !dbg !7
1017 }
1018 ; CHECK-LABEL: atomic32_add_acq_rel
1019 ; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 4), !dbg
1020
1021 define void @atomic32_sub_acq_rel(i32* %a) nounwind uwtable {
1022 entry:
1023   atomicrmw sub i32* %a, i32 0 acq_rel, !dbg !7
1024   ret void, !dbg !7
1025 }
1026 ; CHECK-LABEL: atomic32_sub_acq_rel
1027 ; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 4), !dbg
1028
1029 define void @atomic32_and_acq_rel(i32* %a) nounwind uwtable {
1030 entry:
1031   atomicrmw and i32* %a, i32 0 acq_rel, !dbg !7
1032   ret void, !dbg !7
1033 }
1034 ; CHECK-LABEL: atomic32_and_acq_rel
1035 ; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 4), !dbg
1036
1037 define void @atomic32_or_acq_rel(i32* %a) nounwind uwtable {
1038 entry:
1039   atomicrmw or i32* %a, i32 0 acq_rel, !dbg !7
1040   ret void, !dbg !7
1041 }
1042 ; CHECK-LABEL: atomic32_or_acq_rel
1043 ; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 4), !dbg
1044
1045 define void @atomic32_xor_acq_rel(i32* %a) nounwind uwtable {
1046 entry:
1047   atomicrmw xor i32* %a, i32 0 acq_rel, !dbg !7
1048   ret void, !dbg !7
1049 }
1050 ; CHECK-LABEL: atomic32_xor_acq_rel
1051 ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 4), !dbg
1052
1053 define void @atomic32_nand_acq_rel(i32* %a) nounwind uwtable {
1054 entry:
1055   atomicrmw nand i32* %a, i32 0 acq_rel, !dbg !7
1056   ret void, !dbg !7
1057 }
1058 ; CHECK-LABEL: atomic32_nand_acq_rel
1059 ; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 4), !dbg
1060
1061 define void @atomic32_xchg_seq_cst(i32* %a) nounwind uwtable {
1062 entry:
1063   atomicrmw xchg i32* %a, i32 0 seq_cst, !dbg !7
1064   ret void, !dbg !7
1065 }
1066 ; CHECK-LABEL: atomic32_xchg_seq_cst
1067 ; CHECK: call i32 @__tsan_atomic32_exchange(i32* %a, i32 0, i32 5), !dbg
1068
1069 define void @atomic32_add_seq_cst(i32* %a) nounwind uwtable {
1070 entry:
1071   atomicrmw add i32* %a, i32 0 seq_cst, !dbg !7
1072   ret void, !dbg !7
1073 }
1074 ; CHECK-LABEL: atomic32_add_seq_cst
1075 ; CHECK: call i32 @__tsan_atomic32_fetch_add(i32* %a, i32 0, i32 5), !dbg
1076
1077 define void @atomic32_sub_seq_cst(i32* %a) nounwind uwtable {
1078 entry:
1079   atomicrmw sub i32* %a, i32 0 seq_cst, !dbg !7
1080   ret void, !dbg !7
1081 }
1082 ; CHECK-LABEL: atomic32_sub_seq_cst
1083 ; CHECK: call i32 @__tsan_atomic32_fetch_sub(i32* %a, i32 0, i32 5), !dbg
1084
1085 define void @atomic32_and_seq_cst(i32* %a) nounwind uwtable {
1086 entry:
1087   atomicrmw and i32* %a, i32 0 seq_cst, !dbg !7
1088   ret void, !dbg !7
1089 }
1090 ; CHECK-LABEL: atomic32_and_seq_cst
1091 ; CHECK: call i32 @__tsan_atomic32_fetch_and(i32* %a, i32 0, i32 5), !dbg
1092
1093 define void @atomic32_or_seq_cst(i32* %a) nounwind uwtable {
1094 entry:
1095   atomicrmw or i32* %a, i32 0 seq_cst, !dbg !7
1096   ret void, !dbg !7
1097 }
1098 ; CHECK-LABEL: atomic32_or_seq_cst
1099 ; CHECK: call i32 @__tsan_atomic32_fetch_or(i32* %a, i32 0, i32 5), !dbg
1100
1101 define void @atomic32_xor_seq_cst(i32* %a) nounwind uwtable {
1102 entry:
1103   atomicrmw xor i32* %a, i32 0 seq_cst, !dbg !7
1104   ret void, !dbg !7
1105 }
1106 ; CHECK-LABEL: atomic32_xor_seq_cst
1107 ; CHECK: call i32 @__tsan_atomic32_fetch_xor(i32* %a, i32 0, i32 5), !dbg
1108
1109 define void @atomic32_nand_seq_cst(i32* %a) nounwind uwtable {
1110 entry:
1111   atomicrmw nand i32* %a, i32 0 seq_cst, !dbg !7
1112   ret void, !dbg !7
1113 }
1114 ; CHECK-LABEL: atomic32_nand_seq_cst
1115 ; CHECK: call i32 @__tsan_atomic32_fetch_nand(i32* %a, i32 0, i32 5), !dbg
1116
1117 define void @atomic32_cas_monotonic(i32* %a) nounwind uwtable {
1118 entry:
1119   cmpxchg i32* %a, i32 0, i32 1 monotonic monotonic, !dbg !7
1120   ret void, !dbg !7
1121 }
1122 ; CHECK-LABEL: atomic32_cas_monotonic
1123 ; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 0, i32 0), !dbg
1124
1125 define void @atomic32_cas_acquire(i32* %a) nounwind uwtable {
1126 entry:
1127   cmpxchg i32* %a, i32 0, i32 1 acquire acquire, !dbg !7
1128   ret void, !dbg !7
1129 }
1130 ; CHECK-LABEL: atomic32_cas_acquire
1131 ; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 2, i32 2), !dbg
1132
1133 define void @atomic32_cas_release(i32* %a) nounwind uwtable {
1134 entry:
1135   cmpxchg i32* %a, i32 0, i32 1 release monotonic, !dbg !7
1136   ret void, !dbg !7
1137 }
1138 ; CHECK-LABEL: atomic32_cas_release
1139 ; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 3, i32 0), !dbg
1140
1141 define void @atomic32_cas_acq_rel(i32* %a) nounwind uwtable {
1142 entry:
1143   cmpxchg i32* %a, i32 0, i32 1 acq_rel acquire, !dbg !7
1144   ret void, !dbg !7
1145 }
1146 ; CHECK-LABEL: atomic32_cas_acq_rel
1147 ; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 4, i32 2), !dbg
1148
1149 define void @atomic32_cas_seq_cst(i32* %a) nounwind uwtable {
1150 entry:
1151   cmpxchg i32* %a, i32 0, i32 1 seq_cst seq_cst, !dbg !7
1152   ret void, !dbg !7
1153 }
1154 ; CHECK-LABEL: atomic32_cas_seq_cst
1155 ; CHECK: call i32 @__tsan_atomic32_compare_exchange_val(i32* %a, i32 0, i32 1, i32 5, i32 5), !dbg
1156
1157 define i64 @atomic64_load_unordered(i64* %a) nounwind uwtable {
1158 entry:
1159   %0 = load atomic i64, i64* %a unordered, align 8, !dbg !7
1160   ret i64 %0, !dbg !7
1161 }
1162 ; CHECK-LABEL: atomic64_load_unordered
1163 ; CHECK: call i64 @__tsan_atomic64_load(i64* %a, i32 0), !dbg
1164
1165 define i64 @atomic64_load_monotonic(i64* %a) nounwind uwtable {
1166 entry:
1167   %0 = load atomic i64, i64* %a monotonic, align 8, !dbg !7
1168   ret i64 %0, !dbg !7
1169 }
1170 ; CHECK-LABEL: atomic64_load_monotonic
1171 ; CHECK: call i64 @__tsan_atomic64_load(i64* %a, i32 0), !dbg
1172
1173 define i64 @atomic64_load_acquire(i64* %a) nounwind uwtable {
1174 entry:
1175   %0 = load atomic i64, i64* %a acquire, align 8, !dbg !7
1176   ret i64 %0, !dbg !7
1177 }
1178 ; CHECK-LABEL: atomic64_load_acquire
1179 ; CHECK: call i64 @__tsan_atomic64_load(i64* %a, i32 2), !dbg
1180
1181 define i64 @atomic64_load_seq_cst(i64* %a) nounwind uwtable {
1182 entry:
1183   %0 = load atomic i64, i64* %a seq_cst, align 8, !dbg !7
1184   ret i64 %0, !dbg !7
1185 }
1186 ; CHECK-LABEL: atomic64_load_seq_cst
1187 ; CHECK: call i64 @__tsan_atomic64_load(i64* %a, i32 5), !dbg
1188
1189 define void @atomic64_store_unordered(i64* %a) nounwind uwtable {
1190 entry:
1191   store atomic i64 0, i64* %a unordered, align 8, !dbg !7
1192   ret void, !dbg !7
1193 }
1194 ; CHECK-LABEL: atomic64_store_unordered
1195 ; CHECK: call void @__tsan_atomic64_store(i64* %a, i64 0, i32 0), !dbg
1196
1197 define void @atomic64_store_monotonic(i64* %a) nounwind uwtable {
1198 entry:
1199   store atomic i64 0, i64* %a monotonic, align 8, !dbg !7
1200   ret void, !dbg !7
1201 }
1202 ; CHECK-LABEL: atomic64_store_monotonic
1203 ; CHECK: call void @__tsan_atomic64_store(i64* %a, i64 0, i32 0), !dbg
1204
1205 define void @atomic64_store_release(i64* %a) nounwind uwtable {
1206 entry:
1207   store atomic i64 0, i64* %a release, align 8, !dbg !7
1208   ret void, !dbg !7
1209 }
1210 ; CHECK-LABEL: atomic64_store_release
1211 ; CHECK: call void @__tsan_atomic64_store(i64* %a, i64 0, i32 3), !dbg
1212
1213 define void @atomic64_store_seq_cst(i64* %a) nounwind uwtable {
1214 entry:
1215   store atomic i64 0, i64* %a seq_cst, align 8, !dbg !7
1216   ret void, !dbg !7
1217 }
1218 ; CHECK-LABEL: atomic64_store_seq_cst
1219 ; CHECK: call void @__tsan_atomic64_store(i64* %a, i64 0, i32 5), !dbg
1220
1221 define void @atomic64_xchg_monotonic(i64* %a) nounwind uwtable {
1222 entry:
1223   atomicrmw xchg i64* %a, i64 0 monotonic, !dbg !7
1224   ret void, !dbg !7
1225 }
1226 ; CHECK-LABEL: atomic64_xchg_monotonic
1227 ; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 0), !dbg
1228
1229 define void @atomic64_add_monotonic(i64* %a) nounwind uwtable {
1230 entry:
1231   atomicrmw add i64* %a, i64 0 monotonic, !dbg !7
1232   ret void, !dbg !7
1233 }
1234 ; CHECK-LABEL: atomic64_add_monotonic
1235 ; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 0), !dbg
1236
1237 define void @atomic64_sub_monotonic(i64* %a) nounwind uwtable {
1238 entry:
1239   atomicrmw sub i64* %a, i64 0 monotonic, !dbg !7
1240   ret void, !dbg !7
1241 }
1242 ; CHECK-LABEL: atomic64_sub_monotonic
1243 ; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 0), !dbg
1244
1245 define void @atomic64_and_monotonic(i64* %a) nounwind uwtable {
1246 entry:
1247   atomicrmw and i64* %a, i64 0 monotonic, !dbg !7
1248   ret void, !dbg !7
1249 }
1250 ; CHECK-LABEL: atomic64_and_monotonic
1251 ; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 0), !dbg
1252
1253 define void @atomic64_or_monotonic(i64* %a) nounwind uwtable {
1254 entry:
1255   atomicrmw or i64* %a, i64 0 monotonic, !dbg !7
1256   ret void, !dbg !7
1257 }
1258 ; CHECK-LABEL: atomic64_or_monotonic
1259 ; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 0), !dbg
1260
1261 define void @atomic64_xor_monotonic(i64* %a) nounwind uwtable {
1262 entry:
1263   atomicrmw xor i64* %a, i64 0 monotonic, !dbg !7
1264   ret void, !dbg !7
1265 }
1266 ; CHECK-LABEL: atomic64_xor_monotonic
1267 ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 0), !dbg
1268
1269 define void @atomic64_nand_monotonic(i64* %a) nounwind uwtable {
1270 entry:
1271   atomicrmw nand i64* %a, i64 0 monotonic, !dbg !7
1272   ret void, !dbg !7
1273 }
1274 ; CHECK-LABEL: atomic64_nand_monotonic
1275 ; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 0), !dbg
1276
1277 define void @atomic64_xchg_acquire(i64* %a) nounwind uwtable {
1278 entry:
1279   atomicrmw xchg i64* %a, i64 0 acquire, !dbg !7
1280   ret void, !dbg !7
1281 }
1282 ; CHECK-LABEL: atomic64_xchg_acquire
1283 ; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 2), !dbg
1284
1285 define void @atomic64_add_acquire(i64* %a) nounwind uwtable {
1286 entry:
1287   atomicrmw add i64* %a, i64 0 acquire, !dbg !7
1288   ret void, !dbg !7
1289 }
1290 ; CHECK-LABEL: atomic64_add_acquire
1291 ; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 2), !dbg
1292
1293 define void @atomic64_sub_acquire(i64* %a) nounwind uwtable {
1294 entry:
1295   atomicrmw sub i64* %a, i64 0 acquire, !dbg !7
1296   ret void, !dbg !7
1297 }
1298 ; CHECK-LABEL: atomic64_sub_acquire
1299 ; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 2), !dbg
1300
1301 define void @atomic64_and_acquire(i64* %a) nounwind uwtable {
1302 entry:
1303   atomicrmw and i64* %a, i64 0 acquire, !dbg !7
1304   ret void, !dbg !7
1305 }
1306 ; CHECK-LABEL: atomic64_and_acquire
1307 ; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 2), !dbg
1308
1309 define void @atomic64_or_acquire(i64* %a) nounwind uwtable {
1310 entry:
1311   atomicrmw or i64* %a, i64 0 acquire, !dbg !7
1312   ret void, !dbg !7
1313 }
1314 ; CHECK-LABEL: atomic64_or_acquire
1315 ; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 2), !dbg
1316
1317 define void @atomic64_xor_acquire(i64* %a) nounwind uwtable {
1318 entry:
1319   atomicrmw xor i64* %a, i64 0 acquire, !dbg !7
1320   ret void, !dbg !7
1321 }
1322 ; CHECK-LABEL: atomic64_xor_acquire
1323 ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 2), !dbg
1324
1325 define void @atomic64_nand_acquire(i64* %a) nounwind uwtable {
1326 entry:
1327   atomicrmw nand i64* %a, i64 0 acquire, !dbg !7
1328   ret void, !dbg !7
1329 }
1330 ; CHECK-LABEL: atomic64_nand_acquire
1331 ; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 2), !dbg
1332
1333 define void @atomic64_xchg_release(i64* %a) nounwind uwtable {
1334 entry:
1335   atomicrmw xchg i64* %a, i64 0 release, !dbg !7
1336   ret void, !dbg !7
1337 }
1338 ; CHECK-LABEL: atomic64_xchg_release
1339 ; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 3), !dbg
1340
1341 define void @atomic64_add_release(i64* %a) nounwind uwtable {
1342 entry:
1343   atomicrmw add i64* %a, i64 0 release, !dbg !7
1344   ret void, !dbg !7
1345 }
1346 ; CHECK-LABEL: atomic64_add_release
1347 ; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 3), !dbg
1348
1349 define void @atomic64_sub_release(i64* %a) nounwind uwtable {
1350 entry:
1351   atomicrmw sub i64* %a, i64 0 release, !dbg !7
1352   ret void, !dbg !7
1353 }
1354 ; CHECK-LABEL: atomic64_sub_release
1355 ; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 3), !dbg
1356
1357 define void @atomic64_and_release(i64* %a) nounwind uwtable {
1358 entry:
1359   atomicrmw and i64* %a, i64 0 release, !dbg !7
1360   ret void, !dbg !7
1361 }
1362 ; CHECK-LABEL: atomic64_and_release
1363 ; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 3), !dbg
1364
1365 define void @atomic64_or_release(i64* %a) nounwind uwtable {
1366 entry:
1367   atomicrmw or i64* %a, i64 0 release, !dbg !7
1368   ret void, !dbg !7
1369 }
1370 ; CHECK-LABEL: atomic64_or_release
1371 ; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 3), !dbg
1372
1373 define void @atomic64_xor_release(i64* %a) nounwind uwtable {
1374 entry:
1375   atomicrmw xor i64* %a, i64 0 release, !dbg !7
1376   ret void, !dbg !7
1377 }
1378 ; CHECK-LABEL: atomic64_xor_release
1379 ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 3), !dbg
1380
1381 define void @atomic64_nand_release(i64* %a) nounwind uwtable {
1382 entry:
1383   atomicrmw nand i64* %a, i64 0 release, !dbg !7
1384   ret void, !dbg !7
1385 }
1386 ; CHECK-LABEL: atomic64_nand_release
1387 ; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 3), !dbg
1388
1389 define void @atomic64_xchg_acq_rel(i64* %a) nounwind uwtable {
1390 entry:
1391   atomicrmw xchg i64* %a, i64 0 acq_rel, !dbg !7
1392   ret void, !dbg !7
1393 }
1394 ; CHECK-LABEL: atomic64_xchg_acq_rel
1395 ; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 4), !dbg
1396
1397 define void @atomic64_add_acq_rel(i64* %a) nounwind uwtable {
1398 entry:
1399   atomicrmw add i64* %a, i64 0 acq_rel, !dbg !7
1400   ret void, !dbg !7
1401 }
1402 ; CHECK-LABEL: atomic64_add_acq_rel
1403 ; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 4), !dbg
1404
1405 define void @atomic64_sub_acq_rel(i64* %a) nounwind uwtable {
1406 entry:
1407   atomicrmw sub i64* %a, i64 0 acq_rel, !dbg !7
1408   ret void, !dbg !7
1409 }
1410 ; CHECK-LABEL: atomic64_sub_acq_rel
1411 ; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 4), !dbg
1412
1413 define void @atomic64_and_acq_rel(i64* %a) nounwind uwtable {
1414 entry:
1415   atomicrmw and i64* %a, i64 0 acq_rel, !dbg !7
1416   ret void, !dbg !7
1417 }
1418 ; CHECK-LABEL: atomic64_and_acq_rel
1419 ; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 4), !dbg
1420
1421 define void @atomic64_or_acq_rel(i64* %a) nounwind uwtable {
1422 entry:
1423   atomicrmw or i64* %a, i64 0 acq_rel, !dbg !7
1424   ret void, !dbg !7
1425 }
1426 ; CHECK-LABEL: atomic64_or_acq_rel
1427 ; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 4), !dbg
1428
1429 define void @atomic64_xor_acq_rel(i64* %a) nounwind uwtable {
1430 entry:
1431   atomicrmw xor i64* %a, i64 0 acq_rel, !dbg !7
1432   ret void, !dbg !7
1433 }
1434 ; CHECK-LABEL: atomic64_xor_acq_rel
1435 ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 4), !dbg
1436
1437 define void @atomic64_nand_acq_rel(i64* %a) nounwind uwtable {
1438 entry:
1439   atomicrmw nand i64* %a, i64 0 acq_rel, !dbg !7
1440   ret void, !dbg !7
1441 }
1442 ; CHECK-LABEL: atomic64_nand_acq_rel
1443 ; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 4), !dbg
1444
1445 define void @atomic64_xchg_seq_cst(i64* %a) nounwind uwtable {
1446 entry:
1447   atomicrmw xchg i64* %a, i64 0 seq_cst, !dbg !7
1448   ret void, !dbg !7
1449 }
1450 ; CHECK-LABEL: atomic64_xchg_seq_cst
1451 ; CHECK: call i64 @__tsan_atomic64_exchange(i64* %a, i64 0, i32 5), !dbg
1452
1453 define void @atomic64_add_seq_cst(i64* %a) nounwind uwtable {
1454 entry:
1455   atomicrmw add i64* %a, i64 0 seq_cst, !dbg !7
1456   ret void, !dbg !7
1457 }
1458 ; CHECK-LABEL: atomic64_add_seq_cst
1459 ; CHECK: call i64 @__tsan_atomic64_fetch_add(i64* %a, i64 0, i32 5), !dbg
1460
1461 define void @atomic64_sub_seq_cst(i64* %a) nounwind uwtable {
1462 entry:
1463   atomicrmw sub i64* %a, i64 0 seq_cst, !dbg !7
1464   ret void, !dbg !7
1465 }
1466 ; CHECK-LABEL: atomic64_sub_seq_cst
1467 ; CHECK: call i64 @__tsan_atomic64_fetch_sub(i64* %a, i64 0, i32 5), !dbg
1468
1469 define void @atomic64_and_seq_cst(i64* %a) nounwind uwtable {
1470 entry:
1471   atomicrmw and i64* %a, i64 0 seq_cst, !dbg !7
1472   ret void, !dbg !7
1473 }
1474 ; CHECK-LABEL: atomic64_and_seq_cst
1475 ; CHECK: call i64 @__tsan_atomic64_fetch_and(i64* %a, i64 0, i32 5), !dbg
1476
1477 define void @atomic64_or_seq_cst(i64* %a) nounwind uwtable {
1478 entry:
1479   atomicrmw or i64* %a, i64 0 seq_cst, !dbg !7
1480   ret void, !dbg !7
1481 }
1482 ; CHECK-LABEL: atomic64_or_seq_cst
1483 ; CHECK: call i64 @__tsan_atomic64_fetch_or(i64* %a, i64 0, i32 5), !dbg
1484
1485 define void @atomic64_xor_seq_cst(i64* %a) nounwind uwtable {
1486 entry:
1487   atomicrmw xor i64* %a, i64 0 seq_cst, !dbg !7
1488   ret void, !dbg !7
1489 }
1490 ; CHECK-LABEL: atomic64_xor_seq_cst
1491 ; CHECK: call i64 @__tsan_atomic64_fetch_xor(i64* %a, i64 0, i32 5), !dbg
1492
1493 define void @atomic64_nand_seq_cst(i64* %a) nounwind uwtable {
1494 entry:
1495   atomicrmw nand i64* %a, i64 0 seq_cst, !dbg !7
1496   ret void, !dbg !7
1497 }
1498 ; CHECK-LABEL: atomic64_nand_seq_cst
1499 ; CHECK: call i64 @__tsan_atomic64_fetch_nand(i64* %a, i64 0, i32 5), !dbg
1500
1501 define void @atomic64_cas_monotonic(i64* %a) nounwind uwtable {
1502 entry:
1503   cmpxchg i64* %a, i64 0, i64 1 monotonic monotonic, !dbg !7
1504   ret void, !dbg !7
1505 }
1506 ; CHECK-LABEL: atomic64_cas_monotonic
1507 ; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 0, i32 0), !dbg
1508
1509 define void @atomic64_cas_acquire(i64* %a) nounwind uwtable {
1510 entry:
1511   cmpxchg i64* %a, i64 0, i64 1 acquire acquire, !dbg !7
1512   ret void, !dbg !7
1513 }
1514 ; CHECK-LABEL: atomic64_cas_acquire
1515 ; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 2, i32 2), !dbg
1516
1517 define void @atomic64_cas_release(i64* %a) nounwind uwtable {
1518 entry:
1519   cmpxchg i64* %a, i64 0, i64 1 release monotonic, !dbg !7
1520   ret void, !dbg !7
1521 }
1522 ; CHECK-LABEL: atomic64_cas_release
1523 ; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 3, i32 0), !dbg
1524
1525 define void @atomic64_cas_acq_rel(i64* %a) nounwind uwtable {
1526 entry:
1527   cmpxchg i64* %a, i64 0, i64 1 acq_rel acquire, !dbg !7
1528   ret void, !dbg !7
1529 }
1530 ; CHECK-LABEL: atomic64_cas_acq_rel
1531 ; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 4, i32 2), !dbg
1532
1533 define void @atomic64_cas_seq_cst(i64* %a) nounwind uwtable {
1534 entry:
1535   cmpxchg i64* %a, i64 0, i64 1 seq_cst seq_cst, !dbg !7
1536   ret void, !dbg !7
1537 }
1538 ; CHECK-LABEL: atomic64_cas_seq_cst
1539 ; CHECK: call i64 @__tsan_atomic64_compare_exchange_val(i64* %a, i64 0, i64 1, i32 5, i32 5), !dbg
1540
1541 define i128 @atomic128_load_unordered(i128* %a) nounwind uwtable {
1542 entry:
1543   %0 = load atomic i128, i128* %a unordered, align 16, !dbg !7
1544   ret i128 %0, !dbg !7
1545 }
1546 ; CHECK-LABEL: atomic128_load_unordered
1547 ; CHECK: call i128 @__tsan_atomic128_load(i128* %a, i32 0), !dbg
1548
1549 define i128 @atomic128_load_monotonic(i128* %a) nounwind uwtable {
1550 entry:
1551   %0 = load atomic i128, i128* %a monotonic, align 16, !dbg !7
1552   ret i128 %0, !dbg !7
1553 }
1554 ; CHECK-LABEL: atomic128_load_monotonic
1555 ; CHECK: call i128 @__tsan_atomic128_load(i128* %a, i32 0), !dbg
1556
1557 define i128 @atomic128_load_acquire(i128* %a) nounwind uwtable {
1558 entry:
1559   %0 = load atomic i128, i128* %a acquire, align 16, !dbg !7
1560   ret i128 %0, !dbg !7
1561 }
1562 ; CHECK-LABEL: atomic128_load_acquire
1563 ; CHECK: call i128 @__tsan_atomic128_load(i128* %a, i32 2), !dbg
1564
1565 define i128 @atomic128_load_seq_cst(i128* %a) nounwind uwtable {
1566 entry:
1567   %0 = load atomic i128, i128* %a seq_cst, align 16, !dbg !7
1568   ret i128 %0, !dbg !7
1569 }
1570 ; CHECK-LABEL: atomic128_load_seq_cst
1571 ; CHECK: call i128 @__tsan_atomic128_load(i128* %a, i32 5), !dbg
1572
1573 define void @atomic128_store_unordered(i128* %a) nounwind uwtable {
1574 entry:
1575   store atomic i128 0, i128* %a unordered, align 16, !dbg !7
1576   ret void, !dbg !7
1577 }
1578 ; CHECK-LABEL: atomic128_store_unordered
1579 ; CHECK: call void @__tsan_atomic128_store(i128* %a, i128 0, i32 0), !dbg
1580
1581 define void @atomic128_store_monotonic(i128* %a) nounwind uwtable {
1582 entry:
1583   store atomic i128 0, i128* %a monotonic, align 16, !dbg !7
1584   ret void, !dbg !7
1585 }
1586 ; CHECK-LABEL: atomic128_store_monotonic
1587 ; CHECK: call void @__tsan_atomic128_store(i128* %a, i128 0, i32 0), !dbg
1588
1589 define void @atomic128_store_release(i128* %a) nounwind uwtable {
1590 entry:
1591   store atomic i128 0, i128* %a release, align 16, !dbg !7
1592   ret void, !dbg !7
1593 }
1594 ; CHECK-LABEL: atomic128_store_release
1595 ; CHECK: call void @__tsan_atomic128_store(i128* %a, i128 0, i32 3), !dbg
1596
1597 define void @atomic128_store_seq_cst(i128* %a) nounwind uwtable {
1598 entry:
1599   store atomic i128 0, i128* %a seq_cst, align 16, !dbg !7
1600   ret void, !dbg !7
1601 }
1602 ; CHECK-LABEL: atomic128_store_seq_cst
1603 ; CHECK: call void @__tsan_atomic128_store(i128* %a, i128 0, i32 5), !dbg
1604
1605 define void @atomic128_xchg_monotonic(i128* %a) nounwind uwtable {
1606 entry:
1607   atomicrmw xchg i128* %a, i128 0 monotonic, !dbg !7
1608   ret void, !dbg !7
1609 }
1610 ; CHECK-LABEL: atomic128_xchg_monotonic
1611 ; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 0), !dbg
1612
1613 define void @atomic128_add_monotonic(i128* %a) nounwind uwtable {
1614 entry:
1615   atomicrmw add i128* %a, i128 0 monotonic, !dbg !7
1616   ret void, !dbg !7
1617 }
1618 ; CHECK-LABEL: atomic128_add_monotonic
1619 ; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 0), !dbg
1620
1621 define void @atomic128_sub_monotonic(i128* %a) nounwind uwtable {
1622 entry:
1623   atomicrmw sub i128* %a, i128 0 monotonic, !dbg !7
1624   ret void, !dbg !7
1625 }
1626 ; CHECK-LABEL: atomic128_sub_monotonic
1627 ; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 0), !dbg
1628
1629 define void @atomic128_and_monotonic(i128* %a) nounwind uwtable {
1630 entry:
1631   atomicrmw and i128* %a, i128 0 monotonic, !dbg !7
1632   ret void, !dbg !7
1633 }
1634 ; CHECK-LABEL: atomic128_and_monotonic
1635 ; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 0), !dbg
1636
1637 define void @atomic128_or_monotonic(i128* %a) nounwind uwtable {
1638 entry:
1639   atomicrmw or i128* %a, i128 0 monotonic, !dbg !7
1640   ret void, !dbg !7
1641 }
1642 ; CHECK-LABEL: atomic128_or_monotonic
1643 ; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 0), !dbg
1644
1645 define void @atomic128_xor_monotonic(i128* %a) nounwind uwtable {
1646 entry:
1647   atomicrmw xor i128* %a, i128 0 monotonic, !dbg !7
1648   ret void, !dbg !7
1649 }
1650 ; CHECK-LABEL: atomic128_xor_monotonic
1651 ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 0), !dbg
1652
1653 define void @atomic128_nand_monotonic(i128* %a) nounwind uwtable {
1654 entry:
1655   atomicrmw nand i128* %a, i128 0 monotonic, !dbg !7
1656   ret void, !dbg !7
1657 }
1658 ; CHECK-LABEL: atomic128_nand_monotonic
1659 ; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 0), !dbg
1660
1661 define void @atomic128_xchg_acquire(i128* %a) nounwind uwtable {
1662 entry:
1663   atomicrmw xchg i128* %a, i128 0 acquire, !dbg !7
1664   ret void, !dbg !7
1665 }
1666 ; CHECK-LABEL: atomic128_xchg_acquire
1667 ; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 2), !dbg
1668
1669 define void @atomic128_add_acquire(i128* %a) nounwind uwtable {
1670 entry:
1671   atomicrmw add i128* %a, i128 0 acquire, !dbg !7
1672   ret void, !dbg !7
1673 }
1674 ; CHECK-LABEL: atomic128_add_acquire
1675 ; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 2), !dbg
1676
1677 define void @atomic128_sub_acquire(i128* %a) nounwind uwtable {
1678 entry:
1679   atomicrmw sub i128* %a, i128 0 acquire, !dbg !7
1680   ret void, !dbg !7
1681 }
1682 ; CHECK-LABEL: atomic128_sub_acquire
1683 ; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 2), !dbg
1684
1685 define void @atomic128_and_acquire(i128* %a) nounwind uwtable {
1686 entry:
1687   atomicrmw and i128* %a, i128 0 acquire, !dbg !7
1688   ret void, !dbg !7
1689 }
1690 ; CHECK-LABEL: atomic128_and_acquire
1691 ; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 2), !dbg
1692
1693 define void @atomic128_or_acquire(i128* %a) nounwind uwtable {
1694 entry:
1695   atomicrmw or i128* %a, i128 0 acquire, !dbg !7
1696   ret void, !dbg !7
1697 }
1698 ; CHECK-LABEL: atomic128_or_acquire
1699 ; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 2), !dbg
1700
1701 define void @atomic128_xor_acquire(i128* %a) nounwind uwtable {
1702 entry:
1703   atomicrmw xor i128* %a, i128 0 acquire, !dbg !7
1704   ret void, !dbg !7
1705 }
1706 ; CHECK-LABEL: atomic128_xor_acquire
1707 ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 2), !dbg
1708
1709 define void @atomic128_nand_acquire(i128* %a) nounwind uwtable {
1710 entry:
1711   atomicrmw nand i128* %a, i128 0 acquire, !dbg !7
1712   ret void, !dbg !7
1713 }
1714 ; CHECK-LABEL: atomic128_nand_acquire
1715 ; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 2), !dbg
1716
1717 define void @atomic128_xchg_release(i128* %a) nounwind uwtable {
1718 entry:
1719   atomicrmw xchg i128* %a, i128 0 release, !dbg !7
1720   ret void, !dbg !7
1721 }
1722 ; CHECK-LABEL: atomic128_xchg_release
1723 ; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 3), !dbg
1724
1725 define void @atomic128_add_release(i128* %a) nounwind uwtable {
1726 entry:
1727   atomicrmw add i128* %a, i128 0 release, !dbg !7
1728   ret void, !dbg !7
1729 }
1730 ; CHECK-LABEL: atomic128_add_release
1731 ; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 3), !dbg
1732
1733 define void @atomic128_sub_release(i128* %a) nounwind uwtable {
1734 entry:
1735   atomicrmw sub i128* %a, i128 0 release, !dbg !7
1736   ret void, !dbg !7
1737 }
1738 ; CHECK-LABEL: atomic128_sub_release
1739 ; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 3), !dbg
1740
1741 define void @atomic128_and_release(i128* %a) nounwind uwtable {
1742 entry:
1743   atomicrmw and i128* %a, i128 0 release, !dbg !7
1744   ret void, !dbg !7
1745 }
1746 ; CHECK-LABEL: atomic128_and_release
1747 ; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 3), !dbg
1748
1749 define void @atomic128_or_release(i128* %a) nounwind uwtable {
1750 entry:
1751   atomicrmw or i128* %a, i128 0 release, !dbg !7
1752   ret void, !dbg !7
1753 }
1754 ; CHECK-LABEL: atomic128_or_release
1755 ; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 3), !dbg
1756
1757 define void @atomic128_xor_release(i128* %a) nounwind uwtable {
1758 entry:
1759   atomicrmw xor i128* %a, i128 0 release, !dbg !7
1760   ret void, !dbg !7
1761 }
1762 ; CHECK-LABEL: atomic128_xor_release
1763 ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 3), !dbg
1764
1765 define void @atomic128_nand_release(i128* %a) nounwind uwtable {
1766 entry:
1767   atomicrmw nand i128* %a, i128 0 release, !dbg !7
1768   ret void, !dbg !7
1769 }
1770 ; CHECK-LABEL: atomic128_nand_release
1771 ; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 3), !dbg
1772
1773 define void @atomic128_xchg_acq_rel(i128* %a) nounwind uwtable {
1774 entry:
1775   atomicrmw xchg i128* %a, i128 0 acq_rel, !dbg !7
1776   ret void, !dbg !7
1777 }
1778 ; CHECK-LABEL: atomic128_xchg_acq_rel
1779 ; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 4), !dbg
1780
1781 define void @atomic128_add_acq_rel(i128* %a) nounwind uwtable {
1782 entry:
1783   atomicrmw add i128* %a, i128 0 acq_rel, !dbg !7
1784   ret void, !dbg !7
1785 }
1786 ; CHECK-LABEL: atomic128_add_acq_rel
1787 ; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 4), !dbg
1788
1789 define void @atomic128_sub_acq_rel(i128* %a) nounwind uwtable {
1790 entry:
1791   atomicrmw sub i128* %a, i128 0 acq_rel, !dbg !7
1792   ret void, !dbg !7
1793 }
1794 ; CHECK-LABEL: atomic128_sub_acq_rel
1795 ; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 4), !dbg
1796
1797 define void @atomic128_and_acq_rel(i128* %a) nounwind uwtable {
1798 entry:
1799   atomicrmw and i128* %a, i128 0 acq_rel, !dbg !7
1800   ret void, !dbg !7
1801 }
1802 ; CHECK-LABEL: atomic128_and_acq_rel
1803 ; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 4), !dbg
1804
1805 define void @atomic128_or_acq_rel(i128* %a) nounwind uwtable {
1806 entry:
1807   atomicrmw or i128* %a, i128 0 acq_rel, !dbg !7
1808   ret void, !dbg !7
1809 }
1810 ; CHECK-LABEL: atomic128_or_acq_rel
1811 ; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 4), !dbg
1812
1813 define void @atomic128_xor_acq_rel(i128* %a) nounwind uwtable {
1814 entry:
1815   atomicrmw xor i128* %a, i128 0 acq_rel, !dbg !7
1816   ret void, !dbg !7
1817 }
1818 ; CHECK-LABEL: atomic128_xor_acq_rel
1819 ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 4), !dbg
1820
1821 define void @atomic128_nand_acq_rel(i128* %a) nounwind uwtable {
1822 entry:
1823   atomicrmw nand i128* %a, i128 0 acq_rel, !dbg !7
1824   ret void, !dbg !7
1825 }
1826 ; CHECK-LABEL: atomic128_nand_acq_rel
1827 ; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 4), !dbg
1828
1829 define void @atomic128_xchg_seq_cst(i128* %a) nounwind uwtable {
1830 entry:
1831   atomicrmw xchg i128* %a, i128 0 seq_cst, !dbg !7
1832   ret void, !dbg !7
1833 }
1834 ; CHECK-LABEL: atomic128_xchg_seq_cst
1835 ; CHECK: call i128 @__tsan_atomic128_exchange(i128* %a, i128 0, i32 5), !dbg
1836
1837 define void @atomic128_add_seq_cst(i128* %a) nounwind uwtable {
1838 entry:
1839   atomicrmw add i128* %a, i128 0 seq_cst, !dbg !7
1840   ret void, !dbg !7
1841 }
1842 ; CHECK-LABEL: atomic128_add_seq_cst
1843 ; CHECK: call i128 @__tsan_atomic128_fetch_add(i128* %a, i128 0, i32 5), !dbg
1844
1845 define void @atomic128_sub_seq_cst(i128* %a) nounwind uwtable {
1846 entry:
1847   atomicrmw sub i128* %a, i128 0 seq_cst, !dbg !7
1848   ret void, !dbg !7
1849 }
1850 ; CHECK-LABEL: atomic128_sub_seq_cst
1851 ; CHECK: call i128 @__tsan_atomic128_fetch_sub(i128* %a, i128 0, i32 5), !dbg
1852
1853 define void @atomic128_and_seq_cst(i128* %a) nounwind uwtable {
1854 entry:
1855   atomicrmw and i128* %a, i128 0 seq_cst, !dbg !7
1856   ret void, !dbg !7
1857 }
1858 ; CHECK-LABEL: atomic128_and_seq_cst
1859 ; CHECK: call i128 @__tsan_atomic128_fetch_and(i128* %a, i128 0, i32 5), !dbg
1860
1861 define void @atomic128_or_seq_cst(i128* %a) nounwind uwtable {
1862 entry:
1863   atomicrmw or i128* %a, i128 0 seq_cst, !dbg !7
1864   ret void, !dbg !7
1865 }
1866 ; CHECK-LABEL: atomic128_or_seq_cst
1867 ; CHECK: call i128 @__tsan_atomic128_fetch_or(i128* %a, i128 0, i32 5), !dbg
1868
1869 define void @atomic128_xor_seq_cst(i128* %a) nounwind uwtable {
1870 entry:
1871   atomicrmw xor i128* %a, i128 0 seq_cst, !dbg !7
1872   ret void, !dbg !7
1873 }
1874 ; CHECK-LABEL: atomic128_xor_seq_cst
1875 ; CHECK: call i128 @__tsan_atomic128_fetch_xor(i128* %a, i128 0, i32 5), !dbg
1876
1877 define void @atomic128_nand_seq_cst(i128* %a) nounwind uwtable {
1878 entry:
1879   atomicrmw nand i128* %a, i128 0 seq_cst, !dbg !7
1880   ret void, !dbg !7
1881 }
1882 ; CHECK-LABEL: atomic128_nand_seq_cst
1883 ; CHECK: call i128 @__tsan_atomic128_fetch_nand(i128* %a, i128 0, i32 5), !dbg
1884
1885 define void @atomic128_cas_monotonic(i128* %a) nounwind uwtable {
1886 entry:
1887   cmpxchg i128* %a, i128 0, i128 1 monotonic monotonic, !dbg !7
1888   ret void, !dbg !7
1889 }
1890 ; CHECK-LABEL: atomic128_cas_monotonic
1891 ; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 0, i32 0), !dbg
1892
1893 define void @atomic128_cas_acquire(i128* %a) nounwind uwtable {
1894 entry:
1895   cmpxchg i128* %a, i128 0, i128 1 acquire acquire, !dbg !7
1896   ret void, !dbg !7
1897 }
1898 ; CHECK-LABEL: atomic128_cas_acquire
1899 ; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 2, i32 2), !dbg
1900
1901 define void @atomic128_cas_release(i128* %a) nounwind uwtable {
1902 entry:
1903   cmpxchg i128* %a, i128 0, i128 1 release monotonic, !dbg !7
1904   ret void, !dbg !7
1905 }
1906 ; CHECK-LABEL: atomic128_cas_release
1907 ; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 3, i32 0), !dbg
1908
1909 define void @atomic128_cas_acq_rel(i128* %a) nounwind uwtable {
1910 entry:
1911   cmpxchg i128* %a, i128 0, i128 1 acq_rel acquire, !dbg !7
1912   ret void, !dbg !7
1913 }
1914 ; CHECK-LABEL: atomic128_cas_acq_rel
1915 ; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 4, i32 2), !dbg
1916
1917 define void @atomic128_cas_seq_cst(i128* %a) nounwind uwtable {
1918 entry:
1919   cmpxchg i128* %a, i128 0, i128 1 seq_cst seq_cst, !dbg !7
1920   ret void, !dbg !7
1921 }
1922 ; CHECK-LABEL: atomic128_cas_seq_cst
1923 ; CHECK: call i128 @__tsan_atomic128_compare_exchange_val(i128* %a, i128 0, i128 1, i32 5, i32 5), !dbg
1924
1925 define void @atomic_signal_fence_acquire() nounwind uwtable {
1926 entry:
1927   fence singlethread acquire, !dbg !7
1928   ret void, !dbg !7
1929 }
1930 ; CHECK-LABEL: atomic_signal_fence_acquire
1931 ; CHECK: call void @__tsan_atomic_signal_fence(i32 2), !dbg
1932
1933 define void @atomic_thread_fence_acquire() nounwind uwtable {
1934 entry:
1935   fence  acquire, !dbg !7
1936   ret void, !dbg !7
1937 }
1938 ; CHECK-LABEL: atomic_thread_fence_acquire
1939 ; CHECK: call void @__tsan_atomic_thread_fence(i32 2), !dbg
1940
1941 define void @atomic_signal_fence_release() nounwind uwtable {
1942 entry:
1943   fence singlethread release, !dbg !7
1944   ret void, !dbg !7
1945 }
1946 ; CHECK-LABEL: atomic_signal_fence_release
1947 ; CHECK: call void @__tsan_atomic_signal_fence(i32 3), !dbg
1948
1949 define void @atomic_thread_fence_release() nounwind uwtable {
1950 entry:
1951   fence  release, !dbg !7
1952   ret void, !dbg !7
1953 }
1954 ; CHECK-LABEL: atomic_thread_fence_release
1955 ; CHECK: call void @__tsan_atomic_thread_fence(i32 3), !dbg
1956
1957 define void @atomic_signal_fence_acq_rel() nounwind uwtable {
1958 entry:
1959   fence singlethread acq_rel, !dbg !7
1960   ret void, !dbg !7
1961 }
1962 ; CHECK-LABEL: atomic_signal_fence_acq_rel
1963 ; CHECK: call void @__tsan_atomic_signal_fence(i32 4), !dbg
1964
1965 define void @atomic_thread_fence_acq_rel() nounwind uwtable {
1966 entry:
1967   fence  acq_rel, !dbg !7
1968   ret void, !dbg !7
1969 }
1970 ; CHECK-LABEL: atomic_thread_fence_acq_rel
1971 ; CHECK: call void @__tsan_atomic_thread_fence(i32 4), !dbg
1972
1973 define void @atomic_signal_fence_seq_cst() nounwind uwtable {
1974 entry:
1975   fence singlethread seq_cst, !dbg !7
1976   ret void, !dbg !7
1977 }
1978 ; CHECK-LABEL: atomic_signal_fence_seq_cst
1979 ; CHECK: call void @__tsan_atomic_signal_fence(i32 5), !dbg
1980
1981 define void @atomic_thread_fence_seq_cst() nounwind uwtable {
1982 entry:
1983   fence  seq_cst, !dbg !7
1984   ret void, !dbg !7
1985 }
1986 ; CHECK-LABEL: atomic_thread_fence_seq_cst
1987 ; CHECK: call void @__tsan_atomic_thread_fence(i32 5), !dbg
1988
1989 !llvm.module.flags = !{!0, !1, !2}
1990 !0 = !{i32 2, !"Dwarf Version", i32 4}
1991 !1 = !{i32 2, !"Debug Info Version", i32 3}
1992 !2 = !{i32 1, !"PIC Level", i32 2}
1993
1994 !3 = !{}
1995 !4 = !DISubroutineType(types: !3)
1996 !5 = !DIFile(filename: "atomic.cpp", directory: "/tmp")
1997 !6 = distinct !DISubprogram(name: "test", scope: !5, file: !5, line: 99, type: !4, isLocal: false, isDefinition: true, scopeLine: 100, flags: DIFlagPrototyped, isOptimized: false, variables: !3)
1998 !7 = !DILocation(line: 100, column: 1, scope: !6)