xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/atomic_store.ll (revision b006b60dc993b2e0ba3e412c80709477241b6be6)
1; RUN: llc < %s -mtriple=ve | FileCheck %s
2
3;;; Test atomic store for all types and all memory order
4;;;
5;;; Note:
6;;;   We test i1/i8/i16/i32/i64/i128/u8/u16/u32/u64/u128.
7;;;   We test relaxed, release, and seq_cst.
8;;;   We test an object, a stack object, and a global variable.
9
10%"struct.std::__1::atomic" = type { %"struct.std::__1::__atomic_base" }
11%"struct.std::__1::__atomic_base" = type { %"struct.std::__1::__cxx_atomic_impl" }
12%"struct.std::__1::__cxx_atomic_impl" = type { %"struct.std::__1::__cxx_atomic_base_impl" }
13%"struct.std::__1::__cxx_atomic_base_impl" = type { i8 }
14%"struct.std::__1::atomic.0" = type { %"struct.std::__1::__atomic_base.1" }
15%"struct.std::__1::__atomic_base.1" = type { %"struct.std::__1::__atomic_base.2" }
16%"struct.std::__1::__atomic_base.2" = type { %"struct.std::__1::__cxx_atomic_impl.3" }
17%"struct.std::__1::__cxx_atomic_impl.3" = type { %"struct.std::__1::__cxx_atomic_base_impl.4" }
18%"struct.std::__1::__cxx_atomic_base_impl.4" = type { i8 }
19%"struct.std::__1::atomic.5" = type { %"struct.std::__1::__atomic_base.6" }
20%"struct.std::__1::__atomic_base.6" = type { %"struct.std::__1::__atomic_base.7" }
21%"struct.std::__1::__atomic_base.7" = type { %"struct.std::__1::__cxx_atomic_impl.8" }
22%"struct.std::__1::__cxx_atomic_impl.8" = type { %"struct.std::__1::__cxx_atomic_base_impl.9" }
23%"struct.std::__1::__cxx_atomic_base_impl.9" = type { i8 }
24%"struct.std::__1::atomic.10" = type { %"struct.std::__1::__atomic_base.11" }
25%"struct.std::__1::__atomic_base.11" = type { %"struct.std::__1::__atomic_base.12" }
26%"struct.std::__1::__atomic_base.12" = type { %"struct.std::__1::__cxx_atomic_impl.13" }
27%"struct.std::__1::__cxx_atomic_impl.13" = type { %"struct.std::__1::__cxx_atomic_base_impl.14" }
28%"struct.std::__1::__cxx_atomic_base_impl.14" = type { i16 }
29%"struct.std::__1::atomic.15" = type { %"struct.std::__1::__atomic_base.16" }
30%"struct.std::__1::__atomic_base.16" = type { %"struct.std::__1::__atomic_base.17" }
31%"struct.std::__1::__atomic_base.17" = type { %"struct.std::__1::__cxx_atomic_impl.18" }
32%"struct.std::__1::__cxx_atomic_impl.18" = type { %"struct.std::__1::__cxx_atomic_base_impl.19" }
33%"struct.std::__1::__cxx_atomic_base_impl.19" = type { i16 }
34%"struct.std::__1::atomic.20" = type { %"struct.std::__1::__atomic_base.21" }
35%"struct.std::__1::__atomic_base.21" = type { %"struct.std::__1::__atomic_base.22" }
36%"struct.std::__1::__atomic_base.22" = type { %"struct.std::__1::__cxx_atomic_impl.23" }
37%"struct.std::__1::__cxx_atomic_impl.23" = type { %"struct.std::__1::__cxx_atomic_base_impl.24" }
38%"struct.std::__1::__cxx_atomic_base_impl.24" = type { i32 }
39%"struct.std::__1::atomic.25" = type { %"struct.std::__1::__atomic_base.26" }
40%"struct.std::__1::__atomic_base.26" = type { %"struct.std::__1::__atomic_base.27" }
41%"struct.std::__1::__atomic_base.27" = type { %"struct.std::__1::__cxx_atomic_impl.28" }
42%"struct.std::__1::__cxx_atomic_impl.28" = type { %"struct.std::__1::__cxx_atomic_base_impl.29" }
43%"struct.std::__1::__cxx_atomic_base_impl.29" = type { i32 }
44%"struct.std::__1::atomic.30" = type { %"struct.std::__1::__atomic_base.31" }
45%"struct.std::__1::__atomic_base.31" = type { %"struct.std::__1::__atomic_base.32" }
46%"struct.std::__1::__atomic_base.32" = type { %"struct.std::__1::__cxx_atomic_impl.33" }
47%"struct.std::__1::__cxx_atomic_impl.33" = type { %"struct.std::__1::__cxx_atomic_base_impl.34" }
48%"struct.std::__1::__cxx_atomic_base_impl.34" = type { i64 }
49%"struct.std::__1::atomic.35" = type { %"struct.std::__1::__atomic_base.36" }
50%"struct.std::__1::__atomic_base.36" = type { %"struct.std::__1::__atomic_base.37" }
51%"struct.std::__1::__atomic_base.37" = type { %"struct.std::__1::__cxx_atomic_impl.38" }
52%"struct.std::__1::__cxx_atomic_impl.38" = type { %"struct.std::__1::__cxx_atomic_base_impl.39" }
53%"struct.std::__1::__cxx_atomic_base_impl.39" = type { i64 }
54%"struct.std::__1::atomic.40" = type { %"struct.std::__1::__atomic_base.41" }
55%"struct.std::__1::__atomic_base.41" = type { %"struct.std::__1::__atomic_base.42" }
56%"struct.std::__1::__atomic_base.42" = type { %"struct.std::__1::__cxx_atomic_impl.43" }
57%"struct.std::__1::__cxx_atomic_impl.43" = type { %"struct.std::__1::__cxx_atomic_base_impl.44" }
58%"struct.std::__1::__cxx_atomic_base_impl.44" = type { i128 }
59%"struct.std::__1::atomic.45" = type { %"struct.std::__1::__atomic_base.46" }
60%"struct.std::__1::__atomic_base.46" = type { %"struct.std::__1::__atomic_base.47" }
61%"struct.std::__1::__atomic_base.47" = type { %"struct.std::__1::__cxx_atomic_impl.48" }
62%"struct.std::__1::__cxx_atomic_impl.48" = type { %"struct.std::__1::__cxx_atomic_base_impl.49" }
63%"struct.std::__1::__cxx_atomic_base_impl.49" = type { i128 }
64
65@gv_i1 = global %"struct.std::__1::atomic" zeroinitializer, align 4
66@gv_i8 = global %"struct.std::__1::atomic.0" zeroinitializer, align 4
67@gv_u8 = global %"struct.std::__1::atomic.5" zeroinitializer, align 4
68@gv_i16 = global %"struct.std::__1::atomic.10" zeroinitializer, align 4
69@gv_u16 = global %"struct.std::__1::atomic.15" zeroinitializer, align 4
70@gv_i32 = global %"struct.std::__1::atomic.20" zeroinitializer, align 4
71@gv_u32 = global %"struct.std::__1::atomic.25" zeroinitializer, align 4
72@gv_i64 = global %"struct.std::__1::atomic.30" zeroinitializer, align 8
73@gv_u64 = global %"struct.std::__1::atomic.35" zeroinitializer, align 8
74@gv_i128 = global %"struct.std::__1::atomic.40" zeroinitializer, align 16
75@gv_u128 = global %"struct.std::__1::atomic.45" zeroinitializer, align 16
76
77; Function Attrs: nofree norecurse nounwind mustprogress
78define void @_Z23atomic_store_relaxed_i1RNSt3__16atomicIbEEb(ptr nocapture nonnull align 1 dereferenceable(1) %0, i1 zeroext %1) {
79; CHECK-LABEL: _Z23atomic_store_relaxed_i1RNSt3__16atomicIbEEb:
80; CHECK:       # %bb.0:
81; CHECK-NEXT:    st1b %s1, (, %s0)
82; CHECK-NEXT:    b.l.t (, %s10)
83  %3 = zext i1 %1 to i8
84  store atomic i8 %3, ptr %0 monotonic, align 1
85  ret void
86}
87
88; Function Attrs: nofree norecurse nounwind mustprogress
89define void @_Z23atomic_store_relaxed_i8RNSt3__16atomicIcEEc(ptr nocapture nonnull align 1 dereferenceable(1) %0, i8 signext %1) {
90; CHECK-LABEL: _Z23atomic_store_relaxed_i8RNSt3__16atomicIcEEc:
91; CHECK:       # %bb.0:
92; CHECK-NEXT:    st1b %s1, (, %s0)
93; CHECK-NEXT:    b.l.t (, %s10)
94  store atomic i8 %1, ptr %0 monotonic, align 1
95  ret void
96}
97
98; Function Attrs: nofree norecurse nounwind mustprogress
99define void @_Z23atomic_store_relaxed_u8RNSt3__16atomicIhEEh(ptr nocapture nonnull align 1 dereferenceable(1) %0, i8 zeroext %1) {
100; CHECK-LABEL: _Z23atomic_store_relaxed_u8RNSt3__16atomicIhEEh:
101; CHECK:       # %bb.0:
102; CHECK-NEXT:    st1b %s1, (, %s0)
103; CHECK-NEXT:    b.l.t (, %s10)
104  store atomic i8 %1, ptr %0 monotonic, align 1
105  ret void
106}
107
108; Function Attrs: nofree norecurse nounwind mustprogress
109define void @_Z24atomic_store_relaxed_i16RNSt3__16atomicIsEEs(ptr nocapture nonnull align 2 dereferenceable(2) %0, i16 signext %1) {
110; CHECK-LABEL: _Z24atomic_store_relaxed_i16RNSt3__16atomicIsEEs:
111; CHECK:       # %bb.0:
112; CHECK-NEXT:    st2b %s1, (, %s0)
113; CHECK-NEXT:    b.l.t (, %s10)
114  store atomic i16 %1, ptr %0 monotonic, align 2
115  ret void
116}
117
118; Function Attrs: nofree norecurse nounwind mustprogress
119define void @_Z24atomic_store_relaxed_u16RNSt3__16atomicItEEt(ptr nocapture nonnull align 2 dereferenceable(2) %0, i16 zeroext %1) {
120; CHECK-LABEL: _Z24atomic_store_relaxed_u16RNSt3__16atomicItEEt:
121; CHECK:       # %bb.0:
122; CHECK-NEXT:    st2b %s1, (, %s0)
123; CHECK-NEXT:    b.l.t (, %s10)
124  store atomic i16 %1, ptr %0 monotonic, align 2
125  ret void
126}
127
128; Function Attrs: nofree norecurse nounwind mustprogress
129define void @_Z24atomic_store_relaxed_i32RNSt3__16atomicIiEEi(ptr nocapture nonnull align 4 dereferenceable(4) %0, i32 signext %1) {
130; CHECK-LABEL: _Z24atomic_store_relaxed_i32RNSt3__16atomicIiEEi:
131; CHECK:       # %bb.0:
132; CHECK-NEXT:    stl %s1, (, %s0)
133; CHECK-NEXT:    b.l.t (, %s10)
134  store atomic i32 %1, ptr %0 monotonic, align 4
135  ret void
136}
137
138; Function Attrs: nofree norecurse nounwind mustprogress
139define void @_Z24atomic_store_relaxed_u32RNSt3__16atomicIjEEj(ptr nocapture nonnull align 4 dereferenceable(4) %0, i32 zeroext %1) {
140; CHECK-LABEL: _Z24atomic_store_relaxed_u32RNSt3__16atomicIjEEj:
141; CHECK:       # %bb.0:
142; CHECK-NEXT:    stl %s1, (, %s0)
143; CHECK-NEXT:    b.l.t (, %s10)
144  store atomic i32 %1, ptr %0 monotonic, align 4
145  ret void
146}
147
148; Function Attrs: nofree norecurse nounwind mustprogress
149define void @_Z24atomic_store_relaxed_i64RNSt3__16atomicIlEEl(ptr nocapture nonnull align 8 dereferenceable(8) %0, i64 %1) {
150; CHECK-LABEL: _Z24atomic_store_relaxed_i64RNSt3__16atomicIlEEl:
151; CHECK:       # %bb.0:
152; CHECK-NEXT:    st %s1, (, %s0)
153; CHECK-NEXT:    b.l.t (, %s10)
154  store atomic i64 %1, ptr %0 monotonic, align 8
155  ret void
156}
157
158; Function Attrs: nofree norecurse nounwind mustprogress
159define void @_Z24atomic_store_relaxed_u64RNSt3__16atomicImEEm(ptr nocapture nonnull align 8 dereferenceable(8) %0, i64 %1) {
160; CHECK-LABEL: _Z24atomic_store_relaxed_u64RNSt3__16atomicImEEm:
161; CHECK:       # %bb.0:
162; CHECK-NEXT:    st %s1, (, %s0)
163; CHECK-NEXT:    b.l.t (, %s10)
164  store atomic i64 %1, ptr %0 monotonic, align 8
165  ret void
166}
167
168; Function Attrs: nofree nounwind mustprogress
169define void @_Z25atomic_store_relaxed_i128RNSt3__16atomicInEEn(ptr nonnull align 16 dereferenceable(16) %0, i128 %1) {
170; CHECK-LABEL: _Z25atomic_store_relaxed_i128RNSt3__16atomicInEEn:
171; CHECK:       .LBB{{[0-9]+}}_2:
172; CHECK-NEXT:    or %s4, 0, %s0
173; CHECK-NEXT:    st %s2, 248(, %s11)
174; CHECK-NEXT:    st %s1, 240(, %s11)
175; CHECK-NEXT:    lea %s0, __atomic_store@lo
176; CHECK-NEXT:    and %s0, %s0, (32)0
177; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
178; CHECK-NEXT:    lea %s2, 240(, %s11)
179; CHECK-NEXT:    or %s0, 16, (0)1
180; CHECK-NEXT:    or %s3, 0, (0)1
181; CHECK-NEXT:    or %s1, 0, %s4
182; CHECK-NEXT:    bsic %s10, (, %s12)
183; CHECK-NEXT:    or %s11, 0, %s9
184  %3 = alloca i128, align 16
185  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
186  store i128 %1, ptr %3, align 16, !tbaa !2
187  call void @__atomic_store(i64 16, ptr nonnull %0, ptr nonnull %3, i32 signext 0)
188  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
189  ret void
190}
191
192; Function Attrs: nofree nounwind mustprogress
193define void @_Z25atomic_store_relaxed_u128RNSt3__16atomicIoEEo(ptr nonnull align 16 dereferenceable(16) %0, i128 %1) {
194; CHECK-LABEL: _Z25atomic_store_relaxed_u128RNSt3__16atomicIoEEo:
195; CHECK:       .LBB{{[0-9]+}}_2:
196; CHECK-NEXT:    or %s4, 0, %s0
197; CHECK-NEXT:    st %s2, 248(, %s11)
198; CHECK-NEXT:    st %s1, 240(, %s11)
199; CHECK-NEXT:    lea %s0, __atomic_store@lo
200; CHECK-NEXT:    and %s0, %s0, (32)0
201; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
202; CHECK-NEXT:    lea %s2, 240(, %s11)
203; CHECK-NEXT:    or %s0, 16, (0)1
204; CHECK-NEXT:    or %s3, 0, (0)1
205; CHECK-NEXT:    or %s1, 0, %s4
206; CHECK-NEXT:    bsic %s10, (, %s12)
207; CHECK-NEXT:    or %s11, 0, %s9
208  %3 = alloca i128, align 16
209  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
210  store i128 %1, ptr %3, align 16, !tbaa !2
211  call void @__atomic_store(i64 16, ptr nonnull %0, ptr nonnull %3, i32 signext 0)
212  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
213  ret void
214}
215
216; Function Attrs: nofree norecurse nounwind mustprogress
217define void @_Z23atomic_store_release_i1RNSt3__16atomicIbEEb(ptr nocapture nonnull align 1 dereferenceable(1) %0, i1 zeroext %1) {
218; CHECK-LABEL: _Z23atomic_store_release_i1RNSt3__16atomicIbEEb:
219; CHECK:       # %bb.0:
220; CHECK-NEXT:    fencem 1
221; CHECK-NEXT:    st1b %s1, (, %s0)
222; CHECK-NEXT:    b.l.t (, %s10)
223  %3 = zext i1 %1 to i8
224  store atomic i8 %3, ptr %0 release, align 1
225  ret void
226}
227
228; Function Attrs: nofree norecurse nounwind mustprogress
229define void @_Z23atomic_store_release_i8RNSt3__16atomicIcEEc(ptr nocapture nonnull align 1 dereferenceable(1) %0, i8 signext %1) {
230; CHECK-LABEL: _Z23atomic_store_release_i8RNSt3__16atomicIcEEc:
231; CHECK:       # %bb.0:
232; CHECK-NEXT:    fencem 1
233; CHECK-NEXT:    st1b %s1, (, %s0)
234; CHECK-NEXT:    b.l.t (, %s10)
235  store atomic i8 %1, ptr %0 release, align 1
236  ret void
237}
238
239; Function Attrs: nofree norecurse nounwind mustprogress
240define void @_Z23atomic_store_release_u8RNSt3__16atomicIhEEh(ptr nocapture nonnull align 1 dereferenceable(1) %0, i8 zeroext %1) {
241; CHECK-LABEL: _Z23atomic_store_release_u8RNSt3__16atomicIhEEh:
242; CHECK:       # %bb.0:
243; CHECK-NEXT:    fencem 1
244; CHECK-NEXT:    st1b %s1, (, %s0)
245; CHECK-NEXT:    b.l.t (, %s10)
246  store atomic i8 %1, ptr %0 release, align 1
247  ret void
248}
249
250; Function Attrs: nofree norecurse nounwind mustprogress
251define void @_Z24atomic_store_release_i16RNSt3__16atomicIsEEs(ptr nocapture nonnull align 2 dereferenceable(2) %0, i16 signext %1) {
252; CHECK-LABEL: _Z24atomic_store_release_i16RNSt3__16atomicIsEEs:
253; CHECK:       # %bb.0:
254; CHECK-NEXT:    fencem 1
255; CHECK-NEXT:    st2b %s1, (, %s0)
256; CHECK-NEXT:    b.l.t (, %s10)
257  store atomic i16 %1, ptr %0 release, align 2
258  ret void
259}
260
261; Function Attrs: nofree norecurse nounwind mustprogress
262define void @_Z24atomic_store_release_u16RNSt3__16atomicItEEt(ptr nocapture nonnull align 2 dereferenceable(2) %0, i16 zeroext %1) {
263; CHECK-LABEL: _Z24atomic_store_release_u16RNSt3__16atomicItEEt:
264; CHECK:       # %bb.0:
265; CHECK-NEXT:    fencem 1
266; CHECK-NEXT:    st2b %s1, (, %s0)
267; CHECK-NEXT:    b.l.t (, %s10)
268  store atomic i16 %1, ptr %0 release, align 2
269  ret void
270}
271
272; Function Attrs: nofree norecurse nounwind mustprogress
273define void @_Z24atomic_store_release_i32RNSt3__16atomicIiEEi(ptr nocapture nonnull align 4 dereferenceable(4) %0, i32 signext %1) {
274; CHECK-LABEL: _Z24atomic_store_release_i32RNSt3__16atomicIiEEi:
275; CHECK:       # %bb.0:
276; CHECK-NEXT:    fencem 1
277; CHECK-NEXT:    stl %s1, (, %s0)
278; CHECK-NEXT:    b.l.t (, %s10)
279  store atomic i32 %1, ptr %0 release, align 4
280  ret void
281}
282
283; Function Attrs: nofree norecurse nounwind mustprogress
284define void @_Z24atomic_store_release_u32RNSt3__16atomicIjEEj(ptr nocapture nonnull align 4 dereferenceable(4) %0, i32 zeroext %1) {
285; CHECK-LABEL: _Z24atomic_store_release_u32RNSt3__16atomicIjEEj:
286; CHECK:       # %bb.0:
287; CHECK-NEXT:    fencem 1
288; CHECK-NEXT:    stl %s1, (, %s0)
289; CHECK-NEXT:    b.l.t (, %s10)
290  store atomic i32 %1, ptr %0 release, align 4
291  ret void
292}
293
294; Function Attrs: nofree norecurse nounwind mustprogress
295define void @_Z24atomic_store_release_i64RNSt3__16atomicIlEEl(ptr nocapture nonnull align 8 dereferenceable(8) %0, i64 %1) {
296; CHECK-LABEL: _Z24atomic_store_release_i64RNSt3__16atomicIlEEl:
297; CHECK:       # %bb.0:
298; CHECK-NEXT:    fencem 1
299; CHECK-NEXT:    st %s1, (, %s0)
300; CHECK-NEXT:    b.l.t (, %s10)
301  store atomic i64 %1, ptr %0 release, align 8
302  ret void
303}
304
305; Function Attrs: nofree norecurse nounwind mustprogress
306define void @_Z24atomic_store_release_u64RNSt3__16atomicImEEm(ptr nocapture nonnull align 8 dereferenceable(8) %0, i64 %1) {
307; CHECK-LABEL: _Z24atomic_store_release_u64RNSt3__16atomicImEEm:
308; CHECK:       # %bb.0:
309; CHECK-NEXT:    fencem 1
310; CHECK-NEXT:    st %s1, (, %s0)
311; CHECK-NEXT:    b.l.t (, %s10)
312  store atomic i64 %1, ptr %0 release, align 8
313  ret void
314}
315
316; Function Attrs: nofree nounwind mustprogress
317define void @_Z25atomic_store_release_i128RNSt3__16atomicInEEn(ptr nonnull align 16 dereferenceable(16) %0, i128 %1) {
318; CHECK-LABEL: _Z25atomic_store_release_i128RNSt3__16atomicInEEn:
319; CHECK:       .LBB{{[0-9]+}}_2:
320; CHECK-NEXT:    or %s4, 0, %s0
321; CHECK-NEXT:    st %s2, 248(, %s11)
322; CHECK-NEXT:    st %s1, 240(, %s11)
323; CHECK-NEXT:    lea %s0, __atomic_store@lo
324; CHECK-NEXT:    and %s0, %s0, (32)0
325; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
326; CHECK-NEXT:    lea %s2, 240(, %s11)
327; CHECK-NEXT:    or %s0, 16, (0)1
328; CHECK-NEXT:    or %s3, 3, (0)1
329; CHECK-NEXT:    or %s1, 0, %s4
330; CHECK-NEXT:    bsic %s10, (, %s12)
331; CHECK-NEXT:    or %s11, 0, %s9
332  %3 = alloca i128, align 16
333  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
334  store i128 %1, ptr %3, align 16, !tbaa !2
335  call void @__atomic_store(i64 16, ptr nonnull %0, ptr nonnull %3, i32 signext 3)
336  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
337  ret void
338}
339
340; Function Attrs: nofree nounwind mustprogress
341define void @_Z25atomic_store_release_u128RNSt3__16atomicIoEEo(ptr nonnull align 16 dereferenceable(16) %0, i128 %1) {
342; CHECK-LABEL: _Z25atomic_store_release_u128RNSt3__16atomicIoEEo:
343; CHECK:       .LBB{{[0-9]+}}_2:
344; CHECK-NEXT:    or %s4, 0, %s0
345; CHECK-NEXT:    st %s2, 248(, %s11)
346; CHECK-NEXT:    st %s1, 240(, %s11)
347; CHECK-NEXT:    lea %s0, __atomic_store@lo
348; CHECK-NEXT:    and %s0, %s0, (32)0
349; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
350; CHECK-NEXT:    lea %s2, 240(, %s11)
351; CHECK-NEXT:    or %s0, 16, (0)1
352; CHECK-NEXT:    or %s3, 3, (0)1
353; CHECK-NEXT:    or %s1, 0, %s4
354; CHECK-NEXT:    bsic %s10, (, %s12)
355; CHECK-NEXT:    or %s11, 0, %s9
356  %3 = alloca i128, align 16
357  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
358  store i128 %1, ptr %3, align 16, !tbaa !2
359  call void @__atomic_store(i64 16, ptr nonnull %0, ptr nonnull %3, i32 signext 3)
360  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
361  ret void
362}
363
364; Function Attrs: nofree norecurse nounwind mustprogress
365define void @_Z23atomic_store_seq_cst_i1RNSt3__16atomicIbEEb(ptr nocapture nonnull align 1 dereferenceable(1) %0, i1 zeroext %1) {
366; CHECK-LABEL: _Z23atomic_store_seq_cst_i1RNSt3__16atomicIbEEb:
367; CHECK:       # %bb.0:
368; CHECK-NEXT:    fencem 3
369; CHECK-NEXT:    st1b %s1, (, %s0)
370; CHECK-NEXT:    fencem 3
371; CHECK-NEXT:    b.l.t (, %s10)
372  %3 = zext i1 %1 to i8
373  store atomic i8 %3, ptr %0 seq_cst, align 1
374  ret void
375}
376
377; Function Attrs: nofree norecurse nounwind mustprogress
378define void @_Z23atomic_store_seq_cst_i8RNSt3__16atomicIcEEc(ptr nocapture nonnull align 1 dereferenceable(1) %0, i8 signext %1) {
379; CHECK-LABEL: _Z23atomic_store_seq_cst_i8RNSt3__16atomicIcEEc:
380; CHECK:       # %bb.0:
381; CHECK-NEXT:    fencem 3
382; CHECK-NEXT:    st1b %s1, (, %s0)
383; CHECK-NEXT:    fencem 3
384; CHECK-NEXT:    b.l.t (, %s10)
385  store atomic i8 %1, ptr %0 seq_cst, align 1
386  ret void
387}
388
389; Function Attrs: nofree norecurse nounwind mustprogress
390define void @_Z23atomic_store_seq_cst_u8RNSt3__16atomicIhEEh(ptr nocapture nonnull align 1 dereferenceable(1) %0, i8 zeroext %1) {
391; CHECK-LABEL: _Z23atomic_store_seq_cst_u8RNSt3__16atomicIhEEh:
392; CHECK:       # %bb.0:
393; CHECK-NEXT:    fencem 3
394; CHECK-NEXT:    st1b %s1, (, %s0)
395; CHECK-NEXT:    fencem 3
396; CHECK-NEXT:    b.l.t (, %s10)
397  store atomic i8 %1, ptr %0 seq_cst, align 1
398  ret void
399}
400
401; Function Attrs: nofree norecurse nounwind mustprogress
402define void @_Z24atomic_store_seq_cst_i16RNSt3__16atomicIsEEs(ptr nocapture nonnull align 2 dereferenceable(2) %0, i16 signext %1) {
403; CHECK-LABEL: _Z24atomic_store_seq_cst_i16RNSt3__16atomicIsEEs:
404; CHECK:       # %bb.0:
405; CHECK-NEXT:    fencem 3
406; CHECK-NEXT:    st2b %s1, (, %s0)
407; CHECK-NEXT:    fencem 3
408; CHECK-NEXT:    b.l.t (, %s10)
409  store atomic i16 %1, ptr %0 seq_cst, align 2
410  ret void
411}
412
413; Function Attrs: nofree norecurse nounwind mustprogress
414define void @_Z24atomic_store_seq_cst_u16RNSt3__16atomicItEEt(ptr nocapture nonnull align 2 dereferenceable(2) %0, i16 zeroext %1) {
415; CHECK-LABEL: _Z24atomic_store_seq_cst_u16RNSt3__16atomicItEEt:
416; CHECK:       # %bb.0:
417; CHECK-NEXT:    fencem 3
418; CHECK-NEXT:    st2b %s1, (, %s0)
419; CHECK-NEXT:    fencem 3
420; CHECK-NEXT:    b.l.t (, %s10)
421  store atomic i16 %1, ptr %0 seq_cst, align 2
422  ret void
423}
424
425; Function Attrs: nofree norecurse nounwind mustprogress
426define void @_Z24atomic_store_seq_cst_i32RNSt3__16atomicIiEEi(ptr nocapture nonnull align 4 dereferenceable(4) %0, i32 signext %1) {
427; CHECK-LABEL: _Z24atomic_store_seq_cst_i32RNSt3__16atomicIiEEi:
428; CHECK:       # %bb.0:
429; CHECK-NEXT:    fencem 3
430; CHECK-NEXT:    stl %s1, (, %s0)
431; CHECK-NEXT:    fencem 3
432; CHECK-NEXT:    b.l.t (, %s10)
433  store atomic i32 %1, ptr %0 seq_cst, align 4
434  ret void
435}
436
437; Function Attrs: nofree norecurse nounwind mustprogress
438define void @_Z24atomic_store_seq_cst_u32RNSt3__16atomicIjEEj(ptr nocapture nonnull align 4 dereferenceable(4) %0, i32 zeroext %1) {
439; CHECK-LABEL: _Z24atomic_store_seq_cst_u32RNSt3__16atomicIjEEj:
440; CHECK:       # %bb.0:
441; CHECK-NEXT:    fencem 3
442; CHECK-NEXT:    stl %s1, (, %s0)
443; CHECK-NEXT:    fencem 3
444; CHECK-NEXT:    b.l.t (, %s10)
445  store atomic i32 %1, ptr %0 seq_cst, align 4
446  ret void
447}
448
449; Function Attrs: nofree norecurse nounwind mustprogress
450define void @_Z24atomic_store_seq_cst_i64RNSt3__16atomicIlEEl(ptr nocapture nonnull align 8 dereferenceable(8) %0, i64 %1) {
451; CHECK-LABEL: _Z24atomic_store_seq_cst_i64RNSt3__16atomicIlEEl:
452; CHECK:       # %bb.0:
453; CHECK-NEXT:    fencem 3
454; CHECK-NEXT:    st %s1, (, %s0)
455; CHECK-NEXT:    fencem 3
456; CHECK-NEXT:    b.l.t (, %s10)
457  store atomic i64 %1, ptr %0 seq_cst, align 8
458  ret void
459}
460
461; Function Attrs: nofree norecurse nounwind mustprogress
462define void @_Z24atomic_store_seq_cst_u64RNSt3__16atomicImEEm(ptr nocapture nonnull align 8 dereferenceable(8) %0, i64 %1) {
463; CHECK-LABEL: _Z24atomic_store_seq_cst_u64RNSt3__16atomicImEEm:
464; CHECK:       # %bb.0:
465; CHECK-NEXT:    fencem 3
466; CHECK-NEXT:    st %s1, (, %s0)
467; CHECK-NEXT:    fencem 3
468; CHECK-NEXT:    b.l.t (, %s10)
469  store atomic i64 %1, ptr %0 seq_cst, align 8
470  ret void
471}
472
473; Function Attrs: nofree nounwind mustprogress
474define void @_Z25atomic_store_seq_cst_i128RNSt3__16atomicInEEn(ptr nonnull align 16 dereferenceable(16) %0, i128 %1) {
475; CHECK-LABEL: _Z25atomic_store_seq_cst_i128RNSt3__16atomicInEEn:
476; CHECK:       .LBB{{[0-9]+}}_2:
477; CHECK-NEXT:    or %s4, 0, %s0
478; CHECK-NEXT:    st %s2, 248(, %s11)
479; CHECK-NEXT:    st %s1, 240(, %s11)
480; CHECK-NEXT:    lea %s0, __atomic_store@lo
481; CHECK-NEXT:    and %s0, %s0, (32)0
482; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
483; CHECK-NEXT:    lea %s2, 240(, %s11)
484; CHECK-NEXT:    or %s0, 16, (0)1
485; CHECK-NEXT:    or %s3, 5, (0)1
486; CHECK-NEXT:    or %s1, 0, %s4
487; CHECK-NEXT:    bsic %s10, (, %s12)
488; CHECK-NEXT:    or %s11, 0, %s9
489  %3 = alloca i128, align 16
490  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
491  store i128 %1, ptr %3, align 16, !tbaa !2
492  call void @__atomic_store(i64 16, ptr nonnull %0, ptr nonnull %3, i32 signext 5)
493  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
494  ret void
495}
496
497; Function Attrs: nofree nounwind mustprogress
498define void @_Z25atomic_store_seq_cst_u128RNSt3__16atomicIoEEo(ptr nonnull align 16 dereferenceable(16) %0, i128 %1) {
499; CHECK-LABEL: _Z25atomic_store_seq_cst_u128RNSt3__16atomicIoEEo:
500; CHECK:       .LBB{{[0-9]+}}_2:
501; CHECK-NEXT:    or %s4, 0, %s0
502; CHECK-NEXT:    st %s2, 248(, %s11)
503; CHECK-NEXT:    st %s1, 240(, %s11)
504; CHECK-NEXT:    lea %s0, __atomic_store@lo
505; CHECK-NEXT:    and %s0, %s0, (32)0
506; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
507; CHECK-NEXT:    lea %s2, 240(, %s11)
508; CHECK-NEXT:    or %s0, 16, (0)1
509; CHECK-NEXT:    or %s3, 5, (0)1
510; CHECK-NEXT:    or %s1, 0, %s4
511; CHECK-NEXT:    bsic %s10, (, %s12)
512; CHECK-NEXT:    or %s11, 0, %s9
513  %3 = alloca i128, align 16
514  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
515  store i128 %1, ptr %3, align 16, !tbaa !2
516  call void @__atomic_store(i64 16, ptr nonnull %0, ptr nonnull %3, i32 signext 5)
517  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
518  ret void
519}
520
521; Function Attrs: nofree nounwind mustprogress
522define void @_Z26atomic_load_relaxed_stk_i1b(i1 zeroext %0) {
523; CHECK-LABEL: _Z26atomic_load_relaxed_stk_i1b:
524; CHECK:       .LBB{{[0-9]+}}_2:
525; CHECK-NEXT:    st1b %s0, 15(, %s11)
526; CHECK-NEXT:    adds.l %s11, 16, %s11
527; CHECK-NEXT:    b.l.t (, %s10)
528  %2 = alloca i8, align 1
529  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %2)
530  %3 = zext i1 %0 to i8
531  store atomic volatile i8 %3, ptr %2 monotonic, align 1
532  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %2)
533  ret void
534}
535
536; Function Attrs: argmemonly nofree nosync nounwind willreturn
537declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
538
539; Function Attrs: argmemonly nofree nosync nounwind willreturn
540declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
541
542; Function Attrs: nofree nounwind mustprogress
543define void @_Z26atomic_load_relaxed_stk_i8c(i8 signext %0) {
544; CHECK-LABEL: _Z26atomic_load_relaxed_stk_i8c:
545; CHECK:       .LBB{{[0-9]+}}_2:
546; CHECK-NEXT:    st1b %s0, 15(, %s11)
547; CHECK-NEXT:    adds.l %s11, 16, %s11
548; CHECK-NEXT:    b.l.t (, %s10)
549  %2 = alloca i8, align 1
550  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %2)
551  store atomic volatile i8 %0, ptr %2 monotonic, align 1
552  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %2)
553  ret void
554}
555
556; Function Attrs: nofree nounwind mustprogress
557define void @_Z26atomic_load_relaxed_stk_u8h(i8 zeroext %0) {
558; CHECK-LABEL: _Z26atomic_load_relaxed_stk_u8h:
559; CHECK:       .LBB{{[0-9]+}}_2:
560; CHECK-NEXT:    st1b %s0, 15(, %s11)
561; CHECK-NEXT:    adds.l %s11, 16, %s11
562; CHECK-NEXT:    b.l.t (, %s10)
563  %2 = alloca i8, align 1
564  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %2)
565  store atomic volatile i8 %0, ptr %2 monotonic, align 1
566  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %2)
567  ret void
568}
569
570; Function Attrs: nofree nounwind mustprogress
571define void @_Z27atomic_load_relaxed_stk_i16s(i16 signext %0) {
572; CHECK-LABEL: _Z27atomic_load_relaxed_stk_i16s:
573; CHECK:       .LBB{{[0-9]+}}_2:
574; CHECK-NEXT:    st2b %s0, 14(, %s11)
575; CHECK-NEXT:    adds.l %s11, 16, %s11
576; CHECK-NEXT:    b.l.t (, %s10)
577  %2 = alloca i16, align 2
578  call void @llvm.lifetime.start.p0(i64 2, ptr nonnull %2)
579  store atomic volatile i16 %0, ptr %2 monotonic, align 2
580  call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %2)
581  ret void
582}
583
584; Function Attrs: nofree nounwind mustprogress
585define void @_Z27atomic_load_relaxed_stk_u16t(i16 zeroext %0) {
586; CHECK-LABEL: _Z27atomic_load_relaxed_stk_u16t:
587; CHECK:       .LBB{{[0-9]+}}_2:
588; CHECK-NEXT:    st2b %s0, 14(, %s11)
589; CHECK-NEXT:    adds.l %s11, 16, %s11
590; CHECK-NEXT:    b.l.t (, %s10)
591  %2 = alloca i16, align 2
592  call void @llvm.lifetime.start.p0(i64 2, ptr nonnull %2)
593  store atomic volatile i16 %0, ptr %2 monotonic, align 2
594  call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %2)
595  ret void
596}
597
598; Function Attrs: nofree nounwind mustprogress
599define void @_Z27atomic_load_relaxed_stk_i32i(i32 signext %0) {
600; CHECK-LABEL: _Z27atomic_load_relaxed_stk_i32i:
601; CHECK:       .LBB{{[0-9]+}}_2:
602; CHECK-NEXT:    stl %s0, 12(, %s11)
603; CHECK-NEXT:    adds.l %s11, 16, %s11
604; CHECK-NEXT:    b.l.t (, %s10)
605  %2 = alloca i32, align 4
606  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %2)
607  store atomic volatile i32 %0, ptr %2 monotonic, align 4
608  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %2)
609  ret void
610}
611
612; Function Attrs: nofree nounwind mustprogress
613define void @_Z27atomic_load_relaxed_stk_u32j(i32 zeroext %0) {
614; CHECK-LABEL: _Z27atomic_load_relaxed_stk_u32j:
615; CHECK:       .LBB{{[0-9]+}}_2:
616; CHECK-NEXT:    stl %s0, 12(, %s11)
617; CHECK-NEXT:    adds.l %s11, 16, %s11
618; CHECK-NEXT:    b.l.t (, %s10)
619  %2 = alloca i32, align 4
620  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %2)
621  store atomic volatile i32 %0, ptr %2 monotonic, align 4
622  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %2)
623  ret void
624}
625
626; Function Attrs: nofree nounwind mustprogress
627define void @_Z27atomic_load_relaxed_stk_i64l(i64 %0) {
628; CHECK-LABEL: _Z27atomic_load_relaxed_stk_i64l:
629; CHECK:       .LBB{{[0-9]+}}_2:
630; CHECK-NEXT:    st %s0, 8(, %s11)
631; CHECK-NEXT:    adds.l %s11, 16, %s11
632; CHECK-NEXT:    b.l.t (, %s10)
633  %2 = alloca i64, align 8
634  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2)
635  store atomic volatile i64 %0, ptr %2 monotonic, align 8
636  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2)
637  ret void
638}
639
640; Function Attrs: nofree nounwind mustprogress
641define void @_Z27atomic_load_relaxed_stk_u64m(i64 %0) {
642; CHECK-LABEL: _Z27atomic_load_relaxed_stk_u64m:
643; CHECK:       .LBB{{[0-9]+}}_2:
644; CHECK-NEXT:    st %s0, 8(, %s11)
645; CHECK-NEXT:    adds.l %s11, 16, %s11
646; CHECK-NEXT:    b.l.t (, %s10)
647  %2 = alloca i64, align 8
648  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2)
649  store atomic volatile i64 %0, ptr %2 monotonic, align 8
650  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2)
651  ret void
652}
653
654; Function Attrs: nofree nounwind mustprogress
655define void @_Z28atomic_load_relaxed_stk_i128n(i128 %0) {
656; CHECK-LABEL: _Z28atomic_load_relaxed_stk_i128n:
657; CHECK:       .LBB{{[0-9]+}}_2:
658; CHECK-NEXT:    st %s1, 264(, %s11)
659; CHECK-NEXT:    st %s0, 256(, %s11)
660; CHECK-NEXT:    lea %s0, __atomic_store@lo
661; CHECK-NEXT:    and %s0, %s0, (32)0
662; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
663; CHECK-NEXT:    lea %s1, 240(, %s11)
664; CHECK-NEXT:    lea %s2, 256(, %s11)
665; CHECK-NEXT:    or %s0, 16, (0)1
666; CHECK-NEXT:    or %s3, 0, (0)1
667; CHECK-NEXT:    bsic %s10, (, %s12)
668; CHECK-NEXT:    or %s11, 0, %s9
669  %2 = alloca i128, align 16
670  %3 = alloca %"struct.std::__1::atomic.40", align 16
671  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
672  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2)
673  store i128 %0, ptr %2, align 16, !tbaa !2
674  call void @__atomic_store(i64 16, ptr nonnull %3, ptr nonnull %2, i32 signext 0)
675  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2)
676  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
677  ret void
678}
679
680; Function Attrs: nofree nounwind mustprogress
681define void @_Z28atomic_load_relaxed_stk_u128o(i128 %0) {
682; CHECK-LABEL: _Z28atomic_load_relaxed_stk_u128o:
683; CHECK:       .LBB{{[0-9]+}}_2:
684; CHECK-NEXT:    st %s1, 264(, %s11)
685; CHECK-NEXT:    st %s0, 256(, %s11)
686; CHECK-NEXT:    lea %s0, __atomic_store@lo
687; CHECK-NEXT:    and %s0, %s0, (32)0
688; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
689; CHECK-NEXT:    lea %s1, 240(, %s11)
690; CHECK-NEXT:    lea %s2, 256(, %s11)
691; CHECK-NEXT:    or %s0, 16, (0)1
692; CHECK-NEXT:    or %s3, 0, (0)1
693; CHECK-NEXT:    bsic %s10, (, %s12)
694; CHECK-NEXT:    or %s11, 0, %s9
695  %2 = alloca i128, align 16
696  %3 = alloca %"struct.std::__1::atomic.45", align 16
697  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
698  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2)
699  store i128 %0, ptr %2, align 16, !tbaa !2
700  call void @__atomic_store(i64 16, ptr nonnull %3, ptr nonnull %2, i32 signext 0)
701  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2)
702  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
703  ret void
704}
705
706; Function Attrs: nofree norecurse nounwind mustprogress
707define void @_Z25atomic_load_relaxed_gv_i1b(i1 zeroext %0) {
708; CHECK-LABEL: _Z25atomic_load_relaxed_gv_i1b:
709; CHECK:       # %bb.0:
710; CHECK-NEXT:    lea %s1, gv_i1@lo
711; CHECK-NEXT:    and %s1, %s1, (32)0
712; CHECK-NEXT:    lea.sl %s1, gv_i1@hi(, %s1)
713; CHECK-NEXT:    st1b %s0, (, %s1)
714; CHECK-NEXT:    b.l.t (, %s10)
715  %2 = zext i1 %0 to i8
716  store atomic i8 %2, ptr @gv_i1 monotonic, align 4
717  ret void
718}
719
720; Function Attrs: nofree norecurse nounwind mustprogress
721define void @_Z25atomic_load_relaxed_gv_i8c(i8 signext %0) {
722; CHECK-LABEL: _Z25atomic_load_relaxed_gv_i8c:
723; CHECK:       # %bb.0:
724; CHECK-NEXT:    lea %s1, gv_i8@lo
725; CHECK-NEXT:    and %s1, %s1, (32)0
726; CHECK-NEXT:    lea.sl %s1, gv_i8@hi(, %s1)
727; CHECK-NEXT:    st1b %s0, (, %s1)
728; CHECK-NEXT:    b.l.t (, %s10)
729  store atomic i8 %0, ptr @gv_i8 monotonic, align 4
730  ret void
731}
732
733; Function Attrs: nofree norecurse nounwind mustprogress
734define void @_Z25atomic_load_relaxed_gv_u8h(i8 zeroext %0) {
735; CHECK-LABEL: _Z25atomic_load_relaxed_gv_u8h:
736; CHECK:       # %bb.0:
737; CHECK-NEXT:    lea %s1, gv_u8@lo
738; CHECK-NEXT:    and %s1, %s1, (32)0
739; CHECK-NEXT:    lea.sl %s1, gv_u8@hi(, %s1)
740; CHECK-NEXT:    st1b %s0, (, %s1)
741; CHECK-NEXT:    b.l.t (, %s10)
742  store atomic i8 %0, ptr @gv_u8 monotonic, align 4
743  ret void
744}
745
746; Function Attrs: nofree norecurse nounwind mustprogress
747define void @_Z26atomic_load_relaxed_gv_i16s(i16 signext %0) {
748; CHECK-LABEL: _Z26atomic_load_relaxed_gv_i16s:
749; CHECK:       # %bb.0:
750; CHECK-NEXT:    lea %s1, gv_i16@lo
751; CHECK-NEXT:    and %s1, %s1, (32)0
752; CHECK-NEXT:    lea.sl %s1, gv_i16@hi(, %s1)
753; CHECK-NEXT:    st2b %s0, (, %s1)
754; CHECK-NEXT:    b.l.t (, %s10)
755  store atomic i16 %0, ptr @gv_i16 monotonic, align 4
756  ret void
757}
758
759; Function Attrs: nofree norecurse nounwind mustprogress
760define void @_Z26atomic_load_relaxed_gv_u16t(i16 zeroext %0) {
761; CHECK-LABEL: _Z26atomic_load_relaxed_gv_u16t:
762; CHECK:       # %bb.0:
763; CHECK-NEXT:    lea %s1, gv_u16@lo
764; CHECK-NEXT:    and %s1, %s1, (32)0
765; CHECK-NEXT:    lea.sl %s1, gv_u16@hi(, %s1)
766; CHECK-NEXT:    st2b %s0, (, %s1)
767; CHECK-NEXT:    b.l.t (, %s10)
768  store atomic i16 %0, ptr @gv_u16 monotonic, align 4
769  ret void
770}
771
772; Function Attrs: nofree norecurse nounwind mustprogress
773define void @_Z26atomic_load_relaxed_gv_i32i(i32 signext %0) {
774; CHECK-LABEL: _Z26atomic_load_relaxed_gv_i32i:
775; CHECK:       # %bb.0:
776; CHECK-NEXT:    lea %s1, gv_i32@lo
777; CHECK-NEXT:    and %s1, %s1, (32)0
778; CHECK-NEXT:    lea.sl %s1, gv_i32@hi(, %s1)
779; CHECK-NEXT:    stl %s0, (, %s1)
780; CHECK-NEXT:    b.l.t (, %s10)
781  store atomic i32 %0, ptr @gv_i32 monotonic, align 4
782  ret void
783}
784
785; Function Attrs: nofree norecurse nounwind mustprogress
786define void @_Z26atomic_load_relaxed_gv_u32j(i32 zeroext %0) {
787; CHECK-LABEL: _Z26atomic_load_relaxed_gv_u32j:
788; CHECK:       # %bb.0:
789; CHECK-NEXT:    lea %s1, gv_u32@lo
790; CHECK-NEXT:    and %s1, %s1, (32)0
791; CHECK-NEXT:    lea.sl %s1, gv_u32@hi(, %s1)
792; CHECK-NEXT:    stl %s0, (, %s1)
793; CHECK-NEXT:    b.l.t (, %s10)
794  store atomic i32 %0, ptr @gv_u32 monotonic, align 4
795  ret void
796}
797
798; Function Attrs: nofree norecurse nounwind mustprogress
799define void @_Z26atomic_load_relaxed_gv_i64l(i64 %0) {
800; CHECK-LABEL: _Z26atomic_load_relaxed_gv_i64l:
801; CHECK:       # %bb.0:
802; CHECK-NEXT:    lea %s1, gv_i64@lo
803; CHECK-NEXT:    and %s1, %s1, (32)0
804; CHECK-NEXT:    lea.sl %s1, gv_i64@hi(, %s1)
805; CHECK-NEXT:    st %s0, (, %s1)
806; CHECK-NEXT:    b.l.t (, %s10)
807  store atomic i64 %0, ptr @gv_i64 monotonic, align 8
808  ret void
809}
810
811; Function Attrs: nofree norecurse nounwind mustprogress
812define void @_Z26atomic_load_relaxed_gv_u64m(i64 %0) {
813; CHECK-LABEL: _Z26atomic_load_relaxed_gv_u64m:
814; CHECK:       # %bb.0:
815; CHECK-NEXT:    lea %s1, gv_u64@lo
816; CHECK-NEXT:    and %s1, %s1, (32)0
817; CHECK-NEXT:    lea.sl %s1, gv_u64@hi(, %s1)
818; CHECK-NEXT:    st %s0, (, %s1)
819; CHECK-NEXT:    b.l.t (, %s10)
820  store atomic i64 %0, ptr @gv_u64 monotonic, align 8
821  ret void
822}
823
824; Function Attrs: nofree nounwind mustprogress
825define void @_Z27atomic_load_relaxed_gv_i128n(i128 %0) {
826; CHECK-LABEL: _Z27atomic_load_relaxed_gv_i128n:
827; CHECK:       .LBB{{[0-9]+}}_2:
828; CHECK-NEXT:    st %s1, 248(, %s11)
829; CHECK-NEXT:    st %s0, 240(, %s11)
830; CHECK-NEXT:    lea %s0, __atomic_store@lo
831; CHECK-NEXT:    and %s0, %s0, (32)0
832; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
833; CHECK-NEXT:    lea %s0, gv_i128@lo
834; CHECK-NEXT:    and %s0, %s0, (32)0
835; CHECK-NEXT:    lea.sl %s1, gv_i128@hi(, %s0)
836; CHECK-NEXT:    lea %s2, 240(, %s11)
837; CHECK-NEXT:    or %s0, 16, (0)1
838; CHECK-NEXT:    or %s3, 0, (0)1
839; CHECK-NEXT:    bsic %s10, (, %s12)
840; CHECK-NEXT:    or %s11, 0, %s9
841  %2 = alloca i128, align 16
842  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2)
843  store i128 %0, ptr %2, align 16, !tbaa !2
844  call void @__atomic_store(i64 16, ptr nonnull @gv_i128, ptr nonnull %2, i32 signext 0)
845  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2)
846  ret void
847}
848
849; Function Attrs: nofree nounwind mustprogress
850define void @_Z27atomic_load_relaxed_gv_u128o(i128 %0) {
851; CHECK-LABEL: _Z27atomic_load_relaxed_gv_u128o:
852; CHECK:       .LBB{{[0-9]+}}_2:
853; CHECK-NEXT:    st %s1, 248(, %s11)
854; CHECK-NEXT:    st %s0, 240(, %s11)
855; CHECK-NEXT:    lea %s0, __atomic_store@lo
856; CHECK-NEXT:    and %s0, %s0, (32)0
857; CHECK-NEXT:    lea.sl %s12, __atomic_store@hi(, %s0)
858; CHECK-NEXT:    lea %s0, gv_u128@lo
859; CHECK-NEXT:    and %s0, %s0, (32)0
860; CHECK-NEXT:    lea.sl %s1, gv_u128@hi(, %s0)
861; CHECK-NEXT:    lea %s2, 240(, %s11)
862; CHECK-NEXT:    or %s0, 16, (0)1
863; CHECK-NEXT:    or %s3, 0, (0)1
864; CHECK-NEXT:    bsic %s10, (, %s12)
865; CHECK-NEXT:    or %s11, 0, %s9
866  %2 = alloca i128, align 16
867  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2)
868  store i128 %0, ptr %2, align 16, !tbaa !2
869  call void @__atomic_store(i64 16, ptr nonnull @gv_u128, ptr nonnull %2, i32 signext 0)
870  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2)
871  ret void
872}
873
874; Function Attrs: nofree nounwind willreturn
875declare void @__atomic_store(i64, ptr, ptr, i32)
876
877!2 = !{!3, !3, i64 0}
878!3 = !{!"__int128", !4, i64 0}
879!4 = !{!"omnipotent char", !5, i64 0}
880!5 = !{!"Simple C++ TBAA"}
881