1 // RUN: %clang_cc1 %s -emit-llvm -o - -triple=amdgcn-amd-amdhsa -ffreestanding \
2 // RUN: -fvisibility=hidden | FileCheck %s
4 // CHECK-LABEL: define hidden i32 @fi1a(
5 // CHECK: [[TMP0:%.*]] = load atomic i32, ptr [[PTR0:.+]] syncscope("one-as") monotonic, align 4
6 // CHECK: [[TMP1:%.*]] = load atomic i32, ptr [[PTR1:.+]] syncscope("agent-one-as") monotonic, align 4
7 // CHECK: [[TMP2:%.*]] = load atomic i32, ptr [[PTR2:.+]] syncscope("workgroup-one-as") monotonic, align 4
8 // CHECK: [[TMP3:%.*]] = load atomic i32, ptr [[PTR3:.+]] syncscope("wavefront-one-as") monotonic, align 4
9 // CHECK: [[TMP4:%.*]] = load atomic i32, ptr [[PTR4:.+]] syncscope("singlethread-one-as") monotonic, align 4
12 __scoped_atomic_load(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
13 __scoped_atomic_load(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
14 __scoped_atomic_load(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
15 __scoped_atomic_load(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
16 __scoped_atomic_load(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
20 // CHECK-LABEL: define hidden i32 @fi1b(
21 // CHECK: [[TMP0:%.*]] = load atomic i32, ptr [[PTR0:%.+]] syncscope("one-as") monotonic, align 4
22 // CHECK: [[TMP1:%.*]] = load atomic i32, ptr [[PTR1:%.+]] syncscope("agent-one-as") monotonic, align 4
23 // CHECK: [[TMP2:%.*]] = load atomic i32, ptr [[PTR2:%.+]] syncscope("workgroup-one-as") monotonic, align 4
24 // CHECK: [[TMP3:%.*]] = load atomic i32, ptr [[PTR3:%.+]] syncscope("wavefront-one-as") monotonic, align 4
25 // CHECK: [[TMP4:%.*]] = load atomic i32, ptr [[PTR4:%.+]] syncscope("singlethread-one-as") monotonic, align 4
28 *i
= __scoped_atomic_load_n(i
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
29 *i
= __scoped_atomic_load_n(i
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
30 *i
= __scoped_atomic_load_n(i
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
31 *i
= __scoped_atomic_load_n(i
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
32 *i
= __scoped_atomic_load_n(i
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
36 // CHECK-LABEL: define hidden void @fi2a(
37 // CHECK: store atomic i32 [[TMP0:%.+]], ptr [[PTR0:%.+]] syncscope("one-as") monotonic, align 4
38 // CHECK: store atomic i32 [[TMP1:%.+]], ptr [[PTR1:%.+]] syncscope("agent-one-as") monotonic, align 4
39 // CHECK: store atomic i32 [[TMP2:%.+]], ptr [[PTR2:%.+]] syncscope("workgroup-one-as") monotonic, align 4
40 // CHECK: store atomic i32 [[TMP3:%.+]], ptr [[PTR3:%.+]] syncscope("wavefront-one-as") monotonic, align 4
41 // CHECK: store atomic i32 [[TMP4:%.+]], ptr [[PTR4:%.+]] syncscope("singlethread-one-as") monotonic, align 4
45 __scoped_atomic_store(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
46 __scoped_atomic_store(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
47 __scoped_atomic_store(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
48 __scoped_atomic_store(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
49 __scoped_atomic_store(i
, &v
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
52 // CHECK-LABEL: define hidden void @fi2b(
53 // CHECK: store atomic i32 [[TMP0:%.+]], ptr [[PTR0:%.+]] syncscope("one-as") monotonic, align 4
54 // CHECK: store atomic i32 [[TMP1:%.+]], ptr [[PTR1:%.+]] syncscope("agent-one-as") monotonic, align 4
55 // CHECK: store atomic i32 [[TMP2:%.+]], ptr [[PTR2:%.+]] syncscope("workgroup-one-as") monotonic, align 4
56 // CHECK: store atomic i32 [[TMP3:%.+]], ptr [[PTR3:%.+]] syncscope("wavefront-one-as") monotonic, align 4
57 // CHECK: store atomic i32 [[TMP4:%.+]], ptr [[PTR4:%.+]] syncscope("singlethread-one-as") monotonic, align 4
59 __scoped_atomic_store_n(i
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
60 __scoped_atomic_store_n(i
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
61 __scoped_atomic_store_n(i
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
62 __scoped_atomic_store_n(i
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
63 __scoped_atomic_store_n(i
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
66 // CHECK-LABEL: define hidden void @fi3a(
67 // CHECK: [[TMP0:%.*]] = atomicrmw add ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("one-as") monotonic, align 4
68 // CHECK: [[TMP1:%.*]] = atomicrmw sub ptr [[PTR1:%.+]], i32 [[VAL1:.+]] syncscope("one-as") monotonic, align 4
69 // CHECK: [[TMP2:%.*]] = atomicrmw and ptr [[PTR2:%.+]], i32 [[VAL2:.+]] syncscope("one-as") monotonic, align 4
70 // CHECK: [[TMP3:%.*]] = atomicrmw or ptr [[PTR3:%.+]], i32 [[VAL3:.+]] syncscope("one-as") monotonic, align 4
71 // CHECK: [[TMP4:%.*]] = atomicrmw xor ptr [[PTR4:%.+]], i32 [[VAL4:.+]] syncscope("one-as") monotonic, align 4
72 // CHECK: [[TMP5:%.*]] = atomicrmw nand ptr [[PTR5:%.+]], i32 [[VAL5:.+]] syncscope("one-as") monotonic, align 4
73 // CHECK: [[TMP6:%.*]] = atomicrmw min ptr [[PTR6:%.+]], i32 [[VAL6:.+]] syncscope("one-as") monotonic, align 4
74 // CHECK: [[TMP7:%.*]] = atomicrmw max ptr [[PTR7:%.+]], i32 [[VAL7:.+]] syncscope("one-as") monotonic, align 4
75 void fi3a(int *a
, int *b
, int *c
, int *d
, int *e
, int *f
, int *g
, int *h
) {
76 *a
= __scoped_atomic_fetch_add(a
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
77 *b
= __scoped_atomic_fetch_sub(b
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
78 *c
= __scoped_atomic_fetch_and(c
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
79 *d
= __scoped_atomic_fetch_or(d
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
80 *e
= __scoped_atomic_fetch_xor(e
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
81 *f
= __scoped_atomic_fetch_nand(f
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
82 *g
= __scoped_atomic_fetch_min(g
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
83 *h
= __scoped_atomic_fetch_max(h
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
86 // CHECK-LABEL: define hidden void @fi3b(
87 // CHECK: [[TMP0:%.*]] = atomicrmw add ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("agent-one-as") monotonic, align 4
88 // CHECK: [[TMP1:%.*]] = atomicrmw sub ptr [[PTR1:%.+]], i32 [[VAL1:.+]] syncscope("agent-one-as") monotonic, align 4
89 // CHECK: [[TMP2:%.*]] = atomicrmw and ptr [[PTR2:%.+]], i32 [[VAL2:.+]] syncscope("agent-one-as") monotonic, align 4
90 // CHECK: [[TMP3:%.*]] = atomicrmw or ptr [[PTR3:%.+]], i32 [[VAL3:.+]] syncscope("agent-one-as") monotonic, align 4
91 // CHECK: [[TMP4:%.*]] = atomicrmw xor ptr [[PTR4:%.+]], i32 [[VAL4:.+]] syncscope("agent-one-as") monotonic, align 4
92 // CHECK: [[TMP5:%.*]] = atomicrmw nand ptr [[PTR5:%.+]], i32 [[VAL5:.+]] syncscope("agent-one-as") monotonic, align 4
93 // CHECK: [[TMP6:%.*]] = atomicrmw min ptr [[PTR6:%.+]], i32 [[VAL6:.+]] syncscope("agent-one-as") monotonic, align 4
94 // CHECK: [[TMP7:%.*]] = atomicrmw max ptr [[PTR7:%.+]], i32 [[VAL7:.+]] syncscope("agent-one-as") monotonic, align 4
95 void fi3b(int *a
, int *b
, int *c
, int *d
, int *e
, int *f
, int *g
, int *h
) {
96 *a
= __scoped_atomic_fetch_add(a
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
97 *b
= __scoped_atomic_fetch_sub(b
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
98 *c
= __scoped_atomic_fetch_and(c
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
99 *d
= __scoped_atomic_fetch_or(d
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
100 *e
= __scoped_atomic_fetch_xor(e
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
101 *f
= __scoped_atomic_fetch_nand(f
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
102 *g
= __scoped_atomic_fetch_min(g
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
103 *h
= __scoped_atomic_fetch_max(h
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
106 // CHECK-LABEL: define hidden void @fi3c(
107 // CHECK: [[TMP0:%.*]] = atomicrmw add ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("workgroup-one-as") monotonic, align 4
108 // CHECK: [[TMP1:%.*]] = atomicrmw sub ptr [[PTR1:%.+]], i32 [[VAL1:.+]] syncscope("workgroup-one-as") monotonic, align 4
109 // CHECK: [[TMP2:%.*]] = atomicrmw and ptr [[PTR2:%.+]], i32 [[VAL2:.+]] syncscope("workgroup-one-as") monotonic, align 4
110 // CHECK: [[TMP3:%.*]] = atomicrmw or ptr [[PTR3:%.+]], i32 [[VAL3:.+]] syncscope("workgroup-one-as") monotonic, align 4
111 // CHECK: [[TMP4:%.*]] = atomicrmw xor ptr [[PTR4:%.+]], i32 [[VAL4:.+]] syncscope("workgroup-one-as") monotonic, align 4
112 // CHECK: [[TMP5:%.*]] = atomicrmw nand ptr [[PTR5:%.+]], i32 [[VAL5:.+]] syncscope("workgroup-one-as") monotonic, align 4
113 // CHECK: [[TMP6:%.*]] = atomicrmw min ptr [[PTR6:%.+]], i32 [[VAL6:.+]] syncscope("workgroup-one-as") monotonic, align 4
114 // CHECK: [[TMP7:%.*]] = atomicrmw max ptr [[PTR7:%.+]], i32 [[VAL7:.+]] syncscope("workgroup-one-as") monotonic, align 4
115 void fi3c(int *a
, int *b
, int *c
, int *d
, int *e
, int *f
, int *g
, int *h
) {
116 *a
= __scoped_atomic_fetch_add(a
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
117 *b
= __scoped_atomic_fetch_sub(b
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
118 *c
= __scoped_atomic_fetch_and(c
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
119 *d
= __scoped_atomic_fetch_or(d
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
120 *e
= __scoped_atomic_fetch_xor(e
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
121 *f
= __scoped_atomic_fetch_nand(f
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
122 *g
= __scoped_atomic_fetch_min(g
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
123 *h
= __scoped_atomic_fetch_max(h
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
126 // CHECK-LABEL: define hidden void @fi3d(
127 // CHECK: [[TMP0:%.*]] = atomicrmw add ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("wavefront-one-as") monotonic, align 4
128 // CHECK: [[TMP1:%.*]] = atomicrmw sub ptr [[PTR1:%.+]], i32 [[VAL1:.+]] syncscope("wavefront-one-as") monotonic, align 4
129 // CHECK: [[TMP2:%.*]] = atomicrmw and ptr [[PTR2:%.+]], i32 [[VAL2:.+]] syncscope("wavefront-one-as") monotonic, align 4
130 // CHECK: [[TMP3:%.*]] = atomicrmw or ptr [[PTR3:%.+]], i32 [[VAL3:.+]] syncscope("wavefront-one-as") monotonic, align 4
131 // CHECK: [[TMP4:%.*]] = atomicrmw xor ptr [[PTR4:%.+]], i32 [[VAL4:.+]] syncscope("wavefront-one-as") monotonic, align 4
132 // CHECK: [[TMP5:%.*]] = atomicrmw nand ptr [[PTR5:%.+]], i32 [[VAL5:.+]] syncscope("wavefront-one-as") monotonic, align 4
133 // CHECK: [[TMP6:%.*]] = atomicrmw min ptr [[PTR6:%.+]], i32 [[VAL6:.+]] syncscope("wavefront-one-as") monotonic, align 4
134 // CHECK: [[TMP7:%.*]] = atomicrmw max ptr [[PTR7:%.+]], i32 [[VAL7:.+]] syncscope("wavefront-one-as") monotonic, align 4
135 void fi3d(int *a
, int *b
, int *c
, int *d
, int *e
, int *f
, int *g
, int *h
) {
136 *a
= __scoped_atomic_fetch_add(a
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
137 *b
= __scoped_atomic_fetch_sub(b
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
138 *c
= __scoped_atomic_fetch_and(c
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
139 *d
= __scoped_atomic_fetch_or(d
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
140 *e
= __scoped_atomic_fetch_xor(e
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
141 *f
= __scoped_atomic_fetch_nand(f
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
142 *g
= __scoped_atomic_fetch_min(g
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
143 *h
= __scoped_atomic_fetch_max(h
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
146 // CHECK-LABEL: define hidden void @fi3e(
147 // CHECK: [[TMP0:%.*]] = atomicrmw add ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("singlethread-one-as") monotonic, align 4
148 // CHECK: [[TMP1:%.*]] = atomicrmw sub ptr [[PTR1:%.+]], i32 [[VAL1:.+]] syncscope("singlethread-one-as") monotonic, align 4
149 // CHECK: [[TMP2:%.*]] = atomicrmw and ptr [[PTR2:%.+]], i32 [[VAL2:.+]] syncscope("singlethread-one-as") monotonic, align 4
150 // CHECK: [[TMP3:%.*]] = atomicrmw or ptr [[PTR3:%.+]], i32 [[VAL3:.+]] syncscope("singlethread-one-as") monotonic, align 4
151 // CHECK: [[TMP4:%.*]] = atomicrmw xor ptr [[PTR4:%.+]], i32 [[VAL4:.+]] syncscope("singlethread-one-as") monotonic, align 4
152 // CHECK: [[TMP5:%.*]] = atomicrmw nand ptr [[PTR5:%.+]], i32 [[VAL5:.+]] syncscope("singlethread-one-as") monotonic, align 4
153 // CHECK: [[TMP6:%.*]] = atomicrmw min ptr [[PTR6:%.+]], i32 [[VAL6:.+]] syncscope("singlethread-one-as") monotonic, align 4
154 // CHECK: [[TMP7:%.*]] = atomicrmw max ptr [[PTR7:%.+]], i32 [[VAL7:.+]] syncscope("singlethread-one-as") monotonic, align 4
155 void fi3e(int *a
, int *b
, int *c
, int *d
, int *e
, int *f
, int *g
, int *h
) {
156 *a
= __scoped_atomic_fetch_add(a
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
157 *b
= __scoped_atomic_fetch_sub(b
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
158 *c
= __scoped_atomic_fetch_and(c
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
159 *d
= __scoped_atomic_fetch_or(d
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
160 *e
= __scoped_atomic_fetch_xor(e
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
161 *f
= __scoped_atomic_fetch_nand(f
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
162 *g
= __scoped_atomic_fetch_min(g
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
163 *h
= __scoped_atomic_fetch_max(h
, 1, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
166 // CHECK-LABEL: define hidden zeroext i1 @fi4a(
167 // CHECK: [[TMP0:%.*]] = cmpxchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("one-as") acquire acquire, align 4
171 return __scoped_atomic_compare_exchange(i
, &cmp
, &desired
, 0,
172 __ATOMIC_ACQUIRE
, __ATOMIC_ACQUIRE
,
173 __MEMORY_SCOPE_SYSTEM
);
176 // CHECK-LABEL: define hidden zeroext i1 @fi4b(
177 // CHECK: [[TMP0:%.*]] = cmpxchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("agent-one-as") acquire acquire, align 4
181 return __scoped_atomic_compare_exchange(i
, &cmp
, &desired
, 0,
182 __ATOMIC_ACQUIRE
, __ATOMIC_ACQUIRE
,
183 __MEMORY_SCOPE_DEVICE
);
186 // CHECK-LABEL: define hidden zeroext i1 @fi4c(
187 // CHECK: [[TMP0:%.*]] = cmpxchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("workgroup-one-as") acquire acquire, align 4
191 return __scoped_atomic_compare_exchange(i
, &cmp
, &desired
, 0,
192 __ATOMIC_ACQUIRE
, __ATOMIC_ACQUIRE
,
193 __MEMORY_SCOPE_WRKGRP
);
196 // CHECK-LABEL: define hidden zeroext i1 @fi4d(
197 // CHECK: [[TMP0:%.*]] = cmpxchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("wavefront-one-as") acquire acquire, align 4
201 return __scoped_atomic_compare_exchange(i
, &cmp
, &desired
, 0,
202 __ATOMIC_ACQUIRE
, __ATOMIC_ACQUIRE
,
203 __MEMORY_SCOPE_WVFRNT
);
206 // CHECK-LABEL: define hidden zeroext i1 @fi4e(
207 // CHECK: [[TMP0:%.*]] = cmpxchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("singlethread-one-as") acquire acquire, align 4
211 return __scoped_atomic_compare_exchange(i
, &cmp
, &desired
, 0,
212 __ATOMIC_ACQUIRE
, __ATOMIC_ACQUIRE
,
213 __MEMORY_SCOPE_SINGLE
);
216 // CHECK-LABEL: define hidden zeroext i1 @fi5a(
217 // CHECK: [[TMP0:%.*]] = cmpxchg weak ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("one-as") acquire acquire, align 4
220 return __scoped_atomic_compare_exchange_n(i
, &cmp
, 1, 1, __ATOMIC_ACQUIRE
,
222 __MEMORY_SCOPE_SYSTEM
);
225 // CHECK-LABEL: define hidden zeroext i1 @fi5b(
226 // CHECK: [[TMP0:%.*]] = cmpxchg weak ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("agent-one-as") acquire acquire, align 4
229 return __scoped_atomic_compare_exchange_n(i
, &cmp
, 1, 1, __ATOMIC_ACQUIRE
,
231 __MEMORY_SCOPE_DEVICE
);
234 // CHECK-LABEL: define hidden zeroext i1 @fi5c(
235 // CHECK: [[TMP0:%.*]] = cmpxchg weak ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("workgroup-one-as") acquire acquire, align 4
238 return __scoped_atomic_compare_exchange_n(
239 i
, &cmp
, 1, 1, __ATOMIC_ACQUIRE
, __ATOMIC_ACQUIRE
, __MEMORY_SCOPE_WRKGRP
);
242 // CHECK-LABEL: define hidden zeroext i1 @fi5d(
243 // CHECK: [[TMP0:%.*]] = cmpxchg weak ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("wavefront-one-as") acquire acquire, align 4
246 return __scoped_atomic_compare_exchange_n(
247 i
, &cmp
, 1, 1, __ATOMIC_ACQUIRE
, __ATOMIC_ACQUIRE
, __MEMORY_SCOPE_WVFRNT
);
250 // CHECK-LABEL: define hidden zeroext i1 @fi5e(
251 // CHECK: [[TMP0:%.*]] = cmpxchg weak ptr [[PTR0:%.+]], i32 [[VAL0:.+]], i32 [[VAL1:.+]] syncscope("singlethread-one-as") acquire acquire, align 4
254 return __scoped_atomic_compare_exchange_n(
255 i
, &cmp
, 1, 1, __ATOMIC_ACQUIRE
, __ATOMIC_ACQUIRE
, __MEMORY_SCOPE_SINGLE
);
258 // CHECK-LABEL: define hidden i32 @fi6a(
259 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("one-as") monotonic, align 4
260 int fi6a(int *c
, int *d
) {
262 __scoped_atomic_exchange(c
, d
, &ret
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SYSTEM
);
266 // CHECK-LABEL: define hidden i32 @fi6b(
267 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("agent-one-as") monotonic, align 4
268 int fi6b(int *c
, int *d
) {
270 __scoped_atomic_exchange(c
, d
, &ret
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_DEVICE
);
274 // CHECK-LABEL: define hidden i32 @fi6c(
275 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("workgroup-one-as") monotonic, align 4
276 int fi6c(int *c
, int *d
) {
278 __scoped_atomic_exchange(c
, d
, &ret
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WRKGRP
);
282 // CHECK-LABEL: define hidden i32 @fi6d(
283 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("wavefront-one-as") monotonic, align 4
284 int fi6d(int *c
, int *d
) {
286 __scoped_atomic_exchange(c
, d
, &ret
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_WVFRNT
);
290 // CHECK-LABEL: define hidden i32 @fi6e(
291 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i32 [[VAL0:.+]] syncscope("singlethread-one-as") monotonic, align 4
292 int fi6e(int *c
, int *d
) {
294 __scoped_atomic_exchange(c
, d
, &ret
, __ATOMIC_RELAXED
, __MEMORY_SCOPE_SINGLE
);
298 // CHECK-LABEL: define hidden zeroext i1 @fi7a(
299 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i8 [[VAL0:.+]] syncscope("one-as") monotonic, align 1
300 _Bool
fi7a(_Bool
*c
) {
301 return __scoped_atomic_exchange_n(c
, 1, __ATOMIC_RELAXED
,
302 __MEMORY_SCOPE_SYSTEM
);
305 // CHECK-LABEL: define hidden zeroext i1 @fi7b(
306 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i8 [[VAL0:.+]] syncscope("agent-one-as") monotonic, align 1
307 _Bool
fi7b(_Bool
*c
) {
308 return __scoped_atomic_exchange_n(c
, 1, __ATOMIC_RELAXED
,
309 __MEMORY_SCOPE_DEVICE
);
312 // CHECK-LABEL: define hidden zeroext i1 @fi7c(
313 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i8 [[VAL0:.+]] syncscope("workgroup-one-as") monotonic, align 1
314 _Bool
fi7c(_Bool
*c
) {
315 return __scoped_atomic_exchange_n(c
, 1, __ATOMIC_RELAXED
,
316 __MEMORY_SCOPE_WRKGRP
);
319 // CHECK-LABEL: define hidden zeroext i1 @fi7d(
320 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i8 [[VAL0:.+]] syncscope("wavefront-one-as") monotonic, align 1
321 _Bool
fi7d(_Bool
*c
) {
322 return __scoped_atomic_exchange_n(c
, 1, __ATOMIC_RELAXED
,
323 __MEMORY_SCOPE_WVFRNT
);
326 // CHECK-LABEL: define hidden zeroext i1 @fi7e(
327 // CHECK: [[TMP0:%.*]] = atomicrmw xchg ptr [[PTR0:%.+]], i8 [[VAL0:.+]] syncscope("singlethread-one-as") monotonic, align 1
328 _Bool
fi7e(_Bool
*c
) {
329 return __scoped_atomic_exchange_n(c
, 1, __ATOMIC_RELAXED
,
330 __MEMORY_SCOPE_SINGLE
);