From: Luis Marques Date: Mon, 1 Apr 2019 09:54:14 +0000 (+0000) Subject: [RISCV] Add seto pattern expansion X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6bc72be0f5a095478f0f01049fbaae548fe68f02;p=llvm [RISCV] Add seto pattern expansion Adds a `seto` pattern expansion. Without it the lowerings of `fcmp one` and `fcmp ord` would be inefficient due to an unoptimized double negation. Differential Revision: https://reviews.llvm.org/D59699 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357378 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/RISCV/RISCVISelLowering.cpp b/lib/Target/RISCV/RISCVISelLowering.cpp index a41a87a10a5..63117bafbb3 100644 --- a/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/lib/Target/RISCV/RISCVISelLowering.cpp @@ -137,9 +137,9 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM, setOperationAction(ISD::CTPOP, XLenVT, Expand); ISD::CondCode FPCCToExtend[] = { - ISD::SETOGT, ISD::SETOGE, ISD::SETONE, ISD::SETO, ISD::SETUEQ, - ISD::SETUGT, ISD::SETUGE, ISD::SETULT, ISD::SETULE, ISD::SETUNE, - ISD::SETGT, ISD::SETGE, ISD::SETNE}; + ISD::SETOGT, ISD::SETOGE, ISD::SETONE, ISD::SETUEQ, ISD::SETUGT, + ISD::SETUGE, ISD::SETULT, ISD::SETULE, ISD::SETUNE, ISD::SETGT, + ISD::SETGE, ISD::SETNE}; ISD::NodeType FPOpToExtend[] = { ISD::FSIN, ISD::FCOS, ISD::FSINCOS, ISD::FPOW, ISD::FREM}; diff --git a/lib/Target/RISCV/RISCVInstrInfoD.td b/lib/Target/RISCV/RISCVInstrInfoD.td index fdb9a41ec60..fe38c4ff02d 100644 --- a/lib/Target/RISCV/RISCVInstrInfoD.td +++ b/lib/Target/RISCV/RISCVInstrInfoD.td @@ -270,6 +270,10 @@ def : PatFpr64Fpr64; // handled by a RISC-V instruction and aren't expanded in the SelectionDAG // Legalizer. +def : Pat<(seto FPR64:$rs1, FPR64:$rs2), + (AND (FEQ_D FPR64:$rs1, FPR64:$rs1), + (FEQ_D FPR64:$rs2, FPR64:$rs2))>; + def : Pat<(setuo FPR64:$rs1, FPR64:$rs2), (SLTIU (AND (FEQ_D FPR64:$rs1, FPR64:$rs1), (FEQ_D FPR64:$rs2, FPR64:$rs2)), diff --git a/lib/Target/RISCV/RISCVInstrInfoF.td b/lib/Target/RISCV/RISCVInstrInfoF.td index 17ba146730a..7c957a9bbe5 100644 --- a/lib/Target/RISCV/RISCVInstrInfoF.td +++ b/lib/Target/RISCV/RISCVInstrInfoF.td @@ -324,6 +324,10 @@ def : PatFpr32Fpr32; // handled by a RISC-V instruction and aren't expanded in the SelectionDAG // Legalizer. +def : Pat<(seto FPR32:$rs1, FPR32:$rs2), + (AND (FEQ_S FPR32:$rs1, FPR32:$rs1), + (FEQ_S FPR32:$rs2, FPR32:$rs2))>; + def : Pat<(setuo FPR32:$rs1, FPR32:$rs2), (SLTIU (AND (FEQ_S FPR32:$rs1, FPR32:$rs1), (FEQ_S FPR32:$rs2, FPR32:$rs2)), diff --git a/test/CodeGen/RISCV/double-br-fcmp.ll b/test/CodeGen/RISCV/double-br-fcmp.ll index 275c4aa0554..1c8b867bd41 100644 --- a/test/CodeGen/RISCV/double-br-fcmp.ll +++ b/test/CodeGen/RISCV/double-br-fcmp.ll @@ -322,8 +322,6 @@ define void @br_fcmp_one(double %a, double %b) nounwind { ; RV32IFD-NEXT: and a0, a1, a0 ; RV32IFD-NEXT: feq.d a1, ft0, ft1 ; RV32IFD-NEXT: not a1, a1 -; RV32IFD-NEXT: seqz a0, a0 -; RV32IFD-NEXT: xori a0, a0, 1 ; RV32IFD-NEXT: and a0, a1, a0 ; RV32IFD-NEXT: bnez a0, .LBB7_2 ; RV32IFD-NEXT: # %bb.1: # %if.else @@ -344,8 +342,6 @@ define void @br_fcmp_one(double %a, double %b) nounwind { ; RV64IFD-NEXT: and a0, a1, a0 ; RV64IFD-NEXT: feq.d a1, ft0, ft1 ; RV64IFD-NEXT: not a1, a1 -; RV64IFD-NEXT: seqz a0, a0 -; RV64IFD-NEXT: xori a0, a0, 1 ; RV64IFD-NEXT: and a0, a1, a0 ; RV64IFD-NEXT: bnez a0, .LBB7_2 ; RV64IFD-NEXT: # %bb.1: # %if.else @@ -377,8 +373,6 @@ define void @br_fcmp_ord(double %a, double %b) nounwind { ; RV32IFD-NEXT: feq.d a0, ft1, ft1 ; RV32IFD-NEXT: feq.d a1, ft0, ft0 ; RV32IFD-NEXT: and a0, a1, a0 -; RV32IFD-NEXT: seqz a0, a0 -; RV32IFD-NEXT: xori a0, a0, 1 ; RV32IFD-NEXT: bnez a0, .LBB8_2 ; RV32IFD-NEXT: # %bb.1: # %if.else ; RV32IFD-NEXT: lw ra, 12(sp) @@ -396,8 +390,6 @@ define void @br_fcmp_ord(double %a, double %b) nounwind { ; RV64IFD-NEXT: fmv.d.x ft0, a0 ; RV64IFD-NEXT: feq.d a0, ft0, ft0 ; RV64IFD-NEXT: and a0, a0, a1 -; RV64IFD-NEXT: seqz a0, a0 -; RV64IFD-NEXT: xori a0, a0, 1 ; RV64IFD-NEXT: bnez a0, .LBB8_2 ; RV64IFD-NEXT: # %bb.1: # %if.else ; RV64IFD-NEXT: ld ra, 8(sp) diff --git a/test/CodeGen/RISCV/double-fcmp.ll b/test/CodeGen/RISCV/double-fcmp.ll index 25c8f6d96fb..0046b59d496 100644 --- a/test/CodeGen/RISCV/double-fcmp.ll +++ b/test/CodeGen/RISCV/double-fcmp.ll @@ -159,8 +159,6 @@ define i32 @fcmp_one(double %a, double %b) nounwind { ; RV32IFD-NEXT: and a0, a1, a0 ; RV32IFD-NEXT: feq.d a1, ft0, ft1 ; RV32IFD-NEXT: not a1, a1 -; RV32IFD-NEXT: seqz a0, a0 -; RV32IFD-NEXT: xori a0, a0, 1 ; RV32IFD-NEXT: and a0, a1, a0 ; RV32IFD-NEXT: addi sp, sp, 16 ; RV32IFD-NEXT: ret @@ -174,8 +172,6 @@ define i32 @fcmp_one(double %a, double %b) nounwind { ; RV64IFD-NEXT: and a0, a1, a0 ; RV64IFD-NEXT: feq.d a1, ft0, ft1 ; RV64IFD-NEXT: not a1, a1 -; RV64IFD-NEXT: seqz a0, a0 -; RV64IFD-NEXT: xori a0, a0, 1 ; RV64IFD-NEXT: and a0, a1, a0 ; RV64IFD-NEXT: ret %1 = fcmp one double %a, %b @@ -196,8 +192,6 @@ define i32 @fcmp_ord(double %a, double %b) nounwind { ; RV32IFD-NEXT: feq.d a0, ft1, ft1 ; RV32IFD-NEXT: feq.d a1, ft0, ft0 ; RV32IFD-NEXT: and a0, a1, a0 -; RV32IFD-NEXT: seqz a0, a0 -; RV32IFD-NEXT: xori a0, a0, 1 ; RV32IFD-NEXT: addi sp, sp, 16 ; RV32IFD-NEXT: ret ; @@ -208,8 +202,6 @@ define i32 @fcmp_ord(double %a, double %b) nounwind { ; RV64IFD-NEXT: fmv.d.x ft0, a0 ; RV64IFD-NEXT: feq.d a0, ft0, ft0 ; RV64IFD-NEXT: and a0, a0, a1 -; RV64IFD-NEXT: seqz a0, a0 -; RV64IFD-NEXT: xori a0, a0, 1 ; RV64IFD-NEXT: ret %1 = fcmp ord double %a, %b %2 = zext i1 %1 to i32 diff --git a/test/CodeGen/RISCV/double-select-fcmp.ll b/test/CodeGen/RISCV/double-select-fcmp.ll index 4503c2365c8..321adce3d7f 100644 --- a/test/CodeGen/RISCV/double-select-fcmp.ll +++ b/test/CodeGen/RISCV/double-select-fcmp.ll @@ -221,8 +221,6 @@ define double @select_fcmp_one(double %a, double %b) nounwind { ; RV32IFD-NEXT: and a0, a1, a0 ; RV32IFD-NEXT: feq.d a1, ft0, ft1 ; RV32IFD-NEXT: not a1, a1 -; RV32IFD-NEXT: seqz a0, a0 -; RV32IFD-NEXT: xori a0, a0, 1 ; RV32IFD-NEXT: and a0, a1, a0 ; RV32IFD-NEXT: bnez a0, .LBB6_2 ; RV32IFD-NEXT: # %bb.1: @@ -243,8 +241,6 @@ define double @select_fcmp_one(double %a, double %b) nounwind { ; RV64IFD-NEXT: and a0, a1, a0 ; RV64IFD-NEXT: feq.d a1, ft0, ft1 ; RV64IFD-NEXT: not a1, a1 -; RV64IFD-NEXT: seqz a0, a0 -; RV64IFD-NEXT: xori a0, a0, 1 ; RV64IFD-NEXT: and a0, a1, a0 ; RV64IFD-NEXT: bnez a0, .LBB6_2 ; RV64IFD-NEXT: # %bb.1: @@ -270,8 +266,6 @@ define double @select_fcmp_ord(double %a, double %b) nounwind { ; RV32IFD-NEXT: feq.d a0, ft1, ft1 ; RV32IFD-NEXT: feq.d a1, ft0, ft0 ; RV32IFD-NEXT: and a0, a1, a0 -; RV32IFD-NEXT: seqz a0, a0 -; RV32IFD-NEXT: xori a0, a0, 1 ; RV32IFD-NEXT: bnez a0, .LBB7_2 ; RV32IFD-NEXT: # %bb.1: ; RV32IFD-NEXT: fmv.d ft0, ft1 @@ -289,8 +283,6 @@ define double @select_fcmp_ord(double %a, double %b) nounwind { ; RV64IFD-NEXT: feq.d a0, ft1, ft1 ; RV64IFD-NEXT: feq.d a1, ft0, ft0 ; RV64IFD-NEXT: and a0, a1, a0 -; RV64IFD-NEXT: seqz a0, a0 -; RV64IFD-NEXT: xori a0, a0, 1 ; RV64IFD-NEXT: bnez a0, .LBB7_2 ; RV64IFD-NEXT: # %bb.1: ; RV64IFD-NEXT: fmv.d ft0, ft1 diff --git a/test/CodeGen/RISCV/float-br-fcmp.ll b/test/CodeGen/RISCV/float-br-fcmp.ll index 678d738d8ad..425da738316 100644 --- a/test/CodeGen/RISCV/float-br-fcmp.ll +++ b/test/CodeGen/RISCV/float-br-fcmp.ll @@ -295,8 +295,6 @@ define void @br_fcmp_one(float %a, float %b) nounwind { ; RV32IF-NEXT: and a0, a1, a0 ; RV32IF-NEXT: feq.s a1, ft0, ft1 ; RV32IF-NEXT: not a1, a1 -; RV32IF-NEXT: seqz a0, a0 -; RV32IF-NEXT: xori a0, a0, 1 ; RV32IF-NEXT: and a0, a1, a0 ; RV32IF-NEXT: bnez a0, .LBB7_2 ; RV32IF-NEXT: # %bb.1: # %if.else @@ -317,8 +315,6 @@ define void @br_fcmp_one(float %a, float %b) nounwind { ; RV64IF-NEXT: and a0, a1, a0 ; RV64IF-NEXT: feq.s a1, ft0, ft1 ; RV64IF-NEXT: not a1, a1 -; RV64IF-NEXT: seqz a0, a0 -; RV64IF-NEXT: xori a0, a0, 1 ; RV64IF-NEXT: and a0, a1, a0 ; RV64IF-NEXT: bnez a0, .LBB7_2 ; RV64IF-NEXT: # %bb.1: # %if.else @@ -346,8 +342,6 @@ define void @br_fcmp_ord(float %a, float %b) nounwind { ; RV32IF-NEXT: fmv.w.x ft0, a0 ; RV32IF-NEXT: feq.s a0, ft0, ft0 ; RV32IF-NEXT: and a0, a0, a1 -; RV32IF-NEXT: seqz a0, a0 -; RV32IF-NEXT: xori a0, a0, 1 ; RV32IF-NEXT: bnez a0, .LBB8_2 ; RV32IF-NEXT: # %bb.1: # %if.else ; RV32IF-NEXT: lw ra, 12(sp) @@ -365,8 +359,6 @@ define void @br_fcmp_ord(float %a, float %b) nounwind { ; RV64IF-NEXT: fmv.w.x ft0, a0 ; RV64IF-NEXT: feq.s a0, ft0, ft0 ; RV64IF-NEXT: and a0, a0, a1 -; RV64IF-NEXT: seqz a0, a0 -; RV64IF-NEXT: xori a0, a0, 1 ; RV64IF-NEXT: bnez a0, .LBB8_2 ; RV64IF-NEXT: # %bb.1: # %if.else ; RV64IF-NEXT: ld ra, 8(sp) diff --git a/test/CodeGen/RISCV/float-fcmp.ll b/test/CodeGen/RISCV/float-fcmp.ll index 16f44184791..43a849bee36 100644 --- a/test/CodeGen/RISCV/float-fcmp.ll +++ b/test/CodeGen/RISCV/float-fcmp.ll @@ -124,8 +124,6 @@ define i32 @fcmp_one(float %a, float %b) nounwind { ; RV32IF-NEXT: and a0, a1, a0 ; RV32IF-NEXT: feq.s a1, ft0, ft1 ; RV32IF-NEXT: not a1, a1 -; RV32IF-NEXT: seqz a0, a0 -; RV32IF-NEXT: xori a0, a0, 1 ; RV32IF-NEXT: and a0, a1, a0 ; RV32IF-NEXT: ret ; @@ -138,8 +136,6 @@ define i32 @fcmp_one(float %a, float %b) nounwind { ; RV64IF-NEXT: and a0, a1, a0 ; RV64IF-NEXT: feq.s a1, ft0, ft1 ; RV64IF-NEXT: not a1, a1 -; RV64IF-NEXT: seqz a0, a0 -; RV64IF-NEXT: xori a0, a0, 1 ; RV64IF-NEXT: and a0, a1, a0 ; RV64IF-NEXT: ret %1 = fcmp one float %a, %b @@ -155,8 +151,6 @@ define i32 @fcmp_ord(float %a, float %b) nounwind { ; RV32IF-NEXT: fmv.w.x ft0, a0 ; RV32IF-NEXT: feq.s a0, ft0, ft0 ; RV32IF-NEXT: and a0, a0, a1 -; RV32IF-NEXT: seqz a0, a0 -; RV32IF-NEXT: xori a0, a0, 1 ; RV32IF-NEXT: ret ; ; RV64IF-LABEL: fcmp_ord: @@ -166,8 +160,6 @@ define i32 @fcmp_ord(float %a, float %b) nounwind { ; RV64IF-NEXT: fmv.w.x ft0, a0 ; RV64IF-NEXT: feq.s a0, ft0, ft0 ; RV64IF-NEXT: and a0, a0, a1 -; RV64IF-NEXT: seqz a0, a0 -; RV64IF-NEXT: xori a0, a0, 1 ; RV64IF-NEXT: ret %1 = fcmp ord float %a, %b %2 = zext i1 %1 to i32 diff --git a/test/CodeGen/RISCV/float-select-fcmp.ll b/test/CodeGen/RISCV/float-select-fcmp.ll index 3659ed2d175..ec81c53e1ff 100644 --- a/test/CodeGen/RISCV/float-select-fcmp.ll +++ b/test/CodeGen/RISCV/float-select-fcmp.ll @@ -175,8 +175,6 @@ define float @select_fcmp_one(float %a, float %b) nounwind { ; RV32IF-NEXT: and a0, a1, a0 ; RV32IF-NEXT: feq.s a1, ft0, ft1 ; RV32IF-NEXT: not a1, a1 -; RV32IF-NEXT: seqz a0, a0 -; RV32IF-NEXT: xori a0, a0, 1 ; RV32IF-NEXT: and a0, a1, a0 ; RV32IF-NEXT: bnez a0, .LBB6_2 ; RV32IF-NEXT: # %bb.1: @@ -194,8 +192,6 @@ define float @select_fcmp_one(float %a, float %b) nounwind { ; RV64IF-NEXT: and a0, a1, a0 ; RV64IF-NEXT: feq.s a1, ft0, ft1 ; RV64IF-NEXT: not a1, a1 -; RV64IF-NEXT: seqz a0, a0 -; RV64IF-NEXT: xori a0, a0, 1 ; RV64IF-NEXT: and a0, a1, a0 ; RV64IF-NEXT: bnez a0, .LBB6_2 ; RV64IF-NEXT: # %bb.1: @@ -216,8 +212,6 @@ define float @select_fcmp_ord(float %a, float %b) nounwind { ; RV32IF-NEXT: feq.s a0, ft1, ft1 ; RV32IF-NEXT: feq.s a1, ft0, ft0 ; RV32IF-NEXT: and a0, a1, a0 -; RV32IF-NEXT: seqz a0, a0 -; RV32IF-NEXT: xori a0, a0, 1 ; RV32IF-NEXT: bnez a0, .LBB7_2 ; RV32IF-NEXT: # %bb.1: ; RV32IF-NEXT: fmv.s ft0, ft1 @@ -232,8 +226,6 @@ define float @select_fcmp_ord(float %a, float %b) nounwind { ; RV64IF-NEXT: feq.s a0, ft1, ft1 ; RV64IF-NEXT: feq.s a1, ft0, ft0 ; RV64IF-NEXT: and a0, a1, a0 -; RV64IF-NEXT: seqz a0, a0 -; RV64IF-NEXT: xori a0, a0, 1 ; RV64IF-NEXT: bnez a0, .LBB7_2 ; RV64IF-NEXT: # %bb.1: ; RV64IF-NEXT: fmv.s ft0, ft1