Inline SearchStepWise into checkRangeRead

This improves clang codegen
This commit is contained in:
2024-08-06 14:45:52 -07:00
parent 09cf807747
commit d89028dd2f

View File

@@ -1849,43 +1849,6 @@ int longestCommonPrefix(const uint8_t *ap, const uint8_t *bp, int cl) {
return i; return i;
} }
// Performs a physical search for remaining
struct SearchStepWise {
Node *n;
InternalVersionT maxV;
std::span<const uint8_t> remaining;
SearchStepWise() {}
SearchStepWise(Node *n, std::span<const uint8_t> remaining)
: n(n), remaining(remaining) {
assert(n->partialKeyLen == 0);
}
bool step() {
if (remaining.size() == 0) {
return true;
}
auto [child, v] = getChildAndMaxVersion(n, remaining[0]);
maxV = v;
if (child == nullptr) {
return true;
}
if (child->partialKeyLen > 0) {
int cl = std::min<int>(child->partialKeyLen, remaining.size() - 1);
int i =
longestCommonPrefix(child->partialKey(), remaining.data() + 1, cl);
if (i != child->partialKeyLen) {
return true;
}
}
n = child;
remaining =
remaining.subspan(1 + child->partialKeyLen,
remaining.size() - (1 + child->partialKeyLen));
return false;
}
};
// Logically this is the same as performing firstGeq and then checking against // Logically this is the same as performing firstGeq and then checking against
// point or range version according to cmp, but this version short circuits as // point or range version according to cmp, but this version short circuits as
// soon as it can prove that there's no conflict. // soon as it can prove that there's no conflict.
@@ -2820,30 +2783,44 @@ bool checkRangeRead(Node *n, std::span<const uint8_t> begin,
++tls->range_read_accum; ++tls->range_read_accum;
SearchStepWise search{n, begin.subspan(0, lcp)}; auto remaining = begin.subspan(0, lcp);
Arena arena; Arena arena;
for (;; ++tls->range_read_iterations_accum) { for (;; ++tls->range_read_iterations_accum) {
assert(getSearchPath(arena, search.n) <=> assert(getSearchPath(arena, n) <=>
begin.subspan(0, lcp - search.remaining.size()) == begin.subspan(0, lcp - remaining.size()) ==
0); 0);
if (search.step()) { if (remaining.size() == 0) {
break; break;
} }
if (search.maxV <= readVersion) { auto [child, v] = getChildAndMaxVersion(n, remaining[0]);
if (child == nullptr) {
break;
}
if (child->partialKeyLen > 0) {
int cl = std::min<int>(child->partialKeyLen, remaining.size() - 1);
int i =
longestCommonPrefix(child->partialKey(), remaining.data() + 1, cl);
if (i != child->partialKeyLen) {
break;
}
}
if (v <= readVersion) {
++tls->range_read_short_circuit_accum; ++tls->range_read_short_circuit_accum;
return true; return true;
} }
n = child;
remaining =
remaining.subspan(1 + child->partialKeyLen,
remaining.size() - (1 + child->partialKeyLen));
} }
assert(getSearchPath(arena, search.n) <=> assert(getSearchPath(arena, n) <=> begin.subspan(0, lcp - remaining.size()) ==
begin.subspan(0, lcp - search.remaining.size()) ==
0); 0);
const int consumed = lcp - search.remaining.size(); const int consumed = lcp - remaining.size();
assume(consumed >= 0); assume(consumed >= 0);
begin = begin.subspan(consumed, int(begin.size()) - consumed); begin = begin.subspan(consumed, int(begin.size()) - consumed);
end = end.subspan(consumed, int(end.size()) - consumed); end = end.subspan(consumed, int(end.size()) - consumed);
n = search.n;
lcp -= consumed; lcp -= consumed;
if (lcp == int(begin.size())) { if (lcp == int(begin.size())) {