177 lines · plain
1;; Check that this produces the expected assembly output2; RUN: llc -mtriple=thumbv7-windows -o - %s -verify-machineinstrs | FileCheck %s3;; Also try to write an object file, which verifies that the SEH opcodes4;; match the actual prologue/epilogue length.5; RUN: llc -mtriple=thumbv7-windows -filetype=obj -o %t.obj %s -verify-machineinstrs6 7; CHECK-LABEL: alloc_local:8; CHECK-NEXT: .seh_proc alloc_local9; CHECK-NEXT: @ %bb.0: @ %entry10; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10}11; CHECK-NEXT: .seh_save_regs_w {r4-r10}12; CHECK-NEXT: sub sp, #413; CHECK-NEXT: .seh_stackalloc 414; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13, d14, d15}15; CHECK-NEXT: .seh_save_fregs {d8-d15}16; CHECK-NEXT: push.w {r11, lr}17; CHECK-NEXT: .seh_save_regs_w {r11, lr}18; CHECK-NEXT: mov r11, sp19; CHECK-NEXT: .seh_save_sp r1120; CHECK-NEXT: .seh_endprologue21; CHECK-NEXT: movw r4, #125622; CHECK-NEXT: bl __chkstk23; CHECK-NEXT: sub.w sp, sp, r424; CHECK-NEXT: mov r4, sp25; CHECK-NEXT: bfc r4, #0, #426; CHECK-NEXT: mov sp, r427 28; CHECK: ldr.w [[TMP:r[0-9]]], [r11, #104]29; CHECK: mov r0, [[TMP]]30 31; CHECK: .seh_startepilogue32; CHECK-NEXT: mov sp, r1133; CHECK-NEXT: .seh_save_sp r1134; CHECK-NEXT: pop.w {r11, lr}35; CHECK-NEXT: .seh_save_regs_w {r11, lr}36; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13, d14, d15}37; CHECK-NEXT: .seh_save_fregs {d8-d15}38; CHECK-NEXT: add sp, #439; CHECK-NEXT: .seh_stackalloc 440; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10}41; CHECK-NEXT: .seh_save_regs_w {r4-r10}42; CHECK-NEXT: bx lr43; CHECK-NEXT: .seh_nop44; CHECK-NEXT: .seh_endepilogue45; CHECK-NEXT: .seh_endproc46 47define arm_aapcs_vfpcc void @alloc_local(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d, i32 noundef %e) uwtable {48entry:49 %buf2 = alloca [5000 x i8], align 1650 %vla = alloca i8, i32 %a, align 151 call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf2) #352 call arm_aapcs_vfpcc void @other(i32 noundef %e, ptr noundef nonnull %vla, ptr noundef nonnull %buf2)53 call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12}"()54 call void asm sideeffect "", "~{d8},~{d9},~{d10},~{d11},~{d12},~{d13},~{d14},~{d15}"()55 call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf2) #356 ret void57}58 59declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)60declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)61 62declare arm_aapcs_vfpcc void @other(i32 noundef, ptr noundef, ptr noundef)63 64; CHECK-LABEL: everything_varargs:65; CHECK-NEXT: .seh_proc everything_varargs66; CHECK-NEXT: @ %bb.0: @ %entry67; CHECK-NEXT: sub sp, #1268; CHECK-NEXT: .seh_stackalloc 1269; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9}70; CHECK-NEXT: .seh_save_regs_w {r4-r9}71; CHECK-NEXT: sub sp, #472; CHECK-NEXT: .seh_stackalloc 473; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13, d14, d15}74; CHECK-NEXT: .seh_save_fregs {d8-d15}75; CHECK-NEXT: push.w {r11, lr}76; CHECK-NEXT: .seh_save_regs_w {r11, lr}77; CHECK-NEXT: mov r11, sp78; CHECK-NEXT: .seh_save_sp r1179; CHECK-NEXT: .seh_endprologue80; CHECK-NEXT: movw r4, #125881; CHECK-NEXT: bl __chkstk82; CHECK-NEXT: sub.w sp, sp, r483; CHECK-NEXT: mov r4, sp84; CHECK-NEXT: bfc r4, #0, #485; CHECK-NEXT: mov sp, r486 87; CHECK: .seh_startepilogue88; CHECK-NEXT: mov sp, r1189; CHECK-NEXT: .seh_save_sp r1190; CHECK-NEXT: pop.w {r11, lr}91; CHECK-NEXT: .seh_save_regs_w {r11, lr}92; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13, d14, d15}93; CHECK-NEXT: .seh_save_fregs {d8-d15}94; CHECK-NEXT: add sp, #495; CHECK-NEXT: .seh_stackalloc 496; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9}97; CHECK-NEXT: .seh_save_regs_w {r4-r9}98; CHECK-NEXT: add sp, #1299; CHECK-NEXT: .seh_stackalloc 12100; CHECK-NEXT: bx lr101; CHECK-NEXT: .seh_nop102; CHECK-NEXT: .seh_endepilogue103; CHECK-NEXT: .seh_endproc104 105define arm_aapcs_vfpcc void @everything_varargs(i32 noundef %a, ...) {106entry:107 %buf2 = alloca [5000 x i8], align 16108 %ap = alloca ptr, align 4109 %vla = alloca i8, i32 %a, align 1110 call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf2)111 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ap)112 call void @llvm.va_start(ptr nonnull %ap)113 %0 = load ptr, ptr %ap, align 4114 call arm_aapcs_vfpcc void @other2(i32 noundef %a, ptr noundef nonnull %vla, ptr noundef nonnull %buf2, ptr noundef %0)115 call void @llvm.va_end(ptr nonnull %ap)116 call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r11},~{r12}"()117 call void asm sideeffect "", "~{d8},~{d9},~{d10},~{d11},~{d12},~{d13},~{d14},~{d15}"()118 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ap)119 call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf2)120 ret void121}122 123; CHECK-LABEL: novector_varargs:124; CHECK-NEXT: .seh_proc novector_varargs125; CHECK-NEXT: @ %bb.0: @ %entry126; CHECK-NEXT: sub sp, #12127; CHECK-NEXT: .seh_stackalloc 12128; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9}129; CHECK-NEXT: .seh_save_regs_w {r4-r9}130; CHECK-NEXT: push.w {r11, lr}131; CHECK-NEXT: .seh_save_regs_w {r11, lr}132; CHECK-NEXT: mov r11, sp133; CHECK-NEXT: .seh_save_sp r11134; CHECK-NEXT: .seh_endprologue135; CHECK-NEXT: movw r4, #1259136; CHECK-NEXT: bl __chkstk137; CHECK-NEXT: sub.w sp, sp, r4138; CHECK-NEXT: mov r4, sp139; CHECK-NEXT: bfc r4, #0, #4140; CHECK-NEXT: mov sp, r4141 142; CHECK: .seh_startepilogue143; CHECK-NEXT: mov sp, r11144; CHECK-NEXT: .seh_save_sp r11145; CHECK-NEXT: pop.w {r11, lr}146; CHECK-NEXT: .seh_save_regs_w {r11, lr}147; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9}148; CHECK-NEXT: .seh_save_regs_w {r4-r9}149; CHECK-NEXT: add sp, #12150; CHECK-NEXT: .seh_stackalloc 12151; CHECK-NEXT: bx lr152; CHECK-NEXT: .seh_nop153; CHECK-NEXT: .seh_endepilogue154; CHECK-NEXT: .seh_endproc155 156define arm_aapcs_vfpcc void @novector_varargs(i32 noundef %a, ...) {157entry:158 %buf2 = alloca [5000 x i8], align 16159 %ap = alloca ptr, align 4160 %vla = alloca i8, i32 %a, align 1161 call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf2)162 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ap)163 call void @llvm.va_start(ptr nonnull %ap)164 %0 = load ptr, ptr %ap, align 4165 call arm_aapcs_vfpcc void @other2(i32 noundef %a, ptr noundef nonnull %vla, ptr noundef nonnull %buf2, ptr noundef %0)166 call void @llvm.va_end(ptr nonnull %ap)167 call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r11},~{r12}"()168 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ap)169 call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf2)170 ret void171}172 173declare void @llvm.va_start(ptr)174declare void @llvm.va_end(ptr)175 176declare arm_aapcs_vfpcc void @other2(i32 noundef, ptr noundef, ptr noundef, ptr noundef)177