[llvm-commits] [llvm] r170226 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineMulDivRem.cpp test/Transforms/InstCombine/fast-math.ll
Duncan Sands
baldrick at free.fr
Sun Dec 16 08:49:38 PST 2012
Hi Shuxin,
On 14/12/12 19:46, Shuxin Yang 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"
this is a special case of:
X op (select cond A, B) -> select cond (X op A), (X op B)
when X op A and X op B simplify (for example because passing X op A and
X op B to InstructionSimplify say that they simplify). Any chance of
implementing this more general transform instead?
Thanks, Duncan.
>
> 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)))) {
> + 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