[llvm-commits] [llvm] r152300 - in /llvm/trunk: include/llvm/ADT/FoldingSet.h lib/Support/FoldingSet.cpp

Benjamin Kramer benny.kra at googlemail.com
Thu Mar 8 04:44:17 PST 2012


On 08.03.2012, at 08:50, Daniel Dunbar <daniel at zuster.org> wrote:

> Author: ddunbar
> Date: Thu Mar  8 01:42:18 2012
> New Revision: 152300
>
> URL: http://llvm.org/viewvc/llvm-project?rev=152300&view=rev
> Log:
> [ADT] Change the trivial FoldingSetNodeID::Add* methods to be inline, reapplied
> with a fix for the longstanding over-read of 32-bit pointer values.

I don't see how the old code would over-read on a 32 bit pointer.
append(&Ptr, &Ptr+1) is just a funky way to write push_back when ptr
has the same size as the elements in the vector. Remember that this
method is very hot, so not calling push_back twice is goodness.

- Ben
>
> Modified:
>    llvm/trunk/include/llvm/ADT/FoldingSet.h
>    llvm/trunk/lib/Support/FoldingSet.cpp
>
> Modified: llvm/trunk/include/llvm/ADT/FoldingSet.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/FoldingSet.h?rev=152300&r1=152299&r2=152300&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/FoldingSet.h (original)
> +++ llvm/trunk/include/llvm/ADT/FoldingSet.h Thu Mar  8 01:42:18 2012
> @@ -17,6 +17,7 @@
> #define LLVM_ADT_FOLDINGSET_H
>
> #include "llvm/Support/DataTypes.h"
> +#include "llvm/Support/ErrorHandling.h"
> #include "llvm/ADT/SmallVector.h"
> #include "llvm/ADT/StringRef.h"
>
> @@ -310,6 +311,7 @@
>   void AddInteger(unsigned long long I);
>   void AddBoolean(bool B) { AddInteger(B ? 1U : 0U); }
>   void AddString(StringRef String);
> +  /// AddNodeID - Adds the Bit data of another ID to *this.
>   void AddNodeID(const FoldingSetNodeID &ID);
>
>   template <typename T>
> @@ -675,6 +677,55 @@
>     ID.AddPointer(X);
>   }
> };
> +
> +//===----------------------------------------------------------------------===//
> +// FoldingSetNodeID Inline function definitions
> +
> +/// Add* - Add various data types to Bit data.
> +///
> +inline void FoldingSetNodeID::AddPointer(const void *Ptr) {
> +  // Note: this adds pointers to the hash using sizes and endianness that
> +  // depend on the host.  It doesn't matter however, because hashing on
> +  // pointer values in inherently unstable.  Nothing  should depend on the
> +  // ordering of nodes in the folding set.
> +  if (sizeof(void*) == sizeof(unsigned))
> +    AddInteger((unsigned) (unsigned long long) Ptr);
> +  else if (sizeof(void*) == sizeof(unsigned long long)) {
> +    AddInteger((unsigned long long) Ptr);
> +  } else {
> +    llvm_unreachable("unexpected sizeof(void*)");
> +  }
> +}
> +inline void FoldingSetNodeID::AddInteger(signed I) {
> +  Bits.push_back(I);
> +}
> +inline void FoldingSetNodeID::AddInteger(unsigned I) {
> +  Bits.push_back(I);
> +}
> +inline void FoldingSetNodeID::AddInteger(long I) {
> +  AddInteger((unsigned long)I);
> +}
> +inline void FoldingSetNodeID::AddInteger(unsigned long I) {
> +  if (sizeof(long) == sizeof(int))
> +    AddInteger(unsigned(I));
> +  else if (sizeof(long) == sizeof(long long)) {
> +    AddInteger((unsigned long long)I);
> +  } else {
> +    llvm_unreachable("unexpected sizeof(long)");
> +  }
> +}
> +inline void FoldingSetNodeID::AddInteger(long long I) {
> +  AddInteger((unsigned long long)I);
> +}
> +inline void FoldingSetNodeID::AddInteger(unsigned long long I) {
> +  AddInteger(unsigned(I));
> +  if ((uint64_t)(unsigned)I != I)
> +    Bits.push_back(unsigned(I >> 32));
> +}
> +inline void FoldingSetNodeID::AddNodeID(const FoldingSetNodeID &ID) {
> +  Bits.append(ID.Bits.begin(), ID.Bits.end());
> +}
> +
> } // End of namespace llvm.
>
> #endif
>
> Modified: llvm/trunk/lib/Support/FoldingSet.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FoldingSet.cpp?rev=152300&r1=152299&r2=152300&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/FoldingSet.cpp (original)
> +++ llvm/trunk/lib/Support/FoldingSet.cpp Thu Mar  8 01:42:18 2012
> @@ -41,43 +41,6 @@
> //===----------------------------------------------------------------------===//
> // FoldingSetNodeID Implementation
>
> -/// Add* - Add various data types to Bit data.
> -///
> -void FoldingSetNodeID::AddPointer(const void *Ptr) {
> -  // Note: this adds pointers to the hash using sizes and endianness that
> -  // depend on the host.  It doesn't matter however, because hashing on
> -  // pointer values in inherently unstable.  Nothing  should depend on the
> -  // ordering of nodes in the folding set.
> -  Bits.append(reinterpret_cast<unsigned *>(&Ptr),
> -              reinterpret_cast<unsigned *>(&Ptr+1));
> -}
> -void FoldingSetNodeID::AddInteger(signed I) {
> -  Bits.push_back(I);
> -}
> -void FoldingSetNodeID::AddInteger(unsigned I) {
> -  Bits.push_back(I);
> -}
> -void FoldingSetNodeID::AddInteger(long I) {
> -  AddInteger((unsigned long)I);
> -}
> -void FoldingSetNodeID::AddInteger(unsigned long I) {
> -  if (sizeof(long) == sizeof(int))
> -    AddInteger(unsigned(I));
> -  else if (sizeof(long) == sizeof(long long)) {
> -    AddInteger((unsigned long long)I);
> -  } else {
> -    llvm_unreachable("unexpected sizeof(long)");
> -  }
> -}
> -void FoldingSetNodeID::AddInteger(long long I) {
> -  AddInteger((unsigned long long)I);
> -}
> -void FoldingSetNodeID::AddInteger(unsigned long long I) {
> -  AddInteger(unsigned(I));
> -  if ((uint64_t)(unsigned)I != I)
> -    Bits.push_back(unsigned(I >> 32));
> -}
> -
> void FoldingSetNodeID::AddString(StringRef String) {
>   unsigned Size =  String.size();
>   Bits.push_back(Size);
> @@ -129,12 +92,7 @@
>   Bits.push_back(V);
> }
>
> -// AddNodeID - Adds the Bit data of another ID to *this.
> -void FoldingSetNodeID::AddNodeID(const FoldingSetNodeID &ID) {
> -  Bits.append(ID.Bits.begin(), ID.Bits.end());
> -}
> -
> -/// ComputeHash - Compute a strong hash value for this FoldingSetNodeID, used to
> +/// ComputeHash - Compute a strong hash value for this FoldingSetNodeID, used to
> /// lookup the node in the FoldingSetImpl.
> unsigned FoldingSetNodeID::ComputeHash() const {
>   return FoldingSetNodeIDRef(Bits.data(), Bits.size()).ComputeHash();
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list