xref: /llvm-project/llvm/test/CodeGen/LoongArch/stack-realignment.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s \
3; RUN:   | FileCheck %s --check-prefix=LA32
4; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \
5; RUN:   | FileCheck %s --check-prefix=LA64
6
7declare void @callee(ptr)
8
9define void @caller32() {
10; LA32-LABEL: caller32:
11; LA32:       # %bb.0:
12; LA32-NEXT:    addi.w $sp, $sp, -32
13; LA32-NEXT:    .cfi_def_cfa_offset 32
14; LA32-NEXT:    st.w $ra, $sp, 28 # 4-byte Folded Spill
15; LA32-NEXT:    st.w $fp, $sp, 24 # 4-byte Folded Spill
16; LA32-NEXT:    .cfi_offset 1, -4
17; LA32-NEXT:    .cfi_offset 22, -8
18; LA32-NEXT:    addi.w $fp, $sp, 32
19; LA32-NEXT:    .cfi_def_cfa 22, 0
20; LA32-NEXT:    bstrins.w $sp, $zero, 4, 0
21; LA32-NEXT:    addi.w $a0, $sp, 0
22; LA32-NEXT:    bl %plt(callee)
23; LA32-NEXT:    addi.w $sp, $fp, -32
24; LA32-NEXT:    ld.w $fp, $sp, 24 # 4-byte Folded Reload
25; LA32-NEXT:    ld.w $ra, $sp, 28 # 4-byte Folded Reload
26; LA32-NEXT:    addi.w $sp, $sp, 32
27; LA32-NEXT:    ret
28;
29; LA64-LABEL: caller32:
30; LA64:       # %bb.0:
31; LA64-NEXT:    addi.d $sp, $sp, -32
32; LA64-NEXT:    .cfi_def_cfa_offset 32
33; LA64-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
34; LA64-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
35; LA64-NEXT:    .cfi_offset 1, -8
36; LA64-NEXT:    .cfi_offset 22, -16
37; LA64-NEXT:    addi.d $fp, $sp, 32
38; LA64-NEXT:    .cfi_def_cfa 22, 0
39; LA64-NEXT:    bstrins.d $sp, $zero, 4, 0
40; LA64-NEXT:    addi.d $a0, $sp, 0
41; LA64-NEXT:    bl %plt(callee)
42; LA64-NEXT:    addi.d $sp, $fp, -32
43; LA64-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
44; LA64-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
45; LA64-NEXT:    addi.d $sp, $sp, 32
46; LA64-NEXT:    ret
47  %1 = alloca i8, align 32
48  call void @callee(ptr %1)
49  ret void
50}
51
52define void @caller_no_realign32() "no-realign-stack" {
53; LA32-LABEL: caller_no_realign32:
54; LA32:       # %bb.0:
55; LA32-NEXT:    addi.w $sp, $sp, -16
56; LA32-NEXT:    .cfi_def_cfa_offset 16
57; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
58; LA32-NEXT:    .cfi_offset 1, -4
59; LA32-NEXT:    addi.w $a0, $sp, 0
60; LA32-NEXT:    bl %plt(callee)
61; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
62; LA32-NEXT:    addi.w $sp, $sp, 16
63; LA32-NEXT:    ret
64;
65; LA64-LABEL: caller_no_realign32:
66; LA64:       # %bb.0:
67; LA64-NEXT:    addi.d $sp, $sp, -16
68; LA64-NEXT:    .cfi_def_cfa_offset 16
69; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
70; LA64-NEXT:    .cfi_offset 1, -8
71; LA64-NEXT:    addi.d $a0, $sp, 0
72; LA64-NEXT:    bl %plt(callee)
73; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
74; LA64-NEXT:    addi.d $sp, $sp, 16
75; LA64-NEXT:    ret
76  %1 = alloca i8, align 32
77  call void @callee(ptr %1)
78  ret void
79}
80
81define void @caller64() {
82; LA32-LABEL: caller64:
83; LA32:       # %bb.0:
84; LA32-NEXT:    addi.w $sp, $sp, -64
85; LA32-NEXT:    .cfi_def_cfa_offset 64
86; LA32-NEXT:    st.w $ra, $sp, 60 # 4-byte Folded Spill
87; LA32-NEXT:    st.w $fp, $sp, 56 # 4-byte Folded Spill
88; LA32-NEXT:    .cfi_offset 1, -4
89; LA32-NEXT:    .cfi_offset 22, -8
90; LA32-NEXT:    addi.w $fp, $sp, 64
91; LA32-NEXT:    .cfi_def_cfa 22, 0
92; LA32-NEXT:    bstrins.w $sp, $zero, 5, 0
93; LA32-NEXT:    addi.w $a0, $sp, 0
94; LA32-NEXT:    bl %plt(callee)
95; LA32-NEXT:    addi.w $sp, $fp, -64
96; LA32-NEXT:    ld.w $fp, $sp, 56 # 4-byte Folded Reload
97; LA32-NEXT:    ld.w $ra, $sp, 60 # 4-byte Folded Reload
98; LA32-NEXT:    addi.w $sp, $sp, 64
99; LA32-NEXT:    ret
100;
101; LA64-LABEL: caller64:
102; LA64:       # %bb.0:
103; LA64-NEXT:    addi.d $sp, $sp, -64
104; LA64-NEXT:    .cfi_def_cfa_offset 64
105; LA64-NEXT:    st.d $ra, $sp, 56 # 8-byte Folded Spill
106; LA64-NEXT:    st.d $fp, $sp, 48 # 8-byte Folded Spill
107; LA64-NEXT:    .cfi_offset 1, -8
108; LA64-NEXT:    .cfi_offset 22, -16
109; LA64-NEXT:    addi.d $fp, $sp, 64
110; LA64-NEXT:    .cfi_def_cfa 22, 0
111; LA64-NEXT:    bstrins.d $sp, $zero, 5, 0
112; LA64-NEXT:    addi.d $a0, $sp, 0
113; LA64-NEXT:    bl %plt(callee)
114; LA64-NEXT:    addi.d $sp, $fp, -64
115; LA64-NEXT:    ld.d $fp, $sp, 48 # 8-byte Folded Reload
116; LA64-NEXT:    ld.d $ra, $sp, 56 # 8-byte Folded Reload
117; LA64-NEXT:    addi.d $sp, $sp, 64
118; LA64-NEXT:    ret
119  %1 = alloca i8, align 64
120  call void @callee(ptr %1)
121  ret void
122}
123
124define void @caller_no_realign64() "no-realign-stack" {
125; LA32-LABEL: caller_no_realign64:
126; LA32:       # %bb.0:
127; LA32-NEXT:    addi.w $sp, $sp, -16
128; LA32-NEXT:    .cfi_def_cfa_offset 16
129; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
130; LA32-NEXT:    .cfi_offset 1, -4
131; LA32-NEXT:    addi.w $a0, $sp, 0
132; LA32-NEXT:    bl %plt(callee)
133; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
134; LA32-NEXT:    addi.w $sp, $sp, 16
135; LA32-NEXT:    ret
136;
137; LA64-LABEL: caller_no_realign64:
138; LA64:       # %bb.0:
139; LA64-NEXT:    addi.d $sp, $sp, -16
140; LA64-NEXT:    .cfi_def_cfa_offset 16
141; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
142; LA64-NEXT:    .cfi_offset 1, -8
143; LA64-NEXT:    addi.d $a0, $sp, 0
144; LA64-NEXT:    bl %plt(callee)
145; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
146; LA64-NEXT:    addi.d $sp, $sp, 16
147; LA64-NEXT:    ret
148  %1 = alloca i8, align 64
149  call void @callee(ptr %1)
150  ret void
151}
152
153define void @caller128() {
154; LA32-LABEL: caller128:
155; LA32:       # %bb.0:
156; LA32-NEXT:    addi.w $sp, $sp, -128
157; LA32-NEXT:    .cfi_def_cfa_offset 128
158; LA32-NEXT:    st.w $ra, $sp, 124 # 4-byte Folded Spill
159; LA32-NEXT:    st.w $fp, $sp, 120 # 4-byte Folded Spill
160; LA32-NEXT:    .cfi_offset 1, -4
161; LA32-NEXT:    .cfi_offset 22, -8
162; LA32-NEXT:    addi.w $fp, $sp, 128
163; LA32-NEXT:    .cfi_def_cfa 22, 0
164; LA32-NEXT:    bstrins.w $sp, $zero, 6, 0
165; LA32-NEXT:    addi.w $a0, $sp, 0
166; LA32-NEXT:    bl %plt(callee)
167; LA32-NEXT:    addi.w $sp, $fp, -128
168; LA32-NEXT:    ld.w $fp, $sp, 120 # 4-byte Folded Reload
169; LA32-NEXT:    ld.w $ra, $sp, 124 # 4-byte Folded Reload
170; LA32-NEXT:    addi.w $sp, $sp, 128
171; LA32-NEXT:    ret
172;
173; LA64-LABEL: caller128:
174; LA64:       # %bb.0:
175; LA64-NEXT:    addi.d $sp, $sp, -128
176; LA64-NEXT:    .cfi_def_cfa_offset 128
177; LA64-NEXT:    st.d $ra, $sp, 120 # 8-byte Folded Spill
178; LA64-NEXT:    st.d $fp, $sp, 112 # 8-byte Folded Spill
179; LA64-NEXT:    .cfi_offset 1, -8
180; LA64-NEXT:    .cfi_offset 22, -16
181; LA64-NEXT:    addi.d $fp, $sp, 128
182; LA64-NEXT:    .cfi_def_cfa 22, 0
183; LA64-NEXT:    bstrins.d $sp, $zero, 6, 0
184; LA64-NEXT:    addi.d $a0, $sp, 0
185; LA64-NEXT:    bl %plt(callee)
186; LA64-NEXT:    addi.d $sp, $fp, -128
187; LA64-NEXT:    ld.d $fp, $sp, 112 # 8-byte Folded Reload
188; LA64-NEXT:    ld.d $ra, $sp, 120 # 8-byte Folded Reload
189; LA64-NEXT:    addi.d $sp, $sp, 128
190; LA64-NEXT:    ret
191  %1 = alloca i8, align 128
192  call void @callee(ptr %1)
193  ret void
194}
195
196define void @caller_no_realign128() "no-realign-stack" {
197; LA32-LABEL: caller_no_realign128:
198; LA32:       # %bb.0:
199; LA32-NEXT:    addi.w $sp, $sp, -16
200; LA32-NEXT:    .cfi_def_cfa_offset 16
201; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
202; LA32-NEXT:    .cfi_offset 1, -4
203; LA32-NEXT:    addi.w $a0, $sp, 0
204; LA32-NEXT:    bl %plt(callee)
205; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
206; LA32-NEXT:    addi.w $sp, $sp, 16
207; LA32-NEXT:    ret
208;
209; LA64-LABEL: caller_no_realign128:
210; LA64:       # %bb.0:
211; LA64-NEXT:    addi.d $sp, $sp, -16
212; LA64-NEXT:    .cfi_def_cfa_offset 16
213; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
214; LA64-NEXT:    .cfi_offset 1, -8
215; LA64-NEXT:    addi.d $a0, $sp, 0
216; LA64-NEXT:    bl %plt(callee)
217; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
218; LA64-NEXT:    addi.d $sp, $sp, 16
219; LA64-NEXT:    ret
220  %1 = alloca i8, align 128
221  call void @callee(ptr %1)
222  ret void
223}
224
225define void @caller256() {
226; LA32-LABEL: caller256:
227; LA32:       # %bb.0:
228; LA32-NEXT:    addi.w $sp, $sp, -256
229; LA32-NEXT:    .cfi_def_cfa_offset 256
230; LA32-NEXT:    st.w $ra, $sp, 252 # 4-byte Folded Spill
231; LA32-NEXT:    st.w $fp, $sp, 248 # 4-byte Folded Spill
232; LA32-NEXT:    .cfi_offset 1, -4
233; LA32-NEXT:    .cfi_offset 22, -8
234; LA32-NEXT:    addi.w $fp, $sp, 256
235; LA32-NEXT:    .cfi_def_cfa 22, 0
236; LA32-NEXT:    bstrins.w $sp, $zero, 7, 0
237; LA32-NEXT:    addi.w $a0, $sp, 0
238; LA32-NEXT:    bl %plt(callee)
239; LA32-NEXT:    addi.w $sp, $fp, -256
240; LA32-NEXT:    ld.w $fp, $sp, 248 # 4-byte Folded Reload
241; LA32-NEXT:    ld.w $ra, $sp, 252 # 4-byte Folded Reload
242; LA32-NEXT:    addi.w $sp, $sp, 256
243; LA32-NEXT:    ret
244;
245; LA64-LABEL: caller256:
246; LA64:       # %bb.0:
247; LA64-NEXT:    addi.d $sp, $sp, -256
248; LA64-NEXT:    .cfi_def_cfa_offset 256
249; LA64-NEXT:    st.d $ra, $sp, 248 # 8-byte Folded Spill
250; LA64-NEXT:    st.d $fp, $sp, 240 # 8-byte Folded Spill
251; LA64-NEXT:    .cfi_offset 1, -8
252; LA64-NEXT:    .cfi_offset 22, -16
253; LA64-NEXT:    addi.d $fp, $sp, 256
254; LA64-NEXT:    .cfi_def_cfa 22, 0
255; LA64-NEXT:    bstrins.d $sp, $zero, 7, 0
256; LA64-NEXT:    addi.d $a0, $sp, 0
257; LA64-NEXT:    bl %plt(callee)
258; LA64-NEXT:    addi.d $sp, $fp, -256
259; LA64-NEXT:    ld.d $fp, $sp, 240 # 8-byte Folded Reload
260; LA64-NEXT:    ld.d $ra, $sp, 248 # 8-byte Folded Reload
261; LA64-NEXT:    addi.d $sp, $sp, 256
262; LA64-NEXT:    ret
263  %1 = alloca i8, align 256
264  call void @callee(ptr %1)
265  ret void
266}
267
268define void @caller_no_realign256() "no-realign-stack" {
269; LA32-LABEL: caller_no_realign256:
270; LA32:       # %bb.0:
271; LA32-NEXT:    addi.w $sp, $sp, -16
272; LA32-NEXT:    .cfi_def_cfa_offset 16
273; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
274; LA32-NEXT:    .cfi_offset 1, -4
275; LA32-NEXT:    addi.w $a0, $sp, 0
276; LA32-NEXT:    bl %plt(callee)
277; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
278; LA32-NEXT:    addi.w $sp, $sp, 16
279; LA32-NEXT:    ret
280;
281; LA64-LABEL: caller_no_realign256:
282; LA64:       # %bb.0:
283; LA64-NEXT:    addi.d $sp, $sp, -16
284; LA64-NEXT:    .cfi_def_cfa_offset 16
285; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
286; LA64-NEXT:    .cfi_offset 1, -8
287; LA64-NEXT:    addi.d $a0, $sp, 0
288; LA64-NEXT:    bl %plt(callee)
289; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
290; LA64-NEXT:    addi.d $sp, $sp, 16
291; LA64-NEXT:    ret
292  %1 = alloca i8, align 256
293  call void @callee(ptr %1)
294  ret void
295}
296
297define void @caller512() {
298; LA32-LABEL: caller512:
299; LA32:       # %bb.0:
300; LA32-NEXT:    addi.w $sp, $sp, -1024
301; LA32-NEXT:    .cfi_def_cfa_offset 1024
302; LA32-NEXT:    st.w $ra, $sp, 1020 # 4-byte Folded Spill
303; LA32-NEXT:    st.w $fp, $sp, 1016 # 4-byte Folded Spill
304; LA32-NEXT:    .cfi_offset 1, -4
305; LA32-NEXT:    .cfi_offset 22, -8
306; LA32-NEXT:    addi.w $fp, $sp, 1024
307; LA32-NEXT:    .cfi_def_cfa 22, 0
308; LA32-NEXT:    bstrins.w $sp, $zero, 8, 0
309; LA32-NEXT:    addi.w $a0, $sp, 512
310; LA32-NEXT:    bl %plt(callee)
311; LA32-NEXT:    addi.w $sp, $fp, -1024
312; LA32-NEXT:    ld.w $fp, $sp, 1016 # 4-byte Folded Reload
313; LA32-NEXT:    ld.w $ra, $sp, 1020 # 4-byte Folded Reload
314; LA32-NEXT:    addi.w $sp, $sp, 1024
315; LA32-NEXT:    ret
316;
317; LA64-LABEL: caller512:
318; LA64:       # %bb.0:
319; LA64-NEXT:    addi.d $sp, $sp, -1024
320; LA64-NEXT:    .cfi_def_cfa_offset 1024
321; LA64-NEXT:    st.d $ra, $sp, 1016 # 8-byte Folded Spill
322; LA64-NEXT:    st.d $fp, $sp, 1008 # 8-byte Folded Spill
323; LA64-NEXT:    .cfi_offset 1, -8
324; LA64-NEXT:    .cfi_offset 22, -16
325; LA64-NEXT:    addi.d $fp, $sp, 1024
326; LA64-NEXT:    .cfi_def_cfa 22, 0
327; LA64-NEXT:    bstrins.d $sp, $zero, 8, 0
328; LA64-NEXT:    addi.d $a0, $sp, 512
329; LA64-NEXT:    bl %plt(callee)
330; LA64-NEXT:    addi.d $sp, $fp, -1024
331; LA64-NEXT:    ld.d $fp, $sp, 1008 # 8-byte Folded Reload
332; LA64-NEXT:    ld.d $ra, $sp, 1016 # 8-byte Folded Reload
333; LA64-NEXT:    addi.d $sp, $sp, 1024
334; LA64-NEXT:    ret
335  %1 = alloca i8, align 512
336  call void @callee(ptr %1)
337  ret void
338}
339
340define void @caller_no_realign512() "no-realign-stack" {
341; LA32-LABEL: caller_no_realign512:
342; LA32:       # %bb.0:
343; LA32-NEXT:    addi.w $sp, $sp, -16
344; LA32-NEXT:    .cfi_def_cfa_offset 16
345; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
346; LA32-NEXT:    .cfi_offset 1, -4
347; LA32-NEXT:    addi.w $a0, $sp, 0
348; LA32-NEXT:    bl %plt(callee)
349; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
350; LA32-NEXT:    addi.w $sp, $sp, 16
351; LA32-NEXT:    ret
352;
353; LA64-LABEL: caller_no_realign512:
354; LA64:       # %bb.0:
355; LA64-NEXT:    addi.d $sp, $sp, -16
356; LA64-NEXT:    .cfi_def_cfa_offset 16
357; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
358; LA64-NEXT:    .cfi_offset 1, -8
359; LA64-NEXT:    addi.d $a0, $sp, 0
360; LA64-NEXT:    bl %plt(callee)
361; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
362; LA64-NEXT:    addi.d $sp, $sp, 16
363; LA64-NEXT:    ret
364  %1 = alloca i8, align 512
365  call void @callee(ptr %1)
366  ret void
367}
368
369define void @caller1024() {
370; LA32-LABEL: caller1024:
371; LA32:       # %bb.0:
372; LA32-NEXT:    addi.w $sp, $sp, -2032
373; LA32-NEXT:    .cfi_def_cfa_offset 2032
374; LA32-NEXT:    st.w $ra, $sp, 2028 # 4-byte Folded Spill
375; LA32-NEXT:    st.w $fp, $sp, 2024 # 4-byte Folded Spill
376; LA32-NEXT:    .cfi_offset 1, -4
377; LA32-NEXT:    .cfi_offset 22, -8
378; LA32-NEXT:    addi.w $fp, $sp, 2032
379; LA32-NEXT:    .cfi_def_cfa 22, 0
380; LA32-NEXT:    addi.w $sp, $sp, -16
381; LA32-NEXT:    bstrins.w $sp, $zero, 9, 0
382; LA32-NEXT:    addi.w $a0, $sp, 1024
383; LA32-NEXT:    bl %plt(callee)
384; LA32-NEXT:    addi.w $sp, $fp, -2048
385; LA32-NEXT:    addi.w $sp, $sp, 16
386; LA32-NEXT:    ld.w $fp, $sp, 2024 # 4-byte Folded Reload
387; LA32-NEXT:    ld.w $ra, $sp, 2028 # 4-byte Folded Reload
388; LA32-NEXT:    addi.w $sp, $sp, 2032
389; LA32-NEXT:    ret
390;
391; LA64-LABEL: caller1024:
392; LA64:       # %bb.0:
393; LA64-NEXT:    addi.d $sp, $sp, -2032
394; LA64-NEXT:    .cfi_def_cfa_offset 2032
395; LA64-NEXT:    st.d $ra, $sp, 2024 # 8-byte Folded Spill
396; LA64-NEXT:    st.d $fp, $sp, 2016 # 8-byte Folded Spill
397; LA64-NEXT:    .cfi_offset 1, -8
398; LA64-NEXT:    .cfi_offset 22, -16
399; LA64-NEXT:    addi.d $fp, $sp, 2032
400; LA64-NEXT:    .cfi_def_cfa 22, 0
401; LA64-NEXT:    addi.d $sp, $sp, -16
402; LA64-NEXT:    bstrins.d $sp, $zero, 9, 0
403; LA64-NEXT:    addi.d $a0, $sp, 1024
404; LA64-NEXT:    bl %plt(callee)
405; LA64-NEXT:    addi.d $sp, $fp, -2048
406; LA64-NEXT:    addi.d $sp, $sp, 16
407; LA64-NEXT:    ld.d $fp, $sp, 2016 # 8-byte Folded Reload
408; LA64-NEXT:    ld.d $ra, $sp, 2024 # 8-byte Folded Reload
409; LA64-NEXT:    addi.d $sp, $sp, 2032
410; LA64-NEXT:    ret
411  %1 = alloca i8, align 1024
412  call void @callee(ptr %1)
413  ret void
414}
415
416define void @caller_no_realign1024() "no-realign-stack" {
417; LA32-LABEL: caller_no_realign1024:
418; LA32:       # %bb.0:
419; LA32-NEXT:    addi.w $sp, $sp, -16
420; LA32-NEXT:    .cfi_def_cfa_offset 16
421; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
422; LA32-NEXT:    .cfi_offset 1, -4
423; LA32-NEXT:    addi.w $a0, $sp, 0
424; LA32-NEXT:    bl %plt(callee)
425; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
426; LA32-NEXT:    addi.w $sp, $sp, 16
427; LA32-NEXT:    ret
428;
429; LA64-LABEL: caller_no_realign1024:
430; LA64:       # %bb.0:
431; LA64-NEXT:    addi.d $sp, $sp, -16
432; LA64-NEXT:    .cfi_def_cfa_offset 16
433; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
434; LA64-NEXT:    .cfi_offset 1, -8
435; LA64-NEXT:    addi.d $a0, $sp, 0
436; LA64-NEXT:    bl %plt(callee)
437; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
438; LA64-NEXT:    addi.d $sp, $sp, 16
439; LA64-NEXT:    ret
440  %1 = alloca i8, align 1024
441  call void @callee(ptr %1)
442  ret void
443}
444
445define void @caller2048() {
446; LA32-LABEL: caller2048:
447; LA32:       # %bb.0:
448; LA32-NEXT:    addi.w $sp, $sp, -2032
449; LA32-NEXT:    .cfi_def_cfa_offset 2032
450; LA32-NEXT:    st.w $ra, $sp, 2028 # 4-byte Folded Spill
451; LA32-NEXT:    st.w $fp, $sp, 2024 # 4-byte Folded Spill
452; LA32-NEXT:    .cfi_offset 1, -4
453; LA32-NEXT:    .cfi_offset 22, -8
454; LA32-NEXT:    addi.w $fp, $sp, 2032
455; LA32-NEXT:    .cfi_def_cfa 22, 0
456; LA32-NEXT:    addi.w $sp, $sp, -2048
457; LA32-NEXT:    addi.w $sp, $sp, -16
458; LA32-NEXT:    bstrins.w $sp, $zero, 10, 0
459; LA32-NEXT:    ori $a0, $zero, 2048
460; LA32-NEXT:    add.w $a0, $sp, $a0
461; LA32-NEXT:    bl %plt(callee)
462; LA32-NEXT:    lu12i.w $a0, 1
463; LA32-NEXT:    sub.w $sp, $fp, $a0
464; LA32-NEXT:    addi.w $sp, $sp, 2032
465; LA32-NEXT:    addi.w $sp, $sp, 32
466; LA32-NEXT:    ld.w $fp, $sp, 2024 # 4-byte Folded Reload
467; LA32-NEXT:    ld.w $ra, $sp, 2028 # 4-byte Folded Reload
468; LA32-NEXT:    addi.w $sp, $sp, 2032
469; LA32-NEXT:    ret
470;
471; LA64-LABEL: caller2048:
472; LA64:       # %bb.0:
473; LA64-NEXT:    addi.d $sp, $sp, -2032
474; LA64-NEXT:    .cfi_def_cfa_offset 2032
475; LA64-NEXT:    st.d $ra, $sp, 2024 # 8-byte Folded Spill
476; LA64-NEXT:    st.d $fp, $sp, 2016 # 8-byte Folded Spill
477; LA64-NEXT:    .cfi_offset 1, -8
478; LA64-NEXT:    .cfi_offset 22, -16
479; LA64-NEXT:    addi.d $fp, $sp, 2032
480; LA64-NEXT:    .cfi_def_cfa 22, 0
481; LA64-NEXT:    addi.d $sp, $sp, -2048
482; LA64-NEXT:    addi.d $sp, $sp, -16
483; LA64-NEXT:    bstrins.d $sp, $zero, 10, 0
484; LA64-NEXT:    ori $a0, $zero, 2048
485; LA64-NEXT:    add.d $a0, $sp, $a0
486; LA64-NEXT:    bl %plt(callee)
487; LA64-NEXT:    lu12i.w $a0, 1
488; LA64-NEXT:    sub.d $sp, $fp, $a0
489; LA64-NEXT:    addi.d $sp, $sp, 2032
490; LA64-NEXT:    addi.d $sp, $sp, 32
491; LA64-NEXT:    ld.d $fp, $sp, 2016 # 8-byte Folded Reload
492; LA64-NEXT:    ld.d $ra, $sp, 2024 # 8-byte Folded Reload
493; LA64-NEXT:    addi.d $sp, $sp, 2032
494; LA64-NEXT:    ret
495  %1 = alloca i8, align 2048
496  call void @callee(ptr %1)
497  ret void
498}
499
500define void @caller_no_realign2048() "no-realign-stack" {
501; LA32-LABEL: caller_no_realign2048:
502; LA32:       # %bb.0:
503; LA32-NEXT:    addi.w $sp, $sp, -16
504; LA32-NEXT:    .cfi_def_cfa_offset 16
505; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
506; LA32-NEXT:    .cfi_offset 1, -4
507; LA32-NEXT:    addi.w $a0, $sp, 0
508; LA32-NEXT:    bl %plt(callee)
509; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
510; LA32-NEXT:    addi.w $sp, $sp, 16
511; LA32-NEXT:    ret
512;
513; LA64-LABEL: caller_no_realign2048:
514; LA64:       # %bb.0:
515; LA64-NEXT:    addi.d $sp, $sp, -16
516; LA64-NEXT:    .cfi_def_cfa_offset 16
517; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
518; LA64-NEXT:    .cfi_offset 1, -8
519; LA64-NEXT:    addi.d $a0, $sp, 0
520; LA64-NEXT:    bl %plt(callee)
521; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
522; LA64-NEXT:    addi.d $sp, $sp, 16
523; LA64-NEXT:    ret
524  %1 = alloca i8, align 2048
525  call void @callee(ptr %1)
526  ret void
527}
528
529define void @caller4096() {
530; LA32-LABEL: caller4096:
531; LA32:       # %bb.0:
532; LA32-NEXT:    addi.w $sp, $sp, -2032
533; LA32-NEXT:    .cfi_def_cfa_offset 2032
534; LA32-NEXT:    st.w $ra, $sp, 2028 # 4-byte Folded Spill
535; LA32-NEXT:    st.w $fp, $sp, 2024 # 4-byte Folded Spill
536; LA32-NEXT:    .cfi_offset 1, -4
537; LA32-NEXT:    .cfi_offset 22, -8
538; LA32-NEXT:    addi.w $fp, $sp, 2032
539; LA32-NEXT:    .cfi_def_cfa 22, 0
540; LA32-NEXT:    lu12i.w $a0, 1
541; LA32-NEXT:    ori $a0, $a0, 2064
542; LA32-NEXT:    sub.w $sp, $sp, $a0
543; LA32-NEXT:    bstrins.w $sp, $zero, 11, 0
544; LA32-NEXT:    lu12i.w $a0, 1
545; LA32-NEXT:    add.w $a0, $sp, $a0
546; LA32-NEXT:    bl %plt(callee)
547; LA32-NEXT:    lu12i.w $a0, 2
548; LA32-NEXT:    sub.w $sp, $fp, $a0
549; LA32-NEXT:    lu12i.w $a0, 1
550; LA32-NEXT:    ori $a0, $a0, 2064
551; LA32-NEXT:    add.w $sp, $sp, $a0
552; LA32-NEXT:    ld.w $fp, $sp, 2024 # 4-byte Folded Reload
553; LA32-NEXT:    ld.w $ra, $sp, 2028 # 4-byte Folded Reload
554; LA32-NEXT:    addi.w $sp, $sp, 2032
555; LA32-NEXT:    ret
556;
557; LA64-LABEL: caller4096:
558; LA64:       # %bb.0:
559; LA64-NEXT:    addi.d $sp, $sp, -2032
560; LA64-NEXT:    .cfi_def_cfa_offset 2032
561; LA64-NEXT:    st.d $ra, $sp, 2024 # 8-byte Folded Spill
562; LA64-NEXT:    st.d $fp, $sp, 2016 # 8-byte Folded Spill
563; LA64-NEXT:    .cfi_offset 1, -8
564; LA64-NEXT:    .cfi_offset 22, -16
565; LA64-NEXT:    addi.d $fp, $sp, 2032
566; LA64-NEXT:    .cfi_def_cfa 22, 0
567; LA64-NEXT:    lu12i.w $a0, 1
568; LA64-NEXT:    ori $a0, $a0, 2064
569; LA64-NEXT:    sub.d $sp, $sp, $a0
570; LA64-NEXT:    bstrins.d $sp, $zero, 11, 0
571; LA64-NEXT:    lu12i.w $a0, 1
572; LA64-NEXT:    add.d $a0, $sp, $a0
573; LA64-NEXT:    bl %plt(callee)
574; LA64-NEXT:    lu12i.w $a0, 2
575; LA64-NEXT:    sub.d $sp, $fp, $a0
576; LA64-NEXT:    lu12i.w $a0, 1
577; LA64-NEXT:    ori $a0, $a0, 2064
578; LA64-NEXT:    add.d $sp, $sp, $a0
579; LA64-NEXT:    ld.d $fp, $sp, 2016 # 8-byte Folded Reload
580; LA64-NEXT:    ld.d $ra, $sp, 2024 # 8-byte Folded Reload
581; LA64-NEXT:    addi.d $sp, $sp, 2032
582; LA64-NEXT:    ret
583  %1 = alloca i8, align 4096
584  call void @callee(ptr %1)
585  ret void
586}
587
588define void @caller_no_realign4096() "no-realign-stack" {
589; LA32-LABEL: caller_no_realign4096:
590; LA32:       # %bb.0:
591; LA32-NEXT:    addi.w $sp, $sp, -16
592; LA32-NEXT:    .cfi_def_cfa_offset 16
593; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
594; LA32-NEXT:    .cfi_offset 1, -4
595; LA32-NEXT:    addi.w $a0, $sp, 0
596; LA32-NEXT:    bl %plt(callee)
597; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
598; LA32-NEXT:    addi.w $sp, $sp, 16
599; LA32-NEXT:    ret
600;
601; LA64-LABEL: caller_no_realign4096:
602; LA64:       # %bb.0:
603; LA64-NEXT:    addi.d $sp, $sp, -16
604; LA64-NEXT:    .cfi_def_cfa_offset 16
605; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
606; LA64-NEXT:    .cfi_offset 1, -8
607; LA64-NEXT:    addi.d $a0, $sp, 0
608; LA64-NEXT:    bl %plt(callee)
609; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
610; LA64-NEXT:    addi.d $sp, $sp, 16
611; LA64-NEXT:    ret
612  %1 = alloca i8, align 4096
613  call void @callee(ptr %1)
614  ret void
615}
616