xref: /llvm-project/llvm/test/CodeGen/LoongArch/machinelicm-address-pseudos.ll (revision b53866fec80d8676705409140b8ed2147ec44fad)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 --relocation-model=pic \
3; RUN:   --verify-machineinstrs < %s | FileCheck -check-prefixes=LA32 %s
4; RUN: llc --mtriple=loongarch64 --relocation-model=pic \
5; RUN:   --verify-machineinstrs < %s | FileCheck -check-prefixes=LA64 %s
6; RUN: llc --mtriple=loongarch64 --relocation-model=pic --code-model=large \
7; RUN:   --verify-machineinstrs < %s | FileCheck -check-prefixes=LA64LARGE %s
8
9; Verifies that MachineLICM can hoist address generation pseudos out of loops.
10
11@l = protected global i32 0, align 4
12
13define void @test_la_pcrel(i32 signext %n) {
14; LA32-LABEL: test_la_pcrel:
15; LA32:       # %bb.0: # %entry
16; LA32-NEXT:    move $a1, $zero
17; LA32-NEXT:    pcalau12i $a2, %pc_hi20(l)
18; LA32-NEXT:    .p2align 4, , 16
19; LA32-NEXT:  .LBB0_1: # %loop
20; LA32-NEXT:    # =>This Inner Loop Header: Depth=1
21; LA32-NEXT:    ld.w $zero, $a2, %pc_lo12(l)
22; LA32-NEXT:    addi.w $a1, $a1, 1
23; LA32-NEXT:    blt $a1, $a0, .LBB0_1
24; LA32-NEXT:  # %bb.2: # %ret
25; LA32-NEXT:    ret
26;
27; LA64-LABEL: test_la_pcrel:
28; LA64:       # %bb.0: # %entry
29; LA64-NEXT:    move $a1, $zero
30; LA64-NEXT:    pcalau12i $a2, %pc_hi20(l)
31; LA64-NEXT:    .p2align 4, , 16
32; LA64-NEXT:  .LBB0_1: # %loop
33; LA64-NEXT:    # =>This Inner Loop Header: Depth=1
34; LA64-NEXT:    ld.w $zero, $a2, %pc_lo12(l)
35; LA64-NEXT:    addi.w $a1, $a1, 1
36; LA64-NEXT:    blt $a1, $a0, .LBB0_1
37; LA64-NEXT:  # %bb.2: # %ret
38; LA64-NEXT:    ret
39;
40; LA64LARGE-LABEL: test_la_pcrel:
41; LA64LARGE:       # %bb.0: # %entry
42; LA64LARGE-NEXT:    pcalau12i $a1, %pc_hi20(l)
43; LA64LARGE-NEXT:    addi.d $a2, $zero, %pc_lo12(l)
44; LA64LARGE-NEXT:    lu32i.d $a2, %pc64_lo20(l)
45; LA64LARGE-NEXT:    lu52i.d $a2, $a2, %pc64_hi12(l)
46; LA64LARGE-NEXT:    move $a3, $zero
47; LA64LARGE-NEXT:    .p2align 4, , 16
48; LA64LARGE-NEXT:  .LBB0_1: # %loop
49; LA64LARGE-NEXT:    # =>This Inner Loop Header: Depth=1
50; LA64LARGE-NEXT:    ldx.w $zero, $a2, $a1
51; LA64LARGE-NEXT:    addi.w $a3, $a3, 1
52; LA64LARGE-NEXT:    blt $a3, $a0, .LBB0_1
53; LA64LARGE-NEXT:  # %bb.2: # %ret
54; LA64LARGE-NEXT:    ret
55entry:
56  br label %loop
57
58loop:
59  %i = phi i32 [ %inc, %loop ], [ 0, %entry ]
60  %0 = load volatile i32, ptr @l, align 4
61  %inc = add nuw nsw i32 %i, 1
62  %cmp = icmp slt i32 %inc, %n
63  br i1 %cmp, label %loop, label %ret
64
65ret:
66  ret void
67}
68
69@g = global i32 0, align 4
70
71define void @test_la_got(i32 signext %n) {
72; LA32-LABEL: test_la_got:
73; LA32:       # %bb.0: # %entry
74; LA32-NEXT:    pcalau12i $a1, %got_pc_hi20(g)
75; LA32-NEXT:    ld.w $a1, $a1, %got_pc_lo12(g)
76; LA32-NEXT:    move $a2, $zero
77; LA32-NEXT:    .p2align 4, , 16
78; LA32-NEXT:  .LBB1_1: # %loop
79; LA32-NEXT:    # =>This Inner Loop Header: Depth=1
80; LA32-NEXT:    ld.w $zero, $a1, 0
81; LA32-NEXT:    addi.w $a2, $a2, 1
82; LA32-NEXT:    blt $a2, $a0, .LBB1_1
83; LA32-NEXT:  # %bb.2: # %ret
84; LA32-NEXT:    ret
85;
86; LA64-LABEL: test_la_got:
87; LA64:       # %bb.0: # %entry
88; LA64-NEXT:    pcalau12i $a1, %got_pc_hi20(g)
89; LA64-NEXT:    ld.d $a1, $a1, %got_pc_lo12(g)
90; LA64-NEXT:    move $a2, $zero
91; LA64-NEXT:    .p2align 4, , 16
92; LA64-NEXT:  .LBB1_1: # %loop
93; LA64-NEXT:    # =>This Inner Loop Header: Depth=1
94; LA64-NEXT:    ld.w $zero, $a1, 0
95; LA64-NEXT:    addi.w $a2, $a2, 1
96; LA64-NEXT:    blt $a2, $a0, .LBB1_1
97; LA64-NEXT:  # %bb.2: # %ret
98; LA64-NEXT:    ret
99;
100; LA64LARGE-LABEL: test_la_got:
101; LA64LARGE:       # %bb.0: # %entry
102; LA64LARGE-NEXT:    pcalau12i $a1, %got_pc_hi20(g)
103; LA64LARGE-NEXT:    addi.d $a2, $zero, %got_pc_lo12(g)
104; LA64LARGE-NEXT:    lu32i.d $a2, %got64_pc_lo20(g)
105; LA64LARGE-NEXT:    lu52i.d $a2, $a2, %got64_pc_hi12(g)
106; LA64LARGE-NEXT:    ldx.d $a1, $a2, $a1
107; LA64LARGE-NEXT:    move $a2, $zero
108; LA64LARGE-NEXT:    .p2align 4, , 16
109; LA64LARGE-NEXT:  .LBB1_1: # %loop
110; LA64LARGE-NEXT:    # =>This Inner Loop Header: Depth=1
111; LA64LARGE-NEXT:    ld.w $zero, $a1, 0
112; LA64LARGE-NEXT:    addi.w $a2, $a2, 1
113; LA64LARGE-NEXT:    blt $a2, $a0, .LBB1_1
114; LA64LARGE-NEXT:  # %bb.2: # %ret
115; LA64LARGE-NEXT:    ret
116entry:
117  br label %loop
118
119loop:
120  %i = phi i32 [ %inc, %loop ], [ 0, %entry ]
121  %0 = load volatile i32, ptr @g, align 4
122  %inc = add nuw nsw i32 %i, 1
123  %cmp = icmp slt i32 %inc, %n
124  br i1 %cmp, label %loop, label %ret
125
126ret:
127  ret void
128}
129
130@ie = external thread_local(initialexec) global i32
131
132define void @test_la_tls_ie(i32 signext %n) {
133; LA32-LABEL: test_la_tls_ie:
134; LA32:       # %bb.0: # %entry
135; LA32-NEXT:    pcalau12i $a1, %ie_pc_hi20(ie)
136; LA32-NEXT:    ld.w $a2, $a1, %ie_pc_lo12(ie)
137; LA32-NEXT:    move $a1, $zero
138; LA32-NEXT:    add.w $a2, $a2, $tp
139; LA32-NEXT:    .p2align 4, , 16
140; LA32-NEXT:  .LBB2_1: # %loop
141; LA32-NEXT:    # =>This Inner Loop Header: Depth=1
142; LA32-NEXT:    ld.w $zero, $a2, 0
143; LA32-NEXT:    addi.w $a1, $a1, 1
144; LA32-NEXT:    blt $a1, $a0, .LBB2_1
145; LA32-NEXT:  # %bb.2: # %ret
146; LA32-NEXT:    ret
147;
148; LA64-LABEL: test_la_tls_ie:
149; LA64:       # %bb.0: # %entry
150; LA64-NEXT:    pcalau12i $a1, %ie_pc_hi20(ie)
151; LA64-NEXT:    ld.d $a1, $a1, %ie_pc_lo12(ie)
152; LA64-NEXT:    move $a2, $zero
153; LA64-NEXT:    .p2align 4, , 16
154; LA64-NEXT:  .LBB2_1: # %loop
155; LA64-NEXT:    # =>This Inner Loop Header: Depth=1
156; LA64-NEXT:    ldx.w $zero, $a1, $tp
157; LA64-NEXT:    addi.w $a2, $a2, 1
158; LA64-NEXT:    blt $a2, $a0, .LBB2_1
159; LA64-NEXT:  # %bb.2: # %ret
160; LA64-NEXT:    ret
161;
162; LA64LARGE-LABEL: test_la_tls_ie:
163; LA64LARGE:       # %bb.0: # %entry
164; LA64LARGE-NEXT:    pcalau12i $a1, %ie_pc_hi20(ie)
165; LA64LARGE-NEXT:    addi.d $a2, $zero, %ie_pc_lo12(ie)
166; LA64LARGE-NEXT:    lu32i.d $a2, %ie64_pc_lo20(ie)
167; LA64LARGE-NEXT:    lu52i.d $a2, $a2, %ie64_pc_hi12(ie)
168; LA64LARGE-NEXT:    ldx.d $a1, $a2, $a1
169; LA64LARGE-NEXT:    move $a2, $zero
170; LA64LARGE-NEXT:    .p2align 4, , 16
171; LA64LARGE-NEXT:  .LBB2_1: # %loop
172; LA64LARGE-NEXT:    # =>This Inner Loop Header: Depth=1
173; LA64LARGE-NEXT:    ldx.w $zero, $a1, $tp
174; LA64LARGE-NEXT:    addi.w $a2, $a2, 1
175; LA64LARGE-NEXT:    blt $a2, $a0, .LBB2_1
176; LA64LARGE-NEXT:  # %bb.2: # %ret
177; LA64LARGE-NEXT:    ret
178entry:
179  br label %loop
180
181loop:
182  %i = phi i32 [ %inc, %loop ], [ 0, %entry ]
183  %0 = load volatile i32, ptr @ie, align 4
184  %inc = add nuw nsw i32 %i, 1
185  %cmp = icmp slt i32 %inc, %n
186  br i1 %cmp, label %loop, label %ret
187
188ret:
189  ret void
190}
191
192@ld = external thread_local(localdynamic) global i32
193
194define void @test_la_tls_ld(i32 signext %n) {
195; LA32-LABEL: test_la_tls_ld:
196; LA32:       # %bb.0: # %entry
197; LA32-NEXT:    addi.w $sp, $sp, -16
198; LA32-NEXT:    .cfi_def_cfa_offset 16
199; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
200; LA32-NEXT:    st.w $fp, $sp, 8 # 4-byte Folded Spill
201; LA32-NEXT:    st.w $s0, $sp, 4 # 4-byte Folded Spill
202; LA32-NEXT:    st.w $s1, $sp, 0 # 4-byte Folded Spill
203; LA32-NEXT:    .cfi_offset 1, -4
204; LA32-NEXT:    .cfi_offset 22, -8
205; LA32-NEXT:    .cfi_offset 23, -12
206; LA32-NEXT:    .cfi_offset 24, -16
207; LA32-NEXT:    move $fp, $a0
208; LA32-NEXT:    move $s1, $zero
209; LA32-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
210; LA32-NEXT:    addi.w $s0, $a0, %got_pc_lo12(ld)
211; LA32-NEXT:    .p2align 4, , 16
212; LA32-NEXT:  .LBB3_1: # %loop
213; LA32-NEXT:    # =>This Inner Loop Header: Depth=1
214; LA32-NEXT:    move $a0, $s0
215; LA32-NEXT:    bl %plt(__tls_get_addr)
216; LA32-NEXT:    ld.w $zero, $a0, 0
217; LA32-NEXT:    addi.w $s1, $s1, 1
218; LA32-NEXT:    blt $s1, $fp, .LBB3_1
219; LA32-NEXT:  # %bb.2: # %ret
220; LA32-NEXT:    ld.w $s1, $sp, 0 # 4-byte Folded Reload
221; LA32-NEXT:    ld.w $s0, $sp, 4 # 4-byte Folded Reload
222; LA32-NEXT:    ld.w $fp, $sp, 8 # 4-byte Folded Reload
223; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
224; LA32-NEXT:    addi.w $sp, $sp, 16
225; LA32-NEXT:    ret
226;
227; LA64-LABEL: test_la_tls_ld:
228; LA64:       # %bb.0: # %entry
229; LA64-NEXT:    addi.d $sp, $sp, -32
230; LA64-NEXT:    .cfi_def_cfa_offset 32
231; LA64-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
232; LA64-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
233; LA64-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
234; LA64-NEXT:    st.d $s1, $sp, 0 # 8-byte Folded Spill
235; LA64-NEXT:    .cfi_offset 1, -8
236; LA64-NEXT:    .cfi_offset 22, -16
237; LA64-NEXT:    .cfi_offset 23, -24
238; LA64-NEXT:    .cfi_offset 24, -32
239; LA64-NEXT:    move $fp, $a0
240; LA64-NEXT:    move $s1, $zero
241; LA64-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
242; LA64-NEXT:    addi.d $s0, $a0, %got_pc_lo12(ld)
243; LA64-NEXT:    .p2align 4, , 16
244; LA64-NEXT:  .LBB3_1: # %loop
245; LA64-NEXT:    # =>This Inner Loop Header: Depth=1
246; LA64-NEXT:    move $a0, $s0
247; LA64-NEXT:    bl %plt(__tls_get_addr)
248; LA64-NEXT:    ld.w $zero, $a0, 0
249; LA64-NEXT:    addi.w $s1, $s1, 1
250; LA64-NEXT:    blt $s1, $fp, .LBB3_1
251; LA64-NEXT:  # %bb.2: # %ret
252; LA64-NEXT:    ld.d $s1, $sp, 0 # 8-byte Folded Reload
253; LA64-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
254; LA64-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
255; LA64-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
256; LA64-NEXT:    addi.d $sp, $sp, 32
257; LA64-NEXT:    ret
258;
259; LA64LARGE-LABEL: test_la_tls_ld:
260; LA64LARGE:       # %bb.0: # %entry
261; LA64LARGE-NEXT:    addi.d $sp, $sp, -32
262; LA64LARGE-NEXT:    .cfi_def_cfa_offset 32
263; LA64LARGE-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
264; LA64LARGE-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
265; LA64LARGE-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
266; LA64LARGE-NEXT:    st.d $s1, $sp, 0 # 8-byte Folded Spill
267; LA64LARGE-NEXT:    .cfi_offset 1, -8
268; LA64LARGE-NEXT:    .cfi_offset 22, -16
269; LA64LARGE-NEXT:    .cfi_offset 23, -24
270; LA64LARGE-NEXT:    .cfi_offset 24, -32
271; LA64LARGE-NEXT:    move $fp, $a0
272; LA64LARGE-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
273; LA64LARGE-NEXT:    addi.d $a1, $zero, %got_pc_lo12(ld)
274; LA64LARGE-NEXT:    lu32i.d $a1, %got64_pc_lo20(ld)
275; LA64LARGE-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(ld)
276; LA64LARGE-NEXT:    move $s1, $zero
277; LA64LARGE-NEXT:    add.d $s0, $a1, $a0
278; LA64LARGE-NEXT:    .p2align 4, , 16
279; LA64LARGE-NEXT:  .LBB3_1: # %loop
280; LA64LARGE-NEXT:    # =>This Inner Loop Header: Depth=1
281; LA64LARGE-NEXT:    move $a0, $s0
282; LA64LARGE-NEXT:    pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
283; LA64LARGE-NEXT:    addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
284; LA64LARGE-NEXT:    lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
285; LA64LARGE-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
286; LA64LARGE-NEXT:    ldx.d $ra, $ra, $a1
287; LA64LARGE-NEXT:    jirl $ra, $ra, 0
288; LA64LARGE-NEXT:    ld.w $zero, $a0, 0
289; LA64LARGE-NEXT:    addi.w $s1, $s1, 1
290; LA64LARGE-NEXT:    blt $s1, $fp, .LBB3_1
291; LA64LARGE-NEXT:  # %bb.2: # %ret
292; LA64LARGE-NEXT:    ld.d $s1, $sp, 0 # 8-byte Folded Reload
293; LA64LARGE-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
294; LA64LARGE-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
295; LA64LARGE-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
296; LA64LARGE-NEXT:    addi.d $sp, $sp, 32
297; LA64LARGE-NEXT:    ret
298entry:
299  br label %loop
300
301loop:
302  %i = phi i32 [ %inc, %loop ], [ 0, %entry ]
303  %0 = load volatile i32, ptr @ld, align 4
304  %inc = add nuw nsw i32 %i, 1
305  %cmp = icmp slt i32 %inc, %n
306  br i1 %cmp, label %loop, label %ret
307
308ret:
309  ret void
310}
311
312@le = external thread_local(localexec) global i32
313
314define void @test_la_tls_le(i32 signext %n) {
315; LA32-LABEL: test_la_tls_le:
316; LA32:       # %bb.0: # %entry
317; LA32-NEXT:    move $a1, $zero
318; LA32-NEXT:    lu12i.w $a2, %le_hi20_r(le)
319; LA32-NEXT:    add.w $a2, $a2, $tp, %le_add_r(le)
320; LA32-NEXT:    addi.w $a2, $a2, %le_lo12_r(le)
321; LA32-NEXT:    .p2align 4, , 16
322; LA32-NEXT:  .LBB4_1: # %loop
323; LA32-NEXT:    # =>This Inner Loop Header: Depth=1
324; LA32-NEXT:    ld.w $zero, $a2, 0
325; LA32-NEXT:    addi.w $a1, $a1, 1
326; LA32-NEXT:    blt $a1, $a0, .LBB4_1
327; LA32-NEXT:  # %bb.2: # %ret
328; LA32-NEXT:    ret
329;
330; LA64-LABEL: test_la_tls_le:
331; LA64:       # %bb.0: # %entry
332; LA64-NEXT:    move $a1, $zero
333; LA64-NEXT:    lu12i.w $a2, %le_hi20_r(le)
334; LA64-NEXT:    add.d $a2, $a2, $tp, %le_add_r(le)
335; LA64-NEXT:    addi.d $a2, $a2, %le_lo12_r(le)
336; LA64-NEXT:    .p2align 4, , 16
337; LA64-NEXT:  .LBB4_1: # %loop
338; LA64-NEXT:    # =>This Inner Loop Header: Depth=1
339; LA64-NEXT:    ld.w $zero, $a2, 0
340; LA64-NEXT:    addi.w $a1, $a1, 1
341; LA64-NEXT:    blt $a1, $a0, .LBB4_1
342; LA64-NEXT:  # %bb.2: # %ret
343; LA64-NEXT:    ret
344;
345; LA64LARGE-LABEL: test_la_tls_le:
346; LA64LARGE:       # %bb.0: # %entry
347; LA64LARGE-NEXT:    move $a1, $zero
348; LA64LARGE-NEXT:    lu12i.w $a2, %le_hi20(le)
349; LA64LARGE-NEXT:    ori $a2, $a2, %le_lo12(le)
350; LA64LARGE-NEXT:    lu32i.d $a2, %le64_lo20(le)
351; LA64LARGE-NEXT:    lu52i.d $a2, $a2, %le64_hi12(le)
352; LA64LARGE-NEXT:    .p2align 4, , 16
353; LA64LARGE-NEXT:  .LBB4_1: # %loop
354; LA64LARGE-NEXT:    # =>This Inner Loop Header: Depth=1
355; LA64LARGE-NEXT:    ldx.w $zero, $a2, $tp
356; LA64LARGE-NEXT:    addi.w $a1, $a1, 1
357; LA64LARGE-NEXT:    blt $a1, $a0, .LBB4_1
358; LA64LARGE-NEXT:  # %bb.2: # %ret
359; LA64LARGE-NEXT:    ret
360entry:
361  br label %loop
362
363loop:
364  %i = phi i32 [ %inc, %loop ], [ 0, %entry ]
365  %0 = load volatile i32, ptr @le, align 4
366  %inc = add nuw nsw i32 %i, 1
367  %cmp = icmp slt i32 %inc, %n
368  br i1 %cmp, label %loop, label %ret
369
370ret:
371  ret void
372}
373
374@gd = external thread_local global i32
375
376define void @test_la_tls_gd(i32 signext %n) nounwind {
377; LA32-LABEL: test_la_tls_gd:
378; LA32:       # %bb.0: # %entry
379; LA32-NEXT:    addi.w $sp, $sp, -16
380; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
381; LA32-NEXT:    st.w $fp, $sp, 8 # 4-byte Folded Spill
382; LA32-NEXT:    st.w $s0, $sp, 4 # 4-byte Folded Spill
383; LA32-NEXT:    st.w $s1, $sp, 0 # 4-byte Folded Spill
384; LA32-NEXT:    move $fp, $a0
385; LA32-NEXT:    move $s1, $zero
386; LA32-NEXT:    pcalau12i $a0, %gd_pc_hi20(gd)
387; LA32-NEXT:    addi.w $s0, $a0, %got_pc_lo12(gd)
388; LA32-NEXT:    .p2align 4, , 16
389; LA32-NEXT:  .LBB5_1: # %loop
390; LA32-NEXT:    # =>This Inner Loop Header: Depth=1
391; LA32-NEXT:    move $a0, $s0
392; LA32-NEXT:    bl %plt(__tls_get_addr)
393; LA32-NEXT:    ld.w $zero, $a0, 0
394; LA32-NEXT:    addi.w $s1, $s1, 1
395; LA32-NEXT:    blt $s1, $fp, .LBB5_1
396; LA32-NEXT:  # %bb.2: # %ret
397; LA32-NEXT:    ld.w $s1, $sp, 0 # 4-byte Folded Reload
398; LA32-NEXT:    ld.w $s0, $sp, 4 # 4-byte Folded Reload
399; LA32-NEXT:    ld.w $fp, $sp, 8 # 4-byte Folded Reload
400; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
401; LA32-NEXT:    addi.w $sp, $sp, 16
402; LA32-NEXT:    ret
403;
404; LA64-LABEL: test_la_tls_gd:
405; LA64:       # %bb.0: # %entry
406; LA64-NEXT:    addi.d $sp, $sp, -32
407; LA64-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
408; LA64-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
409; LA64-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
410; LA64-NEXT:    st.d $s1, $sp, 0 # 8-byte Folded Spill
411; LA64-NEXT:    move $fp, $a0
412; LA64-NEXT:    move $s1, $zero
413; LA64-NEXT:    pcalau12i $a0, %gd_pc_hi20(gd)
414; LA64-NEXT:    addi.d $s0, $a0, %got_pc_lo12(gd)
415; LA64-NEXT:    .p2align 4, , 16
416; LA64-NEXT:  .LBB5_1: # %loop
417; LA64-NEXT:    # =>This Inner Loop Header: Depth=1
418; LA64-NEXT:    move $a0, $s0
419; LA64-NEXT:    bl %plt(__tls_get_addr)
420; LA64-NEXT:    ld.w $zero, $a0, 0
421; LA64-NEXT:    addi.w $s1, $s1, 1
422; LA64-NEXT:    blt $s1, $fp, .LBB5_1
423; LA64-NEXT:  # %bb.2: # %ret
424; LA64-NEXT:    ld.d $s1, $sp, 0 # 8-byte Folded Reload
425; LA64-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
426; LA64-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
427; LA64-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
428; LA64-NEXT:    addi.d $sp, $sp, 32
429; LA64-NEXT:    ret
430;
431; LA64LARGE-LABEL: test_la_tls_gd:
432; LA64LARGE:       # %bb.0: # %entry
433; LA64LARGE-NEXT:    addi.d $sp, $sp, -32
434; LA64LARGE-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
435; LA64LARGE-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
436; LA64LARGE-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
437; LA64LARGE-NEXT:    st.d $s1, $sp, 0 # 8-byte Folded Spill
438; LA64LARGE-NEXT:    move $fp, $a0
439; LA64LARGE-NEXT:    pcalau12i $a0, %gd_pc_hi20(gd)
440; LA64LARGE-NEXT:    addi.d $a1, $zero, %got_pc_lo12(gd)
441; LA64LARGE-NEXT:    lu32i.d $a1, %got64_pc_lo20(gd)
442; LA64LARGE-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(gd)
443; LA64LARGE-NEXT:    move $s1, $zero
444; LA64LARGE-NEXT:    add.d $s0, $a1, $a0
445; LA64LARGE-NEXT:    .p2align 4, , 16
446; LA64LARGE-NEXT:  .LBB5_1: # %loop
447; LA64LARGE-NEXT:    # =>This Inner Loop Header: Depth=1
448; LA64LARGE-NEXT:    move $a0, $s0
449; LA64LARGE-NEXT:    pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
450; LA64LARGE-NEXT:    addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
451; LA64LARGE-NEXT:    lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
452; LA64LARGE-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
453; LA64LARGE-NEXT:    ldx.d $ra, $ra, $a1
454; LA64LARGE-NEXT:    jirl $ra, $ra, 0
455; LA64LARGE-NEXT:    ld.w $zero, $a0, 0
456; LA64LARGE-NEXT:    addi.w $s1, $s1, 1
457; LA64LARGE-NEXT:    blt $s1, $fp, .LBB5_1
458; LA64LARGE-NEXT:  # %bb.2: # %ret
459; LA64LARGE-NEXT:    ld.d $s1, $sp, 0 # 8-byte Folded Reload
460; LA64LARGE-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
461; LA64LARGE-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
462; LA64LARGE-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
463; LA64LARGE-NEXT:    addi.d $sp, $sp, 32
464; LA64LARGE-NEXT:    ret
465entry:
466  br label %loop
467
468loop:
469  %i = phi i32 [ %inc, %loop ], [ 0, %entry ]
470  %0 = load volatile i32, ptr @gd, align 4
471  %inc = add nuw nsw i32 %i, 1
472  %cmp = icmp slt i32 %inc, %n
473  br i1 %cmp, label %loop, label %ret
474
475ret:
476  ret void
477}
478