diff options
author | Jay Foad <jay.foad@gmail.com> | 2012-02-27 11:00:17 +0000 |
---|---|---|
committer | Jay Foad <jay.foad@gmail.com> | 2012-02-27 11:00:17 +0000 |
commit | b4b2688db0f377605b236d81a61560657660548c (patch) | |
tree | 44ca48423f2102397097dc8a2b81036e001475a4 /include/llvm | |
parent | 5583e30818255281dc3b2122ec7207bf68b449ae (diff) | |
download | external_llvm-b4b2688db0f377605b236d81a61560657660548c.zip external_llvm-b4b2688db0f377605b236d81a61560657660548c.tar.gz external_llvm-b4b2688db0f377605b236d81a61560657660548c.tar.bz2 |
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/llvm')
-rw-r--r-- | include/llvm/ADT/Hashing.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/include/llvm/ADT/Hashing.h b/include/llvm/ADT/Hashing.h index 27c411e..682dc22 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)); } }; |