95
|
1 ; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s
|
83
|
2
|
95
|
3 ; CHECK-LABEL: test_or
|
83
|
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
|
95
|
21 ; CHECK-LABEL: test_and
|
83
|
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
|
95
|
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: and w8, w8, #0x1
|
|
48 ; CHECK-NEXT: cmp w8, #0
|
|
49 ; CHECK-NEXT: b.ne
|
|
50 define i64 @test_or_unpredictable(i32 %a, i32 %b) {
|
|
51 bb1:
|
|
52 %0 = icmp eq i32 %a, 0
|
|
53 %1 = icmp eq i32 %b, 0
|
|
54 %or.cond = or i1 %0, %1
|
|
55 br i1 %or.cond, label %bb3, label %bb4, !unpredictable !2
|
|
56
|
|
57 bb3:
|
|
58 ret i64 0
|
|
59
|
|
60 bb4:
|
|
61 %2 = call i64 @bar()
|
|
62 ret i64 %2
|
|
63 }
|
|
64
|
|
65 ; CHECK-LABEL: test_and_unpredictable
|
|
66 ; CHECK: cmp w0, #0
|
|
67 ; CHECK-NEXT: cset w8, ne
|
|
68 ; CHECK-NEXT: cmp w1, #0
|
|
69 ; CHECK-NEXT: cset w9, ne
|
|
70 ; CHECK-NEXT: and w8, w8, w9
|
|
71 ; CHECK-NEXT: and w8, w8, #0x1
|
|
72 ; CHECK-NEXT: cmp w8, #0
|
|
73 ; CHECK-NEXT: b.eq
|
|
74 define i64 @test_and_unpredictable(i32 %a, i32 %b) {
|
|
75 bb1:
|
|
76 %0 = icmp ne i32 %a, 0
|
|
77 %1 = icmp ne i32 %b, 0
|
|
78 %or.cond = and i1 %0, %1
|
|
79 br i1 %or.cond, label %bb4, label %bb3, !unpredictable !2
|
|
80
|
|
81 bb3:
|
|
82 ret i64 0
|
|
83
|
|
84 bb4:
|
|
85 %2 = call i64 @bar()
|
|
86 ret i64 %2
|
|
87 }
|
|
88
|
83
|
89 declare i64 @bar()
|
|
90
|
|
91 !0 = !{!"branch_weights", i32 5128, i32 32}
|
|
92 !1 = !{!"branch_weights", i32 1024, i32 4136}
|
95
|
93 !2 = !{}
|
|
94
|