From 4663ceb63f893e3281337049d802c6fff1208ceb Mon Sep 17 00:00:00 2001 From: Michael Berg Date: Thu, 14 Jun 2018 18:48:31 +0000 Subject: [PATCH] updating isNegatibleForFree and GetNegatedExpression with fmf for fadd Summary: A FMF constraint is added to FADD with unsafe still available as the fallback Reviewers: spatel, wristow, arsenm, hfinkel Reviewed By: spatel Subscribers: wdng Differential Revision: https://reviews.llvm.org/D48180 llvm-svn: 334753 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 7 +++---- llvm/test/CodeGen/X86/fp-fold.ll | 11 +++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index ac324fe4..33821c3 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -704,8 +704,8 @@ static char isNegatibleForFree(SDValue Op, bool LegalOperations, TLI.isFPImmLegal(neg(cast(Op)->getValueAPF()), VT); } case ISD::FADD: - // FIXME: determine better conditions for this xform. - if (!Options->UnsafeFPMath) return 0; + if (!Options->UnsafeFPMath && !Flags.hasNoSignedZeros()) + return 0; // After operation legalization, it might not be legal to create new FSUBs. if (LegalOperations && !TLI.isOperationLegalOrCustom(ISD::FSUB, VT)) @@ -766,8 +766,7 @@ static SDValue GetNegatedExpression(SDValue Op, SelectionDAG &DAG, return DAG.getConstantFP(V, SDLoc(Op), Op.getValueType()); } case ISD::FADD: - // FIXME: determine better conditions for this xform. - assert(Options.UnsafeFPMath); + assert(Options.UnsafeFPMath || Flags.hasNoSignedZeros()); // fold (fneg (fadd A, B)) -> (fsub (fneg A), B) if (isNegatibleForFree(Op.getOperand(0), LegalOperations, diff --git a/llvm/test/CodeGen/X86/fp-fold.ll b/llvm/test/CodeGen/X86/fp-fold.ll index fa4404b..3435443 100644 --- a/llvm/test/CodeGen/X86/fp-fold.ll +++ b/llvm/test/CodeGen/X86/fp-fold.ll @@ -62,6 +62,17 @@ define float @fsub_self(float %x) { ret float %r } +define float @fsub_neg_x_y(float %x, float %y) { +; ANY-LABEL: fsub_neg_x_y: +; ANY: # %bb.0: +; ANY-NEXT: subss %xmm0, %xmm1 +; ANY-NEXT: movaps %xmm1, %xmm0 +; ANY-NEXT: retq + %neg = fsub nsz float 0.0, %x + %r = fadd nsz float %neg, %y + ret float %r +} + define float @fsub_negzero(float %x) { ; STRICT-LABEL: fsub_negzero: ; STRICT: # %bb.0: -- 2.7.4