Remove some usages of generic getFirstChild

This commit is contained in:
2024-11-20 21:43:47 -08:00
parent 7c01f8ba0f
commit 90fb2a9542

View File

@@ -1379,6 +1379,12 @@ TaggedNodePointer getFirstChild(Node *self) {
// GCOVR_EXCL_STOP
}
bool checkRangeVersionOfFirstGeq(Node *node, InternalVersionT readVersion) {
for (; !node->entryPresent; node = getFirstChild(node)) {
}
return node->entry.rangeVersion <= readVersion;
}
// self must not be the root
void maybeDecreaseCapacity(Node *&self, WriteContext *writeContext,
ConflictSet::Impl *impl);
@@ -2676,13 +2682,13 @@ bool checkRangeStartsWith(NodeT *nTyped, TrivialSpan key, int begin, int end,
auto c = getChildGeq(nTyped, remaining[0]);
if (c != nullptr) {
n = c;
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
} else {
n = nextSibling(nTyped);
if (n == nullptr) {
return true;
}
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
@@ -2696,13 +2702,13 @@ bool checkRangeStartsWith(NodeT *nTyped, TrivialSpan key, int begin, int end,
if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) {
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
} else {
n = nextSibling(n);
if (n == nullptr) {
return true;
}
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
assert(n->partialKeyLen > remaining.size());
@@ -2717,11 +2723,6 @@ bool checkRangeStartsWith(NodeT *nTyped, TrivialSpan key, int begin, int end,
}
__builtin_unreachable(); // GCOVR_EXCL_LINE
downLeftSpine:
for (; !n->entryPresent; n = getFirstChild(n)) {
}
return n->entry.rangeVersion <= readVersion;
}
#ifdef __x86_64__
@@ -4434,7 +4435,7 @@ bool checkPointRead(Node *n, const TrivialSpan key,
return n->entry.pointVersion <= readVersion;
}
n = getFirstChild(n);
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
auto [c, maxV] = getChildAndMaxVersion(n, remaining[0]);
@@ -4443,13 +4444,13 @@ bool checkPointRead(Node *n, const TrivialSpan key,
auto c = getChildGeq(n, remaining[0]);
if (c != nullptr) {
n = c;
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
} else {
n = nextSibling(n);
if (n == nullptr) {
return true;
}
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
@@ -4462,13 +4463,13 @@ bool checkPointRead(Node *n, const TrivialSpan key,
if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) {
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
} else {
n = nextSibling(n);
if (n == nullptr) {
return true;
}
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
if (commonLen == n->partialKeyLen) {
@@ -4477,7 +4478,7 @@ bool checkPointRead(Node *n, const TrivialSpan key,
} else if (n->partialKeyLen > remaining.size()) {
// n is the first physical node greater than remaining, and there's no
// eq node
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
@@ -4486,10 +4487,6 @@ bool checkPointRead(Node *n, const TrivialSpan key,
return true;
}
}
downLeftSpine:
for (; !n->entryPresent; n = getFirstChild(n)) {
}
return n->entry.rangeVersion <= readVersion;
}
// Logically this is the same as performing firstGeq and then checking against
@@ -4514,13 +4511,13 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
auto c = getChildGeq(n, remaining[0]);
if (c != nullptr) {
n = c;
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
} else {
n = nextSibling(n);
if (n == nullptr) {
return true;
}
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
@@ -4533,13 +4530,13 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) {
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
} else {
n = nextSibling(n);
if (n == nullptr) {
return true;
}
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
if (commonLen == n->partialKeyLen) {
@@ -4552,7 +4549,7 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
if (maxV > readVersion) {
return false;
}
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
@@ -4561,10 +4558,6 @@ bool checkPrefixRead(Node *n, const TrivialSpan key,
return true;
}
}
downLeftSpine:
for (; !n->entryPresent; n = getFirstChild(n)) {
}
return n->entry.rangeVersion <= readVersion;
}
// Return true if the max version among all keys that start with key[:prefixLen]
@@ -4594,7 +4587,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
if (c != nullptr) {
if (searchPathLen < prefixLen) {
n = c;
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
n = c;
return maxVersion(n) <= readVersion;
@@ -4603,7 +4596,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
if (n == nullptr) {
return true;
}
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
@@ -4619,7 +4612,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) {
if (searchPathLen < prefixLen) {
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
if (n->entryPresent && n->entry.rangeVersion > readVersion) {
return false;
@@ -4630,7 +4623,7 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
if (n == nullptr) {
return true;
}
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
if (commonLen == n->partialKeyLen) {
@@ -4648,10 +4641,6 @@ bool checkRangeLeftSide(Node *n, TrivialSpan key, int prefixLen,
return true;
}
}
downLeftSpine:
for (; !n->entryPresent; n = getFirstChild(n)) {
}
return n->entry.rangeVersion <= readVersion;
}
// Return true if the max version among all keys that start with key[:prefixLen]
@@ -4665,7 +4654,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
for (;; ++readContext->range_read_iterations_accum) {
assert(searchPathLen <= key.size());
if (remaining.size() == 0) {
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
if (searchPathLen >= prefixLen) {
@@ -4689,7 +4678,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
auto c = getChildGeq(n, remaining[0]);
if (c != nullptr) {
n = c;
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
} else {
goto backtrack;
}
@@ -4707,7 +4696,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
++searchPathLen;
auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) {
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
} else {
if (searchPathLen > prefixLen && n->entryPresent &&
n->entry.rangeVersion > readVersion) {
@@ -4720,7 +4709,7 @@ bool checkRangeRightSide(Node *n, TrivialSpan key, int prefixLen,
// partial key matches
remaining = remaining.subspan(commonLen, remaining.size() - commonLen);
} else if (n->partialKeyLen > remaining.size()) {
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
}
@@ -4739,13 +4728,9 @@ backtrack:
n = n->parent;
} else {
n = next;
goto downLeftSpine;
return checkRangeVersionOfFirstGeq(n, readVersion);
}
}
downLeftSpine:
for (; !n->entryPresent; n = getFirstChild(n)) {
}
return n->entry.rangeVersion <= readVersion;
}
bool checkRangeRead(Node *n, TrivialSpan begin, TrivialSpan end,
InternalVersionT readVersion, ReadContext *readContext) {