Recommit r218010 [FastISel][AArch64] Fold bit test and branch into TBZ and TBNZ.
[oota-llvm.git] / test / CodeGen / AArch64 / fast-isel-tbz.ll
1 ; RUN: llc                             -aarch64-atomic-cfg-tidy=0 -verify-machineinstrs -mtriple=aarch64-apple-darwin < %s | FileCheck %s
2 ; RUN: llc -fast-isel -fast-isel-abort -aarch64-atomic-cfg-tidy=0 -verify-machineinstrs -mtriple=aarch64-apple-darwin < %s | FileCheck %s
3
4 define i32 @icmp_eq_i8(i8 zeroext %a) {
5 ; CHECK-LABEL: icmp_eq_i8
6 ; CHECK:       tbz {{w[0-9]+}}, #0, {{LBB.+_2}}
7   %1 = and i8 %a, 1
8   %2 = icmp eq i8 %1, 0
9   br i1 %2, label %bb1, label %bb2, !prof !0
10 bb1:
11   ret i32 1
12 bb2:
13   ret i32 0
14 }
15
16 define i32 @icmp_eq_i16(i16 zeroext %a) {
17 ; CHECK-LABEL: icmp_eq_i16
18 ; CHECK:       tbz w0, #1, {{LBB.+_2}}
19   %1 = and i16 %a, 2
20   %2 = icmp eq i16 %1, 0
21   br i1 %2, label %bb1, label %bb2, !prof !0
22 bb1:
23   ret i32 1
24 bb2:
25   ret i32 0
26 }
27
28 define i32 @icmp_eq_i32(i32 %a) {
29 ; CHECK-LABEL: icmp_eq_i32
30 ; CHECK:       tbz w0, #2, {{LBB.+_2}}
31   %1 = and i32 %a, 4
32   %2 = icmp eq i32 %1, 0
33   br i1 %2, label %bb1, label %bb2, !prof !0
34 bb1:
35   ret i32 1
36 bb2:
37   ret i32 0
38 }
39
40 define i32 @icmp_eq_i64_1(i64 %a) {
41 ; CHECK-LABEL: icmp_eq_i64_1
42 ; CHECK:       tbz w0, #3, {{LBB.+_2}}
43   %1 = and i64 %a, 8
44   %2 = icmp eq i64 %1, 0
45   br i1 %2, label %bb1, label %bb2, !prof !0
46 bb1:
47   ret i32 1
48 bb2:
49   ret i32 0
50 }
51
52 define i32 @icmp_eq_i64_2(i64 %a) {
53 ; CHECK-LABEL: icmp_eq_i64_2
54 ; CHECK:       tbz x0, #32, {{LBB.+_2}}
55   %1 = and i64 %a, 4294967296
56   %2 = icmp eq i64 %1, 0
57   br i1 %2, label %bb1, label %bb2, !prof !0
58 bb1:
59   ret i32 1
60 bb2:
61   ret i32 0
62 }
63
64 define i32 @icmp_ne_i8(i8 zeroext %a) {
65 ; CHECK-LABEL: icmp_ne_i8
66 ; CHECK:       tbnz w0, #0, {{LBB.+_2}}
67   %1 = and i8 %a, 1
68   %2 = icmp ne i8 %1, 0
69   br i1 %2, label %bb1, label %bb2, !prof !0
70 bb1:
71   ret i32 1
72 bb2:
73   ret i32 0
74 }
75
76 define i32 @icmp_ne_i16(i16 zeroext %a) {
77 ; CHECK-LABEL: icmp_ne_i16
78 ; CHECK:       tbnz w0, #1, {{LBB.+_2}}
79   %1 = and i16 %a, 2
80   %2 = icmp ne i16 %1, 0
81   br i1 %2, label %bb1, label %bb2, !prof !0
82 bb1:
83   ret i32 1
84 bb2:
85   ret i32 0
86 }
87
88 define i32 @icmp_ne_i32(i32 %a) {
89 ; CHECK-LABEL: icmp_ne_i32
90 ; CHECK:       tbnz w0, #2, {{LBB.+_2}}
91   %1 = and i32 %a, 4
92   %2 = icmp ne i32 %1, 0
93   br i1 %2, label %bb1, label %bb2, !prof !0
94 bb1:
95   ret i32 1
96 bb2:
97   ret i32 0
98 }
99
100 define i32 @icmp_ne_i64_1(i64 %a) {
101 ; CHECK-LABEL: icmp_ne_i64_1
102 ; CHECK:       tbnz w0, #3, {{LBB.+_2}}
103   %1 = and i64 %a, 8
104   %2 = icmp ne i64 %1, 0
105   br i1 %2, label %bb1, label %bb2, !prof !0
106 bb1:
107   ret i32 1
108 bb2:
109   ret i32 0
110 }
111
112 define i32 @icmp_ne_i64_2(i64 %a) {
113 ; CHECK-LABEL: icmp_ne_i64_2
114 ; CHECK:       tbnz x0, #32, {{LBB.+_2}}
115   %1 = and i64 %a, 4294967296
116   %2 = icmp ne i64 %1, 0
117   br i1 %2, label %bb1, label %bb2, !prof !0
118 bb1:
119   ret i32 1
120 bb2:
121   ret i32 0
122 }
123
124 !0 = metadata !{metadata !"branch_weights", i32 0, i32 2147483647}
125 !1 = metadata !{metadata !"branch_weights", i32 2147483647, i32 0}