[SimplifyCFG] Rewrite SinkThenElseCodeToEnd
[llvm-core.git] / test / CodeGen / ARM / tail-opts.ll
blob37e9a4af3be5969d9fec79bd220d36b7297033f4
1 ; RUN: llc < %s -mtriple=arm-apple-darwin -relocation-model=dynamic-no-pic -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-LABEL: tail_duplicate_me:
18 ; CHECK:      qux
19 ; CHECK:      movw r{{[0-9]+}}, :lower16:_GHJK
20 ; CHECK:      movt r{{[0-9]+}}, :upper16:_GHJK
21 ; CHECK:      str r
22 ; CHECK-NEXT: bx r
23 ; CHECK:      qux
24 ; CHECK:      movw r{{[0-9]+}}, :lower16:_GHJK
25 ; CHECK:      movt r{{[0-9]+}}, :upper16:_GHJK
26 ; CHECK:      str r
27 ; CHECK-NEXT: bx r
28 ; CHECK:      movw r{{[0-9]+}}, :lower16:_GHJK
29 ; CHECK:      movt r{{[0-9]+}}, :upper16:_GHJK
30 ; CHECK:      str r
31 ; CHECK-NEXT: bx r
33 define void @tail_duplicate_me() nounwind {
34 entry:
35   %a = call i1 @qux()
36   %c = call i8* @choose(i8* blockaddress(@tail_duplicate_me, %return),
37                         i8* blockaddress(@tail_duplicate_me, %altret))
38   br i1 %a, label %A, label %next
39 next:
40   %b = call i1 @qux()
41   br i1 %b, label %B, label %C
44   call void @bar(i32 0)
45   store i32 0, i32* @GHJK
46   br label %M
49   call void @car(i32 1)
50   store i32 0, i32* @GHJK
51   br label %M
54   call void @dar(i32 2)
55   store i32 0, i32* @GHJK
56   br label %M
59   indirectbr i8* %c, [label %return, label %altret]
61 return:
62   call void @ear(i32 1000)
63   ret void
64 altret:
65   call void @far(i32 1001)
66   ret void