mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
PR30711: Fix incorrect profiling of 'long long' in FoldingSet, then use it to
fix TBAA violation in profiling of pointers. llvm-svn: 284336
This commit is contained in:
parent
de787f6ced
commit
9a14f428e4
@ -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<unsigned *>(&Ptr),
|
||||
reinterpret_cast<unsigned *>(&Ptr+1));
|
||||
static_assert(sizeof(uintptr_t) <= sizeof(unsigned long long),
|
||||
"unexpected pointer size");
|
||||
AddInteger(reinterpret_cast<uintptr_t>(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) {
|
||||
|
@ -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<LongLongContainer> 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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user