diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 5f6f5fb..78f8e2a 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -313,7 +313,7 @@ struct Node256 : Node { BitSet bitSet; Node *children[256]; int64_t childMaxVersion[256]; - constexpr static int kMaxOfMaxPageSize = 8; + constexpr static int kMaxOfMaxPageSize = 16; constexpr static int kMaxOfMaxShift = std::countr_zero(uint32_t(kMaxOfMaxPageSize)); constexpr static int kMaxOfMaxTotalPages = 256 / kMaxOfMaxPageSize; @@ -1843,13 +1843,17 @@ bool checkMaxBetweenExclusive(Node *n, int begin, int end, return result; } } - // Check inner pages - bool result = true; - for (int i = (begin >> Node256::kMaxOfMaxShift) + 1; - i < ((end - 1) >> Node256::kMaxOfMaxShift); ++i) { - result &= self->maxOfMax[i] <= readVersion; + uint64_t conflict = 0; + // Check all pages + for (int i = 0; i < Node256::kMaxOfMaxTotalPages; ++i) { + conflict |= (self->maxOfMax[i] > readVersion) << i; } - return result; + // Only keep inner pages + const int pageBegin = (begin >> Node256::kMaxOfMaxShift) + 1; + const int pageEnd = (end - 1) >> Node256::kMaxOfMaxShift; + conflict &= (1 << pageEnd) - 1; + conflict >>= pageBegin; + return !conflict; } default: // GCOVR_EXCL_LINE __builtin_unreachable(); // GCOVR_EXCL_LINE