From: Nikita Popov Date: Mon, 2 Nov 2020 18:08:37 +0000 (+0100) Subject: [ValueTracking] Don't set nsw flag for inbounds addition X-Git-Tag: llvmorg-13-init~6144 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=92b708902e1db30a976e168111be5bbe81ee8191;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 0a18718..e6d3727 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -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(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; }