[llvm-commits] [llvm] r170226 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineMulDivRem.cpp test/Transforms/InstCombine/fast-math.ll

Matt Beaumont-Gay matthewbg at google.com
Fri Dec 14 10:55:55 PST 2012


On Fri, Dec 14, 2012 at 10:46 AM, Shuxin Yang <shuxin.llvm at gmail.com> wrote:
> Author: shuxin_yang
> Date: Fri Dec 14 12:46:06 2012
> New Revision: 170226
>
> URL: http://llvm.org/viewvc/llvm-project?rev=170226&view=rev
> Log:
> rdar://12753946
>
> Implement rule : "x * (select cond 1.0, 0.0) -> select cond x, 0.0"
>
> Modified:
>     llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
>     llvm/trunk/test/Transforms/InstCombine/fast-math.ll
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp?rev=170226&r1=170225&r2=170226&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp Fri Dec 14 12:46:06 2012
> @@ -341,6 +341,38 @@
>      }
>    }
>
> +  // X * cond ? 1.0 : 0.0 => cond ? X : 0.0
> +  if (I.hasNoNaNs() && I.hasNoSignedZeros()) {
> +    Value *V0 = I.getOperand(0);
> +    Value *V1 = I.getOperand(1);
> +    Value *Cond, *SLHS, *SRHS;
> +    bool Match = false;
> +
> +    if (match(V0, m_Select(m_Value(Cond), m_Value(SLHS), m_Value(SRHS)))) {
> +      Match = true;
> +    } else if (match(V1, m_Select(m_Value(Cond), m_Value(SLHS),
> +                     m_Value(SRHS)))) {

Formatting nit: This should be indented to the open paren of m_Select.

> +      Match = true;
> +      std::swap(V0, V1);
> +    }
> +
> +    if (Match) {
> +      ConstantFP *C0 = dyn_cast<ConstantFP>(SLHS);
> +      ConstantFP *C1 = dyn_cast<ConstantFP>(SRHS);
> +
> +      if (C0 && C1 &&
> +          ((C0->isZero() && C1->isExactlyValue(1.0)) ||
> +           (C1->isZero() && C0->isExactlyValue(1.0)))) {
> +        Value *T;
> +        if (C0->isZero())
> +          T = Builder->CreateSelect(Cond, SLHS, V1);
> +        else
> +          T = Builder->CreateSelect(Cond, V1, SRHS);
> +        return ReplaceInstUsesWith(I, T);
> +      }
> +    }
> +  }
> +
>    return Changed ? &I : 0;
>  }
>
>
> Modified: llvm/trunk/test/Transforms/InstCombine/fast-math.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fast-math.ll?rev=170226&r1=170225&r2=170226&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/fast-math.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/fast-math.ll Fri Dec 14 12:46:06 2012
> @@ -3,19 +3,17 @@
>  ; testing-case "float fold(float a) { return 1.2f * a * 2.3f; }"
>  ; 1.2f and 2.3f is supposed to be fold.
>  define float @fold(float %a) {
> -fold:
>    %mul = fmul fast float %a, 0x3FF3333340000000
>    %mul1 = fmul fast float %mul, 0x4002666660000000
>    ret float %mul1
> -; CHECK: fold
> +; CHECK: @fold
>  ; CHECK: fmul float %a, 0x4006147AE0000000
>  }
>
>  ; Same testing-case as the one used in fold() except that the operators have
>  ; fixed FP mode.
>  define float @notfold(float %a) {
> -notfold:
> -; CHECK: notfold
> +; CHECK: @notfold
>  ; CHECK: %mul = fmul fast float %a, 0x3FF3333340000000
>    %mul = fmul fast float %a, 0x3FF3333340000000
>    %mul1 = fmul float %mul, 0x4002666660000000
> @@ -23,10 +21,40 @@
>  }
>
>  define float @fold2(float %a) {
> -fold2:
> -; CHECK: fold2
> +; CHECK: @fold2
>  ; CHECK: fmul float %a, 0x4006147AE0000000
>    %mul = fmul float %a, 0x3FF3333340000000
>    %mul1 = fmul fast float %mul, 0x4002666660000000
>    ret float %mul1
>  }
> +
> +; rdar://12753946:  x * cond ? 1.0 : 0.0 => cond ? x : 0.0
> +define double @select1(i32 %cond, double %x, double %y) {
> +  %tobool = icmp ne i32 %cond, 0
> +  %cond1 = select i1 %tobool, double 1.000000e+00, double 0.000000e+00
> +  %mul = fmul nnan nsz double %cond1, %x
> +  %add = fadd double %mul, %y
> +  ret double %add
> +; CHECK: @select1
> +; CHECK: select i1 %tobool, double %x, double 0.000000e+00
> +}
> +
> +define double @select2(i32 %cond, double %x, double %y) {
> +  %tobool = icmp ne i32 %cond, 0
> +  %cond1 = select i1 %tobool, double 0.000000e+00, double 1.000000e+00
> +  %mul = fmul nnan nsz double %cond1, %x
> +  %add = fadd double %mul, %y
> +  ret double %add
> +; CHECK: @select2
> +; CHECK: select i1 %tobool, double 0.000000e+00, double %x
> +}
> +
> +define double @select3(i32 %cond, double %x, double %y) {
> +  %tobool = icmp ne i32 %cond, 0
> +  %cond1 = select i1 %tobool, double 0.000000e+00, double 2.000000e+00
> +  %mul = fmul nnan nsz double %cond1, %x
> +  %add = fadd double %mul, %y
> +  ret double %add
> +; CHECK: @select3
> +; CHECK: fmul nnan nsz double %cond1, %x
> +}
>
>
> _______________________________________________
> 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