diff --git a/llvm/lib/Support/FoldingSet.cpp b/llvm/lib/Support/FoldingSet.cpp index a27d3174a4fd..c9bca7f4c1ab 100644 --- a/llvm/lib/Support/FoldingSet.cpp +++ b/llvm/lib/Support/FoldingSet.cpp @@ -54,8 +54,9 @@ void FoldingSetNodeID::AddPointer(const void *Ptr) { // depend on the host. It doesn't matter, however, because hashing on // pointer values is inherently unstable. Nothing should depend on the // ordering of nodes in the folding set. - Bits.append(reinterpret_cast(&Ptr), - reinterpret_cast(&Ptr+1)); + static_assert(sizeof(uintptr_t) <= sizeof(unsigned long long), + "unexpected pointer size"); + AddInteger(reinterpret_cast(Ptr)); } void FoldingSetNodeID::AddInteger(signed I) { Bits.push_back(I); @@ -80,8 +81,7 @@ void FoldingSetNodeID::AddInteger(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)); + AddInteger(unsigned(I >> 32)); } void FoldingSetNodeID::AddString(StringRef String) { diff --git a/llvm/unittests/ADT/FoldingSet.cpp b/llvm/unittests/ADT/FoldingSet.cpp index 927ef313cb93..696463881195 100644 --- a/llvm/unittests/ADT/FoldingSet.cpp +++ b/llvm/unittests/ADT/FoldingSet.cpp @@ -35,6 +35,27 @@ TEST(FoldingSetTest, UnalignedStringTest) { EXPECT_EQ(a.ComputeHash(), b.ComputeHash()); } +TEST(FoldingSetTest, LongLongComparison) { + struct LongLongContainer : FoldingSetNode { + unsigned long long A, B; + LongLongContainer(unsigned long long A, unsigned long long B) + : A(A), B(B) {} + void Profile(FoldingSetNodeID &ID) const { + ID.AddInteger(A); + ID.AddInteger(B); + } + }; + + LongLongContainer C1((1ULL << 32) + 1, 1ULL); + LongLongContainer C2(1ULL, (1ULL << 32) + 1); + + FoldingSet Set; + + EXPECT_EQ(&C1, Set.GetOrInsertNode(&C1)); + EXPECT_EQ(&C2, Set.GetOrInsertNode(&C2)); + EXPECT_EQ(2U, Set.size()); +} + struct TrivialPair : public FoldingSetNode { unsigned Key = 0; unsigned Value = 0;