; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 -mattr=+experimental-zibi -verify-machineinstrs < %s \
; RUN:     | FileCheck -check-prefixes=ZIBI,ZIBI-RV32 %s
; RUN: llc -mtriple=riscv64 -mattr=+experimental-zibi -verify-machineinstrs < %s \
; RUN:     | FileCheck -check-prefixes=ZIBI,ZIBI-RV64 %s

define void @test_bne_neg(ptr %b) nounwind {
; ZIBI-LABEL: test_bne_neg:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    bnei a1, -1, .LBB0_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB0_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp ne i32 %val1, -1
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}

define void @test_beq_neg(ptr %b) nounwind {
; ZIBI-LABEL: test_beq_neg:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    beqi a1, -1, .LBB1_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB1_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp eq i32 %val1, -1
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}

define void @test_bne_zero(ptr %b) nounwind {
; ZIBI-LABEL: test_bne_zero:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    bnez a1, .LBB2_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB2_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp ne i32 %val1, 0
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}

define void @test_beq_zero(ptr %b) nounwind {
; ZIBI-LABEL: test_beq_zero:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    beqz a1, .LBB3_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB3_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp eq i32 %val1, 0
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}

define void @test_bne_1(ptr %b) nounwind {
; ZIBI-LABEL: test_bne_1:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    bnei a1, 1, .LBB4_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB4_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp ne i32 %val1, 1
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}

define void @test_beq_1(ptr %b) nounwind {
; ZIBI-LABEL: test_beq_1:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    beqi a1, 1, .LBB5_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB5_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp eq i32 %val1, 1
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}

define void @test_bne_31(ptr %b) nounwind {
; ZIBI-LABEL: test_bne_31:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    bnei a1, 31, .LBB6_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB6_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp ne i32 %val1, 31
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}

define void @test_beq_31(ptr %b) nounwind {
; ZIBI-LABEL: test_beq_31:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    beqi a1, 31, .LBB7_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB7_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp eq i32 %val1, 31
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}

define void @test_bne_32(ptr %b) nounwind {
; ZIBI-LABEL: test_bne_32:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    li a2, 32
; ZIBI-NEXT:    bne a1, a2, .LBB8_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB8_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp ne i32 %val1, 32
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}

define void @test_beq_32(ptr %b) nounwind {
; ZIBI-LABEL: test_beq_32:
; ZIBI:       # %bb.0:
; ZIBI-NEXT:    lw a1, 0(a0)
; ZIBI-NEXT:    li a2, 32
; ZIBI-NEXT:    beq a1, a2, .LBB9_2
; ZIBI-NEXT:  # %bb.1: # %test2
; ZIBI-NEXT:    lw zero, 0(a0)
; ZIBI-NEXT:  .LBB9_2: # %end
; ZIBI-NEXT:    ret
  %val1 = load volatile i32, ptr %b
  %tst1 = icmp eq i32 %val1, 32
  br i1 %tst1, label %end, label %test2, !prof !0
test2:
  %val2 = load volatile i32, ptr %b
  br label %end
end:
  ret void
}
!0 = !{!"branch_weights", i32 1, i32 99}

define i32 @test_select_beq_neg(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_beq_neg:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    beqi a0, -1, .LBB10_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB10_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_beq_neg:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    beqi a3, -1, .LBB10_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB10_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp eq i32 %a, -1
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}

define i32 @test_select_bne_neg(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_bne_neg:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    bnei a0, -1, .LBB11_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB11_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_bne_neg:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    bnei a3, -1, .LBB11_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB11_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp ne i32 %a, -1
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}

define i32 @test_select_beq_zero(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_beq_zero:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    beqz a0, .LBB12_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB12_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_beq_zero:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    beqz a3, .LBB12_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB12_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp eq i32 %a, 0
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}

define i32 @test_select_bne_zero(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_bne_zero:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    bnez a0, .LBB13_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB13_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_bne_zero:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    bnez a3, .LBB13_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB13_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp ne i32 %a, 0
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}

define i32 @test_select_beq_1(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_beq_1:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    beqi a0, 1, .LBB14_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB14_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_beq_1:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    beqi a3, 1, .LBB14_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB14_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp eq i32 %a, 1
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}

define i32 @test_select_bne_1(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_bne_1:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    bnei a0, 1, .LBB15_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB15_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_bne_1:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    bnei a3, 1, .LBB15_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB15_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp ne i32 %a, 1
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}

define i32 @test_select_beq_31(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_beq_31:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    beqi a0, 31, .LBB16_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB16_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_beq_31:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    beqi a3, 31, .LBB16_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB16_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp eq i32 %a, 31
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}

define i32 @test_select_bne_31(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_bne_31:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    bnei a0, 31, .LBB17_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB17_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_bne_31:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    bnei a3, 31, .LBB17_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB17_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp ne i32 %a, 31
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}

define i32 @test_select_beq_32(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_beq_32:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    li a3, 32
; ZIBI-RV32-NEXT:    beq a0, a3, .LBB18_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB18_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_beq_32:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    li a4, 32
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    beq a3, a4, .LBB18_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB18_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp eq i32 %a, 32
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}

define i32 @test_select_bne_32(i32 %a, i32 %b, i32 %c) nounwind {
; ZIBI-RV32-LABEL: test_select_bne_32:
; ZIBI-RV32:       # %bb.0:
; ZIBI-RV32-NEXT:    li a3, 32
; ZIBI-RV32-NEXT:    bne a0, a3, .LBB19_2
; ZIBI-RV32-NEXT:  # %bb.1:
; ZIBI-RV32-NEXT:    mv a1, a2
; ZIBI-RV32-NEXT:  .LBB19_2:
; ZIBI-RV32-NEXT:    mv a0, a1
; ZIBI-RV32-NEXT:    ret
;
; ZIBI-RV64-LABEL: test_select_bne_32:
; ZIBI-RV64:       # %bb.0:
; ZIBI-RV64-NEXT:    sext.w a3, a0
; ZIBI-RV64-NEXT:    li a4, 32
; ZIBI-RV64-NEXT:    mv a0, a1
; ZIBI-RV64-NEXT:    bne a3, a4, .LBB19_2
; ZIBI-RV64-NEXT:  # %bb.1:
; ZIBI-RV64-NEXT:    mv a0, a2
; ZIBI-RV64-NEXT:  .LBB19_2:
; ZIBI-RV64-NEXT:    ret
  %tst = icmp ne i32 %a, 32
  %ret = select i1 %tst, i32 %b, i32 %c
  ret i32 %ret
}
