| ; 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 i32 @test_bne_neg(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_bne_neg: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: bnei a0, -1, .LBB0_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: li a0, 0 | |
| ; ZIBI-NEXT: ret | |
| ; ZIBI-NEXT: .LBB0_2: # %t | |
| ; ZIBI-NEXT: li a0, 1 | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp ne i32 %a, -1 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| define i32 @test_beq_neg(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_beq_neg: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: beqi a0, -1, .LBB1_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: li a0, 0 | |
| ; ZIBI-NEXT: ret | |
| ; ZIBI-NEXT: .LBB1_2: # %t | |
| ; ZIBI-NEXT: li a0, 1 | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp eq i32 %a, -1 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| define i32 @test_bne_zero(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_bne_zero: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: bnez a0, .LBB2_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: ret | |
| ; ZIBI-NEXT: .LBB2_2: # %t | |
| ; ZIBI-NEXT: li a0, 1 | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp ne i32 %a, 0 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| define i32 @test_beq_zero(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_beq_zero: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: beqz a0, .LBB3_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: li a0, 0 | |
| ; ZIBI-NEXT: ret | |
| ; ZIBI-NEXT: .LBB3_2: # %t | |
| ; ZIBI-NEXT: li a0, 1 | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp eq i32 %a, 0 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| define i32 @test_bne_1(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_bne_1: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: bnei a0, 1, .LBB4_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: li a0, 0 | |
| ; ZIBI-NEXT: ret | |
| ; ZIBI-NEXT: .LBB4_2: # %t | |
| ; ZIBI-NEXT: li a0, 1 | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp ne i32 %a, 1 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| define i32 @test_beq_1(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_beq_1: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: beqi a0, 1, .LBB5_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: li a0, 0 | |
| ; ZIBI-NEXT: .LBB5_2: # %t | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp eq i32 %a, 1 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| define i32 @test_bne_31(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_bne_31: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: bnei a0, 31, .LBB6_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: li a0, 0 | |
| ; ZIBI-NEXT: ret | |
| ; ZIBI-NEXT: .LBB6_2: # %t | |
| ; ZIBI-NEXT: li a0, 1 | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp ne i32 %a, 31 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| define i32 @test_beq_31(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_beq_31: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: beqi a0, 31, .LBB7_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: li a0, 0 | |
| ; ZIBI-NEXT: ret | |
| ; ZIBI-NEXT: .LBB7_2: # %t | |
| ; ZIBI-NEXT: li a0, 1 | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp eq i32 %a, 31 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| define i32 @test_bne_32(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_bne_32: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: li a1, 32 | |
| ; ZIBI-NEXT: bne a0, a1, .LBB8_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: li a0, 0 | |
| ; ZIBI-NEXT: ret | |
| ; ZIBI-NEXT: .LBB8_2: # %t | |
| ; ZIBI-NEXT: li a0, 1 | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp ne i32 %a, 32 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| define i32 @test_beq_32(i32 signext %a) nounwind { | |
| ; ZIBI-LABEL: test_beq_32: | |
| ; ZIBI: # %bb.0: | |
| ; ZIBI-NEXT: li a1, 32 | |
| ; ZIBI-NEXT: beq a0, a1, .LBB9_2 | |
| ; ZIBI-NEXT: # %bb.1: # %f | |
| ; ZIBI-NEXT: li a0, 0 | |
| ; ZIBI-NEXT: ret | |
| ; ZIBI-NEXT: .LBB9_2: # %t | |
| ; ZIBI-NEXT: li a0, 1 | |
| ; ZIBI-NEXT: ret | |
| %cmp = icmp eq i32 %a, 32 | |
| br i1 %cmp, label %t, label %f, !prof !0 | |
| f: | |
| ret i32 0 | |
| t: | |
| ret i32 1 | |
| } | |
| !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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: beqi a3, -1, .LBB10_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB10_2: | |
| ; 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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: bnei a3, -1, .LBB11_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB11_2: | |
| ; 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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: beqz a3, .LBB12_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB12_2: | |
| ; 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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: bnez a3, .LBB13_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB13_2: | |
| ; 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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: beqi a3, 1, .LBB14_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB14_2: | |
| ; 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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: bnei a3, 1, .LBB15_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB15_2: | |
| ; 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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: beqi a3, 31, .LBB16_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB16_2: | |
| ; 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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: bnei a3, 31, .LBB17_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB17_2: | |
| ; 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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: li a4, 32 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: beq a3, a4, .LBB18_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB18_2: | |
| ; 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: mv a3, a0 | |
| ; ZIBI-RV32-NEXT: li a4, 32 | |
| ; ZIBI-RV32-NEXT: mv a0, a1 | |
| ; ZIBI-RV32-NEXT: bne a3, a4, .LBB19_2 | |
| ; ZIBI-RV32-NEXT: # %bb.1: | |
| ; ZIBI-RV32-NEXT: mv a0, a2 | |
| ; ZIBI-RV32-NEXT: .LBB19_2: | |
| ; 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 | |
| } |