[AArch64] Fix bug in prolog clobbering live reg when shrink wrapping.
[oota-llvm.git] / test / CodeGen / AArch64 / fast-isel-branch-cond-split.ll
1 ; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s
2
3 ; CHECK-LABEL: test_or
4 ; CHECK:       cbnz w0, {{LBB[0-9]+_2}}
5 ; CHECK:       cbz w1, {{LBB[0-9]+_1}}
6 define i64 @test_or(i32 %a, i32 %b) {
7 bb1:
8   %0 = icmp eq i32 %a, 0
9   %1 = icmp eq i32 %b, 0
10   %or.cond = or i1 %0, %1
11   br i1 %or.cond, label %bb3, label %bb4, !prof !0
12
13 bb3:
14   ret i64 0
15
16 bb4:
17   %2 = call i64 @bar()
18   ret i64 %2
19 }
20
21 ; CHECK-LABEL: test_and
22 ; CHECK:       cbz w0, {{LBB[0-9]+_2}}
23 ; CHECK:       cbnz w1, {{LBB[0-9]+_3}}
24 define i64 @test_and(i32 %a, i32 %b) {
25 bb1:
26   %0 = icmp ne i32 %a, 0
27   %1 = icmp ne i32 %b, 0
28   %or.cond = and i1 %0, %1
29   br i1 %or.cond, label %bb4, label %bb3, !prof !1
30
31 bb3:
32   ret i64 0
33
34 bb4:
35   %2 = call i64 @bar()
36   ret i64 %2
37 }
38
39 ; If the branch is unpredictable, don't add another branch.
40
41 ; CHECK-LABEL: test_or_unpredictable
42 ; CHECK:       cmp   w0, #0
43 ; CHECK-NEXT:  cset  w8, eq
44 ; CHECK-NEXT:  cmp   w1, #0
45 ; CHECK-NEXT:  cset  w9, eq
46 ; CHECK-NEXT:  orr   w8, w8, w9
47 ; CHECK-NEXT:  tbnz w8, #0,
48 define i64 @test_or_unpredictable(i32 %a, i32 %b) {
49 bb1:
50   %0 = icmp eq i32 %a, 0
51   %1 = icmp eq i32 %b, 0
52   %or.cond = or i1 %0, %1
53   br i1 %or.cond, label %bb3, label %bb4, !unpredictable !2
54
55 bb3:
56   ret i64 0
57
58 bb4:
59   %2 = call i64 @bar()
60   ret i64 %2
61 }
62
63 ; CHECK-LABEL: test_and_unpredictable
64 ; CHECK:       cmp   w0, #0
65 ; CHECK-NEXT:  cset  w8, ne
66 ; CHECK-NEXT:  cmp   w1, #0
67 ; CHECK-NEXT:  cset  w9, ne
68 ; CHECK-NEXT:  and   w8, w8, w9
69 ; CHECK-NEXT:  tbz w8, #0,
70 define i64 @test_and_unpredictable(i32 %a, i32 %b) {
71 bb1:
72   %0 = icmp ne i32 %a, 0
73   %1 = icmp ne i32 %b, 0
74   %or.cond = and i1 %0, %1
75   br i1 %or.cond, label %bb4, label %bb3, !unpredictable !2
76
77 bb3:
78   ret i64 0
79
80 bb4:
81   %2 = call i64 @bar()
82   ret i64 %2
83 }
84
85 declare i64 @bar()
86
87 !0 = !{!"branch_weights", i32 5128, i32 32}
88 !1 = !{!"branch_weights", i32 1024, i32 4136}
89 !2 = !{}
90