12ab19bfaSMartin Storsjö;; Check that this produces the expected assembly output 22ab19bfaSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -o - %s -verify-machineinstrs | FileCheck %s 32ab19bfaSMartin Storsjö;; Also try to write an object file, which verifies that the SEH opcodes 42ab19bfaSMartin Storsjö;; match the actual prologue/epilogue length. 52ab19bfaSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -filetype=obj -o %t.obj %s -verify-machineinstrs 62ab19bfaSMartin Storsjö 72ab19bfaSMartin Storsjö; CHECK-LABEL: alloc_local: 82ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_proc alloc_local 92ab19bfaSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 102ab19bfaSMartin Storsjö; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10} 112ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r4-r10} 122ab19bfaSMartin Storsjö; CHECK-NEXT: sub sp, #4 132ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 4 142ab19bfaSMartin Storsjö; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13, d14, d15} 152ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_save_fregs {d8-d15} 162ab19bfaSMartin Storsjö; CHECK-NEXT: push.w {r11, lr} 172ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 182ab19bfaSMartin Storsjö; CHECK-NEXT: mov r11, sp 192ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_save_sp r11 202ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_endprologue 212ab19bfaSMartin Storsjö; CHECK-NEXT: movw r4, #1256 222ab19bfaSMartin Storsjö; CHECK-NEXT: bl __chkstk 232ab19bfaSMartin Storsjö; CHECK-NEXT: sub.w sp, sp, r4 242ab19bfaSMartin Storsjö; CHECK-NEXT: mov r4, sp 252ab19bfaSMartin Storsjö; CHECK-NEXT: bfc r4, #0, #4 262ab19bfaSMartin Storsjö; CHECK-NEXT: mov sp, r4 272ab19bfaSMartin Storsjö 282ab19bfaSMartin Storsjö; CHECK: ldr.w [[TMP:r[0-9]]], [r11, #104] 292ab19bfaSMartin Storsjö; CHECK: mov r0, [[TMP]] 302ab19bfaSMartin Storsjö 312ab19bfaSMartin Storsjö; CHECK: .seh_startepilogue 322ab19bfaSMartin Storsjö; CHECK-NEXT: mov sp, r11 332ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_save_sp r11 342ab19bfaSMartin Storsjö; CHECK-NEXT: pop.w {r11, lr} 352ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 362ab19bfaSMartin Storsjö; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13, d14, d15} 372ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_save_fregs {d8-d15} 382ab19bfaSMartin Storsjö; CHECK-NEXT: add sp, #4 392ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 4 402ab19bfaSMartin Storsjö; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10} 412ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r4-r10} 422ab19bfaSMartin Storsjö; CHECK-NEXT: bx lr 432ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_nop 442ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 452ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_endproc 462ab19bfaSMartin Storsjö 472ab19bfaSMartin Storsjödefine arm_aapcs_vfpcc void @alloc_local(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d, i32 noundef %e) uwtable { 482ab19bfaSMartin Storsjöentry: 492ab19bfaSMartin Storsjö %buf2 = alloca [5000 x i8], align 16 502ab19bfaSMartin Storsjö %vla = alloca i8, i32 %a, align 1 512ab19bfaSMartin Storsjö call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf2) #3 522ab19bfaSMartin Storsjö call arm_aapcs_vfpcc void @other(i32 noundef %e, ptr noundef nonnull %vla, ptr noundef nonnull %buf2) 532ab19bfaSMartin Storsjö call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12}"() 542ab19bfaSMartin Storsjö call void asm sideeffect "", "~{d8},~{d9},~{d10},~{d11},~{d12},~{d13},~{d14},~{d15}"() 552ab19bfaSMartin Storsjö call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf2) #3 562ab19bfaSMartin Storsjö ret void 572ab19bfaSMartin Storsjö} 582ab19bfaSMartin Storsjö 592ab19bfaSMartin Storsjödeclare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) 602ab19bfaSMartin Storsjödeclare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) 612ab19bfaSMartin Storsjö 622ab19bfaSMartin Storsjödeclare arm_aapcs_vfpcc void @other(i32 noundef, ptr noundef, ptr noundef) 63*40c937cbSMartin Storsjö 64*40c937cbSMartin Storsjö; CHECK-LABEL: everything_varargs: 65*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_proc everything_varargs 66*40c937cbSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 67*40c937cbSMartin Storsjö; CHECK-NEXT: sub sp, #12 68*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 12 69*40c937cbSMartin Storsjö; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9} 70*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r4-r9} 71*40c937cbSMartin Storsjö; CHECK-NEXT: sub sp, #4 72*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 4 73*40c937cbSMartin Storsjö; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13, d14, d15} 74*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_fregs {d8-d15} 75*40c937cbSMartin Storsjö; CHECK-NEXT: push.w {r11, lr} 76*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 77*40c937cbSMartin Storsjö; CHECK-NEXT: mov r11, sp 78*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_sp r11 79*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_endprologue 80*40c937cbSMartin Storsjö; CHECK-NEXT: movw r4, #1258 81*40c937cbSMartin Storsjö; CHECK-NEXT: bl __chkstk 82*40c937cbSMartin Storsjö; CHECK-NEXT: sub.w sp, sp, r4 83*40c937cbSMartin Storsjö; CHECK-NEXT: mov r4, sp 84*40c937cbSMartin Storsjö; CHECK-NEXT: bfc r4, #0, #4 85*40c937cbSMartin Storsjö; CHECK-NEXT: mov sp, r4 86*40c937cbSMartin Storsjö 87*40c937cbSMartin Storsjö; CHECK: .seh_startepilogue 88*40c937cbSMartin Storsjö; CHECK-NEXT: mov sp, r11 89*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_sp r11 90*40c937cbSMartin Storsjö; CHECK-NEXT: pop.w {r11, lr} 91*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 92*40c937cbSMartin Storsjö; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13, d14, d15} 93*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_fregs {d8-d15} 94*40c937cbSMartin Storsjö; CHECK-NEXT: add sp, #4 95*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 4 96*40c937cbSMartin Storsjö; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9} 97*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r4-r9} 98*40c937cbSMartin Storsjö; CHECK-NEXT: add sp, #12 99*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 12 100*40c937cbSMartin Storsjö; CHECK-NEXT: bx lr 101*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_nop 102*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 103*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_endproc 104*40c937cbSMartin Storsjö 105*40c937cbSMartin Storsjödefine arm_aapcs_vfpcc void @everything_varargs(i32 noundef %a, ...) { 106*40c937cbSMartin Storsjöentry: 107*40c937cbSMartin Storsjö %buf2 = alloca [5000 x i8], align 16 108*40c937cbSMartin Storsjö %ap = alloca ptr, align 4 109*40c937cbSMartin Storsjö %vla = alloca i8, i32 %a, align 1 110*40c937cbSMartin Storsjö call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf2) 111*40c937cbSMartin Storsjö call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ap) 112*40c937cbSMartin Storsjö call void @llvm.va_start(ptr nonnull %ap) 113*40c937cbSMartin Storsjö %0 = load ptr, ptr %ap, align 4 114*40c937cbSMartin Storsjö call arm_aapcs_vfpcc void @other2(i32 noundef %a, ptr noundef nonnull %vla, ptr noundef nonnull %buf2, ptr noundef %0) 115*40c937cbSMartin Storsjö call void @llvm.va_end(ptr nonnull %ap) 116*40c937cbSMartin Storsjö call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r11},~{r12}"() 117*40c937cbSMartin Storsjö call void asm sideeffect "", "~{d8},~{d9},~{d10},~{d11},~{d12},~{d13},~{d14},~{d15}"() 118*40c937cbSMartin Storsjö call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ap) 119*40c937cbSMartin Storsjö call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf2) 120*40c937cbSMartin Storsjö ret void 121*40c937cbSMartin Storsjö} 122*40c937cbSMartin Storsjö 123*40c937cbSMartin Storsjö; CHECK-LABEL: novector_varargs: 124*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_proc novector_varargs 125*40c937cbSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 126*40c937cbSMartin Storsjö; CHECK-NEXT: sub sp, #12 127*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 12 128*40c937cbSMartin Storsjö; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9} 129*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r4-r9} 130*40c937cbSMartin Storsjö; CHECK-NEXT: push.w {r11, lr} 131*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 132*40c937cbSMartin Storsjö; CHECK-NEXT: mov r11, sp 133*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_sp r11 134*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_endprologue 135*40c937cbSMartin Storsjö; CHECK-NEXT: movw r4, #1259 136*40c937cbSMartin Storsjö; CHECK-NEXT: bl __chkstk 137*40c937cbSMartin Storsjö; CHECK-NEXT: sub.w sp, sp, r4 138*40c937cbSMartin Storsjö; CHECK-NEXT: mov r4, sp 139*40c937cbSMartin Storsjö; CHECK-NEXT: bfc r4, #0, #4 140*40c937cbSMartin Storsjö; CHECK-NEXT: mov sp, r4 141*40c937cbSMartin Storsjö 142*40c937cbSMartin Storsjö; CHECK: .seh_startepilogue 143*40c937cbSMartin Storsjö; CHECK-NEXT: mov sp, r11 144*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_sp r11 145*40c937cbSMartin Storsjö; CHECK-NEXT: pop.w {r11, lr} 146*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 147*40c937cbSMartin Storsjö; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9} 148*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r4-r9} 149*40c937cbSMartin Storsjö; CHECK-NEXT: add sp, #12 150*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 12 151*40c937cbSMartin Storsjö; CHECK-NEXT: bx lr 152*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_nop 153*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 154*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_endproc 155*40c937cbSMartin Storsjö 156*40c937cbSMartin Storsjödefine arm_aapcs_vfpcc void @novector_varargs(i32 noundef %a, ...) { 157*40c937cbSMartin Storsjöentry: 158*40c937cbSMartin Storsjö %buf2 = alloca [5000 x i8], align 16 159*40c937cbSMartin Storsjö %ap = alloca ptr, align 4 160*40c937cbSMartin Storsjö %vla = alloca i8, i32 %a, align 1 161*40c937cbSMartin Storsjö call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf2) 162*40c937cbSMartin Storsjö call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ap) 163*40c937cbSMartin Storsjö call void @llvm.va_start(ptr nonnull %ap) 164*40c937cbSMartin Storsjö %0 = load ptr, ptr %ap, align 4 165*40c937cbSMartin Storsjö call arm_aapcs_vfpcc void @other2(i32 noundef %a, ptr noundef nonnull %vla, ptr noundef nonnull %buf2, ptr noundef %0) 166*40c937cbSMartin Storsjö call void @llvm.va_end(ptr nonnull %ap) 167*40c937cbSMartin Storsjö call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r11},~{r12}"() 168*40c937cbSMartin Storsjö call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ap) 169*40c937cbSMartin Storsjö call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf2) 170*40c937cbSMartin Storsjö ret void 171*40c937cbSMartin Storsjö} 172*40c937cbSMartin Storsjö 173*40c937cbSMartin Storsjödeclare void @llvm.va_start(ptr) 174*40c937cbSMartin Storsjödeclare void @llvm.va_end(ptr) 175*40c937cbSMartin Storsjö 176*40c937cbSMartin Storsjödeclare arm_aapcs_vfpcc void @other2(i32 noundef, ptr noundef, ptr noundef, ptr noundef) 177