<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">This has broken Windows VS buildbot.<div><br></div><div>- Fariborz</div><div><br><div><div>On May 22, 2013, at 11:29 AM, Jean-Luc Duprat <<a href="mailto:jduprat@apple.com">jduprat@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Author: jduprat<br>Date: Wed May 22 13:29:31 2013<br>New Revision: 182499<br><br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=182499&view=rev">http://llvm.org/viewvc/llvm-project?rev=182499&view=rev</a><br>Log:<br>This is an update to a previous commit (r181216).<br><br>The earlier change list introduced the following inst combines:<br>B * (uitofp i1 C) —> select C, B, 0<br>A * (1 - uitofp i1 C) —> select C, 0, A<br>select C, 0, B + select C, A, 0 —> select C, A, B<br><br>Together these 3 changes would simplify :<br>A * (1 - uitofp i1 C) + B * uitofp i1 C<span class="Apple-converted-space"> </span><br>down to :<br>select C, B, A<br><br>In practice we found that the first two substitutions can have a<br>negative effect on performance, because they reduce opportunities to<br>use FMA contractions; between the two options FMAs are often the<br>better choice.  This change list amends the previous one to enable<br>just these inst combines:<br><br>select C, B, 0 + select C, 0, A —> select C, B, A<br>A * (1 - uitofp i1 C) + B * uitofp i1 C —> select C, B, A<br><br><br><br>Modified:<br>   llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp<br>   llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp<br>   llvm/trunk/test/Transforms/InstCombine/add4.ll<br><br>Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp?rev=182499&r1=182498&r2=182499&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp?rev=182499&r1=182498&r2=182499&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp (original)<br>+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp Wed May 22 13:29:31 2013<br>@@ -1262,6 +1262,49 @@ Instruction *InstCombiner::visitFAdd(Bin<br>    }<br>  }<br><br>+  // A * (1 - uitofp i1 C) + B * (uitofp i1 C) -> select C, B, A<br>+  {<br>+    if (I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) {<br>+      Value *M1L, *M1R, *M2L, *M2R;<br>+      if (match(LHS, m_FMul(m_Value(M1L), m_Value(M1R))) &&<br>+          match(RHS, m_FMul(m_Value(M2L), m_Value(M2R)))) {<br>+<br>+        Value *A, *B, *C1, *C2;<br>+        if (!match(M1R, m_FSub(m_FPOne(), m_UIToFp(m_Value(C1)))))<br>+          std::swap(M1L, M1R);<br>+        if (!match(M2R, m_UIToFp(m_Value(C2))))<span class="Apple-converted-space"> </span><br>+          std::swap(M2L, M2R);<br>+<br>+        if (match(M1R, m_FSub(m_FPOne(), m_UIToFp(m_Value(C1)))) &&<br>+            match(M2R, m_UIToFp(m_Value(C2))) &&<br>+            C2->getType()->isIntegerTy(1) &&<br>+            C1 == C2) {<br>+          A = M1L;<br>+          B = M2L;<br>+          return SelectInst::Create(C1, B, A);<br>+        }<br>+        <br>+        std::swap(M1L, M2L);<br>+        std::swap(M1R, M2R);<br>+        <br>+        if (!match(M1R, m_FSub(m_FPOne(), m_UIToFp(m_Value(C1)))))<br>+          std::swap(M1L, M1R);<br>+        if (!match(M2R, m_UIToFp(m_Value(C2))))<span class="Apple-converted-space"> </span><br>+          std::swap(M2L, M2R);<br>+<br>+        if (match(M1R, m_FSub(m_FPOne(), m_UIToFp(m_Value(C1)))) &&<br>+            match(M2R, m_UIToFp(m_Value(C2))) &&<br>+            C2->getType()->isIntegerTy(1) &&<br>+            C1 == C2) {<br>+          A = M1L;<br>+          B = M2L;<br>+          return SelectInst::Create(C1, B, A);<br>+        }<br>+      }<br>+    }<br>+  }<br>+<br>+  <br>  if (I.hasUnsafeAlgebra()) {<br>    if (Value *V = FAddCombine(Builder).simplify(&I))<br>      return ReplaceInstUsesWith(I, V);<br><br>Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp?rev=182499&r1=182498&r2=182499&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp?rev=182499&r1=182498&r2=182499&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp (original)<br>+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp Wed May 22 13:29:31 2013<br>@@ -524,35 +524,6 @@ Instruction *InstCombiner::visitFMul(Bin<br>      }<br>    }<br><br>-    // B * (uitofp i1 C) -> select C, B, 0<br>-    if (I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) {<br>-      Value *LHS = Op0, *RHS = Op1;<br>-      Value *B, *C;<br>-      if (!match(RHS, m_UIToFp(m_Value(C))))<br>-        std::swap(LHS, RHS);<br>-<br>-      if (match(RHS, m_UIToFp(m_Value(C))) && C->getType()->isIntegerTy(1)) {<br>-        B = LHS;<br>-        Value *Zero = ConstantFP::getNegativeZero(B->getType());<br>-        return SelectInst::Create(C, B, Zero);<br>-      }<br>-    }<br>-<br>-    // A * (1 - uitofp i1 C) -> select C, 0, A<br>-    if (I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) {<br>-      Value *LHS = Op0, *RHS = Op1;<br>-      Value *A, *C;<br>-      if (!match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C)))))<br>-        std::swap(LHS, RHS);<br>-<br>-      if (match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C)))) &&<br>-          C->getType()->isIntegerTy(1)) {<br>-        A = LHS;<br>-        Value *Zero = ConstantFP::getNegativeZero(A->getType());<br>-        return SelectInst::Create(C, Zero, A);<br>-      }<br>-    }<br>-<br>    if (!isa<Constant>(Op1))<br>      std::swap(Opnd0, Opnd1);<br>    else<br><br>Modified: llvm/trunk/test/Transforms/InstCombine/add4.ll<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/add4.ll?rev=182499&r1=182498&r2=182499&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/add4.ll?rev=182499&r1=182498&r2=182499&view=diff</a><br>==============================================================================<br>--- llvm/trunk/test/Transforms/InstCombine/add4.ll (original)<br>+++ llvm/trunk/test/Transforms/InstCombine/add4.ll Wed May 22 13:29:31 2013<br>@@ -6,30 +6,34 @@ target triple = "i686-apple-darwin8"<br><br>define float @test1(float %A, float %B, i1 %C) {<br>EntryBlock:<br>-  ;; A*(1 - uitofp i1 C) -> select C, 0, A<br>+  ;;  select C, 0, B + select C, A, 0 -> select C, A, B<br>  %cf = uitofp i1 %C to float<br>-  %mc = fsub float 1.000000e+00, %cf<br>-  %p1 = fmul fast float %A, %mc<br>-  ret float %p1<br>+  %s1 = select i1 %C, float 0.000000e+00, float %B<br>+  %s2 = select i1 %C, float %A, float 0.000000e+00<br>+  %sum = fadd fast float %s1, %s2<br>+  ret float %sum<br>; CHECK: @test1<br>-; CHECK: select i1 %C, float -0.000000e+00, float %A<br>+; CHECK: select i1 %C, float %A, float %B<br>}<br><br>define float @test2(float %A, float %B, i1 %C) {<br>EntryBlock:<br>-  ;; B*(uitofp i1 C) -> select C, B, 0<br>+  ;;  B*(uitofp i1 C) + A*(1 - uitofp i1 C) -> select C, A, B<br>  %cf = uitofp i1 %C to float<br>+  %mc = fsub fast float 1.000000e+00, %cf<br>+  %p1 = fmul fast float %A, %mc<br>  %p2 = fmul fast float %B, %cf<br>-  ret float %p2<br>+  %s1 = fadd fast float %p2, %p1<br>+  ret float %s1<br>; CHECK: @test2<br>-; CHECK: select i1 %C, float %B, float -0.000000e+00<br>+; CHECK: select i1 %C, float %B, float %A<br>}<br><br>define float @test3(float %A, float %B, i1 %C) {<br>EntryBlock:<br>  ;; A*(1 - uitofp i1 C) + B*(uitofp i1 C) -> select C, A, B<br>  %cf = uitofp i1 %C to float<br>-  %mc = fsub float 1.000000e+00, %cf<br>+  %mc = fsub fast float 1.000000e+00, %cf<br>  %p1 = fmul fast float %A, %mc<br>  %p2 = fmul fast float %B, %cf<br>  %s1 = fadd fast float %p1, %p2<br>@@ -38,21 +42,3 @@ EntryBlock:<br>; CHECK: select i1 %C, float %B, float %A<br>}<br><br>-; PR15952<br>-define float @test4(float %A, float %B, i32 %C) {<br>-  %cf = uitofp i32 %C to float<br>-  %mc = fsub float 1.000000e+00, %cf<br>-  %p1 = fmul fast float %A, %mc<br>-  ret float %p1<br>-; CHECK: @test4<br>-; CHECK: uitofp<br>-}<br>-<br>-define float @test5(float %A, float %B, i32 %C) {<br>-  %cf = uitofp i32 %C to float<br>-  %p2 = fmul fast float %B, %cf<br>-  ret float %p2<br>-; CHECK: @test5<br>-; CHECK: uitofp<br>-}<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><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a></div></blockquote></div><br></div></body></html>