9#ifndef LLVM_EXECUTIONENGINE_ORC_SHARED_SYMBOLFILTER_H
10#define LLVM_EXECUTIONENGINE_ORC_SHARED_SYMBOLFILTER_H
38 initialize(SymbolCount, FalsePositiveRate);
48 return !
isEmpty() && testHash(HashFn(Sym));
51 bool isEmpty()
const {
return SymbolCount == 0; }
56 static constexpr
uint32_t BitsPerEntry = 64;
62 std::vector<uint64_t> BloomTable;
65 void
initialize(uint32_t SymCount, float FalsePositiveRate) {
67 SymbolCount = SymCount;
70 float ln2 = std::log(2.0f);
71 float M = -1.0f * SymbolCount * std::log(FalsePositiveRate) / (ln2 * ln2);
72 BloomSize =
static_cast<uint32_t>(std::ceil(M / BitsPerEntry));
73 BloomShift = std::min(6u, log2ceil(SymbolCount));
74 BloomTable.resize(BloomSize, 0);
79 uint32_t N = (Hash / BitsPerEntry) % BloomSize;
81 (1ULL << (Hash % BitsPerEntry)) | (1ULL << (Hash2 % BitsPerEntry));
82 BloomTable[
N] |= Mask;
87 uint32_t N = (Hash / BitsPerEntry) % BloomSize;
89 (1ULL << (Hash % BitsPerEntry)) | (1ULL << (Hash2 % BitsPerEntry));
90 return (BloomTable[
N] & Mask) == Mask;
93 static constexpr uint32_t log2ceil(uint32_t V) {
105 assert(Rate > 0.0f && Rate < 1.0f);
106 FalsePositiveRate = Rate;
111 HashFn = std::move(Fn);
116 assert(!Symbols.empty() &&
"Cannot build filter from empty symbol list.");
119 for (
const auto &Sym : Symbols)
126 float FalsePositiveRate = 0.02f;
140 return SPSBloomFilter::AsArgList::size(
146 return SPSBloomFilter::AsArgList::serialize(
153 uint32_t SymbolCount = 0, BloomSize = 0, BloomShift = 0;
154 std::vector<uint64_t> BloomTable;
156 if (!SPSBloomFilter::AsArgList::deserialize(
157 IB, IsInitialized, SymbolCount, BloomSize, BloomShift, BloomTable))
160 Filter.Initialized = IsInitialized;
161 Filter.SymbolCount = SymbolCount;
162 Filter.BloomSize = BloomSize;
163 Filter.BloomShift = BloomShift;
164 Filter.BloomTable = std::move(BloomTable);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringLiteral > StandardNames)
Initialize the set of available library functions based on the specified target triple.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
StringRef - Represent a constant reference to a string, i.e.
BloomFilter::HashFunc HashFunc
BloomFilterBuilder & setFalsePositiveRate(float Rate)
BloomFilterBuilder()=default
BloomFilterBuilder & setHashFunction(HashFunc Fn)
BloomFilter build(ArrayRef< StringRef > Symbols) const
bool isInitialized() const
std::function< uint32_t(StringRef)> HashFunc
BloomFilter(BloomFilter &&) noexcept=default
bool mayContain(StringRef Sym) const
Output char buffer with overflow check.
static bool serialize(SPSOutputBuffer &OB, const BloomFilter &Filter)
static bool deserialize(SPSInputBuffer &IB, BloomFilter &Filter)
static size_t size(const BloomFilter &Filter)
Specialize to describe how to serialize/deserialize to/from the given concrete type.
@ C
The default llvm calling convention, compatible with C.
SPSTuple< bool, uint32_t, uint32_t, uint32_t, SPSSequence< uint64_t > > SPSBloomFilter
This is an optimization pass for GlobalISel generic memory operations.
int countl_zero(T Val)
Count number of 0's from the most significant bit to the least stopping at the first 1.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Implement std::hash so that hash_code can be used in STL containers.