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 Chesterfielddeclare void @vararg(...) 78516f54eSJon Chesterfield@vararg_ptr = hidden global ptr @vararg, align 4 88516f54eSJon Chesterfield 98516f54eSJon Chesterfield%struct.libcS = type { i8, i16, i32, i32, float, double } 108516f54eSJon Chesterfield 118516f54eSJon Chesterfielddefine hidden void @fptr_single_i32(i32 noundef %x) { 128516f54eSJon Chesterfield; OPT-LABEL: @fptr_single_i32( 138516f54eSJon Chesterfield; OPT-NEXT: entry: 148516f54eSJon Chesterfield; OPT-NEXT: [[TMP0:%.*]] = load volatile ptr, ptr @vararg_ptr, align 4 158516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) [[TMP0]](i32 noundef [[X:%.*]]) 168516f54eSJon Chesterfield; OPT-NEXT: ret void 178516f54eSJon Chesterfield; 188516f54eSJon Chesterfield; ABI-LABEL: @fptr_single_i32( 198516f54eSJon Chesterfield; ABI-NEXT: entry: 208516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[FPTR_SINGLE_I32_VARARG:%.*]], align 16 218516f54eSJon Chesterfield; ABI-NEXT: [[TMP0:%.*]] = load volatile ptr, ptr @vararg_ptr, align 4 228516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[VARARG_BUFFER]]) 23*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[FPTR_SINGLE_I32_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 248516f54eSJon Chesterfield; ABI-NEXT: store i32 [[X:%.*]], ptr [[TMP1]], align 4 258516f54eSJon Chesterfield; ABI-NEXT: call void [[TMP0]](ptr [[VARARG_BUFFER]]) 268516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[VARARG_BUFFER]]) 278516f54eSJon Chesterfield; ABI-NEXT: ret void 288516f54eSJon Chesterfield; 298516f54eSJon Chesterfieldentry: 308516f54eSJon Chesterfield %0 = load volatile ptr, ptr @vararg_ptr, align 4 318516f54eSJon Chesterfield tail call void (...) %0(i32 noundef %x) 328516f54eSJon Chesterfield ret void 338516f54eSJon Chesterfield} 348516f54eSJon Chesterfield 358516f54eSJon Chesterfielddefine hidden void @fptr_libcS(ptr noundef byval(%struct.libcS) align 8 %x) { 368516f54eSJon Chesterfield; OPT-LABEL: @fptr_libcS( 378516f54eSJon Chesterfield; OPT-NEXT: entry: 388516f54eSJon Chesterfield; OPT-NEXT: [[TMP0:%.*]] = load volatile ptr, ptr @vararg_ptr, align 4 398516f54eSJon Chesterfield; OPT-NEXT: tail call void (...) [[TMP0]](ptr noundef nonnull byval([[STRUCT_LIBCS:%.*]]) align 8 [[X:%.*]]) 408516f54eSJon Chesterfield; OPT-NEXT: ret void 418516f54eSJon Chesterfield; 428516f54eSJon Chesterfield; ABI-LABEL: @fptr_libcS( 438516f54eSJon Chesterfield; ABI-NEXT: entry: 448516f54eSJon Chesterfield; ABI-NEXT: [[INDIRECTALLOCA:%.*]] = alloca [[STRUCT_LIBCS:%.*]], align 8 458516f54eSJon Chesterfield; ABI-NEXT: [[VARARG_BUFFER:%.*]] = alloca [[FPTR_LIBCS_VARARG:%.*]], align 16 468516f54eSJon Chesterfield; ABI-NEXT: [[TMP0:%.*]] = load volatile ptr, ptr @vararg_ptr, align 4 478516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[INDIRECTALLOCA]], ptr [[X:%.*]], i64 24, i1 false) 488516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[VARARG_BUFFER]]) 49*94473f4dSHari Limaye; ABI-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[FPTR_LIBCS_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0 508516f54eSJon Chesterfield; ABI-NEXT: store ptr [[INDIRECTALLOCA]], ptr [[TMP1]], align 4 518516f54eSJon Chesterfield; ABI-NEXT: call void [[TMP0]](ptr [[VARARG_BUFFER]]) 528516f54eSJon Chesterfield; ABI-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[VARARG_BUFFER]]) 538516f54eSJon Chesterfield; ABI-NEXT: ret void 548516f54eSJon Chesterfield; 558516f54eSJon Chesterfieldentry: 568516f54eSJon Chesterfield %0 = load volatile ptr, ptr @vararg_ptr, align 4 578516f54eSJon Chesterfield tail call void (...) %0(ptr noundef nonnull byval(%struct.libcS) align 8 %x) 588516f54eSJon Chesterfield ret void 598516f54eSJon Chesterfield} 60