blob: 17c8baedbfa89b48565b45e46fd2122d5777acfc [file] [log] [blame]
Bob Wilson41a04562009-11-18 23:30:38 +00001; RUN: llc < %s -mtriple=arm-apple-darwin -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
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
30define void @tail_duplicate_me() nounwind {
31entry:
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
36next:
37 %b = call i1 @qux()
38 br i1 %b, label %B, label %C
39
40A:
41 call void @bar(i32 0)
42 store i32 0, i32* @GHJK
43 br label %M
44
45B:
46 call void @car(i32 1)
47 store i32 0, i32* @GHJK
48 br label %M
49
50C:
51 call void @dar(i32 2)
52 store i32 0, i32* @GHJK
53 br label %M
54
55M:
56 indirectbr i8* %c, [label %return, label %altret]
57
58return:
59 call void @ear(i32 1000)
60 ret void
61altret:
62 call void @far(i32 1001)
63 ret void
64}