1253 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 32; RUN: llc -mtriple=riscv64 \3; RUN: -global-isel -stop-after=irtranslator -verify-machineinstrs < %s \4; RUN: | FileCheck -check-prefixes=RV64I,LP64 %s5; RUN: llc -mtriple=riscv64 -mattr=+f -target-abi lp64f \6; RUN: -global-isel -stop-after=irtranslator -verify-machineinstrs < %s \7; RUN: | FileCheck -check-prefixes=RV64I,LP64F %s8; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi lp64d \9; RUN: -global-isel -stop-after=irtranslator -verify-machineinstrs < %s \10; RUN: | FileCheck -check-prefixes=RV64I,LP64D %s11 12; This file contains tests that should have identical output for the lp64,13; lp64f, and lp64d ABIs. i.e. where no arguments are passed according to14; the floating point ABI.15 16; Check that on RV64, i128 is passed in a pair of registers. Unlike17; the convention for varargs, this need not be an aligned pair.18 19define i64 @callee_i128_in_regs(i64 %a, i128 %b) nounwind {20 ; RV64I-LABEL: name: callee_i128_in_regs21 ; RV64I: bb.1 (%ir-block.0):22 ; RV64I-NEXT: liveins: $x10, $x11, $x1223 ; RV64I-NEXT: {{ $}}24 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x1025 ; RV64I-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1126 ; RV64I-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x1227 ; RV64I-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY1]](s64), [[COPY2]](s64)28 ; RV64I-NEXT: [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[MV]](s128)29 ; RV64I-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[TRUNC]]30 ; RV64I-NEXT: $x10 = COPY [[ADD]](s64)31 ; RV64I-NEXT: PseudoRET implicit $x1032 %b_trunc = trunc i128 %b to i6433 %1 = add i64 %a, %b_trunc34 ret i64 %135}36 37define i64 @caller_i128_in_regs() nounwind {38 ; LP64-LABEL: name: caller_i128_in_regs39 ; LP64: bb.1 (%ir-block.0):40 ; LP64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 141 ; LP64-NEXT: [[C1:%[0-9]+]]:_(s128) = G_CONSTANT i128 242 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x243 ; LP64-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C1]](s128)44 ; LP64-NEXT: $x10 = COPY [[C]](s64)45 ; LP64-NEXT: $x11 = COPY [[UV]](s64)46 ; LP64-NEXT: $x12 = COPY [[UV1]](s64)47 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_i128_in_regs, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit-def $x1048 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x249 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x1050 ; LP64-NEXT: $x10 = COPY [[COPY]](s64)51 ; LP64-NEXT: PseudoRET implicit $x1052 ;53 ; LP64F-LABEL: name: caller_i128_in_regs54 ; LP64F: bb.1 (%ir-block.0):55 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 156 ; LP64F-NEXT: [[C1:%[0-9]+]]:_(s128) = G_CONSTANT i128 257 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x258 ; LP64F-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C1]](s128)59 ; LP64F-NEXT: $x10 = COPY [[C]](s64)60 ; LP64F-NEXT: $x11 = COPY [[UV]](s64)61 ; LP64F-NEXT: $x12 = COPY [[UV1]](s64)62 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_i128_in_regs, csr_ilp32f_lp64f, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit-def $x1063 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x264 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x1065 ; LP64F-NEXT: $x10 = COPY [[COPY]](s64)66 ; LP64F-NEXT: PseudoRET implicit $x1067 ;68 ; LP64D-LABEL: name: caller_i128_in_regs69 ; LP64D: bb.1 (%ir-block.0):70 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 171 ; LP64D-NEXT: [[C1:%[0-9]+]]:_(s128) = G_CONSTANT i128 272 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x273 ; LP64D-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C1]](s128)74 ; LP64D-NEXT: $x10 = COPY [[C]](s64)75 ; LP64D-NEXT: $x11 = COPY [[UV]](s64)76 ; LP64D-NEXT: $x12 = COPY [[UV1]](s64)77 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_i128_in_regs, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit-def $x1078 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x279 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x1080 ; LP64D-NEXT: $x10 = COPY [[COPY]](s64)81 ; LP64D-NEXT: PseudoRET implicit $x1082 %1 = call i64 @callee_i128_in_regs(i64 1, i128 2)83 ret i64 %184}85 86define i64 @callee_i128_fp128_in_regs(i128 %a, fp128 %b) nounwind {87 ; RV64I-LABEL: name: callee_i128_fp128_in_regs88 ; RV64I: bb.1 (%ir-block.0):89 ; RV64I-NEXT: liveins: $x10, $x11, $x12, $x1390 ; RV64I-NEXT: {{ $}}91 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x1092 ; RV64I-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1193 ; RV64I-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)94 ; RV64I-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x1295 ; RV64I-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x1396 ; RV64I-NEXT: [[MV1:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY2]](s64), [[COPY3]](s64)97 ; RV64I-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[MV]](s128), [[MV1]]98 ; RV64I-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[ICMP]](s1)99 ; RV64I-NEXT: $x10 = COPY [[ZEXT]](s64)100 ; RV64I-NEXT: PseudoRET implicit $x10101 %b_bitcast = bitcast fp128 %b to i128102 %1 = icmp eq i128 %a, %b_bitcast103 %2 = zext i1 %1 to i64104 ret i64 %2105}106 107define i64 @caller_i128_fp128_in_regs() nounwind {108 ; LP64-LABEL: name: caller_i128_fp128_in_regs109 ; LP64: bb.1 (%ir-block.0):110 ; LP64-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 1111 ; LP64-NEXT: [[C1:%[0-9]+]]:_(s128) = G_FCONSTANT fp128 0xL00000000000000007FFF000000000000112 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2113 ; LP64-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C]](s128)114 ; LP64-NEXT: [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C1]](s128)115 ; LP64-NEXT: $x10 = COPY [[UV]](s64)116 ; LP64-NEXT: $x11 = COPY [[UV1]](s64)117 ; LP64-NEXT: $x12 = COPY [[UV2]](s64)118 ; LP64-NEXT: $x13 = COPY [[UV3]](s64)119 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_i128_fp128_in_regs, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit-def $x10120 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2121 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10122 ; LP64-NEXT: $x10 = COPY [[COPY]](s64)123 ; LP64-NEXT: PseudoRET implicit $x10124 ;125 ; LP64F-LABEL: name: caller_i128_fp128_in_regs126 ; LP64F: bb.1 (%ir-block.0):127 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 1128 ; LP64F-NEXT: [[C1:%[0-9]+]]:_(s128) = G_FCONSTANT fp128 0xL00000000000000007FFF000000000000129 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2130 ; LP64F-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C]](s128)131 ; LP64F-NEXT: [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C1]](s128)132 ; LP64F-NEXT: $x10 = COPY [[UV]](s64)133 ; LP64F-NEXT: $x11 = COPY [[UV1]](s64)134 ; LP64F-NEXT: $x12 = COPY [[UV2]](s64)135 ; LP64F-NEXT: $x13 = COPY [[UV3]](s64)136 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_i128_fp128_in_regs, csr_ilp32f_lp64f, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit-def $x10137 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2138 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10139 ; LP64F-NEXT: $x10 = COPY [[COPY]](s64)140 ; LP64F-NEXT: PseudoRET implicit $x10141 ;142 ; LP64D-LABEL: name: caller_i128_fp128_in_regs143 ; LP64D: bb.1 (%ir-block.0):144 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 1145 ; LP64D-NEXT: [[C1:%[0-9]+]]:_(s128) = G_FCONSTANT fp128 0xL00000000000000007FFF000000000000146 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2147 ; LP64D-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C]](s128)148 ; LP64D-NEXT: [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C1]](s128)149 ; LP64D-NEXT: $x10 = COPY [[UV]](s64)150 ; LP64D-NEXT: $x11 = COPY [[UV1]](s64)151 ; LP64D-NEXT: $x12 = COPY [[UV2]](s64)152 ; LP64D-NEXT: $x13 = COPY [[UV3]](s64)153 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_i128_fp128_in_regs, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit-def $x10154 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2155 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10156 ; LP64D-NEXT: $x10 = COPY [[COPY]](s64)157 ; LP64D-NEXT: PseudoRET implicit $x10158 %1 = call i64 @callee_i128_fp128_in_regs(i128 1, fp128 0xL00000000000000007FFF000000000000)159 ret i64 %1160}161 162; Check the correct handling of passing of values that are larger that 2*XLen.163 164define i32 @caller_i256_indirect_reference_in_stack() {165 ; LP64-LABEL: name: caller_i256_indirect_reference_in_stack166 ; LP64: bb.1 (%ir-block.0):167 ; LP64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1168 ; LP64-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2169 ; LP64-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3170 ; LP64-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 4171 ; LP64-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5172 ; LP64-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 6173 ; LP64-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 7174 ; LP64-NEXT: [[C7:%[0-9]+]]:_(s64) = G_CONSTANT i64 8175 ; LP64-NEXT: [[C8:%[0-9]+]]:_(s256) = G_CONSTANT i256 42176 ; LP64-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def $x2, implicit $x2177 ; LP64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0178 ; LP64-NEXT: G_STORE [[C8]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)179 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2180 ; LP64-NEXT: [[C9:%[0-9]+]]:_(s64) = G_CONSTANT i64 0181 ; LP64-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C9]](s64)182 ; LP64-NEXT: G_STORE [[FRAME_INDEX]](p0), [[PTR_ADD]](p0) :: (store (p0) into stack, align 16)183 ; LP64-NEXT: $x10 = COPY [[C]](s64)184 ; LP64-NEXT: $x11 = COPY [[C1]](s64)185 ; LP64-NEXT: $x12 = COPY [[C2]](s64)186 ; LP64-NEXT: $x13 = COPY [[C3]](s64)187 ; LP64-NEXT: $x14 = COPY [[C4]](s64)188 ; LP64-NEXT: $x15 = COPY [[C5]](s64)189 ; LP64-NEXT: $x16 = COPY [[C6]](s64)190 ; LP64-NEXT: $x17 = COPY [[C7]](s64)191 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_i256_indirect_reference_in_stack, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit-def $x10192 ; LP64-NEXT: ADJCALLSTACKUP 8, 0, implicit-def $x2, implicit $x2193 ; LP64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10194 ; LP64-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)195 ; LP64-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)196 ; LP64-NEXT: $x10 = COPY [[ANYEXT]](s64)197 ; LP64-NEXT: PseudoRET implicit $x10198 ;199 ; LP64F-LABEL: name: caller_i256_indirect_reference_in_stack200 ; LP64F: bb.1 (%ir-block.0):201 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1202 ; LP64F-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2203 ; LP64F-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3204 ; LP64F-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 4205 ; LP64F-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5206 ; LP64F-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 6207 ; LP64F-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 7208 ; LP64F-NEXT: [[C7:%[0-9]+]]:_(s64) = G_CONSTANT i64 8209 ; LP64F-NEXT: [[C8:%[0-9]+]]:_(s256) = G_CONSTANT i256 42210 ; LP64F-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def $x2, implicit $x2211 ; LP64F-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0212 ; LP64F-NEXT: G_STORE [[C8]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)213 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2214 ; LP64F-NEXT: [[C9:%[0-9]+]]:_(s64) = G_CONSTANT i64 0215 ; LP64F-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C9]](s64)216 ; LP64F-NEXT: G_STORE [[FRAME_INDEX]](p0), [[PTR_ADD]](p0) :: (store (p0) into stack, align 16)217 ; LP64F-NEXT: $x10 = COPY [[C]](s64)218 ; LP64F-NEXT: $x11 = COPY [[C1]](s64)219 ; LP64F-NEXT: $x12 = COPY [[C2]](s64)220 ; LP64F-NEXT: $x13 = COPY [[C3]](s64)221 ; LP64F-NEXT: $x14 = COPY [[C4]](s64)222 ; LP64F-NEXT: $x15 = COPY [[C5]](s64)223 ; LP64F-NEXT: $x16 = COPY [[C6]](s64)224 ; LP64F-NEXT: $x17 = COPY [[C7]](s64)225 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_i256_indirect_reference_in_stack, csr_ilp32f_lp64f, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit-def $x10226 ; LP64F-NEXT: ADJCALLSTACKUP 8, 0, implicit-def $x2, implicit $x2227 ; LP64F-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10228 ; LP64F-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)229 ; LP64F-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)230 ; LP64F-NEXT: $x10 = COPY [[ANYEXT]](s64)231 ; LP64F-NEXT: PseudoRET implicit $x10232 ;233 ; LP64D-LABEL: name: caller_i256_indirect_reference_in_stack234 ; LP64D: bb.1 (%ir-block.0):235 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1236 ; LP64D-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2237 ; LP64D-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3238 ; LP64D-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 4239 ; LP64D-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5240 ; LP64D-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 6241 ; LP64D-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 7242 ; LP64D-NEXT: [[C7:%[0-9]+]]:_(s64) = G_CONSTANT i64 8243 ; LP64D-NEXT: [[C8:%[0-9]+]]:_(s256) = G_CONSTANT i256 42244 ; LP64D-NEXT: ADJCALLSTACKDOWN 8, 0, implicit-def $x2, implicit $x2245 ; LP64D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0246 ; LP64D-NEXT: G_STORE [[C8]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)247 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2248 ; LP64D-NEXT: [[C9:%[0-9]+]]:_(s64) = G_CONSTANT i64 0249 ; LP64D-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C9]](s64)250 ; LP64D-NEXT: G_STORE [[FRAME_INDEX]](p0), [[PTR_ADD]](p0) :: (store (p0) into stack, align 16)251 ; LP64D-NEXT: $x10 = COPY [[C]](s64)252 ; LP64D-NEXT: $x11 = COPY [[C1]](s64)253 ; LP64D-NEXT: $x12 = COPY [[C2]](s64)254 ; LP64D-NEXT: $x13 = COPY [[C3]](s64)255 ; LP64D-NEXT: $x14 = COPY [[C4]](s64)256 ; LP64D-NEXT: $x15 = COPY [[C5]](s64)257 ; LP64D-NEXT: $x16 = COPY [[C6]](s64)258 ; LP64D-NEXT: $x17 = COPY [[C7]](s64)259 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_i256_indirect_reference_in_stack, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit-def $x10260 ; LP64D-NEXT: ADJCALLSTACKUP 8, 0, implicit-def $x2, implicit $x2261 ; LP64D-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10262 ; LP64D-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)263 ; LP64D-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)264 ; LP64D-NEXT: $x10 = COPY [[ANYEXT]](s64)265 ; LP64D-NEXT: PseudoRET implicit $x10266 %1 = call i64 @callee_i256_indirect_reference_in_stack(i64 1, i64 2, i64 3, i64 4,i64 5,i64 6,i64 7,i64 8, i256 42)267 %2 = trunc i64 %1 to i32268 ret i32 %2269}270 271 272define i64 @callee_i256_indirect_reference_in_stack(i64 %x1, i64 %x2, i64 %x3, i64 %x4, i64 %x5, i64 %x6, i64 %x7, i64 %x8, i256 %y) {273 ; RV64I-LABEL: name: callee_i256_indirect_reference_in_stack274 ; RV64I: bb.1 (%ir-block.0):275 ; RV64I-NEXT: liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17276 ; RV64I-NEXT: {{ $}}277 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10278 ; RV64I-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11279 ; RV64I-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12280 ; RV64I-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13281 ; RV64I-NEXT: [[COPY4:%[0-9]+]]:_(s64) = COPY $x14282 ; RV64I-NEXT: [[COPY5:%[0-9]+]]:_(s64) = COPY $x15283 ; RV64I-NEXT: [[COPY6:%[0-9]+]]:_(s64) = COPY $x16284 ; RV64I-NEXT: [[COPY7:%[0-9]+]]:_(s64) = COPY $x17285 ; RV64I-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0286 ; RV64I-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (load (p0) from %fixed-stack.0, align 16)287 ; RV64I-NEXT: [[LOAD1:%[0-9]+]]:_(s256) = G_LOAD [[LOAD]](p0) :: (load (s256), align 16)288 ; RV64I-NEXT: [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[LOAD1]](s256)289 ; RV64I-NEXT: $x10 = COPY [[TRUNC]](s64)290 ; RV64I-NEXT: PseudoRET implicit $x10291 %2 = trunc i256 %y to i64292 ret i64 %2293}294 295 296define i64 @callee_i256_indirect_reference_in_reg(i256 %x, i256 %y) {297 ; RV64I-LABEL: name: callee_i256_indirect_reference_in_reg298 ; RV64I: bb.1 (%ir-block.0):299 ; RV64I-NEXT: liveins: $x10, $x11300 ; RV64I-NEXT: {{ $}}301 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10302 ; RV64I-NEXT: [[LOAD:%[0-9]+]]:_(s256) = G_LOAD [[COPY]](p0) :: (load (s256), align 16)303 ; RV64I-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x11304 ; RV64I-NEXT: [[LOAD1:%[0-9]+]]:_(s256) = G_LOAD [[COPY1]](p0) :: (load (s256), align 16)305 ; RV64I-NEXT: [[ADD:%[0-9]+]]:_(s256) = G_ADD [[LOAD]], [[LOAD1]]306 ; RV64I-NEXT: [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[ADD]](s256)307 ; RV64I-NEXT: $x10 = COPY [[TRUNC]](s64)308 ; RV64I-NEXT: PseudoRET implicit $x10309 %1 = add i256 %x, %y310 %2 = trunc i256 %1 to i64311 ret i64 %2312}313 314define i32 @caller_i256_indirect_reference_in_reg() {315 ; LP64-LABEL: name: caller_i256_indirect_reference_in_reg316 ; LP64: bb.1 (%ir-block.0):317 ; LP64-NEXT: [[C:%[0-9]+]]:_(s256) = G_CONSTANT i256 1318 ; LP64-NEXT: [[C1:%[0-9]+]]:_(s256) = G_CONSTANT i256 2319 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2320 ; LP64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0321 ; LP64-NEXT: G_STORE [[C]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)322 ; LP64-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1323 ; LP64-NEXT: G_STORE [[C1]](s256), [[FRAME_INDEX1]](p0) :: (store (s256) into %stack.1, align 16)324 ; LP64-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)325 ; LP64-NEXT: $x11 = COPY [[FRAME_INDEX1]](p0)326 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_i256_indirect_reference_in_reg, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10327 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2328 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10329 ; LP64-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)330 ; LP64-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)331 ; LP64-NEXT: $x10 = COPY [[ANYEXT]](s64)332 ; LP64-NEXT: PseudoRET implicit $x10333 ;334 ; LP64F-LABEL: name: caller_i256_indirect_reference_in_reg335 ; LP64F: bb.1 (%ir-block.0):336 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s256) = G_CONSTANT i256 1337 ; LP64F-NEXT: [[C1:%[0-9]+]]:_(s256) = G_CONSTANT i256 2338 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2339 ; LP64F-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0340 ; LP64F-NEXT: G_STORE [[C]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)341 ; LP64F-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1342 ; LP64F-NEXT: G_STORE [[C1]](s256), [[FRAME_INDEX1]](p0) :: (store (s256) into %stack.1, align 16)343 ; LP64F-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)344 ; LP64F-NEXT: $x11 = COPY [[FRAME_INDEX1]](p0)345 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_i256_indirect_reference_in_reg, csr_ilp32f_lp64f, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10346 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2347 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10348 ; LP64F-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)349 ; LP64F-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)350 ; LP64F-NEXT: $x10 = COPY [[ANYEXT]](s64)351 ; LP64F-NEXT: PseudoRET implicit $x10352 ;353 ; LP64D-LABEL: name: caller_i256_indirect_reference_in_reg354 ; LP64D: bb.1 (%ir-block.0):355 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s256) = G_CONSTANT i256 1356 ; LP64D-NEXT: [[C1:%[0-9]+]]:_(s256) = G_CONSTANT i256 2357 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2358 ; LP64D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0359 ; LP64D-NEXT: G_STORE [[C]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)360 ; LP64D-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1361 ; LP64D-NEXT: G_STORE [[C1]](s256), [[FRAME_INDEX1]](p0) :: (store (s256) into %stack.1, align 16)362 ; LP64D-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)363 ; LP64D-NEXT: $x11 = COPY [[FRAME_INDEX1]](p0)364 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_i256_indirect_reference_in_reg, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10365 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2366 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10367 ; LP64D-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)368 ; LP64D-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)369 ; LP64D-NEXT: $x10 = COPY [[ANYEXT]](s64)370 ; LP64D-NEXT: PseudoRET implicit $x10371 %1 = call i64 @callee_i256_indirect_reference_in_reg(i256 1, i256 2)372 %2 = trunc i64 %1 to i32373 ret i32 %2374}375 376; Check that the stack is used once the GPRs are exhausted377 378define i32 @callee_many_scalars(i8 %a, i16 %b, i32 %c, i128 %d, i32 %e, i32 %f, i128 %g, i32 %h) nounwind {379 ; RV64I-LABEL: name: callee_many_scalars380 ; RV64I: bb.1 (%ir-block.0):381 ; RV64I-NEXT: liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17382 ; RV64I-NEXT: {{ $}}383 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10384 ; RV64I-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s64)385 ; RV64I-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11386 ; RV64I-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s64)387 ; RV64I-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12388 ; RV64I-NEXT: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[COPY2]](s64)389 ; RV64I-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13390 ; RV64I-NEXT: [[COPY4:%[0-9]+]]:_(s64) = COPY $x14391 ; RV64I-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY3]](s64), [[COPY4]](s64)392 ; RV64I-NEXT: [[COPY5:%[0-9]+]]:_(s64) = COPY $x15393 ; RV64I-NEXT: [[TRUNC3:%[0-9]+]]:_(s32) = G_TRUNC [[COPY5]](s64)394 ; RV64I-NEXT: [[COPY6:%[0-9]+]]:_(s64) = COPY $x16395 ; RV64I-NEXT: [[TRUNC4:%[0-9]+]]:_(s32) = G_TRUNC [[COPY6]](s64)396 ; RV64I-NEXT: [[COPY7:%[0-9]+]]:_(s64) = COPY $x17397 ; RV64I-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1398 ; RV64I-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.1, align 16)399 ; RV64I-NEXT: [[MV1:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY7]](s64), [[LOAD]](s64)400 ; RV64I-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0401 ; RV64I-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (s64) from %fixed-stack.0)402 ; RV64I-NEXT: [[TRUNC5:%[0-9]+]]:_(s32) = G_TRUNC [[LOAD1]](s64)403 ; RV64I-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[TRUNC]](s8)404 ; RV64I-NEXT: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[TRUNC1]](s16)405 ; RV64I-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[ZEXT]], [[ZEXT1]]406 ; RV64I-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[TRUNC2]]407 ; RV64I-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[MV]](s128), [[MV1]]408 ; RV64I-NEXT: [[ZEXT2:%[0-9]+]]:_(s32) = G_ZEXT [[ICMP]](s1)409 ; RV64I-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ZEXT2]], [[ADD1]]410 ; RV64I-NEXT: [[ADD3:%[0-9]+]]:_(s32) = G_ADD [[ADD2]], [[TRUNC3]]411 ; RV64I-NEXT: [[ADD4:%[0-9]+]]:_(s32) = G_ADD [[ADD3]], [[TRUNC4]]412 ; RV64I-NEXT: [[ADD5:%[0-9]+]]:_(s32) = G_ADD [[ADD4]], [[TRUNC5]]413 ; RV64I-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[ADD5]](s32)414 ; RV64I-NEXT: $x10 = COPY [[ANYEXT]](s64)415 ; RV64I-NEXT: PseudoRET implicit $x10416 %a_ext = zext i8 %a to i32417 %b_ext = zext i16 %b to i32418 %1 = add i32 %a_ext, %b_ext419 %2 = add i32 %1, %c420 %3 = icmp eq i128 %d, %g421 %4 = zext i1 %3 to i32422 %5 = add i32 %4, %2423 %6 = add i32 %5, %e424 %7 = add i32 %6, %f425 %8 = add i32 %7, %h426 ret i32 %8427}428 429define i32 @caller_many_scalars() nounwind {430 ; LP64-LABEL: name: caller_many_scalars431 ; LP64: bb.1 (%ir-block.0):432 ; LP64-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1433 ; LP64-NEXT: [[C1:%[0-9]+]]:_(s16) = G_CONSTANT i16 2434 ; LP64-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 3435 ; LP64-NEXT: [[C3:%[0-9]+]]:_(s128) = G_CONSTANT i128 4436 ; LP64-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 5437 ; LP64-NEXT: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 6438 ; LP64-NEXT: [[C6:%[0-9]+]]:_(s128) = G_CONSTANT i128 7439 ; LP64-NEXT: [[C7:%[0-9]+]]:_(s32) = G_CONSTANT i32 8440 ; LP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $x2, implicit $x2441 ; LP64-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[C]](s8)442 ; LP64-NEXT: [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT [[C1]](s16)443 ; LP64-NEXT: [[ANYEXT2:%[0-9]+]]:_(s64) = G_ANYEXT [[C2]](s32)444 ; LP64-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C3]](s128)445 ; LP64-NEXT: [[ANYEXT3:%[0-9]+]]:_(s64) = G_ANYEXT [[C4]](s32)446 ; LP64-NEXT: [[ANYEXT4:%[0-9]+]]:_(s64) = G_ANYEXT [[C5]](s32)447 ; LP64-NEXT: [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C6]](s128)448 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2449 ; LP64-NEXT: [[C8:%[0-9]+]]:_(s64) = G_CONSTANT i64 0450 ; LP64-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C8]](s64)451 ; LP64-NEXT: G_STORE [[UV3]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)452 ; LP64-NEXT: [[ANYEXT5:%[0-9]+]]:_(s64) = G_ANYEXT [[C7]](s32)453 ; LP64-NEXT: [[C9:%[0-9]+]]:_(s64) = G_CONSTANT i64 8454 ; LP64-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C9]](s64)455 ; LP64-NEXT: G_STORE [[ANYEXT5]](s64), [[PTR_ADD1]](p0) :: (store (s64) into stack + 8)456 ; LP64-NEXT: $x10 = COPY [[ANYEXT]](s64)457 ; LP64-NEXT: $x11 = COPY [[ANYEXT1]](s64)458 ; LP64-NEXT: $x12 = COPY [[ANYEXT2]](s64)459 ; LP64-NEXT: $x13 = COPY [[UV]](s64)460 ; LP64-NEXT: $x14 = COPY [[UV1]](s64)461 ; LP64-NEXT: $x15 = COPY [[ANYEXT3]](s64)462 ; LP64-NEXT: $x16 = COPY [[ANYEXT4]](s64)463 ; LP64-NEXT: $x17 = COPY [[UV2]](s64)464 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_many_scalars, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit-def $x10465 ; LP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $x2, implicit $x2466 ; LP64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10467 ; LP64-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)468 ; LP64-NEXT: [[ANYEXT6:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)469 ; LP64-NEXT: $x10 = COPY [[ANYEXT6]](s64)470 ; LP64-NEXT: PseudoRET implicit $x10471 ;472 ; LP64F-LABEL: name: caller_many_scalars473 ; LP64F: bb.1 (%ir-block.0):474 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1475 ; LP64F-NEXT: [[C1:%[0-9]+]]:_(s16) = G_CONSTANT i16 2476 ; LP64F-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 3477 ; LP64F-NEXT: [[C3:%[0-9]+]]:_(s128) = G_CONSTANT i128 4478 ; LP64F-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 5479 ; LP64F-NEXT: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 6480 ; LP64F-NEXT: [[C6:%[0-9]+]]:_(s128) = G_CONSTANT i128 7481 ; LP64F-NEXT: [[C7:%[0-9]+]]:_(s32) = G_CONSTANT i32 8482 ; LP64F-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $x2, implicit $x2483 ; LP64F-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[C]](s8)484 ; LP64F-NEXT: [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT [[C1]](s16)485 ; LP64F-NEXT: [[ANYEXT2:%[0-9]+]]:_(s64) = G_ANYEXT [[C2]](s32)486 ; LP64F-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C3]](s128)487 ; LP64F-NEXT: [[ANYEXT3:%[0-9]+]]:_(s64) = G_ANYEXT [[C4]](s32)488 ; LP64F-NEXT: [[ANYEXT4:%[0-9]+]]:_(s64) = G_ANYEXT [[C5]](s32)489 ; LP64F-NEXT: [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C6]](s128)490 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2491 ; LP64F-NEXT: [[C8:%[0-9]+]]:_(s64) = G_CONSTANT i64 0492 ; LP64F-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C8]](s64)493 ; LP64F-NEXT: G_STORE [[UV3]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)494 ; LP64F-NEXT: [[ANYEXT5:%[0-9]+]]:_(s64) = G_ANYEXT [[C7]](s32)495 ; LP64F-NEXT: [[C9:%[0-9]+]]:_(s64) = G_CONSTANT i64 8496 ; LP64F-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C9]](s64)497 ; LP64F-NEXT: G_STORE [[ANYEXT5]](s64), [[PTR_ADD1]](p0) :: (store (s64) into stack + 8)498 ; LP64F-NEXT: $x10 = COPY [[ANYEXT]](s64)499 ; LP64F-NEXT: $x11 = COPY [[ANYEXT1]](s64)500 ; LP64F-NEXT: $x12 = COPY [[ANYEXT2]](s64)501 ; LP64F-NEXT: $x13 = COPY [[UV]](s64)502 ; LP64F-NEXT: $x14 = COPY [[UV1]](s64)503 ; LP64F-NEXT: $x15 = COPY [[ANYEXT3]](s64)504 ; LP64F-NEXT: $x16 = COPY [[ANYEXT4]](s64)505 ; LP64F-NEXT: $x17 = COPY [[UV2]](s64)506 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_many_scalars, csr_ilp32f_lp64f, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit-def $x10507 ; LP64F-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $x2, implicit $x2508 ; LP64F-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10509 ; LP64F-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)510 ; LP64F-NEXT: [[ANYEXT6:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)511 ; LP64F-NEXT: $x10 = COPY [[ANYEXT6]](s64)512 ; LP64F-NEXT: PseudoRET implicit $x10513 ;514 ; LP64D-LABEL: name: caller_many_scalars515 ; LP64D: bb.1 (%ir-block.0):516 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1517 ; LP64D-NEXT: [[C1:%[0-9]+]]:_(s16) = G_CONSTANT i16 2518 ; LP64D-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 3519 ; LP64D-NEXT: [[C3:%[0-9]+]]:_(s128) = G_CONSTANT i128 4520 ; LP64D-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 5521 ; LP64D-NEXT: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 6522 ; LP64D-NEXT: [[C6:%[0-9]+]]:_(s128) = G_CONSTANT i128 7523 ; LP64D-NEXT: [[C7:%[0-9]+]]:_(s32) = G_CONSTANT i32 8524 ; LP64D-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $x2, implicit $x2525 ; LP64D-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[C]](s8)526 ; LP64D-NEXT: [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT [[C1]](s16)527 ; LP64D-NEXT: [[ANYEXT2:%[0-9]+]]:_(s64) = G_ANYEXT [[C2]](s32)528 ; LP64D-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C3]](s128)529 ; LP64D-NEXT: [[ANYEXT3:%[0-9]+]]:_(s64) = G_ANYEXT [[C4]](s32)530 ; LP64D-NEXT: [[ANYEXT4:%[0-9]+]]:_(s64) = G_ANYEXT [[C5]](s32)531 ; LP64D-NEXT: [[UV2:%[0-9]+]]:_(s64), [[UV3:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C6]](s128)532 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2533 ; LP64D-NEXT: [[C8:%[0-9]+]]:_(s64) = G_CONSTANT i64 0534 ; LP64D-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C8]](s64)535 ; LP64D-NEXT: G_STORE [[UV3]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)536 ; LP64D-NEXT: [[ANYEXT5:%[0-9]+]]:_(s64) = G_ANYEXT [[C7]](s32)537 ; LP64D-NEXT: [[C9:%[0-9]+]]:_(s64) = G_CONSTANT i64 8538 ; LP64D-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C9]](s64)539 ; LP64D-NEXT: G_STORE [[ANYEXT5]](s64), [[PTR_ADD1]](p0) :: (store (s64) into stack + 8)540 ; LP64D-NEXT: $x10 = COPY [[ANYEXT]](s64)541 ; LP64D-NEXT: $x11 = COPY [[ANYEXT1]](s64)542 ; LP64D-NEXT: $x12 = COPY [[ANYEXT2]](s64)543 ; LP64D-NEXT: $x13 = COPY [[UV]](s64)544 ; LP64D-NEXT: $x14 = COPY [[UV1]](s64)545 ; LP64D-NEXT: $x15 = COPY [[ANYEXT3]](s64)546 ; LP64D-NEXT: $x16 = COPY [[ANYEXT4]](s64)547 ; LP64D-NEXT: $x17 = COPY [[UV2]](s64)548 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_many_scalars, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit-def $x10549 ; LP64D-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $x2, implicit $x2550 ; LP64D-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10551 ; LP64D-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)552 ; LP64D-NEXT: [[ANYEXT6:%[0-9]+]]:_(s64) = G_ANYEXT [[TRUNC]](s32)553 ; LP64D-NEXT: $x10 = COPY [[ANYEXT6]](s64)554 ; LP64D-NEXT: PseudoRET implicit $x10555 %1 = call i32 @callee_many_scalars(i8 1, i16 2, i32 3, i128 4, i32 5, i32 6, i128 7, i32 8)556 ret i32 %1557}558 559; Check that i256 is passed indirectly.560 561define i64 @callee_large_scalars(i256 %a, i256 %b) nounwind {562 ; RV64I-LABEL: name: callee_large_scalars563 ; RV64I: bb.1 (%ir-block.0):564 ; RV64I-NEXT: liveins: $x10, $x11565 ; RV64I-NEXT: {{ $}}566 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10567 ; RV64I-NEXT: [[LOAD:%[0-9]+]]:_(s256) = G_LOAD [[COPY]](p0) :: (load (s256), align 16)568 ; RV64I-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x11569 ; RV64I-NEXT: [[LOAD1:%[0-9]+]]:_(s256) = G_LOAD [[COPY1]](p0) :: (load (s256), align 16)570 ; RV64I-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[LOAD]](s256), [[LOAD1]]571 ; RV64I-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[ICMP]](s1)572 ; RV64I-NEXT: $x10 = COPY [[ZEXT]](s64)573 ; RV64I-NEXT: PseudoRET implicit $x10574 %1 = icmp eq i256 %a, %b575 %2 = zext i1 %1 to i64576 ret i64 %2577}578 579define i64 @caller_large_scalars() nounwind {580 ; LP64-LABEL: name: caller_large_scalars581 ; LP64: bb.1 (%ir-block.0):582 ; LP64-NEXT: [[C:%[0-9]+]]:_(s256) = G_CONSTANT i256 1583 ; LP64-NEXT: [[C1:%[0-9]+]]:_(s256) = G_CONSTANT i256 2584 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2585 ; LP64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0586 ; LP64-NEXT: G_STORE [[C]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)587 ; LP64-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1588 ; LP64-NEXT: G_STORE [[C1]](s256), [[FRAME_INDEX1]](p0) :: (store (s256) into %stack.1, align 16)589 ; LP64-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)590 ; LP64-NEXT: $x11 = COPY [[FRAME_INDEX1]](p0)591 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_scalars, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10592 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2593 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10594 ; LP64-NEXT: $x10 = COPY [[COPY]](s64)595 ; LP64-NEXT: PseudoRET implicit $x10596 ;597 ; LP64F-LABEL: name: caller_large_scalars598 ; LP64F: bb.1 (%ir-block.0):599 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s256) = G_CONSTANT i256 1600 ; LP64F-NEXT: [[C1:%[0-9]+]]:_(s256) = G_CONSTANT i256 2601 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2602 ; LP64F-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0603 ; LP64F-NEXT: G_STORE [[C]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)604 ; LP64F-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1605 ; LP64F-NEXT: G_STORE [[C1]](s256), [[FRAME_INDEX1]](p0) :: (store (s256) into %stack.1, align 16)606 ; LP64F-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)607 ; LP64F-NEXT: $x11 = COPY [[FRAME_INDEX1]](p0)608 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_scalars, csr_ilp32f_lp64f, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10609 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2610 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10611 ; LP64F-NEXT: $x10 = COPY [[COPY]](s64)612 ; LP64F-NEXT: PseudoRET implicit $x10613 ;614 ; LP64D-LABEL: name: caller_large_scalars615 ; LP64D: bb.1 (%ir-block.0):616 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s256) = G_CONSTANT i256 1617 ; LP64D-NEXT: [[C1:%[0-9]+]]:_(s256) = G_CONSTANT i256 2618 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2619 ; LP64D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0620 ; LP64D-NEXT: G_STORE [[C]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)621 ; LP64D-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1622 ; LP64D-NEXT: G_STORE [[C1]](s256), [[FRAME_INDEX1]](p0) :: (store (s256) into %stack.1, align 16)623 ; LP64D-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)624 ; LP64D-NEXT: $x11 = COPY [[FRAME_INDEX1]](p0)625 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_scalars, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10626 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2627 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10628 ; LP64D-NEXT: $x10 = COPY [[COPY]](s64)629 ; LP64D-NEXT: PseudoRET implicit $x10630 %1 = call i64 @callee_large_scalars(i256 1, i256 2)631 ret i64 %1632}633 634; Check that arguments larger than 2*xlen are handled correctly when their635; address is passed on the stack rather than in memory636 637; Must keep define on a single line due to an update_llc_test_checks.py limitation638define i64 @callee_large_scalars_exhausted_regs(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i256 %h, i64 %i, i256 %j) nounwind {639 ; RV64I-LABEL: name: callee_large_scalars_exhausted_regs640 ; RV64I: bb.1 (%ir-block.0):641 ; RV64I-NEXT: liveins: $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17642 ; RV64I-NEXT: {{ $}}643 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10644 ; RV64I-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11645 ; RV64I-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12646 ; RV64I-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x13647 ; RV64I-NEXT: [[COPY4:%[0-9]+]]:_(s64) = COPY $x14648 ; RV64I-NEXT: [[COPY5:%[0-9]+]]:_(s64) = COPY $x15649 ; RV64I-NEXT: [[COPY6:%[0-9]+]]:_(s64) = COPY $x16650 ; RV64I-NEXT: [[COPY7:%[0-9]+]]:_(p0) = COPY $x17651 ; RV64I-NEXT: [[LOAD:%[0-9]+]]:_(s256) = G_LOAD [[COPY7]](p0) :: (load (s256), align 16)652 ; RV64I-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1653 ; RV64I-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.1, align 16)654 ; RV64I-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0655 ; RV64I-NEXT: [[LOAD2:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (p0) from %fixed-stack.0)656 ; RV64I-NEXT: [[LOAD3:%[0-9]+]]:_(s256) = G_LOAD [[LOAD2]](p0) :: (load (s256), align 16)657 ; RV64I-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[LOAD]](s256), [[LOAD3]]658 ; RV64I-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[ICMP]](s1)659 ; RV64I-NEXT: $x10 = COPY [[ZEXT]](s64)660 ; RV64I-NEXT: PseudoRET implicit $x10661 %1 = icmp eq i256 %h, %j662 %2 = zext i1 %1 to i64663 ret i64 %2664}665 666define i64 @caller_large_scalars_exhausted_regs() nounwind {667 ; LP64-LABEL: name: caller_large_scalars_exhausted_regs668 ; LP64: bb.1 (%ir-block.0):669 ; LP64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1670 ; LP64-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2671 ; LP64-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3672 ; LP64-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 4673 ; LP64-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5674 ; LP64-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 6675 ; LP64-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 7676 ; LP64-NEXT: [[C7:%[0-9]+]]:_(s256) = G_CONSTANT i256 8677 ; LP64-NEXT: [[C8:%[0-9]+]]:_(s64) = G_CONSTANT i64 9678 ; LP64-NEXT: [[C9:%[0-9]+]]:_(s256) = G_CONSTANT i256 10679 ; LP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $x2, implicit $x2680 ; LP64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0681 ; LP64-NEXT: G_STORE [[C7]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)682 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2683 ; LP64-NEXT: [[C10:%[0-9]+]]:_(s64) = G_CONSTANT i64 0684 ; LP64-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C10]](s64)685 ; LP64-NEXT: G_STORE [[C8]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)686 ; LP64-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1687 ; LP64-NEXT: G_STORE [[C9]](s256), [[FRAME_INDEX1]](p0) :: (store (s256) into %stack.1, align 16)688 ; LP64-NEXT: [[C11:%[0-9]+]]:_(s64) = G_CONSTANT i64 8689 ; LP64-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C11]](s64)690 ; LP64-NEXT: G_STORE [[FRAME_INDEX1]](p0), [[PTR_ADD1]](p0) :: (store (p0) into stack + 8)691 ; LP64-NEXT: $x10 = COPY [[C]](s64)692 ; LP64-NEXT: $x11 = COPY [[C1]](s64)693 ; LP64-NEXT: $x12 = COPY [[C2]](s64)694 ; LP64-NEXT: $x13 = COPY [[C3]](s64)695 ; LP64-NEXT: $x14 = COPY [[C4]](s64)696 ; LP64-NEXT: $x15 = COPY [[C5]](s64)697 ; LP64-NEXT: $x16 = COPY [[C6]](s64)698 ; LP64-NEXT: $x17 = COPY [[FRAME_INDEX]](p0)699 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_scalars_exhausted_regs, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit-def $x10700 ; LP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $x2, implicit $x2701 ; LP64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10702 ; LP64-NEXT: $x10 = COPY [[COPY1]](s64)703 ; LP64-NEXT: PseudoRET implicit $x10704 ;705 ; LP64F-LABEL: name: caller_large_scalars_exhausted_regs706 ; LP64F: bb.1 (%ir-block.0):707 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1708 ; LP64F-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2709 ; LP64F-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3710 ; LP64F-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 4711 ; LP64F-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5712 ; LP64F-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 6713 ; LP64F-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 7714 ; LP64F-NEXT: [[C7:%[0-9]+]]:_(s256) = G_CONSTANT i256 8715 ; LP64F-NEXT: [[C8:%[0-9]+]]:_(s64) = G_CONSTANT i64 9716 ; LP64F-NEXT: [[C9:%[0-9]+]]:_(s256) = G_CONSTANT i256 10717 ; LP64F-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $x2, implicit $x2718 ; LP64F-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0719 ; LP64F-NEXT: G_STORE [[C7]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)720 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2721 ; LP64F-NEXT: [[C10:%[0-9]+]]:_(s64) = G_CONSTANT i64 0722 ; LP64F-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C10]](s64)723 ; LP64F-NEXT: G_STORE [[C8]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)724 ; LP64F-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1725 ; LP64F-NEXT: G_STORE [[C9]](s256), [[FRAME_INDEX1]](p0) :: (store (s256) into %stack.1, align 16)726 ; LP64F-NEXT: [[C11:%[0-9]+]]:_(s64) = G_CONSTANT i64 8727 ; LP64F-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C11]](s64)728 ; LP64F-NEXT: G_STORE [[FRAME_INDEX1]](p0), [[PTR_ADD1]](p0) :: (store (p0) into stack + 8)729 ; LP64F-NEXT: $x10 = COPY [[C]](s64)730 ; LP64F-NEXT: $x11 = COPY [[C1]](s64)731 ; LP64F-NEXT: $x12 = COPY [[C2]](s64)732 ; LP64F-NEXT: $x13 = COPY [[C3]](s64)733 ; LP64F-NEXT: $x14 = COPY [[C4]](s64)734 ; LP64F-NEXT: $x15 = COPY [[C5]](s64)735 ; LP64F-NEXT: $x16 = COPY [[C6]](s64)736 ; LP64F-NEXT: $x17 = COPY [[FRAME_INDEX]](p0)737 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_scalars_exhausted_regs, csr_ilp32f_lp64f, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit-def $x10738 ; LP64F-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $x2, implicit $x2739 ; LP64F-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10740 ; LP64F-NEXT: $x10 = COPY [[COPY1]](s64)741 ; LP64F-NEXT: PseudoRET implicit $x10742 ;743 ; LP64D-LABEL: name: caller_large_scalars_exhausted_regs744 ; LP64D: bb.1 (%ir-block.0):745 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1746 ; LP64D-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2747 ; LP64D-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 3748 ; LP64D-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 4749 ; LP64D-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 5750 ; LP64D-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 6751 ; LP64D-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 7752 ; LP64D-NEXT: [[C7:%[0-9]+]]:_(s256) = G_CONSTANT i256 8753 ; LP64D-NEXT: [[C8:%[0-9]+]]:_(s64) = G_CONSTANT i64 9754 ; LP64D-NEXT: [[C9:%[0-9]+]]:_(s256) = G_CONSTANT i256 10755 ; LP64D-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $x2, implicit $x2756 ; LP64D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0757 ; LP64D-NEXT: G_STORE [[C7]](s256), [[FRAME_INDEX]](p0) :: (store (s256) into %stack.0, align 16)758 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2759 ; LP64D-NEXT: [[C10:%[0-9]+]]:_(s64) = G_CONSTANT i64 0760 ; LP64D-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C10]](s64)761 ; LP64D-NEXT: G_STORE [[C8]](s64), [[PTR_ADD]](p0) :: (store (s64) into stack, align 16)762 ; LP64D-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1763 ; LP64D-NEXT: G_STORE [[C9]](s256), [[FRAME_INDEX1]](p0) :: (store (s256) into %stack.1, align 16)764 ; LP64D-NEXT: [[C11:%[0-9]+]]:_(s64) = G_CONSTANT i64 8765 ; LP64D-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C11]](s64)766 ; LP64D-NEXT: G_STORE [[FRAME_INDEX1]](p0), [[PTR_ADD1]](p0) :: (store (p0) into stack + 8)767 ; LP64D-NEXT: $x10 = COPY [[C]](s64)768 ; LP64D-NEXT: $x11 = COPY [[C1]](s64)769 ; LP64D-NEXT: $x12 = COPY [[C2]](s64)770 ; LP64D-NEXT: $x13 = COPY [[C3]](s64)771 ; LP64D-NEXT: $x14 = COPY [[C4]](s64)772 ; LP64D-NEXT: $x15 = COPY [[C5]](s64)773 ; LP64D-NEXT: $x16 = COPY [[C6]](s64)774 ; LP64D-NEXT: $x17 = COPY [[FRAME_INDEX]](p0)775 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_scalars_exhausted_regs, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit $x12, implicit $x13, implicit $x14, implicit $x15, implicit $x16, implicit $x17, implicit-def $x10776 ; LP64D-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $x2, implicit $x2777 ; LP64D-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10778 ; LP64D-NEXT: $x10 = COPY [[COPY1]](s64)779 ; LP64D-NEXT: PseudoRET implicit $x10780 %1 = call i64 @callee_large_scalars_exhausted_regs(781 i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i256 8, i64 9,782 i256 10)783 ret i64 %1784}785 786; Check passing of coerced integer arrays787 788define i64 @callee_small_coerced_struct([2 x i64] %a.coerce) nounwind {789 ; RV64I-LABEL: name: callee_small_coerced_struct790 ; RV64I: bb.1 (%ir-block.0):791 ; RV64I-NEXT: liveins: $x10, $x11792 ; RV64I-NEXT: {{ $}}793 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10794 ; RV64I-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11795 ; RV64I-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[COPY]](s64), [[COPY1]]796 ; RV64I-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[ICMP]](s1)797 ; RV64I-NEXT: $x10 = COPY [[ZEXT]](s64)798 ; RV64I-NEXT: PseudoRET implicit $x10799 %1 = extractvalue [2 x i64] %a.coerce, 0800 %2 = extractvalue [2 x i64] %a.coerce, 1801 %3 = icmp eq i64 %1, %2802 %4 = zext i1 %3 to i64803 ret i64 %4804}805 806define i64 @caller_small_coerced_struct() nounwind {807 ; LP64-LABEL: name: caller_small_coerced_struct808 ; LP64: bb.1 (%ir-block.0):809 ; LP64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1810 ; LP64-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2811 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2812 ; LP64-NEXT: $x10 = COPY [[C]](s64)813 ; LP64-NEXT: $x11 = COPY [[C1]](s64)814 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_small_coerced_struct, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10815 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2816 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10817 ; LP64-NEXT: $x10 = COPY [[COPY]](s64)818 ; LP64-NEXT: PseudoRET implicit $x10819 ;820 ; LP64F-LABEL: name: caller_small_coerced_struct821 ; LP64F: bb.1 (%ir-block.0):822 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1823 ; LP64F-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2824 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2825 ; LP64F-NEXT: $x10 = COPY [[C]](s64)826 ; LP64F-NEXT: $x11 = COPY [[C1]](s64)827 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_small_coerced_struct, csr_ilp32f_lp64f, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10828 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2829 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10830 ; LP64F-NEXT: $x10 = COPY [[COPY]](s64)831 ; LP64F-NEXT: PseudoRET implicit $x10832 ;833 ; LP64D-LABEL: name: caller_small_coerced_struct834 ; LP64D: bb.1 (%ir-block.0):835 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1836 ; LP64D-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2837 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2838 ; LP64D-NEXT: $x10 = COPY [[C]](s64)839 ; LP64D-NEXT: $x11 = COPY [[C1]](s64)840 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_small_coerced_struct, csr_ilp32d_lp64d, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10841 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2842 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10843 ; LP64D-NEXT: $x10 = COPY [[COPY]](s64)844 ; LP64D-NEXT: PseudoRET implicit $x10845 %1 = call i64 @callee_small_coerced_struct([2 x i64] [i64 1, i64 2])846 ret i64 %1847}848 849; Check return of 2x xlen scalars850 851define i128 @callee_small_scalar_ret() nounwind {852 ; RV64I-LABEL: name: callee_small_scalar_ret853 ; RV64I: bb.1 (%ir-block.0):854 ; RV64I-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 -1855 ; RV64I-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C]](s128)856 ; RV64I-NEXT: $x10 = COPY [[UV]](s64)857 ; RV64I-NEXT: $x11 = COPY [[UV1]](s64)858 ; RV64I-NEXT: PseudoRET implicit $x10, implicit $x11859 ret i128 -1860}861 862define i64 @caller_small_scalar_ret() nounwind {863 ; LP64-LABEL: name: caller_small_scalar_ret864 ; LP64: bb.1 (%ir-block.0):865 ; LP64-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 -2866 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2867 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_small_scalar_ret, csr_ilp32_lp64, implicit-def $x1, implicit-def $x10, implicit-def $x11868 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2869 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10870 ; LP64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11871 ; LP64-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)872 ; LP64-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[C]](s128), [[MV]]873 ; LP64-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[ICMP]](s1)874 ; LP64-NEXT: $x10 = COPY [[ZEXT]](s64)875 ; LP64-NEXT: PseudoRET implicit $x10876 ;877 ; LP64F-LABEL: name: caller_small_scalar_ret878 ; LP64F: bb.1 (%ir-block.0):879 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 -2880 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2881 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_small_scalar_ret, csr_ilp32f_lp64f, implicit-def $x1, implicit-def $x10, implicit-def $x11882 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2883 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10884 ; LP64F-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11885 ; LP64F-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)886 ; LP64F-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[C]](s128), [[MV]]887 ; LP64F-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[ICMP]](s1)888 ; LP64F-NEXT: $x10 = COPY [[ZEXT]](s64)889 ; LP64F-NEXT: PseudoRET implicit $x10890 ;891 ; LP64D-LABEL: name: caller_small_scalar_ret892 ; LP64D: bb.1 (%ir-block.0):893 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 -2894 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2895 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_small_scalar_ret, csr_ilp32d_lp64d, implicit-def $x1, implicit-def $x10, implicit-def $x11896 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2897 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10898 ; LP64D-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11899 ; LP64D-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)900 ; LP64D-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[C]](s128), [[MV]]901 ; LP64D-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[ICMP]](s1)902 ; LP64D-NEXT: $x10 = COPY [[ZEXT]](s64)903 ; LP64D-NEXT: PseudoRET implicit $x10904 %1 = call i128 @callee_small_scalar_ret()905 %2 = icmp eq i128 -2, %1906 %3 = zext i1 %2 to i64907 ret i64 %3908}909 910define fp128 @callee_fp128_ret() nounwind {911 ; RV64I-LABEL: name: callee_fp128_ret912 ; RV64I: bb.1 (%ir-block.0):913 ; RV64I-NEXT: [[C:%[0-9]+]]:_(s128) = G_FCONSTANT fp128 0xL00000000000000007FFF000000000000914 ; RV64I-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[C]](s128)915 ; RV64I-NEXT: $x10 = COPY [[UV]](s64)916 ; RV64I-NEXT: $x11 = COPY [[UV1]](s64)917 ; RV64I-NEXT: PseudoRET implicit $x10, implicit $x11918 ret fp128 0xL00000000000000007FFF000000000000919}920 921define void @caller_fp128_ret() nounwind {922 ; LP64-LABEL: name: caller_fp128_ret923 ; LP64: bb.1 (%ir-block.0):924 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2925 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_fp128_ret, csr_ilp32_lp64, implicit-def $x1, implicit-def $x10, implicit-def $x11926 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2927 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10928 ; LP64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11929 ; LP64-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)930 ; LP64-NEXT: PseudoRET931 ;932 ; LP64F-LABEL: name: caller_fp128_ret933 ; LP64F: bb.1 (%ir-block.0):934 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2935 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_fp128_ret, csr_ilp32f_lp64f, implicit-def $x1, implicit-def $x10, implicit-def $x11936 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2937 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10938 ; LP64F-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11939 ; LP64F-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)940 ; LP64F-NEXT: PseudoRET941 ;942 ; LP64D-LABEL: name: caller_fp128_ret943 ; LP64D: bb.1 (%ir-block.0):944 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2945 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_fp128_ret, csr_ilp32d_lp64d, implicit-def $x1, implicit-def $x10, implicit-def $x11946 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2947 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10948 ; LP64D-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11949 ; LP64D-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[COPY1]](s64)950 ; LP64D-NEXT: PseudoRET951 %1 = call fp128 @callee_fp128_ret()952 ret void953}954 955; Check return of 2x xlen structs956 957%struct.small = type { i64, ptr }958 959define %struct.small @callee_small_struct_ret() nounwind {960 ; RV64I-LABEL: name: callee_small_struct_ret961 ; RV64I: bb.1 (%ir-block.0):962 ; RV64I-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1963 ; RV64I-NEXT: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 0964 ; RV64I-NEXT: $x10 = COPY [[C]](s64)965 ; RV64I-NEXT: $x11 = COPY [[C1]](p0)966 ; RV64I-NEXT: PseudoRET implicit $x10, implicit $x11967 ret %struct.small { i64 1, ptr null }968}969 970define i64 @caller_small_struct_ret() nounwind {971 ; LP64-LABEL: name: caller_small_struct_ret972 ; LP64: bb.1 (%ir-block.0):973 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2974 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_small_struct_ret, csr_ilp32_lp64, implicit-def $x1, implicit-def $x10, implicit-def $x11975 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2976 ; LP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10977 ; LP64-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x11978 ; LP64-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[COPY1]](p0)979 ; LP64-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[PTRTOINT]]980 ; LP64-NEXT: $x10 = COPY [[ADD]](s64)981 ; LP64-NEXT: PseudoRET implicit $x10982 ;983 ; LP64F-LABEL: name: caller_small_struct_ret984 ; LP64F: bb.1 (%ir-block.0):985 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2986 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_small_struct_ret, csr_ilp32f_lp64f, implicit-def $x1, implicit-def $x10, implicit-def $x11987 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2988 ; LP64F-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10989 ; LP64F-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x11990 ; LP64F-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[COPY1]](p0)991 ; LP64F-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[PTRTOINT]]992 ; LP64F-NEXT: $x10 = COPY [[ADD]](s64)993 ; LP64F-NEXT: PseudoRET implicit $x10994 ;995 ; LP64D-LABEL: name: caller_small_struct_ret996 ; LP64D: bb.1 (%ir-block.0):997 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2998 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_small_struct_ret, csr_ilp32d_lp64d, implicit-def $x1, implicit-def $x10, implicit-def $x11999 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21000 ; LP64D-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x101001 ; LP64D-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x111002 ; LP64D-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[COPY1]](p0)1003 ; LP64D-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[PTRTOINT]]1004 ; LP64D-NEXT: $x10 = COPY [[ADD]](s64)1005 ; LP64D-NEXT: PseudoRET implicit $x101006 %1 = call %struct.small @callee_small_struct_ret()1007 %2 = extractvalue %struct.small %1, 01008 %3 = extractvalue %struct.small %1, 11009 %4 = ptrtoint ptr %3 to i641010 %5 = add i64 %2, %41011 ret i64 %51012}1013 1014; Check return of >2x xlen scalars1015 1016define i256 @callee_large_scalar_ret() nounwind {1017 ; RV64I-LABEL: name: callee_large_scalar_ret1018 ; RV64I: bb.1 (%ir-block.0):1019 ; RV64I-NEXT: liveins: $x101020 ; RV64I-NEXT: {{ $}}1021 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x101022 ; RV64I-NEXT: [[C:%[0-9]+]]:_(s256) = G_CONSTANT i256 -1234567891023 ; RV64I-NEXT: G_STORE [[C]](s256), [[COPY]](p0) :: (store (s256), align 16)1024 ; RV64I-NEXT: PseudoRET1025 ret i256 -1234567891026}1027 1028define void @caller_large_scalar_ret() nounwind {1029 ; LP64-LABEL: name: caller_large_scalar_ret1030 ; LP64: bb.1 (%ir-block.0):1031 ; LP64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.01032 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x21033 ; LP64-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)1034 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_scalar_ret, csr_ilp32_lp64, implicit-def $x1, implicit $x101035 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21036 ; LP64-NEXT: [[LOAD:%[0-9]+]]:_(s256) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s256) from %stack.0, align 16)1037 ; LP64-NEXT: PseudoRET1038 ;1039 ; LP64F-LABEL: name: caller_large_scalar_ret1040 ; LP64F: bb.1 (%ir-block.0):1041 ; LP64F-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.01042 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x21043 ; LP64F-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)1044 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_scalar_ret, csr_ilp32f_lp64f, implicit-def $x1, implicit $x101045 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21046 ; LP64F-NEXT: [[LOAD:%[0-9]+]]:_(s256) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s256) from %stack.0, align 16)1047 ; LP64F-NEXT: PseudoRET1048 ;1049 ; LP64D-LABEL: name: caller_large_scalar_ret1050 ; LP64D: bb.1 (%ir-block.0):1051 ; LP64D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.01052 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x21053 ; LP64D-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)1054 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_scalar_ret, csr_ilp32d_lp64d, implicit-def $x1, implicit $x101055 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21056 ; LP64D-NEXT: [[LOAD:%[0-9]+]]:_(s256) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s256) from %stack.0, align 16)1057 ; LP64D-NEXT: PseudoRET1058 %1 = call i256 @callee_large_scalar_ret()1059 ret void1060}1061 1062; Check return of >2x xlen structs1063 1064%struct.large = type { i64, i64, i64, i64 }1065 1066define void @callee_large_struct_ret(ptr noalias sret(%struct.large) %agg.result) nounwind {1067 ; RV64I-LABEL: name: callee_large_struct_ret1068 ; RV64I: bb.1 (%ir-block.0):1069 ; RV64I-NEXT: liveins: $x101070 ; RV64I-NEXT: {{ $}}1071 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x101072 ; RV64I-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 11073 ; RV64I-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 21074 ; RV64I-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 31075 ; RV64I-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 41076 ; RV64I-NEXT: G_STORE [[C]](s64), [[COPY]](p0) :: (store (s64) into %ir.agg.result, align 4)1077 ; RV64I-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 81078 ; RV64I-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = nuw nusw inbounds G_PTR_ADD [[COPY]], [[C4]](s64)1079 ; RV64I-NEXT: G_STORE [[C1]](s64), [[PTR_ADD]](p0) :: (store (s64) into %ir.b, align 4)1080 ; RV64I-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 161081 ; RV64I-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = nuw nusw inbounds G_PTR_ADD [[COPY]], [[C5]](s64)1082 ; RV64I-NEXT: G_STORE [[C2]](s64), [[PTR_ADD1]](p0) :: (store (s64) into %ir.c, align 4)1083 ; RV64I-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 241084 ; RV64I-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = nuw nusw inbounds G_PTR_ADD [[COPY]], [[C6]](s64)1085 ; RV64I-NEXT: G_STORE [[C3]](s64), [[PTR_ADD2]](p0) :: (store (s64) into %ir.d, align 4)1086 ; RV64I-NEXT: PseudoRET1087 store i64 1, ptr %agg.result, align 41088 %b = getelementptr inbounds %struct.large, ptr %agg.result, i64 0, i32 11089 store i64 2, ptr %b, align 41090 %c = getelementptr inbounds %struct.large, ptr %agg.result, i64 0, i32 21091 store i64 3, ptr %c, align 41092 %d = getelementptr inbounds %struct.large, ptr %agg.result, i64 0, i32 31093 store i64 4, ptr %d, align 41094 ret void1095}1096 1097define i64 @caller_large_struct_ret() nounwind {1098 ; LP64-LABEL: name: caller_large_struct_ret1099 ; LP64: bb.1 (%ir-block.0):1100 ; LP64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.01101 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x21102 ; LP64-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)1103 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_struct_ret, csr_ilp32_lp64, implicit-def $x1, implicit $x101104 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21105 ; LP64-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (dereferenceable load (s64) from %ir.1)1106 ; LP64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 241107 ; LP64-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = nuw nusw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C]](s64)1108 ; LP64-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[PTR_ADD]](p0) :: (dereferenceable load (s64) from %ir.3)1109 ; LP64-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[LOAD]], [[LOAD1]]1110 ; LP64-NEXT: $x10 = COPY [[ADD]](s64)1111 ; LP64-NEXT: PseudoRET implicit $x101112 ;1113 ; LP64F-LABEL: name: caller_large_struct_ret1114 ; LP64F: bb.1 (%ir-block.0):1115 ; LP64F-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.01116 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x21117 ; LP64F-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)1118 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_struct_ret, csr_ilp32f_lp64f, implicit-def $x1, implicit $x101119 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21120 ; LP64F-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (dereferenceable load (s64) from %ir.1)1121 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 241122 ; LP64F-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = nuw nusw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C]](s64)1123 ; LP64F-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[PTR_ADD]](p0) :: (dereferenceable load (s64) from %ir.3)1124 ; LP64F-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[LOAD]], [[LOAD1]]1125 ; LP64F-NEXT: $x10 = COPY [[ADD]](s64)1126 ; LP64F-NEXT: PseudoRET implicit $x101127 ;1128 ; LP64D-LABEL: name: caller_large_struct_ret1129 ; LP64D: bb.1 (%ir-block.0):1130 ; LP64D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.01131 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x21132 ; LP64D-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)1133 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_struct_ret, csr_ilp32d_lp64d, implicit-def $x1, implicit $x101134 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21135 ; LP64D-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (dereferenceable load (s64) from %ir.1)1136 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 241137 ; LP64D-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = nuw nusw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C]](s64)1138 ; LP64D-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[PTR_ADD]](p0) :: (dereferenceable load (s64) from %ir.3)1139 ; LP64D-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[LOAD]], [[LOAD1]]1140 ; LP64D-NEXT: $x10 = COPY [[ADD]](s64)1141 ; LP64D-NEXT: PseudoRET implicit $x101142 %1 = alloca %struct.large1143 call void @callee_large_struct_ret(ptr sret(%struct.large) %1)1144 %2 = load i64, ptr %11145 %3 = getelementptr inbounds %struct.large, ptr %1, i64 0, i32 31146 %4 = load i64, ptr %31147 %5 = add i64 %2, %41148 ret i64 %51149}1150 1151%struct.large2 = type { i64, i128, double, i64 }1152 1153define %struct.large2 @callee_large_struct_ret2() nounwind {1154 ; RV64I-LABEL: name: callee_large_struct_ret21155 ; RV64I: bb.1 (%ir-block.0):1156 ; RV64I-NEXT: liveins: $x101157 ; RV64I-NEXT: {{ $}}1158 ; RV64I-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x101159 ; RV64I-NEXT: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF1160 ; RV64I-NEXT: [[DEF1:%[0-9]+]]:_(s128) = G_IMPLICIT_DEF1161 ; RV64I-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY [[DEF]](s64)1162 ; RV64I-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 11163 ; RV64I-NEXT: [[C1:%[0-9]+]]:_(s128) = G_CONSTANT i128 21164 ; RV64I-NEXT: [[C2:%[0-9]+]]:_(s64) = G_FCONSTANT double 3.000000e+001165 ; RV64I-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 41166 ; RV64I-NEXT: G_STORE [[C]](s64), [[COPY]](p0) :: (store (s64), align 16)1167 ; RV64I-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 161168 ; RV64I-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[COPY]], [[C4]](s64)1169 ; RV64I-NEXT: G_STORE [[C1]](s128), [[PTR_ADD]](p0) :: (store (s128))1170 ; RV64I-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 321171 ; RV64I-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[COPY]], [[C5]](s64)1172 ; RV64I-NEXT: G_STORE [[C2]](s64), [[PTR_ADD1]](p0) :: (store (s64), align 16)1173 ; RV64I-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 401174 ; RV64I-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[COPY]], [[C6]](s64)1175 ; RV64I-NEXT: G_STORE [[C3]](s64), [[PTR_ADD2]](p0) :: (store (s64))1176 ; RV64I-NEXT: PseudoRET1177 %a = insertvalue %struct.large2 poison, i64 1, 01178 %b = insertvalue %struct.large2 %a, i128 2, 11179 %c = insertvalue %struct.large2 %b, double 3.0, 21180 %d = insertvalue %struct.large2 %c, i64 4, 31181 ret %struct.large2 %d1182}1183 1184define i64 @caller_large_struct_ret2() nounwind {1185 ; LP64-LABEL: name: caller_large_struct_ret21186 ; LP64: bb.1 (%ir-block.0):1187 ; LP64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.01188 ; LP64-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x21189 ; LP64-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)1190 ; LP64-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_struct_ret, csr_ilp32_lp64, implicit-def $x1, implicit $x101191 ; LP64-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21192 ; LP64-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %stack.0, align 16)1193 ; LP64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 161194 ; LP64-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C]](s64)1195 ; LP64-NEXT: [[LOAD1:%[0-9]+]]:_(s128) = G_LOAD [[PTR_ADD]](p0) :: (load (s128) from %stack.0)1196 ; LP64-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 321197 ; LP64-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C1]](s64)1198 ; LP64-NEXT: [[LOAD2:%[0-9]+]]:_(s64) = G_LOAD [[PTR_ADD1]](p0) :: (load (s64) from %stack.0, align 16)1199 ; LP64-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 401200 ; LP64-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C2]](s64)1201 ; LP64-NEXT: [[LOAD3:%[0-9]+]]:_(s64) = G_LOAD [[PTR_ADD2]](p0) :: (load (s64) from %stack.0)1202 ; LP64-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[LOAD]], [[LOAD3]]1203 ; LP64-NEXT: $x10 = COPY [[ADD]](s64)1204 ; LP64-NEXT: PseudoRET implicit $x101205 ;1206 ; LP64F-LABEL: name: caller_large_struct_ret21207 ; LP64F: bb.1 (%ir-block.0):1208 ; LP64F-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.01209 ; LP64F-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x21210 ; LP64F-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)1211 ; LP64F-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_struct_ret, csr_ilp32f_lp64f, implicit-def $x1, implicit $x101212 ; LP64F-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21213 ; LP64F-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %stack.0, align 16)1214 ; LP64F-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 161215 ; LP64F-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C]](s64)1216 ; LP64F-NEXT: [[LOAD1:%[0-9]+]]:_(s128) = G_LOAD [[PTR_ADD]](p0) :: (load (s128) from %stack.0)1217 ; LP64F-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 321218 ; LP64F-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C1]](s64)1219 ; LP64F-NEXT: [[LOAD2:%[0-9]+]]:_(s64) = G_LOAD [[PTR_ADD1]](p0) :: (load (s64) from %stack.0, align 16)1220 ; LP64F-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 401221 ; LP64F-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C2]](s64)1222 ; LP64F-NEXT: [[LOAD3:%[0-9]+]]:_(s64) = G_LOAD [[PTR_ADD2]](p0) :: (load (s64) from %stack.0)1223 ; LP64F-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[LOAD]], [[LOAD3]]1224 ; LP64F-NEXT: $x10 = COPY [[ADD]](s64)1225 ; LP64F-NEXT: PseudoRET implicit $x101226 ;1227 ; LP64D-LABEL: name: caller_large_struct_ret21228 ; LP64D: bb.1 (%ir-block.0):1229 ; LP64D-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.01230 ; LP64D-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x21231 ; LP64D-NEXT: $x10 = COPY [[FRAME_INDEX]](p0)1232 ; LP64D-NEXT: PseudoCALL target-flags(riscv-call) @callee_large_struct_ret, csr_ilp32d_lp64d, implicit-def $x1, implicit $x101233 ; LP64D-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x21234 ; LP64D-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %stack.0, align 16)1235 ; LP64D-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 161236 ; LP64D-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C]](s64)1237 ; LP64D-NEXT: [[LOAD1:%[0-9]+]]:_(s128) = G_LOAD [[PTR_ADD]](p0) :: (load (s128) from %stack.0)1238 ; LP64D-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 321239 ; LP64D-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C1]](s64)1240 ; LP64D-NEXT: [[LOAD2:%[0-9]+]]:_(s64) = G_LOAD [[PTR_ADD1]](p0) :: (load (s64) from %stack.0, align 16)1241 ; LP64D-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 401242 ; LP64D-NEXT: [[PTR_ADD2:%[0-9]+]]:_(p0) = nuw inbounds G_PTR_ADD [[FRAME_INDEX]], [[C2]](s64)1243 ; LP64D-NEXT: [[LOAD3:%[0-9]+]]:_(s64) = G_LOAD [[PTR_ADD2]](p0) :: (load (s64) from %stack.0)1244 ; LP64D-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[LOAD]], [[LOAD3]]1245 ; LP64D-NEXT: $x10 = COPY [[ADD]](s64)1246 ; LP64D-NEXT: PseudoRET implicit $x101247 %1 = call %struct.large2 @callee_large_struct_ret()1248 %2 = extractvalue %struct.large2 %1, 01249 %3 = extractvalue %struct.large2 %1, 31250 %4 = add i64 %2, %31251 ret i64 %41252}1253