[cfe-commits] r153898 - /cfe/trunk/include/clang/Analysis/ProgramPoint.h

Benjamin Kramer benny.kra at googlemail.com
Mon Apr 2 14:44:59 PDT 2012


On 02.04.2012, at 23:24, Ted Kremenek wrote:

> Author: kremenek
> Date: Mon Apr  2 16:24:13 2012
> New Revision: 153898
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=153898&view=rev
> Log:
> Reduce static analyzer memory usage by about 4% by packing the ProgramPoing 'Kind' field into the spare bits of other fields.
> 
> Modified:
>    cfe/trunk/include/clang/Analysis/ProgramPoint.h
> 
> Modified: cfe/trunk/include/clang/Analysis/ProgramPoint.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/ProgramPoint.h?rev=153898&r1=153897&r2=153898&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/ProgramPoint.h (original)
> +++ cfe/trunk/include/clang/Analysis/ProgramPoint.h Mon Apr  2 16:24:13 2012
> @@ -55,27 +55,59 @@
>               EpsilonKind};
> 
> private:
> -  std::pair<const void *, const void *> Data;
> -  Kind K;
> +  std::pair<uintptr_t, const void *> Data;
> 
>   // The LocationContext could be NULL to allow ProgramPoint to be used in
>   // context insensitive analysis.
> -  const LocationContext *L;
> +  uintptr_t L;
>   const ProgramPointTag *Tag;
> 
>   ProgramPoint();
> 
> +  static uintptr_t mangleUpperKindBits(Kind K, const void *p) {
> +    uintptr_t tmp = (uintptr_t) p;
> +    uintptr_t k_int = (uintptr_t) K;
> +    k_int >>= 3;
> +    assert((k_int & 0x3) == k_int);
> +    tmp |= k_int;
> +    return tmp;
> +  }
> +  
> +  static uintptr_t mangleLowerKindBits(Kind K, const void *p) {
> +    uintptr_t tmp = (uintptr_t) p;
> +    uintptr_t k_int = (uintptr_t) K;
> +    k_int &= 0x7;
> +    tmp |= k_int;
> +    return tmp;
> +  }

You could hide some of this nastiness by using 2 llvm::PointerIntPairs with 3 bits each.

- Ben

> +  
> protected:
> -  ProgramPoint(const void *P, Kind k, const LocationContext *l,
> +  ProgramPoint(const void *P,
> +               Kind k,
> +               const LocationContext *l,
>                const ProgramPointTag *tag = 0)
> -    : Data(P, static_cast<const void*>(NULL)), K(k), L(l), Tag(tag) {}
> -
> -  ProgramPoint(const void *P1, const void *P2, Kind k, const LocationContext *l,
> +    : Data(mangleUpperKindBits(k, P), static_cast<const void*>(NULL)),
> +      L(mangleLowerKindBits(k, l)),
> +      Tag(tag) {
> +        assert(getKind() == k);
> +        assert(getLocationContext() == l);
> +        assert(getData1() == P);
> +      }
> +        
> +  ProgramPoint(const void *P1,
> +               const void *P2,
> +               Kind k,
> +               const LocationContext *l,
>                const ProgramPointTag *tag = 0)
> -    : Data(P1, P2), K(k), L(l), Tag(tag) {}
> +    : Data(mangleUpperKindBits(k, P1), P2),
> +      L(mangleLowerKindBits(k, l)),
> +      Tag(tag) {}
> 
> protected:
> -  const void *getData1() const { return Data.first; }
> +  const void *getData1() const {
> +    return (void*) (Data.first & ~((uintptr_t) 0x3));
> +  }
> +
>   const void *getData2() const { return Data.second; }
>   void setData2(const void *d) { Data.second = d; }
> 
> @@ -83,14 +115,19 @@
>   /// Create a new ProgramPoint object that is the same as the original
>   /// except for using the specified tag value.
>   ProgramPoint withTag(const ProgramPointTag *tag) const {
> -    return ProgramPoint(Data.first, Data.second, K, L, tag);
> +    return ProgramPoint(getData1(), Data.second, getKind(),
> +                        getLocationContext(), tag);
>   }
> 
> -  Kind getKind() const { return K; }
> +  Kind getKind() const {
> +    return (Kind) (((Data.first & 0x3) << 3) | (L & 0x7));
> +  }
> 
>   const ProgramPointTag *getTag() const { return Tag; }
> 
> -  const LocationContext *getLocationContext() const { return L; }
> +  const LocationContext *getLocationContext() const {
> +    return (LocationContext*) (L & ~((uintptr_t) 0x7));
> +  }
> 
>   // For use with DenseMap.  This hash is probably slow.
>   unsigned getHashValue() const {
> @@ -102,18 +139,18 @@
>   static bool classof(const ProgramPoint*) { return true; }
> 
>   bool operator==(const ProgramPoint & RHS) const {
> -    return K == RHS.K && Data == RHS.Data && L == RHS.L && Tag == RHS.Tag;
> +    return Data == RHS.Data && L == RHS.L && Tag == RHS.Tag;
>   }
> 
>   bool operator!=(const ProgramPoint &RHS) const {
> -    return K != RHS.K || Data != RHS.Data || L != RHS.L || Tag != RHS.Tag;
> +    return Data != RHS.Data || L != RHS.L || Tag != RHS.Tag;
>   }
> 
>   void Profile(llvm::FoldingSetNodeID& ID) const {
> -    ID.AddInteger((unsigned) K);
> -    ID.AddPointer(Data.first);
> +    ID.AddInteger((unsigned) getKind());
> +    ID.AddPointer(getData1());
>     ID.AddPointer(Data.second);
> -    ID.AddPointer(L);
> +    ID.AddPointer(getLocationContext());
>     ID.AddPointer(Tag);
>   }
> 
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list