[PATCH] Teach ValueTracking about address spaces

Eli Friedman eli.friedman at gmail.com
Fri Aug 2 16:51:23 PDT 2013


On Thu, Aug 1, 2013 at 2:22 PM, Matt Arsenault
<Matthew.Arsenault at amd.com> wrote:
> This is required for
>
> http://llvm-reviews.chandlerc.com/D1250
>
> I don't have a test for this using different address spaces until some other pieces are also in.
>
> http://llvm-reviews.chandlerc.com/D1262
>
> Files:
>   lib/Analysis/ValueTracking.cpp
>
> Index: lib/Analysis/ValueTracking.cpp
> ===================================================================
> --- lib/Analysis/ValueTracking.cpp
> +++ lib/Analysis/ValueTracking.cpp
> @@ -39,8 +39,8 @@
>  static unsigned getBitWidth(Type *Ty, const DataLayout *TD) {
>    if (unsigned BitWidth = Ty->getScalarSizeInBits())
>      return BitWidth;
> -  assert(isa<PointerType>(Ty) && "Expected a pointer type!");
> -  return TD ? TD->getPointerSizeInBits() : 0;
> +
> +  return TD ? TD->getPointerTypeSizeInBits(Ty) : 0;
>  }
>
>  static void ComputeMaskedBitsAddSub(bool Add, Value *Op0, Value *Op1, bool NSW,
> @@ -1704,20 +1704,25 @@
>  /// it can be expressed as a base pointer plus a constant offset.  Return the
>  /// base and offset to the caller.
>  Value *llvm::GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset,
> -                                              const DataLayout *TD) {
> +                                              const DataLayout *DL) {
>    // Without DataLayout, conservatively assume 64-bit offsets, which is
>    // the widest we support.
> -  unsigned BitWidth = TD ? TD->getPointerSizeInBits() : 64;
> +  unsigned BitWidth = DL ? DL->getPointerTypeSizeInBits(Ptr->getType()) : 64;
>    APInt ByteOffset(BitWidth, 0);
>    while (1) {
>      if (Ptr->getType()->isVectorTy())
>        break;
>
>      if (GEPOperator *GEP = dyn_cast<GEPOperator>(Ptr)) {
> -      APInt GEPOffset(BitWidth, 0);
> -      if (TD && !GEP->accumulateConstantOffset(*TD, GEPOffset))
> -        break;
> -      ByteOffset += GEPOffset;
> +      if (DL) {
> +        BitWidth = DL->getPointerTypeSizeInBits(Ptr->getType());

Why do you need to reset BitWidth every iteration of the loop?  Didn't
you already commit the verifier patches which guarantee BitWidth will
be the same for every iteration of the loop?

> +        APInt GEPOffset(BitWidth, 0);
> +        if (!GEP->accumulateConstantOffset(*DL, GEPOffset))
> +          break;
> +
> +        ByteOffset += GEPOffset;
> +      }
> +
>        Ptr = GEP->getPointerOperand();
>      } else if (Operator::getOpcode(Ptr) == Instruction::BitCast) {
>        Ptr = cast<Operator>(Ptr)->getOperand(0);
> @@ -1729,6 +1734,7 @@
>        break;
>      }
>    }
> +

Irrelevant whitespace change.

-Eli



More information about the llvm-commits mailing list