201 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s3 4define i64 @test_or(i32 %a, i32 %b) {5; CHECK-LABEL: test_or:6; CHECK: ; %bb.0: ; %bb17; CHECK-NEXT: cbnz w0, LBB0_28; CHECK-NEXT: LBB0_1:9; CHECK-NEXT: mov x0, xzr10; CHECK-NEXT: ret11; CHECK-NEXT: LBB0_2: ; %bb1.cond.split12; CHECK-NEXT: cbz w1, LBB0_113; CHECK-NEXT: ; %bb.3: ; %bb414; CHECK-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill15; CHECK-NEXT: .cfi_def_cfa_offset 1616; CHECK-NEXT: .cfi_offset w30, -817; CHECK-NEXT: .cfi_offset w29, -1618; CHECK-NEXT: bl _bar19; CHECK-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload20; CHECK-NEXT: ret21bb1:22 %0 = icmp eq i32 %a, 023 %1 = icmp eq i32 %b, 024 %or.cond = or i1 %0, %125 br i1 %or.cond, label %bb3, label %bb4, !prof !026 27bb3:28 ret i64 029 30bb4:31 %2 = call i64 @bar()32 ret i64 %233}34 35define i64 @test_or_select(i32 %a, i32 %b) {36; CHECK-LABEL: test_or_select:37; CHECK: ; %bb.0: ; %bb138; CHECK-NEXT: cbnz w0, LBB1_239; CHECK-NEXT: LBB1_1:40; CHECK-NEXT: mov x0, xzr41; CHECK-NEXT: ret42; CHECK-NEXT: LBB1_2: ; %bb1.cond.split43; CHECK-NEXT: cbz w1, LBB1_144; CHECK-NEXT: ; %bb.3: ; %bb445; CHECK-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill46; CHECK-NEXT: .cfi_def_cfa_offset 1647; CHECK-NEXT: .cfi_offset w30, -848; CHECK-NEXT: .cfi_offset w29, -1649; CHECK-NEXT: bl _bar50; CHECK-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload51; CHECK-NEXT: ret52bb1:53 %0 = icmp eq i32 %a, 054 %1 = icmp eq i32 %b, 055 %or.cond = select i1 %0, i1 true, i1 %156 br i1 %or.cond, label %bb3, label %bb4, !prof !057 58bb3:59 ret i64 060 61bb4:62 %2 = call i64 @bar()63 ret i64 %264}65 66define i64 @test_and(i32 %a, i32 %b) {67; CHECK-LABEL: test_and:68; CHECK: ; %bb.0: ; %bb169; CHECK-NEXT: cbnz w0, LBB2_270; CHECK-NEXT: LBB2_1:71; CHECK-NEXT: mov x0, xzr72; CHECK-NEXT: ret73; CHECK-NEXT: LBB2_2: ; %bb1.cond.split74; CHECK-NEXT: cbz w1, LBB2_175; CHECK-NEXT: ; %bb.3: ; %bb476; CHECK-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill77; CHECK-NEXT: .cfi_def_cfa_offset 1678; CHECK-NEXT: .cfi_offset w30, -879; CHECK-NEXT: .cfi_offset w29, -1680; CHECK-NEXT: bl _bar81; CHECK-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload82; CHECK-NEXT: ret83bb1:84 %0 = icmp ne i32 %a, 085 %1 = icmp ne i32 %b, 086 %or.cond = and i1 %0, %187 br i1 %or.cond, label %bb4, label %bb3, !prof !188 89bb3:90 ret i64 091 92bb4:93 %2 = call i64 @bar()94 ret i64 %295}96 97define i64 @test_and_select(i32 %a, i32 %b) {98; CHECK-LABEL: test_and_select:99; CHECK: ; %bb.0: ; %bb1100; CHECK-NEXT: cbnz w0, LBB3_2101; CHECK-NEXT: LBB3_1:102; CHECK-NEXT: mov x0, xzr103; CHECK-NEXT: ret104; CHECK-NEXT: LBB3_2: ; %bb1.cond.split105; CHECK-NEXT: cbz w1, LBB3_1106; CHECK-NEXT: ; %bb.3: ; %bb4107; CHECK-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill108; CHECK-NEXT: .cfi_def_cfa_offset 16109; CHECK-NEXT: .cfi_offset w30, -8110; CHECK-NEXT: .cfi_offset w29, -16111; CHECK-NEXT: bl _bar112; CHECK-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload113; CHECK-NEXT: ret114bb1:115 %0 = icmp ne i32 %a, 0116 %1 = icmp ne i32 %b, 0117 %or.cond = select i1 %0, i1 %1, i1 false118 br i1 %or.cond, label %bb4, label %bb3, !prof !1119 120bb3:121 ret i64 0122 123bb4:124 %2 = call i64 @bar()125 ret i64 %2126}127 128; If the branch is unpredictable, don't add another branch.129 130define i64 @test_or_unpredictable(i32 %a, i32 %b) {131; CHECK-LABEL: test_or_unpredictable:132; CHECK: ; %bb.0: ; %bb1133; CHECK-NEXT: cmp w0, #0134; CHECK-NEXT: mov x0, xzr135; CHECK-NEXT: cset w8, eq136; CHECK-NEXT: cmp w1, #0137; CHECK-NEXT: cset w9, eq138; CHECK-NEXT: orr w8, w8, w9139; CHECK-NEXT: tbnz w8, #0, LBB4_2140; CHECK-NEXT: ; %bb.1: ; %bb4141; CHECK-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill142; CHECK-NEXT: .cfi_def_cfa_offset 16143; CHECK-NEXT: .cfi_offset w30, -8144; CHECK-NEXT: .cfi_offset w29, -16145; CHECK-NEXT: bl _bar146; CHECK-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload147; CHECK-NEXT: LBB4_2: ; %common.ret148; CHECK-NEXT: ret149bb1:150 %0 = icmp eq i32 %a, 0151 %1 = icmp eq i32 %b, 0152 %or.cond = or i1 %0, %1153 br i1 %or.cond, label %bb3, label %bb4, !unpredictable !2154 155bb3:156 ret i64 0157 158bb4:159 %2 = call i64 @bar()160 ret i64 %2161}162 163define i64 @test_and_unpredictable(i32 %a, i32 %b) {164; CHECK-LABEL: test_and_unpredictable:165; CHECK: ; %bb.0: ; %bb1166; CHECK-NEXT: cmp w0, #0167; CHECK-NEXT: mov x0, xzr168; CHECK-NEXT: cset w8, ne169; CHECK-NEXT: cmp w1, #0170; CHECK-NEXT: cset w9, ne171; CHECK-NEXT: and w8, w8, w9172; CHECK-NEXT: tbz w8, #0, LBB5_2173; CHECK-NEXT: ; %bb.1: ; %bb4174; CHECK-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill175; CHECK-NEXT: .cfi_def_cfa_offset 16176; CHECK-NEXT: .cfi_offset w30, -8177; CHECK-NEXT: .cfi_offset w29, -16178; CHECK-NEXT: bl _bar179; CHECK-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload180; CHECK-NEXT: LBB5_2: ; %common.ret181; CHECK-NEXT: ret182bb1:183 %0 = icmp ne i32 %a, 0184 %1 = icmp ne i32 %b, 0185 %or.cond = and i1 %0, %1186 br i1 %or.cond, label %bb4, label %bb3, !unpredictable !2187 188bb3:189 ret i64 0190 191bb4:192 %2 = call i64 @bar()193 ret i64 %2194}195 196declare i64 @bar()197 198!0 = !{!"branch_weights", i32 5128, i32 32}199!1 = !{!"branch_weights", i32 1024, i32 4136}200!2 = !{}201