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