Add short-circuiting back in for point and prefix checks

This commit is contained in:
2024-10-12 17:05:47 -07:00
parent 47fd811efc
commit f60833a57f

View File

@@ -2933,6 +2933,7 @@ struct CheckJob {
Node *n;
std::span<const uint8_t> begin;
InternalVersionT maxV;
std::span<const uint8_t> end; // range read only
std::span<const uint8_t> remaining; // range read only
Node *child; // range read only
@@ -3013,7 +3014,8 @@ void begin(CheckJob *job, CheckContext *context) {
MUSTTAIL return complete(job, context);
}
auto taggedChild = getChild(job->n, job->begin[0]);
auto [taggedChild, maxV] = getChildAndMaxVersion(job->n, job->begin[0]);
job->maxV = maxV;
Node *child = taggedChild;
if (child == nullptr) [[unlikely]] {
auto c = getChildGeq(job->n, job->begin[0]);
@@ -3072,6 +3074,12 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
++context->tls->point_read_iterations_accum;
if (job->maxV <= job->readVersion) {
job->setResult(true);
++context->tls->point_read_short_circuit_accum;
MUSTTAIL return complete(job, context);
}
if (job->begin.size() == 0) [[unlikely]] {
if (n->entryPresent) {
job->setResult(n->entry.pointVersion <= job->readVersion);
@@ -3083,7 +3091,8 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
MUSTTAIL return keepGoing(job, context);
}
auto taggedChild = getChild(n, job->begin[0]);
auto [taggedChild, maxV] = getChildAndMaxVersion(n, job->begin[0]);
job->maxV = maxV;
Node *child = taggedChild;
if (child == nullptr) [[unlikely]] {
auto c = getChildGeq(n, job->begin[0]);
@@ -3141,7 +3150,8 @@ void begin(CheckJob *job, CheckContext *context) {
// There's no way to encode a prefix read of ""
assert(job->begin.size() > 0);
auto taggedChild = getChild(job->n, job->begin[0]);
auto [taggedChild, maxV] = getChildAndMaxVersion(job->n, job->begin[0]);
job->maxV = maxV;
Node *child = taggedChild;
if (child == nullptr) [[unlikely]] {
auto c = getChildGeq(job->n, job->begin[0]);
@@ -3194,7 +3204,7 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
// n is the first physical node greater than remaining, and there's no
// eq node. All physical nodes that start with prefix are reachable from
// n.
if (maxVersion(n) > job->readVersion) {
if (job->maxV > job->readVersion) {
job->setResult(false);
MUSTTAIL return complete(job, context);
}
@@ -3205,12 +3215,19 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
++context->tls->prefix_read_iterations_accum;
if (job->begin.size() == 0) [[unlikely]] {
job->setResult(maxVersion(job->n) <= job->readVersion);
if (job->maxV <= job->readVersion) {
job->setResult(true);
++context->tls->prefix_read_short_circuit_accum;
MUSTTAIL return complete(job, context);
}
auto taggedChild = getChild(n, job->begin[0]);
if (job->begin.size() == 0) [[unlikely]] {
job->setResult(job->maxV <= job->readVersion);
MUSTTAIL return complete(job, context);
}
auto [taggedChild, maxV] = getChildAndMaxVersion(n, job->begin[0]);
job->maxV = maxV;
Node *child = taggedChild;
if (child == nullptr) [[unlikely]] {
auto c = getChildGeq(n, job->begin[0]);