xref: /llvm-project/llvm/test/CodeGen/LoongArch/merge-base-offset.ll (revision b225b15a3d5ff28e4848369ef14ea63f9e418a9d)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 --mattr=+lasx --verify-machineinstrs < %s \
3; RUN:   | FileCheck --check-prefix=LA32 %s
4; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs < %s \
5; RUN:   | FileCheck --check-prefix=LA64 %s
6; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs \
7; RUN:   --code-model=large < %s | FileCheck --check-prefix=LA64-LARGE %s
8
9@g_i8 = dso_local global i8 0
10
11define dso_local signext i8 @load_s8() nounwind {
12; LA32-LABEL: load_s8:
13; LA32:       # %bb.0: # %entry
14; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
15; LA32-NEXT:    ld.b $a0, $a0, %pc_lo12(g_i8)
16; LA32-NEXT:    ret
17;
18; LA64-LABEL: load_s8:
19; LA64:       # %bb.0: # %entry
20; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
21; LA64-NEXT:    ld.b $a0, $a0, %pc_lo12(g_i8)
22; LA64-NEXT:    ret
23;
24; LA64-LARGE-LABEL: load_s8:
25; LA64-LARGE:       # %bb.0: # %entry
26; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
27; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i8)
28; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i8)
29; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i8)
30; LA64-LARGE-NEXT:    ldx.b $a0, $a1, $a0
31; LA64-LARGE-NEXT:    ret
32entry:
33  %0 = load i8, ptr @g_i8
34  ret i8 %0
35}
36
37define dso_local zeroext i8 @load_u8() nounwind {
38; LA32-LABEL: load_u8:
39; LA32:       # %bb.0: # %entry
40; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
41; LA32-NEXT:    ld.bu $a0, $a0, %pc_lo12(g_i8)
42; LA32-NEXT:    ret
43;
44; LA64-LABEL: load_u8:
45; LA64:       # %bb.0: # %entry
46; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
47; LA64-NEXT:    ld.bu $a0, $a0, %pc_lo12(g_i8)
48; LA64-NEXT:    ret
49;
50; LA64-LARGE-LABEL: load_u8:
51; LA64-LARGE:       # %bb.0: # %entry
52; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
53; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i8)
54; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i8)
55; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i8)
56; LA64-LARGE-NEXT:    ldx.bu $a0, $a1, $a0
57; LA64-LARGE-NEXT:    ret
58entry:
59  %0 = load i8, ptr @g_i8
60  ret i8 %0
61}
62
63define dso_local void @store_i8() nounwind {
64; LA32-LABEL: store_i8:
65; LA32:       # %bb.0: # %entry
66; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
67; LA32-NEXT:    ori $a1, $zero, 1
68; LA32-NEXT:    st.b $a1, $a0, %pc_lo12(g_i8)
69; LA32-NEXT:    ret
70;
71; LA64-LABEL: store_i8:
72; LA64:       # %bb.0: # %entry
73; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
74; LA64-NEXT:    ori $a1, $zero, 1
75; LA64-NEXT:    st.b $a1, $a0, %pc_lo12(g_i8)
76; LA64-NEXT:    ret
77;
78; LA64-LARGE-LABEL: store_i8:
79; LA64-LARGE:       # %bb.0: # %entry
80; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
81; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i8)
82; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i8)
83; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i8)
84; LA64-LARGE-NEXT:    ori $a2, $zero, 1
85; LA64-LARGE-NEXT:    stx.b $a2, $a1, $a0
86; LA64-LARGE-NEXT:    ret
87entry:
88  store i8 1, ptr @g_i8
89  ret void
90}
91
92@g_i16 = dso_local global i16 0
93
94define dso_local signext i16 @load_s16() nounwind {
95; LA32-LABEL: load_s16:
96; LA32:       # %bb.0: # %entry
97; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i16)
98; LA32-NEXT:    ld.h $a0, $a0, %pc_lo12(g_i16)
99; LA32-NEXT:    ret
100;
101; LA64-LABEL: load_s16:
102; LA64:       # %bb.0: # %entry
103; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i16)
104; LA64-NEXT:    ld.h $a0, $a0, %pc_lo12(g_i16)
105; LA64-NEXT:    ret
106;
107; LA64-LARGE-LABEL: load_s16:
108; LA64-LARGE:       # %bb.0: # %entry
109; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i16)
110; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i16)
111; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i16)
112; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i16)
113; LA64-LARGE-NEXT:    ldx.h $a0, $a1, $a0
114; LA64-LARGE-NEXT:    ret
115entry:
116  %0 = load i16, ptr @g_i16
117  ret i16 %0
118}
119
120define dso_local zeroext i16 @load_u16() nounwind {
121; LA32-LABEL: load_u16:
122; LA32:       # %bb.0: # %entry
123; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i16)
124; LA32-NEXT:    ld.hu $a0, $a0, %pc_lo12(g_i16)
125; LA32-NEXT:    ret
126;
127; LA64-LABEL: load_u16:
128; LA64:       # %bb.0: # %entry
129; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i16)
130; LA64-NEXT:    ld.hu $a0, $a0, %pc_lo12(g_i16)
131; LA64-NEXT:    ret
132;
133; LA64-LARGE-LABEL: load_u16:
134; LA64-LARGE:       # %bb.0: # %entry
135; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i16)
136; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i16)
137; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i16)
138; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i16)
139; LA64-LARGE-NEXT:    ldx.hu $a0, $a1, $a0
140; LA64-LARGE-NEXT:    ret
141entry:
142  %0 = load i16, ptr @g_i16
143  ret i16 %0
144}
145
146define dso_local void @store_i16() nounwind {
147; LA32-LABEL: store_i16:
148; LA32:       # %bb.0: # %entry
149; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i16)
150; LA32-NEXT:    ori $a1, $zero, 1
151; LA32-NEXT:    st.h $a1, $a0, %pc_lo12(g_i16)
152; LA32-NEXT:    ret
153;
154; LA64-LABEL: store_i16:
155; LA64:       # %bb.0: # %entry
156; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i16)
157; LA64-NEXT:    ori $a1, $zero, 1
158; LA64-NEXT:    st.h $a1, $a0, %pc_lo12(g_i16)
159; LA64-NEXT:    ret
160;
161; LA64-LARGE-LABEL: store_i16:
162; LA64-LARGE:       # %bb.0: # %entry
163; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i16)
164; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i16)
165; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i16)
166; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i16)
167; LA64-LARGE-NEXT:    ori $a2, $zero, 1
168; LA64-LARGE-NEXT:    stx.h $a2, $a1, $a0
169; LA64-LARGE-NEXT:    ret
170entry:
171  store i16 1, ptr @g_i16
172  ret void
173}
174
175@g_i32 = dso_local global i32 0
176
177define dso_local signext i32 @load_s32() nounwind {
178; LA32-LABEL: load_s32:
179; LA32:       # %bb.0: # %entry
180; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i32)
181; LA32-NEXT:    ld.w $a0, $a0, %pc_lo12(g_i32)
182; LA32-NEXT:    ret
183;
184; LA64-LABEL: load_s32:
185; LA64:       # %bb.0: # %entry
186; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i32)
187; LA64-NEXT:    ld.w $a0, $a0, %pc_lo12(g_i32)
188; LA64-NEXT:    ret
189;
190; LA64-LARGE-LABEL: load_s32:
191; LA64-LARGE:       # %bb.0: # %entry
192; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i32)
193; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i32)
194; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i32)
195; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i32)
196; LA64-LARGE-NEXT:    ldx.w $a0, $a1, $a0
197; LA64-LARGE-NEXT:    ret
198entry:
199  %0 = load i32, ptr @g_i32
200  ret i32 %0
201}
202
203define dso_local zeroext i32 @load_u32() nounwind {
204; LA32-LABEL: load_u32:
205; LA32:       # %bb.0: # %entry
206; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i32)
207; LA32-NEXT:    ld.w $a0, $a0, %pc_lo12(g_i32)
208; LA32-NEXT:    ret
209;
210; LA64-LABEL: load_u32:
211; LA64:       # %bb.0: # %entry
212; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i32)
213; LA64-NEXT:    ld.wu $a0, $a0, %pc_lo12(g_i32)
214; LA64-NEXT:    ret
215;
216; LA64-LARGE-LABEL: load_u32:
217; LA64-LARGE:       # %bb.0: # %entry
218; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i32)
219; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i32)
220; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i32)
221; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i32)
222; LA64-LARGE-NEXT:    ldx.wu $a0, $a1, $a0
223; LA64-LARGE-NEXT:    ret
224entry:
225  %0 = load i32, ptr @g_i32
226  ret i32 %0
227}
228
229define dso_local void @store_i32() nounwind {
230; LA32-LABEL: store_i32:
231; LA32:       # %bb.0: # %entry
232; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i32)
233; LA32-NEXT:    ori $a1, $zero, 1
234; LA32-NEXT:    st.w $a1, $a0, %pc_lo12(g_i32)
235; LA32-NEXT:    ret
236;
237; LA64-LABEL: store_i32:
238; LA64:       # %bb.0: # %entry
239; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i32)
240; LA64-NEXT:    ori $a1, $zero, 1
241; LA64-NEXT:    st.w $a1, $a0, %pc_lo12(g_i32)
242; LA64-NEXT:    ret
243;
244; LA64-LARGE-LABEL: store_i32:
245; LA64-LARGE:       # %bb.0: # %entry
246; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i32)
247; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i32)
248; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i32)
249; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i32)
250; LA64-LARGE-NEXT:    ori $a2, $zero, 1
251; LA64-LARGE-NEXT:    stx.w $a2, $a1, $a0
252; LA64-LARGE-NEXT:    ret
253entry:
254  store i32 1, ptr @g_i32
255  ret void
256}
257
258@g_i64 = dso_local global i64 0
259
260define dso_local i64 @load_64() nounwind {
261; LA32-LABEL: load_64:
262; LA32:       # %bb.0: # %entry
263; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i64)
264; LA32-NEXT:    addi.w $a1, $a0, %pc_lo12(g_i64)
265; LA32-NEXT:    ld.w $a0, $a1, 0
266; LA32-NEXT:    ld.w $a1, $a1, 4
267; LA32-NEXT:    ret
268;
269; LA64-LABEL: load_64:
270; LA64:       # %bb.0: # %entry
271; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i64)
272; LA64-NEXT:    ld.d $a0, $a0, %pc_lo12(g_i64)
273; LA64-NEXT:    ret
274;
275; LA64-LARGE-LABEL: load_64:
276; LA64-LARGE:       # %bb.0: # %entry
277; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i64)
278; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i64)
279; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i64)
280; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i64)
281; LA64-LARGE-NEXT:    ldx.d $a0, $a1, $a0
282; LA64-LARGE-NEXT:    ret
283entry:
284  %0 = load i64, ptr @g_i64
285  ret i64 %0
286}
287
288define dso_local void @store_i64() nounwind {
289; LA32-LABEL: store_i64:
290; LA32:       # %bb.0: # %entry
291; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i64)
292; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_i64)
293; LA32-NEXT:    st.w $zero, $a0, 4
294; LA32-NEXT:    ori $a1, $zero, 1
295; LA32-NEXT:    st.w $a1, $a0, 0
296; LA32-NEXT:    ret
297;
298; LA64-LABEL: store_i64:
299; LA64:       # %bb.0: # %entry
300; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i64)
301; LA64-NEXT:    ori $a1, $zero, 1
302; LA64-NEXT:    st.d $a1, $a0, %pc_lo12(g_i64)
303; LA64-NEXT:    ret
304;
305; LA64-LARGE-LABEL: store_i64:
306; LA64-LARGE:       # %bb.0: # %entry
307; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i64)
308; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i64)
309; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i64)
310; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i64)
311; LA64-LARGE-NEXT:    ori $a2, $zero, 1
312; LA64-LARGE-NEXT:    stx.d $a2, $a1, $a0
313; LA64-LARGE-NEXT:    ret
314entry:
315  store i64 1, ptr @g_i64
316  ret void
317}
318
319@g_f32 = dso_local global float 0.0
320
321define dso_local float @load_f32() nounwind {
322; LA32-LABEL: load_f32:
323; LA32:       # %bb.0: # %entry
324; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_f32)
325; LA32-NEXT:    fld.s $fa0, $a0, %pc_lo12(g_f32)
326; LA32-NEXT:    ret
327;
328; LA64-LABEL: load_f32:
329; LA64:       # %bb.0: # %entry
330; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_f32)
331; LA64-NEXT:    fld.s $fa0, $a0, %pc_lo12(g_f32)
332; LA64-NEXT:    ret
333;
334; LA64-LARGE-LABEL: load_f32:
335; LA64-LARGE:       # %bb.0: # %entry
336; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_f32)
337; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_f32)
338; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_f32)
339; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_f32)
340; LA64-LARGE-NEXT:    fldx.s $fa0, $a1, $a0
341; LA64-LARGE-NEXT:    ret
342entry:
343  %0 = load float, ptr @g_f32
344  ret float %0
345}
346
347define dso_local void @store_f32() nounwind {
348; LA32-LABEL: store_f32:
349; LA32:       # %bb.0: # %entry
350; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_f32)
351; LA32-NEXT:    lu12i.w $a1, 260096
352; LA32-NEXT:    st.w $a1, $a0, %pc_lo12(g_f32)
353; LA32-NEXT:    ret
354;
355; LA64-LABEL: store_f32:
356; LA64:       # %bb.0: # %entry
357; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_f32)
358; LA64-NEXT:    lu12i.w $a1, 260096
359; LA64-NEXT:    st.w $a1, $a0, %pc_lo12(g_f32)
360; LA64-NEXT:    ret
361;
362; LA64-LARGE-LABEL: store_f32:
363; LA64-LARGE:       # %bb.0: # %entry
364; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_f32)
365; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_f32)
366; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_f32)
367; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_f32)
368; LA64-LARGE-NEXT:    lu12i.w $a2, 260096
369; LA64-LARGE-NEXT:    stx.w $a2, $a1, $a0
370; LA64-LARGE-NEXT:    ret
371entry:
372  store float 1.0, ptr @g_f32
373  ret void
374}
375
376@g_f64 = dso_local global double 0.0
377
378define dso_local double @load_f64() nounwind {
379; LA32-LABEL: load_f64:
380; LA32:       # %bb.0: # %entry
381; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_f64)
382; LA32-NEXT:    fld.d $fa0, $a0, %pc_lo12(g_f64)
383; LA32-NEXT:    ret
384;
385; LA64-LABEL: load_f64:
386; LA64:       # %bb.0: # %entry
387; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_f64)
388; LA64-NEXT:    fld.d $fa0, $a0, %pc_lo12(g_f64)
389; LA64-NEXT:    ret
390;
391; LA64-LARGE-LABEL: load_f64:
392; LA64-LARGE:       # %bb.0: # %entry
393; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_f64)
394; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_f64)
395; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_f64)
396; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_f64)
397; LA64-LARGE-NEXT:    fldx.d $fa0, $a1, $a0
398; LA64-LARGE-NEXT:    ret
399entry:
400  %0 = load double, ptr @g_f64
401  ret double %0
402}
403
404define dso_local void @store_f64() nounwind {
405; LA32-LABEL: store_f64:
406; LA32:       # %bb.0: # %entry
407; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_f64)
408; LA32-NEXT:    vldi $vr0, -912
409; LA32-NEXT:    fst.d $fa0, $a0, %pc_lo12(g_f64)
410; LA32-NEXT:    ret
411;
412; LA64-LABEL: store_f64:
413; LA64:       # %bb.0: # %entry
414; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_f64)
415; LA64-NEXT:    lu52i.d $a1, $zero, 1023
416; LA64-NEXT:    st.d $a1, $a0, %pc_lo12(g_f64)
417; LA64-NEXT:    ret
418;
419; LA64-LARGE-LABEL: store_f64:
420; LA64-LARGE:       # %bb.0: # %entry
421; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_f64)
422; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_f64)
423; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_f64)
424; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_f64)
425; LA64-LARGE-NEXT:    lu52i.d $a2, $zero, 1023
426; LA64-LARGE-NEXT:    stx.d $a2, $a1, $a0
427; LA64-LARGE-NEXT:    ret
428entry:
429  store double 1.0, ptr @g_f64
430  ret void
431}
432
433@g_m64 = dso_local global i64 0
434
435define dso_local void @store_multi() nounwind {
436; LA32-LABEL: store_multi:
437; LA32:       # %bb.0: # %entry
438; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_m64)
439; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_m64)
440; LA32-NEXT:    st.w $zero, $a0, 4
441; LA32-NEXT:    ori $a1, $zero, 1
442; LA32-NEXT:    st.w $a1, $a0, 0
443; LA32-NEXT:    st.w $zero, $a0, 4
444; LA32-NEXT:    ori $a1, $zero, 2
445; LA32-NEXT:    st.w $a1, $a0, 0
446; LA32-NEXT:    ret
447;
448; LA64-LABEL: store_multi:
449; LA64:       # %bb.0: # %entry
450; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_m64)
451; LA64-NEXT:    ori $a1, $zero, 1
452; LA64-NEXT:    st.d $a1, $a0, %pc_lo12(g_m64)
453; LA64-NEXT:    ori $a1, $zero, 2
454; LA64-NEXT:    st.d $a1, $a0, %pc_lo12(g_m64)
455; LA64-NEXT:    ret
456;
457; LA64-LARGE-LABEL: store_multi:
458; LA64-LARGE:       # %bb.0: # %entry
459; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_m64)
460; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_m64)
461; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_m64)
462; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_m64)
463; LA64-LARGE-NEXT:    ori $a2, $zero, 1
464; LA64-LARGE-NEXT:    stx.d $a2, $a1, $a0
465; LA64-LARGE-NEXT:    ori $a2, $zero, 2
466; LA64-LARGE-NEXT:    stx.d $a2, $a1, $a0
467; LA64-LARGE-NEXT:    ret
468entry:
469  store volatile i64 1, ptr @g_m64
470  store volatile i64 2, ptr @g_m64
471  ret void
472}
473
474@g_sf32 = dso_local global float 0.0
475
476define dso_local void @store_sf32() nounwind {
477; LA32-LABEL: store_sf32:
478; LA32:       # %bb.0: # %entry
479; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_sf32)
480; LA32-NEXT:    fld.s $fa0, $a0, %pc_lo12(g_sf32)
481; LA32-NEXT:    fst.s $fa0, $a0, %pc_lo12(g_sf32)
482; LA32-NEXT:    ret
483;
484; LA64-LABEL: store_sf32:
485; LA64:       # %bb.0: # %entry
486; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_sf32)
487; LA64-NEXT:    fld.s $fa0, $a0, %pc_lo12(g_sf32)
488; LA64-NEXT:    fst.s $fa0, $a0, %pc_lo12(g_sf32)
489; LA64-NEXT:    ret
490;
491; LA64-LARGE-LABEL: store_sf32:
492; LA64-LARGE:       # %bb.0: # %entry
493; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_sf32)
494; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_sf32)
495; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_sf32)
496; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_sf32)
497; LA64-LARGE-NEXT:    fldx.s $fa0, $a1, $a0
498; LA64-LARGE-NEXT:    fstx.s $fa0, $a1, $a0
499; LA64-LARGE-NEXT:    ret
500entry:
501  %0 = load float, ptr @g_sf32
502  store volatile float %0, ptr @g_sf32
503  ret void
504}
505
506@g_sf64 = dso_local global double 0.0
507
508define dso_local void @store_sf64() nounwind {
509; LA32-LABEL: store_sf64:
510; LA32:       # %bb.0: # %entry
511; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_sf64)
512; LA32-NEXT:    fld.d $fa0, $a0, %pc_lo12(g_sf64)
513; LA32-NEXT:    fst.d $fa0, $a0, %pc_lo12(g_sf64)
514; LA32-NEXT:    ret
515;
516; LA64-LABEL: store_sf64:
517; LA64:       # %bb.0: # %entry
518; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_sf64)
519; LA64-NEXT:    fld.d $fa0, $a0, %pc_lo12(g_sf64)
520; LA64-NEXT:    fst.d $fa0, $a0, %pc_lo12(g_sf64)
521; LA64-NEXT:    ret
522;
523; LA64-LARGE-LABEL: store_sf64:
524; LA64-LARGE:       # %bb.0: # %entry
525; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_sf64)
526; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_sf64)
527; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_sf64)
528; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_sf64)
529; LA64-LARGE-NEXT:    fldx.d $fa0, $a1, $a0
530; LA64-LARGE-NEXT:    fstx.d $fa0, $a1, $a0
531; LA64-LARGE-NEXT:    ret
532entry:
533  %0 = load double, ptr @g_sf64
534  store volatile double %0, ptr @g_sf64
535  ret void
536}
537
538@g_i32x4_src = dso_local global [4 x i32] zeroinitializer, align 16
539@g_i32x4_dst = dso_local global [4 x i32] zeroinitializer, align 16
540
541define dso_local void @copy_i32x4() nounwind {
542; LA32-LABEL: copy_i32x4:
543; LA32:       # %bb.0: # %entry
544; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_src)
545; LA32-NEXT:    vld $vr0, $a0, %pc_lo12(g_i32x4_src)
546; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_dst)
547; LA32-NEXT:    vst $vr0, $a0, %pc_lo12(g_i32x4_dst)
548; LA32-NEXT:    ret
549;
550; LA64-LABEL: copy_i32x4:
551; LA64:       # %bb.0: # %entry
552; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_src)
553; LA64-NEXT:    vld $vr0, $a0, %pc_lo12(g_i32x4_src)
554; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_dst)
555; LA64-NEXT:    vst $vr0, $a0, %pc_lo12(g_i32x4_dst)
556; LA64-NEXT:    ret
557;
558; LA64-LARGE-LABEL: copy_i32x4:
559; LA64-LARGE:       # %bb.0: # %entry
560; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_src)
561; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i32x4_src)
562; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i32x4_src)
563; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_src)
564; LA64-LARGE-NEXT:    vldx $vr0, $a1, $a0
565; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_dst)
566; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i32x4_dst)
567; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i32x4_dst)
568; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_dst)
569; LA64-LARGE-NEXT:    vstx $vr0, $a1, $a0
570; LA64-LARGE-NEXT:    ret
571entry:
572  %0 = load <4 x i32>, ptr @g_i32x4_src, align 16
573  store <4 x i32> %0, ptr @g_i32x4_dst, align 16
574  ret void
575}
576
577@g_i32x8_src = dso_local global [8 x i32] zeroinitializer, align 32
578@g_i32x8_dst = dso_local global [8 x i32] zeroinitializer, align 32
579
580define dso_local void @copy_i32x8() nounwind {
581; LA32-LABEL: copy_i32x8:
582; LA32:       # %bb.0: # %entry
583; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_src)
584; LA32-NEXT:    xvld $xr0, $a0, %pc_lo12(g_i32x4_src)
585; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_dst)
586; LA32-NEXT:    xvst $xr0, $a0, %pc_lo12(g_i32x4_dst)
587; LA32-NEXT:    ret
588;
589; LA64-LABEL: copy_i32x8:
590; LA64:       # %bb.0: # %entry
591; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_src)
592; LA64-NEXT:    xvld $xr0, $a0, %pc_lo12(g_i32x4_src)
593; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_dst)
594; LA64-NEXT:    xvst $xr0, $a0, %pc_lo12(g_i32x4_dst)
595; LA64-NEXT:    ret
596;
597; LA64-LARGE-LABEL: copy_i32x8:
598; LA64-LARGE:       # %bb.0: # %entry
599; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_src)
600; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i32x4_src)
601; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i32x4_src)
602; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_src)
603; LA64-LARGE-NEXT:    xvldx $xr0, $a1, $a0
604; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i32x4_dst)
605; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i32x4_dst)
606; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i32x4_dst)
607; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_dst)
608; LA64-LARGE-NEXT:    xvstx $xr0, $a1, $a0
609; LA64-LARGE-NEXT:    ret
610entry:
611  %0 = load <8 x i32>, ptr @g_i32x4_src, align 32
612  store <8 x i32> %0, ptr @g_i32x4_dst, align 32
613  ret void
614}
615
616@g_i8x16 = dso_local global <16 x i8> zeroinitializer, align 16
617
618define void @copy_i8_to_i8x16() {
619; LA32-LABEL: copy_i8_to_i8x16:
620; LA32:       # %bb.0: # %entry
621; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
622; LA32-NEXT:    vldrepl.b $vr0, $a0, %pc_lo12(g_i8)
623; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i8x16)
624; LA32-NEXT:    vst $vr0, $a0, %pc_lo12(g_i8x16)
625; LA32-NEXT:    ret
626;
627; LA64-LABEL: copy_i8_to_i8x16:
628; LA64:       # %bb.0: # %entry
629; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
630; LA64-NEXT:    vldrepl.b $vr0, $a0, %pc_lo12(g_i8)
631; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i8x16)
632; LA64-NEXT:    vst $vr0, $a0, %pc_lo12(g_i8x16)
633; LA64-NEXT:    ret
634;
635; LA64-LARGE-LABEL: copy_i8_to_i8x16:
636; LA64-LARGE:       # %bb.0: # %entry
637; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
638; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i8)
639; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i8)
640; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i8)
641; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
642; LA64-LARGE-NEXT:    vldrepl.b $vr0, $a0, 0
643; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i8x16)
644; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i8x16)
645; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i8x16)
646; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i8x16)
647; LA64-LARGE-NEXT:    vstx $vr0, $a1, $a0
648; LA64-LARGE-NEXT:    ret
649entry:
650  %0 = call <16 x i8> @llvm.loongarch.lsx.vldrepl.b(ptr @g_i8, i32 0)
651  store <16 x i8> %0, ptr @g_i8x16, align 16
652  ret void
653}
654
655@g_i8x32 = dso_local global <32 x i8> zeroinitializer, align 32
656
657define void @copy_i8_to_i8x32() {
658; LA32-LABEL: copy_i8_to_i8x32:
659; LA32:       # %bb.0: # %entry
660; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
661; LA32-NEXT:    xvldrepl.b $xr0, $a0, %pc_lo12(g_i8)
662; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_i8x32)
663; LA32-NEXT:    xvst $xr0, $a0, %pc_lo12(g_i8x32)
664; LA32-NEXT:    ret
665;
666; LA64-LABEL: copy_i8_to_i8x32:
667; LA64:       # %bb.0: # %entry
668; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
669; LA64-NEXT:    xvldrepl.b $xr0, $a0, %pc_lo12(g_i8)
670; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_i8x32)
671; LA64-NEXT:    xvst $xr0, $a0, %pc_lo12(g_i8x32)
672; LA64-NEXT:    ret
673;
674; LA64-LARGE-LABEL: copy_i8_to_i8x32:
675; LA64-LARGE:       # %bb.0: # %entry
676; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i8)
677; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i8)
678; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i8)
679; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i8)
680; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
681; LA64-LARGE-NEXT:    xvldrepl.b $xr0, $a0, 0
682; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_i8x32)
683; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_i8x32)
684; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_i8x32)
685; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_i8x32)
686; LA64-LARGE-NEXT:    xvstx $xr0, $a1, $a0
687; LA64-LARGE-NEXT:    ret
688entry:
689  %0 = call <32 x i8> @llvm.loongarch.lasx.xvldrepl.b(ptr @g_i8, i32 0)
690  store <32 x i8> %0, ptr @g_i8x32, align 32
691  ret void
692}
693
694@g_rmw = dso_local global i64 0
695
696define dso_local void @rmw() nounwind {
697; LA32-LABEL: rmw:
698; LA32:       # %bb.0: # %entry
699; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_rmw)
700; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_rmw)
701; LA32-NEXT:    ld.w $a1, $a0, 0
702; LA32-NEXT:    ld.w $a2, $a0, 4
703; LA32-NEXT:    addi.w $a1, $a1, 1
704; LA32-NEXT:    sltui $a3, $a1, 1
705; LA32-NEXT:    add.w $a2, $a2, $a3
706; LA32-NEXT:    st.w $a1, $a0, 0
707; LA32-NEXT:    st.w $a2, $a0, 4
708; LA32-NEXT:    ret
709;
710; LA64-LABEL: rmw:
711; LA64:       # %bb.0: # %entry
712; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_rmw)
713; LA64-NEXT:    ld.d $a1, $a0, %pc_lo12(g_rmw)
714; LA64-NEXT:    addi.d $a1, $a1, 1
715; LA64-NEXT:    st.d $a1, $a0, %pc_lo12(g_rmw)
716; LA64-NEXT:    ret
717;
718; LA64-LARGE-LABEL: rmw:
719; LA64-LARGE:       # %bb.0: # %entry
720; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_rmw)
721; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_rmw)
722; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_rmw)
723; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_rmw)
724; LA64-LARGE-NEXT:    ldx.d $a2, $a1, $a0
725; LA64-LARGE-NEXT:    addi.d $a2, $a2, 1
726; LA64-LARGE-NEXT:    stx.d $a2, $a1, $a0
727; LA64-LARGE-NEXT:    ret
728entry:
729  %0 = load i64, ptr @g_rmw
730  %1 = add i64 %0, 1
731  store i64 %1, ptr @g_rmw
732  ret void
733}
734
735@g_a32 = dso_local global [2048 x i32] zeroinitializer, align 4
736
737define dso_local void @store_a32() nounwind {
738; LA32-LABEL: store_a32:
739; LA32:       # %bb.0: # %entry
740; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a32+4096)
741; LA32-NEXT:    ori $a1, $zero, 1
742; LA32-NEXT:    st.w $a1, $a0, %pc_lo12(g_a32+4096)
743; LA32-NEXT:    ret
744;
745; LA64-LABEL: store_a32:
746; LA64:       # %bb.0: # %entry
747; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a32+4096)
748; LA64-NEXT:    ori $a1, $zero, 1
749; LA64-NEXT:    st.w $a1, $a0, %pc_lo12(g_a32+4096)
750; LA64-NEXT:    ret
751;
752; LA64-LARGE-LABEL: store_a32:
753; LA64-LARGE:       # %bb.0: # %entry
754; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a32+4096)
755; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a32+4096)
756; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a32+4096)
757; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a32+4096)
758; LA64-LARGE-NEXT:    ori $a2, $zero, 1
759; LA64-LARGE-NEXT:    stx.w $a2, $a1, $a0
760; LA64-LARGE-NEXT:    ret
761entry:
762  store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4
763  ret void
764}
765
766define dso_local void @store_a32_2() nounwind {
767; LA32-LABEL: store_a32_2:
768; LA32:       # %bb.0: # %entry
769; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a32)
770; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a32)
771; LA32-NEXT:    lu12i.w $a1, 1
772; LA32-NEXT:    add.w $a2, $a0, $a1
773; LA32-NEXT:    ori $a3, $zero, 1
774; LA32-NEXT:    st.w $a3, $a2, 0
775; LA32-NEXT:    ori $a1, $a1, 8
776; LA32-NEXT:    add.w $a0, $a0, $a1
777; LA32-NEXT:    ori $a1, $zero, 2
778; LA32-NEXT:    st.w $a1, $a0, 0
779; LA32-NEXT:    ret
780;
781; LA64-LABEL: store_a32_2:
782; LA64:       # %bb.0: # %entry
783; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a32)
784; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a32)
785; LA64-NEXT:    ori $a1, $zero, 1
786; LA64-NEXT:    stptr.w $a1, $a0, 4096
787; LA64-NEXT:    ori $a1, $zero, 2
788; LA64-NEXT:    stptr.w $a1, $a0, 4104
789; LA64-NEXT:    ret
790;
791; LA64-LARGE-LABEL: store_a32_2:
792; LA64-LARGE:       # %bb.0: # %entry
793; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a32)
794; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a32)
795; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a32)
796; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a32)
797; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
798; LA64-LARGE-NEXT:    ori $a1, $zero, 1
799; LA64-LARGE-NEXT:    stptr.w $a1, $a0, 4096
800; LA64-LARGE-NEXT:    ori $a1, $zero, 2
801; LA64-LARGE-NEXT:    stptr.w $a1, $a0, 4104
802; LA64-LARGE-NEXT:    ret
803entry:
804  store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4
805  store i32 2, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1026), align 4
806  ret void
807}
808
809define dso_local void @control_flow_with_mem_access() nounwind {
810; LA32-LABEL: control_flow_with_mem_access:
811; LA32:       # %bb.0: # %entry
812; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a32+4)
813; LA32-NEXT:    ld.w $a1, $a0, %pc_lo12(g_a32+4)
814; LA32-NEXT:    ori $a2, $zero, 1
815; LA32-NEXT:    blt $a1, $a2, .LBB25_2
816; LA32-NEXT:  # %bb.1: # %if.then
817; LA32-NEXT:    ori $a1, $zero, 10
818; LA32-NEXT:    st.w $a1, $a0, %pc_lo12(g_a32+4)
819; LA32-NEXT:  .LBB25_2: # %if.end
820; LA32-NEXT:    ret
821;
822; LA64-LABEL: control_flow_with_mem_access:
823; LA64:       # %bb.0: # %entry
824; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a32+4)
825; LA64-NEXT:    ld.w $a1, $a0, %pc_lo12(g_a32+4)
826; LA64-NEXT:    ori $a2, $zero, 1
827; LA64-NEXT:    blt $a1, $a2, .LBB25_2
828; LA64-NEXT:  # %bb.1: # %if.then
829; LA64-NEXT:    ori $a1, $zero, 10
830; LA64-NEXT:    st.w $a1, $a0, %pc_lo12(g_a32+4)
831; LA64-NEXT:  .LBB25_2: # %if.end
832; LA64-NEXT:    ret
833;
834; LA64-LARGE-LABEL: control_flow_with_mem_access:
835; LA64-LARGE:       # %bb.0: # %entry
836; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a32+4)
837; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a32+4)
838; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a32+4)
839; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a32+4)
840; LA64-LARGE-NEXT:    ldx.w $a0, $a1, $a0
841; LA64-LARGE-NEXT:    ori $a1, $zero, 1
842; LA64-LARGE-NEXT:    blt $a0, $a1, .LBB25_2
843; LA64-LARGE-NEXT:  # %bb.1: # %if.then
844; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a32+4)
845; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a32+4)
846; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a32+4)
847; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a32+4)
848; LA64-LARGE-NEXT:    ori $a2, $zero, 10
849; LA64-LARGE-NEXT:    stx.w $a2, $a1, $a0
850; LA64-LARGE-NEXT:  .LBB25_2: # %if.end
851; LA64-LARGE-NEXT:    ret
852entry:
853  %0 = load i32, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4
854  %cmp = icmp sgt i32 %0, 0
855  br i1 %cmp, label %if.then, label %if.end
856
857if.then:
858  store i32 10, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4
859  br label %if.end
860
861if.end:
862  ret void
863}
864
865define dso_local ptr @load_ba_1() nounwind {
866; LA32-LABEL: load_ba_1:
867; LA32:       # %bb.0: # %entry
868; LA32-NEXT:  .Ltmp0: # Block address taken
869; LA32-NEXT:  # %bb.1: # %label
870; LA32-NEXT:    pcalau12i $a0, %pc_hi20(.Ltmp0)
871; LA32-NEXT:    ld.w $a0, $a0, %pc_lo12(.Ltmp0)
872; LA32-NEXT:    ret
873;
874; LA64-LABEL: load_ba_1:
875; LA64:       # %bb.0: # %entry
876; LA64-NEXT:  .Ltmp0: # Block address taken
877; LA64-NEXT:  # %bb.1: # %label
878; LA64-NEXT:    pcalau12i $a0, %pc_hi20(.Ltmp0)
879; LA64-NEXT:    ld.d $a0, $a0, %pc_lo12(.Ltmp0)
880; LA64-NEXT:    ret
881;
882; LA64-LARGE-LABEL: load_ba_1:
883; LA64-LARGE:       # %bb.0: # %entry
884; LA64-LARGE-NEXT:  .Ltmp0: # Block address taken
885; LA64-LARGE-NEXT:  # %bb.1: # %label
886; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(.Ltmp0)
887; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(.Ltmp0)
888; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(.Ltmp0)
889; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(.Ltmp0)
890; LA64-LARGE-NEXT:    ldx.d $a0, $a1, $a0
891; LA64-LARGE-NEXT:    ret
892entry:
893  br label %label
894label:
895  %0 = load ptr, ptr blockaddress(@load_ba_1, %label)
896  ret ptr %0
897}
898
899define dso_local ptr @load_ba_2() nounwind {
900; LA32-LABEL: load_ba_2:
901; LA32:       # %bb.0: # %entry
902; LA32-NEXT:  .Ltmp1: # Block address taken
903; LA32-NEXT:  # %bb.1: # %label
904; LA32-NEXT:    pcalau12i $a0, %pc_hi20(.Ltmp1+8)
905; LA32-NEXT:    ld.w $a0, $a0, %pc_lo12(.Ltmp1+8)
906; LA32-NEXT:    ret
907;
908; LA64-LABEL: load_ba_2:
909; LA64:       # %bb.0: # %entry
910; LA64-NEXT:  .Ltmp1: # Block address taken
911; LA64-NEXT:  # %bb.1: # %label
912; LA64-NEXT:    pcalau12i $a0, %pc_hi20(.Ltmp1+8)
913; LA64-NEXT:    ld.d $a0, $a0, %pc_lo12(.Ltmp1+8)
914; LA64-NEXT:    ret
915;
916; LA64-LARGE-LABEL: load_ba_2:
917; LA64-LARGE:       # %bb.0: # %entry
918; LA64-LARGE-NEXT:  .Ltmp1: # Block address taken
919; LA64-LARGE-NEXT:  # %bb.1: # %label
920; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(.Ltmp1+8)
921; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(.Ltmp1+8)
922; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(.Ltmp1+8)
923; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(.Ltmp1+8)
924; LA64-LARGE-NEXT:    ldx.d $a0, $a1, $a0
925; LA64-LARGE-NEXT:    ret
926entry:
927  br label %label
928label:
929  %0 = load ptr, ptr getelementptr inbounds (i8, ptr blockaddress(@load_ba_2, %label), i32 8)
930  ret ptr %0
931}
932
933@g_a64 = dso_local global [614750729487779976 x i64] zeroinitializer, align 8
934
935define dso_local ptr @load_addr_offset_1() nounwind {
936; LA32-LABEL: load_addr_offset_1:
937; LA32:       # %bb.0: # %entry
938; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+8)
939; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64+8)
940; LA32-NEXT:    ret
941;
942; LA64-LABEL: load_addr_offset_1:
943; LA64:       # %bb.0: # %entry
944; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+8)
945; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64+8)
946; LA64-NEXT:    ret
947;
948; LA64-LARGE-LABEL: load_addr_offset_1:
949; LA64-LARGE:       # %bb.0: # %entry
950; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+8)
951; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+8)
952; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+8)
953; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+8)
954; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
955; LA64-LARGE-NEXT:    ret
956entry:
957  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1)
958}
959
960define dso_local ptr @load_addr_offset_257() nounwind {
961; LA32-LABEL: load_addr_offset_257:
962; LA32:       # %bb.0: # %entry
963; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2056)
964; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64+2056)
965; LA32-NEXT:    ret
966;
967; LA64-LABEL: load_addr_offset_257:
968; LA64:       # %bb.0: # %entry
969; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2056)
970; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64+2056)
971; LA64-NEXT:    ret
972;
973; LA64-LARGE-LABEL: load_addr_offset_257:
974; LA64-LARGE:       # %bb.0: # %entry
975; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2056)
976; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+2056)
977; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+2056)
978; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+2056)
979; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
980; LA64-LARGE-NEXT:    ret
981entry:
982  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 257)
983}
984
985define dso_local ptr @load_addr_offset_1048576() nounwind {
986; LA32-LABEL: load_addr_offset_1048576:
987; LA32:       # %bb.0: # %entry
988; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+8388608)
989; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64+8388608)
990; LA32-NEXT:    ret
991;
992; LA64-LABEL: load_addr_offset_1048576:
993; LA64:       # %bb.0: # %entry
994; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+8388608)
995; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64+8388608)
996; LA64-NEXT:    ret
997;
998; LA64-LARGE-LABEL: load_addr_offset_1048576:
999; LA64-LARGE:       # %bb.0: # %entry
1000; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+8388608)
1001; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+8388608)
1002; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+8388608)
1003; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+8388608)
1004; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
1005; LA64-LARGE-NEXT:    ret
1006entry:
1007  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048576)
1008}
1009
1010define dso_local ptr @load_addr_offset_1048577() nounwind {
1011; LA32-LABEL: load_addr_offset_1048577:
1012; LA32:       # %bb.0: # %entry
1013; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+8388616)
1014; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64+8388616)
1015; LA32-NEXT:    ret
1016;
1017; LA64-LABEL: load_addr_offset_1048577:
1018; LA64:       # %bb.0: # %entry
1019; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+8388616)
1020; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64+8388616)
1021; LA64-NEXT:    ret
1022;
1023; LA64-LARGE-LABEL: load_addr_offset_1048577:
1024; LA64-LARGE:       # %bb.0: # %entry
1025; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+8388616)
1026; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+8388616)
1027; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+8388616)
1028; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+8388616)
1029; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
1030; LA64-LARGE-NEXT:    ret
1031entry:
1032  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048577)
1033}
1034
1035define dso_local ptr @load_addr_offset_268432896() nounwind {
1036; LA32-LABEL: load_addr_offset_268432896:
1037; LA32:       # %bb.0: # %entry
1038; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2147463168)
1039; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64+2147463168)
1040; LA32-NEXT:    ret
1041;
1042; LA64-LABEL: load_addr_offset_268432896:
1043; LA64:       # %bb.0: # %entry
1044; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2147463168)
1045; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64+2147463168)
1046; LA64-NEXT:    ret
1047;
1048; LA64-LARGE-LABEL: load_addr_offset_268432896:
1049; LA64-LARGE:       # %bb.0: # %entry
1050; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2147463168)
1051; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+2147463168)
1052; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+2147463168)
1053; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+2147463168)
1054; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
1055; LA64-LARGE-NEXT:    ret
1056entry:
1057  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432896)
1058}
1059
1060define dso_local ptr @load_addr_offset_268432897() nounwind {
1061; LA32-LABEL: load_addr_offset_268432897:
1062; LA32:       # %bb.0: # %entry
1063; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2147463176)
1064; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64+2147463176)
1065; LA32-NEXT:    ret
1066;
1067; LA64-LABEL: load_addr_offset_268432897:
1068; LA64:       # %bb.0: # %entry
1069; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2147463176)
1070; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64+2147463176)
1071; LA64-NEXT:    ret
1072;
1073; LA64-LARGE-LABEL: load_addr_offset_268432897:
1074; LA64-LARGE:       # %bb.0: # %entry
1075; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2147463176)
1076; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+2147463176)
1077; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+2147463176)
1078; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+2147463176)
1079; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
1080; LA64-LARGE-NEXT:    ret
1081entry:
1082  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432897)
1083}
1084
1085define dso_local ptr @load_addr_offset_281474439839744() nounwind {
1086; LA32-LABEL: load_addr_offset_281474439839744:
1087; LA32:       # %bb.0: # %entry
1088; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64)
1089; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64)
1090; LA32-NEXT:    ret
1091;
1092; LA64-LABEL: load_addr_offset_281474439839744:
1093; LA64:       # %bb.0: # %entry
1094; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64)
1095; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64)
1096; LA64-NEXT:    ori $a1, $zero, 0
1097; LA64-NEXT:    lu32i.d $a1, 524287
1098; LA64-NEXT:    add.d $a0, $a0, $a1
1099; LA64-NEXT:    ret
1100;
1101; LA64-LARGE-LABEL: load_addr_offset_281474439839744:
1102; LA64-LARGE:       # %bb.0: # %entry
1103; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2251795518717952)
1104; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+2251795518717952)
1105; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+2251795518717952)
1106; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+2251795518717952)
1107; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
1108; LA64-LARGE-NEXT:    ret
1109entry:
1110  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 281474439839744)
1111}
1112
1113define dso_local ptr @load_addr_offset_248792680471040() nounwind {
1114; LA32-LABEL: load_addr_offset_248792680471040:
1115; LA32:       # %bb.0: # %entry
1116; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+2059194368)
1117; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64+2059194368)
1118; LA32-NEXT:    ret
1119;
1120; LA64-LABEL: load_addr_offset_248792680471040:
1121; LA64:       # %bb.0: # %entry
1122; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64)
1123; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64)
1124; LA64-NEXT:    lu12i.w $a1, 502733
1125; LA64-NEXT:    lu32i.d $a1, 463412
1126; LA64-NEXT:    add.d $a0, $a0, $a1
1127; LA64-NEXT:    ret
1128;
1129; LA64-LARGE-LABEL: load_addr_offset_248792680471040:
1130; LA64-LARGE:       # %bb.0: # %entry
1131; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+1990341443768320)
1132; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+1990341443768320)
1133; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+1990341443768320)
1134; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+1990341443768320)
1135; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
1136; LA64-LARGE-NEXT:    ret
1137entry:
1138  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 248792680471040)
1139}
1140
1141define dso_local ptr @load_addr_offset_9380351707272() nounwind {
1142; LA32-LABEL: load_addr_offset_9380351707272:
1143; LA32:       # %bb.0: # %entry
1144; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+1145062464)
1145; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64+1145062464)
1146; LA32-NEXT:    ret
1147;
1148; LA64-LABEL: load_addr_offset_9380351707272:
1149; LA64:       # %bb.0: # %entry
1150; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64)
1151; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64)
1152; LA64-NEXT:    lu12i.w $a1, 279556
1153; LA64-NEXT:    ori $a1, $a1, 1088
1154; LA64-NEXT:    lu32i.d $a1, 17472
1155; LA64-NEXT:    add.d $a0, $a0, $a1
1156; LA64-NEXT:    ret
1157;
1158; LA64-LARGE-LABEL: load_addr_offset_9380351707272:
1159; LA64-LARGE:       # %bb.0: # %entry
1160; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+75042813658176)
1161; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+75042813658176)
1162; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+75042813658176)
1163; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+75042813658176)
1164; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
1165; LA64-LARGE-NEXT:    ret
1166entry:
1167  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 9380351707272)
1168}
1169
1170define dso_local ptr @load_addr_offset_562949953421312() nounwind {
1171; LA32-LABEL: load_addr_offset_562949953421312:
1172; LA32:       # %bb.0: # %entry
1173; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64)
1174; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64)
1175; LA32-NEXT:    ret
1176;
1177; LA64-LABEL: load_addr_offset_562949953421312:
1178; LA64:       # %bb.0: # %entry
1179; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64)
1180; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64)
1181; LA64-NEXT:    lu52i.d $a1, $zero, 1
1182; LA64-NEXT:    add.d $a0, $a0, $a1
1183; LA64-NEXT:    ret
1184;
1185; LA64-LARGE-LABEL: load_addr_offset_562949953421312:
1186; LA64-LARGE:       # %bb.0: # %entry
1187; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+4503599627370496)
1188; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+4503599627370496)
1189; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+4503599627370496)
1190; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+4503599627370496)
1191; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
1192; LA64-LARGE-NEXT:    ret
1193entry:
1194  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 562949953421312)
1195}
1196
1197define dso_local ptr @load_addr_offset_614749556925924693() nounwind {
1198; LA32-LABEL: load_addr_offset_614749556925924693:
1199; LA32:       # %bb.0: # %entry
1200; LA32-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+858794664)
1201; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(g_a64+858794664)
1202; LA32-NEXT:    ret
1203;
1204; LA64-LABEL: load_addr_offset_614749556925924693:
1205; LA64:       # %bb.0: # %entry
1206; LA64-NEXT:    pcalau12i $a0, %pc_hi20(g_a64)
1207; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(g_a64)
1208; LA64-NEXT:    lu12i.w $a1, 209666
1209; LA64-NEXT:    ori $a1, $a1, 2728
1210; LA64-NEXT:    lu32i.d $a1, 15288
1211; LA64-NEXT:    lu52i.d $a1, $a1, 1092
1212; LA64-NEXT:    add.d $a0, $a0, $a1
1213; LA64-NEXT:    ret
1214;
1215; LA64-LARGE-LABEL: load_addr_offset_614749556925924693:
1216; LA64-LARGE:       # %bb.0: # %entry
1217; LA64-LARGE-NEXT:    pcalau12i $a0, %pc_hi20(g_a64+4917996455407397544)
1218; LA64-LARGE-NEXT:    addi.d $a1, $zero, %pc_lo12(g_a64+4917996455407397544)
1219; LA64-LARGE-NEXT:    lu32i.d $a1, %pc64_lo20(g_a64+4917996455407397544)
1220; LA64-LARGE-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(g_a64+4917996455407397544)
1221; LA64-LARGE-NEXT:    add.d $a0, $a1, $a0
1222; LA64-LARGE-NEXT:    ret
1223entry:
1224  ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 614749556925924693)
1225}
1226