[ValueTracking] Don't set nsw flag for inbounds addition

When computing the known bits for a GEP, don't set the nsw flag
when adding an offset to an address. The nsw flag only applies to
pure offset additions (see also D90708).

The nsw flag is only used in a very minor way by the code, to the
point that I was not able to come up with a test case where it
makes a difference.

Differential Revision: https://reviews.llvm.org/D90637
This commit is contained in:
Nikita Popov 2020-11-02 19:08:37 +01:00
parent e56eea26ca
commit 92b708902e
1 changed files with 4 additions and 7 deletions

View File

@ -1289,9 +1289,6 @@ static void computeKnownBitsFromOperator(const Operator *I,
APInt AccConstIndices(BitWidth, 0, /*IsSigned*/ true);
gep_type_iterator GTI = gep_type_begin(I);
// If the inbounds keyword is not present, the offsets are added to the
// base address with silently-wrapping twos complement arithmetic.
bool IsInBounds = cast<GEPOperator>(I)->isInBounds();
for (unsigned i = 1, e = I->getNumOperands(); i != e; ++i, ++GTI) {
// TrailZ can only become smaller, short-circuit if we hit zero.
if (Known.isUnknown())
@ -1356,17 +1353,17 @@ static void computeKnownBitsFromOperator(const Operator *I,
// to the width of the pointer.
IndexBits = IndexBits.sextOrTrunc(BitWidth);
// Note that inbounds does *not* guarantee nsw for the addition, as only
// the offset is signed, while the base address is unsigned.
Known = KnownBits::computeForAddSub(
/*Add=*/true,
/*NSW=*/IsInBounds, Known, IndexBits);
/*Add=*/true, /*NSW=*/false, Known, IndexBits);
}
if (!Known.isUnknown() && !AccConstIndices.isNullValue()) {
KnownBits Index(BitWidth);
Index.Zero = ~AccConstIndices;
Index.One = AccConstIndices;
Known = KnownBits::computeForAddSub(
/*Add=*/true,
/*NSW=*/IsInBounds, Known, Index);
/*Add=*/true, /*NSW=*/false, Known, Index);
}
break;
}