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