18516f54eSJon Chesterfield; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28516f54eSJon Chesterfield; RUN: opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=optimize < %s | FileCheck %s -check-prefixes=OPT 38516f54eSJon Chesterfield; RUN: opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=lowering < %s | FileCheck %s -check-prefixes=ABI 48516f54eSJon Chesterfield; REQUIRES: webassembly-registered-target 58516f54eSJon Chesterfield 68516f54eSJon Chesterfield; Wasm passes struct {char} as an i8 so can check the varargs passing works on integers smaller than the slot size 78516f54eSJon Chesterfield 88516f54eSJon Chesterfielddeclare void @sink(...) 98516f54eSJon Chesterfield 108516f54eSJon Chesterfield 118516f54eSJon Chesterfielddefine void @pass_nothing() { 128516f54eSJon Chesterfield; OPT-LABEL: @pass_nothing( 138516f54eSJon Chesterfield; OPT-NEXT: entry: 148516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink() 158516f54eSJon Chesterfield; OPT-NEXT: ret void 168516f54eSJon Chesterfield; 178516f54eSJon Chesterfield; ABI-LABEL: @pass_nothing( 188516f54eSJon Chesterfield; ABI-NEXT: entry: 198516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_NOTHING_VARARG:%.*]], align 16 208516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 1, ptr [[VARARG_BUFFER]]) 218516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 228516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 1, ptr [[VARARG_BUFFER]]) 238516f54eSJon Chesterfield; ABI-NEXT: ret void 248516f54eSJon Chesterfield; 258516f54eSJon Chesterfieldentry: 268516f54eSJon Chesterfield tail call void (...) @sink() 278516f54eSJon Chesterfield ret void 288516f54eSJon Chesterfield} 298516f54eSJon Chesterfield 308516f54eSJon Chesterfielddefine void @pass_s1(i8 %x) { 318516f54eSJon Chesterfield; OPT-LABEL: @pass_s1( 328516f54eSJon Chesterfield; OPT-NEXT: entry: 338516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i8 [[X:%.*]]) 348516f54eSJon Chesterfield; OPT-NEXT: ret void 358516f54eSJon Chesterfield; 368516f54eSJon Chesterfield; ABI-LABEL: @pass_s1( 378516f54eSJon Chesterfield; ABI-NEXT: entry: 388516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S1_VARARG:%.*]], align 16 398516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 1, ptr [[VARARG_BUFFER]]) 40*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S1_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 418516f54eSJon Chesterfield; ABI-NEXT: store i8 [[X:%.*]], ptr [[TMP0]], align 1 428516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 438516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 1, ptr [[VARARG_BUFFER]]) 448516f54eSJon Chesterfield; ABI-NEXT: ret void 458516f54eSJon Chesterfield; 468516f54eSJon Chesterfieldentry: 478516f54eSJon Chesterfield tail call void (...) @sink(i8 %x) 488516f54eSJon Chesterfield ret void 498516f54eSJon Chesterfield} 508516f54eSJon Chesterfield 518516f54eSJon Chesterfielddefine void @pass_s2(i16 %x) { 528516f54eSJon Chesterfield; OPT-LABEL: @pass_s2( 538516f54eSJon Chesterfield; OPT-NEXT: entry: 548516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i16 [[X:%.*]]) 558516f54eSJon Chesterfield; OPT-NEXT: ret void 568516f54eSJon Chesterfield; 578516f54eSJon Chesterfield; ABI-LABEL: @pass_s2( 588516f54eSJon Chesterfield; ABI-NEXT: entry: 598516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S2_VARARG:%.*]], align 16 608516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 2, ptr [[VARARG_BUFFER]]) 61*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S2_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 628516f54eSJon Chesterfield; ABI-NEXT: store i16 [[X:%.*]], ptr [[TMP0]], align 2 638516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 648516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 2, ptr [[VARARG_BUFFER]]) 658516f54eSJon Chesterfield; ABI-NEXT: ret void 668516f54eSJon Chesterfield; 678516f54eSJon Chesterfieldentry: 688516f54eSJon Chesterfield tail call void (...) @sink(i16 %x) 698516f54eSJon Chesterfield ret void 708516f54eSJon Chesterfield} 718516f54eSJon Chesterfield 728516f54eSJon Chesterfielddefine void @pass_s3(i32 %x) { 738516f54eSJon Chesterfield; OPT-LABEL: @pass_s3( 748516f54eSJon Chesterfield; OPT-NEXT: entry: 758516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i32 [[X:%.*]]) 768516f54eSJon Chesterfield; OPT-NEXT: ret void 778516f54eSJon Chesterfield; 788516f54eSJon Chesterfield; ABI-LABEL: @pass_s3( 798516f54eSJon Chesterfield; ABI-NEXT: entry: 808516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S3_VARARG:%.*]], align 16 818516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[VARARG_BUFFER]]) 82*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S3_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 838516f54eSJon Chesterfield; ABI-NEXT: store i32 [[X:%.*]], ptr [[TMP0]], align 4 848516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 858516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[VARARG_BUFFER]]) 868516f54eSJon Chesterfield; ABI-NEXT: ret void 878516f54eSJon Chesterfield; 888516f54eSJon Chesterfieldentry: 898516f54eSJon Chesterfield tail call void (...) @sink(i32 %x) 908516f54eSJon Chesterfield ret void 918516f54eSJon Chesterfield} 928516f54eSJon Chesterfield 938516f54eSJon Chesterfielddefine void @pass_s4(i64 %x) { 948516f54eSJon Chesterfield; OPT-LABEL: @pass_s4( 958516f54eSJon Chesterfield; OPT-NEXT: entry: 968516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i64 [[X:%.*]]) 978516f54eSJon Chesterfield; OPT-NEXT: ret void 988516f54eSJon Chesterfield; 998516f54eSJon Chesterfield; ABI-LABEL: @pass_s4( 1008516f54eSJon Chesterfield; ABI-NEXT: entry: 1018516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S4_VARARG:%.*]], align 16 1028516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[VARARG_BUFFER]]) 103*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S4_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 1048516f54eSJon Chesterfield; ABI-NEXT: store i64 [[X:%.*]], ptr [[TMP0]], align 8 1058516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 1068516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[VARARG_BUFFER]]) 1078516f54eSJon Chesterfield; ABI-NEXT: ret void 1088516f54eSJon Chesterfield; 1098516f54eSJon Chesterfieldentry: 1108516f54eSJon Chesterfield tail call void (...) @sink(i64 %x) 1118516f54eSJon Chesterfield ret void 1128516f54eSJon Chesterfield} 1138516f54eSJon Chesterfield 1148516f54eSJon Chesterfielddefine void @pass_s5(<4 x i32> %x) { 1158516f54eSJon Chesterfield; OPT-LABEL: @pass_s5( 1168516f54eSJon Chesterfield; OPT-NEXT: entry: 1178516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(<4 x i32> [[X:%.*]]) 1188516f54eSJon Chesterfield; OPT-NEXT: ret void 1198516f54eSJon Chesterfield; 1208516f54eSJon Chesterfield; ABI-LABEL: @pass_s5( 1218516f54eSJon Chesterfield; ABI-NEXT: entry: 1228516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S5_VARARG:%.*]], align 16 1238516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 16, ptr [[VARARG_BUFFER]]) 124*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S5_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 1258516f54eSJon Chesterfield; ABI-NEXT: store <4 x i32> [[X:%.*]], ptr [[TMP0]], align 16 1268516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 1278516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 16, ptr [[VARARG_BUFFER]]) 1288516f54eSJon Chesterfield; ABI-NEXT: ret void 1298516f54eSJon Chesterfield; 1308516f54eSJon Chesterfieldentry: 1318516f54eSJon Chesterfield tail call void (...) @sink(<4 x i32> %x) 1328516f54eSJon Chesterfield ret void 1338516f54eSJon Chesterfield} 1348516f54eSJon Chesterfield 1358516f54eSJon Chesterfielddefine void @pass_int_s1(i32 %i, i8 %x) { 1368516f54eSJon Chesterfield; OPT-LABEL: @pass_int_s1( 1378516f54eSJon Chesterfield; OPT-NEXT: entry: 1388516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i8 [[X:%.*]]) 1398516f54eSJon Chesterfield; OPT-NEXT: ret void 1408516f54eSJon Chesterfield; 1418516f54eSJon Chesterfield; ABI-LABEL: @pass_int_s1( 1428516f54eSJon Chesterfield; ABI-NEXT: entry: 1438516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S1_VARARG:%.*]], align 16 1448516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 5, ptr [[VARARG_BUFFER]]) 145*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S1_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 1468516f54eSJon Chesterfield; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 147*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S1_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 1488516f54eSJon Chesterfield; ABI-NEXT: store i8 [[X:%.*]], ptr [[TMP1]], align 1 1498516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 1508516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 5, ptr [[VARARG_BUFFER]]) 1518516f54eSJon Chesterfield; ABI-NEXT: ret void 1528516f54eSJon Chesterfield; 1538516f54eSJon Chesterfieldentry: 1548516f54eSJon Chesterfield tail call void (...) @sink(i32 %i, i8 %x) 1558516f54eSJon Chesterfield ret void 1568516f54eSJon Chesterfield} 1578516f54eSJon Chesterfield 1588516f54eSJon Chesterfielddefine void @pass_int_s2(i32 %i, i16 %x) { 1598516f54eSJon Chesterfield; OPT-LABEL: @pass_int_s2( 1608516f54eSJon Chesterfield; OPT-NEXT: entry: 1618516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i16 [[X:%.*]]) 1628516f54eSJon Chesterfield; OPT-NEXT: ret void 1638516f54eSJon Chesterfield; 1648516f54eSJon Chesterfield; ABI-LABEL: @pass_int_s2( 1658516f54eSJon Chesterfield; ABI-NEXT: entry: 1668516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S2_VARARG:%.*]], align 16 1678516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 6, ptr [[VARARG_BUFFER]]) 168*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S2_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 1698516f54eSJon Chesterfield; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 170*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S2_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 1718516f54eSJon Chesterfield; ABI-NEXT: store i16 [[X:%.*]], ptr [[TMP1]], align 2 1728516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 1738516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 6, ptr [[VARARG_BUFFER]]) 1748516f54eSJon Chesterfield; ABI-NEXT: ret void 1758516f54eSJon Chesterfield; 1768516f54eSJon Chesterfieldentry: 1778516f54eSJon Chesterfield tail call void (...) @sink(i32 %i, i16 %x) 1788516f54eSJon Chesterfield ret void 1798516f54eSJon Chesterfield} 1808516f54eSJon Chesterfield 1818516f54eSJon Chesterfielddefine void @pass_int_s3(i32 %i, i32 %x) { 1828516f54eSJon Chesterfield; OPT-LABEL: @pass_int_s3( 1838516f54eSJon Chesterfield; OPT-NEXT: entry: 1848516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i32 [[X:%.*]]) 1858516f54eSJon Chesterfield; OPT-NEXT: ret void 1868516f54eSJon Chesterfield; 1878516f54eSJon Chesterfield; ABI-LABEL: @pass_int_s3( 1888516f54eSJon Chesterfield; ABI-NEXT: entry: 1898516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S3_VARARG:%.*]], align 16 1908516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[VARARG_BUFFER]]) 191*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S3_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 1928516f54eSJon Chesterfield; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 193*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S3_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 1948516f54eSJon Chesterfield; ABI-NEXT: store i32 [[X:%.*]], ptr [[TMP1]], align 4 1958516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 1968516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[VARARG_BUFFER]]) 1978516f54eSJon Chesterfield; ABI-NEXT: ret void 1988516f54eSJon Chesterfield; 1998516f54eSJon Chesterfieldentry: 2008516f54eSJon Chesterfield tail call void (...) @sink(i32 %i, i32 %x) 2018516f54eSJon Chesterfield ret void 2028516f54eSJon Chesterfield} 2038516f54eSJon Chesterfield 2048516f54eSJon Chesterfielddefine void @pass_int_s4(i32 %i, i64 %x) { 2058516f54eSJon Chesterfield; OPT-LABEL: @pass_int_s4( 2068516f54eSJon Chesterfield; OPT-NEXT: entry: 2078516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i64 [[X:%.*]]) 2088516f54eSJon Chesterfield; OPT-NEXT: ret void 2098516f54eSJon Chesterfield; 2108516f54eSJon Chesterfield; ABI-LABEL: @pass_int_s4( 2118516f54eSJon Chesterfield; ABI-NEXT: entry: 2128516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S4_VARARG:%.*]], align 16 2138516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 16, ptr [[VARARG_BUFFER]]) 214*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S4_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 2158516f54eSJon Chesterfield; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 216*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S4_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2 2178516f54eSJon Chesterfield; ABI-NEXT: store i64 [[X:%.*]], ptr [[TMP1]], align 8 2188516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 2198516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 16, ptr [[VARARG_BUFFER]]) 2208516f54eSJon Chesterfield; ABI-NEXT: ret void 2218516f54eSJon Chesterfield; 2228516f54eSJon Chesterfieldentry: 2238516f54eSJon Chesterfield tail call void (...) @sink(i32 %i, i64 %x) 2248516f54eSJon Chesterfield ret void 2258516f54eSJon Chesterfield} 2268516f54eSJon Chesterfield 2278516f54eSJon Chesterfielddefine void @pass_int_s5(i32 %i, <4 x i32> %x) { 2288516f54eSJon Chesterfield; OPT-LABEL: @pass_int_s5( 2298516f54eSJon Chesterfield; OPT-NEXT: entry: 2308516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], <4 x i32> [[X:%.*]]) 2318516f54eSJon Chesterfield; OPT-NEXT: ret void 2328516f54eSJon Chesterfield; 2338516f54eSJon Chesterfield; ABI-LABEL: @pass_int_s5( 2348516f54eSJon Chesterfield; ABI-NEXT: entry: 2358516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S5_VARARG:%.*]], align 16 2368516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 32, ptr [[VARARG_BUFFER]]) 237*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S5_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 2388516f54eSJon Chesterfield; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 239*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S5_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2 2408516f54eSJon Chesterfield; ABI-NEXT: store <4 x i32> [[X:%.*]], ptr [[TMP1]], align 16 2418516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 2428516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 32, ptr [[VARARG_BUFFER]]) 2438516f54eSJon Chesterfield; ABI-NEXT: ret void 2448516f54eSJon Chesterfield; 2458516f54eSJon Chesterfieldentry: 2468516f54eSJon Chesterfield tail call void (...) @sink(i32 %i, <4 x i32> %x) 2478516f54eSJon Chesterfield ret void 2488516f54eSJon Chesterfield} 2498516f54eSJon Chesterfield 2508516f54eSJon Chesterfielddefine void @pass_asc(i8 %x1, i16 %x2, i32 %x3, i64 %x4, <4 x i32> %x5) { 2518516f54eSJon Chesterfield; OPT-LABEL: @pass_asc( 2528516f54eSJon Chesterfield; OPT-NEXT: entry: 2538516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i8 [[X1:%.*]], i16 [[X2:%.*]], i32 [[X3:%.*]], i64 [[X4:%.*]], <4 x i32> [[X5:%.*]]) 2548516f54eSJon Chesterfield; OPT-NEXT: ret void 2558516f54eSJon Chesterfield; 2568516f54eSJon Chesterfield; ABI-LABEL: @pass_asc( 2578516f54eSJon Chesterfield; ABI-NEXT: entry: 2588516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_ASC_VARARG:%.*]], align 16 2598516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 48, ptr [[VARARG_BUFFER]]) 260*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 2618516f54eSJon Chesterfield; ABI-NEXT: store i8 [[X1:%.*]], ptr [[TMP0]], align 1 262*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2 2638516f54eSJon Chesterfield; ABI-NEXT: store i16 [[X2:%.*]], ptr [[TMP1]], align 2 264*94473f4dSHari Limaye; ABI-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 4 2658516f54eSJon Chesterfield; ABI-NEXT: store i32 [[X3:%.*]], ptr [[TMP2]], align 4 266*94473f4dSHari Limaye; ABI-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 6 2678516f54eSJon Chesterfield; ABI-NEXT: store i64 [[X4:%.*]], ptr [[TMP3]], align 8 268*94473f4dSHari Limaye; ABI-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 8 2698516f54eSJon Chesterfield; ABI-NEXT: store <4 x i32> [[X5:%.*]], ptr [[TMP4]], align 16 2708516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 2718516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 48, ptr [[VARARG_BUFFER]]) 2728516f54eSJon Chesterfield; ABI-NEXT: ret void 2738516f54eSJon Chesterfield; 2748516f54eSJon Chesterfieldentry: 2758516f54eSJon Chesterfield tail call void (...) @sink(i8 %x1, i16 %x2, i32 %x3, i64 %x4, <4 x i32> %x5) 2768516f54eSJon Chesterfield ret void 2778516f54eSJon Chesterfield} 2788516f54eSJon Chesterfield 2798516f54eSJon Chesterfielddefine void @pass_dsc(<4 x i32> %x0, i64 %x1, i32 %x2, i16 %x3, i8 %x4) { 2808516f54eSJon Chesterfield; OPT-LABEL: @pass_dsc( 2818516f54eSJon Chesterfield; OPT-NEXT: entry: 2828516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(<4 x i32> [[X0:%.*]], i64 [[X1:%.*]], i32 [[X2:%.*]], i16 [[X3:%.*]], i8 [[X4:%.*]]) 2838516f54eSJon Chesterfield; OPT-NEXT: ret void 2848516f54eSJon Chesterfield; 2858516f54eSJon Chesterfield; ABI-LABEL: @pass_dsc( 2868516f54eSJon Chesterfield; ABI-NEXT: entry: 2878516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_DSC_VARARG:%.*]], align 16 2888516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 33, ptr [[VARARG_BUFFER]]) 289*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 2908516f54eSJon Chesterfield; ABI-NEXT: store <4 x i32> [[X0:%.*]], ptr [[TMP0]], align 16 291*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 2928516f54eSJon Chesterfield; ABI-NEXT: store i64 [[X1:%.*]], ptr [[TMP1]], align 8 293*94473f4dSHari Limaye; ABI-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2 2948516f54eSJon Chesterfield; ABI-NEXT: store i32 [[X2:%.*]], ptr [[TMP2]], align 4 295*94473f4dSHari Limaye; ABI-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 3 2968516f54eSJon Chesterfield; ABI-NEXT: store i16 [[X3:%.*]], ptr [[TMP3]], align 2 297*94473f4dSHari Limaye; ABI-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 5 2988516f54eSJon Chesterfield; ABI-NEXT: store i8 [[X4:%.*]], ptr [[TMP4]], align 1 2998516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 3008516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 33, ptr [[VARARG_BUFFER]]) 3018516f54eSJon Chesterfield; ABI-NEXT: ret void 3028516f54eSJon Chesterfield; 3038516f54eSJon Chesterfieldentry: 3048516f54eSJon Chesterfield tail call void (...) @sink(<4 x i32> %x0, i64 %x1, i32 %x2, i16 %x3, i8 %x4) 3058516f54eSJon Chesterfield ret void 3068516f54eSJon Chesterfield} 3078516f54eSJon Chesterfield 3088516f54eSJon Chesterfielddefine void @pass_multiple(i32 %i, i8 %x1, i16 %x2, i32 %x3, i64 %x4, <4 x i32> %x5) { 3098516f54eSJon Chesterfield; OPT-LABEL: @pass_multiple( 3108516f54eSJon Chesterfield; OPT-NEXT: entry: 3118516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i16 [[X2:%.*]], i64 [[X4:%.*]]) 3128516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) @sink(i32 [[I]], i8 [[X1:%.*]], i32 [[X3:%.*]], <4 x i32> [[X5:%.*]]) 3138516f54eSJon Chesterfield; OPT-NEXT: ret void 3148516f54eSJon Chesterfield; 3158516f54eSJon Chesterfield; ABI-LABEL: @pass_multiple( 3168516f54eSJon Chesterfield; ABI-NEXT: entry: 3178516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_MULTIPLE_VARARG:%.*]], align 16 3188516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER1:%.*]] = alloca [[PASS_MULTIPLE_VARARG_0:%.*]], align 16 3198516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 16, ptr [[VARARG_BUFFER]]) 320*94473f4dSHari Limaye; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 3218516f54eSJon Chesterfield; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 322*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 3238516f54eSJon Chesterfield; ABI-NEXT: store i16 [[X2:%.*]], ptr [[TMP1]], align 2 324*94473f4dSHari Limaye; ABI-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 3 3258516f54eSJon Chesterfield; ABI-NEXT: store i64 [[X4:%.*]], ptr [[TMP2]], align 8 3268516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 3278516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 16, ptr [[VARARG_BUFFER]]) 3288516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 32, ptr [[VARARG_BUFFER1]]) 329*94473f4dSHari Limaye; ABI-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 0 3308516f54eSJon Chesterfield; ABI-NEXT: store i32 [[I]], ptr [[TMP3]], align 4 331*94473f4dSHari Limaye; ABI-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 1 3328516f54eSJon Chesterfield; ABI-NEXT: store i8 [[X1:%.*]], ptr [[TMP4]], align 1 333*94473f4dSHari Limaye; ABI-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 3 3348516f54eSJon Chesterfield; ABI-NEXT: store i32 [[X3:%.*]], ptr [[TMP5]], align 4 335*94473f4dSHari Limaye; ABI-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 5 3368516f54eSJon Chesterfield; ABI-NEXT: store <4 x i32> [[X5:%.*]], ptr [[TMP6]], align 16 3378516f54eSJon Chesterfield; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER1]]) 3388516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 32, ptr [[VARARG_BUFFER1]]) 3398516f54eSJon Chesterfield; ABI-NEXT: ret void 3408516f54eSJon Chesterfield; 3418516f54eSJon Chesterfieldentry: 3428516f54eSJon Chesterfield tail call void (...) @sink(i32 %i, i16 %x2, i64 %x4) 3438516f54eSJon Chesterfield tail call void (...) @sink(i32 %i, i8 %x1, i32 %x3, <4 x i32> %x5) 3448516f54eSJon Chesterfield ret void 3458516f54eSJon Chesterfield} 346