| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=mipsel -mcpu=mips32r6 < %s | FileCheck %s --check-prefix=MIPS32R6 |
| ; RUN: llc -mtriple=mips64el -mcpu=mips64r6 < %s | FileCheck %s --check-prefix=MIPS64R6 |
| |
| ;; Each function is a single compare + branch |
| ;; Checking each pattern for compact branch is selected |
| |
| |
| ;; br + slt -> bgec |
| define void @test_slt(i32 %a, i32 %b) { |
| ; MIPS32R6-LABEL: test_slt: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bgec $4, $5, $BB0_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB0_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_slt: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $5, 0 |
| ; MIPS64R6-NEXT: sll $2, $4, 0 |
| ; MIPS64R6-NEXT: bgec $2, $1, .LBB0_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB0_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp slt i32 %a, %b |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + sgt -> bgec |
| define void @test_sgt(i32 %a, i32 %b) { |
| ; MIPS32R6-LABEL: test_sgt: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bgec $5, $4, $BB1_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB1_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_sgt: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: sll $2, $5, 0 |
| ; MIPS64R6-NEXT: bgec $2, $1, .LBB1_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB1_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp sgt i32 %a, %b |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + sge -> bltc |
| define void @test_sge(i32 %a, i32 %b) { |
| ; MIPS32R6-LABEL: test_sge: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bltc $4, $5, $BB2_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB2_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_sge: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $5, 0 |
| ; MIPS64R6-NEXT: sll $2, $4, 0 |
| ; MIPS64R6-NEXT: bltc $2, $1, .LBB2_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB2_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp sge i32 %a, %b |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + sle -> bltc |
| define void @test_sle(i32 %a, i32 %b) { |
| ; MIPS32R6-LABEL: test_sle: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bltc $5, $4, $BB3_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB3_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_sle: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: sll $2, $5, 0 |
| ; MIPS64R6-NEXT: bltc $2, $1, .LBB3_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB3_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp sle i32 %a, %b |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + ult -> bgeuc |
| define void @test_ult(i32 %a, i32 %b) { |
| ; MIPS32R6-LABEL: test_ult: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bgeuc $4, $5, $BB4_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB4_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_ult: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $5, 0 |
| ; MIPS64R6-NEXT: sll $2, $4, 0 |
| ; MIPS64R6-NEXT: bgeuc $2, $1, .LBB4_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB4_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp ult i32 %a, %b |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + ugt -> bgeuc |
| define void @test_ugt(i32 %a, i32 %b) { |
| ; MIPS32R6-LABEL: test_ugt: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bgeuc $5, $4, $BB5_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB5_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_ugt: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: sll $2, $5, 0 |
| ; MIPS64R6-NEXT: bgeuc $2, $1, .LBB5_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB5_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp ugt i32 %a, %b |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + uge -> bltuc |
| define void @test_uge(i32 %a, i32 %b) { |
| ; MIPS32R6-LABEL: test_uge: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bltuc $4, $5, $BB6_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB6_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_uge: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $5, 0 |
| ; MIPS64R6-NEXT: sll $2, $4, 0 |
| ; MIPS64R6-NEXT: bltuc $2, $1, .LBB6_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB6_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp uge i32 %a, %b |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + ule -> bltuc |
| define void @test_ule(i32 %a, i32 %b) { |
| ; MIPS32R6-LABEL: test_ule: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bltuc $5, $4, $BB7_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB7_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_ule: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: sll $2, $5, 0 |
| ; MIPS64R6-NEXT: bltuc $2, $1, .LBB7_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB7_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp ule i32 %a, %b |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + slt rs,0 -> bltzc |
| define void @test_lt_zero(i32 %a) { |
| ; MIPS32R6-LABEL: test_lt_zero: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bltzc $4, $BB8_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB8_2: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_lt_zero: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: bltzc $1, .LBB8_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB8_2: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp slt i32 %a, 0 |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + sgt rs,0 -> blezc |
| define void @test_gt_zero(i32 %a) { |
| ; MIPS32R6-LABEL: test_gt_zero: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: blezc $4, $BB9_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB9_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_gt_zero: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: blezc $1, .LBB9_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB9_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp sgt i32 %a, 0 |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + sle rs,0 -> bgtzc |
| define void @test_le_zero(i32 %a) { |
| ; MIPS32R6-LABEL: test_le_zero: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bgtzc $4, $BB10_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB10_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_le_zero: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: bgtzc $1, .LBB10_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB10_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp sle i32 %a, 0 |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + sge rs,0 -> bltzc |
| define void @test_ge_zero(i32 %a) { |
| ; MIPS32R6-LABEL: test_ge_zero: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bltzc $4, $BB11_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB11_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_ge_zero: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: bltzc $1, .LBB11_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB11_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp sge i32 %a, 0 |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + slt rs,1 -> blezc |
| define void @test_lt_one(i32 %a) { |
| ; MIPS32R6-LABEL: test_lt_one: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: blezc $4, $BB12_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB12_2: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_lt_one: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: blezc $1, .LBB12_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB12_2: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp slt i32 %a, 1 |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + sge rs,1 -> blezc |
| define void @test_ge_one(i32 %a) { |
| ; MIPS32R6-LABEL: test_ge_one: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: blezc $4, $BB13_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB13_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_ge_one: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: blezc $1, .LBB13_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB13_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp sge i32 %a, 1 |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + sgt rs,-1 -> bltzc |
| define void @test_gt_minus1(i32 %a) { |
| ; MIPS32R6-LABEL: test_gt_minus1: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bltzc $4, $BB14_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB14_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_gt_minus1: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: bltzc $1, .LBB14_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB14_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp sgt i32 %a, -1 |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |
| |
| ;; br + sle rs,-1 -> bgezc |
| define void @test_le_minus1(i32 %a) { |
| ; MIPS32R6-LABEL: test_le_minus1: |
| ; MIPS32R6: # %bb.0: |
| ; MIPS32R6-NEXT: bgezc $4, $BB15_2 |
| ; MIPS32R6-NEXT: nop |
| ; MIPS32R6-NEXT: # %bb.1: # %t |
| ; MIPS32R6-NEXT: jrc $ra |
| ; MIPS32R6-NEXT: $BB15_2: # %f |
| ; MIPS32R6-NEXT: jrc $ra |
| ; |
| ; MIPS64R6-LABEL: test_le_minus1: |
| ; MIPS64R6: # %bb.0: |
| ; MIPS64R6-NEXT: sll $1, $4, 0 |
| ; MIPS64R6-NEXT: bgezc $1, .LBB15_2 |
| ; MIPS64R6-NEXT: nop |
| ; MIPS64R6-NEXT: # %bb.1: # %t |
| ; MIPS64R6-NEXT: jrc $ra |
| ; MIPS64R6-NEXT: .LBB15_2: # %f |
| ; MIPS64R6-NEXT: jrc $ra |
| %c = icmp sle i32 %a, -1 |
| br i1 %c, label %t, label %f |
| t: |
| ret void |
| f: |
| ret void |
| } |