1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=optimize < %s | FileCheck %s -check-prefixes=OPT 3; RUN: opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=lowering < %s | FileCheck %s -check-prefixes=ABI 4; REQUIRES: webassembly-registered-target 5 6; Wasm passes struct {char} as an i8 so can check the varargs passing works on integers smaller than the slot size 7 8declare void @sink(...) 9 10 11define void @pass_nothing() { 12; OPT-LABEL: @pass_nothing( 13; OPT-NEXT: entry: 14; OPT-NEXT: tail call void (...) @sink() 15; OPT-NEXT: ret void 16; 17; ABI-LABEL: @pass_nothing( 18; ABI-NEXT: entry: 19; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_NOTHING_VARARG:%.*]], align 16 20; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 1, ptr [[VARARG_BUFFER]]) 21; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 22; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 1, ptr [[VARARG_BUFFER]]) 23; ABI-NEXT: ret void 24; 25entry: 26 tail call void (...) @sink() 27 ret void 28} 29 30define void @pass_s1(i8 %x) { 31; OPT-LABEL: @pass_s1( 32; OPT-NEXT: entry: 33; OPT-NEXT: tail call void (...) @sink(i8 [[X:%.*]]) 34; OPT-NEXT: ret void 35; 36; ABI-LABEL: @pass_s1( 37; ABI-NEXT: entry: 38; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S1_VARARG:%.*]], align 16 39; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 1, ptr [[VARARG_BUFFER]]) 40; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S1_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 41; ABI-NEXT: store i8 [[X:%.*]], ptr [[TMP0]], align 1 42; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 43; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 1, ptr [[VARARG_BUFFER]]) 44; ABI-NEXT: ret void 45; 46entry: 47 tail call void (...) @sink(i8 %x) 48 ret void 49} 50 51define void @pass_s2(i16 %x) { 52; OPT-LABEL: @pass_s2( 53; OPT-NEXT: entry: 54; OPT-NEXT: tail call void (...) @sink(i16 [[X:%.*]]) 55; OPT-NEXT: ret void 56; 57; ABI-LABEL: @pass_s2( 58; ABI-NEXT: entry: 59; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S2_VARARG:%.*]], align 16 60; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 2, ptr [[VARARG_BUFFER]]) 61; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S2_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 62; ABI-NEXT: store i16 [[X:%.*]], ptr [[TMP0]], align 2 63; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 64; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 2, ptr [[VARARG_BUFFER]]) 65; ABI-NEXT: ret void 66; 67entry: 68 tail call void (...) @sink(i16 %x) 69 ret void 70} 71 72define void @pass_s3(i32 %x) { 73; OPT-LABEL: @pass_s3( 74; OPT-NEXT: entry: 75; OPT-NEXT: tail call void (...) @sink(i32 [[X:%.*]]) 76; OPT-NEXT: ret void 77; 78; ABI-LABEL: @pass_s3( 79; ABI-NEXT: entry: 80; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S3_VARARG:%.*]], align 16 81; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[VARARG_BUFFER]]) 82; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S3_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 83; ABI-NEXT: store i32 [[X:%.*]], ptr [[TMP0]], align 4 84; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 85; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[VARARG_BUFFER]]) 86; ABI-NEXT: ret void 87; 88entry: 89 tail call void (...) @sink(i32 %x) 90 ret void 91} 92 93define void @pass_s4(i64 %x) { 94; OPT-LABEL: @pass_s4( 95; OPT-NEXT: entry: 96; OPT-NEXT: tail call void (...) @sink(i64 [[X:%.*]]) 97; OPT-NEXT: ret void 98; 99; ABI-LABEL: @pass_s4( 100; ABI-NEXT: entry: 101; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S4_VARARG:%.*]], align 16 102; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[VARARG_BUFFER]]) 103; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S4_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 104; ABI-NEXT: store i64 [[X:%.*]], ptr [[TMP0]], align 8 105; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 106; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[VARARG_BUFFER]]) 107; ABI-NEXT: ret void 108; 109entry: 110 tail call void (...) @sink(i64 %x) 111 ret void 112} 113 114define void @pass_s5(<4 x i32> %x) { 115; OPT-LABEL: @pass_s5( 116; OPT-NEXT: entry: 117; OPT-NEXT: tail call void (...) @sink(<4 x i32> [[X:%.*]]) 118; OPT-NEXT: ret void 119; 120; ABI-LABEL: @pass_s5( 121; ABI-NEXT: entry: 122; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_S5_VARARG:%.*]], align 16 123; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 16, ptr [[VARARG_BUFFER]]) 124; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S5_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 125; ABI-NEXT: store <4 x i32> [[X:%.*]], ptr [[TMP0]], align 16 126; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 127; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 16, ptr [[VARARG_BUFFER]]) 128; ABI-NEXT: ret void 129; 130entry: 131 tail call void (...) @sink(<4 x i32> %x) 132 ret void 133} 134 135define void @pass_int_s1(i32 %i, i8 %x) { 136; OPT-LABEL: @pass_int_s1( 137; OPT-NEXT: entry: 138; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i8 [[X:%.*]]) 139; OPT-NEXT: ret void 140; 141; ABI-LABEL: @pass_int_s1( 142; ABI-NEXT: entry: 143; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S1_VARARG:%.*]], align 16 144; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 5, ptr [[VARARG_BUFFER]]) 145; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S1_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 146; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 147; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S1_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 148; ABI-NEXT: store i8 [[X:%.*]], ptr [[TMP1]], align 1 149; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 150; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 5, ptr [[VARARG_BUFFER]]) 151; ABI-NEXT: ret void 152; 153entry: 154 tail call void (...) @sink(i32 %i, i8 %x) 155 ret void 156} 157 158define void @pass_int_s2(i32 %i, i16 %x) { 159; OPT-LABEL: @pass_int_s2( 160; OPT-NEXT: entry: 161; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i16 [[X:%.*]]) 162; OPT-NEXT: ret void 163; 164; ABI-LABEL: @pass_int_s2( 165; ABI-NEXT: entry: 166; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S2_VARARG:%.*]], align 16 167; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 6, ptr [[VARARG_BUFFER]]) 168; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S2_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 169; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 170; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S2_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 171; ABI-NEXT: store i16 [[X:%.*]], ptr [[TMP1]], align 2 172; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 173; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 6, ptr [[VARARG_BUFFER]]) 174; ABI-NEXT: ret void 175; 176entry: 177 tail call void (...) @sink(i32 %i, i16 %x) 178 ret void 179} 180 181define void @pass_int_s3(i32 %i, i32 %x) { 182; OPT-LABEL: @pass_int_s3( 183; OPT-NEXT: entry: 184; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i32 [[X:%.*]]) 185; OPT-NEXT: ret void 186; 187; ABI-LABEL: @pass_int_s3( 188; ABI-NEXT: entry: 189; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S3_VARARG:%.*]], align 16 190; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[VARARG_BUFFER]]) 191; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S3_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 192; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 193; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S3_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 194; ABI-NEXT: store i32 [[X:%.*]], ptr [[TMP1]], align 4 195; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 196; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[VARARG_BUFFER]]) 197; ABI-NEXT: ret void 198; 199entry: 200 tail call void (...) @sink(i32 %i, i32 %x) 201 ret void 202} 203 204define void @pass_int_s4(i32 %i, i64 %x) { 205; OPT-LABEL: @pass_int_s4( 206; OPT-NEXT: entry: 207; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i64 [[X:%.*]]) 208; OPT-NEXT: ret void 209; 210; ABI-LABEL: @pass_int_s4( 211; ABI-NEXT: entry: 212; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S4_VARARG:%.*]], align 16 213; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 16, ptr [[VARARG_BUFFER]]) 214; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S4_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 215; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 216; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S4_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2 217; ABI-NEXT: store i64 [[X:%.*]], ptr [[TMP1]], align 8 218; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 219; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 16, ptr [[VARARG_BUFFER]]) 220; ABI-NEXT: ret void 221; 222entry: 223 tail call void (...) @sink(i32 %i, i64 %x) 224 ret void 225} 226 227define void @pass_int_s5(i32 %i, <4 x i32> %x) { 228; OPT-LABEL: @pass_int_s5( 229; OPT-NEXT: entry: 230; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], <4 x i32> [[X:%.*]]) 231; OPT-NEXT: ret void 232; 233; ABI-LABEL: @pass_int_s5( 234; ABI-NEXT: entry: 235; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S5_VARARG:%.*]], align 16 236; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 32, ptr [[VARARG_BUFFER]]) 237; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S5_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 238; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 239; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S5_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2 240; ABI-NEXT: store <4 x i32> [[X:%.*]], ptr [[TMP1]], align 16 241; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 242; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 32, ptr [[VARARG_BUFFER]]) 243; ABI-NEXT: ret void 244; 245entry: 246 tail call void (...) @sink(i32 %i, <4 x i32> %x) 247 ret void 248} 249 250define void @pass_asc(i8 %x1, i16 %x2, i32 %x3, i64 %x4, <4 x i32> %x5) { 251; OPT-LABEL: @pass_asc( 252; OPT-NEXT: entry: 253; OPT-NEXT: tail call void (...) @sink(i8 [[X1:%.*]], i16 [[X2:%.*]], i32 [[X3:%.*]], i64 [[X4:%.*]], <4 x i32> [[X5:%.*]]) 254; OPT-NEXT: ret void 255; 256; ABI-LABEL: @pass_asc( 257; ABI-NEXT: entry: 258; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_ASC_VARARG:%.*]], align 16 259; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 48, ptr [[VARARG_BUFFER]]) 260; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 261; ABI-NEXT: store i8 [[X1:%.*]], ptr [[TMP0]], align 1 262; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2 263; ABI-NEXT: store i16 [[X2:%.*]], ptr [[TMP1]], align 2 264; ABI-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 4 265; ABI-NEXT: store i32 [[X3:%.*]], ptr [[TMP2]], align 4 266; ABI-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 6 267; ABI-NEXT: store i64 [[X4:%.*]], ptr [[TMP3]], align 8 268; ABI-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 8 269; ABI-NEXT: store <4 x i32> [[X5:%.*]], ptr [[TMP4]], align 16 270; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 271; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 48, ptr [[VARARG_BUFFER]]) 272; ABI-NEXT: ret void 273; 274entry: 275 tail call void (...) @sink(i8 %x1, i16 %x2, i32 %x3, i64 %x4, <4 x i32> %x5) 276 ret void 277} 278 279define void @pass_dsc(<4 x i32> %x0, i64 %x1, i32 %x2, i16 %x3, i8 %x4) { 280; OPT-LABEL: @pass_dsc( 281; OPT-NEXT: entry: 282; OPT-NEXT: tail call void (...) @sink(<4 x i32> [[X0:%.*]], i64 [[X1:%.*]], i32 [[X2:%.*]], i16 [[X3:%.*]], i8 [[X4:%.*]]) 283; OPT-NEXT: ret void 284; 285; ABI-LABEL: @pass_dsc( 286; ABI-NEXT: entry: 287; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_DSC_VARARG:%.*]], align 16 288; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 33, ptr [[VARARG_BUFFER]]) 289; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 290; ABI-NEXT: store <4 x i32> [[X0:%.*]], ptr [[TMP0]], align 16 291; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 292; ABI-NEXT: store i64 [[X1:%.*]], ptr [[TMP1]], align 8 293; ABI-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2 294; ABI-NEXT: store i32 [[X2:%.*]], ptr [[TMP2]], align 4 295; ABI-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 3 296; ABI-NEXT: store i16 [[X3:%.*]], ptr [[TMP3]], align 2 297; ABI-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 5 298; ABI-NEXT: store i8 [[X4:%.*]], ptr [[TMP4]], align 1 299; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 300; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 33, ptr [[VARARG_BUFFER]]) 301; ABI-NEXT: ret void 302; 303entry: 304 tail call void (...) @sink(<4 x i32> %x0, i64 %x1, i32 %x2, i16 %x3, i8 %x4) 305 ret void 306} 307 308define void @pass_multiple(i32 %i, i8 %x1, i16 %x2, i32 %x3, i64 %x4, <4 x i32> %x5) { 309; OPT-LABEL: @pass_multiple( 310; OPT-NEXT: entry: 311; OPT-NEXT: tail call void (...) @sink(i32 [[I:%.*]], i16 [[X2:%.*]], i64 [[X4:%.*]]) 312; OPT-NEXT: tail call void (...) @sink(i32 [[I]], i8 [[X1:%.*]], i32 [[X3:%.*]], <4 x i32> [[X5:%.*]]) 313; OPT-NEXT: ret void 314; 315; ABI-LABEL: @pass_multiple( 316; ABI-NEXT: entry: 317; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[PASS_MULTIPLE_VARARG:%.*]], align 16 318; ABI-NEXT: [[VARARG_BUFFER1:%.*]] = alloca [[PASS_MULTIPLE_VARARG_0:%.*]], align 16 319; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 16, ptr [[VARARG_BUFFER]]) 320; ABI-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 321; ABI-NEXT: store i32 [[I:%.*]], ptr [[TMP0]], align 4 322; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1 323; ABI-NEXT: store i16 [[X2:%.*]], ptr [[TMP1]], align 2 324; ABI-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 3 325; ABI-NEXT: store i64 [[X4:%.*]], ptr [[TMP2]], align 8 326; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER]]) 327; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 16, ptr [[VARARG_BUFFER]]) 328; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 32, ptr [[VARARG_BUFFER1]]) 329; ABI-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 0 330; ABI-NEXT: store i32 [[I]], ptr [[TMP3]], align 4 331; ABI-NEXT: [[TMP4:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 1 332; ABI-NEXT: store i8 [[X1:%.*]], ptr [[TMP4]], align 1 333; ABI-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 3 334; ABI-NEXT: store i32 [[X3:%.*]], ptr [[TMP5]], align 4 335; ABI-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 5 336; ABI-NEXT: store <4 x i32> [[X5:%.*]], ptr [[TMP6]], align 16 337; ABI-NEXT: call void @sink(ptr [[VARARG_BUFFER1]]) 338; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 32, ptr [[VARARG_BUFFER1]]) 339; ABI-NEXT: ret void 340; 341entry: 342 tail call void (...) @sink(i32 %i, i16 %x2, i64 %x4) 343 tail call void (...) @sink(i32 %i, i8 %x1, i32 %x3, <4 x i32> %x5) 344 ret void 345} 346