[llvm-commits] [llvm] r170226 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineMulDivRem.cpp test/Transforms/InstCombine/fast-math.ll
Shuxin Yang
shuxin.llvm at gmail.com
Fri Dec 14 10:46:06 PST 2012
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)))) {
+ 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
+}
More information about the llvm-commits
mailing list