[llvm] r311789 - [InstCombine] Don't fall back to only calling computeKnownBits if the upper bit of Add/Sub is demanded.
Andrew Adams via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 28 10:58:07 PDT 2017
I have a buildbot breakage that started nearby this commit. This looks like
the most likely culprit. Bug report here:
https://bugs.llvm.org/show_bug.cgi?id=34349
- Andrew
On Fri, Aug 25, 2017 at 11:39 AM, Craig Topper via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: ctopper
> Date: Fri Aug 25 11:39:40 2017
> New Revision: 311789
>
> URL: http://llvm.org/viewvc/llvm-project?rev=311789&view=rev
> Log:
> [InstCombine] Don't fall back to only calling computeKnownBits if the
> upper bit of Add/Sub is demanded.
>
> Just create an all 1s demanded mask and continue recursing like normal.
> The recursive calls should be able to handle an all 1s mask and do the
> right thing.
>
> The only time we should care about knowing whether the upper bit was
> demanded is when we need to know if we should clear the NSW/NUW flags.
>
> Now that we have a consistent path through the code for all cases, use
> KnownBits::computeForAddSub to compute the known bits at the end since we
> already have the LHS and RHS.
>
> My larger goal here is to move the code that turns add into xor if only 1
> bit is demanded and no bits below it are non-zero from
> InstCombiner::OptAndOp to here. This will allow it to be more general
> instead of just looking for 'add' and 'and' with constant RHS.
>
> Differential Revision: https://reviews.llvm.org/D36486
>
> Modified:
> llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/
> InstCombineSimplifyDemanded.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Transforms/InstCombine/InstCombineSimplifyDemanded.
> cpp?rev=311789&r1=311788&r2=311789&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
> Fri Aug 25 11:39:40 2017
> @@ -396,38 +396,39 @@ Value *InstCombiner::SimplifyDemandedUse
> /// If the high-bits of an ADD/SUB are not demanded, then we do not
> care
> /// about the high bits of the operands.
> unsigned NLZ = DemandedMask.countLeadingZeros();
> - if (NLZ > 0) {
> - // Right fill the mask of bits for this ADD/SUB to demand the most
> - // significant bit and all those below it.
> - APInt DemandedFromOps(APInt::getLowBitsSet(BitWidth,
> BitWidth-NLZ));
> - if (ShrinkDemandedConstant(I, 0, DemandedFromOps) ||
> - SimplifyDemandedBits(I, 0, DemandedFromOps, LHSKnown, Depth +
> 1) ||
> - ShrinkDemandedConstant(I, 1, DemandedFromOps) ||
> - SimplifyDemandedBits(I, 1, DemandedFromOps, RHSKnown, Depth +
> 1)) {
> + // Right fill the mask of bits for this ADD/SUB to demand the most
> + // significant bit and all those below it.
> + APInt DemandedFromOps(APInt::getLowBitsSet(BitWidth, BitWidth-NLZ));
> + if (ShrinkDemandedConstant(I, 0, DemandedFromOps) ||
> + SimplifyDemandedBits(I, 0, DemandedFromOps, LHSKnown, Depth + 1)
> ||
> + ShrinkDemandedConstant(I, 1, DemandedFromOps) ||
> + SimplifyDemandedBits(I, 1, DemandedFromOps, RHSKnown, Depth + 1))
> {
> + if (NLZ > 0) {
> // Disable the nsw and nuw flags here: We can no longer guarantee
> that
> // we won't wrap after simplification. Removing the nsw/nuw flags
> is
> // legal here because the top bit is not demanded.
> BinaryOperator &BinOP = *cast<BinaryOperator>(I);
> BinOP.setHasNoSignedWrap(false);
> BinOP.setHasNoUnsignedWrap(false);
> - return I;
> }
> -
> - // If we are known to be adding/subtracting zeros to every bit below
> - // the highest demanded bit, we just return the other side.
> - if (DemandedFromOps.isSubsetOf(RHSKnown.Zero))
> - return I->getOperand(0);
> - // We can't do this with the LHS for subtraction, unless we are only
> - // demanding the LSB.
> - if ((I->getOpcode() == Instruction::Add ||
> - DemandedFromOps.isOneValue()) &&
> - DemandedFromOps.isSubsetOf(LHSKnown.Zero))
> - return I->getOperand(1);
> + return I;
> }
>
> - // Otherwise just hand the add/sub off to computeKnownBits to fill in
> - // the known zeros and ones.
> - computeKnownBits(V, Known, Depth, CxtI);
> + // If we are known to be adding/subtracting zeros to every bit below
> + // the highest demanded bit, we just return the other side.
> + if (DemandedFromOps.isSubsetOf(RHSKnown.Zero))
> + return I->getOperand(0);
> + // We can't do this with the LHS for subtraction, unless we are only
> + // demanding the LSB.
> + if ((I->getOpcode() == Instruction::Add ||
> + DemandedFromOps.isOneValue()) &&
> + DemandedFromOps.isSubsetOf(LHSKnown.Zero))
> + return I->getOperand(1);
> +
> + // Otherwise just compute the known bits of the result.
> + bool NSW = cast<OverflowingBinaryOperator>(I)->hasNoUnsignedWrap();
> + Known = KnownBits::computeForAddSub(I->getOpcode() ==
> Instruction::Add,
> + NSW, LHSKnown, RHSKnown);
> break;
> }
> case Instruction::Shl: {
>
>
> _______________________________________________
> 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/20170828/3bd07ac5/attachment.html>
More information about the llvm-commits
mailing list