1d8e67c1cSMartin Storsjö;; Check that this produces the expected assembly output 2d8e67c1cSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -o - %s -verify-machineinstrs | FileCheck %s 3d8e67c1cSMartin Storsjö;; Also try to write an object file, which verifies that the SEH opcodes 4d8e67c1cSMartin Storsjö;; match the actual prologue/epilogue length. 5d8e67c1cSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -filetype=obj -o %t.obj %s -verify-machineinstrs 6d8e67c1cSMartin Storsjö 7d8e67c1cSMartin Storsjö; CHECK-LABEL: clobberR4Frame: 8d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc clobberR4Frame 9d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 10d8e67c1cSMartin Storsjö; CHECK-NEXT: push.w {r4, r7, r11, lr} 11d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r4, r7, r11, lr} 12d8e67c1cSMartin Storsjö; CHECK-NEXT: add.w r11, sp, #8 13d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 14d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 15d8e67c1cSMartin Storsjö; CHECK-NEXT: bl other 16d8e67c1cSMartin Storsjö 17d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 18d8e67c1cSMartin Storsjö; CHECK-NEXT: pop.w {r4, r7, r11, pc} 19d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r4, r7, r11, lr} 20d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 21d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 22d8e67c1cSMartin Storsjö 23d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @clobberR4Frame() uwtable "frame-pointer"="all" { 24d8e67c1cSMartin Storsjöentry: 25d8e67c1cSMartin Storsjö call arm_aapcs_vfpcc void @other() 26d8e67c1cSMartin Storsjö call void asm sideeffect "", "~{r4}"() 27d8e67c1cSMartin Storsjö ret void 28d8e67c1cSMartin Storsjö} 29d8e67c1cSMartin Storsjö 30d8e67c1cSMartin Storsjö; CHECK-LABEL: clobberR4NoFrame: 31d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc clobberR4NoFrame 32d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 33bd52506dSMartin Storsjö; CHECK-NEXT: push {r4, lr} 34bd52506dSMartin Storsjö; CHECK-NEXT: .seh_save_regs {r4, lr} 35d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 36d8e67c1cSMartin Storsjö; CHECK-NEXT: bl other 37d8e67c1cSMartin Storsjö 38d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 39bd52506dSMartin Storsjö; CHECK-NEXT: pop {r4, pc} 40bd52506dSMartin Storsjö; CHECK-NEXT: .seh_save_regs {r4, lr} 41d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 42d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 43d8e67c1cSMartin Storsjö 44d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @clobberR4NoFrame() uwtable "frame-pointer"="none" { 45d8e67c1cSMartin Storsjöentry: 46d8e67c1cSMartin Storsjö call arm_aapcs_vfpcc void @other() 47d8e67c1cSMartin Storsjö call void asm sideeffect "", "~{r4}"() 48d8e67c1cSMartin Storsjö ret void 49d8e67c1cSMartin Storsjö} 50d8e67c1cSMartin Storsjö 51d8e67c1cSMartin Storsjö; CHECK-LABEL: clobberR4Tail: 52d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc clobberR4Tail 53d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 54bd52506dSMartin Storsjö; CHECK-NEXT: push {r4, lr} 55bd52506dSMartin Storsjö; CHECK-NEXT: .seh_save_regs {r4, lr} 56d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 57d8e67c1cSMartin Storsjö 58d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 59d8e67c1cSMartin Storsjö; CHECK-NEXT: pop.w {r4, lr} 60d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r4, lr} 61d8e67c1cSMartin Storsjö; CHECK-NEXT: b.w other 62d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 63d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 64d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 65d8e67c1cSMartin Storsjö 66d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @clobberR4Tail() uwtable "frame-pointer"="none" { 67d8e67c1cSMartin Storsjöentry: 68d8e67c1cSMartin Storsjö call void asm sideeffect "", "~{r4}"() 69d8e67c1cSMartin Storsjö tail call arm_aapcs_vfpcc void @other() 70d8e67c1cSMartin Storsjö ret void 71d8e67c1cSMartin Storsjö} 72d8e67c1cSMartin Storsjö 73d8e67c1cSMartin Storsjö; CHECK-LABEL: clobberD8D10: 74d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc clobberD8D10 75d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 76d8e67c1cSMartin Storsjö; CHECK-NEXT: vpush {d8, d9, d10} 77d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_fregs {d8-d10} 78d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 79d8e67c1cSMartin Storsjö 80d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 81d8e67c1cSMartin Storsjö; CHECK-NEXT: vpop {d8, d9, d10} 82d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_fregs {d8-d10} 83d8e67c1cSMartin Storsjö; CHECK-NEXT: b.w other 84d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 85d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 86d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 87d8e67c1cSMartin Storsjö 88d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @clobberD8D10() uwtable "frame-pointer"="none" { 89d8e67c1cSMartin Storsjöentry: 90d8e67c1cSMartin Storsjö call void asm sideeffect "", "~{d8},~{d9},~{d10}"() 91d8e67c1cSMartin Storsjö tail call arm_aapcs_vfpcc void @other() 92d8e67c1cSMartin Storsjö ret void 93d8e67c1cSMartin Storsjö} 94d8e67c1cSMartin Storsjö 95d8e67c1cSMartin Storsjödeclare arm_aapcs_vfpcc void @other() 96d8e67c1cSMartin Storsjö 97d8e67c1cSMartin Storsjö; CHECK-LABEL: vararg: 98d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc vararg 99d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 100d8e67c1cSMartin Storsjö; CHECK-NEXT: sub sp, #12 101d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 12 102d8e67c1cSMartin Storsjö; CHECK-NEXT: push.w {r11, lr} 103d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 104d8e67c1cSMartin Storsjö; CHECK-NEXT: sub sp, #4 105d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 4 106d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 107d8e67c1cSMartin Storsjö 108d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 109d8e67c1cSMartin Storsjö; CHECK-NEXT: add sp, #4 110d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 4 111d8e67c1cSMartin Storsjö; CHECK-NEXT: pop.w {r11, lr} 112d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 113d8e67c1cSMartin Storsjö; CHECK-NEXT: add sp, #12 114d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 12 115d8e67c1cSMartin Storsjö; CHECK-NEXT: bx lr 116d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop 117d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 118d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 119d8e67c1cSMartin Storsjö 120d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @vararg(i32 noundef %a, ...) uwtable "frame-pointer"="none" { 121d8e67c1cSMartin Storsjöentry: 122d8e67c1cSMartin Storsjö %ap = alloca ptr, align 4 123d8e67c1cSMartin Storsjö call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ap) 124d8e67c1cSMartin Storsjö call void @llvm.va_start(ptr nonnull %ap) 125d8e67c1cSMartin Storsjö %0 = load ptr, ptr %ap 126d8e67c1cSMartin Storsjö call arm_aapcs_vfpcc void @useva(ptr noundef %0) 127d8e67c1cSMartin Storsjö call void @llvm.va_end(ptr nonnull %ap) 128d8e67c1cSMartin Storsjö call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ap) 129d8e67c1cSMartin Storsjö ret void 130d8e67c1cSMartin Storsjö} 131d8e67c1cSMartin Storsjö 132d8e67c1cSMartin Storsjödeclare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) 133d8e67c1cSMartin Storsjödeclare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) 134d8e67c1cSMartin Storsjödeclare void @llvm.va_start(ptr) 135d8e67c1cSMartin Storsjödeclare void @llvm.va_end(ptr) 136d8e67c1cSMartin Storsjö 137d8e67c1cSMartin Storsjödeclare arm_aapcs_vfpcc void @useva(ptr noundef) 138d8e67c1cSMartin Storsjö 139d8e67c1cSMartin Storsjö; CHECK-LABEL: onlystack: 140d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc onlystack 141d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 142d8e67c1cSMartin Storsjö; CHECK-NEXT: sub sp, #4 143d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 4 144d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 145d8e67c1cSMartin Storsjö 146d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 147d8e67c1cSMartin Storsjö; CHECK-NEXT: add sp, #4 148d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 4 149d8e67c1cSMartin Storsjö; CHECK-NEXT: bx lr 150d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop 151d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 152d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 153d8e67c1cSMartin Storsjö 154d8e67c1cSMartin Storsjödefine dso_local arm_aapcs_vfpcc void @onlystack() uwtable "frame-pointer"="none" { 155d8e67c1cSMartin Storsjöentry: 156d8e67c1cSMartin Storsjö %buf = alloca [4 x i8], align 1 157d8e67c1cSMartin Storsjö call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %buf) 158d8e67c1cSMartin Storsjö call void asm sideeffect "", "r"(ptr nonnull %buf) 159d8e67c1cSMartin Storsjö call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %buf) 160d8e67c1cSMartin Storsjö ret void 161d8e67c1cSMartin Storsjö} 162d8e67c1cSMartin Storsjö 163d8e67c1cSMartin Storsjö; CHECK-LABEL: func50: 164d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func50 165d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 166d8e67c1cSMartin Storsjö; CHECK-NEXT: push.w {r11, lr} 167d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 168d8e67c1cSMartin Storsjö; CHECK-NEXT: sub sp, #56 169d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 56 170d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 171d8e67c1cSMartin Storsjö 172d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 173d8e67c1cSMartin Storsjö; CHECK-NEXT: add sp, #56 174d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 56 175d8e67c1cSMartin Storsjö; CHECK-NEXT: pop.w {r11, pc} 176d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 177d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 178d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 179d8e67c1cSMartin Storsjö 180d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func50() { 181d8e67c1cSMartin Storsjöentry: 182d8e67c1cSMartin Storsjö %buf = alloca [50 x i8], align 1 183d8e67c1cSMartin Storsjö call void @llvm.lifetime.start.p0(i64 50, ptr nonnull %buf) 184d8e67c1cSMartin Storsjö call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf) 185d8e67c1cSMartin Storsjö call void @llvm.lifetime.end.p0(i64 50, ptr nonnull %buf) 186d8e67c1cSMartin Storsjö ret void 187d8e67c1cSMartin Storsjö} 188d8e67c1cSMartin Storsjö 189d8e67c1cSMartin Storsjö; CHECK-LABEL: func4000: 190d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func4000 191d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 192d8e67c1cSMartin Storsjö; CHECK-NEXT: push.w {r11, lr} 193d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 194d8e67c1cSMartin Storsjö; CHECK-NEXT: sub.w sp, sp, #4000 195d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc_w 4000 196d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 197d8e67c1cSMartin Storsjö 198d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 199d8e67c1cSMartin Storsjö; CHECK-NEXT: add.w sp, sp, #4000 200d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc_w 4000 201d8e67c1cSMartin Storsjö; CHECK-NEXT: pop.w {r11, pc} 202d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11, lr} 203d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 204d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 205d8e67c1cSMartin Storsjö 206d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func4000() { 207d8e67c1cSMartin Storsjöentry: 208d8e67c1cSMartin Storsjö %buf = alloca [4000 x i8], align 1 209d8e67c1cSMartin Storsjö call void @llvm.lifetime.start.p0(i64 4000, ptr nonnull %buf) 210d8e67c1cSMartin Storsjö call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf) 211d8e67c1cSMartin Storsjö call void @llvm.lifetime.end.p0(i64 4000, ptr nonnull %buf) 212d8e67c1cSMartin Storsjö ret void 213d8e67c1cSMartin Storsjö} 214d8e67c1cSMartin Storsjö 215d8e67c1cSMartin Storsjö; CHECK-LABEL: func5000: 216d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func5000 217d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 218bd52506dSMartin Storsjö; CHECK-NEXT: push {r4, r5, r6, lr} 219bd52506dSMartin Storsjö; CHECK-NEXT: .seh_save_regs {r4-r6, lr} 220d8e67c1cSMartin Storsjö; CHECK-NEXT: movw r4, #1250 221d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 222d8e67c1cSMartin Storsjö; CHECK-NEXT: bl __chkstk 223d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 224d8e67c1cSMartin Storsjö; CHECK-NEXT: sub.w sp, sp, r4 225d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc_w 5000 226d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 227d8e67c1cSMartin Storsjö 228d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 229d8e67c1cSMartin Storsjö; CHECK-NEXT: add.w sp, sp, #4992 230d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc_w 4992 231d8e67c1cSMartin Storsjö; CHECK-NEXT: add sp, #8 232d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc 8 233bd52506dSMartin Storsjö; CHECK-NEXT: pop {r4, r5, r6, pc} 234bd52506dSMartin Storsjö; CHECK-NEXT: .seh_save_regs {r4-r6, lr} 235d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 236d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 237d8e67c1cSMartin Storsjö 238d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func5000() { 239d8e67c1cSMartin Storsjöentry: 240d8e67c1cSMartin Storsjö %buf = alloca [5000 x i8], align 1 241d8e67c1cSMartin Storsjö call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf) 242d8e67c1cSMartin Storsjö call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf) 243d8e67c1cSMartin Storsjö call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf) 244d8e67c1cSMartin Storsjö ret void 245d8e67c1cSMartin Storsjö} 246d8e67c1cSMartin Storsjö 247d8e67c1cSMartin Storsjö; CHECK-LABEL: func262144: 248d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func262144 249d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 250bd52506dSMartin Storsjö; CHECK-NEXT: push {r4, r5, r6, lr} 251bd52506dSMartin Storsjö; CHECK-NEXT: .seh_save_regs {r4-r6, lr} 252485432f3SMartin Storsjö; CHECK-NEXT: movs r4, #0 253485432f3SMartin Storsjö; CHECK-NEXT: .seh_nop 254d8e67c1cSMartin Storsjö; CHECK-NEXT: movt r4, #1 255d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 256d8e67c1cSMartin Storsjö; CHECK-NEXT: bl __chkstk 257d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 258d8e67c1cSMartin Storsjö; CHECK-NEXT: sub.w sp, sp, r4 259d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc_w 262144 260d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 261d8e67c1cSMartin Storsjö 262d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 263d8e67c1cSMartin Storsjö; CHECK-NEXT: add.w sp, sp, #262144 264d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc_w 262144 265bd52506dSMartin Storsjö; CHECK-NEXT: pop {r4, r5, r6, pc} 266bd52506dSMartin Storsjö; CHECK-NEXT: .seh_save_regs {r4-r6, lr} 267d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 268d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 269d8e67c1cSMartin Storsjö 270d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func262144() { 271d8e67c1cSMartin Storsjöentry: 272d8e67c1cSMartin Storsjö %buf = alloca [262144 x i8], align 1 273d8e67c1cSMartin Storsjö call void @llvm.lifetime.start.p0(i64 262144, ptr nonnull %buf) 274d8e67c1cSMartin Storsjö call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf) 275d8e67c1cSMartin Storsjö call void @llvm.lifetime.end.p0(i64 262144, ptr nonnull %buf) 276d8e67c1cSMartin Storsjö ret void 277d8e67c1cSMartin Storsjö} 278d8e67c1cSMartin Storsjö 279d8e67c1cSMartin Storsjö; CHECK-LABEL: func270000: 280d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func270000 281d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 282bd52506dSMartin Storsjö; CHECK-NEXT: push {r4, r5, r6, lr} 283bd52506dSMartin Storsjö; CHECK-NEXT: .seh_save_regs {r4-r6, lr} 284d8e67c1cSMartin Storsjö; CHECK-NEXT: movw r4, #1964 285d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 286d8e67c1cSMartin Storsjö; CHECK-NEXT: movt r4, #1 287d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 288d8e67c1cSMartin Storsjö; CHECK-NEXT: bl __chkstk 289d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_nop_w 290d8e67c1cSMartin Storsjö; CHECK-NEXT: sub.w sp, sp, r4 291d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc_w 270000 292d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endprologue 293d8e67c1cSMartin Storsjö 294d8e67c1cSMartin Storsjö; CHECK: .seh_startepilogue 295d8e67c1cSMartin Storsjö; CHECK-NEXT: add.w sp, sp, #268288 296d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc_w 268288 297d8e67c1cSMartin Storsjö; CHECK-NEXT: add.w sp, sp, #1712 298d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_stackalloc_w 1712 299bd52506dSMartin Storsjö; CHECK-NEXT: pop {r4, r5, r6, pc} 300bd52506dSMartin Storsjö; CHECK-NEXT: .seh_save_regs {r4-r6, lr} 301d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endepilogue 302d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_endproc 303d8e67c1cSMartin Storsjö 304d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func270000() { 305d8e67c1cSMartin Storsjöentry: 306d8e67c1cSMartin Storsjö %buf = alloca [270000 x i8], align 1 307d8e67c1cSMartin Storsjö call void @llvm.lifetime.start.p0(i64 270000, ptr nonnull %buf) 308d8e67c1cSMartin Storsjö call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf) 309d8e67c1cSMartin Storsjö call void @llvm.lifetime.end.p0(i64 270000, ptr nonnull %buf) 310d8e67c1cSMartin Storsjö ret void 311d8e67c1cSMartin Storsjö} 312d8e67c1cSMartin Storsjö 313d8e67c1cSMartin Storsjödeclare arm_aapcs_vfpcc void @useptr(ptr noundef) 314*c5383536SMartin Storsjö 315*c5383536SMartin Storsjö; CHECK-LABEL: func_fp: 316*c5383536SMartin Storsjö; CHECK-NEXT: .seh_proc func_fp 317*c5383536SMartin Storsjö; CHECK-NEXT: @ %bb.0: @ %entry 318*c5383536SMartin Storsjö; CHECK-NEXT: str r11, [sp, #-4]! 319*c5383536SMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11} 320*c5383536SMartin Storsjö; CHECK-NEXT: mov r11, sp 321*c5383536SMartin Storsjö; CHECK-NEXT: .seh_save_sp r11 322*c5383536SMartin Storsjö; CHECK-NEXT: .seh_endprologue 323*c5383536SMartin Storsjö 324*c5383536SMartin Storsjö; CHECK-NEXT: mov r0, r11 325*c5383536SMartin Storsjö 326*c5383536SMartin Storsjö; CHECK-NEXT: .seh_startepilogue 327*c5383536SMartin Storsjö; CHECK-NEXT: ldr r11, [sp], #4 328*c5383536SMartin Storsjö; CHECK-NEXT: .seh_save_regs_w {r11} 329*c5383536SMartin Storsjö; CHECK-NEXT: bx lr 330*c5383536SMartin Storsjö; CHECK-NEXT: .seh_nop 331*c5383536SMartin Storsjö; CHECK-NEXT: .seh_endepilogue 332*c5383536SMartin Storsjö; CHECK-NEXT: .seh_endproc 333*c5383536SMartin Storsjö 334*c5383536SMartin Storsjödefine arm_aapcs_vfpcc i32 @func_fp() { 335*c5383536SMartin Storsjöentry: 336*c5383536SMartin Storsjö %0 = tail call ptr @llvm.frameaddress.p0(i32 0) 337*c5383536SMartin Storsjö %1 = ptrtoint ptr %0 to i32 338*c5383536SMartin Storsjö ret i32 %1 339*c5383536SMartin Storsjö} 340*c5383536SMartin Storsjö 341*c5383536SMartin Storsjödeclare ptr @llvm.frameaddress.p0(i32 immarg) 342