| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=arm64-apple-ios -mattr +cmpbr -aarch64-stress-ccmp -verify-machineinstrs -o - %s | FileCheck %s --check-prefix=CHECK-CMPBR |
| ; RUN: llc -mtriple=arm64-apple-ios -mattr -cmpbr -aarch64-stress-ccmp -verify-machineinstrs -o - %s | FileCheck %s --check-prefix=CHECK-NO-CMPBR |
| |
| declare i32 @foo() |
| |
| define i32 @cb_chain_imm(i32 %a, i32 %b) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_chain_imm: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-CMPBR-NEXT: ccmp w8, #16, #0, ge |
| ; CHECK-CMPBR-NEXT: b.le LBB0_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; CHECK-CMPBR-NEXT: LBB0_2: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_chain_imm: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-NO-CMPBR-NEXT: ccmp w8, #16, #0, ge |
| ; CHECK-NO-CMPBR-NEXT: b.le LBB0_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| ; CHECK-NO-CMPBR-NEXT: LBB0_2: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i32 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i32 %b, %a |
| %cmp1 = icmp slt i32 %div, 17 |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i32 7 |
| } |
| |
| define i32 @cb_cmpbb_imm_31(i32 %a, i32 %b) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_cmpbb_imm_31: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-CMPBR-NEXT: ccmp w8, #31, #0, ge |
| ; CHECK-CMPBR-NEXT: b.le LBB1_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; CHECK-CMPBR-NEXT: LBB1_2: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_cmpbb_imm_31: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-NO-CMPBR-NEXT: ccmp w8, #31, #0, ge |
| ; CHECK-NO-CMPBR-NEXT: b.le LBB1_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| ; CHECK-NO-CMPBR-NEXT: LBB1_2: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i32 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i32 %b, %a |
| %cmp1 = icmp slt i32 %div, 32 |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i32 7 |
| } |
| |
| define i32 @cb_cmpbb_imm_32_reject(i32 %a, i32 %b) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_cmpbb_imm_32_reject: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: cblt w0, #1, LBB2_3 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %land.lhs.true |
| ; CHECK-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-CMPBR-NEXT: cbgt w8, #32, LBB2_3 |
| ; CHECK-CMPBR-NEXT: ; %bb.2: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: LBB2_3: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_cmpbb_imm_32_reject: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-NO-CMPBR-NEXT: b.lt LBB2_3 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %land.lhs.true |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-NO-CMPBR-NEXT: cmp w8, #32 |
| ; CHECK-NO-CMPBR-NEXT: b.gt LBB2_3 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.2: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: LBB2_3: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i32 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i32 %b, %a |
| %cmp1 = icmp slt i32 %div, 33 |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i32 7 |
| } |
| |
| define i32 @cb_head_imm_63(i32 %a, i32 %b) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_head_imm_63: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-CMPBR-NEXT: cmp w0, #63 |
| ; CHECK-CMPBR-NEXT: ccmp w8, #16, #0, ge |
| ; CHECK-CMPBR-NEXT: b.le LBB3_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; CHECK-CMPBR-NEXT: LBB3_2: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_head_imm_63: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, #63 |
| ; CHECK-NO-CMPBR-NEXT: ccmp w8, #16, #0, ge |
| ; CHECK-NO-CMPBR-NEXT: b.le LBB3_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| ; CHECK-NO-CMPBR-NEXT: LBB3_2: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i32 %a, 62 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i32 %b, %a |
| %cmp1 = icmp slt i32 %div, 17 |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i32 7 |
| } |
| |
| define i64 @cb_chain_imm_64(i64 %a, i64 %b) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_chain_imm_64: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: sdiv x8, x1, x0 |
| ; CHECK-CMPBR-NEXT: cmp x0, #1 |
| ; CHECK-CMPBR-NEXT: ccmp x8, #16, #0, ge |
| ; CHECK-CMPBR-NEXT: b.le LBB4_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; CHECK-CMPBR-NEXT: LBB4_2: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_chain_imm_64: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: sdiv x8, x1, x0 |
| ; CHECK-NO-CMPBR-NEXT: cmp x0, #1 |
| ; CHECK-NO-CMPBR-NEXT: ccmp x8, #16, #0, ge |
| ; CHECK-NO-CMPBR-NEXT: b.le LBB4_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| ; CHECK-NO-CMPBR-NEXT: LBB4_2: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i64 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i64 %b, %a |
| %cmp1 = icmp slt i64 %div, 17 |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i64 7 |
| } |
| |
| define i32 @cb_chain_reg(i32 %a, i32 %b, i32 %n) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_chain_reg: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-CMPBR-NEXT: ccmp w8, w2, #0, ge |
| ; CHECK-CMPBR-NEXT: b.lt LBB5_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; CHECK-CMPBR-NEXT: LBB5_2: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_chain_reg: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-NO-CMPBR-NEXT: ccmp w8, w2, #0, ge |
| ; CHECK-NO-CMPBR-NEXT: b.lt LBB5_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| ; CHECK-NO-CMPBR-NEXT: LBB5_2: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i32 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i32 %b, %a |
| %cmp1 = icmp slt i32 %div, %n |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i32 7 |
| } |
| |
| define i64 @cb_chain_reg_64(i64 %a, i64 %b, i64 %n) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_chain_reg_64: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: sdiv x8, x1, x0 |
| ; CHECK-CMPBR-NEXT: cmp x0, #1 |
| ; CHECK-CMPBR-NEXT: ccmp x8, x2, #0, ge |
| ; CHECK-CMPBR-NEXT: b.lt LBB6_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; CHECK-CMPBR-NEXT: LBB6_2: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_chain_reg_64: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: sdiv x8, x1, x0 |
| ; CHECK-NO-CMPBR-NEXT: cmp x0, #1 |
| ; CHECK-NO-CMPBR-NEXT: ccmp x8, x2, #0, ge |
| ; CHECK-NO-CMPBR-NEXT: b.lt LBB6_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| ; CHECK-NO-CMPBR-NEXT: LBB6_2: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i64 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i64 %b, %a |
| %cmp1 = icmp slt i64 %div, %n |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i64 7 |
| } |
| |
| define i32 @cb_head_fcmp_cmpbb(i32 %a, float %f, float %g) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_head_fcmp_cmpbb: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: fdiv s0, s0, s1 |
| ; CHECK-CMPBR-NEXT: fmov s1, #1.00000000 |
| ; CHECK-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-CMPBR-NEXT: fccmp s0, s1, #0, ge |
| ; CHECK-CMPBR-NEXT: b.pl LBB7_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: LBB7_2: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_head_fcmp_cmpbb: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: fdiv s0, s0, s1 |
| ; CHECK-NO-CMPBR-NEXT: fmov s1, #1.00000000 |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-NO-CMPBR-NEXT: fccmp s0, s1, #0, ge |
| ; CHECK-NO-CMPBR-NEXT: b.pl LBB7_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: LBB7_2: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i32 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = fdiv float %f, %g |
| %cmp1 = fcmp olt float %div, 1.0 |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i32 7 |
| } |
| |
| define i32 @cbz_head_cb_cmpbb(i32 %a, i32 %b) nounwind { |
| ; CHECK-CMPBR-LABEL: cbz_head_cb_cmpbb: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: mov w8, #21846 ; =0x5556 |
| ; CHECK-CMPBR-NEXT: cmp w0, #0 |
| ; CHECK-CMPBR-NEXT: movk w8, #21845, lsl #16 |
| ; CHECK-CMPBR-NEXT: smull x8, w1, w8 |
| ; CHECK-CMPBR-NEXT: lsr x9, x8, #32 |
| ; CHECK-CMPBR-NEXT: add x8, x9, x8, lsr #63 |
| ; CHECK-CMPBR-NEXT: ccmp w8, #16, #0, eq |
| ; CHECK-CMPBR-NEXT: b.gt LBB8_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: LBB8_2: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cbz_head_cb_cmpbb: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: mov w8, #21846 ; =0x5556 |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, #0 |
| ; CHECK-NO-CMPBR-NEXT: movk w8, #21845, lsl #16 |
| ; CHECK-NO-CMPBR-NEXT: smull x8, w1, w8 |
| ; CHECK-NO-CMPBR-NEXT: lsr x9, x8, #32 |
| ; CHECK-NO-CMPBR-NEXT: add x8, x9, x8, lsr #63 |
| ; CHECK-NO-CMPBR-NEXT: ccmp w8, #16, #0, eq |
| ; CHECK-NO-CMPBR-NEXT: b.gt LBB8_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: LBB8_2: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp eq i32 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i32 %b, 3 |
| %cmp1 = icmp slt i32 %div, 17 |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i32 7 |
| } |
| |
| define i32 @cb_head_cbnz_cmpbb(i32 %a, i32 %b) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_head_cbnz_cmpbb: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-CMPBR-NEXT: ccmp w8, #0, #4, ge |
| ; CHECK-CMPBR-NEXT: b.ne LBB9_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; CHECK-CMPBR-NEXT: LBB9_2: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_head_cbnz_cmpbb: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-NO-CMPBR-NEXT: ccmp w8, #0, #4, ge |
| ; CHECK-NO-CMPBR-NEXT: b.ne LBB9_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| ; CHECK-NO-CMPBR-NEXT: LBB9_2: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i32 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i32 %b, %a |
| %cmp1 = icmp ne i32 %div, 0 |
| br i1 %cmp1, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i32 7 |
| } |
| |
| define i32 @cb_chain_three_deep(i32 %a, i32 %b, i32 %n) nounwind { |
| ; CHECK-CMPBR-LABEL: cb_chain_three_deep: |
| ; CHECK-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-CMPBR-NEXT: sdiv w9, w2, w0 |
| ; CHECK-CMPBR-NEXT: ccmp w8, #16, #0, ge |
| ; CHECK-CMPBR-NEXT: ccmp w9, #18, #0, le |
| ; CHECK-CMPBR-NEXT: b.le LBB10_2 |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; CHECK-CMPBR-NEXT: LBB10_2: ; %if.then |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-CMPBR-NEXT: bl _foo |
| ; CHECK-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-CMPBR-NEXT: ret |
| ; |
| ; CHECK-NO-CMPBR-LABEL: cb_chain_three_deep: |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w1, w0 |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, #1 |
| ; CHECK-NO-CMPBR-NEXT: sdiv w9, w2, w0 |
| ; CHECK-NO-CMPBR-NEXT: ccmp w8, #16, #0, ge |
| ; CHECK-NO-CMPBR-NEXT: ccmp w9, #18, #0, le |
| ; CHECK-NO-CMPBR-NEXT: b.le LBB10_2 |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %if.end |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| ; CHECK-NO-CMPBR-NEXT: LBB10_2: ; %if.then |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill |
| ; CHECK-NO-CMPBR-NEXT: bl _foo |
| ; CHECK-NO-CMPBR-NEXT: ldp x29, x30, [sp], #16 ; 16-byte Folded Reload |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 |
| ; CHECK-NO-CMPBR-NEXT: ret |
| entry: |
| %cmp = icmp sgt i32 %a, 0 |
| br i1 %cmp, label %land.lhs.true, label %if.end |
| land.lhs.true: |
| %div = sdiv i32 %b, %a |
| %cmp1 = icmp slt i32 %div, 17 |
| br i1 %cmp1, label %land.lhs.true2, label %if.end |
| land.lhs.true2: |
| %div2 = sdiv i32 %n, %a |
| %cmp2 = icmp slt i32 %div2, 19 |
| br i1 %cmp2, label %if.then, label %if.end |
| if.then: |
| %call = tail call i32 @foo() nounwind |
| br label %if.end |
| if.end: |
| ret i32 7 |
| } |