DenseMap<uintptr_t,...> doesn't allow all values as keys.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 4 Mar 2011 02:48:56 +0000 (02:48 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 4 Mar 2011 02:48:56 +0000 (02:48 +0000)
Avoid colliding with the sentinels, hopefully unbreaking
llvm-gcc-x86_64-linux-selfhost.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126982 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/Local.cpp

index 3f789fa865897ac6f5bb3593752aabbfbc432faf..32a50b80cd52bcd3abfe3ecb5439a3a253cc26c1 100644 (file)
@@ -632,6 +632,8 @@ bool llvm::EliminateDuplicatePHINodes(BasicBlock *BB) {
       Hash ^= reinterpret_cast<uintptr_t>(static_cast<Value *>(*I));
       Hash = (Hash << 7) | (Hash >> (sizeof(uintptr_t) * CHAR_BIT - 7));
     }
+    // Avoid colliding with the DenseMap sentinels ~0 and ~0-1.
+    Hash >>= 1;
     // If we've never seen this hash value before, it's a unique PHI.
     std::pair<DenseMap<uintptr_t, PHINode *>::iterator, bool> Pair =
       HashMap.insert(std::make_pair(Hash, PN));