diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td @@ -306,11 +306,15 @@ def : Pat<(seto FPR64:$rs1, FPR64:$rs2), (AND (FEQ_D FPR64:$rs1, FPR64:$rs1), (FEQ_D FPR64:$rs2, FPR64:$rs2))>; +def : Pat<(seto FPR64:$rs1, FPR64:$rs1), + (FEQ_D $rs1, $rs1)>; def : Pat<(setuo FPR64:$rs1, FPR64:$rs2), (SLTIU (AND (FEQ_D FPR64:$rs1, FPR64:$rs1), (FEQ_D FPR64:$rs2, FPR64:$rs2)), 1)>; +def : Pat<(setuo FPR64:$rs1, FPR64:$rs1), + (SLTIU (FEQ_D $rs1, $rs1), 1)>; def Select_FPR64_Using_CC_GPR : SelectCC_rrirr; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td @@ -366,11 +366,15 @@ def : Pat<(seto FPR32:$rs1, FPR32:$rs2), (AND (FEQ_S FPR32:$rs1, FPR32:$rs1), (FEQ_S FPR32:$rs2, FPR32:$rs2))>; +def : Pat<(seto FPR32:$rs1, FPR32:$rs1), + (FEQ_S $rs1, $rs1)>; def : Pat<(setuo FPR32:$rs1, FPR32:$rs2), (SLTIU (AND (FEQ_S FPR32:$rs1, FPR32:$rs1), (FEQ_S FPR32:$rs2, FPR32:$rs2)), 1)>; +def : Pat<(setuo FPR32:$rs1, FPR32:$rs1), + (SLTIU (FEQ_S $rs1, $rs1), 1)>; def Select_FPR32_Using_CC_GPR : SelectCC_rrirr; diff --git a/llvm/test/CodeGen/RISCV/double-isnan.ll b/llvm/test/CodeGen/RISCV/double-isnan.ll --- a/llvm/test/CodeGen/RISCV/double-isnan.ll +++ b/llvm/test/CodeGen/RISCV/double-isnan.ll @@ -8,14 +8,12 @@ ; RV32IFD-LABEL: double_is_nan: ; RV32IFD: # %bb.0: ; RV32IFD-NEXT: feq.d a0, fa0, fa0 -; RV32IFD-NEXT: and a0, a0, a0 ; RV32IFD-NEXT: seqz a0, a0 ; RV32IFD-NEXT: ret ; ; RV64IFD-LABEL: double_is_nan: ; RV64IFD: # %bb.0: ; RV64IFD-NEXT: feq.d a0, fa0, fa0 -; RV64IFD-NEXT: and a0, a0, a0 ; RV64IFD-NEXT: seqz a0, a0 ; RV64IFD-NEXT: ret %1 = fcmp uno double %a, 0.000000e+00 @@ -26,13 +24,11 @@ ; RV32IFD-LABEL: double_not_nan: ; RV32IFD: # %bb.0: ; RV32IFD-NEXT: feq.d a0, fa0, fa0 -; RV32IFD-NEXT: and a0, a0, a0 ; RV32IFD-NEXT: ret ; ; RV64IFD-LABEL: double_not_nan: ; RV64IFD: # %bb.0: ; RV64IFD-NEXT: feq.d a0, fa0, fa0 -; RV64IFD-NEXT: and a0, a0, a0 ; RV64IFD-NEXT: ret %1 = fcmp ord double %a, 0.000000e+00 ret i1 %1 diff --git a/llvm/test/CodeGen/RISCV/float-isnan.ll b/llvm/test/CodeGen/RISCV/float-isnan.ll --- a/llvm/test/CodeGen/RISCV/float-isnan.ll +++ b/llvm/test/CodeGen/RISCV/float-isnan.ll @@ -8,14 +8,12 @@ ; RV32IF-LABEL: float_is_nan: ; RV32IF: # %bb.0: ; RV32IF-NEXT: feq.s a0, fa0, fa0 -; RV32IF-NEXT: and a0, a0, a0 ; RV32IF-NEXT: seqz a0, a0 ; RV32IF-NEXT: ret ; ; RV64IF-LABEL: float_is_nan: ; RV64IF: # %bb.0: ; RV64IF-NEXT: feq.s a0, fa0, fa0 -; RV64IF-NEXT: and a0, a0, a0 ; RV64IF-NEXT: seqz a0, a0 ; RV64IF-NEXT: ret %1 = fcmp uno float %a, 0.000000e+00 @@ -26,13 +24,11 @@ ; RV32IF-LABEL: float_not_nan: ; RV32IF: # %bb.0: ; RV32IF-NEXT: feq.s a0, fa0, fa0 -; RV32IF-NEXT: and a0, a0, a0 ; RV32IF-NEXT: ret ; ; RV64IF-LABEL: float_not_nan: ; RV64IF: # %bb.0: ; RV64IF-NEXT: feq.s a0, fa0, fa0 -; RV64IF-NEXT: and a0, a0, a0 ; RV64IF-NEXT: ret %1 = fcmp ord float %a, 0.000000e+00 ret i1 %1