xref: /llvm-project/llvm/test/CodeGen/AMDGPU/expand-variadic-call.ll (revision 14705a912f6296700cef4d2aa7eb100f71dfbd0a)
18516f54eSJon Chesterfield; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p --function-signature
28516f54eSJon Chesterfield; RUN: opt -S --passes=expand-variadics --expand-variadics-override=lowering < %s | FileCheck %s
38516f54eSJon Chesterfieldtarget datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-p9:192:256:256:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9"
48516f54eSJon Chesterfieldtarget triple = "amdgcn-amd-amdhsa"
58516f54eSJon Chesterfield
68516f54eSJon Chesterfield; Check the variables are lowered to the locations this target expects
78516f54eSJon Chesterfield
88516f54eSJon Chesterfield; The types show the call frames
98516f54eSJon Chesterfield; CHECK: %single_i32.vararg = type <{ i32 }>
108516f54eSJon Chesterfield; CHECK: %single_double.vararg = type <{ double }>
118516f54eSJon Chesterfield; CHECK: %single_v4f32.vararg = type <{ <4 x float> }>
128516f54eSJon Chesterfield; CHECK: %single_v8f32.vararg = type <{ <8 x float> }>
138516f54eSJon Chesterfield; CHECK: %single_v16f32.vararg = type <{ <16 x float> }>
148516f54eSJon Chesterfield; CHECK: %single_v32f32.vararg = type <{ <32 x float> }>
158516f54eSJon Chesterfield; CHECK: %i32_double.vararg = type <{ i32, double }>
168516f54eSJon Chesterfield; CHECK: %double_i32.vararg = type <{ double, i32 }>
178516f54eSJon Chesterfield; CHECK: %i32_libcS.vararg = type <{ i32, %struct.libcS }>
188516f54eSJon Chesterfield; CHECK: %libcS_i32.vararg = type <{ %struct.libcS, i32 }>
198516f54eSJon Chesterfield; CHECK: %i32_v4f32.vararg = type <{ i32, <4 x float> }>
208516f54eSJon Chesterfield; CHECK: %v4f32_i32.vararg = type <{ <4 x float>, i32 }>
218516f54eSJon Chesterfield; CHECK: %i32_v8f32.vararg = type <{ i32, <8 x float> }>
228516f54eSJon Chesterfield; CHECK: %v8f32_i32.vararg = type <{ <8 x float>, i32 }>
238516f54eSJon Chesterfield; CHECK: %i32_v16f32.vararg = type <{ i32, <16 x float> }>
248516f54eSJon Chesterfield; CHECK: %v16f32_i32.vararg = type <{ <16 x float>, i32 }>
258516f54eSJon Chesterfield; CHECK: %i32_v32f32.vararg = type <{ i32, <32 x float> }>
268516f54eSJon Chesterfield; CHECK: %v32f32_i32.vararg = type <{ <32 x float>, i32 }>
278516f54eSJon Chesterfield; CHECK: %fptr_single_i32.vararg = type <{ i32 }>
288516f54eSJon Chesterfield; CHECK: %fptr_libcS.vararg = type <{ %struct.libcS }>
298516f54eSJon Chesterfield
308516f54eSJon Chesterfield%struct.libcS = type { i8, i16, i32, i64, float, double }
318516f54eSJon Chesterfield
328516f54eSJon Chesterfield@vararg_ptr = hidden addrspace(1) global ptr @vararg, align 8
338516f54eSJon Chesterfield
348516f54eSJon Chesterfielddefine hidden void @copy(ptr noundef %va) {
358516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@copy(ptr noundef %va) {
368516f54eSJon Chesterfield; CHECK-NEXT:  entry:
378516f54eSJon Chesterfield; CHECK-NEXT:    %va.addr = alloca ptr, align 8, addrspace(5)
388516f54eSJon Chesterfield; CHECK-NEXT:    %cp = alloca ptr, align 8, addrspace(5)
398516f54eSJon Chesterfield; CHECK-NEXT:    %va.addr.ascast = addrspacecast ptr addrspace(5) %va.addr to ptr
408516f54eSJon Chesterfield; CHECK-NEXT:    %cp.ascast = addrspacecast ptr addrspace(5) %cp to ptr
418516f54eSJon Chesterfield; CHECK-NEXT:    store ptr %va, ptr addrspace(5) %va.addr, align 8
428516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 8, ptr addrspace(5) %cp)
438516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr %cp.ascast, ptr %va.addr.ascast, i32 8, i1 false)
448516f54eSJon Chesterfield; CHECK-NEXT:    %0 = load ptr, ptr addrspace(5) %cp, align 8
458516f54eSJon Chesterfield; CHECK-NEXT:    call void @valist(ptr noundef %0)
468516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 8, ptr addrspace(5) %cp)
478516f54eSJon Chesterfield; CHECK-NEXT:    ret void
488516f54eSJon Chesterfield;
498516f54eSJon Chesterfieldentry:
508516f54eSJon Chesterfield  %va.addr = alloca ptr, align 8, addrspace(5)
518516f54eSJon Chesterfield  %cp = alloca ptr, align 8, addrspace(5)
528516f54eSJon Chesterfield  %va.addr.ascast = addrspacecast ptr addrspace(5) %va.addr to ptr
538516f54eSJon Chesterfield  %cp.ascast = addrspacecast ptr addrspace(5) %cp to ptr
548516f54eSJon Chesterfield  store ptr %va, ptr addrspace(5) %va.addr, align 8
558516f54eSJon Chesterfield  call void @llvm.lifetime.start.p5(i64 8, ptr addrspace(5) %cp)
568516f54eSJon Chesterfield  call void @llvm.va_copy.p0(ptr %cp.ascast, ptr nonnull %va.addr.ascast)
578516f54eSJon Chesterfield  %0 = load ptr, ptr addrspace(5) %cp, align 8
588516f54eSJon Chesterfield  call void @valist(ptr noundef %0)
598516f54eSJon Chesterfield  call void @llvm.lifetime.end.p5(i64 8, ptr addrspace(5) %cp)
608516f54eSJon Chesterfield  ret void
618516f54eSJon Chesterfield}
628516f54eSJon Chesterfield
638516f54eSJon Chesterfielddeclare void @llvm.lifetime.start.p5(i64 immarg, ptr addrspace(5) nocapture)
648516f54eSJon Chesterfield
658516f54eSJon Chesterfielddeclare void @llvm.va_copy.p0(ptr, ptr)
668516f54eSJon Chesterfield
678516f54eSJon Chesterfielddeclare hidden void @valist(ptr noundef)
688516f54eSJon Chesterfield
698516f54eSJon Chesterfielddeclare void @llvm.lifetime.end.p5(i64 immarg, ptr addrspace(5) nocapture)
708516f54eSJon Chesterfield
718516f54eSJon Chesterfielddefine hidden void @start_once(...) {
728516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@start_once(ptr %varargs) {
738516f54eSJon Chesterfield; CHECK-NEXT:  entry:
748516f54eSJon Chesterfield; CHECK-NEXT:    %s = alloca ptr, align 8, addrspace(5)
758516f54eSJon Chesterfield; CHECK-NEXT:    %s.ascast = addrspacecast ptr addrspace(5) %s to ptr
768516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 8, ptr addrspace(5) %s)
778516f54eSJon Chesterfield; CHECK-NEXT:    store ptr %varargs, ptr %s.ascast, align 8
788516f54eSJon Chesterfield; CHECK-NEXT:    %0 = load ptr, ptr addrspace(5) %s, align 8
798516f54eSJon Chesterfield; CHECK-NEXT:    call void @valist(ptr noundef %0)
808516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 8, ptr addrspace(5) %s)
818516f54eSJon Chesterfield; CHECK-NEXT:    ret void
828516f54eSJon Chesterfield;
838516f54eSJon Chesterfieldentry:
848516f54eSJon Chesterfield  %s = alloca ptr, align 8, addrspace(5)
858516f54eSJon Chesterfield  %s.ascast = addrspacecast ptr addrspace(5) %s to ptr
868516f54eSJon Chesterfield  call void @llvm.lifetime.start.p5(i64 8, ptr addrspace(5) %s)
878516f54eSJon Chesterfield  call void @llvm.va_start.p0(ptr %s.ascast)
888516f54eSJon Chesterfield  %0 = load ptr, ptr addrspace(5) %s, align 8
898516f54eSJon Chesterfield  call void @valist(ptr noundef %0)
908516f54eSJon Chesterfield  call void @llvm.va_end.p0(ptr %s.ascast)
918516f54eSJon Chesterfield  call void @llvm.lifetime.end.p5(i64 8, ptr addrspace(5) %s)
928516f54eSJon Chesterfield  ret void
938516f54eSJon Chesterfield}
948516f54eSJon Chesterfield
958516f54eSJon Chesterfielddeclare void @llvm.va_start.p0(ptr)
968516f54eSJon Chesterfield
978516f54eSJon Chesterfielddeclare void @llvm.va_end.p0(ptr)
988516f54eSJon Chesterfield
998516f54eSJon Chesterfielddefine hidden void @start_twice(...) {
1008516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@start_twice(ptr %varargs) {
1018516f54eSJon Chesterfield; CHECK-NEXT:  entry:
1028516f54eSJon Chesterfield; CHECK-NEXT:    %s0 = alloca ptr, align 8, addrspace(5)
1038516f54eSJon Chesterfield; CHECK-NEXT:    %s1 = alloca ptr, align 8, addrspace(5)
1048516f54eSJon Chesterfield; CHECK-NEXT:    %s0.ascast = addrspacecast ptr addrspace(5) %s0 to ptr
1058516f54eSJon Chesterfield; CHECK-NEXT:    %s1.ascast = addrspacecast ptr addrspace(5) %s1 to ptr
1068516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 8, ptr addrspace(5) %s0)
1078516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 8, ptr addrspace(5) %s1)
1088516f54eSJon Chesterfield; CHECK-NEXT:    store ptr %varargs, ptr %s0.ascast, align 8
1098516f54eSJon Chesterfield; CHECK-NEXT:    %0 = load ptr, ptr addrspace(5) %s0, align 8
1108516f54eSJon Chesterfield; CHECK-NEXT:    call void @valist(ptr noundef %0)
1118516f54eSJon Chesterfield; CHECK-NEXT:    store ptr %varargs, ptr %s1.ascast, align 8
1128516f54eSJon Chesterfield; CHECK-NEXT:    %1 = load ptr, ptr addrspace(5) %s1, align 8
1138516f54eSJon Chesterfield; CHECK-NEXT:    call void @valist(ptr noundef %1)
1148516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 8, ptr addrspace(5) %s1)
1158516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 8, ptr addrspace(5) %s0)
1168516f54eSJon Chesterfield; CHECK-NEXT:    ret void
1178516f54eSJon Chesterfield;
1188516f54eSJon Chesterfieldentry:
1198516f54eSJon Chesterfield  %s0 = alloca ptr, align 8, addrspace(5)
1208516f54eSJon Chesterfield  %s1 = alloca ptr, align 8, addrspace(5)
1218516f54eSJon Chesterfield  %s0.ascast = addrspacecast ptr addrspace(5) %s0 to ptr
1228516f54eSJon Chesterfield  %s1.ascast = addrspacecast ptr addrspace(5) %s1 to ptr
1238516f54eSJon Chesterfield  call void @llvm.lifetime.start.p5(i64 8, ptr addrspace(5) %s0)
1248516f54eSJon Chesterfield  call void @llvm.lifetime.start.p5(i64 8, ptr addrspace(5) %s1)
1258516f54eSJon Chesterfield  call void @llvm.va_start.p0(ptr %s0.ascast)
1268516f54eSJon Chesterfield  %0 = load ptr, ptr addrspace(5) %s0, align 8
1278516f54eSJon Chesterfield  call void @valist(ptr noundef %0)
1288516f54eSJon Chesterfield  call void @llvm.va_end.p0(ptr %s0.ascast)
1298516f54eSJon Chesterfield  call void @llvm.va_start.p0(ptr %s1.ascast)
1308516f54eSJon Chesterfield  %1 = load ptr, ptr addrspace(5) %s1, align 8
1318516f54eSJon Chesterfield  call void @valist(ptr noundef %1)
1328516f54eSJon Chesterfield  call void @llvm.va_end.p0(ptr %s1.ascast)
1338516f54eSJon Chesterfield  call void @llvm.lifetime.end.p5(i64 8, ptr addrspace(5) %s1)
1348516f54eSJon Chesterfield  call void @llvm.lifetime.end.p5(i64 8, ptr addrspace(5) %s0)
1358516f54eSJon Chesterfield  ret void
1368516f54eSJon Chesterfield}
1378516f54eSJon Chesterfield
1388516f54eSJon Chesterfielddefine hidden void @single_i32(i32 noundef %x) {
1398516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@single_i32(i32 noundef %x) {
1408516f54eSJon Chesterfield; CHECK-NEXT:  entry:
1418516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %single_i32.vararg, align 4, addrspace(5)
1428516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) %vararg_buffer)
143*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
1448516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4
1458516f54eSJon Chesterfield; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
1468516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %1)
1478516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 4, ptr addrspace(5) %vararg_buffer)
1488516f54eSJon Chesterfield; CHECK-NEXT:    ret void
1498516f54eSJon Chesterfield;
1508516f54eSJon Chesterfieldentry:
1518516f54eSJon Chesterfield  tail call void (...) @vararg(i32 noundef %x)
1528516f54eSJon Chesterfield  ret void
1538516f54eSJon Chesterfield}
1548516f54eSJon Chesterfield
1558516f54eSJon Chesterfielddeclare hidden void @vararg(...)
1568516f54eSJon Chesterfield
1578516f54eSJon Chesterfielddefine hidden void @single_double(double noundef %x) {
1588516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@single_double(double noundef %x) {
1598516f54eSJon Chesterfield; CHECK-NEXT:  entry:
1608516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %single_double.vararg, align 4, addrspace(5)
1618516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 8, ptr addrspace(5) %vararg_buffer)
162*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_double.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
1638516f54eSJon Chesterfield; CHECK-NEXT:    store double %x, ptr addrspace(5) %0, align 8
1648516f54eSJon Chesterfield; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
1658516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %1)
1668516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 8, ptr addrspace(5) %vararg_buffer)
1678516f54eSJon Chesterfield; CHECK-NEXT:    ret void
1688516f54eSJon Chesterfield;
1698516f54eSJon Chesterfieldentry:
1708516f54eSJon Chesterfield  tail call void (...) @vararg(double noundef %x)
1718516f54eSJon Chesterfield  ret void
1728516f54eSJon Chesterfield}
1738516f54eSJon Chesterfield
1748516f54eSJon Chesterfielddefine hidden void @single_v4f32(<4 x float> noundef %x) {
1758516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@single_v4f32(<4 x float> noundef %x) {
1768516f54eSJon Chesterfield; CHECK-NEXT:  entry:
1778516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %single_v4f32.vararg, align 4, addrspace(5)
1788516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 16, ptr addrspace(5) %vararg_buffer)
179*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_v4f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
1808516f54eSJon Chesterfield; CHECK-NEXT:    store <4 x float> %x, ptr addrspace(5) %0, align 16
1818516f54eSJon Chesterfield; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
1828516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %1)
1838516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 16, ptr addrspace(5) %vararg_buffer)
1848516f54eSJon Chesterfield; CHECK-NEXT:    ret void
1858516f54eSJon Chesterfield;
1868516f54eSJon Chesterfieldentry:
1878516f54eSJon Chesterfield  tail call void (...) @vararg(<4 x float> noundef %x)
1888516f54eSJon Chesterfield  ret void
1898516f54eSJon Chesterfield}
1908516f54eSJon Chesterfield
1918516f54eSJon Chesterfielddefine hidden void @single_v8f32(<8 x float> noundef %x) {
1928516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@single_v8f32(<8 x float> noundef %x) {
1938516f54eSJon Chesterfield; CHECK-NEXT:  entry:
1948516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %single_v8f32.vararg, align 4, addrspace(5)
1958516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 32, ptr addrspace(5) %vararg_buffer)
196*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_v8f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
1978516f54eSJon Chesterfield; CHECK-NEXT:    store <8 x float> %x, ptr addrspace(5) %0, align 32
1988516f54eSJon Chesterfield; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
1998516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %1)
2008516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 32, ptr addrspace(5) %vararg_buffer)
2018516f54eSJon Chesterfield; CHECK-NEXT:    ret void
2028516f54eSJon Chesterfield;
2038516f54eSJon Chesterfieldentry:
2048516f54eSJon Chesterfield  tail call void (...) @vararg(<8 x float> noundef %x)
2058516f54eSJon Chesterfield  ret void
2068516f54eSJon Chesterfield}
2078516f54eSJon Chesterfield
2088516f54eSJon Chesterfielddefine hidden void @single_v16f32(<16 x float> noundef %x) {
2098516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@single_v16f32(<16 x float> noundef %x) {
2108516f54eSJon Chesterfield; CHECK-NEXT:  entry:
2118516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %single_v16f32.vararg, align 4, addrspace(5)
2128516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 64, ptr addrspace(5) %vararg_buffer)
213*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_v16f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
2148516f54eSJon Chesterfield; CHECK-NEXT:    store <16 x float> %x, ptr addrspace(5) %0, align 64
2158516f54eSJon Chesterfield; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
2168516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %1)
2178516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 64, ptr addrspace(5) %vararg_buffer)
2188516f54eSJon Chesterfield; CHECK-NEXT:    ret void
2198516f54eSJon Chesterfield;
2208516f54eSJon Chesterfieldentry:
2218516f54eSJon Chesterfield  tail call void (...) @vararg(<16 x float> noundef %x)
2228516f54eSJon Chesterfield  ret void
2238516f54eSJon Chesterfield}
2248516f54eSJon Chesterfield
2258516f54eSJon Chesterfielddefine hidden void @single_v32f32(<32 x float> noundef %x) {
2268516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@single_v32f32(<32 x float> noundef %x) {
2278516f54eSJon Chesterfield; CHECK-NEXT:  entry:
2288516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %single_v32f32.vararg, align 4, addrspace(5)
2298516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 128, ptr addrspace(5) %vararg_buffer)
230*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_v32f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
2318516f54eSJon Chesterfield; CHECK-NEXT:    store <32 x float> %x, ptr addrspace(5) %0, align 128
2328516f54eSJon Chesterfield; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
2338516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %1)
2348516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 128, ptr addrspace(5) %vararg_buffer)
2358516f54eSJon Chesterfield; CHECK-NEXT:    ret void
2368516f54eSJon Chesterfield;
2378516f54eSJon Chesterfieldentry:
2388516f54eSJon Chesterfield  tail call void (...) @vararg(<32 x float> noundef %x)
2398516f54eSJon Chesterfield  ret void
2408516f54eSJon Chesterfield}
2418516f54eSJon Chesterfield
2428516f54eSJon Chesterfielddefine hidden void @i32_double(i32 noundef %x, double noundef %y) {
2438516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@i32_double(i32 noundef %x, double noundef %y) {
2448516f54eSJon Chesterfield; CHECK-NEXT:  entry:
2458516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %i32_double.vararg, align 4, addrspace(5)
2468516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 12, ptr addrspace(5) %vararg_buffer)
247*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_double.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
2488516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4
249*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_double.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
2508516f54eSJon Chesterfield; CHECK-NEXT:    store double %y, ptr addrspace(5) %1, align 8
2518516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
2528516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
2538516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 12, ptr addrspace(5) %vararg_buffer)
2548516f54eSJon Chesterfield; CHECK-NEXT:    ret void
2558516f54eSJon Chesterfield;
2568516f54eSJon Chesterfieldentry:
2578516f54eSJon Chesterfield  tail call void (...) @vararg(i32 noundef %x, double noundef %y)
2588516f54eSJon Chesterfield  ret void
2598516f54eSJon Chesterfield}
2608516f54eSJon Chesterfield
2618516f54eSJon Chesterfielddefine hidden void @double_i32(double noundef %x, i32 noundef %y) {
2628516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@double_i32(double noundef %x, i32 noundef %y) {
2638516f54eSJon Chesterfield; CHECK-NEXT:  entry:
2648516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %double_i32.vararg, align 4, addrspace(5)
2658516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 12, ptr addrspace(5) %vararg_buffer)
266*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %double_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
2678516f54eSJon Chesterfield; CHECK-NEXT:    store double %x, ptr addrspace(5) %0, align 8
268*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %double_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
2698516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4
2708516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
2718516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
2728516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 12, ptr addrspace(5) %vararg_buffer)
2738516f54eSJon Chesterfield; CHECK-NEXT:    ret void
2748516f54eSJon Chesterfield;
2758516f54eSJon Chesterfieldentry:
2768516f54eSJon Chesterfield  tail call void (...) @vararg(double noundef %x, i32 noundef %y)
2778516f54eSJon Chesterfield  ret void
2788516f54eSJon Chesterfield}
2798516f54eSJon Chesterfield
2808516f54eSJon Chesterfielddefine hidden void @i32_libcS(i32 noundef %x, i8 %y.coerce0, i16 %y.coerce1, i32 %y.coerce2, i64 %y.coerce3, float %y.coerce4, double %y.coerce5) {
2818516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@i32_libcS(i32 noundef %x, i8 %y.coerce0, i16 %y.coerce1, i32 %y.coerce2, i64 %y.coerce3, float %y.coerce4, double %y.coerce5) {
2828516f54eSJon Chesterfield; CHECK-NEXT:  entry:
2838516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %i32_libcS.vararg, align 4, addrspace(5)
2848516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.0.insert = insertvalue %struct.libcS poison, i8 %y.coerce0, 0
2858516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %y.coerce1, 1
2868516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %y.coerce2, 2
2878516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %y.coerce3, 3
2888516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %y.coerce4, 4
2898516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %y.coerce5, 5
2908516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 36, ptr addrspace(5) %vararg_buffer)
291*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_libcS.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
2928516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4
293*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_libcS.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
2948516f54eSJon Chesterfield; CHECK-NEXT:    store %struct.libcS %.fca.5.insert, ptr addrspace(5) %1, align 8
2958516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
2968516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
2978516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 36, ptr addrspace(5) %vararg_buffer)
2988516f54eSJon Chesterfield; CHECK-NEXT:    ret void
2998516f54eSJon Chesterfield;
3008516f54eSJon Chesterfieldentry:
3018516f54eSJon Chesterfield  %.fca.0.insert = insertvalue %struct.libcS poison, i8 %y.coerce0, 0
3028516f54eSJon Chesterfield  %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %y.coerce1, 1
3038516f54eSJon Chesterfield  %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %y.coerce2, 2
3048516f54eSJon Chesterfield  %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %y.coerce3, 3
3058516f54eSJon Chesterfield  %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %y.coerce4, 4
3068516f54eSJon Chesterfield  %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %y.coerce5, 5
3078516f54eSJon Chesterfield  tail call void (...) @vararg(i32 noundef %x, %struct.libcS %.fca.5.insert)
3088516f54eSJon Chesterfield  ret void
3098516f54eSJon Chesterfield}
3108516f54eSJon Chesterfield
3118516f54eSJon Chesterfielddefine hidden void @libcS_i32(i8 %x.coerce0, i16 %x.coerce1, i32 %x.coerce2, i64 %x.coerce3, float %x.coerce4, double %x.coerce5, i32 noundef %y) {
3128516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@libcS_i32(i8 %x.coerce0, i16 %x.coerce1, i32 %x.coerce2, i64 %x.coerce3, float %x.coerce4, double %x.coerce5, i32 noundef %y) {
3138516f54eSJon Chesterfield; CHECK-NEXT:  entry:
3148516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %libcS_i32.vararg, align 4, addrspace(5)
3158516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.0.insert = insertvalue %struct.libcS poison, i8 %x.coerce0, 0
3168516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %x.coerce1, 1
3178516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %x.coerce2, 2
3188516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %x.coerce3, 3
3198516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %x.coerce4, 4
3208516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %x.coerce5, 5
3218516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 36, ptr addrspace(5) %vararg_buffer)
322*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %libcS_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
3238516f54eSJon Chesterfield; CHECK-NEXT:    store %struct.libcS %.fca.5.insert, ptr addrspace(5) %0, align 8
324*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %libcS_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
3258516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4
3268516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
3278516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
3288516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 36, ptr addrspace(5) %vararg_buffer)
3298516f54eSJon Chesterfield; CHECK-NEXT:    ret void
3308516f54eSJon Chesterfield;
3318516f54eSJon Chesterfieldentry:
3328516f54eSJon Chesterfield  %.fca.0.insert = insertvalue %struct.libcS poison, i8 %x.coerce0, 0
3338516f54eSJon Chesterfield  %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %x.coerce1, 1
3348516f54eSJon Chesterfield  %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %x.coerce2, 2
3358516f54eSJon Chesterfield  %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %x.coerce3, 3
3368516f54eSJon Chesterfield  %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %x.coerce4, 4
3378516f54eSJon Chesterfield  %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %x.coerce5, 5
3388516f54eSJon Chesterfield  tail call void (...) @vararg(%struct.libcS %.fca.5.insert, i32 noundef %y)
3398516f54eSJon Chesterfield  ret void
3408516f54eSJon Chesterfield}
3418516f54eSJon Chesterfield
3428516f54eSJon Chesterfielddefine hidden void @i32_v4f32(i32 noundef %x, <4 x float> noundef %y) {
3438516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@i32_v4f32(i32 noundef %x, <4 x float> noundef %y) {
3448516f54eSJon Chesterfield; CHECK-NEXT:  entry:
3458516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %i32_v4f32.vararg, align 4, addrspace(5)
3468516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 20, ptr addrspace(5) %vararg_buffer)
347*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_v4f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
3488516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4
349*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_v4f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
3508516f54eSJon Chesterfield; CHECK-NEXT:    store <4 x float> %y, ptr addrspace(5) %1, align 16
3518516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
3528516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
3538516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 20, ptr addrspace(5) %vararg_buffer)
3548516f54eSJon Chesterfield; CHECK-NEXT:    ret void
3558516f54eSJon Chesterfield;
3568516f54eSJon Chesterfieldentry:
3578516f54eSJon Chesterfield  tail call void (...) @vararg(i32 noundef %x, <4 x float> noundef %y)
3588516f54eSJon Chesterfield  ret void
3598516f54eSJon Chesterfield}
3608516f54eSJon Chesterfield
3618516f54eSJon Chesterfielddefine hidden void @v4f32_i32(<4 x float> noundef %x, i32 noundef %y) {
3628516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@v4f32_i32(<4 x float> noundef %x, i32 noundef %y) {
3638516f54eSJon Chesterfield; CHECK-NEXT:  entry:
3648516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %v4f32_i32.vararg, align 4, addrspace(5)
3658516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 20, ptr addrspace(5) %vararg_buffer)
366*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %v4f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
3678516f54eSJon Chesterfield; CHECK-NEXT:    store <4 x float> %x, ptr addrspace(5) %0, align 16
368*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %v4f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
3698516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4
3708516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
3718516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
3728516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 20, ptr addrspace(5) %vararg_buffer)
3738516f54eSJon Chesterfield; CHECK-NEXT:    ret void
3748516f54eSJon Chesterfield;
3758516f54eSJon Chesterfieldentry:
3768516f54eSJon Chesterfield  tail call void (...) @vararg(<4 x float> noundef %x, i32 noundef %y)
3778516f54eSJon Chesterfield  ret void
3788516f54eSJon Chesterfield}
3798516f54eSJon Chesterfield
3808516f54eSJon Chesterfielddefine hidden void @i32_v8f32(i32 noundef %x, <8 x float> noundef %y) {
3818516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@i32_v8f32(i32 noundef %x, <8 x float> noundef %y) {
3828516f54eSJon Chesterfield; CHECK-NEXT:  entry:
3838516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %i32_v8f32.vararg, align 4, addrspace(5)
3848516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 36, ptr addrspace(5) %vararg_buffer)
385*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_v8f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
3868516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4
387*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_v8f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
3888516f54eSJon Chesterfield; CHECK-NEXT:    store <8 x float> %y, ptr addrspace(5) %1, align 32
3898516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
3908516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
3918516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 36, ptr addrspace(5) %vararg_buffer)
3928516f54eSJon Chesterfield; CHECK-NEXT:    ret void
3938516f54eSJon Chesterfield;
3948516f54eSJon Chesterfieldentry:
3958516f54eSJon Chesterfield  tail call void (...) @vararg(i32 noundef %x, <8 x float> noundef %y)
3968516f54eSJon Chesterfield  ret void
3978516f54eSJon Chesterfield}
3988516f54eSJon Chesterfield
3998516f54eSJon Chesterfielddefine hidden void @v8f32_i32(<8 x float> noundef %x, i32 noundef %y) {
4008516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@v8f32_i32(<8 x float> noundef %x, i32 noundef %y) {
4018516f54eSJon Chesterfield; CHECK-NEXT:  entry:
4028516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %v8f32_i32.vararg, align 4, addrspace(5)
4038516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 36, ptr addrspace(5) %vararg_buffer)
404*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %v8f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
4058516f54eSJon Chesterfield; CHECK-NEXT:    store <8 x float> %x, ptr addrspace(5) %0, align 32
406*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %v8f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
4078516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4
4088516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
4098516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
4108516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 36, ptr addrspace(5) %vararg_buffer)
4118516f54eSJon Chesterfield; CHECK-NEXT:    ret void
4128516f54eSJon Chesterfield;
4138516f54eSJon Chesterfieldentry:
4148516f54eSJon Chesterfield  tail call void (...) @vararg(<8 x float> noundef %x, i32 noundef %y)
4158516f54eSJon Chesterfield  ret void
4168516f54eSJon Chesterfield}
4178516f54eSJon Chesterfield
4188516f54eSJon Chesterfielddefine hidden void @i32_v16f32(i32 noundef %x, <16 x float> noundef %y) {
4198516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@i32_v16f32(i32 noundef %x, <16 x float> noundef %y) {
4208516f54eSJon Chesterfield; CHECK-NEXT:  entry:
4218516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %i32_v16f32.vararg, align 4, addrspace(5)
4228516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 68, ptr addrspace(5) %vararg_buffer)
423*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_v16f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
4248516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4
425*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_v16f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
4268516f54eSJon Chesterfield; CHECK-NEXT:    store <16 x float> %y, ptr addrspace(5) %1, align 64
4278516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
4288516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
4298516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 68, ptr addrspace(5) %vararg_buffer)
4308516f54eSJon Chesterfield; CHECK-NEXT:    ret void
4318516f54eSJon Chesterfield;
4328516f54eSJon Chesterfieldentry:
4338516f54eSJon Chesterfield  tail call void (...) @vararg(i32 noundef %x, <16 x float> noundef %y)
4348516f54eSJon Chesterfield  ret void
4358516f54eSJon Chesterfield}
4368516f54eSJon Chesterfield
4378516f54eSJon Chesterfielddefine hidden void @v16f32_i32(<16 x float> noundef %x, i32 noundef %y) {
4388516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@v16f32_i32(<16 x float> noundef %x, i32 noundef %y) {
4398516f54eSJon Chesterfield; CHECK-NEXT:  entry:
4408516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %v16f32_i32.vararg, align 4, addrspace(5)
4418516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 68, ptr addrspace(5) %vararg_buffer)
442*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %v16f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
4438516f54eSJon Chesterfield; CHECK-NEXT:    store <16 x float> %x, ptr addrspace(5) %0, align 64
444*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %v16f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
4458516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4
4468516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
4478516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
4488516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 68, ptr addrspace(5) %vararg_buffer)
4498516f54eSJon Chesterfield; CHECK-NEXT:    ret void
4508516f54eSJon Chesterfield;
4518516f54eSJon Chesterfieldentry:
4528516f54eSJon Chesterfield  tail call void (...) @vararg(<16 x float> noundef %x, i32 noundef %y)
4538516f54eSJon Chesterfield  ret void
4548516f54eSJon Chesterfield}
4558516f54eSJon Chesterfield
4568516f54eSJon Chesterfielddefine hidden void @i32_v32f32(i32 noundef %x, <32 x float> noundef %y) {
4578516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@i32_v32f32(i32 noundef %x, <32 x float> noundef %y) {
4588516f54eSJon Chesterfield; CHECK-NEXT:  entry:
4598516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %i32_v32f32.vararg, align 4, addrspace(5)
4608516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 132, ptr addrspace(5) %vararg_buffer)
461*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_v32f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
4628516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4
463*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_v32f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
4648516f54eSJon Chesterfield; CHECK-NEXT:    store <32 x float> %y, ptr addrspace(5) %1, align 128
4658516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
4668516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
4678516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 132, ptr addrspace(5) %vararg_buffer)
4688516f54eSJon Chesterfield; CHECK-NEXT:    ret void
4698516f54eSJon Chesterfield;
4708516f54eSJon Chesterfieldentry:
4718516f54eSJon Chesterfield  tail call void (...) @vararg(i32 noundef %x, <32 x float> noundef %y)
4728516f54eSJon Chesterfield  ret void
4738516f54eSJon Chesterfield}
4748516f54eSJon Chesterfield
4758516f54eSJon Chesterfielddefine hidden void @v32f32_i32(<32 x float> noundef %x, i32 noundef %y) {
4768516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@v32f32_i32(<32 x float> noundef %x, i32 noundef %y) {
4778516f54eSJon Chesterfield; CHECK-NEXT:  entry:
4788516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %v32f32_i32.vararg, align 4, addrspace(5)
4798516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 132, ptr addrspace(5) %vararg_buffer)
480*94473f4dSHari Limaye; CHECK-NEXT:    %0 = getelementptr inbounds nuw %v32f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
4818516f54eSJon Chesterfield; CHECK-NEXT:    store <32 x float> %x, ptr addrspace(5) %0, align 128
482*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %v32f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1
4838516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4
4848516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
4858516f54eSJon Chesterfield; CHECK-NEXT:    call void @vararg(ptr %2)
4868516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 132, ptr addrspace(5) %vararg_buffer)
4878516f54eSJon Chesterfield; CHECK-NEXT:    ret void
4888516f54eSJon Chesterfield;
4898516f54eSJon Chesterfieldentry:
4908516f54eSJon Chesterfield  tail call void (...) @vararg(<32 x float> noundef %x, i32 noundef %y)
4918516f54eSJon Chesterfield  ret void
4928516f54eSJon Chesterfield}
4938516f54eSJon Chesterfield
4948516f54eSJon Chesterfielddefine hidden void @fptr_single_i32(i32 noundef %x) {
4958516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@fptr_single_i32(i32 noundef %x) {
4968516f54eSJon Chesterfield; CHECK-NEXT:  entry:
4978516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %fptr_single_i32.vararg, align 4, addrspace(5)
4988516f54eSJon Chesterfield; CHECK-NEXT:    %0 = load volatile ptr, ptr addrspacecast (ptr addrspace(1) @vararg_ptr to ptr), align 8
4998516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) %vararg_buffer)
500*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %fptr_single_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
5018516f54eSJon Chesterfield; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %1, align 4
5028516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
5038516f54eSJon Chesterfield; CHECK-NEXT:    call void %0(ptr %2)
5048516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 4, ptr addrspace(5) %vararg_buffer)
5058516f54eSJon Chesterfield; CHECK-NEXT:    ret void
5068516f54eSJon Chesterfield;
5078516f54eSJon Chesterfieldentry:
5088516f54eSJon Chesterfield  %0 = load volatile ptr, ptr addrspacecast (ptr addrspace(1) @vararg_ptr to ptr), align 8
5098516f54eSJon Chesterfield  tail call void (...) %0(i32 noundef %x)
5108516f54eSJon Chesterfield  ret void
5118516f54eSJon Chesterfield}
5128516f54eSJon Chesterfield
5138516f54eSJon Chesterfielddefine hidden void @fptr_libcS(i8 %x.coerce0, i16 %x.coerce1, i32 %x.coerce2, i64 %x.coerce3, float %x.coerce4, double %x.coerce5) {
5148516f54eSJon Chesterfield; CHECK-LABEL: define {{[^@]+}}@fptr_libcS(i8 %x.coerce0, i16 %x.coerce1, i32 %x.coerce2, i64 %x.coerce3, float %x.coerce4, double %x.coerce5) {
5158516f54eSJon Chesterfield; CHECK-NEXT:  entry:
5168516f54eSJon Chesterfield; CHECK-NEXT:    %vararg_buffer = alloca %fptr_libcS.vararg, align 4, addrspace(5)
5178516f54eSJon Chesterfield; CHECK-NEXT:    %0 = load volatile ptr, ptr addrspacecast (ptr addrspace(1) @vararg_ptr to ptr), align 8
5188516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.0.insert = insertvalue %struct.libcS poison, i8 %x.coerce0, 0
5198516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %x.coerce1, 1
5208516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %x.coerce2, 2
5218516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %x.coerce3, 3
5228516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %x.coerce4, 4
5238516f54eSJon Chesterfield; CHECK-NEXT:    %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %x.coerce5, 5
5248516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.start.p5(i64 32, ptr addrspace(5) %vararg_buffer)
525*94473f4dSHari Limaye; CHECK-NEXT:    %1 = getelementptr inbounds nuw %fptr_libcS.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0
5268516f54eSJon Chesterfield; CHECK-NEXT:    store %struct.libcS %.fca.5.insert, ptr addrspace(5) %1, align 8
5278516f54eSJon Chesterfield; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr
5288516f54eSJon Chesterfield; CHECK-NEXT:    call void %0(ptr %2)
5298516f54eSJon Chesterfield; CHECK-NEXT:    call void @llvm.lifetime.end.p5(i64 32, ptr addrspace(5) %vararg_buffer)
5308516f54eSJon Chesterfield; CHECK-NEXT:    ret void
5318516f54eSJon Chesterfield;
5328516f54eSJon Chesterfieldentry:
5338516f54eSJon Chesterfield  %0 = load volatile ptr, ptr addrspacecast (ptr addrspace(1) @vararg_ptr to ptr), align 8
5348516f54eSJon Chesterfield  %.fca.0.insert = insertvalue %struct.libcS poison, i8 %x.coerce0, 0
5358516f54eSJon Chesterfield  %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %x.coerce1, 1
5368516f54eSJon Chesterfield  %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %x.coerce2, 2
5378516f54eSJon Chesterfield  %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %x.coerce3, 3
5388516f54eSJon Chesterfield  %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %x.coerce4, 4
5398516f54eSJon Chesterfield  %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %x.coerce5, 5
5408516f54eSJon Chesterfield  tail call void (...) %0(%struct.libcS %.fca.5.insert)
5418516f54eSJon Chesterfield  ret void
5428516f54eSJon Chesterfield}
5438516f54eSJon Chesterfield
5448516f54eSJon Chesterfield
545