Compare commits
6 Commits
fd39065498
...
e5452c0f7d
| Author | SHA1 | Date | |
|---|---|---|---|
| e5452c0f7d | |||
| 66fc526a55 | |||
| 21f08b9f88 | |||
| 10c2f06199 | |||
| 5cf04e9718 | |||
| 707b220fbc |
316
ConflictSet.cpp
316
ConflictSet.cpp
@@ -1193,9 +1193,9 @@ ChildAndMaxVersion getChildAndMaxVersion(Node *self, uint8_t index) {
|
||||
}
|
||||
}
|
||||
|
||||
Node *getChildGeq(Node0 *, int) { return nullptr; }
|
||||
TaggedNodePointer getChildGeq(Node0 *, int) { return nullptr; }
|
||||
|
||||
Node *getChildGeq(Node3 *n, int child) {
|
||||
TaggedNodePointer getChildGeq(Node3 *n, int child) {
|
||||
assume(n->numChildren >= 1);
|
||||
assume(n->numChildren <= 3);
|
||||
for (int i = 0; i < n->numChildren; ++i) {
|
||||
@@ -1206,7 +1206,7 @@ Node *getChildGeq(Node3 *n, int child) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Node *getChildGeq(Node16 *self, int child) {
|
||||
TaggedNodePointer getChildGeq(Node16 *self, int child) {
|
||||
if (child > 255) {
|
||||
return nullptr;
|
||||
}
|
||||
@@ -1249,14 +1249,14 @@ Node *getChildGeq(Node16 *self, int child) {
|
||||
#endif
|
||||
}
|
||||
|
||||
Node *getChildGeq(Node48 *self, int child) {
|
||||
TaggedNodePointer getChildGeq(Node48 *self, int child) {
|
||||
int c = self->bitSet.firstSetGeq(child);
|
||||
if (c < 0) {
|
||||
return nullptr;
|
||||
}
|
||||
return self->children[self->index[c]];
|
||||
}
|
||||
Node *getChildGeq(Node256 *self, int child) {
|
||||
TaggedNodePointer getChildGeq(Node256 *self, int child) {
|
||||
int c = self->bitSet.firstSetGeq(child);
|
||||
if (c < 0) {
|
||||
return nullptr;
|
||||
@@ -1264,7 +1264,7 @@ Node *getChildGeq(Node256 *self, int child) {
|
||||
return self->children[c];
|
||||
}
|
||||
|
||||
Node *getChildGeq(Node *self, int child) {
|
||||
TaggedNodePointer getChildGeq(Node *self, int child) {
|
||||
switch (self->getType()) {
|
||||
case Type_Node0:
|
||||
return getChildGeq(static_cast<Node0 *>(self), child);
|
||||
@@ -1281,27 +1281,62 @@ Node *getChildGeq(Node *self, int child) {
|
||||
}
|
||||
}
|
||||
|
||||
Node *getFirstChild(Node0 *) { return nullptr; }
|
||||
Node *getFirstChild(Node3 *self) {
|
||||
return self->numChildren == 0 ? nullptr : self->children[0];
|
||||
}
|
||||
Node *getFirstChild(Node16 *self) {
|
||||
return self->numChildren == 0 ? nullptr : self->children[0];
|
||||
}
|
||||
Node *getFirstChild(Node48 *self) {
|
||||
int index = self->index[self->bitSet.firstSetGeq(0)];
|
||||
return index < 0 ? nullptr : self->children[index];
|
||||
}
|
||||
Node *getFirstChild(Node256 *self) {
|
||||
return self->children[self->bitSet.firstSetGeq(0)];
|
||||
}
|
||||
|
||||
Node *getFirstChild(Node *self) {
|
||||
// Only require that the node-specific overloads are covered
|
||||
// GCOVR_EXCL_START
|
||||
switch (self->getType()) {
|
||||
case Type_Node0:
|
||||
return getFirstChild(static_cast<Node0 *>(self));
|
||||
case Type_Node3:
|
||||
return getFirstChild(static_cast<Node3 *>(self));
|
||||
case Type_Node16:
|
||||
return getFirstChild(static_cast<Node16 *>(self));
|
||||
case Type_Node48:
|
||||
return getFirstChild(static_cast<Node48 *>(self));
|
||||
case Type_Node256:
|
||||
return getFirstChild(static_cast<Node256 *>(self));
|
||||
default:
|
||||
__builtin_unreachable();
|
||||
}
|
||||
// GCOVR_EXCL_STOP
|
||||
}
|
||||
|
||||
// Precondition: self has a child
|
||||
Node *getFirstChildExists(Node3 *self) {
|
||||
TaggedNodePointer getFirstChildExists(Node3 *self) {
|
||||
assert(self->numChildren > 0);
|
||||
return self->children[0];
|
||||
}
|
||||
// Precondition: self has a child
|
||||
Node *getFirstChildExists(Node16 *self) {
|
||||
TaggedNodePointer getFirstChildExists(Node16 *self) {
|
||||
assert(self->numChildren > 0);
|
||||
return self->children[0];
|
||||
}
|
||||
// Precondition: self has a child
|
||||
Node *getFirstChildExists(Node48 *self) {
|
||||
TaggedNodePointer getFirstChildExists(Node48 *self) {
|
||||
return self->children[self->index[self->bitSet.firstSetGeq(0)]];
|
||||
}
|
||||
// Precondition: self has a child
|
||||
Node *getFirstChildExists(Node256 *self) {
|
||||
TaggedNodePointer getFirstChildExists(Node256 *self) {
|
||||
return self->children[self->bitSet.firstSetGeq(0)];
|
||||
}
|
||||
|
||||
// Precondition: self has a child
|
||||
Node *getFirstChildExists(Node *self) {
|
||||
TaggedNodePointer getFirstChildExists(Node *self) {
|
||||
// Only require that the node-specific overloads are covered
|
||||
// GCOVR_EXCL_START
|
||||
switch (self->getType()) {
|
||||
@@ -1559,36 +1594,45 @@ TaggedNodePointer &getOrCreateChild(TaggedNodePointer &self,
|
||||
}
|
||||
|
||||
Node *nextPhysical(Node *node) {
|
||||
int index = -1;
|
||||
auto nextChild = getFirstChild(node);
|
||||
if (nextChild != nullptr) {
|
||||
return nextChild;
|
||||
}
|
||||
for (;;) {
|
||||
auto nextChild = getChildGeq(node, index + 1);
|
||||
if (nextChild != nullptr) {
|
||||
return nextChild;
|
||||
}
|
||||
index = node->parentsIndex;
|
||||
int index = node->parentsIndex;
|
||||
node = node->parent;
|
||||
if (node == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
auto nextChild = getChildGeq(node, index + 1);
|
||||
if (nextChild != nullptr) {
|
||||
return nextChild;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Node *nextLogical(Node *node) {
|
||||
int index = -1;
|
||||
auto nextChild = getFirstChild(node);
|
||||
if (nextChild != nullptr) {
|
||||
node = nextChild;
|
||||
goto downLeftSpine;
|
||||
}
|
||||
for (;;) {
|
||||
auto nextChild = getChildGeq(node, index + 1);
|
||||
if (nextChild != nullptr) {
|
||||
for (node = nextChild; !node->entryPresent;
|
||||
node = getFirstChildExists(node)) {
|
||||
}
|
||||
return node;
|
||||
}
|
||||
index = node->parentsIndex;
|
||||
int index = node->parentsIndex;
|
||||
node = node->parent;
|
||||
if (node == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
auto nextChild = getChildGeq(node, index + 1);
|
||||
if (nextChild != nullptr) {
|
||||
node = nextChild;
|
||||
goto downLeftSpine;
|
||||
}
|
||||
}
|
||||
downLeftSpine:
|
||||
for (; !node->entryPresent; node = getFirstChildExists(node)) {
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
// Invalidates `self`, replacing it with a node of at least capacity.
|
||||
@@ -1977,7 +2021,7 @@ Node *erase(Node *self, WriteContext *writeContext, ConflictSet::Impl *impl,
|
||||
return result;
|
||||
}
|
||||
|
||||
Node *nextSibling(Node *node) {
|
||||
TaggedNodePointer nextSibling(Node *node) {
|
||||
for (;;) {
|
||||
if (node->parent == nullptr) {
|
||||
return nullptr;
|
||||
@@ -3053,13 +3097,25 @@ PRESERVE_NONE void complete(CheckJob *job, CheckContext *context) {
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
|
||||
template <class NodeT>
|
||||
PRESERVE_NONE void down_left_spine(CheckJob *job, CheckContext *context);
|
||||
|
||||
static Continuation downLeftSpineTable[] = {
|
||||
down_left_spine<Node0>, down_left_spine<Node3>, down_left_spine<Node16>,
|
||||
down_left_spine<Node48>, down_left_spine<Node256>};
|
||||
|
||||
template <class NodeT>
|
||||
PRESERVE_NONE void down_left_spine(CheckJob *job, CheckContext *context) {
|
||||
if (job->n->entryPresent) {
|
||||
job->setResult(job->n->entry.rangeVersion <= job->readVersion);
|
||||
assert(job->n->getType() == NodeT::kType);
|
||||
NodeT *n = static_cast<NodeT *>(job->n);
|
||||
if (n->entryPresent) {
|
||||
job->setResult(n->entry.rangeVersion <= job->readVersion);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->n = getFirstChildExists(job->n);
|
||||
auto child = getFirstChildExists(n);
|
||||
job->n = child;
|
||||
__builtin_prefetch(job->n);
|
||||
job->continuation = downLeftSpineTable[child.getType()];
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
|
||||
@@ -3092,7 +3148,7 @@ void begin(CheckJob *job, CheckContext *context) {
|
||||
auto c = getChildGeq(job->n, job->begin[0]);
|
||||
if (c != nullptr) {
|
||||
job->n = c;
|
||||
job->continuation = down_left_spine;
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
} else {
|
||||
@@ -3119,15 +3175,15 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
|
||||
if (i < commonLen) [[unlikely]] {
|
||||
auto c = n->partialKey()[i] <=> job->begin[i];
|
||||
if (c > 0) {
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return down_left_spine(job, context);
|
||||
MUSTTAIL return down_left_spine<NodeT>(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(n);
|
||||
auto s = nextSibling(n);
|
||||
job->n = s;
|
||||
if (job->n == nullptr) {
|
||||
job->setResult(true);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = down_left_spine;
|
||||
job->continuation = downLeftSpineTable[s.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
@@ -3138,8 +3194,7 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
|
||||
} else if (n->partialKeyLen > int(job->begin.size())) [[unlikely]] {
|
||||
// n is the first physical node greater than remaining, and there's no
|
||||
// eq node
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return down_left_spine(job, context);
|
||||
MUSTTAIL return down_left_spine<NodeT>(job, context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3156,8 +3211,9 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
|
||||
job->setResult(n->entry.pointVersion <= job->readVersion);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->n = getFirstChildExists(n);
|
||||
job->continuation = down_left_spine;
|
||||
auto c = getFirstChildExists(n);
|
||||
job->n = c;
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
@@ -3169,16 +3225,17 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
|
||||
auto c = getChildGeq(n, job->begin[0]);
|
||||
if (c != nullptr) {
|
||||
job->n = c;
|
||||
job->continuation = down_left_spine;
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(job->n);
|
||||
auto c = nextSibling(job->n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->setResult(true);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = down_left_spine;
|
||||
job->continuation = downLeftSpineTable[c->getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
@@ -3216,7 +3273,7 @@ void begin(CheckJob *job, CheckContext *context) {
|
||||
auto c = getChildGeq(job->n, job->begin[0]);
|
||||
if (c != nullptr) {
|
||||
job->n = c;
|
||||
job->continuation = down_left_spine;
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
} else {
|
||||
@@ -3243,15 +3300,15 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
|
||||
if (i < commonLen) [[unlikely]] {
|
||||
auto c = n->partialKey()[i] <=> job->begin[i];
|
||||
if (c > 0) {
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return down_left_spine(job, context);
|
||||
MUSTTAIL return down_left_spine<NodeT>(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(n);
|
||||
auto c = nextSibling(n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->setResult(true);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = down_left_spine;
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
@@ -3267,8 +3324,7 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
|
||||
job->setResult(false);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return down_left_spine(job, context);
|
||||
MUSTTAIL return down_left_spine<NodeT>(job, context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3292,16 +3348,17 @@ template <class NodeT> void iter(CheckJob *job, CheckContext *context) {
|
||||
auto c = getChildGeq(n, job->begin[0]);
|
||||
if (c != nullptr) {
|
||||
job->n = c;
|
||||
job->continuation = down_left_spine;
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(job->n);
|
||||
auto c = nextSibling(job->n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->setResult(true);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = down_left_spine;
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
@@ -3336,8 +3393,14 @@ static Continuation doneCommonPrefixIterTable[] = {
|
||||
template <class NodeT>
|
||||
PRESERVE_NONE void left_side_iter(CheckJob *, CheckContext *);
|
||||
|
||||
template <class NodeT>
|
||||
PRESERVE_NONE void left_side_down_left_spine(CheckJob *, CheckContext *);
|
||||
|
||||
static Continuation leftSideDownLeftSpineTable[] = {
|
||||
left_side_down_left_spine<Node0>, left_side_down_left_spine<Node3>,
|
||||
left_side_down_left_spine<Node16>, left_side_down_left_spine<Node48>,
|
||||
left_side_down_left_spine<Node256>};
|
||||
|
||||
PRESERVE_NONE void done_left_side_iter(CheckJob *, CheckContext *);
|
||||
|
||||
static Continuation leftSideIterTable[] = {
|
||||
@@ -3356,32 +3419,28 @@ PRESERVE_NONE void begin(CheckJob *job, CheckContext *context) {
|
||||
std::min(job->begin.size(), job->end.size()));
|
||||
if (job->lcp == int(job->begin.size()) &&
|
||||
job->end.size() == job->begin.size() + 1 && job->end.back() == 0) {
|
||||
job->continuation = check_point_read_state_machine::begin;
|
||||
// Call directly since we have nothing to prefetch
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return check_point_read_state_machine::begin(job, context);
|
||||
}
|
||||
if (job->lcp == int(job->begin.size() - 1) &&
|
||||
job->end.size() == job->begin.size() &&
|
||||
int(job->begin.back()) + 1 == int(job->end.back())) {
|
||||
job->continuation = check_prefix_read_state_machine::begin;
|
||||
// Call directly since we have nothing to prefetch
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return check_prefix_read_state_machine::begin(job, context);
|
||||
}
|
||||
|
||||
++context->readContext.range_read_accum;
|
||||
job->remaining = job->begin.subspan(0, job->lcp);
|
||||
|
||||
if (job->remaining.size() == 0) {
|
||||
job->continuation = doneCommonPrefixIterTable[job->n->getType()];
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return doneCommonPrefixIterTable[job->n->getType()](job, context);
|
||||
}
|
||||
|
||||
auto [c, maxV] = getChildAndMaxVersion(job->n, job->remaining[0]);
|
||||
job->maxV = maxV;
|
||||
job->child = c;
|
||||
if (job->child == nullptr) {
|
||||
job->continuation = doneCommonPrefixIterTable[job->n->getType()];
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return doneCommonPrefixIterTable[job->n->getType()](job, context);
|
||||
}
|
||||
|
||||
job->continuation = commonPrefixIterTable[c.getType()];
|
||||
@@ -3401,8 +3460,8 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) {
|
||||
int i =
|
||||
longestCommonPrefix(child->partialKey(), job->remaining.data() + 1, cl);
|
||||
if (i != child->partialKeyLen) {
|
||||
job->continuation = doneCommonPrefixIterTable[job->n->getType()];
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return doneCommonPrefixIterTable[job->n->getType()](job,
|
||||
context);
|
||||
}
|
||||
}
|
||||
job->n = child;
|
||||
@@ -3419,16 +3478,14 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) {
|
||||
++context->readContext.range_read_iterations_accum;
|
||||
|
||||
if (job->remaining.size() == 0) {
|
||||
job->continuation = done_common_prefix_iter<NodeT>;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_common_prefix_iter<NodeT>(job, context);
|
||||
}
|
||||
|
||||
auto [c, maxV] = getChildAndMaxVersion(child, job->remaining[0]);
|
||||
job->maxV = maxV;
|
||||
job->child = c;
|
||||
if (job->child == nullptr) {
|
||||
job->continuation = done_common_prefix_iter<NodeT>;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_common_prefix_iter<NodeT>(job, context);
|
||||
}
|
||||
|
||||
job->continuation = commonPrefixIterTable[c.getType()];
|
||||
@@ -3481,16 +3538,17 @@ PRESERVE_NONE void done_common_prefix_iter(CheckJob *job,
|
||||
auto c = getChildGeq(n, job->remaining[0]);
|
||||
if (c != nullptr) {
|
||||
job->n = c;
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(job->n);
|
||||
auto c = nextSibling(job->n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->setResult(true);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return downLeftSpineTable[c.getType()](job, context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3519,16 +3577,16 @@ PRESERVE_NONE void done_common_prefix_iter(CheckJob *job,
|
||||
auto c = getChildGeq(n, job->remaining[0]);
|
||||
if (c != nullptr) {
|
||||
job->n = c;
|
||||
job->continuation = left_side_down_left_spine;
|
||||
job->continuation = leftSideDownLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(job->n);
|
||||
auto c = nextSibling(job->n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->continuation = done_left_side_iter;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_left_side_iter(job, context);
|
||||
}
|
||||
job->continuation = left_side_down_left_spine;
|
||||
job->continuation = leftSideDownLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
@@ -3558,8 +3616,7 @@ PRESERVE_NONE void left_side_iter(CheckJob *job, CheckContext *context) {
|
||||
if (c > 0) {
|
||||
if (n->parent == job->commonPrefixNode) {
|
||||
if (i < job->lcp) {
|
||||
job->continuation = left_side_down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return left_side_down_left_spine<NodeT>(job, context);
|
||||
}
|
||||
}
|
||||
if (n->entryPresent && n->entry.rangeVersion > job->readVersion) {
|
||||
@@ -3570,16 +3627,16 @@ PRESERVE_NONE void left_side_iter(CheckJob *job, CheckContext *context) {
|
||||
job->setResult(false);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = done_left_side_iter;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_left_side_iter(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(n);
|
||||
auto c = nextSibling(n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->continuation = done_left_side_iter;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_left_side_iter(job, context);
|
||||
}
|
||||
job->continuation = left_side_down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
job->continuation = leftSideDownLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
}
|
||||
if (commonLen == n->partialKeyLen) {
|
||||
@@ -3595,14 +3652,12 @@ PRESERVE_NONE void left_side_iter(CheckJob *job, CheckContext *context) {
|
||||
job->setResult(false);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = done_left_side_iter;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_left_side_iter(job, context);
|
||||
}
|
||||
}
|
||||
|
||||
if (job->maxV <= job->readVersion) {
|
||||
job->continuation = done_left_side_iter;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_left_side_iter(job, context);
|
||||
}
|
||||
|
||||
++context->readContext.range_read_iterations_accum;
|
||||
@@ -3626,15 +3681,14 @@ PRESERVE_NONE void left_side_iter(CheckJob *job, CheckContext *context) {
|
||||
auto c = getChildGeq(n, job->remaining[0]);
|
||||
if (c != nullptr) {
|
||||
job->n = c;
|
||||
job->continuation = done_left_side_iter;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_left_side_iter(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(job->n);
|
||||
auto c = nextSibling(job->n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->continuation = done_left_side_iter;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_left_side_iter(job, context);
|
||||
}
|
||||
job->continuation = left_side_down_left_spine;
|
||||
job->continuation = leftSideDownLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
@@ -3657,16 +3711,17 @@ PRESERVE_NONE void done_left_side_iter(CheckJob *job, CheckContext *context) {
|
||||
auto c = getChildGeq(job->n, job->remaining[0]);
|
||||
if (c != nullptr) {
|
||||
job->n = c;
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(job->n);
|
||||
auto c = nextSibling(job->n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->setResult(true);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3676,16 +3731,21 @@ PRESERVE_NONE void done_left_side_iter(CheckJob *job, CheckContext *context) {
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
|
||||
template <class NodeT>
|
||||
void left_side_down_left_spine(CheckJob *job, CheckContext *context) {
|
||||
if (job->n->entryPresent) {
|
||||
if (job->n->entry.rangeVersion > job->readVersion) {
|
||||
assert(job->n->getType() == NodeT::kType);
|
||||
NodeT *n = static_cast<NodeT *>(job->n);
|
||||
|
||||
if (n->entryPresent) {
|
||||
if (n->entry.rangeVersion > job->readVersion) {
|
||||
job->setResult(false);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = done_left_side_iter;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return done_left_side_iter(job, context);
|
||||
}
|
||||
job->n = getFirstChildExists(job->n);
|
||||
auto c = getFirstChildExists(n);
|
||||
job->n = c;
|
||||
job->continuation = leftSideDownLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
@@ -3706,8 +3766,7 @@ PRESERVE_NONE void right_side_iter(CheckJob *job, CheckContext *context) {
|
||||
if (i < commonLen) {
|
||||
auto c = n->partialKey()[i] <=> job->remaining[i];
|
||||
if (c > 0) {
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return down_left_spine<NodeT>(job, context);
|
||||
} else {
|
||||
if ((n->parent != job->commonPrefixNode || i >= job->lcp) &&
|
||||
n->entryPresent && n->entry.rangeVersion > job->readVersion) {
|
||||
@@ -3719,13 +3778,15 @@ PRESERVE_NONE void right_side_iter(CheckJob *job, CheckContext *context) {
|
||||
job->setResult(false);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->n = nextSibling(job->n);
|
||||
auto c = nextSibling(job->n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->setResult(true);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
}
|
||||
if (commonLen == n->partialKeyLen) {
|
||||
@@ -3733,16 +3794,14 @@ PRESERVE_NONE void right_side_iter(CheckJob *job, CheckContext *context) {
|
||||
job->remaining =
|
||||
job->remaining.subspan(commonLen, job->remaining.size() - commonLen);
|
||||
} else if (n->partialKeyLen > int(job->remaining.size())) {
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return down_left_spine<NodeT>(job, context);
|
||||
}
|
||||
}
|
||||
|
||||
++context->readContext.range_read_iterations_accum;
|
||||
|
||||
if (job->remaining.size() == 0) {
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
MUSTTAIL return down_left_spine<NodeT>(job, context);
|
||||
}
|
||||
|
||||
if (n->entryPresent && n->entry.pointVersion > job->readVersion) {
|
||||
@@ -3767,16 +3826,19 @@ PRESERVE_NONE void right_side_iter(CheckJob *job, CheckContext *context) {
|
||||
auto c = getChildGeq(n, job->remaining[0]);
|
||||
if (c != nullptr) {
|
||||
job->n = c;
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
} else {
|
||||
job->n = nextSibling(job->n);
|
||||
auto c = nextSibling(job->n);
|
||||
job->n = c;
|
||||
if (job->n == nullptr) {
|
||||
job->setResult(true);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->continuation = down_left_spine;
|
||||
MUSTTAIL return job->continuation(job, context);
|
||||
job->continuation = downLeftSpineTable[c.getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4289,17 +4351,17 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
// Kick off the sequence of tail calls that finally returns once all jobs
|
||||
// are done
|
||||
inProgress->continuation(inProgress, &context);
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
Arena arena;
|
||||
auto *results2 = new (arena) Result[count];
|
||||
CheckContext context2;
|
||||
context2.readContext.impl = this;
|
||||
useSequential(reads, results2, count, context2);
|
||||
assert(memcmp(result, results2, count) == 0);
|
||||
assert(context.readContext == context2.readContext);
|
||||
Arena arena;
|
||||
auto *results2 = new (arena) Result[count];
|
||||
CheckContext context2;
|
||||
context2.readContext.impl = this;
|
||||
useSequential(reads, results2, count, context2);
|
||||
assert(memcmp(result, results2, count) == 0);
|
||||
assert(context.readContext == context2.readContext);
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
useSequential(reads, result, count, context);
|
||||
|
||||
BIN
corpus/033c4c71cb5ca5a3a933b9001be1d4246784fefb
Normal file
BIN
corpus/033c4c71cb5ca5a3a933b9001be1d4246784fefb
Normal file
Binary file not shown.
BIN
corpus/0707d9709690c9700f27fd73d97c0325fa81c162
Normal file
BIN
corpus/0707d9709690c9700f27fd73d97c0325fa81c162
Normal file
Binary file not shown.
BIN
corpus/0771614f4aee61a932eb4f6cec1f736fce997a1e
Normal file
BIN
corpus/0771614f4aee61a932eb4f6cec1f736fce997a1e
Normal file
Binary file not shown.
BIN
corpus/078875343814fb2f6f7be30e0fd58a139d977f19
Normal file
BIN
corpus/078875343814fb2f6f7be30e0fd58a139d977f19
Normal file
Binary file not shown.
BIN
corpus/0e3aaaf8e085bdf5f4419b176cea97d4bfcb62bf
Normal file
BIN
corpus/0e3aaaf8e085bdf5f4419b176cea97d4bfcb62bf
Normal file
Binary file not shown.
BIN
corpus/0ebb66b9b7a11c4858236dc5852386dedae328c0
Normal file
BIN
corpus/0ebb66b9b7a11c4858236dc5852386dedae328c0
Normal file
Binary file not shown.
BIN
corpus/10585791c59c9e43299c8958b48245d705addf47
Normal file
BIN
corpus/10585791c59c9e43299c8958b48245d705addf47
Normal file
Binary file not shown.
BIN
corpus/11ebd31c17d648c7c9fbdda49afb4898647f04e1
Normal file
BIN
corpus/11ebd31c17d648c7c9fbdda49afb4898647f04e1
Normal file
Binary file not shown.
BIN
corpus/145d5d24154a374195992d66e4ed8645251621c7
Normal file
BIN
corpus/145d5d24154a374195992d66e4ed8645251621c7
Normal file
Binary file not shown.
BIN
corpus/1786bfcb534c808729b2e44223c86d4630353187
Normal file
BIN
corpus/1786bfcb534c808729b2e44223c86d4630353187
Normal file
Binary file not shown.
BIN
corpus/19f794a009ca2c72db29c9f446b3bf25cb81bf2e
Normal file
BIN
corpus/19f794a009ca2c72db29c9f446b3bf25cb81bf2e
Normal file
Binary file not shown.
BIN
corpus/1eef764e38c5e3149bb25d4cd68b6726bd8aa749
Normal file
BIN
corpus/1eef764e38c5e3149bb25d4cd68b6726bd8aa749
Normal file
Binary file not shown.
BIN
corpus/20bb7fa2595688f905b4a6c50632863624ab2f3e
Normal file
BIN
corpus/20bb7fa2595688f905b4a6c50632863624ab2f3e
Normal file
Binary file not shown.
BIN
corpus/244405435eb24b3a3bd4d1e3d7152d73567c7b16
Normal file
BIN
corpus/244405435eb24b3a3bd4d1e3d7152d73567c7b16
Normal file
Binary file not shown.
BIN
corpus/2a4a6d38b66bfed4b92267434bb4a35c3418e12f
Normal file
BIN
corpus/2a4a6d38b66bfed4b92267434bb4a35c3418e12f
Normal file
Binary file not shown.
BIN
corpus/2eabae91500b8d5a146c04fc8e9d86bd980cd2d8
Normal file
BIN
corpus/2eabae91500b8d5a146c04fc8e9d86bd980cd2d8
Normal file
Binary file not shown.
BIN
corpus/2f5699b837d841d42fb676ff3468987080025dac
Normal file
BIN
corpus/2f5699b837d841d42fb676ff3468987080025dac
Normal file
Binary file not shown.
BIN
corpus/341405817304236c159668dae062254ec9f6a296
Normal file
BIN
corpus/341405817304236c159668dae062254ec9f6a296
Normal file
Binary file not shown.
BIN
corpus/3598e35bb6cc9d26213099a88205a83a56cc1ceb
Normal file
BIN
corpus/3598e35bb6cc9d26213099a88205a83a56cc1ceb
Normal file
Binary file not shown.
BIN
corpus/366c2af92cd4fbd55aba32f2123236ccec6c969c
Normal file
BIN
corpus/366c2af92cd4fbd55aba32f2123236ccec6c969c
Normal file
Binary file not shown.
BIN
corpus/3c83b387971824e2cf7bcb167b3ef956bc8322e9
Normal file
BIN
corpus/3c83b387971824e2cf7bcb167b3ef956bc8322e9
Normal file
Binary file not shown.
BIN
corpus/43630dd4c7ad568ec56c81242df704a82e63d417
Normal file
BIN
corpus/43630dd4c7ad568ec56c81242df704a82e63d417
Normal file
Binary file not shown.
BIN
corpus/44a5cae23738190ecddad978b8dfd19d914c25e0
Normal file
BIN
corpus/44a5cae23738190ecddad978b8dfd19d914c25e0
Normal file
Binary file not shown.
BIN
corpus/4b6ce449083575fa2c2b95598939810c94de72a6
Normal file
BIN
corpus/4b6ce449083575fa2c2b95598939810c94de72a6
Normal file
Binary file not shown.
BIN
corpus/4ba6a927e61e1d4d071d01768f5020792974360b
Normal file
BIN
corpus/4ba6a927e61e1d4d071d01768f5020792974360b
Normal file
Binary file not shown.
BIN
corpus/4cdd28f4031a58365e90369c5a6a1f0d90abbd0e
Normal file
BIN
corpus/4cdd28f4031a58365e90369c5a6a1f0d90abbd0e
Normal file
Binary file not shown.
BIN
corpus/4fc97632079a9a1c09813fcc8ba7e8275fc501dd
Normal file
BIN
corpus/4fc97632079a9a1c09813fcc8ba7e8275fc501dd
Normal file
Binary file not shown.
BIN
corpus/50e9c5e099e531fabc1eb1da3495474fa2a24635
Normal file
BIN
corpus/50e9c5e099e531fabc1eb1da3495474fa2a24635
Normal file
Binary file not shown.
BIN
corpus/5342fbf382522a689e128a96b7bc53801e6474fa
Normal file
BIN
corpus/5342fbf382522a689e128a96b7bc53801e6474fa
Normal file
Binary file not shown.
BIN
corpus/541f286a2622936fde1cc818430af497f6ee344b
Normal file
BIN
corpus/541f286a2622936fde1cc818430af497f6ee344b
Normal file
Binary file not shown.
BIN
corpus/5572eb9607f908b43c8d2afb859134f95239edbb
Normal file
BIN
corpus/5572eb9607f908b43c8d2afb859134f95239edbb
Normal file
Binary file not shown.
BIN
corpus/6ccea4a6d05f31ad06b985e659818015056f8664
Normal file
BIN
corpus/6ccea4a6d05f31ad06b985e659818015056f8664
Normal file
Binary file not shown.
BIN
corpus/6cf2e12ea6e166a45de53d33a7169a217189d8ae
Normal file
BIN
corpus/6cf2e12ea6e166a45de53d33a7169a217189d8ae
Normal file
Binary file not shown.
BIN
corpus/70fed4c582ffa81d2c2ce0a323c98b175415d716
Normal file
BIN
corpus/70fed4c582ffa81d2c2ce0a323c98b175415d716
Normal file
Binary file not shown.
BIN
corpus/76f4e184bbe3d1d11cebcfc81097388372d7fa1d
Normal file
BIN
corpus/76f4e184bbe3d1d11cebcfc81097388372d7fa1d
Normal file
Binary file not shown.
BIN
corpus/7a16f28f4123c6749def448c539f3d2b702e9e29
Normal file
BIN
corpus/7a16f28f4123c6749def448c539f3d2b702e9e29
Normal file
Binary file not shown.
BIN
corpus/7a5b5b0096f65bcb4e086c965958104c649caf1d
Normal file
BIN
corpus/7a5b5b0096f65bcb4e086c965958104c649caf1d
Normal file
Binary file not shown.
BIN
corpus/7cbfdb34d47109f4c34b2a249335e86fb12ce94e
Normal file
BIN
corpus/7cbfdb34d47109f4c34b2a249335e86fb12ce94e
Normal file
Binary file not shown.
BIN
corpus/825e0417855780d4987c29b4f79a5057790cf199
Normal file
BIN
corpus/825e0417855780d4987c29b4f79a5057790cf199
Normal file
Binary file not shown.
BIN
corpus/85c2fd6bfb1217fcb5ccef5d2776147e05b576e4
Normal file
BIN
corpus/85c2fd6bfb1217fcb5ccef5d2776147e05b576e4
Normal file
Binary file not shown.
BIN
corpus/8a1a03b316d0af281909a4664c004652f2699c26
Normal file
BIN
corpus/8a1a03b316d0af281909a4664c004652f2699c26
Normal file
Binary file not shown.
BIN
corpus/933e463857a4fb5d1ceafd27347ba6453ed21ab3
Normal file
BIN
corpus/933e463857a4fb5d1ceafd27347ba6453ed21ab3
Normal file
Binary file not shown.
BIN
corpus/9c5c8b68029e167981f858d86573b228288cd6db
Normal file
BIN
corpus/9c5c8b68029e167981f858d86573b228288cd6db
Normal file
Binary file not shown.
BIN
corpus/a1c8ef041bb3a08f67b790505ca1994bd3dfbf70
Normal file
BIN
corpus/a1c8ef041bb3a08f67b790505ca1994bd3dfbf70
Normal file
Binary file not shown.
BIN
corpus/a2363f473bf6f21d74bad2726023a77981d3b526
Normal file
BIN
corpus/a2363f473bf6f21d74bad2726023a77981d3b526
Normal file
Binary file not shown.
BIN
corpus/a53c51e5db29643ec586172c7e74e407821be3ad
Normal file
BIN
corpus/a53c51e5db29643ec586172c7e74e407821be3ad
Normal file
Binary file not shown.
BIN
corpus/ad7e6d59de6391561d0100091c44ef0f51de5f16
Normal file
BIN
corpus/ad7e6d59de6391561d0100091c44ef0f51de5f16
Normal file
Binary file not shown.
BIN
corpus/afe2cf451384fc8fe9cd8429e122d9654f589ed1
Normal file
BIN
corpus/afe2cf451384fc8fe9cd8429e122d9654f589ed1
Normal file
Binary file not shown.
BIN
corpus/b67e6e8804c1c855bb0792ff03fe72b35e264349
Normal file
BIN
corpus/b67e6e8804c1c855bb0792ff03fe72b35e264349
Normal file
Binary file not shown.
BIN
corpus/bc44935dc7ddb17bcf92ad2db1452c4be51fe787
Normal file
BIN
corpus/bc44935dc7ddb17bcf92ad2db1452c4be51fe787
Normal file
Binary file not shown.
BIN
corpus/c73d82aef810ca669f7766084447b5d1003ff9cd
Normal file
BIN
corpus/c73d82aef810ca669f7766084447b5d1003ff9cd
Normal file
Binary file not shown.
BIN
corpus/c85c4bd3668aded5311eab913b6b6241371c6db7
Normal file
BIN
corpus/c85c4bd3668aded5311eab913b6b6241371c6db7
Normal file
Binary file not shown.
BIN
corpus/ce98b6e2cde0dffa274147824c56c3a04b86db35
Normal file
BIN
corpus/ce98b6e2cde0dffa274147824c56c3a04b86db35
Normal file
Binary file not shown.
BIN
corpus/d703b9cde3a286d57fb58818d7ec43c17a2850f7
Normal file
BIN
corpus/d703b9cde3a286d57fb58818d7ec43c17a2850f7
Normal file
Binary file not shown.
BIN
corpus/ddabeb8a80b5be614b869e7495e85a8a85645e91
Normal file
BIN
corpus/ddabeb8a80b5be614b869e7495e85a8a85645e91
Normal file
Binary file not shown.
BIN
corpus/e0028ddf76c4917ce3a77136a68cd1f9d5816403
Normal file
BIN
corpus/e0028ddf76c4917ce3a77136a68cd1f9d5816403
Normal file
Binary file not shown.
BIN
corpus/e6ba7118c9cb161437fcb3aaaf5600b204b4cf64
Normal file
BIN
corpus/e6ba7118c9cb161437fcb3aaaf5600b204b4cf64
Normal file
Binary file not shown.
BIN
corpus/ebff3399c2c3dba6638b0fabe0ab11cc8204d6ce
Normal file
BIN
corpus/ebff3399c2c3dba6638b0fabe0ab11cc8204d6ce
Normal file
Binary file not shown.
BIN
corpus/efea541e3b70f9eba34fc7b4703139d68ddc73b6
Normal file
BIN
corpus/efea541e3b70f9eba34fc7b4703139d68ddc73b6
Normal file
Binary file not shown.
BIN
corpus/f4e1cba7e5087606c0b7566b5f7ce5dbe2a83740
Normal file
BIN
corpus/f4e1cba7e5087606c0b7566b5f7ce5dbe2a83740
Normal file
Binary file not shown.
BIN
corpus/f5076a79d1481abee047e8c3b95bb50a738b8368
Normal file
BIN
corpus/f5076a79d1481abee047e8c3b95bb50a738b8368
Normal file
Binary file not shown.
BIN
corpus/f7c88666d06488e4c9521ddff995a5781648b573
Normal file
BIN
corpus/f7c88666d06488e4c9521ddff995a5781648b573
Normal file
Binary file not shown.
BIN
corpus/fe23e0f0ae0ad14e7b945caf72fe2be111f6e660
Normal file
BIN
corpus/fe23e0f0ae0ad14e7b945caf72fe2be111f6e660
Normal file
Binary file not shown.
BIN
corpus/ffb97cdf2922e87e5a276a2c0a39d42883596234
Normal file
BIN
corpus/ffb97cdf2922e87e5a276a2c0a39d42883596234
Normal file
Binary file not shown.
Reference in New Issue
Block a user