xref: /llvm-project/llvm/test/CodeGen/RISCV/calling-conv-ilp32e.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -target-abi ilp32e -verify-machineinstrs < %s \
3; RUN:   | FileCheck -check-prefix=ILP32E-FPELIM %s
4; RUN: llc -mtriple=riscv32 -target-abi ilp32e -frame-pointer=all \
5; RUN:   -verify-machineinstrs < %s \
6; RUN:   | FileCheck -check-prefix=ILP32E-WITHFP %s
7; RUN: llc -mtriple=riscv32 -target-abi ilp32e -mattr=+save-restore -verify-machineinstrs < %s \
8; RUN:   | FileCheck -check-prefix=ILP32E-FPELIM-SAVE-RESTORE %s
9; RUN: llc -mtriple=riscv32 -target-abi ilp32e -mattr=+save-restore -frame-pointer=all \
10; RUN:   -verify-machineinstrs < %s \
11; RUN:   | FileCheck -check-prefix=ILP32E-WITHFP-SAVE-RESTORE %s
12
13; This file contains tests that will have differing output for the ilp32e ABIs.
14
15define i32 @callee_float_in_regs(i32 %a, float %b) {
16; ILP32E-FPELIM-LABEL: callee_float_in_regs:
17; ILP32E-FPELIM:       # %bb.0:
18; ILP32E-FPELIM-NEXT:    addi sp, sp, -8
19; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 8
20; ILP32E-FPELIM-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
21; ILP32E-FPELIM-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
22; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
23; ILP32E-FPELIM-NEXT:    .cfi_offset s0, -8
24; ILP32E-FPELIM-NEXT:    mv s0, a0
25; ILP32E-FPELIM-NEXT:    mv a0, a1
26; ILP32E-FPELIM-NEXT:    call __fixsfsi
27; ILP32E-FPELIM-NEXT:    add a0, s0, a0
28; ILP32E-FPELIM-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
29; ILP32E-FPELIM-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
30; ILP32E-FPELIM-NEXT:    .cfi_restore ra
31; ILP32E-FPELIM-NEXT:    .cfi_restore s0
32; ILP32E-FPELIM-NEXT:    addi sp, sp, 8
33; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
34; ILP32E-FPELIM-NEXT:    ret
35;
36; ILP32E-WITHFP-LABEL: callee_float_in_regs:
37; ILP32E-WITHFP:       # %bb.0:
38; ILP32E-WITHFP-NEXT:    addi sp, sp, -12
39; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 12
40; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
41; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
42; ILP32E-WITHFP-NEXT:    sw s1, 0(sp) # 4-byte Folded Spill
43; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
44; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
45; ILP32E-WITHFP-NEXT:    .cfi_offset s1, -12
46; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
47; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
48; ILP32E-WITHFP-NEXT:    mv s1, a0
49; ILP32E-WITHFP-NEXT:    mv a0, a1
50; ILP32E-WITHFP-NEXT:    call __fixsfsi
51; ILP32E-WITHFP-NEXT:    add a0, s1, a0
52; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 12
53; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
54; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
55; ILP32E-WITHFP-NEXT:    lw s1, 0(sp) # 4-byte Folded Reload
56; ILP32E-WITHFP-NEXT:    .cfi_restore ra
57; ILP32E-WITHFP-NEXT:    .cfi_restore s0
58; ILP32E-WITHFP-NEXT:    .cfi_restore s1
59; ILP32E-WITHFP-NEXT:    addi sp, sp, 12
60; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
61; ILP32E-WITHFP-NEXT:    ret
62;
63; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_float_in_regs:
64; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
65; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
66; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
67; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
68; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
69; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv s0, a0
70; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a0, a1
71; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call __fixsfsi
72; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, s0, a0
73; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
74;
75; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_float_in_regs:
76; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
77; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_2
78; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 12
79; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
80; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
81; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s1, -12
82; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 12
83; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
84; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv s1, a0
85; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv a0, a1
86; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call __fixsfsi
87; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, s1, a0
88; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 12
89; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_2
90  %b_fptosi = fptosi float %b to i32
91  %1 = add i32 %a, %b_fptosi
92  ret i32 %1
93}
94
95define i32 @caller_float_in_regs() {
96; ILP32E-FPELIM-LABEL: caller_float_in_regs:
97; ILP32E-FPELIM:       # %bb.0:
98; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
99; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 4
100; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
101; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
102; ILP32E-FPELIM-NEXT:    li a0, 1
103; ILP32E-FPELIM-NEXT:    lui a1, 262144
104; ILP32E-FPELIM-NEXT:    call callee_float_in_regs
105; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
106; ILP32E-FPELIM-NEXT:    .cfi_restore ra
107; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
108; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
109; ILP32E-FPELIM-NEXT:    ret
110;
111; ILP32E-WITHFP-LABEL: caller_float_in_regs:
112; ILP32E-WITHFP:       # %bb.0:
113; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
114; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
115; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
116; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
117; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
118; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
119; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
120; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
121; ILP32E-WITHFP-NEXT:    li a0, 1
122; ILP32E-WITHFP-NEXT:    lui a1, 262144
123; ILP32E-WITHFP-NEXT:    call callee_float_in_regs
124; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
125; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
126; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
127; ILP32E-WITHFP-NEXT:    .cfi_restore ra
128; ILP32E-WITHFP-NEXT:    .cfi_restore s0
129; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
130; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
131; ILP32E-WITHFP-NEXT:    ret
132;
133; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_float_in_regs:
134; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
135; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
136; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
137; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
138; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
139; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui a1, 262144
140; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_float_in_regs
141; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
142;
143; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_float_in_regs:
144; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
145; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
146; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
147; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
148; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
149; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
150; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
151; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
152; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui a1, 262144
153; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_float_in_regs
154; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
155; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
156  %1 = call i32 @callee_float_in_regs(i32 1, float 2.0)
157  ret i32 %1
158}
159
160define i32 @callee_float_on_stack(i64 %a, i64 %b, i64 %c, i64 %d, float %e) {
161; ILP32E-FPELIM-LABEL: callee_float_on_stack:
162; ILP32E-FPELIM:       # %bb.0:
163; ILP32E-FPELIM-NEXT:    lw a0, 8(sp)
164; ILP32E-FPELIM-NEXT:    lw a1, 0(sp)
165; ILP32E-FPELIM-NEXT:    add a0, a1, a0
166; ILP32E-FPELIM-NEXT:    ret
167;
168; ILP32E-WITHFP-LABEL: callee_float_on_stack:
169; ILP32E-WITHFP:       # %bb.0:
170; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
171; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
172; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
173; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
174; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
175; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
176; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
177; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
178; ILP32E-WITHFP-NEXT:    lw a0, 8(s0)
179; ILP32E-WITHFP-NEXT:    lw a1, 0(s0)
180; ILP32E-WITHFP-NEXT:    add a0, a1, a0
181; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
182; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
183; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
184; ILP32E-WITHFP-NEXT:    .cfi_restore ra
185; ILP32E-WITHFP-NEXT:    .cfi_restore s0
186; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
187; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
188; ILP32E-WITHFP-NEXT:    ret
189;
190; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_float_on_stack:
191; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
192; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a0, 8(sp)
193; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a1, 0(sp)
194; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a1, a0
195; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
196;
197; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_float_on_stack:
198; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
199; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
200; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
201; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
202; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
203; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
204; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
205; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a0, 8(s0)
206; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a1, 0(s0)
207; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a1, a0
208; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
209; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
210  %1 = trunc i64 %d to i32
211  %2 = bitcast float %e to i32
212  %3 = add i32 %1, %2
213  ret i32 %3
214}
215
216define i32 @caller_float_on_stack() {
217; ILP32E-FPELIM-LABEL: caller_float_on_stack:
218; ILP32E-FPELIM:       # %bb.0:
219; ILP32E-FPELIM-NEXT:    addi sp, sp, -16
220; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 16
221; ILP32E-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
222; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
223; ILP32E-FPELIM-NEXT:    lui a1, 264704
224; ILP32E-FPELIM-NEXT:    li a3, 4
225; ILP32E-FPELIM-NEXT:    li a0, 1
226; ILP32E-FPELIM-NEXT:    li a2, 2
227; ILP32E-FPELIM-NEXT:    li a4, 3
228; ILP32E-FPELIM-NEXT:    sw a3, 0(sp)
229; ILP32E-FPELIM-NEXT:    sw zero, 4(sp)
230; ILP32E-FPELIM-NEXT:    sw a1, 8(sp)
231; ILP32E-FPELIM-NEXT:    li a1, 0
232; ILP32E-FPELIM-NEXT:    li a3, 0
233; ILP32E-FPELIM-NEXT:    li a5, 0
234; ILP32E-FPELIM-NEXT:    call callee_float_on_stack
235; ILP32E-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
236; ILP32E-FPELIM-NEXT:    .cfi_restore ra
237; ILP32E-FPELIM-NEXT:    addi sp, sp, 16
238; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
239; ILP32E-FPELIM-NEXT:    ret
240;
241; ILP32E-WITHFP-LABEL: caller_float_on_stack:
242; ILP32E-WITHFP:       # %bb.0:
243; ILP32E-WITHFP-NEXT:    addi sp, sp, -20
244; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 20
245; ILP32E-WITHFP-NEXT:    sw ra, 16(sp) # 4-byte Folded Spill
246; ILP32E-WITHFP-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
247; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
248; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
249; ILP32E-WITHFP-NEXT:    addi s0, sp, 20
250; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
251; ILP32E-WITHFP-NEXT:    lui a1, 264704
252; ILP32E-WITHFP-NEXT:    li a3, 4
253; ILP32E-WITHFP-NEXT:    li a0, 1
254; ILP32E-WITHFP-NEXT:    li a2, 2
255; ILP32E-WITHFP-NEXT:    li a4, 3
256; ILP32E-WITHFP-NEXT:    sw a3, 0(sp)
257; ILP32E-WITHFP-NEXT:    sw zero, 4(sp)
258; ILP32E-WITHFP-NEXT:    sw a1, 8(sp)
259; ILP32E-WITHFP-NEXT:    li a1, 0
260; ILP32E-WITHFP-NEXT:    li a3, 0
261; ILP32E-WITHFP-NEXT:    li a5, 0
262; ILP32E-WITHFP-NEXT:    call callee_float_on_stack
263; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 20
264; ILP32E-WITHFP-NEXT:    lw ra, 16(sp) # 4-byte Folded Reload
265; ILP32E-WITHFP-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
266; ILP32E-WITHFP-NEXT:    .cfi_restore ra
267; ILP32E-WITHFP-NEXT:    .cfi_restore s0
268; ILP32E-WITHFP-NEXT:    addi sp, sp, 20
269; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
270; ILP32E-WITHFP-NEXT:    ret
271;
272; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_float_on_stack:
273; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
274; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
275; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
276; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
277; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, -12
278; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 16
279; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui a1, 264704
280; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a3, 4
281; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
282; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a2, 2
283; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a4, 3
284; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a3, 0(sp)
285; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 4(sp)
286; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a1, 8(sp)
287; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 0
288; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a3, 0
289; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a5, 0
290; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_float_on_stack
291; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, 12
292; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
293; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
294;
295; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_float_on_stack:
296; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
297; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
298; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
299; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
300; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
301; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, -12
302; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 20
303; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 20
304; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
305; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui a1, 264704
306; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a3, 4
307; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
308; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a2, 2
309; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a4, 3
310; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a3, 0(sp)
311; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 4(sp)
312; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a1, 8(sp)
313; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 0
314; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a3, 0
315; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a5, 0
316; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_float_on_stack
317; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 20
318; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, 12
319; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
320; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
321  %1 = call i32 @callee_float_on_stack(i64 1, i64 2, i64 3, i64 4, float 5.0)
322  ret i32 %1
323}
324
325define float @callee_tiny_scalar_ret() {
326; ILP32E-FPELIM-LABEL: callee_tiny_scalar_ret:
327; ILP32E-FPELIM:       # %bb.0:
328; ILP32E-FPELIM-NEXT:    lui a0, 260096
329; ILP32E-FPELIM-NEXT:    ret
330;
331; ILP32E-WITHFP-LABEL: callee_tiny_scalar_ret:
332; ILP32E-WITHFP:       # %bb.0:
333; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
334; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
335; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
336; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
337; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
338; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
339; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
340; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
341; ILP32E-WITHFP-NEXT:    lui a0, 260096
342; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
343; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
344; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
345; ILP32E-WITHFP-NEXT:    .cfi_restore ra
346; ILP32E-WITHFP-NEXT:    .cfi_restore s0
347; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
348; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
349; ILP32E-WITHFP-NEXT:    ret
350;
351; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_tiny_scalar_ret:
352; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
353; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui a0, 260096
354; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
355;
356; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_tiny_scalar_ret:
357; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
358; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
359; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
360; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
361; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
362; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
363; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
364; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui a0, 260096
365; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
366; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
367  ret float 1.0
368}
369
370define i32 @caller_tiny_scalar_ret() {
371; ILP32E-FPELIM-LABEL: caller_tiny_scalar_ret:
372; ILP32E-FPELIM:       # %bb.0:
373; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
374; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 4
375; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
376; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
377; ILP32E-FPELIM-NEXT:    call callee_tiny_scalar_ret
378; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
379; ILP32E-FPELIM-NEXT:    .cfi_restore ra
380; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
381; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
382; ILP32E-FPELIM-NEXT:    ret
383;
384; ILP32E-WITHFP-LABEL: caller_tiny_scalar_ret:
385; ILP32E-WITHFP:       # %bb.0:
386; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
387; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
388; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
389; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
390; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
391; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
392; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
393; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
394; ILP32E-WITHFP-NEXT:    call callee_tiny_scalar_ret
395; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
396; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
397; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
398; ILP32E-WITHFP-NEXT:    .cfi_restore ra
399; ILP32E-WITHFP-NEXT:    .cfi_restore s0
400; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
401; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
402; ILP32E-WITHFP-NEXT:    ret
403;
404; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_tiny_scalar_ret:
405; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
406; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
407; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
408; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
409; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_tiny_scalar_ret
410; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
411;
412; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_tiny_scalar_ret:
413; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
414; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
415; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
416; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
417; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
418; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
419; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
420; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_tiny_scalar_ret
421; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
422; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
423  %1 = call float @callee_tiny_scalar_ret()
424  %2 = bitcast float %1 to i32
425  ret i32 %2
426}
427
428; Check that on RV32 ilp32e, double is passed in a pair of registers. Unlike
429; the convention for varargs, this need not be an aligned pair.
430
431define i32 @callee_double_in_regs(i32 %a, double %b) {
432; ILP32E-FPELIM-LABEL: callee_double_in_regs:
433; ILP32E-FPELIM:       # %bb.0:
434; ILP32E-FPELIM-NEXT:    addi sp, sp, -8
435; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 8
436; ILP32E-FPELIM-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
437; ILP32E-FPELIM-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
438; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
439; ILP32E-FPELIM-NEXT:    .cfi_offset s0, -8
440; ILP32E-FPELIM-NEXT:    mv s0, a0
441; ILP32E-FPELIM-NEXT:    mv a0, a1
442; ILP32E-FPELIM-NEXT:    mv a1, a2
443; ILP32E-FPELIM-NEXT:    call __fixdfsi
444; ILP32E-FPELIM-NEXT:    add a0, s0, a0
445; ILP32E-FPELIM-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
446; ILP32E-FPELIM-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
447; ILP32E-FPELIM-NEXT:    .cfi_restore ra
448; ILP32E-FPELIM-NEXT:    .cfi_restore s0
449; ILP32E-FPELIM-NEXT:    addi sp, sp, 8
450; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
451; ILP32E-FPELIM-NEXT:    ret
452;
453; ILP32E-WITHFP-LABEL: callee_double_in_regs:
454; ILP32E-WITHFP:       # %bb.0:
455; ILP32E-WITHFP-NEXT:    addi sp, sp, -12
456; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 12
457; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
458; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
459; ILP32E-WITHFP-NEXT:    sw s1, 0(sp) # 4-byte Folded Spill
460; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
461; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
462; ILP32E-WITHFP-NEXT:    .cfi_offset s1, -12
463; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
464; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
465; ILP32E-WITHFP-NEXT:    mv s1, a0
466; ILP32E-WITHFP-NEXT:    mv a0, a1
467; ILP32E-WITHFP-NEXT:    mv a1, a2
468; ILP32E-WITHFP-NEXT:    call __fixdfsi
469; ILP32E-WITHFP-NEXT:    add a0, s1, a0
470; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 12
471; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
472; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
473; ILP32E-WITHFP-NEXT:    lw s1, 0(sp) # 4-byte Folded Reload
474; ILP32E-WITHFP-NEXT:    .cfi_restore ra
475; ILP32E-WITHFP-NEXT:    .cfi_restore s0
476; ILP32E-WITHFP-NEXT:    .cfi_restore s1
477; ILP32E-WITHFP-NEXT:    addi sp, sp, 12
478; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
479; ILP32E-WITHFP-NEXT:    ret
480;
481; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_double_in_regs:
482; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
483; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
484; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
485; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
486; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
487; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv s0, a0
488; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a0, a1
489; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a1, a2
490; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call __fixdfsi
491; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, s0, a0
492; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
493;
494; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_double_in_regs:
495; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
496; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_2
497; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 12
498; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
499; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
500; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s1, -12
501; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 12
502; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
503; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv s1, a0
504; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv a0, a1
505; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv a1, a2
506; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call __fixdfsi
507; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, s1, a0
508; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 12
509; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_2
510  %b_fptosi = fptosi double %b to i32
511  %1 = add i32 %a, %b_fptosi
512  ret i32 %1
513}
514
515define i32 @caller_double_in_regs() {
516; ILP32E-FPELIM-LABEL: caller_double_in_regs:
517; ILP32E-FPELIM:       # %bb.0:
518; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
519; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 4
520; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
521; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
522; ILP32E-FPELIM-NEXT:    li a0, 1
523; ILP32E-FPELIM-NEXT:    lui a2, 262144
524; ILP32E-FPELIM-NEXT:    li a1, 0
525; ILP32E-FPELIM-NEXT:    call callee_double_in_regs
526; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
527; ILP32E-FPELIM-NEXT:    .cfi_restore ra
528; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
529; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
530; ILP32E-FPELIM-NEXT:    ret
531;
532; ILP32E-WITHFP-LABEL: caller_double_in_regs:
533; ILP32E-WITHFP:       # %bb.0:
534; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
535; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
536; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
537; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
538; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
539; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
540; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
541; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
542; ILP32E-WITHFP-NEXT:    li a0, 1
543; ILP32E-WITHFP-NEXT:    lui a2, 262144
544; ILP32E-WITHFP-NEXT:    li a1, 0
545; ILP32E-WITHFP-NEXT:    call callee_double_in_regs
546; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
547; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
548; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
549; ILP32E-WITHFP-NEXT:    .cfi_restore ra
550; ILP32E-WITHFP-NEXT:    .cfi_restore s0
551; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
552; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
553; ILP32E-WITHFP-NEXT:    ret
554;
555; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_double_in_regs:
556; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
557; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
558; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
559; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
560; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
561; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui a2, 262144
562; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 0
563; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_double_in_regs
564; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
565;
566; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_double_in_regs:
567; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
568; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
569; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
570; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
571; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
572; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
573; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
574; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
575; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui a2, 262144
576; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 0
577; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_double_in_regs
578; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
579; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
580  %1 = call i32 @callee_double_in_regs(i32 1, double 2.0)
581  ret i32 %1
582}
583
584; Check 2x*xlen values are aligned appropriately when passed on the stack
585; Must keep define on a single line due to an update_llc_test_checks.py limitation
586define i32 @callee_aligned_stack(i32 %a, i32 %b, fp128 %c, i32 %d, i32 %e, i64 %f, i32 %g, i32 %h, double %i, i32 %j, [2 x i32] %k) {
587; The double should be 8-byte aligned on the stack, but the two-element array
588; should only be 4-byte aligned
589; ILP32E-FPELIM-LABEL: callee_aligned_stack:
590; ILP32E-FPELIM:       # %bb.0:
591; ILP32E-FPELIM-NEXT:    lw a0, 0(a2)
592; ILP32E-FPELIM-NEXT:    lw a1, 12(sp)
593; ILP32E-FPELIM-NEXT:    lw a2, 4(sp)
594; ILP32E-FPELIM-NEXT:    lw a3, 8(sp)
595; ILP32E-FPELIM-NEXT:    lw a4, 24(sp)
596; ILP32E-FPELIM-NEXT:    lw a5, 20(sp)
597; ILP32E-FPELIM-NEXT:    add a0, a0, a2
598; ILP32E-FPELIM-NEXT:    add a1, a3, a1
599; ILP32E-FPELIM-NEXT:    add a0, a0, a1
600; ILP32E-FPELIM-NEXT:    add a4, a5, a4
601; ILP32E-FPELIM-NEXT:    add a0, a0, a4
602; ILP32E-FPELIM-NEXT:    ret
603;
604; ILP32E-WITHFP-LABEL: callee_aligned_stack:
605; ILP32E-WITHFP:       # %bb.0:
606; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
607; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
608; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
609; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
610; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
611; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
612; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
613; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
614; ILP32E-WITHFP-NEXT:    lw a0, 0(a2)
615; ILP32E-WITHFP-NEXT:    lw a1, 12(s0)
616; ILP32E-WITHFP-NEXT:    lw a2, 4(s0)
617; ILP32E-WITHFP-NEXT:    lw a3, 8(s0)
618; ILP32E-WITHFP-NEXT:    lw a4, 24(s0)
619; ILP32E-WITHFP-NEXT:    lw a5, 20(s0)
620; ILP32E-WITHFP-NEXT:    add a0, a0, a2
621; ILP32E-WITHFP-NEXT:    add a1, a3, a1
622; ILP32E-WITHFP-NEXT:    add a0, a0, a1
623; ILP32E-WITHFP-NEXT:    add a4, a5, a4
624; ILP32E-WITHFP-NEXT:    add a0, a0, a4
625; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
626; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
627; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
628; ILP32E-WITHFP-NEXT:    .cfi_restore ra
629; ILP32E-WITHFP-NEXT:    .cfi_restore s0
630; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
631; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
632; ILP32E-WITHFP-NEXT:    ret
633;
634; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_aligned_stack:
635; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
636; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a0, 0(a2)
637; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a1, 12(sp)
638; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a2, 4(sp)
639; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a3, 8(sp)
640; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a4, 24(sp)
641; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a5, 20(sp)
642; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a2
643; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a1, a3, a1
644; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a1
645; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a4, a5, a4
646; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a4
647; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
648;
649; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_aligned_stack:
650; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
651; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
652; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
653; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
654; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
655; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
656; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
657; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a0, 0(a2)
658; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a1, 12(s0)
659; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a2, 4(s0)
660; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a3, 8(s0)
661; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a4, 24(s0)
662; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a5, 20(s0)
663; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a2
664; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a1, a3, a1
665; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a1
666; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a4, a5, a4
667; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a4
668; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
669; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
670  %1 = bitcast fp128 %c to i128
671  %2 = trunc i128 %1 to i32
672  %3 = add i32 %2, %g
673  %4 = add i32 %3, %h
674  %5 = bitcast double %i to i64
675  %6 = trunc i64 %5 to i32
676  %7 = add i32 %4, %6
677  %8 = add i32 %7, %j
678  %9 = extractvalue [2 x i32] %k, 0
679  %10 = add i32 %8, %9
680  ret i32 %10
681}
682
683define void @caller_aligned_stack() {
684; The double should be 8-byte aligned on the stack, but the two-element array
685; should only be 4-byte aligned
686; ILP32E-FPELIM-LABEL: caller_aligned_stack:
687; ILP32E-FPELIM:       # %bb.0:
688; ILP32E-FPELIM-NEXT:    addi sp, sp, -64
689; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 64
690; ILP32E-FPELIM-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
691; ILP32E-FPELIM-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
692; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
693; ILP32E-FPELIM-NEXT:    .cfi_offset s0, -8
694; ILP32E-FPELIM-NEXT:    addi s0, sp, 64
695; ILP32E-FPELIM-NEXT:    .cfi_def_cfa s0, 0
696; ILP32E-FPELIM-NEXT:    andi sp, sp, -16
697; ILP32E-FPELIM-NEXT:    li a3, 18
698; ILP32E-FPELIM-NEXT:    li a4, 17
699; ILP32E-FPELIM-NEXT:    li a5, 16
700; ILP32E-FPELIM-NEXT:    lui a6, 262236
701; ILP32E-FPELIM-NEXT:    lui a7, 377487
702; ILP32E-FPELIM-NEXT:    li t0, 15
703; ILP32E-FPELIM-NEXT:    li t1, 14
704; ILP32E-FPELIM-NEXT:    li t2, 4
705; ILP32E-FPELIM-NEXT:    lui t3, 262153
706; ILP32E-FPELIM-NEXT:    lui t4, 545260
707; ILP32E-FPELIM-NEXT:    lui t5, 964690
708; ILP32E-FPELIM-NEXT:    lui t6, 335544
709; ILP32E-FPELIM-NEXT:    lui s2, 688509
710; ILP32E-FPELIM-NEXT:    li a0, 1
711; ILP32E-FPELIM-NEXT:    li a1, 11
712; ILP32E-FPELIM-NEXT:    addi a2, sp, 32
713; ILP32E-FPELIM-NEXT:    addi a6, a6, 655
714; ILP32E-FPELIM-NEXT:    sw a6, 16(sp)
715; ILP32E-FPELIM-NEXT:    sw a5, 20(sp)
716; ILP32E-FPELIM-NEXT:    sw a4, 24(sp)
717; ILP32E-FPELIM-NEXT:    sw a3, 28(sp)
718; ILP32E-FPELIM-NEXT:    li a3, 12
719; ILP32E-FPELIM-NEXT:    addi a4, a7, 1475
720; ILP32E-FPELIM-NEXT:    sw t2, 0(sp)
721; ILP32E-FPELIM-NEXT:    sw t1, 4(sp)
722; ILP32E-FPELIM-NEXT:    sw t0, 8(sp)
723; ILP32E-FPELIM-NEXT:    sw a4, 12(sp)
724; ILP32E-FPELIM-NEXT:    li a4, 13
725; ILP32E-FPELIM-NEXT:    addi a6, t3, 491
726; ILP32E-FPELIM-NEXT:    addi a7, t4, -1967
727; ILP32E-FPELIM-NEXT:    addi t0, t5, -328
728; ILP32E-FPELIM-NEXT:    addi t1, t6, 1311
729; ILP32E-FPELIM-NEXT:    addi a5, s2, -2048
730; ILP32E-FPELIM-NEXT:    sw t1, 32(sp)
731; ILP32E-FPELIM-NEXT:    sw t0, 36(sp)
732; ILP32E-FPELIM-NEXT:    sw a7, 40(sp)
733; ILP32E-FPELIM-NEXT:    sw a6, 44(sp)
734; ILP32E-FPELIM-NEXT:    call callee_aligned_stack
735; ILP32E-FPELIM-NEXT:    addi sp, s0, -64
736; ILP32E-FPELIM-NEXT:    .cfi_def_cfa sp, 64
737; ILP32E-FPELIM-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
738; ILP32E-FPELIM-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
739; ILP32E-FPELIM-NEXT:    .cfi_restore ra
740; ILP32E-FPELIM-NEXT:    .cfi_restore s0
741; ILP32E-FPELIM-NEXT:    addi sp, sp, 64
742; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
743; ILP32E-FPELIM-NEXT:    ret
744;
745; ILP32E-WITHFP-LABEL: caller_aligned_stack:
746; ILP32E-WITHFP:       # %bb.0:
747; ILP32E-WITHFP-NEXT:    addi sp, sp, -64
748; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 64
749; ILP32E-WITHFP-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
750; ILP32E-WITHFP-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
751; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
752; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
753; ILP32E-WITHFP-NEXT:    addi s0, sp, 64
754; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
755; ILP32E-WITHFP-NEXT:    andi sp, sp, -16
756; ILP32E-WITHFP-NEXT:    li a3, 18
757; ILP32E-WITHFP-NEXT:    li a4, 17
758; ILP32E-WITHFP-NEXT:    li a5, 16
759; ILP32E-WITHFP-NEXT:    lui a6, 262236
760; ILP32E-WITHFP-NEXT:    lui a7, 377487
761; ILP32E-WITHFP-NEXT:    li t0, 15
762; ILP32E-WITHFP-NEXT:    li t1, 14
763; ILP32E-WITHFP-NEXT:    li t2, 4
764; ILP32E-WITHFP-NEXT:    lui t3, 262153
765; ILP32E-WITHFP-NEXT:    lui t4, 545260
766; ILP32E-WITHFP-NEXT:    lui t5, 964690
767; ILP32E-WITHFP-NEXT:    lui t6, 335544
768; ILP32E-WITHFP-NEXT:    lui s2, 688509
769; ILP32E-WITHFP-NEXT:    li a0, 1
770; ILP32E-WITHFP-NEXT:    li a1, 11
771; ILP32E-WITHFP-NEXT:    addi a2, sp, 32
772; ILP32E-WITHFP-NEXT:    addi a6, a6, 655
773; ILP32E-WITHFP-NEXT:    sw a6, 16(sp)
774; ILP32E-WITHFP-NEXT:    sw a5, 20(sp)
775; ILP32E-WITHFP-NEXT:    sw a4, 24(sp)
776; ILP32E-WITHFP-NEXT:    sw a3, 28(sp)
777; ILP32E-WITHFP-NEXT:    li a3, 12
778; ILP32E-WITHFP-NEXT:    addi a4, a7, 1475
779; ILP32E-WITHFP-NEXT:    sw t2, 0(sp)
780; ILP32E-WITHFP-NEXT:    sw t1, 4(sp)
781; ILP32E-WITHFP-NEXT:    sw t0, 8(sp)
782; ILP32E-WITHFP-NEXT:    sw a4, 12(sp)
783; ILP32E-WITHFP-NEXT:    li a4, 13
784; ILP32E-WITHFP-NEXT:    addi a6, t3, 491
785; ILP32E-WITHFP-NEXT:    addi a7, t4, -1967
786; ILP32E-WITHFP-NEXT:    addi t0, t5, -328
787; ILP32E-WITHFP-NEXT:    addi t1, t6, 1311
788; ILP32E-WITHFP-NEXT:    addi a5, s2, -2048
789; ILP32E-WITHFP-NEXT:    sw t1, 32(sp)
790; ILP32E-WITHFP-NEXT:    sw t0, 36(sp)
791; ILP32E-WITHFP-NEXT:    sw a7, 40(sp)
792; ILP32E-WITHFP-NEXT:    sw a6, 44(sp)
793; ILP32E-WITHFP-NEXT:    call callee_aligned_stack
794; ILP32E-WITHFP-NEXT:    addi sp, s0, -64
795; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 64
796; ILP32E-WITHFP-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
797; ILP32E-WITHFP-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
798; ILP32E-WITHFP-NEXT:    .cfi_restore ra
799; ILP32E-WITHFP-NEXT:    .cfi_restore s0
800; ILP32E-WITHFP-NEXT:    addi sp, sp, 64
801; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
802; ILP32E-WITHFP-NEXT:    ret
803;
804; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_aligned_stack:
805; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
806; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
807; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
808; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
809; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
810; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, -56
811; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 64
812; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi s0, sp, 64
813; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
814; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    andi sp, sp, -16
815; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a3, 18
816; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a4, 17
817; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a5, 16
818; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui a6, 262236
819; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui a7, 377487
820; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li t0, 15
821; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li t1, 14
822; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li t2, 4
823; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui t3, 262153
824; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui t4, 545260
825; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui t5, 964690
826; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui t6, 335544
827; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui s2, 688509
828; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
829; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 11
830; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi a2, sp, 32
831; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi a6, a6, 655
832; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a6, 16(sp)
833; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a5, 20(sp)
834; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a4, 24(sp)
835; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a3, 28(sp)
836; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a3, 12
837; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi a4, a7, 1475
838; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw t2, 0(sp)
839; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw t1, 4(sp)
840; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw t0, 8(sp)
841; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a4, 12(sp)
842; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a4, 13
843; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi a6, t3, 491
844; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi a7, t4, -1967
845; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi t0, t5, -328
846; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi t1, t6, 1311
847; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi a5, s2, -2048
848; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw t1, 32(sp)
849; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw t0, 36(sp)
850; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a7, 40(sp)
851; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a6, 44(sp)
852; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_aligned_stack
853; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, s0, -64
854; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 64
855; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, 56
856; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
857; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
858;
859; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_aligned_stack:
860; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
861; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
862; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
863; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
864; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
865; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, -56
866; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 64
867; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 64
868; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
869; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    andi sp, sp, -16
870; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a3, 18
871; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a4, 17
872; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a5, 16
873; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui a6, 262236
874; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui a7, 377487
875; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li t0, 15
876; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li t1, 14
877; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li t2, 4
878; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui t3, 262153
879; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui t4, 545260
880; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui t5, 964690
881; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui t6, 335544
882; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui s2, 688509
883; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
884; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 11
885; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a2, sp, 32
886; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a6, a6, 655
887; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a6, 16(sp)
888; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a5, 20(sp)
889; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a4, 24(sp)
890; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a3, 28(sp)
891; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a3, 12
892; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a4, a7, 1475
893; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw t2, 0(sp)
894; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw t1, 4(sp)
895; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw t0, 8(sp)
896; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a4, 12(sp)
897; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a4, 13
898; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a6, t3, 491
899; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a7, t4, -1967
900; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi t0, t5, -328
901; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi t1, t6, 1311
902; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a5, s2, -2048
903; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw t1, 32(sp)
904; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw t0, 36(sp)
905; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a7, 40(sp)
906; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a6, 44(sp)
907; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_aligned_stack
908; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, s0, -64
909; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 64
910; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, 56
911; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
912; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
913  %1 = call i32 @callee_aligned_stack(i32 1, i32 11,
914    fp128 0xLEB851EB851EB851F400091EB851EB851, i32 12, i32 13,
915    i64 20000000000, i32 14, i32 15, double 2.720000e+00, i32 16,
916    [2 x i32] [i32 17, i32 18])
917  ret void
918}
919
920define double @callee_small_scalar_ret() {
921; ILP32E-FPELIM-LABEL: callee_small_scalar_ret:
922; ILP32E-FPELIM:       # %bb.0:
923; ILP32E-FPELIM-NEXT:    lui a1, 261888
924; ILP32E-FPELIM-NEXT:    li a0, 0
925; ILP32E-FPELIM-NEXT:    ret
926;
927; ILP32E-WITHFP-LABEL: callee_small_scalar_ret:
928; ILP32E-WITHFP:       # %bb.0:
929; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
930; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
931; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
932; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
933; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
934; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
935; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
936; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
937; ILP32E-WITHFP-NEXT:    lui a1, 261888
938; ILP32E-WITHFP-NEXT:    li a0, 0
939; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
940; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
941; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
942; ILP32E-WITHFP-NEXT:    .cfi_restore ra
943; ILP32E-WITHFP-NEXT:    .cfi_restore s0
944; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
945; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
946; ILP32E-WITHFP-NEXT:    ret
947;
948; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_small_scalar_ret:
949; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
950; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui a1, 261888
951; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 0
952; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
953;
954; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_small_scalar_ret:
955; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
956; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
957; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
958; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
959; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
960; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
961; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
962; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui a1, 261888
963; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 0
964; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
965; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
966  ret double 1.0
967}
968
969define i64 @caller_small_scalar_ret() {
970; ILP32E-FPELIM-LABEL: caller_small_scalar_ret:
971; ILP32E-FPELIM:       # %bb.0:
972; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
973; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 4
974; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
975; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
976; ILP32E-FPELIM-NEXT:    call callee_small_scalar_ret
977; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
978; ILP32E-FPELIM-NEXT:    .cfi_restore ra
979; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
980; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
981; ILP32E-FPELIM-NEXT:    ret
982;
983; ILP32E-WITHFP-LABEL: caller_small_scalar_ret:
984; ILP32E-WITHFP:       # %bb.0:
985; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
986; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
987; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
988; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
989; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
990; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
991; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
992; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
993; ILP32E-WITHFP-NEXT:    call callee_small_scalar_ret
994; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
995; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
996; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
997; ILP32E-WITHFP-NEXT:    .cfi_restore ra
998; ILP32E-WITHFP-NEXT:    .cfi_restore s0
999; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
1000; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1001; ILP32E-WITHFP-NEXT:    ret
1002;
1003; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_small_scalar_ret:
1004; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1005; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
1006; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
1007; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1008; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_small_scalar_ret
1009; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
1010;
1011; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_small_scalar_ret:
1012; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
1013; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1014; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1015; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1016; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1017; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
1018; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1019; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_small_scalar_ret
1020; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
1021; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1022  %1 = call double @callee_small_scalar_ret()
1023  %2 = bitcast double %1 to i64
1024  ret i64 %2
1025}
1026
1027; Check that on RV32, i64 is passed in a pair of registers. Unlike
1028; the convention for varargs, this need not be an aligned pair.
1029
1030define i32 @callee_i64_in_regs(i32 %a, i64 %b) {
1031; ILP32E-FPELIM-LABEL: callee_i64_in_regs:
1032; ILP32E-FPELIM:       # %bb.0:
1033; ILP32E-FPELIM-NEXT:    add a0, a0, a1
1034; ILP32E-FPELIM-NEXT:    ret
1035;
1036; ILP32E-WITHFP-LABEL: callee_i64_in_regs:
1037; ILP32E-WITHFP:       # %bb.0:
1038; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
1039; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
1040; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1041; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
1042; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
1043; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
1044; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
1045; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
1046; ILP32E-WITHFP-NEXT:    add a0, a0, a1
1047; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
1048; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1049; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
1050; ILP32E-WITHFP-NEXT:    .cfi_restore ra
1051; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1052; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
1053; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1054; ILP32E-WITHFP-NEXT:    ret
1055;
1056; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_i64_in_regs:
1057; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1058; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a1
1059; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
1060;
1061; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_i64_in_regs:
1062; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
1063; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1064; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1065; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1066; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1067; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
1068; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1069; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a1
1070; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
1071; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1072  %b_trunc = trunc i64 %b to i32
1073  %1 = add i32 %a, %b_trunc
1074  ret i32 %1
1075}
1076
1077define i32 @caller_i64_in_regs() {
1078; ILP32E-FPELIM-LABEL: caller_i64_in_regs:
1079; ILP32E-FPELIM:       # %bb.0:
1080; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
1081; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 4
1082; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
1083; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
1084; ILP32E-FPELIM-NEXT:    li a0, 1
1085; ILP32E-FPELIM-NEXT:    li a1, 2
1086; ILP32E-FPELIM-NEXT:    li a2, 0
1087; ILP32E-FPELIM-NEXT:    call callee_i64_in_regs
1088; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
1089; ILP32E-FPELIM-NEXT:    .cfi_restore ra
1090; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
1091; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
1092; ILP32E-FPELIM-NEXT:    ret
1093;
1094; ILP32E-WITHFP-LABEL: caller_i64_in_regs:
1095; ILP32E-WITHFP:       # %bb.0:
1096; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
1097; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
1098; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1099; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
1100; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
1101; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
1102; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
1103; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
1104; ILP32E-WITHFP-NEXT:    li a0, 1
1105; ILP32E-WITHFP-NEXT:    li a1, 2
1106; ILP32E-WITHFP-NEXT:    li a2, 0
1107; ILP32E-WITHFP-NEXT:    call callee_i64_in_regs
1108; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
1109; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1110; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
1111; ILP32E-WITHFP-NEXT:    .cfi_restore ra
1112; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1113; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
1114; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1115; ILP32E-WITHFP-NEXT:    ret
1116;
1117; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_i64_in_regs:
1118; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1119; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
1120; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
1121; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1122; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
1123; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 2
1124; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a2, 0
1125; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_i64_in_regs
1126; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
1127;
1128; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_i64_in_regs:
1129; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
1130; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1131; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1132; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1133; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1134; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
1135; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1136; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
1137; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 2
1138; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a2, 0
1139; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_i64_in_regs
1140; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
1141; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1142  %1 = call i32 @callee_i64_in_regs(i32 1, i64 2)
1143  ret i32 %1
1144}
1145
1146; Check that the stack is used once the GPRs are exhausted
1147
1148define i32 @callee_many_scalars(i8 %a, i16 %b, i32 %c, i64 %d, i32 %e, i32 %f, i64 %g, i32 %h) {
1149; ILP32E-FPELIM-LABEL: callee_many_scalars:
1150; ILP32E-FPELIM:       # %bb.0:
1151; ILP32E-FPELIM-NEXT:    lw a6, 12(sp)
1152; ILP32E-FPELIM-NEXT:    lw a7, 0(sp)
1153; ILP32E-FPELIM-NEXT:    lw t0, 4(sp)
1154; ILP32E-FPELIM-NEXT:    lw t1, 8(sp)
1155; ILP32E-FPELIM-NEXT:    andi a0, a0, 255
1156; ILP32E-FPELIM-NEXT:    slli a1, a1, 16
1157; ILP32E-FPELIM-NEXT:    srli a1, a1, 16
1158; ILP32E-FPELIM-NEXT:    add a0, a0, a2
1159; ILP32E-FPELIM-NEXT:    add a0, a0, a1
1160; ILP32E-FPELIM-NEXT:    add a0, a0, a5
1161; ILP32E-FPELIM-NEXT:    xor a1, a4, t1
1162; ILP32E-FPELIM-NEXT:    xor a2, a3, t0
1163; ILP32E-FPELIM-NEXT:    add a0, a0, a7
1164; ILP32E-FPELIM-NEXT:    or a1, a2, a1
1165; ILP32E-FPELIM-NEXT:    seqz a1, a1
1166; ILP32E-FPELIM-NEXT:    add a0, a0, a6
1167; ILP32E-FPELIM-NEXT:    add a0, a1, a0
1168; ILP32E-FPELIM-NEXT:    ret
1169;
1170; ILP32E-WITHFP-LABEL: callee_many_scalars:
1171; ILP32E-WITHFP:       # %bb.0:
1172; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
1173; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
1174; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1175; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
1176; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
1177; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
1178; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
1179; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
1180; ILP32E-WITHFP-NEXT:    lw a6, 12(s0)
1181; ILP32E-WITHFP-NEXT:    lw a7, 0(s0)
1182; ILP32E-WITHFP-NEXT:    lw t0, 4(s0)
1183; ILP32E-WITHFP-NEXT:    lw t1, 8(s0)
1184; ILP32E-WITHFP-NEXT:    andi a0, a0, 255
1185; ILP32E-WITHFP-NEXT:    slli a1, a1, 16
1186; ILP32E-WITHFP-NEXT:    srli a1, a1, 16
1187; ILP32E-WITHFP-NEXT:    add a0, a0, a2
1188; ILP32E-WITHFP-NEXT:    add a0, a0, a1
1189; ILP32E-WITHFP-NEXT:    add a0, a0, a5
1190; ILP32E-WITHFP-NEXT:    xor a1, a4, t1
1191; ILP32E-WITHFP-NEXT:    xor a2, a3, t0
1192; ILP32E-WITHFP-NEXT:    add a0, a0, a7
1193; ILP32E-WITHFP-NEXT:    or a1, a2, a1
1194; ILP32E-WITHFP-NEXT:    seqz a1, a1
1195; ILP32E-WITHFP-NEXT:    add a0, a0, a6
1196; ILP32E-WITHFP-NEXT:    add a0, a1, a0
1197; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
1198; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1199; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
1200; ILP32E-WITHFP-NEXT:    .cfi_restore ra
1201; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1202; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
1203; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1204; ILP32E-WITHFP-NEXT:    ret
1205;
1206; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_many_scalars:
1207; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1208; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a6, 12(sp)
1209; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a7, 0(sp)
1210; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw t0, 4(sp)
1211; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw t1, 8(sp)
1212; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    andi a0, a0, 255
1213; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    slli a1, a1, 16
1214; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    srli a1, a1, 16
1215; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a2
1216; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a1
1217; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a5
1218; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a1, a4, t1
1219; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a2, a3, t0
1220; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a7
1221; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    or a1, a2, a1
1222; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    seqz a1, a1
1223; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a6
1224; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a1, a0
1225; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
1226;
1227; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_many_scalars:
1228; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
1229; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1230; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1231; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1232; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1233; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
1234; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1235; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a6, 12(s0)
1236; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a7, 0(s0)
1237; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw t0, 4(s0)
1238; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw t1, 8(s0)
1239; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    andi a0, a0, 255
1240; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    slli a1, a1, 16
1241; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    srli a1, a1, 16
1242; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a2
1243; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a1
1244; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a5
1245; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a1, a4, t1
1246; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a2, a3, t0
1247; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a7
1248; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    or a1, a2, a1
1249; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    seqz a1, a1
1250; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a6
1251; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a1, a0
1252; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
1253; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1254  %a_ext = zext i8 %a to i32
1255  %b_ext = zext i16 %b to i32
1256  %1 = add i32 %a_ext, %b_ext
1257  %2 = add i32 %1, %c
1258  %3 = icmp eq i64 %d, %g
1259  %4 = zext i1 %3 to i32
1260  %5 = add i32 %4, %2
1261  %6 = add i32 %5, %e
1262  %7 = add i32 %6, %f
1263  %8 = add i32 %7, %h
1264  ret i32 %8
1265}
1266
1267define i32 @caller_many_scalars() {
1268; ILP32E-FPELIM-LABEL: caller_many_scalars:
1269; ILP32E-FPELIM:       # %bb.0:
1270; ILP32E-FPELIM-NEXT:    addi sp, sp, -20
1271; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 20
1272; ILP32E-FPELIM-NEXT:    sw ra, 16(sp) # 4-byte Folded Spill
1273; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
1274; ILP32E-FPELIM-NEXT:    li a4, 8
1275; ILP32E-FPELIM-NEXT:    li a6, 7
1276; ILP32E-FPELIM-NEXT:    li a7, 6
1277; ILP32E-FPELIM-NEXT:    li a0, 1
1278; ILP32E-FPELIM-NEXT:    li a1, 2
1279; ILP32E-FPELIM-NEXT:    li a2, 3
1280; ILP32E-FPELIM-NEXT:    li a3, 4
1281; ILP32E-FPELIM-NEXT:    li a5, 5
1282; ILP32E-FPELIM-NEXT:    sw a7, 0(sp)
1283; ILP32E-FPELIM-NEXT:    sw a6, 4(sp)
1284; ILP32E-FPELIM-NEXT:    sw zero, 8(sp)
1285; ILP32E-FPELIM-NEXT:    sw a4, 12(sp)
1286; ILP32E-FPELIM-NEXT:    li a4, 0
1287; ILP32E-FPELIM-NEXT:    call callee_many_scalars
1288; ILP32E-FPELIM-NEXT:    lw ra, 16(sp) # 4-byte Folded Reload
1289; ILP32E-FPELIM-NEXT:    .cfi_restore ra
1290; ILP32E-FPELIM-NEXT:    addi sp, sp, 20
1291; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
1292; ILP32E-FPELIM-NEXT:    ret
1293;
1294; ILP32E-WITHFP-LABEL: caller_many_scalars:
1295; ILP32E-WITHFP:       # %bb.0:
1296; ILP32E-WITHFP-NEXT:    addi sp, sp, -24
1297; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 24
1298; ILP32E-WITHFP-NEXT:    sw ra, 20(sp) # 4-byte Folded Spill
1299; ILP32E-WITHFP-NEXT:    sw s0, 16(sp) # 4-byte Folded Spill
1300; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
1301; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
1302; ILP32E-WITHFP-NEXT:    addi s0, sp, 24
1303; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
1304; ILP32E-WITHFP-NEXT:    li a4, 8
1305; ILP32E-WITHFP-NEXT:    li a6, 7
1306; ILP32E-WITHFP-NEXT:    li a7, 6
1307; ILP32E-WITHFP-NEXT:    li a0, 1
1308; ILP32E-WITHFP-NEXT:    li a1, 2
1309; ILP32E-WITHFP-NEXT:    li a2, 3
1310; ILP32E-WITHFP-NEXT:    li a3, 4
1311; ILP32E-WITHFP-NEXT:    li a5, 5
1312; ILP32E-WITHFP-NEXT:    sw a7, 0(sp)
1313; ILP32E-WITHFP-NEXT:    sw a6, 4(sp)
1314; ILP32E-WITHFP-NEXT:    sw zero, 8(sp)
1315; ILP32E-WITHFP-NEXT:    sw a4, 12(sp)
1316; ILP32E-WITHFP-NEXT:    li a4, 0
1317; ILP32E-WITHFP-NEXT:    call callee_many_scalars
1318; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 24
1319; ILP32E-WITHFP-NEXT:    lw ra, 20(sp) # 4-byte Folded Reload
1320; ILP32E-WITHFP-NEXT:    lw s0, 16(sp) # 4-byte Folded Reload
1321; ILP32E-WITHFP-NEXT:    .cfi_restore ra
1322; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1323; ILP32E-WITHFP-NEXT:    addi sp, sp, 24
1324; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1325; ILP32E-WITHFP-NEXT:    ret
1326;
1327; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_many_scalars:
1328; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1329; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
1330; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
1331; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1332; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, -16
1333; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 20
1334; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a4, 8
1335; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a6, 7
1336; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a7, 6
1337; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
1338; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 2
1339; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a2, 3
1340; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a3, 4
1341; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a5, 5
1342; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a7, 0(sp)
1343; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a6, 4(sp)
1344; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 8(sp)
1345; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a4, 12(sp)
1346; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a4, 0
1347; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_many_scalars
1348; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, 16
1349; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
1350; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
1351;
1352; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_many_scalars:
1353; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
1354; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1355; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1356; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1357; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1358; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, -16
1359; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 24
1360; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 24
1361; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1362; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a4, 8
1363; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a6, 7
1364; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a7, 6
1365; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
1366; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 2
1367; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a2, 3
1368; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a3, 4
1369; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a5, 5
1370; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a7, 0(sp)
1371; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a6, 4(sp)
1372; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 8(sp)
1373; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a4, 12(sp)
1374; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a4, 0
1375; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_many_scalars
1376; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 24
1377; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, 16
1378; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1379; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1380  %1 = call i32 @callee_many_scalars(i8 1, i16 2, i32 3, i64 4, i32 5, i32 6, i64 7, i32 8)
1381  ret i32 %1
1382}
1383
1384; Check that i128 and fp128 are passed indirectly
1385
1386define i32 @callee_large_scalars(i128 %a, fp128 %b) {
1387; ILP32E-FPELIM-LABEL: callee_large_scalars:
1388; ILP32E-FPELIM:       # %bb.0:
1389; ILP32E-FPELIM-NEXT:    lw a2, 0(a1)
1390; ILP32E-FPELIM-NEXT:    lw a3, 4(a1)
1391; ILP32E-FPELIM-NEXT:    lw a4, 8(a1)
1392; ILP32E-FPELIM-NEXT:    lw a1, 12(a1)
1393; ILP32E-FPELIM-NEXT:    lw a5, 12(a0)
1394; ILP32E-FPELIM-NEXT:    lw a6, 4(a0)
1395; ILP32E-FPELIM-NEXT:    lw a7, 8(a0)
1396; ILP32E-FPELIM-NEXT:    lw a0, 0(a0)
1397; ILP32E-FPELIM-NEXT:    xor a1, a5, a1
1398; ILP32E-FPELIM-NEXT:    xor a3, a6, a3
1399; ILP32E-FPELIM-NEXT:    xor a4, a7, a4
1400; ILP32E-FPELIM-NEXT:    xor a0, a0, a2
1401; ILP32E-FPELIM-NEXT:    or a1, a3, a1
1402; ILP32E-FPELIM-NEXT:    or a0, a0, a4
1403; ILP32E-FPELIM-NEXT:    or a0, a0, a1
1404; ILP32E-FPELIM-NEXT:    seqz a0, a0
1405; ILP32E-FPELIM-NEXT:    ret
1406;
1407; ILP32E-WITHFP-LABEL: callee_large_scalars:
1408; ILP32E-WITHFP:       # %bb.0:
1409; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
1410; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
1411; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1412; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
1413; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
1414; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
1415; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
1416; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
1417; ILP32E-WITHFP-NEXT:    lw a2, 0(a1)
1418; ILP32E-WITHFP-NEXT:    lw a3, 4(a1)
1419; ILP32E-WITHFP-NEXT:    lw a4, 8(a1)
1420; ILP32E-WITHFP-NEXT:    lw a1, 12(a1)
1421; ILP32E-WITHFP-NEXT:    lw a5, 12(a0)
1422; ILP32E-WITHFP-NEXT:    lw a6, 4(a0)
1423; ILP32E-WITHFP-NEXT:    lw a7, 8(a0)
1424; ILP32E-WITHFP-NEXT:    lw a0, 0(a0)
1425; ILP32E-WITHFP-NEXT:    xor a1, a5, a1
1426; ILP32E-WITHFP-NEXT:    xor a3, a6, a3
1427; ILP32E-WITHFP-NEXT:    xor a4, a7, a4
1428; ILP32E-WITHFP-NEXT:    xor a0, a0, a2
1429; ILP32E-WITHFP-NEXT:    or a1, a3, a1
1430; ILP32E-WITHFP-NEXT:    or a0, a0, a4
1431; ILP32E-WITHFP-NEXT:    or a0, a0, a1
1432; ILP32E-WITHFP-NEXT:    seqz a0, a0
1433; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
1434; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1435; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
1436; ILP32E-WITHFP-NEXT:    .cfi_restore ra
1437; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1438; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
1439; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1440; ILP32E-WITHFP-NEXT:    ret
1441;
1442; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_large_scalars:
1443; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1444; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a2, 0(a1)
1445; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a3, 4(a1)
1446; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a4, 8(a1)
1447; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a1, 12(a1)
1448; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a5, 12(a0)
1449; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a6, 4(a0)
1450; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a7, 8(a0)
1451; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a0, 0(a0)
1452; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a1, a5, a1
1453; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a3, a6, a3
1454; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a4, a7, a4
1455; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a0, a0, a2
1456; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    or a1, a3, a1
1457; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    or a0, a0, a4
1458; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    or a0, a0, a1
1459; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    seqz a0, a0
1460; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
1461;
1462; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_large_scalars:
1463; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
1464; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1465; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1466; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1467; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1468; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
1469; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1470; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a2, 0(a1)
1471; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a3, 4(a1)
1472; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a4, 8(a1)
1473; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a1, 12(a1)
1474; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a5, 12(a0)
1475; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a6, 4(a0)
1476; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a7, 8(a0)
1477; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a0, 0(a0)
1478; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a1, a5, a1
1479; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a3, a6, a3
1480; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a4, a7, a4
1481; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a0, a0, a2
1482; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    or a1, a3, a1
1483; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    or a0, a0, a4
1484; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    or a0, a0, a1
1485; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    seqz a0, a0
1486; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
1487; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1488  %b_bitcast = bitcast fp128 %b to i128
1489  %1 = icmp eq i128 %a, %b_bitcast
1490  %2 = zext i1 %1 to i32
1491  ret i32 %2
1492}
1493
1494define i32 @caller_large_scalars() {
1495; ILP32E-FPELIM-LABEL: caller_large_scalars:
1496; ILP32E-FPELIM:       # %bb.0:
1497; ILP32E-FPELIM-NEXT:    addi sp, sp, -48
1498; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 48
1499; ILP32E-FPELIM-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill
1500; ILP32E-FPELIM-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill
1501; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
1502; ILP32E-FPELIM-NEXT:    .cfi_offset s0, -8
1503; ILP32E-FPELIM-NEXT:    addi s0, sp, 48
1504; ILP32E-FPELIM-NEXT:    .cfi_def_cfa s0, 0
1505; ILP32E-FPELIM-NEXT:    andi sp, sp, -16
1506; ILP32E-FPELIM-NEXT:    lui a1, 524272
1507; ILP32E-FPELIM-NEXT:    li a2, 1
1508; ILP32E-FPELIM-NEXT:    addi a0, sp, 24
1509; ILP32E-FPELIM-NEXT:    sw zero, 0(sp)
1510; ILP32E-FPELIM-NEXT:    sw zero, 4(sp)
1511; ILP32E-FPELIM-NEXT:    sw zero, 8(sp)
1512; ILP32E-FPELIM-NEXT:    sw a1, 12(sp)
1513; ILP32E-FPELIM-NEXT:    mv a1, sp
1514; ILP32E-FPELIM-NEXT:    sw a2, 24(sp)
1515; ILP32E-FPELIM-NEXT:    sw zero, 28(sp)
1516; ILP32E-FPELIM-NEXT:    sw zero, 32(sp)
1517; ILP32E-FPELIM-NEXT:    sw zero, 36(sp)
1518; ILP32E-FPELIM-NEXT:    call callee_large_scalars
1519; ILP32E-FPELIM-NEXT:    addi sp, s0, -48
1520; ILP32E-FPELIM-NEXT:    .cfi_def_cfa sp, 48
1521; ILP32E-FPELIM-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload
1522; ILP32E-FPELIM-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload
1523; ILP32E-FPELIM-NEXT:    .cfi_restore ra
1524; ILP32E-FPELIM-NEXT:    .cfi_restore s0
1525; ILP32E-FPELIM-NEXT:    addi sp, sp, 48
1526; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
1527; ILP32E-FPELIM-NEXT:    ret
1528;
1529; ILP32E-WITHFP-LABEL: caller_large_scalars:
1530; ILP32E-WITHFP:       # %bb.0:
1531; ILP32E-WITHFP-NEXT:    addi sp, sp, -48
1532; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 48
1533; ILP32E-WITHFP-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill
1534; ILP32E-WITHFP-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill
1535; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
1536; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
1537; ILP32E-WITHFP-NEXT:    addi s0, sp, 48
1538; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
1539; ILP32E-WITHFP-NEXT:    andi sp, sp, -16
1540; ILP32E-WITHFP-NEXT:    lui a1, 524272
1541; ILP32E-WITHFP-NEXT:    li a2, 1
1542; ILP32E-WITHFP-NEXT:    addi a0, sp, 24
1543; ILP32E-WITHFP-NEXT:    sw zero, 0(sp)
1544; ILP32E-WITHFP-NEXT:    sw zero, 4(sp)
1545; ILP32E-WITHFP-NEXT:    sw zero, 8(sp)
1546; ILP32E-WITHFP-NEXT:    sw a1, 12(sp)
1547; ILP32E-WITHFP-NEXT:    mv a1, sp
1548; ILP32E-WITHFP-NEXT:    sw a2, 24(sp)
1549; ILP32E-WITHFP-NEXT:    sw zero, 28(sp)
1550; ILP32E-WITHFP-NEXT:    sw zero, 32(sp)
1551; ILP32E-WITHFP-NEXT:    sw zero, 36(sp)
1552; ILP32E-WITHFP-NEXT:    call callee_large_scalars
1553; ILP32E-WITHFP-NEXT:    addi sp, s0, -48
1554; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 48
1555; ILP32E-WITHFP-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload
1556; ILP32E-WITHFP-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload
1557; ILP32E-WITHFP-NEXT:    .cfi_restore ra
1558; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1559; ILP32E-WITHFP-NEXT:    addi sp, sp, 48
1560; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1561; ILP32E-WITHFP-NEXT:    ret
1562;
1563; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_large_scalars:
1564; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1565; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1566; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1567; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1568; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1569; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, -40
1570; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 48
1571; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi s0, sp, 48
1572; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1573; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    andi sp, sp, -16
1574; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui a1, 524272
1575; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a2, 1
1576; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi a0, sp, 24
1577; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 0(sp)
1578; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 4(sp)
1579; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 8(sp)
1580; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a1, 12(sp)
1581; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a1, sp
1582; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a2, 24(sp)
1583; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 28(sp)
1584; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 32(sp)
1585; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 36(sp)
1586; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_large_scalars
1587; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, s0, -48
1588; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 48
1589; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, 40
1590; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1591; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1592;
1593; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_large_scalars:
1594; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
1595; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1596; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1597; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1598; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1599; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, -40
1600; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 48
1601; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 48
1602; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1603; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    andi sp, sp, -16
1604; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui a1, 524272
1605; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a2, 1
1606; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a0, sp, 24
1607; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 0(sp)
1608; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 4(sp)
1609; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 8(sp)
1610; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a1, 12(sp)
1611; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv a1, sp
1612; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a2, 24(sp)
1613; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 28(sp)
1614; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 32(sp)
1615; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 36(sp)
1616; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_large_scalars
1617; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, s0, -48
1618; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 48
1619; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, 40
1620; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1621; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1622  %1 = call i32 @callee_large_scalars(i128 1, fp128 0xL00000000000000007FFF000000000000)
1623  ret i32 %1
1624}
1625
1626; Check that arguments larger than 2*xlen are handled correctly when their
1627; address is passed on the stack rather than in memory
1628
1629; Must keep define on a single line due to an update_llc_test_checks.py limitation
1630define i32 @callee_large_scalars_exhausted_regs(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i128 %h, i32 %i, fp128 %j) {
1631; ILP32E-FPELIM-LABEL: callee_large_scalars_exhausted_regs:
1632; ILP32E-FPELIM:       # %bb.0:
1633; ILP32E-FPELIM-NEXT:    lw a0, 12(sp)
1634; ILP32E-FPELIM-NEXT:    lw a1, 4(sp)
1635; ILP32E-FPELIM-NEXT:    lw a2, 0(a0)
1636; ILP32E-FPELIM-NEXT:    lw a3, 4(a0)
1637; ILP32E-FPELIM-NEXT:    lw a4, 8(a0)
1638; ILP32E-FPELIM-NEXT:    lw a0, 12(a0)
1639; ILP32E-FPELIM-NEXT:    lw a5, 12(a1)
1640; ILP32E-FPELIM-NEXT:    lw a6, 4(a1)
1641; ILP32E-FPELIM-NEXT:    lw a7, 8(a1)
1642; ILP32E-FPELIM-NEXT:    lw a1, 0(a1)
1643; ILP32E-FPELIM-NEXT:    xor a0, a5, a0
1644; ILP32E-FPELIM-NEXT:    xor a3, a6, a3
1645; ILP32E-FPELIM-NEXT:    xor a4, a7, a4
1646; ILP32E-FPELIM-NEXT:    xor a1, a1, a2
1647; ILP32E-FPELIM-NEXT:    or a0, a3, a0
1648; ILP32E-FPELIM-NEXT:    or a1, a1, a4
1649; ILP32E-FPELIM-NEXT:    or a0, a1, a0
1650; ILP32E-FPELIM-NEXT:    seqz a0, a0
1651; ILP32E-FPELIM-NEXT:    ret
1652;
1653; ILP32E-WITHFP-LABEL: callee_large_scalars_exhausted_regs:
1654; ILP32E-WITHFP:       # %bb.0:
1655; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
1656; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
1657; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1658; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
1659; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
1660; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
1661; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
1662; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
1663; ILP32E-WITHFP-NEXT:    lw a0, 12(s0)
1664; ILP32E-WITHFP-NEXT:    lw a1, 4(s0)
1665; ILP32E-WITHFP-NEXT:    lw a2, 0(a0)
1666; ILP32E-WITHFP-NEXT:    lw a3, 4(a0)
1667; ILP32E-WITHFP-NEXT:    lw a4, 8(a0)
1668; ILP32E-WITHFP-NEXT:    lw a0, 12(a0)
1669; ILP32E-WITHFP-NEXT:    lw a5, 12(a1)
1670; ILP32E-WITHFP-NEXT:    lw a6, 4(a1)
1671; ILP32E-WITHFP-NEXT:    lw a7, 8(a1)
1672; ILP32E-WITHFP-NEXT:    lw a1, 0(a1)
1673; ILP32E-WITHFP-NEXT:    xor a0, a5, a0
1674; ILP32E-WITHFP-NEXT:    xor a3, a6, a3
1675; ILP32E-WITHFP-NEXT:    xor a4, a7, a4
1676; ILP32E-WITHFP-NEXT:    xor a1, a1, a2
1677; ILP32E-WITHFP-NEXT:    or a0, a3, a0
1678; ILP32E-WITHFP-NEXT:    or a1, a1, a4
1679; ILP32E-WITHFP-NEXT:    or a0, a1, a0
1680; ILP32E-WITHFP-NEXT:    seqz a0, a0
1681; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
1682; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1683; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
1684; ILP32E-WITHFP-NEXT:    .cfi_restore ra
1685; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1686; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
1687; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1688; ILP32E-WITHFP-NEXT:    ret
1689;
1690; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_large_scalars_exhausted_regs:
1691; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1692; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a0, 12(sp)
1693; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a1, 4(sp)
1694; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a2, 0(a0)
1695; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a3, 4(a0)
1696; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a4, 8(a0)
1697; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a0, 12(a0)
1698; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a5, 12(a1)
1699; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a6, 4(a1)
1700; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a7, 8(a1)
1701; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a1, 0(a1)
1702; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a0, a5, a0
1703; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a3, a6, a3
1704; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a4, a7, a4
1705; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a1, a1, a2
1706; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    or a0, a3, a0
1707; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    or a1, a1, a4
1708; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    or a0, a1, a0
1709; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    seqz a0, a0
1710; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
1711;
1712; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_large_scalars_exhausted_regs:
1713; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
1714; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1715; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1716; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1717; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1718; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
1719; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1720; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a0, 12(s0)
1721; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a1, 4(s0)
1722; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a2, 0(a0)
1723; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a3, 4(a0)
1724; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a4, 8(a0)
1725; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a0, 12(a0)
1726; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a5, 12(a1)
1727; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a6, 4(a1)
1728; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a7, 8(a1)
1729; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a1, 0(a1)
1730; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a0, a5, a0
1731; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a3, a6, a3
1732; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a4, a7, a4
1733; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a1, a1, a2
1734; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    or a0, a3, a0
1735; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    or a1, a1, a4
1736; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    or a0, a1, a0
1737; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    seqz a0, a0
1738; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
1739; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1740  %j_bitcast = bitcast fp128 %j to i128
1741  %1 = icmp eq i128 %h, %j_bitcast
1742  %2 = zext i1 %1 to i32
1743  ret i32 %2
1744}
1745
1746define i32 @caller_large_scalars_exhausted_regs() {
1747; ILP32E-FPELIM-LABEL: caller_large_scalars_exhausted_regs:
1748; ILP32E-FPELIM:       # %bb.0:
1749; ILP32E-FPELIM-NEXT:    addi sp, sp, -64
1750; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 64
1751; ILP32E-FPELIM-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
1752; ILP32E-FPELIM-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
1753; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
1754; ILP32E-FPELIM-NEXT:    .cfi_offset s0, -8
1755; ILP32E-FPELIM-NEXT:    addi s0, sp, 64
1756; ILP32E-FPELIM-NEXT:    .cfi_def_cfa s0, 0
1757; ILP32E-FPELIM-NEXT:    andi sp, sp, -16
1758; ILP32E-FPELIM-NEXT:    addi a4, sp, 16
1759; ILP32E-FPELIM-NEXT:    li a5, 9
1760; ILP32E-FPELIM-NEXT:    addi a6, sp, 40
1761; ILP32E-FPELIM-NEXT:    li a7, 7
1762; ILP32E-FPELIM-NEXT:    lui t0, 524272
1763; ILP32E-FPELIM-NEXT:    li t1, 8
1764; ILP32E-FPELIM-NEXT:    li a0, 1
1765; ILP32E-FPELIM-NEXT:    li a1, 2
1766; ILP32E-FPELIM-NEXT:    li a2, 3
1767; ILP32E-FPELIM-NEXT:    li a3, 4
1768; ILP32E-FPELIM-NEXT:    sw a7, 0(sp)
1769; ILP32E-FPELIM-NEXT:    sw a6, 4(sp)
1770; ILP32E-FPELIM-NEXT:    sw a5, 8(sp)
1771; ILP32E-FPELIM-NEXT:    sw a4, 12(sp)
1772; ILP32E-FPELIM-NEXT:    li a4, 5
1773; ILP32E-FPELIM-NEXT:    sw zero, 16(sp)
1774; ILP32E-FPELIM-NEXT:    sw zero, 20(sp)
1775; ILP32E-FPELIM-NEXT:    sw zero, 24(sp)
1776; ILP32E-FPELIM-NEXT:    sw t0, 28(sp)
1777; ILP32E-FPELIM-NEXT:    li a5, 6
1778; ILP32E-FPELIM-NEXT:    sw t1, 40(sp)
1779; ILP32E-FPELIM-NEXT:    sw zero, 44(sp)
1780; ILP32E-FPELIM-NEXT:    sw zero, 48(sp)
1781; ILP32E-FPELIM-NEXT:    sw zero, 52(sp)
1782; ILP32E-FPELIM-NEXT:    call callee_large_scalars_exhausted_regs
1783; ILP32E-FPELIM-NEXT:    addi sp, s0, -64
1784; ILP32E-FPELIM-NEXT:    .cfi_def_cfa sp, 64
1785; ILP32E-FPELIM-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
1786; ILP32E-FPELIM-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
1787; ILP32E-FPELIM-NEXT:    .cfi_restore ra
1788; ILP32E-FPELIM-NEXT:    .cfi_restore s0
1789; ILP32E-FPELIM-NEXT:    addi sp, sp, 64
1790; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
1791; ILP32E-FPELIM-NEXT:    ret
1792;
1793; ILP32E-WITHFP-LABEL: caller_large_scalars_exhausted_regs:
1794; ILP32E-WITHFP:       # %bb.0:
1795; ILP32E-WITHFP-NEXT:    addi sp, sp, -64
1796; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 64
1797; ILP32E-WITHFP-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
1798; ILP32E-WITHFP-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
1799; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
1800; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
1801; ILP32E-WITHFP-NEXT:    addi s0, sp, 64
1802; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
1803; ILP32E-WITHFP-NEXT:    andi sp, sp, -16
1804; ILP32E-WITHFP-NEXT:    addi a4, sp, 16
1805; ILP32E-WITHFP-NEXT:    li a5, 9
1806; ILP32E-WITHFP-NEXT:    addi a6, sp, 40
1807; ILP32E-WITHFP-NEXT:    li a7, 7
1808; ILP32E-WITHFP-NEXT:    lui t0, 524272
1809; ILP32E-WITHFP-NEXT:    li t1, 8
1810; ILP32E-WITHFP-NEXT:    li a0, 1
1811; ILP32E-WITHFP-NEXT:    li a1, 2
1812; ILP32E-WITHFP-NEXT:    li a2, 3
1813; ILP32E-WITHFP-NEXT:    li a3, 4
1814; ILP32E-WITHFP-NEXT:    sw a7, 0(sp)
1815; ILP32E-WITHFP-NEXT:    sw a6, 4(sp)
1816; ILP32E-WITHFP-NEXT:    sw a5, 8(sp)
1817; ILP32E-WITHFP-NEXT:    sw a4, 12(sp)
1818; ILP32E-WITHFP-NEXT:    li a4, 5
1819; ILP32E-WITHFP-NEXT:    sw zero, 16(sp)
1820; ILP32E-WITHFP-NEXT:    sw zero, 20(sp)
1821; ILP32E-WITHFP-NEXT:    sw zero, 24(sp)
1822; ILP32E-WITHFP-NEXT:    sw t0, 28(sp)
1823; ILP32E-WITHFP-NEXT:    li a5, 6
1824; ILP32E-WITHFP-NEXT:    sw t1, 40(sp)
1825; ILP32E-WITHFP-NEXT:    sw zero, 44(sp)
1826; ILP32E-WITHFP-NEXT:    sw zero, 48(sp)
1827; ILP32E-WITHFP-NEXT:    sw zero, 52(sp)
1828; ILP32E-WITHFP-NEXT:    call callee_large_scalars_exhausted_regs
1829; ILP32E-WITHFP-NEXT:    addi sp, s0, -64
1830; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 64
1831; ILP32E-WITHFP-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
1832; ILP32E-WITHFP-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
1833; ILP32E-WITHFP-NEXT:    .cfi_restore ra
1834; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1835; ILP32E-WITHFP-NEXT:    addi sp, sp, 64
1836; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1837; ILP32E-WITHFP-NEXT:    ret
1838;
1839; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_large_scalars_exhausted_regs:
1840; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1841; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1842; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1843; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1844; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1845; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, -56
1846; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 64
1847; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi s0, sp, 64
1848; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1849; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    andi sp, sp, -16
1850; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi a4, sp, 16
1851; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a5, 9
1852; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi a6, sp, 40
1853; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a7, 7
1854; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui t0, 524272
1855; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li t1, 8
1856; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
1857; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 2
1858; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a2, 3
1859; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a3, 4
1860; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a7, 0(sp)
1861; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a6, 4(sp)
1862; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a5, 8(sp)
1863; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a4, 12(sp)
1864; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a4, 5
1865; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 16(sp)
1866; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 20(sp)
1867; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 24(sp)
1868; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw t0, 28(sp)
1869; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a5, 6
1870; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw t1, 40(sp)
1871; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 44(sp)
1872; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 48(sp)
1873; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 52(sp)
1874; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_large_scalars_exhausted_regs
1875; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, s0, -64
1876; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 64
1877; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, 56
1878; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1879; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1880;
1881; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_large_scalars_exhausted_regs:
1882; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
1883; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1884; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1885; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1886; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1887; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, -56
1888; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 64
1889; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 64
1890; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1891; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    andi sp, sp, -16
1892; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a4, sp, 16
1893; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a5, 9
1894; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a6, sp, 40
1895; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a7, 7
1896; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui t0, 524272
1897; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li t1, 8
1898; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
1899; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 2
1900; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a2, 3
1901; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a3, 4
1902; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a7, 0(sp)
1903; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a6, 4(sp)
1904; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a5, 8(sp)
1905; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a4, 12(sp)
1906; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a4, 5
1907; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 16(sp)
1908; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 20(sp)
1909; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 24(sp)
1910; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw t0, 28(sp)
1911; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a5, 6
1912; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw t1, 40(sp)
1913; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 44(sp)
1914; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 48(sp)
1915; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 52(sp)
1916; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_large_scalars_exhausted_regs
1917; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, s0, -64
1918; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 64
1919; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, 56
1920; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1921; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
1922  %1 = call i32 @callee_large_scalars_exhausted_regs(
1923      i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i128 8, i32 9,
1924      fp128 0xL00000000000000007FFF000000000000)
1925  ret i32 %1
1926}
1927
1928; Ensure that libcalls generated in the middle-end obey the calling convention
1929
1930define i32 @caller_mixed_scalar_libcalls(i64 %a) {
1931; ILP32E-FPELIM-LABEL: caller_mixed_scalar_libcalls:
1932; ILP32E-FPELIM:       # %bb.0:
1933; ILP32E-FPELIM-NEXT:    addi sp, sp, -24
1934; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 24
1935; ILP32E-FPELIM-NEXT:    sw ra, 20(sp) # 4-byte Folded Spill
1936; ILP32E-FPELIM-NEXT:    sw s0, 16(sp) # 4-byte Folded Spill
1937; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
1938; ILP32E-FPELIM-NEXT:    .cfi_offset s0, -8
1939; ILP32E-FPELIM-NEXT:    addi s0, sp, 24
1940; ILP32E-FPELIM-NEXT:    .cfi_def_cfa s0, 0
1941; ILP32E-FPELIM-NEXT:    andi sp, sp, -8
1942; ILP32E-FPELIM-NEXT:    mv a2, a1
1943; ILP32E-FPELIM-NEXT:    mv a1, a0
1944; ILP32E-FPELIM-NEXT:    mv a0, sp
1945; ILP32E-FPELIM-NEXT:    call __floatditf
1946; ILP32E-FPELIM-NEXT:    lw a0, 0(sp)
1947; ILP32E-FPELIM-NEXT:    addi sp, s0, -24
1948; ILP32E-FPELIM-NEXT:    .cfi_def_cfa sp, 24
1949; ILP32E-FPELIM-NEXT:    lw ra, 20(sp) # 4-byte Folded Reload
1950; ILP32E-FPELIM-NEXT:    lw s0, 16(sp) # 4-byte Folded Reload
1951; ILP32E-FPELIM-NEXT:    .cfi_restore ra
1952; ILP32E-FPELIM-NEXT:    .cfi_restore s0
1953; ILP32E-FPELIM-NEXT:    addi sp, sp, 24
1954; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
1955; ILP32E-FPELIM-NEXT:    ret
1956;
1957; ILP32E-WITHFP-LABEL: caller_mixed_scalar_libcalls:
1958; ILP32E-WITHFP:       # %bb.0:
1959; ILP32E-WITHFP-NEXT:    addi sp, sp, -24
1960; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 24
1961; ILP32E-WITHFP-NEXT:    sw ra, 20(sp) # 4-byte Folded Spill
1962; ILP32E-WITHFP-NEXT:    sw s0, 16(sp) # 4-byte Folded Spill
1963; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
1964; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
1965; ILP32E-WITHFP-NEXT:    addi s0, sp, 24
1966; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
1967; ILP32E-WITHFP-NEXT:    andi sp, sp, -8
1968; ILP32E-WITHFP-NEXT:    mv a2, a1
1969; ILP32E-WITHFP-NEXT:    mv a1, a0
1970; ILP32E-WITHFP-NEXT:    mv a0, sp
1971; ILP32E-WITHFP-NEXT:    call __floatditf
1972; ILP32E-WITHFP-NEXT:    lw a0, 0(sp)
1973; ILP32E-WITHFP-NEXT:    addi sp, s0, -24
1974; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 24
1975; ILP32E-WITHFP-NEXT:    lw ra, 20(sp) # 4-byte Folded Reload
1976; ILP32E-WITHFP-NEXT:    lw s0, 16(sp) # 4-byte Folded Reload
1977; ILP32E-WITHFP-NEXT:    .cfi_restore ra
1978; ILP32E-WITHFP-NEXT:    .cfi_restore s0
1979; ILP32E-WITHFP-NEXT:    addi sp, sp, 24
1980; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
1981; ILP32E-WITHFP-NEXT:    ret
1982;
1983; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_mixed_scalar_libcalls:
1984; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
1985; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
1986; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
1987; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
1988; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
1989; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, -16
1990; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 24
1991; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi s0, sp, 24
1992; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
1993; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    andi sp, sp, -8
1994; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a2, a1
1995; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a1, a0
1996; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a0, sp
1997; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call __floatditf
1998; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a0, 0(sp)
1999; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, s0, -24
2000; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 24
2001; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, 16
2002; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2003; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2004;
2005; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_mixed_scalar_libcalls:
2006; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2007; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2008; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2009; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2010; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2011; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, -16
2012; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 24
2013; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 24
2014; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2015; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    andi sp, sp, -8
2016; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv a2, a1
2017; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv a1, a0
2018; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv a0, sp
2019; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call __floatditf
2020; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a0, 0(sp)
2021; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, s0, -24
2022; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 24
2023; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, 16
2024; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2025; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2026  %1 = sitofp i64 %a to fp128
2027  %2 = bitcast fp128 %1 to i128
2028  %3 = trunc i128 %2 to i32
2029  ret i32 %3
2030}
2031
2032
2033; Check passing of coerced integer arrays
2034
2035%struct.small = type { i32, ptr }
2036
2037define i32 @callee_small_coerced_struct([2 x i32] %a.coerce) {
2038; ILP32E-FPELIM-LABEL: callee_small_coerced_struct:
2039; ILP32E-FPELIM:       # %bb.0:
2040; ILP32E-FPELIM-NEXT:    xor a0, a0, a1
2041; ILP32E-FPELIM-NEXT:    seqz a0, a0
2042; ILP32E-FPELIM-NEXT:    ret
2043;
2044; ILP32E-WITHFP-LABEL: callee_small_coerced_struct:
2045; ILP32E-WITHFP:       # %bb.0:
2046; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
2047; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
2048; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
2049; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
2050; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2051; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2052; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
2053; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2054; ILP32E-WITHFP-NEXT:    xor a0, a0, a1
2055; ILP32E-WITHFP-NEXT:    seqz a0, a0
2056; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
2057; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
2058; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
2059; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2060; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2061; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
2062; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2063; ILP32E-WITHFP-NEXT:    ret
2064;
2065; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_small_coerced_struct:
2066; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2067; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    xor a0, a0, a1
2068; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    seqz a0, a0
2069; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
2070;
2071; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_small_coerced_struct:
2072; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2073; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2074; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2075; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2076; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2077; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
2078; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2079; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    xor a0, a0, a1
2080; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    seqz a0, a0
2081; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
2082; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2083  %1 = extractvalue [2 x i32] %a.coerce, 0
2084  %2 = extractvalue [2 x i32] %a.coerce, 1
2085  %3 = icmp eq i32 %1, %2
2086  %4 = zext i1 %3 to i32
2087  ret i32 %4
2088}
2089
2090define i32 @caller_small_coerced_struct() {
2091; ILP32E-FPELIM-LABEL: caller_small_coerced_struct:
2092; ILP32E-FPELIM:       # %bb.0:
2093; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
2094; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 4
2095; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
2096; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
2097; ILP32E-FPELIM-NEXT:    li a0, 1
2098; ILP32E-FPELIM-NEXT:    li a1, 2
2099; ILP32E-FPELIM-NEXT:    call callee_small_coerced_struct
2100; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
2101; ILP32E-FPELIM-NEXT:    .cfi_restore ra
2102; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
2103; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
2104; ILP32E-FPELIM-NEXT:    ret
2105;
2106; ILP32E-WITHFP-LABEL: caller_small_coerced_struct:
2107; ILP32E-WITHFP:       # %bb.0:
2108; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
2109; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
2110; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
2111; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
2112; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2113; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2114; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
2115; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2116; ILP32E-WITHFP-NEXT:    li a0, 1
2117; ILP32E-WITHFP-NEXT:    li a1, 2
2118; ILP32E-WITHFP-NEXT:    call callee_small_coerced_struct
2119; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
2120; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
2121; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
2122; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2123; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2124; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
2125; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2126; ILP32E-WITHFP-NEXT:    ret
2127;
2128; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_small_coerced_struct:
2129; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2130; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
2131; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
2132; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2133; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
2134; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 2
2135; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_small_coerced_struct
2136; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
2137;
2138; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_small_coerced_struct:
2139; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2140; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2141; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2142; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2143; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2144; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
2145; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2146; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
2147; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 2
2148; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_small_coerced_struct
2149; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
2150; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2151  %1 = call i32 @callee_small_coerced_struct([2 x i32] [i32 1, i32 2])
2152  ret i32 %1
2153}
2154
2155; Check large struct arguments, which are passed byval
2156
2157%struct.large = type { i32, i32, i32, i32 }
2158
2159define i32 @callee_large_struct(ptr byval(%struct.large) align 4 %a) {
2160; ILP32E-FPELIM-LABEL: callee_large_struct:
2161; ILP32E-FPELIM:       # %bb.0:
2162; ILP32E-FPELIM-NEXT:    lw a1, 0(a0)
2163; ILP32E-FPELIM-NEXT:    lw a0, 12(a0)
2164; ILP32E-FPELIM-NEXT:    add a0, a1, a0
2165; ILP32E-FPELIM-NEXT:    ret
2166;
2167; ILP32E-WITHFP-LABEL: callee_large_struct:
2168; ILP32E-WITHFP:       # %bb.0:
2169; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
2170; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
2171; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
2172; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
2173; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2174; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2175; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
2176; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2177; ILP32E-WITHFP-NEXT:    lw a1, 0(a0)
2178; ILP32E-WITHFP-NEXT:    lw a0, 12(a0)
2179; ILP32E-WITHFP-NEXT:    add a0, a1, a0
2180; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
2181; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
2182; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
2183; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2184; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2185; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
2186; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2187; ILP32E-WITHFP-NEXT:    ret
2188;
2189; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_large_struct:
2190; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2191; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a1, 0(a0)
2192; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a0, 12(a0)
2193; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a1, a0
2194; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
2195;
2196; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_large_struct:
2197; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2198; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2199; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2200; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2201; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2202; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
2203; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2204; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a1, 0(a0)
2205; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a0, 12(a0)
2206; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a1, a0
2207; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
2208; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2209  %1 = getelementptr inbounds %struct.large, ptr %a, i32 0, i32 0
2210  %2 = getelementptr inbounds %struct.large, ptr %a, i32 0, i32 3
2211  %3 = load i32, ptr %1
2212  %4 = load i32, ptr %2
2213  %5 = add i32 %3, %4
2214  ret i32 %5
2215}
2216
2217define i32 @caller_large_struct() {
2218; ILP32E-FPELIM-LABEL: caller_large_struct:
2219; ILP32E-FPELIM:       # %bb.0:
2220; ILP32E-FPELIM-NEXT:    addi sp, sp, -36
2221; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 36
2222; ILP32E-FPELIM-NEXT:    sw ra, 32(sp) # 4-byte Folded Spill
2223; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
2224; ILP32E-FPELIM-NEXT:    li a0, 1
2225; ILP32E-FPELIM-NEXT:    li a1, 2
2226; ILP32E-FPELIM-NEXT:    li a2, 3
2227; ILP32E-FPELIM-NEXT:    li a3, 4
2228; ILP32E-FPELIM-NEXT:    sw a0, 16(sp)
2229; ILP32E-FPELIM-NEXT:    sw a1, 20(sp)
2230; ILP32E-FPELIM-NEXT:    sw a2, 24(sp)
2231; ILP32E-FPELIM-NEXT:    sw a3, 28(sp)
2232; ILP32E-FPELIM-NEXT:    sw a0, 0(sp)
2233; ILP32E-FPELIM-NEXT:    sw a1, 4(sp)
2234; ILP32E-FPELIM-NEXT:    sw a2, 8(sp)
2235; ILP32E-FPELIM-NEXT:    sw a3, 12(sp)
2236; ILP32E-FPELIM-NEXT:    mv a0, sp
2237; ILP32E-FPELIM-NEXT:    call callee_large_struct
2238; ILP32E-FPELIM-NEXT:    lw ra, 32(sp) # 4-byte Folded Reload
2239; ILP32E-FPELIM-NEXT:    .cfi_restore ra
2240; ILP32E-FPELIM-NEXT:    addi sp, sp, 36
2241; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
2242; ILP32E-FPELIM-NEXT:    ret
2243;
2244; ILP32E-WITHFP-LABEL: caller_large_struct:
2245; ILP32E-WITHFP:       # %bb.0:
2246; ILP32E-WITHFP-NEXT:    addi sp, sp, -40
2247; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 40
2248; ILP32E-WITHFP-NEXT:    sw ra, 36(sp) # 4-byte Folded Spill
2249; ILP32E-WITHFP-NEXT:    sw s0, 32(sp) # 4-byte Folded Spill
2250; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2251; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2252; ILP32E-WITHFP-NEXT:    addi s0, sp, 40
2253; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2254; ILP32E-WITHFP-NEXT:    li a0, 1
2255; ILP32E-WITHFP-NEXT:    li a1, 2
2256; ILP32E-WITHFP-NEXT:    li a2, 3
2257; ILP32E-WITHFP-NEXT:    li a3, 4
2258; ILP32E-WITHFP-NEXT:    sw a0, -24(s0)
2259; ILP32E-WITHFP-NEXT:    sw a1, -20(s0)
2260; ILP32E-WITHFP-NEXT:    sw a2, -16(s0)
2261; ILP32E-WITHFP-NEXT:    sw a3, -12(s0)
2262; ILP32E-WITHFP-NEXT:    sw a0, -40(s0)
2263; ILP32E-WITHFP-NEXT:    sw a1, -36(s0)
2264; ILP32E-WITHFP-NEXT:    sw a2, -32(s0)
2265; ILP32E-WITHFP-NEXT:    sw a3, -28(s0)
2266; ILP32E-WITHFP-NEXT:    addi a0, s0, -40
2267; ILP32E-WITHFP-NEXT:    call callee_large_struct
2268; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 40
2269; ILP32E-WITHFP-NEXT:    lw ra, 36(sp) # 4-byte Folded Reload
2270; ILP32E-WITHFP-NEXT:    lw s0, 32(sp) # 4-byte Folded Reload
2271; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2272; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2273; ILP32E-WITHFP-NEXT:    addi sp, sp, 40
2274; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2275; ILP32E-WITHFP-NEXT:    ret
2276;
2277; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_large_struct:
2278; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2279; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
2280; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
2281; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2282; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, -32
2283; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 36
2284; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
2285; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 2
2286; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a2, 3
2287; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a3, 4
2288; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a0, 16(sp)
2289; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a1, 20(sp)
2290; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a2, 24(sp)
2291; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a3, 28(sp)
2292; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a0, 0(sp)
2293; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a1, 4(sp)
2294; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a2, 8(sp)
2295; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a3, 12(sp)
2296; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a0, sp
2297; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_large_struct
2298; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, 32
2299; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
2300; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
2301;
2302; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_large_struct:
2303; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2304; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2305; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2306; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2307; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2308; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, -32
2309; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 40
2310; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 40
2311; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2312; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
2313; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 2
2314; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a2, 3
2315; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a3, 4
2316; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a0, -24(s0)
2317; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a1, -20(s0)
2318; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a2, -16(s0)
2319; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a3, -12(s0)
2320; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a0, -40(s0)
2321; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a1, -36(s0)
2322; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a2, -32(s0)
2323; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a3, -28(s0)
2324; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi a0, s0, -40
2325; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_large_struct
2326; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 40
2327; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, 32
2328; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2329; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2330  %ls = alloca %struct.large, align 4
2331  %1 = bitcast ptr %ls to ptr
2332  %a = getelementptr inbounds %struct.large, ptr %ls, i32 0, i32 0
2333  store i32 1, ptr %a
2334  %b = getelementptr inbounds %struct.large, ptr %ls, i32 0, i32 1
2335  store i32 2, ptr %b
2336  %c = getelementptr inbounds %struct.large, ptr %ls, i32 0, i32 2
2337  store i32 3, ptr %c
2338  %d = getelementptr inbounds %struct.large, ptr %ls, i32 0, i32 3
2339  store i32 4, ptr %d
2340  %2 = call i32 @callee_large_struct(ptr byval(%struct.large) align 4 %ls)
2341  ret i32 %2
2342}
2343
2344; Check return of 2x xlen structs
2345
2346define %struct.small @callee_small_struct_ret() {
2347; ILP32E-FPELIM-LABEL: callee_small_struct_ret:
2348; ILP32E-FPELIM:       # %bb.0:
2349; ILP32E-FPELIM-NEXT:    li a0, 1
2350; ILP32E-FPELIM-NEXT:    li a1, 0
2351; ILP32E-FPELIM-NEXT:    ret
2352;
2353; ILP32E-WITHFP-LABEL: callee_small_struct_ret:
2354; ILP32E-WITHFP:       # %bb.0:
2355; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
2356; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
2357; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
2358; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
2359; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2360; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2361; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
2362; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2363; ILP32E-WITHFP-NEXT:    li a0, 1
2364; ILP32E-WITHFP-NEXT:    li a1, 0
2365; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
2366; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
2367; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
2368; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2369; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2370; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
2371; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2372; ILP32E-WITHFP-NEXT:    ret
2373;
2374; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_small_struct_ret:
2375; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2376; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a0, 1
2377; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 0
2378; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
2379;
2380; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_small_struct_ret:
2381; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2382; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2383; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2384; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2385; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2386; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
2387; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2388; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a0, 1
2389; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 0
2390; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
2391; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2392  ret %struct.small { i32 1, ptr null }
2393}
2394
2395define i32 @caller_small_struct_ret() {
2396; ILP32E-FPELIM-LABEL: caller_small_struct_ret:
2397; ILP32E-FPELIM:       # %bb.0:
2398; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
2399; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 4
2400; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
2401; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
2402; ILP32E-FPELIM-NEXT:    call callee_small_struct_ret
2403; ILP32E-FPELIM-NEXT:    add a0, a0, a1
2404; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
2405; ILP32E-FPELIM-NEXT:    .cfi_restore ra
2406; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
2407; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
2408; ILP32E-FPELIM-NEXT:    ret
2409;
2410; ILP32E-WITHFP-LABEL: caller_small_struct_ret:
2411; ILP32E-WITHFP:       # %bb.0:
2412; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
2413; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
2414; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
2415; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
2416; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2417; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2418; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
2419; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2420; ILP32E-WITHFP-NEXT:    call callee_small_struct_ret
2421; ILP32E-WITHFP-NEXT:    add a0, a0, a1
2422; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
2423; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
2424; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
2425; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2426; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2427; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
2428; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2429; ILP32E-WITHFP-NEXT:    ret
2430;
2431; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_small_struct_ret:
2432; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2433; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_0
2434; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 4
2435; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2436; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_small_struct_ret
2437; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a1
2438; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_0
2439;
2440; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_small_struct_ret:
2441; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2442; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2443; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2444; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2445; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2446; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
2447; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2448; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_small_struct_ret
2449; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a1
2450; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
2451; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2452  %1 = call %struct.small @callee_small_struct_ret()
2453  %2 = extractvalue %struct.small %1, 0
2454  %3 = extractvalue %struct.small %1, 1
2455  %4 = ptrtoint ptr %3 to i32
2456  %5 = add i32 %2, %4
2457  ret i32 %5
2458}
2459
2460; Check return of >2x xlen scalars
2461
2462define fp128 @callee_large_scalar_ret() {
2463; ILP32E-FPELIM-LABEL: callee_large_scalar_ret:
2464; ILP32E-FPELIM:       # %bb.0:
2465; ILP32E-FPELIM-NEXT:    lui a1, 524272
2466; ILP32E-FPELIM-NEXT:    sw zero, 0(a0)
2467; ILP32E-FPELIM-NEXT:    sw zero, 4(a0)
2468; ILP32E-FPELIM-NEXT:    sw zero, 8(a0)
2469; ILP32E-FPELIM-NEXT:    sw a1, 12(a0)
2470; ILP32E-FPELIM-NEXT:    ret
2471;
2472; ILP32E-WITHFP-LABEL: callee_large_scalar_ret:
2473; ILP32E-WITHFP:       # %bb.0:
2474; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
2475; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
2476; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
2477; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
2478; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2479; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2480; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
2481; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2482; ILP32E-WITHFP-NEXT:    lui a1, 524272
2483; ILP32E-WITHFP-NEXT:    sw zero, 0(a0)
2484; ILP32E-WITHFP-NEXT:    sw zero, 4(a0)
2485; ILP32E-WITHFP-NEXT:    sw zero, 8(a0)
2486; ILP32E-WITHFP-NEXT:    sw a1, 12(a0)
2487; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
2488; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
2489; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
2490; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2491; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2492; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
2493; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2494; ILP32E-WITHFP-NEXT:    ret
2495;
2496; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_large_scalar_ret:
2497; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2498; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lui a1, 524272
2499; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 0(a0)
2500; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 4(a0)
2501; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw zero, 8(a0)
2502; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a1, 12(a0)
2503; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
2504;
2505; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_large_scalar_ret:
2506; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2507; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2508; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2509; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2510; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2511; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
2512; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2513; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lui a1, 524272
2514; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 0(a0)
2515; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 4(a0)
2516; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw zero, 8(a0)
2517; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a1, 12(a0)
2518; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
2519; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2520  ret fp128 0xL00000000000000007FFF000000000000
2521}
2522
2523define void @caller_large_scalar_ret() {
2524; ILP32E-FPELIM-LABEL: caller_large_scalar_ret:
2525; ILP32E-FPELIM:       # %bb.0:
2526; ILP32E-FPELIM-NEXT:    addi sp, sp, -32
2527; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 32
2528; ILP32E-FPELIM-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2529; ILP32E-FPELIM-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2530; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
2531; ILP32E-FPELIM-NEXT:    .cfi_offset s0, -8
2532; ILP32E-FPELIM-NEXT:    addi s0, sp, 32
2533; ILP32E-FPELIM-NEXT:    .cfi_def_cfa s0, 0
2534; ILP32E-FPELIM-NEXT:    andi sp, sp, -16
2535; ILP32E-FPELIM-NEXT:    mv a0, sp
2536; ILP32E-FPELIM-NEXT:    call callee_large_scalar_ret
2537; ILP32E-FPELIM-NEXT:    addi sp, s0, -32
2538; ILP32E-FPELIM-NEXT:    .cfi_def_cfa sp, 32
2539; ILP32E-FPELIM-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2540; ILP32E-FPELIM-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2541; ILP32E-FPELIM-NEXT:    .cfi_restore ra
2542; ILP32E-FPELIM-NEXT:    .cfi_restore s0
2543; ILP32E-FPELIM-NEXT:    addi sp, sp, 32
2544; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
2545; ILP32E-FPELIM-NEXT:    ret
2546;
2547; ILP32E-WITHFP-LABEL: caller_large_scalar_ret:
2548; ILP32E-WITHFP:       # %bb.0:
2549; ILP32E-WITHFP-NEXT:    addi sp, sp, -32
2550; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 32
2551; ILP32E-WITHFP-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
2552; ILP32E-WITHFP-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
2553; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2554; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2555; ILP32E-WITHFP-NEXT:    addi s0, sp, 32
2556; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2557; ILP32E-WITHFP-NEXT:    andi sp, sp, -16
2558; ILP32E-WITHFP-NEXT:    mv a0, sp
2559; ILP32E-WITHFP-NEXT:    call callee_large_scalar_ret
2560; ILP32E-WITHFP-NEXT:    addi sp, s0, -32
2561; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 32
2562; ILP32E-WITHFP-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
2563; ILP32E-WITHFP-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
2564; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2565; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2566; ILP32E-WITHFP-NEXT:    addi sp, sp, 32
2567; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2568; ILP32E-WITHFP-NEXT:    ret
2569;
2570; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_large_scalar_ret:
2571; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2572; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2573; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2574; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2575; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2576; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, -24
2577; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 32
2578; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi s0, sp, 32
2579; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2580; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    andi sp, sp, -16
2581; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a0, sp
2582; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_large_scalar_ret
2583; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, s0, -32
2584; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 32
2585; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, 24
2586; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2587; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2588;
2589; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_large_scalar_ret:
2590; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2591; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2592; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2593; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2594; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2595; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, -24
2596; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 32
2597; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 32
2598; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2599; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    andi sp, sp, -16
2600; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv a0, sp
2601; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_large_scalar_ret
2602; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, s0, -32
2603; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 32
2604; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, 24
2605; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2606; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2607  %1 = call fp128 @callee_large_scalar_ret()
2608  ret void
2609}
2610
2611; Check return of >2x xlen structs
2612
2613define void @callee_large_struct_ret(ptr noalias sret(%struct.large) %agg.result) {
2614; ILP32E-FPELIM-LABEL: callee_large_struct_ret:
2615; ILP32E-FPELIM:       # %bb.0:
2616; ILP32E-FPELIM-NEXT:    li a1, 1
2617; ILP32E-FPELIM-NEXT:    li a2, 2
2618; ILP32E-FPELIM-NEXT:    li a3, 3
2619; ILP32E-FPELIM-NEXT:    li a4, 4
2620; ILP32E-FPELIM-NEXT:    sw a1, 0(a0)
2621; ILP32E-FPELIM-NEXT:    sw a2, 4(a0)
2622; ILP32E-FPELIM-NEXT:    sw a3, 8(a0)
2623; ILP32E-FPELIM-NEXT:    sw a4, 12(a0)
2624; ILP32E-FPELIM-NEXT:    ret
2625;
2626; ILP32E-WITHFP-LABEL: callee_large_struct_ret:
2627; ILP32E-WITHFP:       # %bb.0:
2628; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
2629; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 8
2630; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
2631; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
2632; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2633; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2634; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
2635; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2636; ILP32E-WITHFP-NEXT:    li a1, 1
2637; ILP32E-WITHFP-NEXT:    li a2, 2
2638; ILP32E-WITHFP-NEXT:    li a3, 3
2639; ILP32E-WITHFP-NEXT:    li a4, 4
2640; ILP32E-WITHFP-NEXT:    sw a1, 0(a0)
2641; ILP32E-WITHFP-NEXT:    sw a2, 4(a0)
2642; ILP32E-WITHFP-NEXT:    sw a3, 8(a0)
2643; ILP32E-WITHFP-NEXT:    sw a4, 12(a0)
2644; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 8
2645; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
2646; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
2647; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2648; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2649; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
2650; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2651; ILP32E-WITHFP-NEXT:    ret
2652;
2653; ILP32E-FPELIM-SAVE-RESTORE-LABEL: callee_large_struct_ret:
2654; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2655; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a1, 1
2656; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a2, 2
2657; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a3, 3
2658; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    li a4, 4
2659; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a1, 0(a0)
2660; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a2, 4(a0)
2661; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a3, 8(a0)
2662; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    sw a4, 12(a0)
2663; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    ret
2664;
2665; ILP32E-WITHFP-SAVE-RESTORE-LABEL: callee_large_struct_ret:
2666; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2667; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2668; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2669; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2670; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2671; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 8
2672; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2673; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a1, 1
2674; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a2, 2
2675; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a3, 3
2676; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    li a4, 4
2677; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a1, 0(a0)
2678; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a2, 4(a0)
2679; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a3, 8(a0)
2680; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    sw a4, 12(a0)
2681; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 8
2682; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2683  %a = getelementptr inbounds %struct.large, ptr %agg.result, i32 0, i32 0
2684  store i32 1, ptr %a, align 4
2685  %b = getelementptr inbounds %struct.large, ptr %agg.result, i32 0, i32 1
2686  store i32 2, ptr %b, align 4
2687  %c = getelementptr inbounds %struct.large, ptr %agg.result, i32 0, i32 2
2688  store i32 3, ptr %c, align 4
2689  %d = getelementptr inbounds %struct.large, ptr %agg.result, i32 0, i32 3
2690  store i32 4, ptr %d, align 4
2691  ret void
2692}
2693
2694define i32 @caller_large_struct_ret() {
2695; ILP32E-FPELIM-LABEL: caller_large_struct_ret:
2696; ILP32E-FPELIM:       # %bb.0:
2697; ILP32E-FPELIM-NEXT:    addi sp, sp, -24
2698; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 24
2699; ILP32E-FPELIM-NEXT:    sw ra, 20(sp) # 4-byte Folded Spill
2700; ILP32E-FPELIM-NEXT:    sw s0, 16(sp) # 4-byte Folded Spill
2701; ILP32E-FPELIM-NEXT:    .cfi_offset ra, -4
2702; ILP32E-FPELIM-NEXT:    .cfi_offset s0, -8
2703; ILP32E-FPELIM-NEXT:    addi s0, sp, 24
2704; ILP32E-FPELIM-NEXT:    .cfi_def_cfa s0, 0
2705; ILP32E-FPELIM-NEXT:    andi sp, sp, -8
2706; ILP32E-FPELIM-NEXT:    mv a0, sp
2707; ILP32E-FPELIM-NEXT:    call callee_large_struct_ret
2708; ILP32E-FPELIM-NEXT:    lw a0, 0(sp)
2709; ILP32E-FPELIM-NEXT:    lw a1, 12(sp)
2710; ILP32E-FPELIM-NEXT:    add a0, a0, a1
2711; ILP32E-FPELIM-NEXT:    addi sp, s0, -24
2712; ILP32E-FPELIM-NEXT:    .cfi_def_cfa sp, 24
2713; ILP32E-FPELIM-NEXT:    lw ra, 20(sp) # 4-byte Folded Reload
2714; ILP32E-FPELIM-NEXT:    lw s0, 16(sp) # 4-byte Folded Reload
2715; ILP32E-FPELIM-NEXT:    .cfi_restore ra
2716; ILP32E-FPELIM-NEXT:    .cfi_restore s0
2717; ILP32E-FPELIM-NEXT:    addi sp, sp, 24
2718; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
2719; ILP32E-FPELIM-NEXT:    ret
2720;
2721; ILP32E-WITHFP-LABEL: caller_large_struct_ret:
2722; ILP32E-WITHFP:       # %bb.0:
2723; ILP32E-WITHFP-NEXT:    addi sp, sp, -24
2724; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 24
2725; ILP32E-WITHFP-NEXT:    sw ra, 20(sp) # 4-byte Folded Spill
2726; ILP32E-WITHFP-NEXT:    sw s0, 16(sp) # 4-byte Folded Spill
2727; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
2728; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
2729; ILP32E-WITHFP-NEXT:    addi s0, sp, 24
2730; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
2731; ILP32E-WITHFP-NEXT:    andi sp, sp, -8
2732; ILP32E-WITHFP-NEXT:    mv a0, sp
2733; ILP32E-WITHFP-NEXT:    call callee_large_struct_ret
2734; ILP32E-WITHFP-NEXT:    lw a0, 0(sp)
2735; ILP32E-WITHFP-NEXT:    lw a1, 12(sp)
2736; ILP32E-WITHFP-NEXT:    add a0, a0, a1
2737; ILP32E-WITHFP-NEXT:    addi sp, s0, -24
2738; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 24
2739; ILP32E-WITHFP-NEXT:    lw ra, 20(sp) # 4-byte Folded Reload
2740; ILP32E-WITHFP-NEXT:    lw s0, 16(sp) # 4-byte Folded Reload
2741; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2742; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2743; ILP32E-WITHFP-NEXT:    addi sp, sp, 24
2744; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2745; ILP32E-WITHFP-NEXT:    ret
2746;
2747; ILP32E-FPELIM-SAVE-RESTORE-LABEL: caller_large_struct_ret:
2748; ILP32E-FPELIM-SAVE-RESTORE:       # %bb.0:
2749; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2750; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2751; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2752; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2753; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, -16
2754; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 24
2755; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi s0, sp, 24
2756; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2757; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    andi sp, sp, -8
2758; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    mv a0, sp
2759; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    call callee_large_struct_ret
2760; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a0, 0(sp)
2761; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    lw a1, 12(sp)
2762; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    add a0, a0, a1
2763; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, s0, -24
2764; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 24
2765; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    addi sp, sp, 16
2766; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2767; ILP32E-FPELIM-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2768;
2769; ILP32E-WITHFP-SAVE-RESTORE-LABEL: caller_large_struct_ret:
2770; ILP32E-WITHFP-SAVE-RESTORE:       # %bb.0:
2771; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call t0, __riscv_save_1
2772; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2773; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset ra, -4
2774; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_offset s0, -8
2775; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, -16
2776; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 24
2777; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi s0, sp, 24
2778; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa s0, 0
2779; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    andi sp, sp, -8
2780; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    mv a0, sp
2781; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    call callee_large_struct_ret
2782; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a0, 0(sp)
2783; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    lw a1, 12(sp)
2784; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    add a0, a0, a1
2785; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, s0, -24
2786; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa sp, 24
2787; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    addi sp, sp, 16
2788; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    .cfi_def_cfa_offset 8
2789; ILP32E-WITHFP-SAVE-RESTORE-NEXT:    tail __riscv_restore_1
2790  %1 = alloca %struct.large
2791  call void @callee_large_struct_ret(ptr sret(%struct.large) %1)
2792  %2 = getelementptr inbounds %struct.large, ptr %1, i32 0, i32 0
2793  %3 = load i32, ptr %2
2794  %4 = getelementptr inbounds %struct.large, ptr %1, i32 0, i32 3
2795  %5 = load i32, ptr %4
2796  %6 = add i32 %3, %5
2797  ret i32 %6
2798}
2799