forked from OSchip/llvm-project
[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:
parent
e56eea26ca
commit
92b708902e
|
@ -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 two’s 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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue