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 @@ -992,6 +992,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