summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJay Foad <jay.foad@gmail.com>2012-02-27 11:00:17 +0000
committerJay Foad <jay.foad@gmail.com>2012-02-27 11:00:17 +0000
commitb4b2688db0f377605b236d81a61560657660548c (patch)
tree44ca48423f2102397097dc8a2b81036e001475a4 /include
parent5583e30818255281dc3b2122ec7207bf68b449ae (diff)
downloadllvm-b4b2688db0f377605b236d81a61560657660548c.tar.gz
llvm-b4b2688db0f377605b236d81a61560657660548c.tar.bz2
llvm-b4b2688db0f377605b236d81a61560657660548c.tar.xz
Help the compiler to eliminate some dead code when hashing an array of T
where sizeof (T) is a multiple of 4. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151523 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/ADT/Hashing.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/include/llvm/ADT/Hashing.h b/include/llvm/ADT/Hashing.h
index 27c411e322..682dc223e2 100644
--- a/include/llvm/ADT/Hashing.h
+++ b/include/llvm/ADT/Hashing.h
@@ -142,6 +142,7 @@ private:
}
// Add a range of bytes from I to E.
+ template<bool ElementsHaveEvenLength>
void addBytes(const char *I, const char *E) {
uint32_t Data;
// Note that aliasing rules forbid us from dereferencing
@@ -154,7 +155,7 @@ private:
std::memcpy(&Data, I, sizeof Data);
mix(Data);
}
- if (I != E) {
+ if (!ElementsHaveEvenLength && I != E) {
Data = 0;
std::memcpy(&Data, I, E - I);
mix(Data);
@@ -164,8 +165,9 @@ private:
// Add a range of bits from I to E.
template<typename T>
void addBits(const T *I, const T *E) {
- addBytes(reinterpret_cast<const char *>(I),
- reinterpret_cast<const char *>(E));
+ addBytes<sizeof (T) % sizeof (uint32_t) == 0>(
+ reinterpret_cast<const char *>(I),
+ reinterpret_cast<const char *>(E));
}
};