[llvm] r319624 - [ValueTracking] Pass only a single lambda to computeKnownBitsFromShiftOperator by using KnownBits struct instead of separate APInts. NFCI

Sam McCall via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 4 04:59:41 PST 2017


Hi Craig,

I reverted this commit because it seems to have caused a miscompile that
causes a bootstrapped clang to fail tests.

I don't know the code well enough to spot the problem, but the buildbots
blame this revision:
  - clang-ppc64be-linux-multistage: (r319622
<http://lab.llvm.org:8011/builders/clang-ppc64be-linux-multistage/builds/6116>,
r319624
<http://lab.llvm.org:8011/builders/clang-ppc64be-linux-multistage/builds/6117>
]
  - clang-ppc64le-linux-multistage: (r319623
<http://lab.llvm.org:8011/builders/clang-ppc64le-linux-multistage/builds/4868>
, r319626
<http://lab.llvm.org:8011/builders/clang-ppc64le-linux-multistage/builds/4869>
]

Cheers, Sam

On Sun, Dec 3, 2017 at 12:42 AM, Craig Topper via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: ctopper
> Date: Sat Dec  2 15:42:17 2017
> New Revision: 319624
>
> URL: http://llvm.org/viewvc/llvm-project?rev=319624&view=rev
> Log:
> [ValueTracking] Pass only a single lambda to computeKnownBitsFromShiftOperator
> by using KnownBits struct instead of separate APInts. NFCI
>
> Modified:
>     llvm/trunk/lib/Analysis/ValueTracking.cpp
>
> Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Analysis/ValueTracking.cpp?rev=319624&r1=319623&r2=319624&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
> +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Sat Dec  2 15:42:17 2017
> @@ -795,16 +795,14 @@ static void computeKnownBitsFromAssume(c
>  static void computeKnownBitsFromShiftOperator(
>      const Operator *I, KnownBits &Known, KnownBits &Known2,
>      unsigned Depth, const Query &Q,
> -    function_ref<APInt(const APInt &, unsigned)> KZF,
> -    function_ref<APInt(const APInt &, unsigned)> KOF) {
> +    function_ref<KnownBits(KnownBits, unsigned)> KBF) {
>    unsigned BitWidth = Known.getBitWidth();
>
>    if (auto *SA = dyn_cast<ConstantInt>(I->getOperand(1))) {
>      unsigned ShiftAmt = SA->getLimitedValue(BitWidth-1);
>
>      computeKnownBits(I->getOperand(0), Known, Depth + 1, Q);
> -    Known.Zero = KZF(Known.Zero, ShiftAmt);
> -    Known.One  = KOF(Known.One, ShiftAmt);
> +    Known = KBF(Known, ShiftAmt);
>      // If the known bits conflict, this must be an overflowing left
> shift, so
>      // the shift result is poison. We can return anything we want. Choose
> 0 for
>      // the best folding opportunity.
> @@ -869,8 +867,9 @@ static void computeKnownBitsFromShiftOpe
>          continue;
>      }
>
> -    Known.Zero &= KZF(Known2.Zero, ShiftAmt);
> -    Known.One  &= KOF(Known2.One, ShiftAmt);
> +    Known2 = KBF(Known2, ShiftAmt);
> +    Known.Zero &= Known2.Zero;
> +    Known.One  &= Known2.One;
>    }
>
>    // If the known bits conflict, the result is poison. Return a 0 and
> hope the
> @@ -1068,53 +1067,46 @@ static void computeKnownBitsFromOperator
>    case Instruction::Shl: {
>      // (shl X, C1) & C2 == 0   iff   (X & C2 >>u C1) == 0
>      bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoSignedWrap();
> -    auto KZF = [NSW](const APInt &KnownZero, unsigned ShiftAmt) {
> -      APInt KZResult = KnownZero << ShiftAmt;
> -      KZResult.setLowBits(ShiftAmt); // Low bits known 0.
> +    auto KBF = [NSW](const KnownBits &Known, unsigned ShiftAmt) {
> +      KnownBits Result;
> +      Result.Zero = Known.Zero << ShiftAmt;
> +      Result.Zero.setLowBits(ShiftAmt); // Low bits known 0.
> +      Result.One = Known.One << ShiftAmt;
>        // If this shift has "nsw" keyword, then the result is either a
> poison
>        // value or has the same sign bit as the first operand.
> -      if (NSW && KnownZero.isSignBitSet())
> -        KZResult.setSignBit();
> -      return KZResult;
> -    };
> -
> -    auto KOF = [NSW](const APInt &KnownOne, unsigned ShiftAmt) {
> -      APInt KOResult = KnownOne << ShiftAmt;
> -      if (NSW && KnownOne.isSignBitSet())
> -        KOResult.setSignBit();
> -      return KOResult;
> +      if (NSW && Known.isNonNegative())
> +        Result.Zero.setSignBit();
> +      if (NSW && Known.isNegative())
> +        Result.One.setSignBit();
> +      return Result;
>      };
>
> -    computeKnownBitsFromShiftOperator(I, Known, Known2, Depth, Q, KZF,
> KOF);
> +    computeKnownBitsFromShiftOperator(I, Known, Known2, Depth, Q, KBF);
>      break;
>    }
>    case Instruction::LShr: {
>      // (lshr X, C1) & C2 == 0   iff  (-1 >> C1) & C2 == 0
> -    auto KZF = [](const APInt &KnownZero, unsigned ShiftAmt) {
> -      APInt KZResult = KnownZero.lshr(ShiftAmt);
> -      // High bits known zero.
> -      KZResult.setHighBits(ShiftAmt);
> -      return KZResult;
> +    auto KBF = [](const KnownBits &Known, unsigned ShiftAmt) {
> +      KnownBits Result;
> +      Result.Zero = Known.Zero.lshr(ShiftAmt);
> +      Result.Zero.setHighBits(ShiftAmt); // High bits known zero.
> +      Result.One = Known.One.lshr(ShiftAmt);
> +      return Result;
>      };
>
> -    auto KOF = [](const APInt &KnownOne, unsigned ShiftAmt) {
> -      return KnownOne.lshr(ShiftAmt);
> -    };
> -
> -    computeKnownBitsFromShiftOperator(I, Known, Known2, Depth, Q, KZF,
> KOF);
> +    computeKnownBitsFromShiftOperator(I, Known, Known2, Depth, Q, KBF);
>      break;
>    }
>    case Instruction::AShr: {
>      // (ashr X, C1) & C2 == 0   iff  (-1 >> C1) & C2 == 0
> -    auto KZF = [](const APInt &KnownZero, unsigned ShiftAmt) {
> -      return KnownZero.ashr(ShiftAmt);
> -    };
> -
> -    auto KOF = [](const APInt &KnownOne, unsigned ShiftAmt) {
> -      return KnownOne.ashr(ShiftAmt);
> +    auto KBF = [](const KnownBits &Known, unsigned ShiftAmt) {
> +      KnownBits Result;
> +      Result.Zero = Known.Zero.ashr(ShiftAmt);
> +      Result.One = Known.One.ashr(ShiftAmt);
> +      return Result;
>      };
>
> -    computeKnownBitsFromShiftOperator(I, Known, Known2, Depth, Q, KZF,
> KOF);
> +    computeKnownBitsFromShiftOperator(I, Known, Known2, Depth, Q, KBF);
>      break;
>    }
>    case Instruction::Sub: {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171204/862d8a37/attachment.html>


More information about the llvm-commits mailing list