blob: 150a38716afb2948254f981b249870bfe350a552 [file] [edit]
; 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
}