Fixed some bugs.
[llvm/zpu.git] / test / CodeGen / ARM / tail-opts.ll
blob17c8baedbfa89b48565b45e46fd2122d5777acfc
1 ; RUN: llc < %s -mtriple=arm-apple-darwin -mcpu=cortex-a8 -asm-verbose=false | FileCheck %s
3 declare void @bar(i32)
4 declare void @car(i32)
5 declare void @dar(i32)
6 declare void @ear(i32)
7 declare void @far(i32)
8 declare i1 @qux()
10 @GHJK = global i32 0
12 declare i8* @choose(i8*, i8*)
14 ; BranchFolding should tail-duplicate the indirect jump to avoid
15 ; redundant branching.
17 ; CHECK: tail_duplicate_me:
18 ; CHECK:      qux
19 ; CHECK:      qux
20 ; CHECK:      ldr r{{.}}, LCPI
21 ; CHECK:      str r
22 ; CHECK-NEXT: bx r
23 ; CHECK:      ldr r{{.}}, LCPI
24 ; CHECK:      str r
25 ; CHECK-NEXT: bx r
26 ; CHECK:      ldr r{{.}}, LCPI
27 ; CHECK:      str r
28 ; CHECK-NEXT: bx r
30 define void @tail_duplicate_me() nounwind {
31 entry:
32   %a = call i1 @qux()
33   %c = call i8* @choose(i8* blockaddress(@tail_duplicate_me, %return),
34                         i8* blockaddress(@tail_duplicate_me, %altret))
35   br i1 %a, label %A, label %next
36 next:
37   %b = call i1 @qux()
38   br i1 %b, label %B, label %C
41   call void @bar(i32 0)
42   store i32 0, i32* @GHJK
43   br label %M
46   call void @car(i32 1)
47   store i32 0, i32* @GHJK
48   br label %M
51   call void @dar(i32 2)
52   store i32 0, i32* @GHJK
53   br label %M
56   indirectbr i8* %c, [label %return, label %altret]
58 return:
59   call void @ear(i32 1000)
60   ret void
61 altret:
62   call void @far(i32 1001)
63   ret void