| ; 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() | |
| declare i32 @bar(i32) | |
| 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 | |
| } | |
| define i32 @cbb_chain_reg(i8 signext %a, i8 signext %b, i8 signext %c, i8 signext %d, i32 %x, i32 %y) nounwind { | |
| ; CHECK-CMPBR-LABEL: cbb_chain_reg: | |
| ; CHECK-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-CMPBR-NEXT: cmp w0, w1 | |
| ; CHECK-CMPBR-NEXT: ccmp w2, w3, #0, gt | |
| ; CHECK-CMPBR-NEXT: b.lt LBB11_2 | |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end | |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 | |
| ; CHECK-CMPBR-NEXT: ret | |
| ; CHECK-CMPBR-NEXT: LBB11_2: ; %if.then | |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill | |
| ; CHECK-CMPBR-NEXT: sdiv w0, w4, w5 | |
| ; CHECK-CMPBR-NEXT: bl _bar | |
| ; 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: cbb_chain_reg: | |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, w1 | |
| ; CHECK-NO-CMPBR-NEXT: ccmp w2, w3, #0, gt | |
| ; CHECK-NO-CMPBR-NEXT: b.lt LBB11_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: LBB11_2: ; %if.then | |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill | |
| ; CHECK-NO-CMPBR-NEXT: sdiv w0, w4, w5 | |
| ; CHECK-NO-CMPBR-NEXT: bl _bar | |
| ; 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 i8 %a, %b | |
| br i1 %cmp, label %land.lhs.true, label %if.end | |
| land.lhs.true: | |
| %div = sdiv i32 %x, %y | |
| %cmp1 = icmp slt i8 %c, %d | |
| br i1 %cmp1, label %if.then, label %if.end | |
| if.then: | |
| %call = tail call i32 @bar(i32 %div) nounwind | |
| br label %if.end | |
| if.end: | |
| ret i32 7 | |
| } | |
| define i32 @cbh_chain_reg(i16 signext %a, i16 signext %b, i16 signext %c, i16 signext %d, i32 %x, i32 %y) nounwind { | |
| ; CHECK-CMPBR-LABEL: cbh_chain_reg: | |
| ; CHECK-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-CMPBR-NEXT: cmp w0, w1 | |
| ; CHECK-CMPBR-NEXT: ccmp w2, w3, #2, hi | |
| ; CHECK-CMPBR-NEXT: b.lo LBB12_2 | |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end | |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 | |
| ; CHECK-CMPBR-NEXT: ret | |
| ; CHECK-CMPBR-NEXT: LBB12_2: ; %if.then | |
| ; CHECK-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill | |
| ; CHECK-CMPBR-NEXT: sdiv w0, w4, w5 | |
| ; CHECK-CMPBR-NEXT: bl _bar | |
| ; 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: cbh_chain_reg: | |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, w1 | |
| ; CHECK-NO-CMPBR-NEXT: ccmp w2, w3, #2, hi | |
| ; CHECK-NO-CMPBR-NEXT: b.lo LBB12_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: LBB12_2: ; %if.then | |
| ; CHECK-NO-CMPBR-NEXT: stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill | |
| ; CHECK-NO-CMPBR-NEXT: sdiv w0, w4, w5 | |
| ; CHECK-NO-CMPBR-NEXT: bl _bar | |
| ; 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 ugt i16 %a, %b | |
| br i1 %cmp, label %land.lhs.true, label %if.end | |
| land.lhs.true: | |
| %div = sdiv i32 %x, %y | |
| %cmp1 = icmp ult i16 %c, %d | |
| br i1 %cmp1, label %if.then, label %if.end | |
| if.then: | |
| %call = tail call i32 @bar(i32 %div) nounwind | |
| br label %if.end | |
| if.end: | |
| ret i32 7 | |
| } | |
| define i32 @cbb_head_cb_cmpbb(i8 signext %a, i8 signext %b, i32 %x, i32 %y) nounwind { | |
| ; CHECK-CMPBR-LABEL: cbb_head_cb_cmpbb: | |
| ; CHECK-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-CMPBR-NEXT: sdiv w8, w2, w3 | |
| ; CHECK-CMPBR-NEXT: cmp w0, w1 | |
| ; CHECK-CMPBR-NEXT: ccmp w8, #16, #0, gt | |
| ; CHECK-CMPBR-NEXT: b.le LBB13_2 | |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end | |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 | |
| ; CHECK-CMPBR-NEXT: ret | |
| ; CHECK-CMPBR-NEXT: LBB13_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: cbb_head_cb_cmpbb: | |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w2, w3 | |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, w1 | |
| ; CHECK-NO-CMPBR-NEXT: ccmp w8, #16, #0, gt | |
| ; CHECK-NO-CMPBR-NEXT: b.le LBB13_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: LBB13_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 i8 %a, %b | |
| br i1 %cmp, label %land.lhs.true, label %if.end | |
| land.lhs.true: | |
| %div = sdiv i32 %x, %y | |
| %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 @cbb_head_sext(i8 signext %a, i32 %n, i32 %x, i32 %y) nounwind { | |
| ; CHECK-CMPBR-LABEL: cbb_head_sext: | |
| ; CHECK-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-CMPBR-NEXT: sdiv w8, w2, w3 | |
| ; CHECK-CMPBR-NEXT: sxtb w9, w1 | |
| ; CHECK-CMPBR-NEXT: cmp w9, w0 | |
| ; CHECK-CMPBR-NEXT: ccmp w8, #16, #0, gt | |
| ; CHECK-CMPBR-NEXT: b.le LBB14_2 | |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %if.end | |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 | |
| ; CHECK-CMPBR-NEXT: ret | |
| ; CHECK-CMPBR-NEXT: LBB14_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: cbb_head_sext: | |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w2, w3 | |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, w1, sxtb | |
| ; CHECK-NO-CMPBR-NEXT: ccmp w8, #16, #0, lt | |
| ; CHECK-NO-CMPBR-NEXT: b.le LBB14_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: LBB14_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: | |
| %t = trunc i32 %n to i8 | |
| %cmp = icmp sgt i8 %t, %a | |
| br i1 %cmp, label %land.lhs.true, label %if.end | |
| land.lhs.true: | |
| %div = sdiv i32 %x, %y | |
| %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 @cbh_cmpbb_sext_reject(i16 signext %a, i32 %x, i32 %y) nounwind { | |
| ; CHECK-CMPBR-LABEL: cbh_cmpbb_sext_reject: | |
| ; CHECK-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-CMPBR-NEXT: cblt w1, #1, LBB15_3 | |
| ; CHECK-CMPBR-NEXT: ; %bb.1: ; %land.lhs.true | |
| ; CHECK-CMPBR-NEXT: sdiv w8, w2, w1 | |
| ; CHECK-CMPBR-NEXT: cbhge w8, w0, LBB15_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: LBB15_3: ; %if.end | |
| ; CHECK-CMPBR-NEXT: mov w0, #7 ; =0x7 | |
| ; CHECK-CMPBR-NEXT: ret | |
| ; | |
| ; CHECK-NO-CMPBR-LABEL: cbh_cmpbb_sext_reject: | |
| ; CHECK-NO-CMPBR: ; %bb.0: ; %entry | |
| ; CHECK-NO-CMPBR-NEXT: cmp w1, #1 | |
| ; CHECK-NO-CMPBR-NEXT: b.lt LBB15_3 | |
| ; CHECK-NO-CMPBR-NEXT: ; %bb.1: ; %land.lhs.true | |
| ; CHECK-NO-CMPBR-NEXT: sdiv w8, w2, w1 | |
| ; CHECK-NO-CMPBR-NEXT: cmp w0, w8, sxth | |
| ; CHECK-NO-CMPBR-NEXT: b.le LBB15_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: LBB15_3: ; %if.end | |
| ; CHECK-NO-CMPBR-NEXT: mov w0, #7 ; =0x7 | |
| ; CHECK-NO-CMPBR-NEXT: ret | |
| entry: | |
| %cmp = icmp sgt i32 %x, 0 | |
| br i1 %cmp, label %land.lhs.true, label %if.end | |
| land.lhs.true: | |
| %div = sdiv i32 %y, %x | |
| %t = trunc i32 %div to i16 | |
| %cmp1 = icmp slt i16 %t, %a | |
| 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 | |
| } |