Fix buildbots.
[oota-llvm.git] / test / CodeGen / ARM / tail-opts.ll
1 ; RUN: llc < %s -mtriple=arm-apple-darwin -mcpu=cortex-a8 -asm-verbose=false | FileCheck %s
2
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()
9
10 @GHJK = global i32 0
11
12 declare i8* @choose(i8*, i8*);
13
14 ; BranchFolding should tail-duplicate the indirect jump to avoid
15 ; redundant branching.
16
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
29
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
39
40 A:
41   call void @bar(i32 0)
42   store i32 0, i32* @GHJK
43   br label %M
44
45 B:
46   call void @car(i32 1)
47   store i32 0, i32* @GHJK
48   br label %M
49
50 C:
51   call void @dar(i32 2)
52   store i32 0, i32* @GHJK
53   br label %M
54
55 M:
56   indirectbr i8* %c, [label %return, label %altret]
57
58 return:
59   call void @ear(i32 1000)
60   ret void
61 altret:
62   call void @far(i32 1001)
63   ret void
64 }