summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2018-01-19 23:54:31 +0000
committerRui Ueyama <ruiu@google.com>2018-01-19 23:54:31 +0000
commit517366c7e0d9cd51b216b4788cdfaa4b00c22663 (patch)
tree5f8bea7bc10eafbf366c0463e15f66efcc2719ec
parent73ceb50d8555fa7460957a0346bcb4002e5eff42 (diff)
downloadbcm5719-llvm-517366c7e0d9cd51b216b4788cdfaa4b00c22663.tar.gz
bcm5719-llvm-517366c7e0d9cd51b216b4788cdfaa4b00c22663.zip
Make the bloom filter a bit larger.
I created https://reviews.llvm.org/D42202 to see how large the bloom filter should be. With that patch, I tested various bloom filter sizes with the following commands: $ cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_LLD=true \ -DLLVM_ENABLE_PROJECTS='clang;lld' -DBUILD_SHARED_LIBS=ON \ -DCMAKE_SHARED_LINKER_FLAGS=-Wl,-bloom-filter-bits=<some integer> \ ../llvm-project/llvm $ rm -f $(find . -name \*.so.7.0.0svn) $ ninja lld $ LD_BIND_NOW=1 perf stat bin/ld.lld Here is the result: -bloom-filter-bits=8 0.220351609 seconds -bloom-filter-bits=10 0.217146597 seconds -bloom-filter-bits=12 0.206870826 seconds -bloom-filter-bits=16 0.209456312 seconds -bloom-filter-bits=32 0.195092075 seconds Currently we allocate 8 bits for a symbol, but according to the above result, that number is not optimal. Even though the numbers follow the diminishing return rule, the point where a marginal improvement becomes too small is not -bloom-filter-bits=8 but 12. So this patch sets it to 12. Differential Revision: https://reviews.llvm.org/D42204 llvm-svn: 323010
-rw-r--r--lld/ELF/SyntheticSections.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index c46f0ccf7c4..8168eaaf103 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -1701,12 +1701,14 @@ GnuHashTableSection::GnuHashTableSection()
void GnuHashTableSection::finalizeContents() {
getParent()->Link = InX::DynSymTab->getParent()->SectionIndex;
- // Computes bloom filter size in word size. We want to allocate 8
+ // Computes bloom filter size in word size. We want to allocate 12
// bits for each symbol. It must be a power of two.
- if (Symbols.empty())
+ if (Symbols.empty()) {
MaskWords = 1;
- else
- MaskWords = NextPowerOf2((Symbols.size() - 1) / Config->Wordsize);
+ } else {
+ uint64_t NumBits = Symbols.size() * 12;
+ MaskWords = NextPowerOf2(NumBits / (Config->Wordsize * 8));
+ }
Size = 16; // Header
Size += Config->Wordsize * MaskWords; // Bloom filter
OpenPOWER on IntegriCloud