brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.1 KiB · 839d0ba Raw
542 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 triple = "amdgcn-amd-amdhsa"4 5; Check the variables are lowered to the locations this target expects6 7; The types show the call frames8; CHECK: %single_i32.vararg = type <{ i32 }>9; CHECK: %single_double.vararg = type <{ double }>10; CHECK: %single_v4f32.vararg = type <{ <4 x float> }>11; CHECK: %single_v8f32.vararg = type <{ <8 x float> }>12; CHECK: %single_v16f32.vararg = type <{ <16 x float> }>13; CHECK: %single_v32f32.vararg = type <{ <32 x float> }>14; CHECK: %i32_double.vararg = type <{ i32, double }>15; CHECK: %double_i32.vararg = type <{ double, i32 }>16; CHECK: %i32_libcS.vararg = type <{ i32, %struct.libcS }>17; CHECK: %libcS_i32.vararg = type <{ %struct.libcS, i32 }>18; CHECK: %i32_v4f32.vararg = type <{ i32, <4 x float> }>19; CHECK: %v4f32_i32.vararg = type <{ <4 x float>, i32 }>20; CHECK: %i32_v8f32.vararg = type <{ i32, <8 x float> }>21; CHECK: %v8f32_i32.vararg = type <{ <8 x float>, i32 }>22; CHECK: %i32_v16f32.vararg = type <{ i32, <16 x float> }>23; CHECK: %v16f32_i32.vararg = type <{ <16 x float>, i32 }>24; CHECK: %i32_v32f32.vararg = type <{ i32, <32 x float> }>25; CHECK: %v32f32_i32.vararg = type <{ <32 x float>, i32 }>26; CHECK: %fptr_single_i32.vararg = type <{ i32 }>27; CHECK: %fptr_libcS.vararg = type <{ %struct.libcS }>28 29%struct.libcS = type { i8, i16, i32, i64, float, double }30 31@vararg_ptr = hidden addrspace(1) global ptr @vararg, align 832 33define hidden void @copy(ptr noundef %va) {34; CHECK-LABEL: define {{[^@]+}}@copy(ptr noundef %va) {35; CHECK-NEXT:  entry:36; CHECK-NEXT:    %va.addr = alloca ptr, align 8, addrspace(5)37; CHECK-NEXT:    %cp = alloca ptr, align 8, addrspace(5)38; CHECK-NEXT:    %va.addr.ascast = addrspacecast ptr addrspace(5) %va.addr to ptr39; CHECK-NEXT:    %cp.ascast = addrspacecast ptr addrspace(5) %cp to ptr40; CHECK-NEXT:    store ptr %va, ptr addrspace(5) %va.addr, align 841; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %cp)42; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr %cp.ascast, ptr %va.addr.ascast, i32 8, i1 false)43; CHECK-NEXT:    %0 = load ptr, ptr addrspace(5) %cp, align 844; CHECK-NEXT:    call void @valist(ptr noundef %0)45; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %cp)46; CHECK-NEXT:    ret void47;48entry:49  %va.addr = alloca ptr, align 8, addrspace(5)50  %cp = alloca ptr, align 8, addrspace(5)51  %va.addr.ascast = addrspacecast ptr addrspace(5) %va.addr to ptr52  %cp.ascast = addrspacecast ptr addrspace(5) %cp to ptr53  store ptr %va, ptr addrspace(5) %va.addr, align 854  call void @llvm.lifetime.start.p5(ptr addrspace(5) %cp)55  call void @llvm.va_copy.p0(ptr %cp.ascast, ptr nonnull %va.addr.ascast)56  %0 = load ptr, ptr addrspace(5) %cp, align 857  call void @valist(ptr noundef %0)58  call void @llvm.lifetime.end.p5(ptr addrspace(5) %cp)59  ret void60}61 62declare void @llvm.lifetime.start.p5(ptr addrspace(5) nocapture)63 64declare void @llvm.va_copy.p0(ptr, ptr)65 66declare hidden void @valist(ptr noundef)67 68declare void @llvm.lifetime.end.p5(ptr addrspace(5) nocapture)69 70define hidden void @start_once(...) {71; CHECK-LABEL: define {{[^@]+}}@start_once(ptr %varargs) {72; CHECK-NEXT:  entry:73; CHECK-NEXT:    %s = alloca ptr, align 8, addrspace(5)74; CHECK-NEXT:    %s.ascast = addrspacecast ptr addrspace(5) %s to ptr75; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %s)76; CHECK-NEXT:    store ptr %varargs, ptr %s.ascast, align 877; CHECK-NEXT:    %0 = load ptr, ptr addrspace(5) %s, align 878; CHECK-NEXT:    call void @valist(ptr noundef %0)79; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %s)80; CHECK-NEXT:    ret void81;82entry:83  %s = alloca ptr, align 8, addrspace(5)84  %s.ascast = addrspacecast ptr addrspace(5) %s to ptr85  call void @llvm.lifetime.start.p5(ptr addrspace(5) %s)86  call void @llvm.va_start.p0(ptr %s.ascast)87  %0 = load ptr, ptr addrspace(5) %s, align 888  call void @valist(ptr noundef %0)89  call void @llvm.va_end.p0(ptr %s.ascast)90  call void @llvm.lifetime.end.p5(ptr addrspace(5) %s)91  ret void92}93 94declare void @llvm.va_start.p0(ptr)95 96declare void @llvm.va_end.p0(ptr)97 98define hidden void @start_twice(...) {99; CHECK-LABEL: define {{[^@]+}}@start_twice(ptr %varargs) {100; CHECK-NEXT:  entry:101; CHECK-NEXT:    %s0 = alloca ptr, align 8, addrspace(5)102; CHECK-NEXT:    %s1 = alloca ptr, align 8, addrspace(5)103; CHECK-NEXT:    %s0.ascast = addrspacecast ptr addrspace(5) %s0 to ptr104; CHECK-NEXT:    %s1.ascast = addrspacecast ptr addrspace(5) %s1 to ptr105; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %s0)106; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %s1)107; CHECK-NEXT:    store ptr %varargs, ptr %s0.ascast, align 8108; CHECK-NEXT:    %0 = load ptr, ptr addrspace(5) %s0, align 8109; CHECK-NEXT:    call void @valist(ptr noundef %0)110; CHECK-NEXT:    store ptr %varargs, ptr %s1.ascast, align 8111; CHECK-NEXT:    %1 = load ptr, ptr addrspace(5) %s1, align 8112; CHECK-NEXT:    call void @valist(ptr noundef %1)113; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %s1)114; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %s0)115; CHECK-NEXT:    ret void116;117entry:118  %s0 = alloca ptr, align 8, addrspace(5)119  %s1 = alloca ptr, align 8, addrspace(5)120  %s0.ascast = addrspacecast ptr addrspace(5) %s0 to ptr121  %s1.ascast = addrspacecast ptr addrspace(5) %s1 to ptr122  call void @llvm.lifetime.start.p5(ptr addrspace(5) %s0)123  call void @llvm.lifetime.start.p5(ptr addrspace(5) %s1)124  call void @llvm.va_start.p0(ptr %s0.ascast)125  %0 = load ptr, ptr addrspace(5) %s0, align 8126  call void @valist(ptr noundef %0)127  call void @llvm.va_end.p0(ptr %s0.ascast)128  call void @llvm.va_start.p0(ptr %s1.ascast)129  %1 = load ptr, ptr addrspace(5) %s1, align 8130  call void @valist(ptr noundef %1)131  call void @llvm.va_end.p0(ptr %s1.ascast)132  call void @llvm.lifetime.end.p5(ptr addrspace(5) %s1)133  call void @llvm.lifetime.end.p5(ptr addrspace(5) %s0)134  ret void135}136 137define hidden void @single_i32(i32 noundef %x) {138; CHECK-LABEL: define {{[^@]+}}@single_i32(i32 noundef %x) {139; CHECK-NEXT:  entry:140; CHECK-NEXT:    %vararg_buffer = alloca %single_i32.vararg, align 4, addrspace(5)141; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)142; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0143; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4144; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr145; CHECK-NEXT:    call void @vararg(ptr %1)146; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)147; CHECK-NEXT:    ret void148;149entry:150  tail call void (...) @vararg(i32 noundef %x)151  ret void152}153 154declare hidden void @vararg(...)155 156define hidden void @single_double(double noundef %x) {157; CHECK-LABEL: define {{[^@]+}}@single_double(double noundef %x) {158; CHECK-NEXT:  entry:159; CHECK-NEXT:    %vararg_buffer = alloca %single_double.vararg, align 4, addrspace(5)160; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)161; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_double.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0162; CHECK-NEXT:    store double %x, ptr addrspace(5) %0, align 8163; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr164; CHECK-NEXT:    call void @vararg(ptr %1)165; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)166; CHECK-NEXT:    ret void167;168entry:169  tail call void (...) @vararg(double noundef %x)170  ret void171}172 173define hidden void @single_v4f32(<4 x float> noundef %x) {174; CHECK-LABEL: define {{[^@]+}}@single_v4f32(<4 x float> noundef %x) {175; CHECK-NEXT:  entry:176; CHECK-NEXT:    %vararg_buffer = alloca %single_v4f32.vararg, align 4, addrspace(5)177; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)178; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_v4f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0179; CHECK-NEXT:    store <4 x float> %x, ptr addrspace(5) %0, align 16180; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr181; CHECK-NEXT:    call void @vararg(ptr %1)182; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)183; CHECK-NEXT:    ret void184;185entry:186  tail call void (...) @vararg(<4 x float> noundef %x)187  ret void188}189 190define hidden void @single_v8f32(<8 x float> noundef %x) {191; CHECK-LABEL: define {{[^@]+}}@single_v8f32(<8 x float> noundef %x) {192; CHECK-NEXT:  entry:193; CHECK-NEXT:    %vararg_buffer = alloca %single_v8f32.vararg, align 4, addrspace(5)194; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)195; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_v8f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0196; CHECK-NEXT:    store <8 x float> %x, ptr addrspace(5) %0, align 32197; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr198; CHECK-NEXT:    call void @vararg(ptr %1)199; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)200; CHECK-NEXT:    ret void201;202entry:203  tail call void (...) @vararg(<8 x float> noundef %x)204  ret void205}206 207define hidden void @single_v16f32(<16 x float> noundef %x) {208; CHECK-LABEL: define {{[^@]+}}@single_v16f32(<16 x float> noundef %x) {209; CHECK-NEXT:  entry:210; CHECK-NEXT:    %vararg_buffer = alloca %single_v16f32.vararg, align 4, addrspace(5)211; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)212; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_v16f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0213; CHECK-NEXT:    store <16 x float> %x, ptr addrspace(5) %0, align 64214; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr215; CHECK-NEXT:    call void @vararg(ptr %1)216; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)217; CHECK-NEXT:    ret void218;219entry:220  tail call void (...) @vararg(<16 x float> noundef %x)221  ret void222}223 224define hidden void @single_v32f32(<32 x float> noundef %x) {225; CHECK-LABEL: define {{[^@]+}}@single_v32f32(<32 x float> noundef %x) {226; CHECK-NEXT:  entry:227; CHECK-NEXT:    %vararg_buffer = alloca %single_v32f32.vararg, align 4, addrspace(5)228; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)229; CHECK-NEXT:    %0 = getelementptr inbounds nuw %single_v32f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0230; CHECK-NEXT:    store <32 x float> %x, ptr addrspace(5) %0, align 128231; CHECK-NEXT:    %1 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr232; CHECK-NEXT:    call void @vararg(ptr %1)233; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)234; CHECK-NEXT:    ret void235;236entry:237  tail call void (...) @vararg(<32 x float> noundef %x)238  ret void239}240 241define hidden void @i32_double(i32 noundef %x, double noundef %y) {242; CHECK-LABEL: define {{[^@]+}}@i32_double(i32 noundef %x, double noundef %y) {243; CHECK-NEXT:  entry:244; CHECK-NEXT:    %vararg_buffer = alloca %i32_double.vararg, align 4, addrspace(5)245; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)246; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_double.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0247; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4248; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_double.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1249; CHECK-NEXT:    store double %y, ptr addrspace(5) %1, align 8250; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr251; CHECK-NEXT:    call void @vararg(ptr %2)252; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)253; CHECK-NEXT:    ret void254;255entry:256  tail call void (...) @vararg(i32 noundef %x, double noundef %y)257  ret void258}259 260define hidden void @double_i32(double noundef %x, i32 noundef %y) {261; CHECK-LABEL: define {{[^@]+}}@double_i32(double noundef %x, i32 noundef %y) {262; CHECK-NEXT:  entry:263; CHECK-NEXT:    %vararg_buffer = alloca %double_i32.vararg, align 4, addrspace(5)264; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)265; CHECK-NEXT:    %0 = getelementptr inbounds nuw %double_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0266; CHECK-NEXT:    store double %x, ptr addrspace(5) %0, align 8267; CHECK-NEXT:    %1 = getelementptr inbounds nuw %double_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1268; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4269; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr270; CHECK-NEXT:    call void @vararg(ptr %2)271; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)272; CHECK-NEXT:    ret void273;274entry:275  tail call void (...) @vararg(double noundef %x, i32 noundef %y)276  ret void277}278 279define 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) {280; 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) {281; CHECK-NEXT:  entry:282; CHECK-NEXT:    %vararg_buffer = alloca %i32_libcS.vararg, align 4, addrspace(5)283; CHECK-NEXT:    %.fca.0.insert = insertvalue %struct.libcS poison, i8 %y.coerce0, 0284; CHECK-NEXT:    %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %y.coerce1, 1285; CHECK-NEXT:    %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %y.coerce2, 2286; CHECK-NEXT:    %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %y.coerce3, 3287; CHECK-NEXT:    %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %y.coerce4, 4288; CHECK-NEXT:    %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %y.coerce5, 5289; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)290; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_libcS.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0291; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4292; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_libcS.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1293; CHECK-NEXT:    store %struct.libcS %.fca.5.insert, ptr addrspace(5) %1, align 8294; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr295; CHECK-NEXT:    call void @vararg(ptr %2)296; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)297; CHECK-NEXT:    ret void298;299entry:300  %.fca.0.insert = insertvalue %struct.libcS poison, i8 %y.coerce0, 0301  %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %y.coerce1, 1302  %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %y.coerce2, 2303  %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %y.coerce3, 3304  %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %y.coerce4, 4305  %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %y.coerce5, 5306  tail call void (...) @vararg(i32 noundef %x, %struct.libcS %.fca.5.insert)307  ret void308}309 310define 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) {311; 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) {312; CHECK-NEXT:  entry:313; CHECK-NEXT:    %vararg_buffer = alloca %libcS_i32.vararg, align 4, addrspace(5)314; CHECK-NEXT:    %.fca.0.insert = insertvalue %struct.libcS poison, i8 %x.coerce0, 0315; CHECK-NEXT:    %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %x.coerce1, 1316; CHECK-NEXT:    %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %x.coerce2, 2317; CHECK-NEXT:    %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %x.coerce3, 3318; CHECK-NEXT:    %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %x.coerce4, 4319; CHECK-NEXT:    %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %x.coerce5, 5320; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)321; CHECK-NEXT:    %0 = getelementptr inbounds nuw %libcS_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0322; CHECK-NEXT:    store %struct.libcS %.fca.5.insert, ptr addrspace(5) %0, align 8323; CHECK-NEXT:    %1 = getelementptr inbounds nuw %libcS_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1324; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4325; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr326; CHECK-NEXT:    call void @vararg(ptr %2)327; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)328; CHECK-NEXT:    ret void329;330entry:331  %.fca.0.insert = insertvalue %struct.libcS poison, i8 %x.coerce0, 0332  %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %x.coerce1, 1333  %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %x.coerce2, 2334  %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %x.coerce3, 3335  %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %x.coerce4, 4336  %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %x.coerce5, 5337  tail call void (...) @vararg(%struct.libcS %.fca.5.insert, i32 noundef %y)338  ret void339}340 341define hidden void @i32_v4f32(i32 noundef %x, <4 x float> noundef %y) {342; CHECK-LABEL: define {{[^@]+}}@i32_v4f32(i32 noundef %x, <4 x float> noundef %y) {343; CHECK-NEXT:  entry:344; CHECK-NEXT:    %vararg_buffer = alloca %i32_v4f32.vararg, align 4, addrspace(5)345; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)346; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_v4f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0347; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4348; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_v4f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1349; CHECK-NEXT:    store <4 x float> %y, ptr addrspace(5) %1, align 16350; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr351; CHECK-NEXT:    call void @vararg(ptr %2)352; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)353; CHECK-NEXT:    ret void354;355entry:356  tail call void (...) @vararg(i32 noundef %x, <4 x float> noundef %y)357  ret void358}359 360define hidden void @v4f32_i32(<4 x float> noundef %x, i32 noundef %y) {361; CHECK-LABEL: define {{[^@]+}}@v4f32_i32(<4 x float> noundef %x, i32 noundef %y) {362; CHECK-NEXT:  entry:363; CHECK-NEXT:    %vararg_buffer = alloca %v4f32_i32.vararg, align 4, addrspace(5)364; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)365; CHECK-NEXT:    %0 = getelementptr inbounds nuw %v4f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0366; CHECK-NEXT:    store <4 x float> %x, ptr addrspace(5) %0, align 16367; CHECK-NEXT:    %1 = getelementptr inbounds nuw %v4f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1368; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4369; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr370; CHECK-NEXT:    call void @vararg(ptr %2)371; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)372; CHECK-NEXT:    ret void373;374entry:375  tail call void (...) @vararg(<4 x float> noundef %x, i32 noundef %y)376  ret void377}378 379define hidden void @i32_v8f32(i32 noundef %x, <8 x float> noundef %y) {380; CHECK-LABEL: define {{[^@]+}}@i32_v8f32(i32 noundef %x, <8 x float> noundef %y) {381; CHECK-NEXT:  entry:382; CHECK-NEXT:    %vararg_buffer = alloca %i32_v8f32.vararg, align 4, addrspace(5)383; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)384; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_v8f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0385; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4386; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_v8f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1387; CHECK-NEXT:    store <8 x float> %y, ptr addrspace(5) %1, align 32388; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr389; CHECK-NEXT:    call void @vararg(ptr %2)390; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)391; CHECK-NEXT:    ret void392;393entry:394  tail call void (...) @vararg(i32 noundef %x, <8 x float> noundef %y)395  ret void396}397 398define hidden void @v8f32_i32(<8 x float> noundef %x, i32 noundef %y) {399; CHECK-LABEL: define {{[^@]+}}@v8f32_i32(<8 x float> noundef %x, i32 noundef %y) {400; CHECK-NEXT:  entry:401; CHECK-NEXT:    %vararg_buffer = alloca %v8f32_i32.vararg, align 4, addrspace(5)402; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)403; CHECK-NEXT:    %0 = getelementptr inbounds nuw %v8f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0404; CHECK-NEXT:    store <8 x float> %x, ptr addrspace(5) %0, align 32405; CHECK-NEXT:    %1 = getelementptr inbounds nuw %v8f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1406; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4407; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr408; CHECK-NEXT:    call void @vararg(ptr %2)409; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)410; CHECK-NEXT:    ret void411;412entry:413  tail call void (...) @vararg(<8 x float> noundef %x, i32 noundef %y)414  ret void415}416 417define hidden void @i32_v16f32(i32 noundef %x, <16 x float> noundef %y) {418; CHECK-LABEL: define {{[^@]+}}@i32_v16f32(i32 noundef %x, <16 x float> noundef %y) {419; CHECK-NEXT:  entry:420; CHECK-NEXT:    %vararg_buffer = alloca %i32_v16f32.vararg, align 4, addrspace(5)421; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)422; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_v16f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0423; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4424; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_v16f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1425; CHECK-NEXT:    store <16 x float> %y, ptr addrspace(5) %1, align 64426; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr427; CHECK-NEXT:    call void @vararg(ptr %2)428; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)429; CHECK-NEXT:    ret void430;431entry:432  tail call void (...) @vararg(i32 noundef %x, <16 x float> noundef %y)433  ret void434}435 436define hidden void @v16f32_i32(<16 x float> noundef %x, i32 noundef %y) {437; CHECK-LABEL: define {{[^@]+}}@v16f32_i32(<16 x float> noundef %x, i32 noundef %y) {438; CHECK-NEXT:  entry:439; CHECK-NEXT:    %vararg_buffer = alloca %v16f32_i32.vararg, align 4, addrspace(5)440; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)441; CHECK-NEXT:    %0 = getelementptr inbounds nuw %v16f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0442; CHECK-NEXT:    store <16 x float> %x, ptr addrspace(5) %0, align 64443; CHECK-NEXT:    %1 = getelementptr inbounds nuw %v16f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1444; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4445; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr446; CHECK-NEXT:    call void @vararg(ptr %2)447; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)448; CHECK-NEXT:    ret void449;450entry:451  tail call void (...) @vararg(<16 x float> noundef %x, i32 noundef %y)452  ret void453}454 455define hidden void @i32_v32f32(i32 noundef %x, <32 x float> noundef %y) {456; CHECK-LABEL: define {{[^@]+}}@i32_v32f32(i32 noundef %x, <32 x float> noundef %y) {457; CHECK-NEXT:  entry:458; CHECK-NEXT:    %vararg_buffer = alloca %i32_v32f32.vararg, align 4, addrspace(5)459; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)460; CHECK-NEXT:    %0 = getelementptr inbounds nuw %i32_v32f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0461; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %0, align 4462; CHECK-NEXT:    %1 = getelementptr inbounds nuw %i32_v32f32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1463; CHECK-NEXT:    store <32 x float> %y, ptr addrspace(5) %1, align 128464; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr465; CHECK-NEXT:    call void @vararg(ptr %2)466; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)467; CHECK-NEXT:    ret void468;469entry:470  tail call void (...) @vararg(i32 noundef %x, <32 x float> noundef %y)471  ret void472}473 474define hidden void @v32f32_i32(<32 x float> noundef %x, i32 noundef %y) {475; CHECK-LABEL: define {{[^@]+}}@v32f32_i32(<32 x float> noundef %x, i32 noundef %y) {476; CHECK-NEXT:  entry:477; CHECK-NEXT:    %vararg_buffer = alloca %v32f32_i32.vararg, align 4, addrspace(5)478; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)479; CHECK-NEXT:    %0 = getelementptr inbounds nuw %v32f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0480; CHECK-NEXT:    store <32 x float> %x, ptr addrspace(5) %0, align 128481; CHECK-NEXT:    %1 = getelementptr inbounds nuw %v32f32_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 1482; CHECK-NEXT:    store i32 %y, ptr addrspace(5) %1, align 4483; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr484; CHECK-NEXT:    call void @vararg(ptr %2)485; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)486; CHECK-NEXT:    ret void487;488entry:489  tail call void (...) @vararg(<32 x float> noundef %x, i32 noundef %y)490  ret void491}492 493define hidden void @fptr_single_i32(i32 noundef %x) {494; CHECK-LABEL: define {{[^@]+}}@fptr_single_i32(i32 noundef %x) {495; CHECK-NEXT:  entry:496; CHECK-NEXT:    %vararg_buffer = alloca %fptr_single_i32.vararg, align 4, addrspace(5)497; CHECK-NEXT:    %0 = load volatile ptr, ptr addrspacecast (ptr addrspace(1) @vararg_ptr to ptr), align 8498; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)499; CHECK-NEXT:    %1 = getelementptr inbounds nuw %fptr_single_i32.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0500; CHECK-NEXT:    store i32 %x, ptr addrspace(5) %1, align 4501; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr502; CHECK-NEXT:    call void %0(ptr %2)503; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)504; CHECK-NEXT:    ret void505;506entry:507  %0 = load volatile ptr, ptr addrspacecast (ptr addrspace(1) @vararg_ptr to ptr), align 8508  tail call void (...) %0(i32 noundef %x)509  ret void510}511 512define hidden void @fptr_libcS(i8 %x.coerce0, i16 %x.coerce1, i32 %x.coerce2, i64 %x.coerce3, float %x.coerce4, double %x.coerce5) {513; CHECK-LABEL: define {{[^@]+}}@fptr_libcS(i8 %x.coerce0, i16 %x.coerce1, i32 %x.coerce2, i64 %x.coerce3, float %x.coerce4, double %x.coerce5) {514; CHECK-NEXT:  entry:515; CHECK-NEXT:    %vararg_buffer = alloca %fptr_libcS.vararg, align 4, addrspace(5)516; CHECK-NEXT:    %0 = load volatile ptr, ptr addrspacecast (ptr addrspace(1) @vararg_ptr to ptr), align 8517; CHECK-NEXT:    %.fca.0.insert = insertvalue %struct.libcS poison, i8 %x.coerce0, 0518; CHECK-NEXT:    %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %x.coerce1, 1519; CHECK-NEXT:    %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %x.coerce2, 2520; CHECK-NEXT:    %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %x.coerce3, 3521; CHECK-NEXT:    %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %x.coerce4, 4522; CHECK-NEXT:    %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %x.coerce5, 5523; CHECK-NEXT:    call void @llvm.lifetime.start.p5(ptr addrspace(5) %vararg_buffer)524; CHECK-NEXT:    %1 = getelementptr inbounds nuw %fptr_libcS.vararg, ptr addrspace(5) %vararg_buffer, i32 0, i32 0525; CHECK-NEXT:    store %struct.libcS %.fca.5.insert, ptr addrspace(5) %1, align 8526; CHECK-NEXT:    %2 = addrspacecast ptr addrspace(5) %vararg_buffer to ptr527; CHECK-NEXT:    call void %0(ptr %2)528; CHECK-NEXT:    call void @llvm.lifetime.end.p5(ptr addrspace(5) %vararg_buffer)529; CHECK-NEXT:    ret void530;531entry:532  %0 = load volatile ptr, ptr addrspacecast (ptr addrspace(1) @vararg_ptr to ptr), align 8533  %.fca.0.insert = insertvalue %struct.libcS poison, i8 %x.coerce0, 0534  %.fca.1.insert = insertvalue %struct.libcS %.fca.0.insert, i16 %x.coerce1, 1535  %.fca.2.insert = insertvalue %struct.libcS %.fca.1.insert, i32 %x.coerce2, 2536  %.fca.3.insert = insertvalue %struct.libcS %.fca.2.insert, i64 %x.coerce3, 3537  %.fca.4.insert = insertvalue %struct.libcS %.fca.3.insert, float %x.coerce4, 4538  %.fca.5.insert = insertvalue %struct.libcS %.fca.4.insert, double %x.coerce5, 5539  tail call void (...) %0(%struct.libcS %.fca.5.insert)540  ret void541}542