| ;; Check that epilogues aren't tail merged. |
| |
| ;; Check that this produces the expected assembly output |
| ; RUN: llc -mtriple=thumbv7-windows -o - %s -verify-machineinstrs | FileCheck %s |
| ;; Also try to write an object file, which verifies that the SEH opcodes |
| ;; match the actual prologue/epilogue length. |
| ; RUN: llc -mtriple=thumbv7-windows -filetype=obj -o %t.obj %s -verify-machineinstrs |
| |
| ; CHECK-LABEL: d: |
| ; CHECK: .seh_proc d |
| |
| ; CHECK: push.w {r11, lr} |
| ; CHECK-NEXT: .seh_save_regs_w {r11, lr} |
| ; CHECK-NEXT: .seh_endprologue |
| |
| ; CHECK: .seh_startepilogue |
| ; CHECK-NEXT: pop.w {r11, lr} |
| ; CHECK-NEXT: .seh_save_regs_w {r11, lr} |
| ; CHECK-NEXT: b.w b |
| ; CHECK-NEXT: .seh_nop_w |
| ; CHECK-NEXT: .seh_endepilogue |
| |
| ; CHECK: .seh_startepilogue |
| ; CHECK-NEXT: pop.w {r11, lr} |
| ; CHECK-NEXT: .seh_save_regs_w {r11, lr} |
| ; CHECK-NEXT: b.w c |
| ; CHECK-NEXT: .seh_nop_w |
| ; CHECK-NEXT: .seh_endepilogue |
| ; CHECK-NEXT: .seh_endproc |
| |
| @a = global i32 0, align 4 |
| |
| define arm_aapcs_vfpcc void @d() optsize uwtable "frame-pointer"="none" { |
| entry: |
| %0 = load i32, ptr @a, align 4 |
| switch i32 %0, label %if.then1 [ |
| i32 10, label %if.then |
| i32 0, label %if.end2 |
| ] |
| |
| if.then: |
| tail call arm_aapcs_vfpcc void @b() |
| br label %return |
| |
| if.then1: |
| tail call arm_aapcs_vfpcc void @b() |
| br label %if.end2 |
| |
| if.end2: |
| tail call arm_aapcs_vfpcc void @c() |
| br label %return |
| |
| return: |
| ret void |
| } |
| |
| declare arm_aapcs_vfpcc void @b(...) |
| |
| declare arm_aapcs_vfpcc void @c(...) |