Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / GlobalISel / irtranslator / calling-conv-lp64d.ll
blob90ab171dd55a95dd852819b9fa4d11526e51a7f9
1 ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi lp64d \
3 ; RUN:    -global-isel -stop-after=irtranslator -verify-machineinstrs < %s \
4 ; RUN:   | FileCheck -check-prefix=RV64I %s
6 ; This file contains tests that should have identical output for the lp64 and
7 ; lp64f ABIs.
9 define i64 @callee_double_in_regs(i64 %a, double %b) nounwind {
10   ; RV64I-LABEL: name: callee_double_in_regs
11   ; RV64I: bb.1 (%ir-block.0):
12   ; RV64I-NEXT:   liveins: $x10, $f10_d
13   ; RV64I-NEXT: {{  $}}
14   ; RV64I-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $x10
15   ; RV64I-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $f10_d
16   ; RV64I-NEXT:   [[FPTOSI:%[0-9]+]]:_(s64) = G_FPTOSI [[COPY1]](s64)
17   ; RV64I-NEXT:   [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[FPTOSI]]
18   ; RV64I-NEXT:   $x10 = COPY [[ADD]](s64)
19   ; RV64I-NEXT:   PseudoRET implicit $x10
20   %b_fptosi = fptosi double %b to i64
21   %1 = add i64 %a, %b_fptosi
22   ret i64 %1
25 define i64 @caller_double_in_regs() nounwind {
26   ; RV64I-LABEL: name: caller_double_in_regs
27   ; RV64I: bb.1 (%ir-block.0):
28   ; RV64I-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
29   ; RV64I-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
30   ; RV64I-NEXT:   $x10 = COPY [[C]](s64)
31   ; RV64I-NEXT:   $f10_d = COPY [[C1]](s64)
32   ; RV64I-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_in_regs, implicit-def $x1, implicit $x10, implicit $f10_d, implicit-def $x10
33   ; RV64I-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $x10
34   ; RV64I-NEXT:   $x10 = COPY [[COPY]](s64)
35   ; RV64I-NEXT:   PseudoRET implicit $x10
36   %1 = call i64 @callee_double_in_regs(i64 1, double 2.0)
37   ret i64 %1
40 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
41 define i64 @callee_double_in_fpr_exhausted_gprs(i128 %a, i128 %b, i128 %c, i128 %d, i64 %e, double %f) nounwind {
42   ; RV64I-LABEL: name: callee_double_in_fpr_exhausted_gprs
43   ; RV64I: bb.1 (%ir-block.0):
44   ; RV64I-NEXT:   liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $f10_d
45   ; RV64I-NEXT: {{  $}}
46   ; RV64I-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $x10
47   ; RV64I-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
48   ; RV64I-NEXT:   [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)
49   ; RV64I-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $x12
50   ; RV64I-NEXT:   [[COPY3:%[0-9]+]]:_(s64) = COPY $x13
51   ; RV64I-NEXT:   [[MV1:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY2]](s64), [[COPY3]](s64)
52   ; RV64I-NEXT:   [[COPY4:%[0-9]+]]:_(s64) = COPY $x14
53   ; RV64I-NEXT:   [[COPY5:%[0-9]+]]:_(s64) = COPY $x15
54   ; RV64I-NEXT:   [[MV2:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY4]](s64), [[COPY5]](s64)
55   ; RV64I-NEXT:   [[COPY6:%[0-9]+]]:_(s64) = COPY $x16
56   ; RV64I-NEXT:   [[COPY7:%[0-9]+]]:_(s64) = COPY $x17
57   ; RV64I-NEXT:   [[MV3:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY6]](s64), [[COPY7]](s64)
58   ; RV64I-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
59   ; RV64I-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.0, align 16)
60   ; RV64I-NEXT:   [[COPY8:%[0-9]+]]:_(s64) = COPY $f10_d
61   ; RV64I-NEXT:   [[FPTOSI:%[0-9]+]]:_(s64) = G_FPTOSI [[COPY8]](s64)
62   ; RV64I-NEXT:   [[ADD:%[0-9]+]]:_(s64) = G_ADD [[LOAD]], [[FPTOSI]]
63   ; RV64I-NEXT:   $x10 = COPY [[ADD]](s64)
64   ; RV64I-NEXT:   PseudoRET implicit $x10
65   %f_fptosi = fptosi double %f to i64
66   %1 = add i64 %e, %f_fptosi
67   ret i64 %1
70 define i64 @caller_double_in_fpr_exhausted_gprs() nounwind {
71   ; RV64I-LABEL: name: caller_double_in_fpr_exhausted_gprs
72   ; RV64I: bb.1 (%ir-block.0):
73   ; RV64I-NEXT:   [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 1
74   ; RV64I-NEXT:   [[C1:%[0-9]+]]:_(s128) = G_CONSTANT i128 2
75   ; RV64I-NEXT:   [[C2:%[0-9]+]]:_(s128) = G_CONSTANT i128 3
76   ; RV64I-NEXT:   [[C3:%[0-9]+]]:_(s128) = G_CONSTANT i128 4
77   ; RV64I-NEXT:   [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5
78   ; RV64I-NEXT:   [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
79   ; RV64I-NEXT:   [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C]](s128)
80   ; RV64I-NEXT:   [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C1]](s128)
81   ; RV64I-NEXT:   [[UV4:%[0-9]+]]:_(s64), [[UV5:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C2]](s128)
82   ; RV64I-NEXT:   [[UV6:%[0-9]+]]:_(s64), [[UV7:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C3]](s128)
83   ; RV64I-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x2
84   ; RV64I-NEXT:   [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
85   ; RV64I-NEXT:   [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C6]](s64)
86   ; RV64I-NEXT:   G_STORE [[C4]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)
87   ; RV64I-NEXT:   $x10 = COPY [[UV]](s64)
88   ; RV64I-NEXT:   $x11 = COPY [[UV1]](s64)
89   ; RV64I-NEXT:   $x12 = COPY [[UV2]](s64)
90   ; RV64I-NEXT:   $x13 = COPY [[UV3]](s64)
91   ; RV64I-NEXT:   $x14 = COPY [[UV4]](s64)
92   ; RV64I-NEXT:   $x15 = COPY [[UV5]](s64)
93   ; RV64I-NEXT:   $x16 = COPY [[UV6]](s64)
94   ; RV64I-NEXT:   $x17 = COPY [[UV7]](s64)
95   ; RV64I-NEXT:   $f10_d = COPY [[C5]](s64)
96   ; RV64I-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_in_fpr_exhausted_gprs, 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
97   ; RV64I-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $x10
98   ; RV64I-NEXT:   $x10 = COPY [[COPY1]](s64)
99   ; RV64I-NEXT:   PseudoRET implicit $x10
100   %1 = call i64 @callee_double_in_fpr_exhausted_gprs(
101       i128 1, i128 2, i128 3, i128 4, i64 5, double 6.0)
102   ret i64 %1
105 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
106 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 {
107   ; RV64I-LABEL: name: callee_double_in_gpr_exhausted_fprs
108   ; RV64I: bb.1 (%ir-block.0):
109   ; RV64I-NEXT:   liveins: $x10, $f10_d, $f11_d, $f12_d, $f13_d, $f14_d, $f15_d, $f16_d, $f17_d
110   ; RV64I-NEXT: {{  $}}
111   ; RV64I-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
112   ; RV64I-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $f11_d
113   ; RV64I-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $f12_d
114   ; RV64I-NEXT:   [[COPY3:%[0-9]+]]:_(s64) = COPY $f13_d
115   ; RV64I-NEXT:   [[COPY4:%[0-9]+]]:_(s64) = COPY $f14_d
116   ; RV64I-NEXT:   [[COPY5:%[0-9]+]]:_(s64) = COPY $f15_d
117   ; RV64I-NEXT:   [[COPY6:%[0-9]+]]:_(s64) = COPY $f16_d
118   ; RV64I-NEXT:   [[COPY7:%[0-9]+]]:_(s64) = COPY $f17_d
119   ; RV64I-NEXT:   [[COPY8:%[0-9]+]]:_(s64) = COPY $x10
120   ; RV64I-NEXT:   [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY7]](s64)
121   ; RV64I-NEXT:   [[FPTOSI1:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY8]](s64)
122   ; RV64I-NEXT:   [[ADD:%[0-9]+]]:_(s32) = G_ADD [[FPTOSI]], [[FPTOSI1]]
123   ; RV64I-NEXT:   [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ADD]](s32)
124   ; RV64I-NEXT:   $x10 = COPY [[ANYEXT]](s64)
125   ; RV64I-NEXT:   PseudoRET implicit $x10
126   %h_fptosi = fptosi double %h to i32
127   %i_fptosi = fptosi double %i to i32
128   %1 = add i32 %h_fptosi, %i_fptosi
129   ret i32 %1
132 define i32 @caller_double_in_gpr_exhausted_fprs() nounwind {
133   ; RV64I-LABEL: name: caller_double_in_gpr_exhausted_fprs
134   ; RV64I: bb.1 (%ir-block.0):
135   ; RV64I-NEXT:   [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+00
136   ; RV64I-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
137   ; RV64I-NEXT:   [[C2:%[0-9]+]]:_(s64) = G_FCONSTANT double 3.000000e+00
138   ; RV64I-NEXT:   [[C3:%[0-9]+]]:_(s64) = G_FCONSTANT double 4.000000e+00
139   ; RV64I-NEXT:   [[C4:%[0-9]+]]:_(s64) = G_FCONSTANT double 5.000000e+00
140   ; RV64I-NEXT:   [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
141   ; RV64I-NEXT:   [[C6:%[0-9]+]]:_(s64) = G_FCONSTANT double 7.000000e+00
142   ; RV64I-NEXT:   [[C7:%[0-9]+]]:_(s64) = G_FCONSTANT double 8.000000e+00
143   ; RV64I-NEXT:   [[C8:%[0-9]+]]:_(s64) = G_FCONSTANT double 9.000000e+00
144   ; RV64I-NEXT:   $f10_d = COPY [[C]](s64)
145   ; RV64I-NEXT:   $f11_d = COPY [[C1]](s64)
146   ; RV64I-NEXT:   $f12_d = COPY [[C2]](s64)
147   ; RV64I-NEXT:   $f13_d = COPY [[C3]](s64)
148   ; RV64I-NEXT:   $f14_d = COPY [[C4]](s64)
149   ; RV64I-NEXT:   $f15_d = COPY [[C5]](s64)
150   ; RV64I-NEXT:   $f16_d = COPY [[C6]](s64)
151   ; RV64I-NEXT:   $f17_d = COPY [[C7]](s64)
152   ; RV64I-NEXT:   $x10 = COPY [[C8]](s64)
153   ; RV64I-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_in_gpr_exhausted_fprs, 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-def $x10
154   ; RV64I-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $x10
155   ; RV64I-NEXT:   [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
156   ; RV64I-NEXT:   [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)
157   ; RV64I-NEXT:   $x10 = COPY [[ANYEXT]](s64)
158   ; RV64I-NEXT:   PseudoRET implicit $x10
159   %1 = call i32 @callee_double_in_gpr_exhausted_fprs(
160       double 1.0, double 2.0, double 3.0, double 4.0, double 5.0, double 6.0,
161       double 7.0, double 8.0, double 9.0)
162   ret i32 %1
165 ; Must keep define on a single line due to an update_llc_test_checks.py limitation
166 define i64 @callee_double_on_stack_exhausted_gprs_fprs(i128 %a, double %b, i128 %c, double %d, i128 %e, double %f, i128 %g, double %h, double %i, double %j, double %k, double %l, double %m) nounwind {
167   ; RV64I-LABEL: name: callee_double_on_stack_exhausted_gprs_fprs
168   ; RV64I: bb.1 (%ir-block.0):
169   ; RV64I-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
170   ; RV64I-NEXT: {{  $}}
171   ; RV64I-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $x10
172   ; RV64I-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
173   ; RV64I-NEXT:   [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)
174   ; RV64I-NEXT:   [[COPY2:%[0-9]+]]:_(s64) = COPY $f10_d
175   ; RV64I-NEXT:   [[COPY3:%[0-9]+]]:_(s64) = COPY $x12
176   ; RV64I-NEXT:   [[COPY4:%[0-9]+]]:_(s64) = COPY $x13
177   ; RV64I-NEXT:   [[MV1:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY3]](s64), [[COPY4]](s64)
178   ; RV64I-NEXT:   [[COPY5:%[0-9]+]]:_(s64) = COPY $f11_d
179   ; RV64I-NEXT:   [[COPY6:%[0-9]+]]:_(s64) = COPY $x14
180   ; RV64I-NEXT:   [[COPY7:%[0-9]+]]:_(s64) = COPY $x15
181   ; RV64I-NEXT:   [[MV2:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY6]](s64), [[COPY7]](s64)
182   ; RV64I-NEXT:   [[COPY8:%[0-9]+]]:_(s64) = COPY $f12_d
183   ; RV64I-NEXT:   [[COPY9:%[0-9]+]]:_(s64) = COPY $x16
184   ; RV64I-NEXT:   [[COPY10:%[0-9]+]]:_(s64) = COPY $x17
185   ; RV64I-NEXT:   [[MV3:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY9]](s64), [[COPY10]](s64)
186   ; RV64I-NEXT:   [[COPY11:%[0-9]+]]:_(s64) = COPY $f13_d
187   ; RV64I-NEXT:   [[COPY12:%[0-9]+]]:_(s64) = COPY $f14_d
188   ; RV64I-NEXT:   [[COPY13:%[0-9]+]]:_(s64) = COPY $f15_d
189   ; RV64I-NEXT:   [[COPY14:%[0-9]+]]:_(s64) = COPY $f16_d
190   ; RV64I-NEXT:   [[COPY15:%[0-9]+]]:_(s64) = COPY $f17_d
191   ; RV64I-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0
192   ; RV64I-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.0, align 16)
193   ; RV64I-NEXT:   [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[MV3]](s128)
194   ; RV64I-NEXT:   [[FPTOSI:%[0-9]+]]:_(s64) = G_FPTOSI [[LOAD]](s64)
195   ; RV64I-NEXT:   [[ADD:%[0-9]+]]:_(s64) = G_ADD [[TRUNC]], [[FPTOSI]]
196   ; RV64I-NEXT:   $x10 = COPY [[ADD]](s64)
197   ; RV64I-NEXT:   PseudoRET implicit $x10
198   %g_trunc = trunc i128 %g to i64
199   %m_fptosi = fptosi double %m to i64
200   %1 = add i64 %g_trunc, %m_fptosi
201   ret i64 %1
204 define i64 @caller_double_on_stack_exhausted_gprs_fprs() nounwind {
205   ; RV64I-LABEL: name: caller_double_on_stack_exhausted_gprs_fprs
206   ; RV64I: bb.1 (%ir-block.0):
207   ; RV64I-NEXT:   [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 1
208   ; RV64I-NEXT:   [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
209   ; RV64I-NEXT:   [[C2:%[0-9]+]]:_(s128) = G_CONSTANT i128 3
210   ; RV64I-NEXT:   [[C3:%[0-9]+]]:_(s64) = G_FCONSTANT double 4.000000e+00
211   ; RV64I-NEXT:   [[C4:%[0-9]+]]:_(s128) = G_CONSTANT i128 5
212   ; RV64I-NEXT:   [[C5:%[0-9]+]]:_(s64) = G_FCONSTANT double 6.000000e+00
213   ; RV64I-NEXT:   [[C6:%[0-9]+]]:_(s128) = G_CONSTANT i128 7
214   ; RV64I-NEXT:   [[C7:%[0-9]+]]:_(s64) = G_FCONSTANT double 8.000000e+00
215   ; RV64I-NEXT:   [[C8:%[0-9]+]]:_(s64) = G_FCONSTANT double 9.000000e+00
216   ; RV64I-NEXT:   [[C9:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+01
217   ; RV64I-NEXT:   [[C10:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.100000e+01
218   ; RV64I-NEXT:   [[C11:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.200000e+01
219   ; RV64I-NEXT:   [[C12:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.300000e+01
220   ; RV64I-NEXT:   [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C]](s128)
221   ; RV64I-NEXT:   [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C2]](s128)
222   ; RV64I-NEXT:   [[UV4:%[0-9]+]]:_(s64), [[UV5:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C4]](s128)
223   ; RV64I-NEXT:   [[UV6:%[0-9]+]]:_(s64), [[UV7:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C6]](s128)
224   ; RV64I-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x2
225   ; RV64I-NEXT:   [[C13:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
226   ; RV64I-NEXT:   [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C13]](s64)
227   ; RV64I-NEXT:   G_STORE [[C12]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)
228   ; RV64I-NEXT:   $x10 = COPY [[UV]](s64)
229   ; RV64I-NEXT:   $x11 = COPY [[UV1]](s64)
230   ; RV64I-NEXT:   $f10_d = COPY [[C1]](s64)
231   ; RV64I-NEXT:   $x12 = COPY [[UV2]](s64)
232   ; RV64I-NEXT:   $x13 = COPY [[UV3]](s64)
233   ; RV64I-NEXT:   $f11_d = COPY [[C3]](s64)
234   ; RV64I-NEXT:   $x14 = COPY [[UV4]](s64)
235   ; RV64I-NEXT:   $x15 = COPY [[UV5]](s64)
236   ; RV64I-NEXT:   $f12_d = COPY [[C5]](s64)
237   ; RV64I-NEXT:   $x16 = COPY [[UV6]](s64)
238   ; RV64I-NEXT:   $x17 = COPY [[UV7]](s64)
239   ; RV64I-NEXT:   $f13_d = COPY [[C7]](s64)
240   ; RV64I-NEXT:   $f14_d = COPY [[C8]](s64)
241   ; RV64I-NEXT:   $f15_d = COPY [[C9]](s64)
242   ; RV64I-NEXT:   $f16_d = COPY [[C10]](s64)
243   ; RV64I-NEXT:   $f17_d = COPY [[C11]](s64)
244   ; RV64I-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_on_stack_exhausted_gprs_fprs, 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
245   ; RV64I-NEXT:   [[COPY1:%[0-9]+]]:_(s64) = COPY $x10
246   ; RV64I-NEXT:   $x10 = COPY [[COPY1]](s64)
247   ; RV64I-NEXT:   PseudoRET implicit $x10
248   %1 = call i64 @callee_double_on_stack_exhausted_gprs_fprs(
249       i128 1, double 2.0, i128 3, double 4.0, i128 5, double 6.0, i128 7, double 8.0,
250       double 9.0, double 10.0, double 11.0, double 12.0, double 13.0)
251   ret i64 %1
254 define double @callee_double_ret() nounwind {
255   ; RV64I-LABEL: name: callee_double_ret
256   ; RV64I: bb.1 (%ir-block.0):
257   ; RV64I-NEXT:   [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 1.000000e+00
258   ; RV64I-NEXT:   $f10_d = COPY [[C]](s64)
259   ; RV64I-NEXT:   PseudoRET implicit $f10_d
260   ret double 1.0
263 define i64 @caller_double_ret() nounwind {
264   ; RV64I-LABEL: name: caller_double_ret
265   ; RV64I: bb.1 (%ir-block.0):
266   ; RV64I-NEXT:   PseudoCALL target-flags(riscv-call) @callee_double_ret, implicit-def $x1, implicit-def $f10_d
267   ; RV64I-NEXT:   [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
268   ; RV64I-NEXT:   $x10 = COPY [[COPY]](s64)
269   ; RV64I-NEXT:   PseudoRET implicit $x10
270   %1 = call double @callee_double_ret()
271   %2 = bitcast double %1 to i64
272   ret i64 %2