diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -990,6 +990,10 @@ def : Pat<(brcond (XLenVT (xor GPR:$cond, 1)), bb:$imm12), (BEQ GPR:$cond, X0, bb:$imm12)>; +// Match X > -1, the canonical form of X >= 0, to the bgez pattern. +def : Pat<(brcond (XLenVT (setgt GPR:$rs1, -1)), bb:$imm12), + (BGE GPR:$rs1, X0, bb:$imm12)>; + let isBarrier = 1, isBranch = 1, isTerminator = 1 in def PseudoBR : Pseudo<(outs), (ins simm21_lsb0_jal:$imm20), [(br bb:$imm20)]>, PseudoInstExpansion<(JAL X0, simm21_lsb0_jal:$imm20)>; diff --git a/llvm/test/CodeGen/RISCV/branch.ll b/llvm/test/CodeGen/RISCV/branch.ll --- a/llvm/test/CodeGen/RISCV/branch.ll +++ b/llvm/test/CodeGen/RISCV/branch.ll @@ -40,8 +40,7 @@ ; RV32I-NEXT: bnez a0, .LBB0_13 ; RV32I-NEXT: # %bb.11: # %test12 ; RV32I-NEXT: lw a0, 0(a1) -; RV32I-NEXT: addi a2, zero, -1 -; RV32I-NEXT: blt a2, a0, .LBB0_13 +; RV32I-NEXT: bgez a0, .LBB0_13 ; RV32I-NEXT: # %bb.12: # %test13 ; RV32I-NEXT: lw a0, 0(a1) ; RV32I-NEXT: .LBB0_13: # %end diff --git a/llvm/test/CodeGen/RISCV/xaluo.ll b/llvm/test/CodeGen/RISCV/xaluo.ll --- a/llvm/test/CodeGen/RISCV/xaluo.ll +++ b/llvm/test/CodeGen/RISCV/xaluo.ll @@ -1538,8 +1538,7 @@ ; RV32-NEXT: xor a1, a1, a3 ; RV32-NEXT: not a1, a1 ; RV32-NEXT: and a0, a1, a0 -; RV32-NEXT: addi a1, zero, -1 -; RV32-NEXT: blt a1, a0, .LBB47_2 +; RV32-NEXT: bgez a0, .LBB47_2 ; RV32-NEXT: # %bb.1: # %overflow ; RV32-NEXT: mv a0, zero ; RV32-NEXT: ret @@ -1706,8 +1705,7 @@ ; RV32-NEXT: xor a0, a1, a0 ; RV32-NEXT: xor a1, a1, a3 ; RV32-NEXT: and a0, a1, a0 -; RV32-NEXT: addi a1, zero, -1 -; RV32-NEXT: blt a1, a0, .LBB51_2 +; RV32-NEXT: bgez a0, .LBB51_2 ; RV32-NEXT: # %bb.1: # %overflow ; RV32-NEXT: mv a0, zero ; RV32-NEXT: ret