<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Shuxin,<div><br></div><div>I made an comment in a thread where you sent the patch:</div><div><a href="http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20121210/159263.html">http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20121210/159263.html</a></div><div><br></div><div>- Kuba</div><div><br><div><div>On Dec 14, 2012, at 7:55 PM, Matt Beaumont-Gay <<a href="mailto:matthewbg@google.com">matthewbg@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">On Fri, Dec 14, 2012 at 10:46 AM, Shuxin Yang <<a href="mailto:shuxin.llvm@gmail.com">shuxin.llvm@gmail.com</a>> wrote:<br><blockquote type="cite">Author: shuxin_yang<br>Date: Fri Dec 14 12:46:06 2012<br>New Revision: 170226<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=170226&view=rev">http://llvm.org/viewvc/llvm-project?rev=170226&view=rev</a><br>Log:<br><a href="rdar://12753946">rdar://12753946</a><br><br>Implement rule : "x * (select cond 1.0, 0.0) -> select cond x, 0.0"<br><br>Modified:<br>    llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp<br>    llvm/trunk/test/Transforms/InstCombine/fast-math.ll<br><br>Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp<br>URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp?rev=170226&r1=170225&r2=170226&view=diff<br>==============================================================================<br>--- llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp (original)<br>+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp Fri Dec 14 12:46:06 2012<br>@@ -341,6 +341,38 @@<br>     }<br>   }<br><br>+  // X * cond ? 1.0 : 0.0 => cond ? X : 0.0<br>+  if (I.hasNoNaNs() && I.hasNoSignedZeros()) {<br>+    Value *V0 = I.getOperand(0);<br>+    Value *V1 = I.getOperand(1);<br>+    Value *Cond, *SLHS, *SRHS;<br>+    bool Match = false;<br>+<br>+    if (match(V0, m_Select(m_Value(Cond), m_Value(SLHS), m_Value(SRHS)))) {<br>+      Match = true;<br>+    } else if (match(V1, m_Select(m_Value(Cond), m_Value(SLHS),<br>+                     m_Value(SRHS)))) {<br></blockquote><br>Formatting nit: This should be indented to the open paren of m_Select.<br><br><blockquote type="cite">+      Match = true;<br>+      std::swap(V0, V1);<br>+    }<br>+<br>+    if (Match) {<br>+      ConstantFP *C0 = dyn_cast<ConstantFP>(SLHS);<br>+      ConstantFP *C1 = dyn_cast<ConstantFP>(SRHS);<br>+<br>+      if (C0 && C1 &&<br>+          ((C0->isZero() && C1->isExactlyValue(1.0)) ||<br>+           (C1->isZero() && C0->isExactlyValue(1.0)))) {<br>+        Value *T;<br>+        if (C0->isZero())<br>+          T = Builder->CreateSelect(Cond, SLHS, V1);<br>+        else<br>+          T = Builder->CreateSelect(Cond, V1, SRHS);<br>+        return ReplaceInstUsesWith(I, T);<br>+      }<br>+    }<br>+  }<br>+<br>   return Changed ? &I : 0;<br> }<br><br><br>Modified: llvm/trunk/test/Transforms/InstCombine/fast-math.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fast-math.ll?rev=170226&r1=170225&r2=170226&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fast-math.ll?rev=170226&r1=170225&r2=170226&view=diff</a><br>==============================================================================<br>--- llvm/trunk/test/Transforms/InstCombine/fast-math.ll (original)<br>+++ llvm/trunk/test/Transforms/InstCombine/fast-math.ll Fri Dec 14 12:46:06 2012<br>@@ -3,19 +3,17 @@<br> ; testing-case "float fold(float a) { return 1.2f * a * 2.3f; }"<br> ; 1.2f and 2.3f is supposed to be fold.<br> define float @fold(float %a) {<br>-fold:<br>   %mul = fmul fast float %a, 0x3FF3333340000000<br>   %mul1 = fmul fast float %mul, 0x4002666660000000<br>   ret float %mul1<br>-; CHECK: fold<br>+; CHECK: @fold<br> ; CHECK: fmul float %a, 0x4006147AE0000000<br> }<br><br> ; Same testing-case as the one used in fold() except that the operators have<br> ; fixed FP mode.<br> define float @notfold(float %a) {<br>-notfold:<br>-; CHECK: notfold<br>+; CHECK: @notfold<br> ; CHECK: %mul = fmul fast float %a, 0x3FF3333340000000<br>   %mul = fmul fast float %a, 0x3FF3333340000000<br>   %mul1 = fmul float %mul, 0x4002666660000000<br>@@ -23,10 +21,40 @@<br> }<br><br> define float @fold2(float %a) {<br>-fold2:<br>-; CHECK: fold2<br>+; CHECK: @fold2<br> ; CHECK: fmul float %a, 0x4006147AE0000000<br>   %mul = fmul float %a, 0x3FF3333340000000<br>   %mul1 = fmul fast float %mul, 0x4002666660000000<br>   ret float %mul1<br> }<br>+<br>+; <a href="rdar://12753946:">rdar://12753946:</a>  x * cond ? 1.0 : 0.0 => cond ? x : 0.0<br>+define double @select1(i32 %cond, double %x, double %y) {<br>+  %tobool = icmp ne i32 %cond, 0<br>+  %cond1 = select i1 %tobool, double 1.000000e+00, double 0.000000e+00<br>+  %mul = fmul nnan nsz double %cond1, %x<br>+  %add = fadd double %mul, %y<br>+  ret double %add<br>+; CHECK: @select1<br>+; CHECK: select i1 %tobool, double %x, double 0.000000e+00<br>+}<br>+<br>+define double @select2(i32 %cond, double %x, double %y) {<br>+  %tobool = icmp ne i32 %cond, 0<br>+  %cond1 = select i1 %tobool, double 0.000000e+00, double 1.000000e+00<br>+  %mul = fmul nnan nsz double %cond1, %x<br>+  %add = fadd double %mul, %y<br>+  ret double %add<br>+; CHECK: @select2<br>+; CHECK: select i1 %tobool, double 0.000000e+00, double %x<br>+}<br>+<br>+define double @select3(i32 %cond, double %x, double %y) {<br>+  %tobool = icmp ne i32 %cond, 0<br>+  %cond1 = select i1 %tobool, double 0.000000e+00, double 2.000000e+00<br>+  %mul = fmul nnan nsz double %cond1, %x<br>+  %add = fadd double %mul, %y<br>+  ret double %add<br>+; CHECK: @select3<br>+; CHECK: fmul nnan nsz double %cond1, %x<br>+}<br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br></blockquote>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br></blockquote></div><br></div></body></html>