<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>