Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / GlobalISel / irtranslator / calling-conv-ilp32d.ll
blob4d487eb5cda23db596f3a888237a30807bbaca95
1 ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi ilp32d \
3 ; RUN:    -global-isel -stop-after=irtranslator -verify-machineinstrs < %s \
4 ; RUN:   | FileCheck -check-prefix=RV32-ILP32D %s
6 ; This file contains tests that will have differing output for the ilp32/ilp32f
7 ; and ilp32d ABIs.
9 define i32 @callee_double_in_fpr(i32 %a, double %b) nounwind {
10   ; RV32-ILP32D-LABEL: name: callee_double_in_fpr
11   ; RV32-ILP32D: bb.1 (%ir-block.0):
12   ; RV32-ILP32D-NEXT:   liveins: $x10, $f10_d
13   ; RV32-ILP32D-NEXT: {{  $}}
14   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $x10
15   ; RV32-ILP32D-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $f10_d
16   ; RV32-ILP32D-NEXT:   [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY1]](s64)
17   ; RV32-ILP32D-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[FPTOSI]]
18   ; RV32-ILP32D-NEXT:   $x10 = COPY [[ADD]](s32)
19   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
20   %b_fptosi = fptosi double %b to i32
21   %1 = add i32 %a, %b_fptosi
22   ret i32 %1
25 define i32 @caller_double_in_fpr() nounwind {
26   ; RV32-ILP32D-LABEL: name: caller_double_in_fpr
27   ; RV32-ILP32D: bb.1 (%ir-block.0):
28   ; RV32-ILP32D-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
29   ; RV32-ILP32D-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
30   ; RV32-ILP32D-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
31   ; RV32-ILP32D-NEXT:   $x10 = COPY [[C]](s32)
32   ; RV32-ILP32D-NEXT:   $f10_d = COPY [[C1]](s64)
33   ; RV32-ILP32D-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_in_fpr, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $f10_d, implicit-def $x10
34   ; RV32-ILP32D-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
35   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $x10
36   ; RV32-ILP32D-NEXT:   $x10 = COPY [[COPY]](s32)
37   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
38   %1 = call i32 @callee_double_in_fpr(i32 1, double 2.0)
39   ret i32 %1
42 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
43 define i32 @callee_double_in_fpr_exhausted_gprs(i64 %a, i64 %b, i64 %c, i64 %d, i32 %e, double %f) nounwind {
44   ; RV32-ILP32D-LABEL: name: callee_double_in_fpr_exhausted_gprs
45   ; RV32-ILP32D: bb.1 (%ir-block.0):
46   ; RV32-ILP32D-NEXT:   liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $f10_d
47   ; RV32-ILP32D-NEXT: {{  $}}
48   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $x10
49   ; RV32-ILP32D-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
50   ; RV32-ILP32D-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
51   ; RV32-ILP32D-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $x12
52   ; RV32-ILP32D-NEXT:   [[COPY3:%[0-9]+]]:_(s32) = COPY $x13
53   ; RV32-ILP32D-NEXT:   [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
54   ; RV32-ILP32D-NEXT:   [[COPY4:%[0-9]+]]:_(s32) = COPY $x14
55   ; RV32-ILP32D-NEXT:   [[COPY5:%[0-9]+]]:_(s32) = COPY $x15
56   ; RV32-ILP32D-NEXT:   [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY4]](s32), [[COPY5]](s32)
57   ; RV32-ILP32D-NEXT:   [[COPY6:%[0-9]+]]:_(s32) = COPY $x16
58   ; RV32-ILP32D-NEXT:   [[COPY7:%[0-9]+]]:_(s32) = COPY $x17
59   ; RV32-ILP32D-NEXT:   [[MV3:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY6]](s32), [[COPY7]](s32)
60   ; RV32-ILP32D-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
61   ; RV32-ILP32D-NEXT:   [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s32) from %fixed-stack.0, align 16)
62   ; RV32-ILP32D-NEXT:   [[COPY8:%[0-9]+]]:_(s64) = COPY $f10_d
63   ; RV32-ILP32D-NEXT:   [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY8]](s64)
64   ; RV32-ILP32D-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[LOAD]], [[FPTOSI]]
65   ; RV32-ILP32D-NEXT:   $x10 = COPY [[ADD]](s32)
66   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
67   %f_fptosi = fptosi double %f to i32
68   %1 = add i32 %e, %f_fptosi
69   ret i32 %1
72 define i32 @caller_double_in_fpr_exhausted_gprs() nounwind {
73   ; RV32-ILP32D-LABEL: name: caller_double_in_fpr_exhausted_gprs
74   ; RV32-ILP32D: bb.1 (%ir-block.0):
75   ; RV32-ILP32D-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
76   ; RV32-ILP32D-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2
77   ; RV32-ILP32D-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3
78   ; RV32-ILP32D-NEXT:   [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
79   ; RV32-ILP32D-NEXT:   [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 5
80   ; RV32-ILP32D-NEXT:   [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
81   ; RV32-ILP32D-NEXT:   ADJCALLSTACKDOWN 4, 0, implicit-def $x2, implicit $x2
82   ; RV32-ILP32D-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C]](s64)
83   ; RV32-ILP32D-NEXT:   [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C1]](s64)
84   ; RV32-ILP32D-NEXT:   [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C2]](s64)
85   ; RV32-ILP32D-NEXT:   [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C3]](s64)
86   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x2
87   ; RV32-ILP32D-NEXT:   [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
88   ; RV32-ILP32D-NEXT:   [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C6]](s32)
89   ; RV32-ILP32D-NEXT:   G_STORE [[C4]](s32), [[PTR_ADD]](p0) :: (store (s32) into stack, align 16)
90   ; RV32-ILP32D-NEXT:   $x10 = COPY [[UV]](s32)
91   ; RV32-ILP32D-NEXT:   $x11 = COPY [[UV1]](s32)
92   ; RV32-ILP32D-NEXT:   $x12 = COPY [[UV2]](s32)
93   ; RV32-ILP32D-NEXT:   $x13 = COPY [[UV3]](s32)
94   ; RV32-ILP32D-NEXT:   $x14 = COPY [[UV4]](s32)
95   ; RV32-ILP32D-NEXT:   $x15 = COPY [[UV5]](s32)
96   ; RV32-ILP32D-NEXT:   $x16 = COPY [[UV6]](s32)
97   ; RV32-ILP32D-NEXT:   $x17 = COPY [[UV7]](s32)
98   ; RV32-ILP32D-NEXT:   $f10_d = COPY [[C5]](s64)
99   ; RV32-ILP32D-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_in_fpr_exhausted_gprs, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit $f10_d, implicit-def $x10
100   ; RV32-ILP32D-NEXT:   ADJCALLSTACKUP 4, 0, implicit-def $x2, implicit $x2
101   ; RV32-ILP32D-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
102   ; RV32-ILP32D-NEXT:   $x10 = COPY [[COPY1]](s32)
103   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
104   %1 = call i32 @callee_double_in_fpr_exhausted_gprs(
105       i64 1, i64 2, i64 3, i64 4, i32 5, double 6.0)
106   ret i32 %1
109 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
110 define i32 @callee_double_in_gpr_exhausted_fprs(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i) nounwind {
111   ; RV32-ILP32D-LABEL: name: callee_double_in_gpr_exhausted_fprs
112   ; RV32-ILP32D: bb.1 (%ir-block.0):
113   ; RV32-ILP32D-NEXT:   liveins: $x10, $x11, $f10_d, $f11_d, $f12_d, $f13_d, $f14_d, $f15_d, $f16_d, $f17_d
114   ; RV32-ILP32D-NEXT: {{  $}}
115   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
116   ; RV32-ILP32D-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $f11_d
117   ; RV32-ILP32D-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $f12_d
118   ; RV32-ILP32D-NEXT:   [[COPY3:%[0-9]+]]:_(s64) = COPY $f13_d
119   ; RV32-ILP32D-NEXT:   [[COPY4:%[0-9]+]]:_(s64) = COPY $f14_d
120   ; RV32-ILP32D-NEXT:   [[COPY5:%[0-9]+]]:_(s64) = COPY $f15_d
121   ; RV32-ILP32D-NEXT:   [[COPY6:%[0-9]+]]:_(s64) = COPY $f16_d
122   ; RV32-ILP32D-NEXT:   [[COPY7:%[0-9]+]]:_(s64) = COPY $f17_d
123   ; RV32-ILP32D-NEXT:   [[COPY8:%[0-9]+]]:_(s32) = COPY $x10
124   ; RV32-ILP32D-NEXT:   [[COPY9:%[0-9]+]]:_(s32) = COPY $x11
125   ; RV32-ILP32D-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY8]](s32), [[COPY9]](s32)
126   ; RV32-ILP32D-NEXT:   [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY7]](s64)
127   ; RV32-ILP32D-NEXT:   [[FPTOSI1:%[0-9]+]]:_(s32) = G_FPTOSI [[MV]](s64)
128   ; RV32-ILP32D-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[FPTOSI]], [[FPTOSI1]]
129   ; RV32-ILP32D-NEXT:   $x10 = COPY [[ADD]](s32)
130   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
131   %h_fptosi = fptosi double %h to i32
132   %i_fptosi = fptosi double %i to i32
133   %1 = add i32 %h_fptosi, %i_fptosi
134   ret i32 %1
137 define i32 @caller_double_in_gpr_exhausted_fprs() nounwind {
138   ; RV32-ILP32D-LABEL: name: caller_double_in_gpr_exhausted_fprs
139   ; RV32-ILP32D: bb.1 (%ir-block.0):
140   ; RV32-ILP32D-NEXT:   [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+00
141   ; RV32-ILP32D-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
142   ; RV32-ILP32D-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_FCONSTANT double 3.000000e+00
143   ; RV32-ILP32D-NEXT:   [[C3:%[0-9]+]]:_(s64) = G_FCONSTANT double 4.000000e+00
144   ; RV32-ILP32D-NEXT:   [[C4:%[0-9]+]]:_(s64) = G_FCONSTANT double 5.000000e+00
145   ; RV32-ILP32D-NEXT:   [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
146   ; RV32-ILP32D-NEXT:   [[C6:%[0-9]+]]:_(s64) = G_FCONSTANT double 7.000000e+00
147   ; RV32-ILP32D-NEXT:   [[C7:%[0-9]+]]:_(s64) = G_FCONSTANT double 8.000000e+00
148   ; RV32-ILP32D-NEXT:   [[C8:%[0-9]+]]:_(s64) = G_FCONSTANT double 9.000000e+00
149   ; RV32-ILP32D-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
150   ; RV32-ILP32D-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C8]](s64)
151   ; RV32-ILP32D-NEXT:   $f10_d = COPY [[C]](s64)
152   ; RV32-ILP32D-NEXT:   $f11_d = COPY [[C1]](s64)
153   ; RV32-ILP32D-NEXT:   $f12_d = COPY [[C2]](s64)
154   ; RV32-ILP32D-NEXT:   $f13_d = COPY [[C3]](s64)
155   ; RV32-ILP32D-NEXT:   $f14_d = COPY [[C4]](s64)
156   ; RV32-ILP32D-NEXT:   $f15_d = COPY [[C5]](s64)
157   ; RV32-ILP32D-NEXT:   $f16_d = COPY [[C6]](s64)
158   ; RV32-ILP32D-NEXT:   $f17_d = COPY [[C7]](s64)
159   ; RV32-ILP32D-NEXT:   $x10 = COPY [[UV]](s32)
160   ; RV32-ILP32D-NEXT:   $x11 = COPY [[UV1]](s32)
161   ; RV32-ILP32D-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_in_gpr_exhausted_fprs, csr_ilp32d_lp64d, implicit-def $x1, implicit $f10_d, implicit $f11_d, implicit $f12_d, implicit $f13_d, implicit $f14_d, implicit $f15_d, implicit $f16_d, implicit $f17_d, implicit $x10, implicit $x11, implicit-def $x10
162   ; RV32-ILP32D-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
163   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $x10
164   ; RV32-ILP32D-NEXT:   $x10 = COPY [[COPY]](s32)
165   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
166   %1 = call i32 @callee_double_in_gpr_exhausted_fprs(
167       double 1.0, double 2.0, double 3.0, double 4.0, double 5.0, double 6.0,
168       double 7.0, double 8.0, double 9.0)
169   ret i32 %1
172 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
173 define i32 @callee_double_in_gpr_and_stack_almost_exhausted_gprs_fprs(i64 %a, double %b, i64 %c, double %d, i64 %e, double %f, i32 %g, double %h, double %i, double %j, double %k, double %l, double %m) nounwind {
174   ; RV32-ILP32D-LABEL: name: callee_double_in_gpr_and_stack_almost_exhausted_gprs_fprs
175   ; RV32-ILP32D: bb.1 (%ir-block.0):
176   ; RV32-ILP32D-NEXT:   liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $f10_d, $f11_d, $f12_d, $f13_d, $f14_d, $f15_d, $f16_d, $f17_d
177   ; RV32-ILP32D-NEXT: {{  $}}
178   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $x10
179   ; RV32-ILP32D-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
180   ; RV32-ILP32D-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
181   ; RV32-ILP32D-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $f10_d
182   ; RV32-ILP32D-NEXT:   [[COPY3:%[0-9]+]]:_(s32) = COPY $x12
183   ; RV32-ILP32D-NEXT:   [[COPY4:%[0-9]+]]:_(s32) = COPY $x13
184   ; RV32-ILP32D-NEXT:   [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY3]](s32), [[COPY4]](s32)
185   ; RV32-ILP32D-NEXT:   [[COPY5:%[0-9]+]]:_(s64) = COPY $f11_d
186   ; RV32-ILP32D-NEXT:   [[COPY6:%[0-9]+]]:_(s32) = COPY $x14
187   ; RV32-ILP32D-NEXT:   [[COPY7:%[0-9]+]]:_(s32) = COPY $x15
188   ; RV32-ILP32D-NEXT:   [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY6]](s32), [[COPY7]](s32)
189   ; RV32-ILP32D-NEXT:   [[COPY8:%[0-9]+]]:_(s64) = COPY $f12_d
190   ; RV32-ILP32D-NEXT:   [[COPY9:%[0-9]+]]:_(s32) = COPY $x16
191   ; RV32-ILP32D-NEXT:   [[COPY10:%[0-9]+]]:_(s64) = COPY $f13_d
192   ; RV32-ILP32D-NEXT:   [[COPY11:%[0-9]+]]:_(s64) = COPY $f14_d
193   ; RV32-ILP32D-NEXT:   [[COPY12:%[0-9]+]]:_(s64) = COPY $f15_d
194   ; RV32-ILP32D-NEXT:   [[COPY13:%[0-9]+]]:_(s64) = COPY $f16_d
195   ; RV32-ILP32D-NEXT:   [[COPY14:%[0-9]+]]:_(s64) = COPY $f17_d
196   ; RV32-ILP32D-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
197   ; RV32-ILP32D-NEXT:   [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s32) from %fixed-stack.0, align 16)
198   ; RV32-ILP32D-NEXT:   [[COPY15:%[0-9]+]]:_(s32) = COPY $x17
199   ; RV32-ILP32D-NEXT:   [[MV3:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY15]](s32), [[LOAD]](s32)
200   ; RV32-ILP32D-NEXT:   [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[MV3]](s64)
201   ; RV32-ILP32D-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY9]], [[FPTOSI]]
202   ; RV32-ILP32D-NEXT:   $x10 = COPY [[ADD]](s32)
203   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
204   %m_fptosi = fptosi double %m to i32
205   %1 = add i32 %g, %m_fptosi
206   ret i32 %1
209 define i32 @caller_double_in_gpr_and_stack_almost_exhausted_gprs_fprs() nounwind {
210   ; RV32-ILP32D-LABEL: name: caller_double_in_gpr_and_stack_almost_exhausted_gprs_fprs
211   ; RV32-ILP32D: bb.1 (%ir-block.0):
212   ; RV32-ILP32D-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
213   ; RV32-ILP32D-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
214   ; RV32-ILP32D-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3
215   ; RV32-ILP32D-NEXT:   [[C3:%[0-9]+]]:_(s64) = G_FCONSTANT double 4.000000e+00
216   ; RV32-ILP32D-NEXT:   [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5
217   ; RV32-ILP32D-NEXT:   [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
218   ; RV32-ILP32D-NEXT:   [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 7
219   ; RV32-ILP32D-NEXT:   [[C7:%[0-9]+]]:_(s64) = G_FCONSTANT double 8.000000e+00
220   ; RV32-ILP32D-NEXT:   [[C8:%[0-9]+]]:_(s64) = G_FCONSTANT double 9.000000e+00
221   ; RV32-ILP32D-NEXT:   [[C9:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+01
222   ; RV32-ILP32D-NEXT:   [[C10:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.100000e+01
223   ; RV32-ILP32D-NEXT:   [[C11:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.200000e+01
224   ; RV32-ILP32D-NEXT:   [[C12:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.300000e+01
225   ; RV32-ILP32D-NEXT:   ADJCALLSTACKDOWN 4, 0, implicit-def $x2, implicit $x2
226   ; RV32-ILP32D-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C]](s64)
227   ; RV32-ILP32D-NEXT:   [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C2]](s64)
228   ; RV32-ILP32D-NEXT:   [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C4]](s64)
229   ; RV32-ILP32D-NEXT:   [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C12]](s64)
230   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x2
231   ; RV32-ILP32D-NEXT:   [[C13:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
232   ; RV32-ILP32D-NEXT:   [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C13]](s32)
233   ; RV32-ILP32D-NEXT:   G_STORE [[UV7]](s32), [[PTR_ADD]](p0) :: (store (s32) into stack, align 16)
234   ; RV32-ILP32D-NEXT:   $x10 = COPY [[UV]](s32)
235   ; RV32-ILP32D-NEXT:   $x11 = COPY [[UV1]](s32)
236   ; RV32-ILP32D-NEXT:   $f10_d = COPY [[C1]](s64)
237   ; RV32-ILP32D-NEXT:   $x12 = COPY [[UV2]](s32)
238   ; RV32-ILP32D-NEXT:   $x13 = COPY [[UV3]](s32)
239   ; RV32-ILP32D-NEXT:   $f11_d = COPY [[C3]](s64)
240   ; RV32-ILP32D-NEXT:   $x14 = COPY [[UV4]](s32)
241   ; RV32-ILP32D-NEXT:   $x15 = COPY [[UV5]](s32)
242   ; RV32-ILP32D-NEXT:   $f12_d = COPY [[C5]](s64)
243   ; RV32-ILP32D-NEXT:   $x16 = COPY [[C6]](s32)
244   ; RV32-ILP32D-NEXT:   $f13_d = COPY [[C7]](s64)
245   ; RV32-ILP32D-NEXT:   $f14_d = COPY [[C8]](s64)
246   ; RV32-ILP32D-NEXT:   $f15_d = COPY [[C9]](s64)
247   ; RV32-ILP32D-NEXT:   $f16_d = COPY [[C10]](s64)
248   ; RV32-ILP32D-NEXT:   $f17_d = COPY [[C11]](s64)
249   ; RV32-ILP32D-NEXT:   $x17 = COPY [[UV6]](s32)
250   ; RV32-ILP32D-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_in_gpr_and_stack_almost_exhausted_gprs_fprs, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $f10_d, implicit $x12, implicit $x13, implicit $f11_d, implicit $x14, implicit $x15, implicit $f12_d, implicit $x16, implicit $f13_d, implicit $f14_d, implicit $f15_d, implicit $f16_d, implicit $f17_d, implicit $x17, implicit-def $x10
251   ; RV32-ILP32D-NEXT:   ADJCALLSTACKUP 4, 0, implicit-def $x2, implicit $x2
252   ; RV32-ILP32D-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
253   ; RV32-ILP32D-NEXT:   $x10 = COPY [[COPY1]](s32)
254   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
255   %1 = call i32 @callee_double_in_gpr_and_stack_almost_exhausted_gprs_fprs(
256       i64 1, double 2.0, i64 3, double 4.0, i64 5, double 6.0, i32 7, double 8.0,
257       double 9.0, double 10.0, double 11.0, double 12.0, double 13.0)
258   ret i32 %1
262 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
263 define i32 @callee_double_on_stack_exhausted_gprs_fprs(i64 %a, double %b, i64 %c, double %d, i64 %e, double %f, i64 %g, double %h, double %i, double %j, double %k, double %l, double %m) nounwind {
264   ; RV32-ILP32D-LABEL: name: callee_double_on_stack_exhausted_gprs_fprs
265   ; RV32-ILP32D: bb.1 (%ir-block.0):
266   ; RV32-ILP32D-NEXT:   liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $f10_d, $f11_d, $f12_d, $f13_d, $f14_d, $f15_d, $f16_d, $f17_d
267   ; RV32-ILP32D-NEXT: {{  $}}
268   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $x10
269   ; RV32-ILP32D-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $x11
270   ; RV32-ILP32D-NEXT:   [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
271   ; RV32-ILP32D-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $f10_d
272   ; RV32-ILP32D-NEXT:   [[COPY3:%[0-9]+]]:_(s32) = COPY $x12
273   ; RV32-ILP32D-NEXT:   [[COPY4:%[0-9]+]]:_(s32) = COPY $x13
274   ; RV32-ILP32D-NEXT:   [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY3]](s32), [[COPY4]](s32)
275   ; RV32-ILP32D-NEXT:   [[COPY5:%[0-9]+]]:_(s64) = COPY $f11_d
276   ; RV32-ILP32D-NEXT:   [[COPY6:%[0-9]+]]:_(s32) = COPY $x14
277   ; RV32-ILP32D-NEXT:   [[COPY7:%[0-9]+]]:_(s32) = COPY $x15
278   ; RV32-ILP32D-NEXT:   [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY6]](s32), [[COPY7]](s32)
279   ; RV32-ILP32D-NEXT:   [[COPY8:%[0-9]+]]:_(s64) = COPY $f12_d
280   ; RV32-ILP32D-NEXT:   [[COPY9:%[0-9]+]]:_(s32) = COPY $x16
281   ; RV32-ILP32D-NEXT:   [[COPY10:%[0-9]+]]:_(s32) = COPY $x17
282   ; RV32-ILP32D-NEXT:   [[MV3:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY9]](s32), [[COPY10]](s32)
283   ; RV32-ILP32D-NEXT:   [[COPY11:%[0-9]+]]:_(s64) = COPY $f13_d
284   ; RV32-ILP32D-NEXT:   [[COPY12:%[0-9]+]]:_(s64) = COPY $f14_d
285   ; RV32-ILP32D-NEXT:   [[COPY13:%[0-9]+]]:_(s64) = COPY $f15_d
286   ; RV32-ILP32D-NEXT:   [[COPY14:%[0-9]+]]:_(s64) = COPY $f16_d
287   ; RV32-ILP32D-NEXT:   [[COPY15:%[0-9]+]]:_(s64) = COPY $f17_d
288   ; RV32-ILP32D-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
289   ; RV32-ILP32D-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.0, align 16)
290   ; RV32-ILP32D-NEXT:   [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[MV3]](s64)
291   ; RV32-ILP32D-NEXT:   [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[LOAD]](s64)
292   ; RV32-ILP32D-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[TRUNC]], [[FPTOSI]]
293   ; RV32-ILP32D-NEXT:   $x10 = COPY [[ADD]](s32)
294   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
295   %g_trunc = trunc i64 %g to i32
296   %m_fptosi = fptosi double %m to i32
297   %1 = add i32 %g_trunc, %m_fptosi
298   ret i32 %1
301 define i32 @caller_double_on_stack_exhausted_gprs_fprs() nounwind {
302   ; RV32-ILP32D-LABEL: name: caller_double_on_stack_exhausted_gprs_fprs
303   ; RV32-ILP32D: bb.1 (%ir-block.0):
304   ; RV32-ILP32D-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
305   ; RV32-ILP32D-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
306   ; RV32-ILP32D-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3
307   ; RV32-ILP32D-NEXT:   [[C3:%[0-9]+]]:_(s64) = G_FCONSTANT double 4.000000e+00
308   ; RV32-ILP32D-NEXT:   [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5
309   ; RV32-ILP32D-NEXT:   [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
310   ; RV32-ILP32D-NEXT:   [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 7
311   ; RV32-ILP32D-NEXT:   [[C7:%[0-9]+]]:_(s64) = G_FCONSTANT double 8.000000e+00
312   ; RV32-ILP32D-NEXT:   [[C8:%[0-9]+]]:_(s64) = G_FCONSTANT double 9.000000e+00
313   ; RV32-ILP32D-NEXT:   [[C9:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+01
314   ; RV32-ILP32D-NEXT:   [[C10:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.100000e+01
315   ; RV32-ILP32D-NEXT:   [[C11:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.200000e+01
316   ; RV32-ILP32D-NEXT:   [[C12:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.300000e+01
317   ; RV32-ILP32D-NEXT:   ADJCALLSTACKDOWN 8, 0, implicit-def $x2, implicit $x2
318   ; RV32-ILP32D-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C]](s64)
319   ; RV32-ILP32D-NEXT:   [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C2]](s64)
320   ; RV32-ILP32D-NEXT:   [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C4]](s64)
321   ; RV32-ILP32D-NEXT:   [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C6]](s64)
322   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x2
323   ; RV32-ILP32D-NEXT:   [[C13:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
324   ; RV32-ILP32D-NEXT:   [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C13]](s32)
325   ; RV32-ILP32D-NEXT:   G_STORE [[C12]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)
326   ; RV32-ILP32D-NEXT:   $x10 = COPY [[UV]](s32)
327   ; RV32-ILP32D-NEXT:   $x11 = COPY [[UV1]](s32)
328   ; RV32-ILP32D-NEXT:   $f10_d = COPY [[C1]](s64)
329   ; RV32-ILP32D-NEXT:   $x12 = COPY [[UV2]](s32)
330   ; RV32-ILP32D-NEXT:   $x13 = COPY [[UV3]](s32)
331   ; RV32-ILP32D-NEXT:   $f11_d = COPY [[C3]](s64)
332   ; RV32-ILP32D-NEXT:   $x14 = COPY [[UV4]](s32)
333   ; RV32-ILP32D-NEXT:   $x15 = COPY [[UV5]](s32)
334   ; RV32-ILP32D-NEXT:   $f12_d = COPY [[C5]](s64)
335   ; RV32-ILP32D-NEXT:   $x16 = COPY [[UV6]](s32)
336   ; RV32-ILP32D-NEXT:   $x17 = COPY [[UV7]](s32)
337   ; RV32-ILP32D-NEXT:   $f13_d = COPY [[C7]](s64)
338   ; RV32-ILP32D-NEXT:   $f14_d = COPY [[C8]](s64)
339   ; RV32-ILP32D-NEXT:   $f15_d = COPY [[C9]](s64)
340   ; RV32-ILP32D-NEXT:   $f16_d = COPY [[C10]](s64)
341   ; RV32-ILP32D-NEXT:   $f17_d = COPY [[C11]](s64)
342   ; RV32-ILP32D-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_on_stack_exhausted_gprs_fprs, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $f10_d, implicit $x12, implicit $x13, implicit $f11_d, implicit $x14, implicit $x15, implicit $f12_d, implicit $x16, implicit $x17, implicit $f13_d, implicit $f14_d, implicit $f15_d, implicit $f16_d, implicit $f17_d, implicit-def $x10
343   ; RV32-ILP32D-NEXT:   ADJCALLSTACKUP 8, 0, implicit-def $x2, implicit $x2
344   ; RV32-ILP32D-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
345   ; RV32-ILP32D-NEXT:   $x10 = COPY [[COPY1]](s32)
346   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
347   %1 = call i32 @callee_double_on_stack_exhausted_gprs_fprs(
348       i64 1, double 2.0, i64 3, double 4.0, i64 5, double 6.0, i64 7, double 8.0,
349       double 9.0, double 10.0, double 11.0, double 12.0, double 13.0)
350   ret i32 %1
353 define double @callee_double_ret() nounwind {
354   ; RV32-ILP32D-LABEL: name: callee_double_ret
355   ; RV32-ILP32D: bb.1 (%ir-block.0):
356   ; RV32-ILP32D-NEXT:   [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+00
357   ; RV32-ILP32D-NEXT:   $f10_d = COPY [[C]](s64)
358   ; RV32-ILP32D-NEXT:   PseudoRET implicit $f10_d
359   ret double 1.0
362 define i32 @caller_double_ret() nounwind {
363   ; RV32-ILP32D-LABEL: name: caller_double_ret
364   ; RV32-ILP32D: bb.1 (%ir-block.0):
365   ; RV32-ILP32D-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
366   ; RV32-ILP32D-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_ret, csr_ilp32d_lp64d, implicit-def $x1, implicit-def $f10_d
367   ; RV32-ILP32D-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
368   ; RV32-ILP32D-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
369   ; RV32-ILP32D-NEXT:   [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
370   ; RV32-ILP32D-NEXT:   $x10 = COPY [[TRUNC]](s32)
371   ; RV32-ILP32D-NEXT:   PseudoRET implicit $x10
372   %1 = call double @callee_double_ret()
373   %2 = bitcast double %1 to i64
374   %3 = trunc i64 %2 to i32
375   ret i32 %3