blob: 3dc77e2a8086c5ececba6ae36dad9f92f0ae916a [file] [log] [blame]
Jim Grosbach6f09fcf2011-09-30 17:41:35 +00001; RUN: llc < %s -mtriple=arm-apple-darwin -relocation-model=dynamic-no-pic -mcpu=cortex-a8 -asm-verbose=false | FileCheck %s
Bob Wilson60f34b92009-11-18 22:52:37 +00002
3declare void @bar(i32)
4declare void @car(i32)
5declare void @dar(i32)
6declare void @ear(i32)
7declare void @far(i32)
8declare i1 @qux()
9
10@GHJK = global i32 0
11
Dan Gohmanaceba312010-01-05 17:55:26 +000012declare i8* @choose(i8*, i8*)
Bob Wilson60f34b92009-11-18 22:52:37 +000013
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
Evan Cheng53519f02011-01-21 18:55:51 +000020; CHECK: movw r{{[0-9]+}}, :lower16:_GHJK
21; CHECK: movt r{{[0-9]+}}, :upper16:_GHJK
Bob Wilson60f34b92009-11-18 22:52:37 +000022; CHECK: str r
23; CHECK-NEXT: bx r
Evan Cheng53519f02011-01-21 18:55:51 +000024; CHECK: movw r{{[0-9]+}}, :lower16:_GHJK
25; CHECK: movt r{{[0-9]+}}, :upper16:_GHJK
Bob Wilson60f34b92009-11-18 22:52:37 +000026; CHECK: str r
27; CHECK-NEXT: bx r
Evan Cheng53519f02011-01-21 18:55:51 +000028; CHECK: movw r{{[0-9]+}}, :lower16:_GHJK
29; CHECK: movt r{{[0-9]+}}, :upper16:_GHJK
Bob Wilson60f34b92009-11-18 22:52:37 +000030; CHECK: str r
31; CHECK-NEXT: bx r
32
33define void @tail_duplicate_me() nounwind {
34entry:
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
39next:
40 %b = call i1 @qux()
41 br i1 %b, label %B, label %C
42
43A:
44 call void @bar(i32 0)
45 store i32 0, i32* @GHJK
46 br label %M
47
48B:
49 call void @car(i32 1)
50 store i32 0, i32* @GHJK
51 br label %M
52
53C:
54 call void @dar(i32 2)
55 store i32 0, i32* @GHJK
56 br label %M
57
58M:
59 indirectbr i8* %c, [label %return, label %altret]
60
61return:
62 call void @ear(i32 1000)
63 ret void
64altret:
65 call void @far(i32 1001)
66 ret void
67}