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