<div dir="ltr">Hi Craig,<div><br></div><div>I reverted this commit because it seems to have caused a miscompile that causes a bootstrapped clang to fail tests.</div><div><br></div><div>I don't know the code well enough to spot the problem, but the buildbots blame this revision:</div><div>  - clang-ppc64be-linux-multistage: (<a href="http://lab.llvm.org:8011/builders/clang-ppc64be-linux-multistage/builds/6116">r319622</a>, <a href="http://lab.llvm.org:8011/builders/clang-ppc64be-linux-multistage/builds/6117">r319624</a>]</div><div>  - clang-ppc64le-linux-multistage: (<a href="http://lab.llvm.org:8011/builders/clang-ppc64le-linux-multistage/builds/4868">r319623</a>, <a href="http://lab.llvm.org:8011/builders/clang-ppc64le-linux-multistage/builds/4869">r319626</a>]</div><div><br></div><div>Cheers, Sam</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Dec 3, 2017 at 12:42 AM, Craig Topper via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ctopper<br>
Date: Sat Dec  2 15:42:17 2017<br>
New Revision: 319624<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=319624&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=319624&view=rev</a><br>
Log:<br>
[ValueTracking] Pass only a single lambda to computeKnownBitsFromShiftOpera<wbr>tor by using KnownBits struct instead of separate APInts. NFCI<br>
<br>
Modified:<br>
    llvm/trunk/lib/Analysis/<wbr>ValueTracking.cpp<br>
<br>
Modified: llvm/trunk/lib/Analysis/<wbr>ValueTracking.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=319624&r1=319623&r2=319624&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Analysis/ValueTracking.cpp?<wbr>rev=319624&r1=319623&r2=<wbr>319624&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Analysis/<wbr>ValueTracking.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/<wbr>ValueTracking.cpp Sat Dec  2 15:42:17 2017<br>
@@ -795,16 +795,14 @@ static void computeKnownBitsFromAssume(c<br>
 static void computeKnownBitsFromShiftOpera<wbr>tor(<br>
     const Operator *I, KnownBits &Known, KnownBits &Known2,<br>
     unsigned Depth, const Query &Q,<br>
-    function_ref<APInt(const APInt &, unsigned)> KZF,<br>
-    function_ref<APInt(const APInt &, unsigned)> KOF) {<br>
+    function_ref<KnownBits(<wbr>KnownBits, unsigned)> KBF) {<br>
   unsigned BitWidth = Known.getBitWidth();<br>
<br>
   if (auto *SA = dyn_cast<ConstantInt>(I-><wbr>getOperand(1))) {<br>
     unsigned ShiftAmt = SA->getLimitedValue(BitWidth-<wbr>1);<br>
<br>
     computeKnownBits(I-><wbr>getOperand(0), Known, Depth + 1, Q);<br>
-    Known.Zero = KZF(Known.Zero, ShiftAmt);<br>
-    Known.One  = KOF(Known.One, ShiftAmt);<br>
+    Known = KBF(Known, ShiftAmt);<br>
     // If the known bits conflict, this must be an overflowing left shift, so<br>
     // the shift result is poison. We can return anything we want. Choose 0 for<br>
     // the best folding opportunity.<br>
@@ -869,8 +867,9 @@ static void computeKnownBitsFromShiftOpe<br>
         continue;<br>
     }<br>
<br>
-    Known.Zero &= KZF(Known2.Zero, ShiftAmt);<br>
-    Known.One  &= KOF(Known2.One, ShiftAmt);<br>
+    Known2 = KBF(Known2, ShiftAmt);<br>
+    Known.Zero &= Known2.Zero;<br>
+    Known.One  &= Known2.One;<br>
   }<br>
<br>
   // If the known bits conflict, the result is poison. Return a 0 and hope the<br>
@@ -1068,53 +1067,46 @@ static void computeKnownBitsFromOperator<br>
   case Instruction::Shl: {<br>
     // (shl X, C1) & C2 == 0   iff   (X & C2 >>u C1) == 0<br>
     bool NSW = cast<<wbr>OverflowingBinaryOperator>(I)-<wbr>>hasNoSignedWrap();<br>
-    auto KZF = [NSW](const APInt &KnownZero, unsigned ShiftAmt) {<br>
-      APInt KZResult = KnownZero << ShiftAmt;<br>
-      KZResult.setLowBits(ShiftAmt); // Low bits known 0.<br>
+    auto KBF = [NSW](const KnownBits &Known, unsigned ShiftAmt) {<br>
+      KnownBits Result;<br>
+      Result.Zero = Known.Zero << ShiftAmt;<br>
+      Result.Zero.setLowBits(<wbr>ShiftAmt); // Low bits known 0.<br>
+      Result.One = Known.One << ShiftAmt;<br>
       // If this shift has "nsw" keyword, then the result is either a poison<br>
       // value or has the same sign bit as the first operand.<br>
-      if (NSW && KnownZero.isSignBitSet())<br>
-        KZResult.setSignBit();<br>
-      return KZResult;<br>
-    };<br>
-<br>
-    auto KOF = [NSW](const APInt &KnownOne, unsigned ShiftAmt) {<br>
-      APInt KOResult = KnownOne << ShiftAmt;<br>
-      if (NSW && KnownOne.isSignBitSet())<br>
-        KOResult.setSignBit();<br>
-      return KOResult;<br>
+      if (NSW && Known.isNonNegative())<br>
+        Result.Zero.setSignBit();<br>
+      if (NSW && Known.isNegative())<br>
+        Result.One.setSignBit();<br>
+      return Result;<br>
     };<br>
<br>
-    computeKnownBitsFromShiftOpera<wbr>tor(I, Known, Known2, Depth, Q, KZF, KOF);<br>
+    computeKnownBitsFromShiftOpera<wbr>tor(I, Known, Known2, Depth, Q, KBF);<br>
     break;<br>
   }<br>
   case Instruction::LShr: {<br>
     // (lshr X, C1) & C2 == 0   iff  (-1 >> C1) & C2 == 0<br>
-    auto KZF = [](const APInt &KnownZero, unsigned ShiftAmt) {<br>
-      APInt KZResult = KnownZero.lshr(ShiftAmt);<br>
-      // High bits known zero.<br>
-      KZResult.setHighBits(ShiftAmt)<wbr>;<br>
-      return KZResult;<br>
+    auto KBF = [](const KnownBits &Known, unsigned ShiftAmt) {<br>
+      KnownBits Result;<br>
+      Result.Zero = Known.Zero.lshr(ShiftAmt);<br>
+      Result.Zero.setHighBits(<wbr>ShiftAmt); // High bits known zero.<br>
+      Result.One = Known.One.lshr(ShiftAmt);<br>
+      return Result;<br>
     };<br>
<br>
-    auto KOF = [](const APInt &KnownOne, unsigned ShiftAmt) {<br>
-      return KnownOne.lshr(ShiftAmt);<br>
-    };<br>
-<br>
-    computeKnownBitsFromShiftOpera<wbr>tor(I, Known, Known2, Depth, Q, KZF, KOF);<br>
+    computeKnownBitsFromShiftOpera<wbr>tor(I, Known, Known2, Depth, Q, KBF);<br>
     break;<br>
   }<br>
   case Instruction::AShr: {<br>
     // (ashr X, C1) & C2 == 0   iff  (-1 >> C1) & C2 == 0<br>
-    auto KZF = [](const APInt &KnownZero, unsigned ShiftAmt) {<br>
-      return KnownZero.ashr(ShiftAmt);<br>
-    };<br>
-<br>
-    auto KOF = [](const APInt &KnownOne, unsigned ShiftAmt) {<br>
-      return KnownOne.ashr(ShiftAmt);<br>
+    auto KBF = [](const KnownBits &Known, unsigned ShiftAmt) {<br>
+      KnownBits Result;<br>
+      Result.Zero = Known.Zero.ashr(ShiftAmt);<br>
+      Result.One = Known.One.ashr(ShiftAmt);<br>
+      return Result;<br>
     };<br>
<br>
-    computeKnownBitsFromShiftOpera<wbr>tor(I, Known, Known2, Depth, Q, KZF, KOF);<br>
+    computeKnownBitsFromShiftOpera<wbr>tor(I, Known, Known2, Depth, Q, KBF);<br>
     break;<br>
   }<br>
   case Instruction::Sub: {<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>