Commit 71ca4d5e authored by Giuseppe Ottaviano's avatar Giuseppe Ottaviano Committed by Facebook Github Bot

Do not store inner_ in EliasFanoReader and BitVectorReader

Summary: It is not used anywhere except for `previousValue`, but there it can be computed from the other fields. This reduces the `EliasFanoReader` size by 8 bytes.

Reviewed By: philippv, yfeldblum

Differential Revision: D4976704

fbshipit-source-id: 62bc63248b66649e483b59cb9ddf48dfd2c0e992
parent 0b988b15
...@@ -260,7 +260,6 @@ class BitVectorReader { ...@@ -260,7 +260,6 @@ class BitVectorReader {
void reset() { void reset() {
block_ = (bits_ != nullptr) ? folly::loadUnaligned<uint64_t>(bits_) : 0; block_ = (bits_ != nullptr) ? folly::loadUnaligned<uint64_t>(bits_) : 0;
outer_ = 0; outer_ = 0;
inner_ = -1;
position_ = -1; position_ = -1;
value_ = kInvalidValue; value_ = kInvalidValue;
} }
...@@ -276,10 +275,10 @@ class BitVectorReader { ...@@ -276,10 +275,10 @@ class BitVectorReader {
} }
++position_; ++position_;
inner_ = Instructions::ctz(block_); auto inner = Instructions::ctz(block_);
block_ = Instructions::blsr(block_); block_ = Instructions::blsr(block_);
return setValue(); return setValue(inner);
} }
bool skip(size_t n) { bool skip(size_t n) {
...@@ -306,7 +305,6 @@ class BitVectorReader { ...@@ -306,7 +305,6 @@ class BitVectorReader {
reposition(dest); reposition(dest);
n = position_ + 1 - steps * Encoder::forwardQuantum; n = position_ + 1 - steps * Encoder::forwardQuantum;
// Correct inner_ will be set at the end.
} }
size_t cnt; size_t cnt;
...@@ -319,10 +317,10 @@ class BitVectorReader { ...@@ -319,10 +317,10 @@ class BitVectorReader {
// Skip to the n-th one in the block. // Skip to the n-th one in the block.
DCHECK_GT(n, 0); DCHECK_GT(n, 0);
inner_ = select64<Instructions>(block_, n - 1); auto inner = select64<Instructions>(block_, n - 1);
block_ &= (uint64_t(-1) << inner_) << 1; block_ &= (uint64_t(-1) << inner) << 1;
return setValue(); return setValue(inner);
} }
bool skipTo(ValueType v) { bool skipTo(ValueType v) {
...@@ -371,10 +369,10 @@ class BitVectorReader { ...@@ -371,10 +369,10 @@ class BitVectorReader {
block_ = folly::loadUnaligned<uint64_t>(bits_ + outer_); block_ = folly::loadUnaligned<uint64_t>(bits_ + outer_);
} }
inner_ = Instructions::ctz(block_); auto inner = Instructions::ctz(block_);
block_ = Instructions::blsr(block_); block_ = Instructions::blsr(block_);
setValue(); setValue(inner);
return true; return true;
} }
...@@ -410,8 +408,8 @@ class BitVectorReader { ...@@ -410,8 +408,8 @@ class BitVectorReader {
constexpr static ValueType kInvalidValue = constexpr static ValueType kInvalidValue =
std::numeric_limits<ValueType>::max(); // Must hold kInvalidValue + 1 == 0. std::numeric_limits<ValueType>::max(); // Must hold kInvalidValue + 1 == 0.
bool setValue() { bool setValue(size_t inner) {
value_ = static_cast<ValueType>(8 * outer_ + inner_); value_ = static_cast<ValueType>(8 * outer_ + inner);
return true; return true;
} }
...@@ -425,7 +423,6 @@ class BitVectorReader { ...@@ -425,7 +423,6 @@ class BitVectorReader {
constexpr static size_t kLinearScanThreshold = 4; constexpr static size_t kLinearScanThreshold = 4;
size_t outer_; size_t outer_;
size_t inner_;
size_t position_; size_t position_;
uint64_t block_; uint64_t block_;
ValueType value_; ValueType value_;
......
...@@ -347,7 +347,6 @@ class UpperBitsReader { ...@@ -347,7 +347,6 @@ class UpperBitsReader {
void reset() { void reset() {
block_ = start_ != nullptr ? folly::loadUnaligned<block_t>(start_) : 0; block_ = start_ != nullptr ? folly::loadUnaligned<block_t>(start_) : 0;
outer_ = 0; outer_ = 0;
inner_ = std::numeric_limits<size_t>::max();
position_ = std::numeric_limits<size_t>::max(); position_ = std::numeric_limits<size_t>::max();
value_ = 0; value_ = 0;
} }
...@@ -363,10 +362,10 @@ class UpperBitsReader { ...@@ -363,10 +362,10 @@ class UpperBitsReader {
} }
++position_; ++position_;
inner_ = size_t(Instructions::ctz(block_)); size_t inner = Instructions::ctz(block_);
block_ = Instructions::blsr(block_); block_ = Instructions::blsr(block_);
return setValue(); return setValue(inner);
} }
ValueType skip(size_t n) { ValueType skip(size_t n) {
...@@ -383,7 +382,6 @@ class UpperBitsReader { ...@@ -383,7 +382,6 @@ class UpperBitsReader {
reposition(dest + steps * Encoder::forwardQuantum); reposition(dest + steps * Encoder::forwardQuantum);
n = position_ + 1 - steps * Encoder::forwardQuantum; // n is > 0. n = position_ + 1 - steps * Encoder::forwardQuantum; // n is > 0.
// Correct inner_ will be set at the end.
} }
size_t cnt; size_t cnt;
...@@ -396,10 +394,10 @@ class UpperBitsReader { ...@@ -396,10 +394,10 @@ class UpperBitsReader {
// Skip to the n-th one in the block. // Skip to the n-th one in the block.
DCHECK_GT(n, 0); DCHECK_GT(n, 0);
inner_ = select64<Instructions>(block_, n - 1); size_t inner = select64<Instructions>(block_, n - 1);
block_ &= (block_t(-1) << inner_) << 1; block_ &= (block_t(-1) << inner) << 1;
return setValue(); return setValue(inner);
} }
// Skip to the first element that is >= v and located *after* the current // Skip to the first element that is >= v and located *after* the current
...@@ -417,8 +415,7 @@ class UpperBitsReader { ...@@ -417,8 +415,7 @@ class UpperBitsReader {
reposition(dest + Encoder::skipQuantum * steps); reposition(dest + Encoder::skipQuantum * steps);
position_ = dest - 1; position_ = dest - 1;
// Correct inner_ and value_ will be set during the next() // Correct value_ will be set during the next() call at the end.
// call at the end.
// NOTE: Corresponding block of lower bits sequence may be // NOTE: Corresponding block of lower bits sequence may be
// prefetched here (via __builtin_prefetch), but experiments // prefetched here (via __builtin_prefetch), but experiments
...@@ -470,8 +467,9 @@ class UpperBitsReader { ...@@ -470,8 +467,9 @@ class UpperBitsReader {
DCHECK_GT(position(), 0); DCHECK_GT(position(), 0);
size_t outer = outer_; size_t outer = outer_;
auto inner = size_t(value_) - 8 * outer_ + position_;
block_t block = folly::loadUnaligned<block_t>(start_ + outer); block_t block = folly::loadUnaligned<block_t>(start_ + outer);
block &= (block_t(1) << inner_) - 1; block &= (block_t(1) << inner) - 1;
while (UNLIKELY(block == 0)) { while (UNLIKELY(block == 0)) {
DCHECK_GT(outer, 0); DCHECK_GT(outer, 0);
...@@ -479,7 +477,7 @@ class UpperBitsReader { ...@@ -479,7 +477,7 @@ class UpperBitsReader {
block = folly::loadUnaligned<block_t>(start_ + outer); block = folly::loadUnaligned<block_t>(start_ + outer);
} }
auto inner = 8 * sizeof(block_t) - 1 - Instructions::clz(block); inner = 8 * sizeof(block_t) - 1 - Instructions::clz(block);
return static_cast<ValueType>(8 * outer + inner - (position_ - 1)); return static_cast<ValueType>(8 * outer + inner - (position_ - 1));
} }
...@@ -488,8 +486,8 @@ class UpperBitsReader { ...@@ -488,8 +486,8 @@ class UpperBitsReader {
} }
private: private:
ValueType setValue() { ValueType setValue(size_t inner) {
value_ = static_cast<ValueType>(8 * outer_ + inner_ - position_); value_ = static_cast<ValueType>(8 * outer_ + inner - position_);
return value_; return value_;
} }
...@@ -505,7 +503,6 @@ class UpperBitsReader { ...@@ -505,7 +503,6 @@ class UpperBitsReader {
const unsigned char* const start_; const unsigned char* const start_;
block_t block_; block_t block_;
size_t outer_; // Outer offset: number of consumed bytes in upper. size_t outer_; // Outer offset: number of consumed bytes in upper.
size_t inner_; // Inner offset: (bit) position in current block.
size_t position_; // Index of current value (= #reads - 1). size_t position_; // Index of current value (= #reads - 1).
ValueType value_; ValueType value_;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment