484 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p --function-signature2; RUN: opt -S --passes=expand-variadics --expand-variadics-override=lowering < %s | FileCheck %s3target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"4target triple = "wasm32-unknown-unknown"5 6; Check the variables are lowered to the locations this target expects7 8; The types show the call frames9; CHECK: %single_i32.vararg = type <{ i32 }>10; CHECK: %single_double.vararg = type <{ double }>11; CHECK: %single_v4f32.vararg = type <{ <4 x float> }>12; CHECK: %single_v8f32.vararg = type <{ <8 x float> }>13; CHECK: %single_v16f32.vararg = type <{ <16 x float> }>14; CHECK: %single_v32f32.vararg = type <{ <32 x float> }>15; CHECK: %i32_double.vararg = type <{ i32, [4 x i8], double }>16; CHECK: %double_i32.vararg = type <{ double, i32 }>17; CHECK: %i32_libcS.vararg = type <{ i32, ptr }>18; CHECK: %libcS_i32.vararg = type <{ ptr, i32 }>19; CHECK: %i32_v4f32.vararg = type <{ i32, [12 x i8], <4 x float> }>20; CHECK: %v4f32_i32.vararg = type <{ <4 x float>, i32 }>21; CHECK: %i32_v8f32.vararg = type <{ i32, [28 x i8], <8 x float> }>22; CHECK: %v8f32_i32.vararg = type <{ <8 x float>, i32 }>23; CHECK: %i32_v16f32.vararg = type <{ i32, [60 x i8], <16 x float> }>24; CHECK: %v16f32_i32.vararg = type <{ <16 x float>, i32 }>25; CHECK: %i32_v32f32.vararg = type <{ i32, [124 x i8], <32 x float> }>26; CHECK: %v32f32_i32.vararg = type <{ <32 x float>, i32 }>27; CHECK: %fptr_single_i32.vararg = type <{ i32 }>28; CHECK: %fptr_libcS.vararg = type <{ ptr }>29 30%struct.libcS = type { i8, i16, i32, i32, float, double }31 32@vararg_ptr = hidden global ptr @vararg, align 433 34define hidden void @copy(ptr noundef %va) {35; CHECK-LABEL: define {{[^@]+}}@copy(ptr noundef %va) {36; CHECK-NEXT: entry:37; CHECK-NEXT: %va.addr = alloca ptr, align 438; CHECK-NEXT: %cp = alloca ptr, align 439; CHECK-NEXT: store ptr %va, ptr %va.addr, align 440; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull %cp)41; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr %cp, ptr %va.addr, i32 4, i1 false)42; CHECK-NEXT: %0 = load ptr, ptr %cp, align 443; CHECK-NEXT: call void @valist(ptr noundef %0)44; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull %cp)45; CHECK-NEXT: ret void46;47entry:48 %va.addr = alloca ptr, align 449 %cp = alloca ptr, align 450 store ptr %va, ptr %va.addr, align 451 call void @llvm.lifetime.start.p0(ptr nonnull %cp)52 call void @llvm.va_copy.p0(ptr nonnull %cp, ptr nonnull %va.addr)53 %0 = load ptr, ptr %cp, align 454 call void @valist(ptr noundef %0)55 call void @llvm.lifetime.end.p0(ptr nonnull %cp)56 ret void57}58 59declare void @llvm.lifetime.start.p0(ptr nocapture)60 61declare void @llvm.va_copy.p0(ptr, ptr)62 63declare void @valist(ptr noundef)64 65declare void @llvm.lifetime.end.p0(ptr nocapture)66 67define hidden void @start_once(...) {68; CHECK-LABEL: define {{[^@]+}}@start_once(ptr %varargs) {69; CHECK-NEXT: entry:70; CHECK-NEXT: %s = alloca ptr, align 471; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull %s)72; CHECK-NEXT: store ptr %varargs, ptr %s, align 473; CHECK-NEXT: %0 = load ptr, ptr %s, align 474; CHECK-NEXT: call void @valist(ptr noundef %0)75; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull %s)76; CHECK-NEXT: ret void77;78entry:79 %s = alloca ptr, align 480 call void @llvm.lifetime.start.p0(ptr nonnull %s)81 call void @llvm.va_start.p0(ptr nonnull %s)82 %0 = load ptr, ptr %s, align 483 call void @valist(ptr noundef %0)84 call void @llvm.va_end.p0(ptr %s)85 call void @llvm.lifetime.end.p0(ptr nonnull %s)86 ret void87}88 89declare void @llvm.va_start.p0(ptr)90 91declare void @llvm.va_end.p0(ptr)92 93define hidden void @start_twice(...) {94; CHECK-LABEL: define {{[^@]+}}@start_twice(ptr %varargs) {95; CHECK-NEXT: entry:96; CHECK-NEXT: %s0 = alloca ptr, align 497; CHECK-NEXT: %s1 = alloca ptr, align 498; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull %s0)99; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull %s1)100; CHECK-NEXT: store ptr %varargs, ptr %s0, align 4101; CHECK-NEXT: %0 = load ptr, ptr %s0, align 4102; CHECK-NEXT: call void @valist(ptr noundef %0)103; CHECK-NEXT: store ptr %varargs, ptr %s1, align 4104; CHECK-NEXT: %1 = load ptr, ptr %s1, align 4105; CHECK-NEXT: call void @valist(ptr noundef %1)106; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull %s1)107; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull %s0)108; CHECK-NEXT: ret void109;110entry:111 %s0 = alloca ptr, align 4112 %s1 = alloca ptr, align 4113 call void @llvm.lifetime.start.p0(ptr nonnull %s0)114 call void @llvm.lifetime.start.p0(ptr nonnull %s1)115 call void @llvm.va_start.p0(ptr nonnull %s0)116 %0 = load ptr, ptr %s0, align 4117 call void @valist(ptr noundef %0)118 call void @llvm.va_end.p0(ptr %s0)119 call void @llvm.va_start.p0(ptr nonnull %s1)120 %1 = load ptr, ptr %s1, align 4121 call void @valist(ptr noundef %1)122 call void @llvm.va_end.p0(ptr %s1)123 call void @llvm.lifetime.end.p0(ptr nonnull %s1)124 call void @llvm.lifetime.end.p0(ptr nonnull %s0)125 ret void126}127 128define hidden void @single_i32(i32 noundef %x) {129; CHECK-LABEL: define {{[^@]+}}@single_i32(i32 noundef %x) {130; CHECK-NEXT: entry:131; CHECK-NEXT: %vararg_buffer = alloca %single_i32.vararg, align 16132; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)133; CHECK-NEXT: %0 = getelementptr inbounds nuw %single_i32.vararg, ptr %vararg_buffer, i32 0, i32 0134; CHECK-NEXT: store i32 %x, ptr %0, align 4135; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)136; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)137; CHECK-NEXT: ret void138;139entry:140 tail call void (...) @vararg(i32 noundef %x)141 ret void142}143 144declare void @vararg(...)145 146define hidden void @single_double(double noundef %x) {147; CHECK-LABEL: define {{[^@]+}}@single_double(double noundef %x) {148; CHECK-NEXT: entry:149; CHECK-NEXT: %vararg_buffer = alloca %single_double.vararg, align 16150; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)151; CHECK-NEXT: %0 = getelementptr inbounds nuw %single_double.vararg, ptr %vararg_buffer, i32 0, i32 0152; CHECK-NEXT: store double %x, ptr %0, align 8153; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)154; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)155; CHECK-NEXT: ret void156;157entry:158 tail call void (...) @vararg(double noundef %x)159 ret void160}161 162define hidden void @single_v4f32(<4 x float> noundef %x) {163; CHECK-LABEL: define {{[^@]+}}@single_v4f32(<4 x float> noundef %x) {164; CHECK-NEXT: entry:165; CHECK-NEXT: %vararg_buffer = alloca %single_v4f32.vararg, align 16166; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)167; CHECK-NEXT: %0 = getelementptr inbounds nuw %single_v4f32.vararg, ptr %vararg_buffer, i32 0, i32 0168; CHECK-NEXT: store <4 x float> %x, ptr %0, align 16169; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)170; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)171; CHECK-NEXT: ret void172;173entry:174 tail call void (...) @vararg(<4 x float> noundef %x)175 ret void176}177 178define hidden void @single_v8f32(<8 x float> noundef %x) {179; CHECK-LABEL: define {{[^@]+}}@single_v8f32(<8 x float> noundef %x) {180; CHECK-NEXT: entry:181; CHECK-NEXT: %vararg_buffer = alloca %single_v8f32.vararg, align 32182; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)183; CHECK-NEXT: %0 = getelementptr inbounds nuw %single_v8f32.vararg, ptr %vararg_buffer, i32 0, i32 0184; CHECK-NEXT: store <8 x float> %x, ptr %0, align 32185; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)186; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)187; CHECK-NEXT: ret void188;189entry:190 tail call void (...) @vararg(<8 x float> noundef %x)191 ret void192}193 194define hidden void @single_v16f32(<16 x float> noundef %x) {195; CHECK-LABEL: define {{[^@]+}}@single_v16f32(<16 x float> noundef %x) {196; CHECK-NEXT: entry:197; CHECK-NEXT: %vararg_buffer = alloca %single_v16f32.vararg, align 64198; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)199; CHECK-NEXT: %0 = getelementptr inbounds nuw %single_v16f32.vararg, ptr %vararg_buffer, i32 0, i32 0200; CHECK-NEXT: store <16 x float> %x, ptr %0, align 64201; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)202; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)203; CHECK-NEXT: ret void204;205entry:206 tail call void (...) @vararg(<16 x float> noundef %x)207 ret void208}209 210define hidden void @single_v32f32(<32 x float> noundef %x) {211; CHECK-LABEL: define {{[^@]+}}@single_v32f32(<32 x float> noundef %x) {212; CHECK-NEXT: entry:213; CHECK-NEXT: %vararg_buffer = alloca %single_v32f32.vararg, align 128214; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)215; CHECK-NEXT: %0 = getelementptr inbounds nuw %single_v32f32.vararg, ptr %vararg_buffer, i32 0, i32 0216; CHECK-NEXT: store <32 x float> %x, ptr %0, align 128217; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)218; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)219; CHECK-NEXT: ret void220;221entry:222 tail call void (...) @vararg(<32 x float> noundef %x)223 ret void224}225 226define hidden void @i32_double(i32 noundef %x, double noundef %y) {227; CHECK-LABEL: define {{[^@]+}}@i32_double(i32 noundef %x, double noundef %y) {228; CHECK-NEXT: entry:229; CHECK-NEXT: %vararg_buffer = alloca %i32_double.vararg, align 16230; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)231; CHECK-NEXT: %0 = getelementptr inbounds nuw %i32_double.vararg, ptr %vararg_buffer, i32 0, i32 0232; CHECK-NEXT: store i32 %x, ptr %0, align 4233; CHECK-NEXT: %1 = getelementptr inbounds nuw %i32_double.vararg, ptr %vararg_buffer, i32 0, i32 2234; CHECK-NEXT: store double %y, ptr %1, align 8235; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)236; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)237; CHECK-NEXT: ret void238;239entry:240 tail call void (...) @vararg(i32 noundef %x, double noundef %y)241 ret void242}243 244define hidden void @double_i32(double noundef %x, i32 noundef %y) {245; CHECK-LABEL: define {{[^@]+}}@double_i32(double noundef %x, i32 noundef %y) {246; CHECK-NEXT: entry:247; CHECK-NEXT: %vararg_buffer = alloca %double_i32.vararg, align 16248; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)249; CHECK-NEXT: %0 = getelementptr inbounds nuw %double_i32.vararg, ptr %vararg_buffer, i32 0, i32 0250; CHECK-NEXT: store double %x, ptr %0, align 8251; CHECK-NEXT: %1 = getelementptr inbounds nuw %double_i32.vararg, ptr %vararg_buffer, i32 0, i32 1252; CHECK-NEXT: store i32 %y, ptr %1, align 4253; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)254; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)255; CHECK-NEXT: ret void256;257entry:258 tail call void (...) @vararg(double noundef %x, i32 noundef %y)259 ret void260}261 262define hidden void @i32_libcS(i32 noundef %x, ptr noundef byval(%struct.libcS) align 8 %y) {263; CHECK-LABEL: define {{[^@]+}}@i32_libcS(i32 noundef %x, ptr noundef byval(%struct.libcS) align 8 %y) {264; CHECK-NEXT: entry:265; CHECK-NEXT: %IndirectAlloca = alloca %struct.libcS, align 8266; CHECK-NEXT: %vararg_buffer = alloca %i32_libcS.vararg, align 16267; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr %IndirectAlloca, ptr %y, i64 24, i1 false)268; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)269; CHECK-NEXT: %0 = getelementptr inbounds nuw %i32_libcS.vararg, ptr %vararg_buffer, i32 0, i32 0270; CHECK-NEXT: store i32 %x, ptr %0, align 4271; CHECK-NEXT: %1 = getelementptr inbounds nuw %i32_libcS.vararg, ptr %vararg_buffer, i32 0, i32 1272; CHECK-NEXT: store ptr %IndirectAlloca, ptr %1, align 4273; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)274; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)275; CHECK-NEXT: ret void276;277entry:278 tail call void (...) @vararg(i32 noundef %x, ptr noundef nonnull byval(%struct.libcS) align 8 %y)279 ret void280}281 282define hidden void @libcS_i32(ptr noundef byval(%struct.libcS) align 8 %x, i32 noundef %y) {283; CHECK-LABEL: define {{[^@]+}}@libcS_i32(ptr noundef byval(%struct.libcS) align 8 %x, i32 noundef %y) {284; CHECK-NEXT: entry:285; CHECK-NEXT: %IndirectAlloca = alloca %struct.libcS, align 8286; CHECK-NEXT: %vararg_buffer = alloca %libcS_i32.vararg, align 16287; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr %IndirectAlloca, ptr %x, i64 24, i1 false)288; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)289; CHECK-NEXT: %0 = getelementptr inbounds nuw %libcS_i32.vararg, ptr %vararg_buffer, i32 0, i32 0290; CHECK-NEXT: store ptr %IndirectAlloca, ptr %0, align 4291; CHECK-NEXT: %1 = getelementptr inbounds nuw %libcS_i32.vararg, ptr %vararg_buffer, i32 0, i32 1292; CHECK-NEXT: store i32 %y, ptr %1, align 4293; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)294; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)295; CHECK-NEXT: ret void296;297entry:298 tail call void (...) @vararg(ptr noundef nonnull byval(%struct.libcS) align 8 %x, i32 noundef %y)299 ret void300}301 302define hidden void @i32_v4f32(i32 noundef %x, <4 x float> noundef %y) {303; CHECK-LABEL: define {{[^@]+}}@i32_v4f32(i32 noundef %x, <4 x float> noundef %y) {304; CHECK-NEXT: entry:305; CHECK-NEXT: %vararg_buffer = alloca %i32_v4f32.vararg, align 16306; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)307; CHECK-NEXT: %0 = getelementptr inbounds nuw %i32_v4f32.vararg, ptr %vararg_buffer, i32 0, i32 0308; CHECK-NEXT: store i32 %x, ptr %0, align 4309; CHECK-NEXT: %1 = getelementptr inbounds nuw %i32_v4f32.vararg, ptr %vararg_buffer, i32 0, i32 2310; CHECK-NEXT: store <4 x float> %y, ptr %1, align 16311; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)312; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)313; CHECK-NEXT: ret void314;315entry:316 tail call void (...) @vararg(i32 noundef %x, <4 x float> noundef %y)317 ret void318}319 320define hidden void @v4f32_i32(<4 x float> noundef %x, i32 noundef %y) {321; CHECK-LABEL: define {{[^@]+}}@v4f32_i32(<4 x float> noundef %x, i32 noundef %y) {322; CHECK-NEXT: entry:323; CHECK-NEXT: %vararg_buffer = alloca %v4f32_i32.vararg, align 16324; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)325; CHECK-NEXT: %0 = getelementptr inbounds nuw %v4f32_i32.vararg, ptr %vararg_buffer, i32 0, i32 0326; CHECK-NEXT: store <4 x float> %x, ptr %0, align 16327; CHECK-NEXT: %1 = getelementptr inbounds nuw %v4f32_i32.vararg, ptr %vararg_buffer, i32 0, i32 1328; CHECK-NEXT: store i32 %y, ptr %1, align 4329; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)330; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)331; CHECK-NEXT: ret void332;333entry:334 tail call void (...) @vararg(<4 x float> noundef %x, i32 noundef %y)335 ret void336}337 338define hidden void @i32_v8f32(i32 noundef %x, <8 x float> noundef %y) {339; CHECK-LABEL: define {{[^@]+}}@i32_v8f32(i32 noundef %x, <8 x float> noundef %y) {340; CHECK-NEXT: entry:341; CHECK-NEXT: %vararg_buffer = alloca %i32_v8f32.vararg, align 32342; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)343; CHECK-NEXT: %0 = getelementptr inbounds nuw %i32_v8f32.vararg, ptr %vararg_buffer, i32 0, i32 0344; CHECK-NEXT: store i32 %x, ptr %0, align 4345; CHECK-NEXT: %1 = getelementptr inbounds nuw %i32_v8f32.vararg, ptr %vararg_buffer, i32 0, i32 2346; CHECK-NEXT: store <8 x float> %y, ptr %1, align 32347; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)348; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)349; CHECK-NEXT: ret void350;351entry:352 tail call void (...) @vararg(i32 noundef %x, <8 x float> noundef %y)353 ret void354}355 356define hidden void @v8f32_i32(<8 x float> noundef %x, i32 noundef %y) {357; CHECK-LABEL: define {{[^@]+}}@v8f32_i32(<8 x float> noundef %x, i32 noundef %y) {358; CHECK-NEXT: entry:359; CHECK-NEXT: %vararg_buffer = alloca %v8f32_i32.vararg, align 32360; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)361; CHECK-NEXT: %0 = getelementptr inbounds nuw %v8f32_i32.vararg, ptr %vararg_buffer, i32 0, i32 0362; CHECK-NEXT: store <8 x float> %x, ptr %0, align 32363; CHECK-NEXT: %1 = getelementptr inbounds nuw %v8f32_i32.vararg, ptr %vararg_buffer, i32 0, i32 1364; CHECK-NEXT: store i32 %y, ptr %1, align 4365; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)366; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)367; CHECK-NEXT: ret void368;369entry:370 tail call void (...) @vararg(<8 x float> noundef %x, i32 noundef %y)371 ret void372}373 374define hidden void @i32_v16f32(i32 noundef %x, <16 x float> noundef %y) {375; CHECK-LABEL: define {{[^@]+}}@i32_v16f32(i32 noundef %x, <16 x float> noundef %y) {376; CHECK-NEXT: entry:377; CHECK-NEXT: %vararg_buffer = alloca %i32_v16f32.vararg, align 64378; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)379; CHECK-NEXT: %0 = getelementptr inbounds nuw %i32_v16f32.vararg, ptr %vararg_buffer, i32 0, i32 0380; CHECK-NEXT: store i32 %x, ptr %0, align 4381; CHECK-NEXT: %1 = getelementptr inbounds nuw %i32_v16f32.vararg, ptr %vararg_buffer, i32 0, i32 2382; CHECK-NEXT: store <16 x float> %y, ptr %1, align 64383; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)384; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)385; CHECK-NEXT: ret void386;387entry:388 tail call void (...) @vararg(i32 noundef %x, <16 x float> noundef %y)389 ret void390}391 392define hidden void @v16f32_i32(<16 x float> noundef %x, i32 noundef %y) {393; CHECK-LABEL: define {{[^@]+}}@v16f32_i32(<16 x float> noundef %x, i32 noundef %y) {394; CHECK-NEXT: entry:395; CHECK-NEXT: %vararg_buffer = alloca %v16f32_i32.vararg, align 64396; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)397; CHECK-NEXT: %0 = getelementptr inbounds nuw %v16f32_i32.vararg, ptr %vararg_buffer, i32 0, i32 0398; CHECK-NEXT: store <16 x float> %x, ptr %0, align 64399; CHECK-NEXT: %1 = getelementptr inbounds nuw %v16f32_i32.vararg, ptr %vararg_buffer, i32 0, i32 1400; CHECK-NEXT: store i32 %y, ptr %1, align 4401; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)402; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)403; CHECK-NEXT: ret void404;405entry:406 tail call void (...) @vararg(<16 x float> noundef %x, i32 noundef %y)407 ret void408}409 410define hidden void @i32_v32f32(i32 noundef %x, <32 x float> noundef %y) {411; CHECK-LABEL: define {{[^@]+}}@i32_v32f32(i32 noundef %x, <32 x float> noundef %y) {412; CHECK-NEXT: entry:413; CHECK-NEXT: %vararg_buffer = alloca %i32_v32f32.vararg, align 128414; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)415; CHECK-NEXT: %0 = getelementptr inbounds nuw %i32_v32f32.vararg, ptr %vararg_buffer, i32 0, i32 0416; CHECK-NEXT: store i32 %x, ptr %0, align 4417; CHECK-NEXT: %1 = getelementptr inbounds nuw %i32_v32f32.vararg, ptr %vararg_buffer, i32 0, i32 2418; CHECK-NEXT: store <32 x float> %y, ptr %1, align 128419; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)420; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)421; CHECK-NEXT: ret void422;423entry:424 tail call void (...) @vararg(i32 noundef %x, <32 x float> noundef %y)425 ret void426}427 428define hidden void @v32f32_i32(<32 x float> noundef %x, i32 noundef %y) {429; CHECK-LABEL: define {{[^@]+}}@v32f32_i32(<32 x float> noundef %x, i32 noundef %y) {430; CHECK-NEXT: entry:431; CHECK-NEXT: %vararg_buffer = alloca %v32f32_i32.vararg, align 128432; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)433; CHECK-NEXT: %0 = getelementptr inbounds nuw %v32f32_i32.vararg, ptr %vararg_buffer, i32 0, i32 0434; CHECK-NEXT: store <32 x float> %x, ptr %0, align 128435; CHECK-NEXT: %1 = getelementptr inbounds nuw %v32f32_i32.vararg, ptr %vararg_buffer, i32 0, i32 1436; CHECK-NEXT: store i32 %y, ptr %1, align 4437; CHECK-NEXT: call void @vararg(ptr %vararg_buffer)438; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)439; CHECK-NEXT: ret void440;441entry:442 tail call void (...) @vararg(<32 x float> noundef %x, i32 noundef %y)443 ret void444}445 446define hidden void @fptr_single_i32(i32 noundef %x) {447; CHECK-LABEL: define {{[^@]+}}@fptr_single_i32(i32 noundef %x) {448; CHECK-NEXT: entry:449; CHECK-NEXT: %vararg_buffer = alloca %fptr_single_i32.vararg, align 16450; CHECK-NEXT: %0 = load volatile ptr, ptr @vararg_ptr, align 4451; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)452; CHECK-NEXT: %1 = getelementptr inbounds nuw %fptr_single_i32.vararg, ptr %vararg_buffer, i32 0, i32 0453; CHECK-NEXT: store i32 %x, ptr %1, align 4454; CHECK-NEXT: call void %0(ptr %vararg_buffer)455; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)456; CHECK-NEXT: ret void457;458entry:459 %0 = load volatile ptr, ptr @vararg_ptr, align 4460 tail call void (...) %0(i32 noundef %x)461 ret void462}463 464define hidden void @fptr_libcS(ptr noundef byval(%struct.libcS) align 8 %x) {465; CHECK-LABEL: define {{[^@]+}}@fptr_libcS(ptr noundef byval(%struct.libcS) align 8 %x) {466; CHECK-NEXT: entry:467; CHECK-NEXT: %IndirectAlloca = alloca %struct.libcS, align 8468; CHECK-NEXT: %vararg_buffer = alloca %fptr_libcS.vararg, align 16469; CHECK-NEXT: %0 = load volatile ptr, ptr @vararg_ptr, align 4470; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr %IndirectAlloca, ptr %x, i64 24, i1 false)471; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr %vararg_buffer)472; CHECK-NEXT: %1 = getelementptr inbounds nuw %fptr_libcS.vararg, ptr %vararg_buffer, i32 0, i32 0473; CHECK-NEXT: store ptr %IndirectAlloca, ptr %1, align 4474; CHECK-NEXT: call void %0(ptr %vararg_buffer)475; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr %vararg_buffer)476; CHECK-NEXT: ret void477;478entry:479 %0 = load volatile ptr, ptr @vararg_ptr, align 4480 tail call void (...) %0(ptr noundef nonnull byval(%struct.libcS) align 8 %x)481 ret void482}483 484