From 5a0bcf9a5a8f2adb034d340297e7521ba32e586b Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Mon, 18 Mar 2024 15:44:44 -0700 Subject: [PATCH] Strengthen precondition to checkRangeStartsWith and remove resulting dead code --- ConflictSet.cpp | 77 +++++++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 1c26371..67a0fa0 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -1672,7 +1672,10 @@ Vector getSearchPath(Arena &arena, Node *n) { } // GCOVR_EXCL_LINE // Return true if the max version among all keys that start with key + [child], -// where begin < child < end, is <= readVersion +// where begin < child < end, is <= readVersion. +// +// Precondition: transitively, no child of n has a search path that's a longer +// prefix of key than n bool checkRangeStartsWith(Node *n, std::span key, int begin, int end, int64_t readVersion, ConflictSet::Impl *impl) { @@ -1680,53 +1683,51 @@ bool checkRangeStartsWith(Node *n, std::span key, int begin, fprintf(stderr, "%s(%02x,%02x)*\n", printable(key).c_str(), begin, end); #endif auto remaining = key; - for (;;) { - if (remaining.size() == 0) { - return maxBetweenExclusive(n, begin, end) <= readVersion; - } + if (remaining.size() == 0) { + return maxBetweenExclusive(n, begin, end) <= readVersion; + } - auto *child = getChild(n, remaining[0]); - if (child == nullptr) { - int c = getChildGeq(n, remaining[0]); - if (c >= 0) { - n = getChildExists(n, c); + auto *child = getChild(n, remaining[0]); + if (child == nullptr) { + int c = getChildGeq(n, remaining[0]); + if (c >= 0) { + n = getChildExists(n, c); + goto downLeftSpine; + } else { + n = nextSibling(n); + goto downLeftSpine; + } + } + + n = child; + remaining = remaining.subspan(1, remaining.size() - 1); + + assert(n->partialKeyLen > 0); + { + int commonLen = std::min(n->partialKeyLen, remaining.size()); + int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen); + if (i < commonLen) { + auto c = n->partialKey()[i] <=> remaining[i]; + if (c > 0) { goto downLeftSpine; } else { n = nextSibling(n); goto downLeftSpine; } } - - n = child; - remaining = remaining.subspan(1, remaining.size() - 1); - - if (n->partialKeyLen > 0) { - int commonLen = std::min(n->partialKeyLen, remaining.size()); - int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen); - if (i < commonLen) { - auto c = n->partialKey()[i] <=> remaining[i]; - if (c > 0) { - goto downLeftSpine; - } else { - n = nextSibling(n); - goto downLeftSpine; - } - } - if (commonLen == n->partialKeyLen) { - // partial key matches - remaining = remaining.subspan(commonLen, remaining.size() - commonLen); - } else if (n->partialKeyLen > int(remaining.size())) { - if (begin < n->partialKey()[remaining.size()] && - n->partialKey()[remaining.size()] < end) { - if (n->entryPresent && n->entry.rangeVersion > readVersion) { - return false; - } - return maxVersion(n, impl) <= readVersion; - } - return true; + assert(n->partialKeyLen > int(remaining.size())); + if (begin < n->partialKey()[remaining.size()] && + n->partialKey()[remaining.size()] < end) { + if (n->entryPresent && n->entry.rangeVersion > readVersion) { + return false; } + return maxVersion(n, impl) <= readVersion; } + return true; } + + __builtin_unreachable(); // GCOVR_EXCL_LINE + downLeftSpine: if (n == nullptr) { return true;