[llvm] a253a2a - [SDAG] fold fsub -0.0, undef to undef rather than NaN

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 23 08:40:36 PST 2020


On Sun, Feb 23, 2020 at 7:37 PM Sanjay Patel via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
>
> Author: Sanjay Patel
> Date: 2020-02-23T11:36:53-05:00
> New Revision: a253a2a793cda34d1f6421ee9b7ca76a03fdfc59
>
> URL: https://github.com/llvm/llvm-project/commit/a253a2a793cda34d1f6421ee9b7ca76a03fdfc59
> DIFF: https://github.com/llvm/llvm-project/commit/a253a2a793cda34d1f6421ee9b7ca76a03fdfc59.diff
>
> LOG: [SDAG] fold fsub -0.0, undef to undef rather than NaN
>
> A question about this behavior came up on llvm-dev:
> http://lists.llvm.org/pipermail/llvm-dev/2020-February/139003.html
> ...and as part of backend improvements in D73978.

> We decided not to implement a more general change that would have
> folded any FP binop with nearly arbitrary constant + undef operand
> to undef because that is not theoretically correct (even if it is
> practically correct).
This is a bit too pessimistic. Alive experiments show that it would be fine
in general at least for the fsub, as long as we don't have NaN's

> This is the SDAG-equivalent to the IR change in D74713.
>
> Added:
>
>
> Modified:
>     llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
>     llvm/test/CodeGen/X86/vec_fneg.ll
>
> Removed:
>
>
>
> ################################################################################
> diff  --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> index e809816d68be..d2db4bccc3ac 100644
> --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> @@ -5112,8 +5112,13 @@ SDValue SelectionDAG::foldConstantFPMath(unsigned Opcode, const SDLoc &DL,
>    }
>
>    switch (Opcode) {
> -  case ISD::FADD:
>    case ISD::FSUB:
> +    // -0.0 - undef --> undef (consistent with "fneg undef")
> +    if (N1CFP && N1CFP->getValueAPF().isNegZero() && N2.isUndef())
> +      return getUNDEF(VT);
> +    LLVM_FALLTHROUGH;
> +
> +  case ISD::FADD:
>    case ISD::FMUL:
>    case ISD::FDIV:
>    case ISD::FREM:
>
> diff  --git a/llvm/test/CodeGen/X86/vec_fneg.ll b/llvm/test/CodeGen/X86/vec_fneg.ll
> index 4d5539feef3c..c3c1932c2311 100644
> --- a/llvm/test/CodeGen/X86/vec_fneg.ll
> +++ b/llvm/test/CodeGen/X86/vec_fneg.ll
> @@ -76,12 +76,10 @@ define <4 x float> @fneg_undef(<4 x float> %Q) nounwind {
>  define <4 x float> @fsub_neg0_undef_elts_undef(<4 x float> %x) {
>  ; X32-SSE-LABEL: fsub_neg0_undef_elts_undef:
>  ; X32-SSE:       # %bb.0:
> -; X32-SSE-NEXT:    movaps {{.*#+}} xmm0 = <NaN,u,u,NaN>
>  ; X32-SSE-NEXT:    retl
>  ;
>  ; X64-SSE-LABEL: fsub_neg0_undef_elts_undef:
>  ; X64-SSE:       # %bb.0:
> -; X64-SSE-NEXT:    movaps {{.*#+}} xmm0 = <NaN,u,u,NaN>
>  ; X64-SSE-NEXT:    retq
>    %r = fsub <4 x float> <float -0.0, float undef, float undef, float -0.0>, undef
>    ret <4 x float> %r
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list