323 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-pc-win32 | FileCheck %s3 4define void @pass_va(i32 %count, ...) nounwind {5; CHECK-LABEL: pass_va:6; CHECK: // %bb.0: // %entry7; CHECK-NEXT: str x30, [sp, #-80]! // 8-byte Folded Spill8; CHECK-NEXT: add x8, sp, #249; CHECK-NEXT: add x0, sp, #2410; CHECK-NEXT: stp x1, x2, [sp, #24]11; CHECK-NEXT: stp x3, x4, [sp, #40]12; CHECK-NEXT: stp x5, x6, [sp, #56]13; CHECK-NEXT: str x7, [sp, #72]14; CHECK-NEXT: str x8, [sp, #8]15; CHECK-NEXT: bl other_func16; CHECK-NEXT: ldr x30, [sp], #80 // 8-byte Folded Reload17; CHECK-NEXT: ret18entry:19 %ap = alloca ptr, align 820 call void @llvm.va_start(ptr %ap)21 %ap2 = load ptr, ptr %ap, align 822 call void @other_func(ptr %ap2)23 ret void24}25 26declare void @other_func(ptr) local_unnamed_addr27 28declare void @llvm.va_start(ptr) nounwind29declare void @llvm.va_copy(ptr, ptr) nounwind30 31define ptr @f9(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, i64 %a8, ...) nounwind {32; CHECK-LABEL: f9:33; CHECK: // %bb.0: // %entry34; CHECK-NEXT: sub sp, sp, #1635; CHECK-NEXT: add x8, sp, #2436; CHECK-NEXT: add x0, sp, #2437; CHECK-NEXT: str x8, [sp, #8]38; CHECK-NEXT: add sp, sp, #1639; CHECK-NEXT: ret40entry:41 %ap = alloca ptr, align 842 call void @llvm.va_start(ptr %ap)43 %ap2 = load ptr, ptr %ap, align 844 ret ptr %ap245}46 47define ptr @f8(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, ...) nounwind {48; CHECK-LABEL: f8:49; CHECK: // %bb.0: // %entry50; CHECK-NEXT: sub sp, sp, #1651; CHECK-NEXT: add x8, sp, #1652; CHECK-NEXT: add x0, sp, #1653; CHECK-NEXT: str x8, [sp, #8]54; CHECK-NEXT: add sp, sp, #1655; CHECK-NEXT: ret56entry:57 %ap = alloca ptr, align 858 call void @llvm.va_start(ptr %ap)59 %ap2 = load ptr, ptr %ap, align 860 ret ptr %ap261}62 63define ptr @f7(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, ...) nounwind {64; CHECK-LABEL: f7:65; CHECK: // %bb.0: // %entry66; CHECK-NEXT: sub sp, sp, #3267; CHECK-NEXT: add x8, sp, #2468; CHECK-NEXT: add x0, sp, #2469; CHECK-NEXT: str x7, [sp, #24]70; CHECK-NEXT: str x8, [sp, #8]71; CHECK-NEXT: add sp, sp, #3272; CHECK-NEXT: ret73entry:74 %ap = alloca ptr, align 875 call void @llvm.va_start(ptr %ap)76 %ap2 = load ptr, ptr %ap, align 877 ret ptr %ap278}79 80define void @copy1(i64 %a0, ...) nounwind {81; CHECK-LABEL: copy1:82; CHECK: // %bb.0: // %entry83; CHECK-NEXT: sub sp, sp, #8084; CHECK-NEXT: add x8, sp, #2485; CHECK-NEXT: stp x1, x2, [sp, #24]86; CHECK-NEXT: stp x3, x4, [sp, #40]87; CHECK-NEXT: stp x5, x6, [sp, #56]88; CHECK-NEXT: str x7, [sp, #72]89; CHECK-NEXT: stp x8, x8, [sp], #8090; CHECK-NEXT: ret91entry:92 %ap = alloca ptr, align 893 %cp = alloca ptr, align 894 call void @llvm.va_start(ptr %ap)95 call void @llvm.va_copy(ptr %cp, ptr %ap)96 ret void97}98 99declare void @llvm.va_end(ptr)100declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #1101declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #1102 103declare i32 @__stdio_common_vsprintf(i64, ptr, i64, ptr, ptr, ptr) local_unnamed_addr #3104declare ptr @__local_stdio_printf_options() local_unnamed_addr #4105 106define i32 @fp(ptr, i64, ptr, ...) local_unnamed_addr #6 {107; CHECK-LABEL: fp:108; CHECK: .seh_proc fp109; CHECK-NEXT: // %bb.0:110; CHECK-NEXT: stp x19, x20, [sp, #-96]! // 16-byte Folded Spill111; CHECK-NEXT: .seh_save_regp_x x19, 96112; CHECK-NEXT: str x21, [sp, #16] // 8-byte Spill113; CHECK-NEXT: .seh_save_reg x21, 16114; CHECK-NEXT: stp x29, x30, [sp, #24] // 16-byte Folded Spill115; CHECK-NEXT: .seh_save_fplr 24116; CHECK-NEXT: add x29, sp, #24117; CHECK-NEXT: .seh_add_fp 24118; CHECK-NEXT: .seh_endprologue119; CHECK-NEXT: add x8, x29, #32120; CHECK-NEXT: mov x19, x2121; CHECK-NEXT: mov x20, x1122; CHECK-NEXT: mov x21, x0123; CHECK-NEXT: stp x3, x4, [x29, #32]124; CHECK-NEXT: stp x5, x6, [x29, #48]125; CHECK-NEXT: str x7, [x29, #64]126; CHECK-NEXT: str x8, [x29, #16]127; CHECK-NEXT: bl __local_stdio_printf_options128; CHECK-NEXT: ldr x8, [x0]129; CHECK-NEXT: add x5, x29, #32130; CHECK-NEXT: mov x1, x21131; CHECK-NEXT: mov x2, x20132; CHECK-NEXT: mov x3, x19133; CHECK-NEXT: mov x4, xzr134; CHECK-NEXT: orr x0, x8, #0x2135; CHECK-NEXT: bl __stdio_common_vsprintf136; CHECK-NEXT: cmn w0, #1137; CHECK-NEXT: csinv w0, w0, wzr, gt138; CHECK-NEXT: .seh_startepilogue139; CHECK-NEXT: ldp x29, x30, [sp, #24] // 16-byte Folded Reload140; CHECK-NEXT: .seh_save_fplr 24141; CHECK-NEXT: ldr x21, [sp, #16] // 8-byte Reload142; CHECK-NEXT: .seh_save_reg x21, 16143; CHECK-NEXT: ldp x19, x20, [sp], #96 // 16-byte Folded Reload144; CHECK-NEXT: .seh_save_regp_x x19, 96145; CHECK-NEXT: .seh_endepilogue146; CHECK-NEXT: ret147; CHECK-NEXT: .seh_endfunclet148; CHECK-NEXT: .seh_endproc149 %4 = alloca ptr, align 8150 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #2151 call void @llvm.va_start(ptr nonnull %4)152 %5 = load ptr, ptr %4, align 8153 %6 = call ptr @__local_stdio_printf_options() #2154 %7 = load i64, ptr %6, align 8155 %8 = or i64 %7, 2156 %9 = call i32 @__stdio_common_vsprintf(i64 %8, ptr %0, i64 %1, ptr %2, ptr null, ptr %5) #2157 %10 = icmp sgt i32 %9, -1158 %11 = select i1 %10, i32 %9, i32 -1159 call void @llvm.va_end(ptr nonnull %4)160 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #2161 ret i32 %11162}163 164attributes #6 = { "frame-pointer"="all" }165 166define void @vla(i32, ptr, ...) local_unnamed_addr {167; CHECK-LABEL: vla:168; CHECK: .seh_proc vla169; CHECK-NEXT: // %bb.0:170; CHECK-NEXT: stp x19, x20, [sp, #-112]! // 16-byte Folded Spill171; CHECK-NEXT: .seh_save_regp_x x19, 112172; CHECK-NEXT: stp x21, x22, [sp, #16] // 16-byte Folded Spill173; CHECK-NEXT: .seh_save_regp x21, 16174; CHECK-NEXT: str x23, [sp, #32] // 8-byte Spill175; CHECK-NEXT: .seh_save_reg x23, 32176; CHECK-NEXT: stp x29, x30, [sp, #40] // 16-byte Folded Spill177; CHECK-NEXT: .seh_save_fplr 40178; CHECK-NEXT: add x29, sp, #40179; CHECK-NEXT: .seh_add_fp 40180; CHECK-NEXT: .seh_endprologue181; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0182; CHECK-NEXT: add x8, x29, #24183; CHECK-NEXT: mov w9, w0184; CHECK-NEXT: mov x19, x1185; CHECK-NEXT: str x8, [x29, #16]186; CHECK-NEXT: add x8, x9, #15187; CHECK-NEXT: mov x23, sp188; CHECK-NEXT: lsr x15, x8, #4189; CHECK-NEXT: stp x2, x3, [x29, #24]190; CHECK-NEXT: stp x4, x5, [x29, #40]191; CHECK-NEXT: stp x6, x7, [x29, #56]192; CHECK-NEXT: bl __chkstk193; CHECK-NEXT: sub x20, sp, x15, lsl #4194; CHECK-NEXT: mov sp, x20195; CHECK-NEXT: ldr x21, [x29, #16]196; CHECK-NEXT: sxtw x22, w0197; CHECK-NEXT: bl __local_stdio_printf_options198; CHECK-NEXT: ldr x8, [x0]199; CHECK-NEXT: mov x1, x20200; CHECK-NEXT: mov x2, x22201; CHECK-NEXT: mov x3, x19202; CHECK-NEXT: mov x4, xzr203; CHECK-NEXT: mov x5, x21204; CHECK-NEXT: orr x0, x8, #0x2205; CHECK-NEXT: bl __stdio_common_vsprintf206; CHECK-NEXT: mov sp, x23207; CHECK-NEXT: .seh_startepilogue208; CHECK-NEXT: sub sp, x29, #40209; CHECK-NEXT: .seh_add_fp 40210; CHECK-NEXT: ldp x29, x30, [sp, #40] // 16-byte Folded Reload211; CHECK-NEXT: .seh_save_fplr 40212; CHECK-NEXT: ldr x23, [sp, #32] // 8-byte Reload213; CHECK-NEXT: .seh_save_reg x23, 32214; CHECK-NEXT: ldp x21, x22, [sp, #16] // 16-byte Folded Reload215; CHECK-NEXT: .seh_save_regp x21, 16216; CHECK-NEXT: ldp x19, x20, [sp], #112 // 16-byte Folded Reload217; CHECK-NEXT: .seh_save_regp_x x19, 112218; CHECK-NEXT: .seh_endepilogue219; CHECK-NEXT: ret220; CHECK-NEXT: .seh_endfunclet221; CHECK-NEXT: .seh_endproc222 %3 = alloca ptr, align 8223 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #5224 call void @llvm.va_start(ptr nonnull %3)225 %4 = zext i32 %0 to i64226 %5 = call ptr @llvm.stacksave()227 %6 = alloca i8, i64 %4, align 1228 %7 = load ptr, ptr %3, align 8229 %8 = sext i32 %0 to i64230 %9 = call ptr @__local_stdio_printf_options()231 %10 = load i64, ptr %9, align 8232 %11 = or i64 %10, 2233 %12 = call i32 @__stdio_common_vsprintf(i64 %11, ptr nonnull %6, i64 %8, ptr %1, ptr null, ptr %7)234 call void @llvm.va_end(ptr nonnull %3)235 call void @llvm.stackrestore(ptr %5)236 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #5237 ret void238}239 240declare ptr @llvm.stacksave()241declare void @llvm.stackrestore(ptr)242 243define i32 @snprintf(ptr, i64, ptr, ...) local_unnamed_addr #5 {244; CHECK-LABEL: snprintf:245; CHECK: .seh_proc snprintf246; CHECK-NEXT: // %bb.0:247; CHECK-NEXT: sub sp, sp, #96248; CHECK-NEXT: .seh_stackalloc 96249; CHECK-NEXT: stp x19, x20, [sp, #16] // 16-byte Folded Spill250; CHECK-NEXT: .seh_save_regp x19, 16251; CHECK-NEXT: stp x21, x30, [sp, #32] // 16-byte Folded Spill252; CHECK-NEXT: .seh_save_lrpair x21, 32253; CHECK-NEXT: .seh_endprologue254; CHECK-NEXT: add x8, sp, #56255; CHECK-NEXT: mov x19, x2256; CHECK-NEXT: mov x20, x1257; CHECK-NEXT: mov x21, x0258; CHECK-NEXT: stp x3, x4, [sp, #56]259; CHECK-NEXT: stp x5, x6, [sp, #72]260; CHECK-NEXT: str x7, [sp, #88]261; CHECK-NEXT: str x8, [sp, #8]262; CHECK-NEXT: bl __local_stdio_printf_options263; CHECK-NEXT: ldr x8, [x0]264; CHECK-NEXT: add x5, sp, #56265; CHECK-NEXT: mov x1, x21266; CHECK-NEXT: mov x2, x20267; CHECK-NEXT: mov x3, x19268; CHECK-NEXT: mov x4, xzr269; CHECK-NEXT: orr x0, x8, #0x2270; CHECK-NEXT: bl __stdio_common_vsprintf271; CHECK-NEXT: cmn w0, #1272; CHECK-NEXT: csinv w0, w0, wzr, gt273; CHECK-NEXT: .seh_startepilogue274; CHECK-NEXT: ldp x21, x30, [sp, #32] // 16-byte Folded Reload275; CHECK-NEXT: .seh_save_lrpair x21, 32276; CHECK-NEXT: ldp x19, x20, [sp, #16] // 16-byte Folded Reload277; CHECK-NEXT: .seh_save_regp x19, 16278; CHECK-NEXT: add sp, sp, #96279; CHECK-NEXT: .seh_stackalloc 96280; CHECK-NEXT: .seh_endepilogue281; CHECK-NEXT: ret282; CHECK-NEXT: .seh_endfunclet283; CHECK-NEXT: .seh_endproc284 %4 = alloca ptr, align 8285 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #2286 call void @llvm.va_start(ptr nonnull %4)287 %5 = load ptr, ptr %4, align 8288 %6 = call ptr @__local_stdio_printf_options() #2289 %7 = load i64, ptr %6, align 8290 %8 = or i64 %7, 2291 %9 = call i32 @__stdio_common_vsprintf(i64 %8, ptr %0, i64 %1, ptr %2, ptr null, ptr %5) #2292 %10 = icmp sgt i32 %9, -1293 %11 = select i1 %10, i32 %9, i32 -1294 call void @llvm.va_end(ptr nonnull %4)295 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #2296 ret i32 %11297}298 299define void @fixed_params(i32, double, i32, double, i32, double, i32, double, i32, double) nounwind {300; CHECK-LABEL: fixed_params:301; CHECK: // %bb.0:302; CHECK-NEXT: sub sp, sp, #32303; CHECK-NEXT: mov w8, w4304; CHECK-NEXT: mov w6, w3305; CHECK-NEXT: mov w4, w2306; CHECK-NEXT: mov w2, w1307; CHECK-NEXT: fmov x1, d0308; CHECK-NEXT: fmov x3, d1309; CHECK-NEXT: fmov x5, d2310; CHECK-NEXT: fmov x7, d3311; CHECK-NEXT: str x30, [sp, #16] // 8-byte Spill312; CHECK-NEXT: str d4, [sp, #8]313; CHECK-NEXT: str w8, [sp]314; CHECK-NEXT: bl varargs315; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Reload316; CHECK-NEXT: add sp, sp, #32317; CHECK-NEXT: ret318 tail call void (i32, ...) @varargs(i32 %0, double %1, i32 %2, double %3, i32 %4, double %5, i32 %6, double %7, i32 %8, double %9)319 ret void320}321 322declare void @varargs(i32, ...) local_unnamed_addr323