xref: /llvm-project/llvm/test/CodeGen/ARM/Windows/wineh-tailmerge.ll (revision d8e67c1cccd8fcb62230166caea744592288da17)
1*d8e67c1cSMartin Storsjö;; Check that epilogues aren't tail merged.
2*d8e67c1cSMartin Storsjö
3*d8e67c1cSMartin Storsjö;; Check that this produces the expected assembly output
4*d8e67c1cSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -o - %s -verify-machineinstrs | FileCheck %s
5*d8e67c1cSMartin Storsjö;; Also try to write an object file, which verifies that the SEH opcodes
6*d8e67c1cSMartin Storsjö;; match the actual prologue/epilogue length.
7*d8e67c1cSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -filetype=obj -o %t.obj %s -verify-machineinstrs
8*d8e67c1cSMartin Storsjö
9*d8e67c1cSMartin Storsjö; CHECK-LABEL: d:
10*d8e67c1cSMartin Storsjö; CHECK: .seh_proc d
11*d8e67c1cSMartin Storsjö
12*d8e67c1cSMartin Storsjö; CHECK:              push.w  {r11, lr}
13*d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
14*d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
15*d8e67c1cSMartin Storsjö
16*d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
17*d8e67c1cSMartin Storsjö; CHECK-NEXT:         pop.w   {r11, lr}
18*d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
19*d8e67c1cSMartin Storsjö; CHECK-NEXT:         b.w     b
20*d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
21*d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
22*d8e67c1cSMartin Storsjö
23*d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
24*d8e67c1cSMartin Storsjö; CHECK-NEXT:         pop.w   {r11, lr}
25*d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
26*d8e67c1cSMartin Storsjö; CHECK-NEXT:         b.w     c
27*d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
28*d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
29*d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
30*d8e67c1cSMartin Storsjö
31*d8e67c1cSMartin Storsjö@a = global i32 0, align 4
32*d8e67c1cSMartin Storsjö
33*d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @d() optsize uwtable "frame-pointer"="none" {
34*d8e67c1cSMartin Storsjöentry:
35*d8e67c1cSMartin Storsjö  %0 = load i32, ptr @a, align 4
36*d8e67c1cSMartin Storsjö  switch i32 %0, label %if.then1 [
37*d8e67c1cSMartin Storsjö    i32 10, label %if.then
38*d8e67c1cSMartin Storsjö    i32 0, label %if.end2
39*d8e67c1cSMartin Storsjö  ]
40*d8e67c1cSMartin Storsjö
41*d8e67c1cSMartin Storsjöif.then:
42*d8e67c1cSMartin Storsjö  tail call arm_aapcs_vfpcc void @b()
43*d8e67c1cSMartin Storsjö  br label %return
44*d8e67c1cSMartin Storsjö
45*d8e67c1cSMartin Storsjöif.then1:
46*d8e67c1cSMartin Storsjö  tail call arm_aapcs_vfpcc void @b()
47*d8e67c1cSMartin Storsjö  br label %if.end2
48*d8e67c1cSMartin Storsjö
49*d8e67c1cSMartin Storsjöif.end2:
50*d8e67c1cSMartin Storsjö  tail call arm_aapcs_vfpcc void @c()
51*d8e67c1cSMartin Storsjö  br label %return
52*d8e67c1cSMartin Storsjö
53*d8e67c1cSMartin Storsjöreturn:
54*d8e67c1cSMartin Storsjö  ret void
55*d8e67c1cSMartin Storsjö}
56*d8e67c1cSMartin Storsjö
57*d8e67c1cSMartin Storsjödeclare arm_aapcs_vfpcc void @b(...)
58*d8e67c1cSMartin Storsjö
59*d8e67c1cSMartin Storsjödeclare arm_aapcs_vfpcc void @c(...)
60