[llvm-commits] [llvm] r128625 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineCompares.cpp test/Transforms/InstCombine/fcmp.ll

Eli Friedman eli.friedman at gmail.com
Thu Mar 31 13:14:00 PDT 2011


On Thu, Mar 31, 2011 at 3:12 AM, Benjamin Kramer
<benny.kra at googlemail.com> wrote:
> Author: d0k
> Date: Thu Mar 31 05:12:07 2011
> New Revision: 128625
>
> URL: http://llvm.org/viewvc/llvm-project?rev=128625&view=rev
> Log:
> InstCombine: Shrink "fcmp (fpext x), C" to "fcmp x, C" if C can be losslessly converted to the type of x.
>
> Fixes PR9592.
>
> Modified:
>    llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
>    llvm/trunk/test/Transforms/InstCombine/fcmp.ll
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=128625&r1=128624&r2=128625&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Thu Mar 31 05:12:07 2011
> @@ -2762,6 +2762,40 @@
>   if (Constant *RHSC = dyn_cast<Constant>(Op1)) {
>     if (Instruction *LHSI = dyn_cast<Instruction>(Op0))
>       switch (LHSI->getOpcode()) {
> +      case Instruction::FPExt: {
> +        // fcmp (fpext x), C -> fcmp x, (fptrunc C) if fptrunc is lossless
> +        FPExtInst *LHSExt = cast<FPExtInst>(LHSI);
> +        ConstantFP *RHSF = dyn_cast<ConstantFP>(RHSC);
> +        if (!RHSF)
> +          break;
> +
> +        const fltSemantics *Sem;
> +        // FIXME: This shouldn't be here.
> +        if (LHSExt->getSrcTy()->isFloatTy())
> +          Sem = &APFloat::IEEEsingle;
> +        else if (LHSExt->getSrcTy()->isDoubleTy())
> +          Sem = &APFloat::IEEEdouble;
> +        else if (LHSExt->getSrcTy()->isFP128Ty())
> +          Sem = &APFloat::IEEEquad;
> +        else if (LHSExt->getSrcTy()->isX86_FP80Ty())
> +          Sem = &APFloat::x87DoubleExtended;
> +        else if (LHSExt->getSrcTy()->isPPC_FP128Ty())
> +          Sem = &APFloat::PPCDoubleDouble;
> +        else
> +          break;

Trying this transformation on APFloat::PPCDoubleDouble is likely to
cause bad things to happen.

-Eli

> +        bool Lossy;
> +        APFloat F = RHSF->getValueAPF();
> +        F.convert(*Sem, APFloat::rmNearestTiesToEven, &Lossy);
> +
> +        // Avoid lossy conversions and denormals.
> +        if (!Lossy &&
> +            F.compare(APFloat::getSmallestNormalized(*Sem)) !=
> +                                                           APFloat::cmpLessThan)
> +          return new FCmpInst(I.getPredicate(), LHSExt->getOperand(0),
> +                              ConstantFP::get(RHSC->getContext(), F));
> +        break;
> +      }
>       case Instruction::PHI:
>         // Only fold fcmp into the PHI if the phi and fcmp are in the same
>         // block.  If in the same block, we're encouraging jump threading.  If
>
> Modified: llvm/trunk/test/Transforms/InstCombine/fcmp.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fcmp.ll?rev=128625&r1=128624&r2=128625&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/fcmp.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/fcmp.ll Thu Mar 31 05:12:07 2011
> @@ -9,3 +9,26 @@
>  ; CHECK-NEXT: fcmp ogt float %x, %y
>  }
>
> +define i1 @test2(float %a) nounwind {
> +  %ext = fpext float %a to double
> +  %cmp = fcmp ogt double %ext, 1.000000e+00
> +  ret i1 %cmp
> +; CHECK: @test2
> +; CHECK-NEXT: fcmp ogt float %a, 1.0
> +}
> +
> +define i1 @test3(float %a) nounwind {
> +  %ext = fpext float %a to double
> +  %cmp = fcmp ogt double %ext, 0x3FF0000000000001 ; more precision than float.
> +  ret i1 %cmp
> +; CHECK: @test3
> +; CHECK-NEXT: fpext float %a to double
> +}
> +
> +define i1 @test4(float %a) nounwind {
> +  %ext = fpext float %a to double
> +  %cmp = fcmp ogt double %ext, 0x36A0000000000000 ; denormal in float.
> +  ret i1 %cmp
> +; CHECK: @test4
> +; CHECK-NEXT: fpext float %a to double
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list