diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -1814,6 +1814,26 @@ if (auto GORC = combineORToGORC(SDValue(N, 0), DCI.DAG, Subtarget)) return GORC; break; + case RISCVISD::SELECT_CC: { + // Transform + // (select_cc (xor X, 1), 0, setne, trueV, falseV) -> + // (select_cc X, 0, seteq, trueV, falseV) if we can prove X is 0/1. + // This can occur when legalizing some floating point comparisons. + SDValue LHS = N->getOperand(0); + SDValue RHS = N->getOperand(1); + APInt Mask = APInt::getBitsSetFrom(LHS.getValueSizeInBits(), 1); + if (N->getConstantOperandVal(2) == ISD::SETNE && isNullConstant(RHS) && + LHS.getOpcode() == ISD::XOR && LHS.hasOneUse() && + isOneConstant(LHS.getOperand(1)) && + DAG.MaskedValueIsZero(LHS.getOperand(0), Mask)) { + SDLoc DL(N); + SDValue SetEQ = DAG.getConstant(ISD::SETEQ, DL, Subtarget.getXLenVT()); + return DAG.getNode( + RISCVISD::SELECT_CC, DL, N->getValueType(0), + {LHS.getOperand(0), RHS, SetEQ, N->getOperand(3), N->getOperand(4)}); + } + break; + } } return SDValue(); diff --git a/llvm/test/CodeGen/RISCV/double-select-fcmp.ll b/llvm/test/CodeGen/RISCV/double-select-fcmp.ll --- a/llvm/test/CodeGen/RISCV/double-select-fcmp.ll +++ b/llvm/test/CodeGen/RISCV/double-select-fcmp.ll @@ -300,8 +300,7 @@ ; RV32IFD-NEXT: flt.d a0, ft1, ft0 ; RV32IFD-NEXT: flt.d a1, ft0, ft1 ; RV32IFD-NEXT: or a0, a1, a0 -; RV32IFD-NEXT: xori a0, a0, 1 -; RV32IFD-NEXT: bnez a0, .LBB8_2 +; RV32IFD-NEXT: beqz a0, .LBB8_2 ; RV32IFD-NEXT: # %bb.1: ; RV32IFD-NEXT: fmv.d ft1, ft0 ; RV32IFD-NEXT: .LBB8_2: @@ -318,8 +317,7 @@ ; RV64IFD-NEXT: flt.d a0, ft0, ft1 ; RV64IFD-NEXT: flt.d a1, ft1, ft0 ; RV64IFD-NEXT: or a0, a1, a0 -; RV64IFD-NEXT: xori a0, a0, 1 -; RV64IFD-NEXT: bnez a0, .LBB8_2 +; RV64IFD-NEXT: beqz a0, .LBB8_2 ; RV64IFD-NEXT: # %bb.1: ; RV64IFD-NEXT: fmv.d ft0, ft1 ; RV64IFD-NEXT: .LBB8_2: @@ -341,8 +339,7 @@ ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) ; RV32IFD-NEXT: fle.d a0, ft1, ft0 -; RV32IFD-NEXT: xori a0, a0, 1 -; RV32IFD-NEXT: bnez a0, .LBB9_2 +; RV32IFD-NEXT: beqz a0, .LBB9_2 ; RV32IFD-NEXT: # %bb.1: ; RV32IFD-NEXT: fmv.d ft1, ft0 ; RV32IFD-NEXT: .LBB9_2: @@ -357,8 +354,7 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: fmv.d.x ft0, a0 ; RV64IFD-NEXT: fle.d a0, ft0, ft1 -; RV64IFD-NEXT: xori a0, a0, 1 -; RV64IFD-NEXT: bnez a0, .LBB9_2 +; RV64IFD-NEXT: beqz a0, .LBB9_2 ; RV64IFD-NEXT: # %bb.1: ; RV64IFD-NEXT: fmv.d ft0, ft1 ; RV64IFD-NEXT: .LBB9_2: @@ -380,8 +376,7 @@ ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) ; RV32IFD-NEXT: flt.d a0, ft1, ft0 -; RV32IFD-NEXT: xori a0, a0, 1 -; RV32IFD-NEXT: bnez a0, .LBB10_2 +; RV32IFD-NEXT: beqz a0, .LBB10_2 ; RV32IFD-NEXT: # %bb.1: ; RV32IFD-NEXT: fmv.d ft1, ft0 ; RV32IFD-NEXT: .LBB10_2: @@ -396,8 +391,7 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: fmv.d.x ft0, a0 ; RV64IFD-NEXT: flt.d a0, ft0, ft1 -; RV64IFD-NEXT: xori a0, a0, 1 -; RV64IFD-NEXT: bnez a0, .LBB10_2 +; RV64IFD-NEXT: beqz a0, .LBB10_2 ; RV64IFD-NEXT: # %bb.1: ; RV64IFD-NEXT: fmv.d ft0, ft1 ; RV64IFD-NEXT: .LBB10_2: @@ -419,8 +413,7 @@ ; RV32IFD-NEXT: sw a3, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) ; RV32IFD-NEXT: fle.d a0, ft1, ft0 -; RV32IFD-NEXT: xori a0, a0, 1 -; RV32IFD-NEXT: bnez a0, .LBB11_2 +; RV32IFD-NEXT: beqz a0, .LBB11_2 ; RV32IFD-NEXT: # %bb.1: ; RV32IFD-NEXT: fmv.d ft0, ft1 ; RV32IFD-NEXT: .LBB11_2: @@ -435,8 +428,7 @@ ; RV64IFD-NEXT: fmv.d.x ft0, a0 ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: fle.d a0, ft1, ft0 -; RV64IFD-NEXT: xori a0, a0, 1 -; RV64IFD-NEXT: bnez a0, .LBB11_2 +; RV64IFD-NEXT: beqz a0, .LBB11_2 ; RV64IFD-NEXT: # %bb.1: ; RV64IFD-NEXT: fmv.d ft0, ft1 ; RV64IFD-NEXT: .LBB11_2: @@ -458,8 +450,7 @@ ; RV32IFD-NEXT: sw a3, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) ; RV32IFD-NEXT: flt.d a0, ft1, ft0 -; RV32IFD-NEXT: xori a0, a0, 1 -; RV32IFD-NEXT: bnez a0, .LBB12_2 +; RV32IFD-NEXT: beqz a0, .LBB12_2 ; RV32IFD-NEXT: # %bb.1: ; RV32IFD-NEXT: fmv.d ft0, ft1 ; RV32IFD-NEXT: .LBB12_2: @@ -474,8 +465,7 @@ ; RV64IFD-NEXT: fmv.d.x ft0, a0 ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: flt.d a0, ft1, ft0 -; RV64IFD-NEXT: xori a0, a0, 1 -; RV64IFD-NEXT: bnez a0, .LBB12_2 +; RV64IFD-NEXT: beqz a0, .LBB12_2 ; RV64IFD-NEXT: # %bb.1: ; RV64IFD-NEXT: fmv.d ft0, ft1 ; RV64IFD-NEXT: .LBB12_2: @@ -497,8 +487,7 @@ ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) ; RV32IFD-NEXT: feq.d a0, ft1, ft0 -; RV32IFD-NEXT: xori a0, a0, 1 -; RV32IFD-NEXT: bnez a0, .LBB13_2 +; RV32IFD-NEXT: beqz a0, .LBB13_2 ; RV32IFD-NEXT: # %bb.1: ; RV32IFD-NEXT: fmv.d ft1, ft0 ; RV32IFD-NEXT: .LBB13_2: @@ -513,8 +502,7 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: fmv.d.x ft0, a0 ; RV64IFD-NEXT: feq.d a0, ft0, ft1 -; RV64IFD-NEXT: xori a0, a0, 1 -; RV64IFD-NEXT: bnez a0, .LBB13_2 +; RV64IFD-NEXT: beqz a0, .LBB13_2 ; RV64IFD-NEXT: # %bb.1: ; RV64IFD-NEXT: fmv.d ft0, ft1 ; RV64IFD-NEXT: .LBB13_2: @@ -526,7 +514,6 @@ } define double @select_fcmp_uno(double %a, double %b) nounwind { -; TODO: sltiu+bne could be optimized ; RV32IFD-LABEL: select_fcmp_uno: ; RV32IFD: # %bb.0: ; RV32IFD-NEXT: addi sp, sp, -16 @@ -539,8 +526,7 @@ ; RV32IFD-NEXT: feq.d a0, ft1, ft1 ; RV32IFD-NEXT: feq.d a1, ft0, ft0 ; RV32IFD-NEXT: and a0, a1, a0 -; RV32IFD-NEXT: xori a0, a0, 1 -; RV32IFD-NEXT: bnez a0, .LBB14_2 +; RV32IFD-NEXT: beqz a0, .LBB14_2 ; RV32IFD-NEXT: # %bb.1: ; RV32IFD-NEXT: fmv.d ft0, ft1 ; RV32IFD-NEXT: .LBB14_2: @@ -557,8 +543,7 @@ ; RV64IFD-NEXT: feq.d a0, ft1, ft1 ; RV64IFD-NEXT: feq.d a1, ft0, ft0 ; RV64IFD-NEXT: and a0, a1, a0 -; RV64IFD-NEXT: xori a0, a0, 1 -; RV64IFD-NEXT: bnez a0, .LBB14_2 +; RV64IFD-NEXT: beqz a0, .LBB14_2 ; RV64IFD-NEXT: # %bb.1: ; RV64IFD-NEXT: fmv.d ft0, ft1 ; RV64IFD-NEXT: .LBB14_2: diff --git a/llvm/test/CodeGen/RISCV/float-select-fcmp.ll b/llvm/test/CodeGen/RISCV/float-select-fcmp.ll --- a/llvm/test/CodeGen/RISCV/float-select-fcmp.ll +++ b/llvm/test/CodeGen/RISCV/float-select-fcmp.ll @@ -238,8 +238,7 @@ ; RV32IF-NEXT: flt.s a0, ft0, ft1 ; RV32IF-NEXT: flt.s a1, ft1, ft0 ; RV32IF-NEXT: or a0, a1, a0 -; RV32IF-NEXT: xori a0, a0, 1 -; RV32IF-NEXT: bnez a0, .LBB8_2 +; RV32IF-NEXT: beqz a0, .LBB8_2 ; RV32IF-NEXT: # %bb.1: ; RV32IF-NEXT: fmv.s ft0, ft1 ; RV32IF-NEXT: .LBB8_2: @@ -253,8 +252,7 @@ ; RV64IF-NEXT: flt.s a0, ft0, ft1 ; RV64IF-NEXT: flt.s a1, ft1, ft0 ; RV64IF-NEXT: or a0, a1, a0 -; RV64IF-NEXT: xori a0, a0, 1 -; RV64IF-NEXT: bnez a0, .LBB8_2 +; RV64IF-NEXT: beqz a0, .LBB8_2 ; RV64IF-NEXT: # %bb.1: ; RV64IF-NEXT: fmv.s ft0, ft1 ; RV64IF-NEXT: .LBB8_2: @@ -271,8 +269,7 @@ ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: fmv.w.x ft0, a0 ; RV32IF-NEXT: fle.s a0, ft0, ft1 -; RV32IF-NEXT: xori a0, a0, 1 -; RV32IF-NEXT: bnez a0, .LBB9_2 +; RV32IF-NEXT: beqz a0, .LBB9_2 ; RV32IF-NEXT: # %bb.1: ; RV32IF-NEXT: fmv.s ft0, ft1 ; RV32IF-NEXT: .LBB9_2: @@ -284,8 +281,7 @@ ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: fmv.w.x ft0, a0 ; RV64IF-NEXT: fle.s a0, ft0, ft1 -; RV64IF-NEXT: xori a0, a0, 1 -; RV64IF-NEXT: bnez a0, .LBB9_2 +; RV64IF-NEXT: beqz a0, .LBB9_2 ; RV64IF-NEXT: # %bb.1: ; RV64IF-NEXT: fmv.s ft0, ft1 ; RV64IF-NEXT: .LBB9_2: @@ -302,8 +298,7 @@ ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: fmv.w.x ft0, a0 ; RV32IF-NEXT: flt.s a0, ft0, ft1 -; RV32IF-NEXT: xori a0, a0, 1 -; RV32IF-NEXT: bnez a0, .LBB10_2 +; RV32IF-NEXT: beqz a0, .LBB10_2 ; RV32IF-NEXT: # %bb.1: ; RV32IF-NEXT: fmv.s ft0, ft1 ; RV32IF-NEXT: .LBB10_2: @@ -315,8 +310,7 @@ ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: fmv.w.x ft0, a0 ; RV64IF-NEXT: flt.s a0, ft0, ft1 -; RV64IF-NEXT: xori a0, a0, 1 -; RV64IF-NEXT: bnez a0, .LBB10_2 +; RV64IF-NEXT: beqz a0, .LBB10_2 ; RV64IF-NEXT: # %bb.1: ; RV64IF-NEXT: fmv.s ft0, ft1 ; RV64IF-NEXT: .LBB10_2: @@ -333,8 +327,7 @@ ; RV32IF-NEXT: fmv.w.x ft0, a0 ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: fle.s a0, ft1, ft0 -; RV32IF-NEXT: xori a0, a0, 1 -; RV32IF-NEXT: bnez a0, .LBB11_2 +; RV32IF-NEXT: beqz a0, .LBB11_2 ; RV32IF-NEXT: # %bb.1: ; RV32IF-NEXT: fmv.s ft0, ft1 ; RV32IF-NEXT: .LBB11_2: @@ -346,8 +339,7 @@ ; RV64IF-NEXT: fmv.w.x ft0, a0 ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: fle.s a0, ft1, ft0 -; RV64IF-NEXT: xori a0, a0, 1 -; RV64IF-NEXT: bnez a0, .LBB11_2 +; RV64IF-NEXT: beqz a0, .LBB11_2 ; RV64IF-NEXT: # %bb.1: ; RV64IF-NEXT: fmv.s ft0, ft1 ; RV64IF-NEXT: .LBB11_2: @@ -364,8 +356,7 @@ ; RV32IF-NEXT: fmv.w.x ft0, a0 ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: flt.s a0, ft1, ft0 -; RV32IF-NEXT: xori a0, a0, 1 -; RV32IF-NEXT: bnez a0, .LBB12_2 +; RV32IF-NEXT: beqz a0, .LBB12_2 ; RV32IF-NEXT: # %bb.1: ; RV32IF-NEXT: fmv.s ft0, ft1 ; RV32IF-NEXT: .LBB12_2: @@ -377,8 +368,7 @@ ; RV64IF-NEXT: fmv.w.x ft0, a0 ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: flt.s a0, ft1, ft0 -; RV64IF-NEXT: xori a0, a0, 1 -; RV64IF-NEXT: bnez a0, .LBB12_2 +; RV64IF-NEXT: beqz a0, .LBB12_2 ; RV64IF-NEXT: # %bb.1: ; RV64IF-NEXT: fmv.s ft0, ft1 ; RV64IF-NEXT: .LBB12_2: @@ -395,8 +385,7 @@ ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: fmv.w.x ft0, a0 ; RV32IF-NEXT: feq.s a0, ft0, ft1 -; RV32IF-NEXT: xori a0, a0, 1 -; RV32IF-NEXT: bnez a0, .LBB13_2 +; RV32IF-NEXT: beqz a0, .LBB13_2 ; RV32IF-NEXT: # %bb.1: ; RV32IF-NEXT: fmv.s ft0, ft1 ; RV32IF-NEXT: .LBB13_2: @@ -408,8 +397,7 @@ ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: fmv.w.x ft0, a0 ; RV64IF-NEXT: feq.s a0, ft0, ft1 -; RV64IF-NEXT: xori a0, a0, 1 -; RV64IF-NEXT: bnez a0, .LBB13_2 +; RV64IF-NEXT: beqz a0, .LBB13_2 ; RV64IF-NEXT: # %bb.1: ; RV64IF-NEXT: fmv.s ft0, ft1 ; RV64IF-NEXT: .LBB13_2: @@ -421,7 +409,6 @@ } define float @select_fcmp_uno(float %a, float %b) nounwind { -; TODO: sltiu+bne could be optimized ; RV32IF-LABEL: select_fcmp_uno: ; RV32IF: # %bb.0: ; RV32IF-NEXT: fmv.w.x ft0, a0 @@ -429,8 +416,7 @@ ; RV32IF-NEXT: feq.s a0, ft1, ft1 ; RV32IF-NEXT: feq.s a1, ft0, ft0 ; RV32IF-NEXT: and a0, a1, a0 -; RV32IF-NEXT: xori a0, a0, 1 -; RV32IF-NEXT: bnez a0, .LBB14_2 +; RV32IF-NEXT: beqz a0, .LBB14_2 ; RV32IF-NEXT: # %bb.1: ; RV32IF-NEXT: fmv.s ft0, ft1 ; RV32IF-NEXT: .LBB14_2: @@ -444,8 +430,7 @@ ; RV64IF-NEXT: feq.s a0, ft1, ft1 ; RV64IF-NEXT: feq.s a1, ft0, ft0 ; RV64IF-NEXT: and a0, a1, a0 -; RV64IF-NEXT: xori a0, a0, 1 -; RV64IF-NEXT: bnez a0, .LBB14_2 +; RV64IF-NEXT: beqz a0, .LBB14_2 ; RV64IF-NEXT: # %bb.1: ; RV64IF-NEXT: fmv.s ft0, ft1 ; RV64IF-NEXT: .LBB14_2: diff --git a/llvm/test/CodeGen/RISCV/half-select-fcmp.ll b/llvm/test/CodeGen/RISCV/half-select-fcmp.ll --- a/llvm/test/CodeGen/RISCV/half-select-fcmp.ll +++ b/llvm/test/CodeGen/RISCV/half-select-fcmp.ll @@ -194,8 +194,7 @@ ; RV32IZFH-NEXT: flt.h a0, fa0, fa1 ; RV32IZFH-NEXT: flt.h a1, fa1, fa0 ; RV32IZFH-NEXT: or a0, a1, a0 -; RV32IZFH-NEXT: xori a0, a0, 1 -; RV32IZFH-NEXT: bnez a0, .LBB8_2 +; RV32IZFH-NEXT: beqz a0, .LBB8_2 ; RV32IZFH-NEXT: # %bb.1: ; RV32IZFH-NEXT: fmv.h fa0, fa1 ; RV32IZFH-NEXT: .LBB8_2: @@ -206,8 +205,7 @@ ; RV64IZFH-NEXT: flt.h a0, fa0, fa1 ; RV64IZFH-NEXT: flt.h a1, fa1, fa0 ; RV64IZFH-NEXT: or a0, a1, a0 -; RV64IZFH-NEXT: xori a0, a0, 1 -; RV64IZFH-NEXT: bnez a0, .LBB8_2 +; RV64IZFH-NEXT: beqz a0, .LBB8_2 ; RV64IZFH-NEXT: # %bb.1: ; RV64IZFH-NEXT: fmv.h fa0, fa1 ; RV64IZFH-NEXT: .LBB8_2: @@ -221,8 +219,7 @@ ; RV32IZFH-LABEL: select_fcmp_ugt: ; RV32IZFH: # %bb.0: ; RV32IZFH-NEXT: fle.h a0, fa0, fa1 -; RV32IZFH-NEXT: xori a0, a0, 1 -; RV32IZFH-NEXT: bnez a0, .LBB9_2 +; RV32IZFH-NEXT: beqz a0, .LBB9_2 ; RV32IZFH-NEXT: # %bb.1: ; RV32IZFH-NEXT: fmv.h fa0, fa1 ; RV32IZFH-NEXT: .LBB9_2: @@ -231,8 +228,7 @@ ; RV64IZFH-LABEL: select_fcmp_ugt: ; RV64IZFH: # %bb.0: ; RV64IZFH-NEXT: fle.h a0, fa0, fa1 -; RV64IZFH-NEXT: xori a0, a0, 1 -; RV64IZFH-NEXT: bnez a0, .LBB9_2 +; RV64IZFH-NEXT: beqz a0, .LBB9_2 ; RV64IZFH-NEXT: # %bb.1: ; RV64IZFH-NEXT: fmv.h fa0, fa1 ; RV64IZFH-NEXT: .LBB9_2: @@ -246,8 +242,7 @@ ; RV32IZFH-LABEL: select_fcmp_uge: ; RV32IZFH: # %bb.0: ; RV32IZFH-NEXT: flt.h a0, fa0, fa1 -; RV32IZFH-NEXT: xori a0, a0, 1 -; RV32IZFH-NEXT: bnez a0, .LBB10_2 +; RV32IZFH-NEXT: beqz a0, .LBB10_2 ; RV32IZFH-NEXT: # %bb.1: ; RV32IZFH-NEXT: fmv.h fa0, fa1 ; RV32IZFH-NEXT: .LBB10_2: @@ -256,8 +251,7 @@ ; RV64IZFH-LABEL: select_fcmp_uge: ; RV64IZFH: # %bb.0: ; RV64IZFH-NEXT: flt.h a0, fa0, fa1 -; RV64IZFH-NEXT: xori a0, a0, 1 -; RV64IZFH-NEXT: bnez a0, .LBB10_2 +; RV64IZFH-NEXT: beqz a0, .LBB10_2 ; RV64IZFH-NEXT: # %bb.1: ; RV64IZFH-NEXT: fmv.h fa0, fa1 ; RV64IZFH-NEXT: .LBB10_2: @@ -271,8 +265,7 @@ ; RV32IZFH-LABEL: select_fcmp_ult: ; RV32IZFH: # %bb.0: ; RV32IZFH-NEXT: fle.h a0, fa1, fa0 -; RV32IZFH-NEXT: xori a0, a0, 1 -; RV32IZFH-NEXT: bnez a0, .LBB11_2 +; RV32IZFH-NEXT: beqz a0, .LBB11_2 ; RV32IZFH-NEXT: # %bb.1: ; RV32IZFH-NEXT: fmv.h fa0, fa1 ; RV32IZFH-NEXT: .LBB11_2: @@ -281,8 +274,7 @@ ; RV64IZFH-LABEL: select_fcmp_ult: ; RV64IZFH: # %bb.0: ; RV64IZFH-NEXT: fle.h a0, fa1, fa0 -; RV64IZFH-NEXT: xori a0, a0, 1 -; RV64IZFH-NEXT: bnez a0, .LBB11_2 +; RV64IZFH-NEXT: beqz a0, .LBB11_2 ; RV64IZFH-NEXT: # %bb.1: ; RV64IZFH-NEXT: fmv.h fa0, fa1 ; RV64IZFH-NEXT: .LBB11_2: @@ -296,8 +288,7 @@ ; RV32IZFH-LABEL: select_fcmp_ule: ; RV32IZFH: # %bb.0: ; RV32IZFH-NEXT: flt.h a0, fa1, fa0 -; RV32IZFH-NEXT: xori a0, a0, 1 -; RV32IZFH-NEXT: bnez a0, .LBB12_2 +; RV32IZFH-NEXT: beqz a0, .LBB12_2 ; RV32IZFH-NEXT: # %bb.1: ; RV32IZFH-NEXT: fmv.h fa0, fa1 ; RV32IZFH-NEXT: .LBB12_2: @@ -306,8 +297,7 @@ ; RV64IZFH-LABEL: select_fcmp_ule: ; RV64IZFH: # %bb.0: ; RV64IZFH-NEXT: flt.h a0, fa1, fa0 -; RV64IZFH-NEXT: xori a0, a0, 1 -; RV64IZFH-NEXT: bnez a0, .LBB12_2 +; RV64IZFH-NEXT: beqz a0, .LBB12_2 ; RV64IZFH-NEXT: # %bb.1: ; RV64IZFH-NEXT: fmv.h fa0, fa1 ; RV64IZFH-NEXT: .LBB12_2: @@ -321,8 +311,7 @@ ; RV32IZFH-LABEL: select_fcmp_une: ; RV32IZFH: # %bb.0: ; RV32IZFH-NEXT: feq.h a0, fa0, fa1 -; RV32IZFH-NEXT: xori a0, a0, 1 -; RV32IZFH-NEXT: bnez a0, .LBB13_2 +; RV32IZFH-NEXT: beqz a0, .LBB13_2 ; RV32IZFH-NEXT: # %bb.1: ; RV32IZFH-NEXT: fmv.h fa0, fa1 ; RV32IZFH-NEXT: .LBB13_2: @@ -331,8 +320,7 @@ ; RV64IZFH-LABEL: select_fcmp_une: ; RV64IZFH: # %bb.0: ; RV64IZFH-NEXT: feq.h a0, fa0, fa1 -; RV64IZFH-NEXT: xori a0, a0, 1 -; RV64IZFH-NEXT: bnez a0, .LBB13_2 +; RV64IZFH-NEXT: beqz a0, .LBB13_2 ; RV64IZFH-NEXT: # %bb.1: ; RV64IZFH-NEXT: fmv.h fa0, fa1 ; RV64IZFH-NEXT: .LBB13_2: @@ -343,14 +331,12 @@ } define half @select_fcmp_uno(half %a, half %b) nounwind { -; TODO: sltiu+bne could be optimized ; RV32IZFH-LABEL: select_fcmp_uno: ; RV32IZFH: # %bb.0: ; RV32IZFH-NEXT: feq.h a0, fa1, fa1 ; RV32IZFH-NEXT: feq.h a1, fa0, fa0 ; RV32IZFH-NEXT: and a0, a1, a0 -; RV32IZFH-NEXT: xori a0, a0, 1 -; RV32IZFH-NEXT: bnez a0, .LBB14_2 +; RV32IZFH-NEXT: beqz a0, .LBB14_2 ; RV32IZFH-NEXT: # %bb.1: ; RV32IZFH-NEXT: fmv.h fa0, fa1 ; RV32IZFH-NEXT: .LBB14_2: @@ -361,8 +347,7 @@ ; RV64IZFH-NEXT: feq.h a0, fa1, fa1 ; RV64IZFH-NEXT: feq.h a1, fa0, fa0 ; RV64IZFH-NEXT: and a0, a1, a0 -; RV64IZFH-NEXT: xori a0, a0, 1 -; RV64IZFH-NEXT: bnez a0, .LBB14_2 +; RV64IZFH-NEXT: beqz a0, .LBB14_2 ; RV64IZFH-NEXT: # %bb.1: ; RV64IZFH-NEXT: fmv.h fa0, fa1 ; RV64IZFH-NEXT: .LBB14_2: