Compare commits
7 Commits
c7e2358746
...
interleave
| Author | SHA1 | Date | |
|---|---|---|---|
| d6269c5b7c | |||
| faacdff2d9 | |||
| 821179b8de | |||
| 681a961289 | |||
| c73a3da14c | |||
| 5153d25cce | |||
| d2ec4e7fae |
427
ConflictSet.cpp
427
ConflictSet.cpp
@@ -1213,135 +1213,6 @@ TaggedNodePointer getChild(Node *self, uint8_t index) {
|
||||
}
|
||||
}
|
||||
|
||||
TaggedNodePointer *getChildUpdatingMaxVersion(Node0 *, TrivialSpan &,
|
||||
InternalVersionT) {
|
||||
return nullptr;
|
||||
}
|
||||
TaggedNodePointer *getChildUpdatingMaxVersion(Node3 *self,
|
||||
TrivialSpan &remaining,
|
||||
InternalVersionT maxVersion) {
|
||||
assert(remaining.size() > 0);
|
||||
int index = remaining.front();
|
||||
auto key = remaining.subspan(1, remaining.size() - 1);
|
||||
int i = getNodeIndex(self, index);
|
||||
if (i < 0) {
|
||||
return nullptr;
|
||||
}
|
||||
Node *c = self->children[i];
|
||||
if (c->partialKeyLen > 0) {
|
||||
int commonLen = std::min<int>(c->partialKeyLen, key.size());
|
||||
int partialKeyIndex =
|
||||
longestCommonPrefix(c->partialKey(), key.data(), commonLen);
|
||||
if (partialKeyIndex < c->partialKeyLen) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
remaining = key.subspan(c->partialKeyLen, key.size() - c->partialKeyLen);
|
||||
self->childMaxVersion[i] = maxVersion;
|
||||
return &self->children[i];
|
||||
}
|
||||
TaggedNodePointer *getChildUpdatingMaxVersion(Node16 *self,
|
||||
TrivialSpan &remaining,
|
||||
InternalVersionT maxVersion) {
|
||||
assert(remaining.size() > 0);
|
||||
int index = remaining.front();
|
||||
auto key = remaining.subspan(1, remaining.size() - 1);
|
||||
int i = getNodeIndex(self, index);
|
||||
if (i < 0) {
|
||||
return nullptr;
|
||||
}
|
||||
Node *c = self->children[i];
|
||||
if (c->partialKeyLen > 0) {
|
||||
int commonLen = std::min<int>(c->partialKeyLen, key.size());
|
||||
int partialKeyIndex =
|
||||
longestCommonPrefix(c->partialKey(), key.data(), commonLen);
|
||||
if (partialKeyIndex < c->partialKeyLen) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
remaining = key.subspan(c->partialKeyLen, key.size() - c->partialKeyLen);
|
||||
self->childMaxVersion[i] = maxVersion;
|
||||
return &self->children[i];
|
||||
}
|
||||
TaggedNodePointer *getChildUpdatingMaxVersion(Node48 *self,
|
||||
TrivialSpan &remaining,
|
||||
InternalVersionT maxVersion) {
|
||||
assert(remaining.size() > 0);
|
||||
int index = remaining.front();
|
||||
auto key = remaining.subspan(1, remaining.size() - 1);
|
||||
int i = self->index[index];
|
||||
if (i < 0) {
|
||||
return nullptr;
|
||||
}
|
||||
Node *c = self->children[i];
|
||||
if (c->partialKeyLen > 0) {
|
||||
int commonLen = std::min<int>(c->partialKeyLen, key.size());
|
||||
int partialKeyIndex =
|
||||
longestCommonPrefix(c->partialKey(), key.data(), commonLen);
|
||||
if (partialKeyIndex < c->partialKeyLen) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
remaining = key.subspan(c->partialKeyLen, key.size() - c->partialKeyLen);
|
||||
self->childMaxVersion[i] = maxVersion;
|
||||
self->maxOfMax[i >> Node48::kMaxOfMaxShift] =
|
||||
std::max(self->maxOfMax[i >> Node48::kMaxOfMaxShift], maxVersion);
|
||||
return &self->children[i];
|
||||
}
|
||||
TaggedNodePointer *getChildUpdatingMaxVersion(Node256 *self,
|
||||
TrivialSpan &remaining,
|
||||
InternalVersionT maxVersion) {
|
||||
assert(remaining.size() > 0);
|
||||
int index = remaining.front();
|
||||
auto key = remaining.subspan(1, remaining.size() - 1);
|
||||
auto &n = self->children[index];
|
||||
if (n == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
Node *c = n;
|
||||
if (c->partialKeyLen > 0) {
|
||||
int commonLen = std::min<int>(c->partialKeyLen, key.size());
|
||||
int partialKeyIndex =
|
||||
longestCommonPrefix(c->partialKey(), key.data(), commonLen);
|
||||
if (partialKeyIndex < c->partialKeyLen) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
remaining = key.subspan(c->partialKeyLen, key.size() - c->partialKeyLen);
|
||||
self->childMaxVersion[index] = maxVersion;
|
||||
self->maxOfMax[index >> Node256::kMaxOfMaxShift] =
|
||||
std::max(self->maxOfMax[index >> Node256::kMaxOfMaxShift], maxVersion);
|
||||
return &n;
|
||||
}
|
||||
|
||||
// Precondition: remaining.size() > 0
|
||||
// If a child of self lies along the search path of remaining, return a pointer
|
||||
// to that child, update max version, and consume the matching prefix bytes from
|
||||
// remaining. Otherwise return nullptr without changing the tree at all.
|
||||
TaggedNodePointer *getChildUpdatingMaxVersion(Node *self,
|
||||
TrivialSpan &remaining,
|
||||
InternalVersionT maxVersion) {
|
||||
switch (self->getType()) {
|
||||
case Type_Node0:
|
||||
return getChildUpdatingMaxVersion(static_cast<Node0 *>(self), remaining,
|
||||
maxVersion);
|
||||
case Type_Node3:
|
||||
return getChildUpdatingMaxVersion(static_cast<Node3 *>(self), remaining,
|
||||
maxVersion);
|
||||
case Type_Node16:
|
||||
return getChildUpdatingMaxVersion(static_cast<Node16 *>(self), remaining,
|
||||
maxVersion);
|
||||
case Type_Node48:
|
||||
return getChildUpdatingMaxVersion(static_cast<Node48 *>(self), remaining,
|
||||
maxVersion);
|
||||
case Type_Node256:
|
||||
return getChildUpdatingMaxVersion(static_cast<Node256 *>(self), remaining,
|
||||
maxVersion);
|
||||
default: // GCOVR_EXCL_LINE
|
||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
}
|
||||
|
||||
struct ChildAndMaxVersion {
|
||||
TaggedNodePointer child;
|
||||
InternalVersionT maxVersion;
|
||||
@@ -4283,42 +4154,84 @@ void pointIter(Job *job, Context *context) {
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
|
||||
template <class NodeT> PRESERVE_NONE void commonPrefixIter(Job *, Context *);
|
||||
template <class NodeT> PRESERVE_NONE void beginIter(Job *, Context *);
|
||||
template <class NodeT> PRESERVE_NONE void endIter(Job *, Context *);
|
||||
template <class NodeTFrom, class NodeTTo>
|
||||
PRESERVE_NONE void prefixIter(Job *, Context *);
|
||||
template <class NodeTFrom, class NodeTTo>
|
||||
PRESERVE_NONE void beginIter(Job *, Context *);
|
||||
template <class NodeTFrom, class NodeTTo>
|
||||
PRESERVE_NONE void endIter(Job *, Context *);
|
||||
|
||||
static Continuation commonPrefixIterTable[] = {
|
||||
commonPrefixIter<Node0>, commonPrefixIter<Node3>, commonPrefixIter<Node16>,
|
||||
commonPrefixIter<Node48>, commonPrefixIter<Node256>};
|
||||
template <class NodeTFrom> struct PrefixIterTable {
|
||||
static constexpr Continuation table[] = {
|
||||
prefixIter<NodeTFrom, Node0>, prefixIter<NodeTFrom, Node3>,
|
||||
prefixIter<NodeTFrom, Node16>, prefixIter<NodeTFrom, Node48>,
|
||||
prefixIter<NodeTFrom, Node256>};
|
||||
};
|
||||
|
||||
static Continuation beginIterTable[] = {beginIter<Node0>, beginIter<Node3>,
|
||||
beginIter<Node16>, beginIter<Node48>,
|
||||
beginIter<Node256>};
|
||||
static constexpr Continuation const *prefixIterTable[] = {
|
||||
PrefixIterTable<Node0>::table, PrefixIterTable<Node3>::table,
|
||||
PrefixIterTable<Node16>::table, PrefixIterTable<Node48>::table,
|
||||
PrefixIterTable<Node256>::table,
|
||||
};
|
||||
|
||||
static Continuation endIterTable[] = {endIter<Node0>, endIter<Node3>,
|
||||
endIter<Node16>, endIter<Node48>,
|
||||
endIter<Node256>};
|
||||
template <class NodeTFrom> struct BeginIterTable {
|
||||
static constexpr Continuation table[] = {
|
||||
beginIter<NodeTFrom, Node0>, beginIter<NodeTFrom, Node3>,
|
||||
beginIter<NodeTFrom, Node16>, beginIter<NodeTFrom, Node48>,
|
||||
beginIter<NodeTFrom, Node256>};
|
||||
};
|
||||
|
||||
template <class NodeT> void commonPrefixIter(Job *job, Context *context) {
|
||||
assert(NodeT::kType == job->n->getType());
|
||||
NodeT *n = static_cast<NodeT *>(job->n);
|
||||
static constexpr Continuation const *beginIterTable[] = {
|
||||
BeginIterTable<Node0>::table, BeginIterTable<Node3>::table,
|
||||
BeginIterTable<Node16>::table, BeginIterTable<Node48>::table,
|
||||
BeginIterTable<Node256>::table,
|
||||
};
|
||||
|
||||
TaggedNodePointer *child =
|
||||
getChildUpdatingMaxVersion(n, job->remaining, context->writeVersion);
|
||||
if (child == nullptr) [[unlikely]] {
|
||||
int prefixLen = job->commonPrefixLen - job->remaining.size();
|
||||
assert(prefixLen >= 0);
|
||||
assert(job->n != nullptr);
|
||||
*job->result = {
|
||||
job->n,
|
||||
job->begin.subspan(prefixLen, job->begin.size() - prefixLen),
|
||||
job->n,
|
||||
job->end.subspan(prefixLen, job->end.size() - prefixLen),
|
||||
};
|
||||
MUSTTAIL return complete(job, context);
|
||||
template <class NodeTFrom> struct EndIterTable {
|
||||
static constexpr Continuation table[] = {
|
||||
endIter<NodeTFrom, Node0>, endIter<NodeTFrom, Node3>,
|
||||
endIter<NodeTFrom, Node16>, endIter<NodeTFrom, Node48>,
|
||||
endIter<NodeTFrom, Node256>};
|
||||
};
|
||||
|
||||
static constexpr Continuation const *endIterTable[] = {
|
||||
EndIterTable<Node0>::table, EndIterTable<Node3>::table,
|
||||
EndIterTable<Node16>::table, EndIterTable<Node48>::table,
|
||||
EndIterTable<Node256>::table,
|
||||
};
|
||||
|
||||
template <class NodeTFrom, class NodeTTo>
|
||||
void prefixIter(Job *job, Context *context) {
|
||||
assert(NodeTFrom::kType == job->n->getType());
|
||||
NodeTFrom *n = static_cast<NodeTFrom *>(job->n);
|
||||
assert(NodeTTo::kType == job->child->getType());
|
||||
NodeTTo *child = static_cast<NodeTTo *>(job->child);
|
||||
|
||||
auto key = job->remaining.subspan(1, job->remaining.size() - 1);
|
||||
if (child->partialKeyLen > 0) {
|
||||
int commonLen = std::min<int>(child->partialKeyLen, key.size());
|
||||
int partialKeyIndex =
|
||||
longestCommonPrefix(child->partialKey(), key.data(), commonLen);
|
||||
if (partialKeyIndex < child->partialKeyLen) {
|
||||
goto noNodeOnSearchPath;
|
||||
}
|
||||
}
|
||||
job->n = *child;
|
||||
++context->iterations;
|
||||
|
||||
// child is on the search path. Commit to advancing and updating max version
|
||||
job->n = child;
|
||||
job->remaining =
|
||||
key.subspan(child->partialKeyLen, key.size() - child->partialKeyLen);
|
||||
if constexpr (std::is_same_v<NodeTFrom, Node3> ||
|
||||
std::is_same_v<NodeTFrom, Node16>) {
|
||||
n->childMaxVersion[job->childIndex] = context->writeVersion;
|
||||
} else if constexpr (std::is_same_v<NodeTFrom, Node48> ||
|
||||
std::is_same_v<NodeTFrom, Node256>) {
|
||||
n->maxOfMax[job->childIndex >> NodeTFrom::kMaxOfMaxShift] =
|
||||
std::max(n->maxOfMax[job->childIndex >> NodeTFrom::kMaxOfMaxShift],
|
||||
context->writeVersion);
|
||||
n->childMaxVersion[job->childIndex] = context->writeVersion;
|
||||
}
|
||||
|
||||
if (job->remaining.size() == 0) [[unlikely]] {
|
||||
job->endNode = job->n;
|
||||
job->begin = job->begin.subspan(job->commonPrefixLen,
|
||||
@@ -4326,56 +4239,163 @@ template <class NodeT> void commonPrefixIter(Job *job, Context *context) {
|
||||
job->end = job->end.subspan(job->commonPrefixLen,
|
||||
job->end.size() - job->commonPrefixLen);
|
||||
if (job->begin.size() == 0) [[unlikely]] {
|
||||
job->continuation = endIterTable[child->getType()];
|
||||
goto gotoEndIter;
|
||||
} else if (!job->getChildAndIndex(child, job->begin.front())) [[unlikely]] {
|
||||
goto gotoEndIter;
|
||||
} else {
|
||||
job->continuation = beginIterTable[child->getType()];
|
||||
job->continuation = BeginIterTable<NodeTTo>::table[job->child.getType()];
|
||||
__builtin_prefetch(job->child);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
}
|
||||
|
||||
if (!job->getChildAndIndex(child, job->remaining.front())) [[unlikely]] {
|
||||
goto noNodeOnSearchPath;
|
||||
}
|
||||
|
||||
++context->iterations;
|
||||
job->continuation = PrefixIterTable<NodeTTo>::table[job->child.getType()];
|
||||
__builtin_prefetch(job->child);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
|
||||
noNodeOnSearchPath: {
|
||||
int prefixLen = job->commonPrefixLen - job->remaining.size();
|
||||
assert(prefixLen >= 0);
|
||||
assert(job->n != nullptr);
|
||||
*job->result = {
|
||||
job->n,
|
||||
job->begin.subspan(prefixLen, job->begin.size() - prefixLen),
|
||||
job->n,
|
||||
job->end.subspan(prefixLen, job->end.size() - prefixLen),
|
||||
};
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
|
||||
gotoEndIter:
|
||||
if (!job->getChildAndIndex(child, job->end.front())) [[unlikely]] {
|
||||
*job->result = {
|
||||
job->n,
|
||||
job->begin,
|
||||
job->n,
|
||||
job->end,
|
||||
};
|
||||
MUSTTAIL return complete(job, context);
|
||||
} else {
|
||||
job->continuation = commonPrefixIterTable[child->getType()];
|
||||
job->continuation = EndIterTable<NodeTTo>::table[job->child.getType()];
|
||||
__builtin_prefetch(job->child);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
__builtin_prefetch(job->n);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
|
||||
template <class NodeT> void beginIter(Job *job, Context *context) {
|
||||
assert(NodeT::kType == job->n->getType());
|
||||
NodeT *n = static_cast<NodeT *>(job->n);
|
||||
template <class NodeTFrom, class NodeTTo>
|
||||
void beginIter(Job *job, Context *context) {
|
||||
assert(NodeTFrom::kType == job->n->getType());
|
||||
NodeTFrom *n = static_cast<NodeTFrom *>(job->n);
|
||||
assert(NodeTTo::kType == job->child->getType());
|
||||
NodeTTo *child = static_cast<NodeTTo *>(job->child);
|
||||
|
||||
TaggedNodePointer *child =
|
||||
getChildUpdatingMaxVersion(n, job->begin, context->writeVersion);
|
||||
if (child == nullptr) [[unlikely]] {
|
||||
MUSTTAIL return endIterTable[job->endNode->getType()](job, context);
|
||||
auto key = job->begin.subspan(1, job->begin.size() - 1);
|
||||
if (child->partialKeyLen > 0) {
|
||||
int commonLen = std::min<int>(child->partialKeyLen, key.size());
|
||||
int partialKeyIndex =
|
||||
longestCommonPrefix(child->partialKey(), key.data(), commonLen);
|
||||
if (partialKeyIndex < child->partialKeyLen) {
|
||||
goto gotoEndIter;
|
||||
}
|
||||
}
|
||||
job->n = *child;
|
||||
|
||||
// child is on the search path. Commit to advancing and updating max version
|
||||
job->n = child;
|
||||
job->begin =
|
||||
key.subspan(child->partialKeyLen, key.size() - child->partialKeyLen);
|
||||
if constexpr (std::is_same_v<NodeTFrom, Node3> ||
|
||||
std::is_same_v<NodeTFrom, Node16>) {
|
||||
n->childMaxVersion[job->childIndex] = context->writeVersion;
|
||||
} else if constexpr (std::is_same_v<NodeTFrom, Node48> ||
|
||||
std::is_same_v<NodeTFrom, Node256>) {
|
||||
n->maxOfMax[job->childIndex >> NodeTFrom::kMaxOfMaxShift] =
|
||||
std::max(n->maxOfMax[job->childIndex >> NodeTFrom::kMaxOfMaxShift],
|
||||
context->writeVersion);
|
||||
n->childMaxVersion[job->childIndex] = context->writeVersion;
|
||||
}
|
||||
|
||||
if (job->begin.size() == 0) [[unlikely]] {
|
||||
MUSTTAIL return endIterTable[job->endNode->getType()](job, context);
|
||||
goto gotoEndIter;
|
||||
}
|
||||
|
||||
if (!job->getChildAndIndex(child, job->begin.front())) [[unlikely]] {
|
||||
goto gotoEndIter;
|
||||
}
|
||||
|
||||
++context->iterations;
|
||||
job->continuation = beginIterTable[child->getType()];
|
||||
__builtin_prefetch(job->n);
|
||||
job->continuation = BeginIterTable<NodeTTo>::table[job->child.getType()];
|
||||
__builtin_prefetch(job->child);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
|
||||
gotoEndIter:
|
||||
if (!job->getChildAndIndex(job->endNode, job->end.front())) [[unlikely]] {
|
||||
*job->result = {
|
||||
job->n,
|
||||
job->begin,
|
||||
job->endNode,
|
||||
job->end,
|
||||
};
|
||||
MUSTTAIL return complete(job, context);
|
||||
} else {
|
||||
MUSTTAIL return endIterTable[job->endNode->getType()][job->child.getType()](
|
||||
job, context);
|
||||
}
|
||||
}
|
||||
|
||||
template <class NodeT> void endIter(Job *job, Context *context) {
|
||||
assert(NodeT::kType == job->endNode->getType());
|
||||
NodeT *endNode = static_cast<NodeT *>(job->endNode);
|
||||
template <class NodeTFrom, class NodeTTo>
|
||||
void endIter(Job *job, Context *context) {
|
||||
assert(NodeTFrom::kType == job->endNode->getType());
|
||||
NodeTFrom *endNode = static_cast<NodeTFrom *>(job->endNode);
|
||||
assert(NodeTTo::kType == job->child->getType());
|
||||
NodeTTo *child = static_cast<NodeTTo *>(job->child);
|
||||
|
||||
TaggedNodePointer *child =
|
||||
getChildUpdatingMaxVersion(endNode, job->end, context->writeVersion);
|
||||
if (child == nullptr) [[unlikely]] {
|
||||
auto key = job->end.subspan(1, job->end.size() - 1);
|
||||
if (child->partialKeyLen > 0) {
|
||||
int commonLen = std::min<int>(child->partialKeyLen, key.size());
|
||||
int partialKeyIndex =
|
||||
longestCommonPrefix(child->partialKey(), key.data(), commonLen);
|
||||
if (partialKeyIndex < child->partialKeyLen) {
|
||||
*job->result = {job->n, job->begin, job->endNode, job->end};
|
||||
assert(job->endNode != nullptr);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
}
|
||||
|
||||
// child is on the search path. Commit to advancing and updating max version
|
||||
job->endNode = child;
|
||||
job->end =
|
||||
key.subspan(child->partialKeyLen, key.size() - child->partialKeyLen);
|
||||
if constexpr (std::is_same_v<NodeTFrom, Node3> ||
|
||||
std::is_same_v<NodeTFrom, Node16>) {
|
||||
endNode->childMaxVersion[job->childIndex] = context->writeVersion;
|
||||
} else if constexpr (std::is_same_v<NodeTFrom, Node48> ||
|
||||
std::is_same_v<NodeTFrom, Node256>) {
|
||||
endNode->maxOfMax[job->childIndex >> NodeTFrom::kMaxOfMaxShift] = std::max(
|
||||
endNode->maxOfMax[job->childIndex >> NodeTFrom::kMaxOfMaxShift],
|
||||
context->writeVersion);
|
||||
endNode->childMaxVersion[job->childIndex] = context->writeVersion;
|
||||
}
|
||||
|
||||
if (job->end.size() == 0) [[unlikely]] {
|
||||
*job->result = {job->n, job->begin, job->endNode, job->end};
|
||||
assert(job->endNode != nullptr);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
job->endNode = *child;
|
||||
if (job->remaining.size() == 0) [[unlikely]] {
|
||||
|
||||
if (!job->getChildAndIndex(child, job->end.front())) [[unlikely]] {
|
||||
*job->result = {job->n, job->begin, job->endNode, job->end};
|
||||
assert(job->endNode != nullptr);
|
||||
MUSTTAIL return complete(job, context);
|
||||
}
|
||||
|
||||
++context->iterations;
|
||||
job->continuation = endIterTable[child->getType()];
|
||||
__builtin_prefetch(job->endNode);
|
||||
job->continuation = EndIterTable<NodeTTo>::table[job->child.getType()];
|
||||
__builtin_prefetch(job->child);
|
||||
MUSTTAIL return keepGoing(job, context);
|
||||
}
|
||||
|
||||
@@ -4403,13 +4423,34 @@ void Job::init(Context *context, int index) {
|
||||
|
||||
if (commonPrefixLen > 0) {
|
||||
// common prefix iter will set endNode
|
||||
continuation = commonPrefixIterTable[n->getType()];
|
||||
} else if (begin.size() > 0) {
|
||||
if (!getChildAndIndex(n, remaining.front())) [[unlikely]] {
|
||||
*result = {
|
||||
n,
|
||||
begin,
|
||||
n,
|
||||
end,
|
||||
};
|
||||
continuation = complete;
|
||||
} else {
|
||||
continuation = prefixIterTable[n->getType()][child.getType()];
|
||||
}
|
||||
} else if (begin.size() > 0 && getChildAndIndex(n, begin.front())) {
|
||||
endNode = n;
|
||||
continuation = beginIterTable[n->getType()];
|
||||
continuation = beginIterTable[n->getType()][child.getType()];
|
||||
} else {
|
||||
assert(end.size() > 0);
|
||||
endNode = n;
|
||||
continuation = endIterTable[n->getType()];
|
||||
if (!getChildAndIndex(n, end.front())) [[unlikely]] {
|
||||
*result = {
|
||||
n,
|
||||
begin,
|
||||
n,
|
||||
end,
|
||||
};
|
||||
continuation = complete;
|
||||
} else {
|
||||
continuation = endIterTable[n->getType()][child.getType()];
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -4417,11 +4458,11 @@ pointWrite:
|
||||
remaining = TrivialSpan(context->writes[index].begin.p,
|
||||
context->writes[index].begin.len);
|
||||
if (remaining.size() == 0) [[unlikely]] {
|
||||
context->results[index] = {n, remaining};
|
||||
*result = {n, remaining};
|
||||
continuation = complete;
|
||||
} else {
|
||||
if (!getChildAndIndex(n, remaining.front())) [[unlikely]] {
|
||||
context->results[index] = {n, remaining};
|
||||
*result = {n, remaining};
|
||||
continuation = complete;
|
||||
} else {
|
||||
continuation = pointIterTable[n->getType()][child.getType()];
|
||||
@@ -4876,7 +4917,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
check::Context context;
|
||||
context.readContext.impl = this;
|
||||
|
||||
#if __has_attribute(preserve_none) && __has_attribute(musttail)
|
||||
#if __has_attribute(musttail)
|
||||
if (count == 1) {
|
||||
useSequential(reads, result, count, context);
|
||||
} else {
|
||||
@@ -5093,7 +5134,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
assert(allPointWrites || sorted);
|
||||
#endif
|
||||
|
||||
#if __has_attribute(preserve_none) && __has_attribute(musttail)
|
||||
#if __has_attribute(musttail)
|
||||
constexpr bool kEnableInterleaved = true;
|
||||
#else
|
||||
constexpr bool kEnableInterleaved = false;
|
||||
|
||||
BIN
corpus/03680111265d5f0b8816feb73069cf1f6538d4dd
Normal file
BIN
corpus/03680111265d5f0b8816feb73069cf1f6538d4dd
Normal file
Binary file not shown.
BIN
corpus/04338408516abc9c563802aadc522db002e0a5d0
Normal file
BIN
corpus/04338408516abc9c563802aadc522db002e0a5d0
Normal file
Binary file not shown.
BIN
corpus/051590b47c5269306a3a8894eb3d72d86c4a6e71
Normal file
BIN
corpus/051590b47c5269306a3a8894eb3d72d86c4a6e71
Normal file
Binary file not shown.
BIN
corpus/056fee409c5511f6a7456cd4791d9385f6d5ebbe
Normal file
BIN
corpus/056fee409c5511f6a7456cd4791d9385f6d5ebbe
Normal file
Binary file not shown.
BIN
corpus/05a237bf01382822789d33bda1b24298e13bb031
Normal file
BIN
corpus/05a237bf01382822789d33bda1b24298e13bb031
Normal file
Binary file not shown.
BIN
corpus/065ec99952bffeb53f340d8cee645654f5b1e891
Normal file
BIN
corpus/065ec99952bffeb53f340d8cee645654f5b1e891
Normal file
Binary file not shown.
BIN
corpus/069fd605e510b2218cf1b10ec79ae00763aeb195
Normal file
BIN
corpus/069fd605e510b2218cf1b10ec79ae00763aeb195
Normal file
Binary file not shown.
BIN
corpus/0707680f7d9ce11dd30c6536f05848d598fb27d4
Normal file
BIN
corpus/0707680f7d9ce11dd30c6536f05848d598fb27d4
Normal file
Binary file not shown.
BIN
corpus/07854cf6f54c192387047cfc49a65e4b1bdca4a1
Normal file
BIN
corpus/07854cf6f54c192387047cfc49a65e4b1bdca4a1
Normal file
Binary file not shown.
BIN
corpus/086ae03d7492047d12383776a7a2dd10acb6a030
Normal file
BIN
corpus/086ae03d7492047d12383776a7a2dd10acb6a030
Normal file
Binary file not shown.
BIN
corpus/08f6fcd47ba57d41f5cae4a040e8318fc2f653da
Normal file
BIN
corpus/08f6fcd47ba57d41f5cae4a040e8318fc2f653da
Normal file
Binary file not shown.
BIN
corpus/09b0a61939d3133f61a4b0aaee5149503e3019a1
Normal file
BIN
corpus/09b0a61939d3133f61a4b0aaee5149503e3019a1
Normal file
Binary file not shown.
BIN
corpus/09c0b1f06a1e9bfdfb8842ec414f97ade10cddf4
Normal file
BIN
corpus/09c0b1f06a1e9bfdfb8842ec414f97ade10cddf4
Normal file
Binary file not shown.
BIN
corpus/0a0da5b17a24b0282501d2f380dc52aefd4d9b9f
Normal file
BIN
corpus/0a0da5b17a24b0282501d2f380dc52aefd4d9b9f
Normal file
Binary file not shown.
BIN
corpus/0baea27108df93d537bcc0de459495d5f17382a0
Normal file
BIN
corpus/0baea27108df93d537bcc0de459495d5f17382a0
Normal file
Binary file not shown.
BIN
corpus/0bee3319fe0f3462a7f0cb7c8eeb616d4660add7
Normal file
BIN
corpus/0bee3319fe0f3462a7f0cb7c8eeb616d4660add7
Normal file
Binary file not shown.
BIN
corpus/0c757a21c9d2629c51923f943dc2c79c4bcbca4a
Normal file
BIN
corpus/0c757a21c9d2629c51923f943dc2c79c4bcbca4a
Normal file
Binary file not shown.
BIN
corpus/0cbb486e842f843588f084c6480e42e2cfef60b2
Normal file
BIN
corpus/0cbb486e842f843588f084c6480e42e2cfef60b2
Normal file
Binary file not shown.
BIN
corpus/0cfc86eecaf16f682bcce978ce41d35a016a0a7f
Normal file
BIN
corpus/0cfc86eecaf16f682bcce978ce41d35a016a0a7f
Normal file
Binary file not shown.
BIN
corpus/0d19837d6411c43e7e7c3f8ae592719fd1e556e2
Normal file
BIN
corpus/0d19837d6411c43e7e7c3f8ae592719fd1e556e2
Normal file
Binary file not shown.
BIN
corpus/0d28b7cc8c4d9359f045df42f88dd30ee52b8477
Normal file
BIN
corpus/0d28b7cc8c4d9359f045df42f88dd30ee52b8477
Normal file
Binary file not shown.
BIN
corpus/0fbd6aa91e6a6c89f575d339b9f103a057b80ba6
Normal file
BIN
corpus/0fbd6aa91e6a6c89f575d339b9f103a057b80ba6
Normal file
Binary file not shown.
BIN
corpus/10550b94427665b340d6201df040db42d9d80f51
Normal file
BIN
corpus/10550b94427665b340d6201df040db42d9d80f51
Normal file
Binary file not shown.
BIN
corpus/115428a9c006c54696c148fd767af66ca4d10d3a
Normal file
BIN
corpus/115428a9c006c54696c148fd767af66ca4d10d3a
Normal file
Binary file not shown.
BIN
corpus/11570d892b76b3cdfc2b4d05d4424b5668e295a1
Normal file
BIN
corpus/11570d892b76b3cdfc2b4d05d4424b5668e295a1
Normal file
Binary file not shown.
BIN
corpus/117bea9f82fbe640745537fbc7177bccc37d1335
Normal file
BIN
corpus/117bea9f82fbe640745537fbc7177bccc37d1335
Normal file
Binary file not shown.
BIN
corpus/1238fee9b77c9426b7a2a358216792729766b923
Normal file
BIN
corpus/1238fee9b77c9426b7a2a358216792729766b923
Normal file
Binary file not shown.
BIN
corpus/12a8e5475cb4612eb6a4f67249f9f41f3b860a2e
Normal file
BIN
corpus/12a8e5475cb4612eb6a4f67249f9f41f3b860a2e
Normal file
Binary file not shown.
BIN
corpus/13f2972e7dba20617c098ecc0e915648b9941291
Normal file
BIN
corpus/13f2972e7dba20617c098ecc0e915648b9941291
Normal file
Binary file not shown.
BIN
corpus/13fc8594ba2eb1fe1f3077871b6c002601a6d821
Normal file
BIN
corpus/13fc8594ba2eb1fe1f3077871b6c002601a6d821
Normal file
Binary file not shown.
BIN
corpus/16bd8844fd3273c121acb6a5f887337ad4e73581
Normal file
BIN
corpus/16bd8844fd3273c121acb6a5f887337ad4e73581
Normal file
Binary file not shown.
BIN
corpus/1867231b5449c3db148a4b7ea2fa6dd76066413c
Normal file
BIN
corpus/1867231b5449c3db148a4b7ea2fa6dd76066413c
Normal file
Binary file not shown.
BIN
corpus/197971327a6de9828bcc0a546cb2a34a45b875cc
Normal file
BIN
corpus/197971327a6de9828bcc0a546cb2a34a45b875cc
Normal file
Binary file not shown.
BIN
corpus/199f42f2f6293f1f4afb5cd410adccc3ccdcd419
Normal file
BIN
corpus/199f42f2f6293f1f4afb5cd410adccc3ccdcd419
Normal file
Binary file not shown.
BIN
corpus/19e53ed65e56aa109e4e03cf44e33ffb2685f9de
Normal file
BIN
corpus/19e53ed65e56aa109e4e03cf44e33ffb2685f9de
Normal file
Binary file not shown.
BIN
corpus/1af3bdd9b681aceef88dc56f3a395b3abe0f0094
Normal file
BIN
corpus/1af3bdd9b681aceef88dc56f3a395b3abe0f0094
Normal file
Binary file not shown.
BIN
corpus/1b05adc6a642190af7b15068aad1c14018a5b9c2
Normal file
BIN
corpus/1b05adc6a642190af7b15068aad1c14018a5b9c2
Normal file
Binary file not shown.
BIN
corpus/1b9184485ca84a699abfd5c9dfdf354db8b2520d
Normal file
BIN
corpus/1b9184485ca84a699abfd5c9dfdf354db8b2520d
Normal file
Binary file not shown.
BIN
corpus/1b9b7fad0ea68f51a1e370bfd40b74c99e9a5d7a
Normal file
BIN
corpus/1b9b7fad0ea68f51a1e370bfd40b74c99e9a5d7a
Normal file
Binary file not shown.
BIN
corpus/1bcc7c0c607a5c48723d83e63183911e40acbad1
Normal file
BIN
corpus/1bcc7c0c607a5c48723d83e63183911e40acbad1
Normal file
Binary file not shown.
BIN
corpus/1cba7f6327e2da1443dd5fcfa577dd16af99d733
Normal file
BIN
corpus/1cba7f6327e2da1443dd5fcfa577dd16af99d733
Normal file
Binary file not shown.
BIN
corpus/1cee802cde4b713764f919e30b2195315bf8dd1c
Normal file
BIN
corpus/1cee802cde4b713764f919e30b2195315bf8dd1c
Normal file
Binary file not shown.
BIN
corpus/1d2d10b95e8abfac75362f68589c917090024422
Normal file
BIN
corpus/1d2d10b95e8abfac75362f68589c917090024422
Normal file
Binary file not shown.
BIN
corpus/1d6d0029bbb92b2778d8e5dc31e82e7c0e3a9842
Normal file
BIN
corpus/1d6d0029bbb92b2778d8e5dc31e82e7c0e3a9842
Normal file
Binary file not shown.
BIN
corpus/1db412544d6c0429e304b654d4bcf5d2b5acd4c2
Normal file
BIN
corpus/1db412544d6c0429e304b654d4bcf5d2b5acd4c2
Normal file
Binary file not shown.
BIN
corpus/1dc7b413ebf40e621e625b00460575ca1366f1a8
Normal file
BIN
corpus/1dc7b413ebf40e621e625b00460575ca1366f1a8
Normal file
Binary file not shown.
BIN
corpus/1dd4463402f8b60e4d8abc7176cd612c6c5785bc
Normal file
BIN
corpus/1dd4463402f8b60e4d8abc7176cd612c6c5785bc
Normal file
Binary file not shown.
BIN
corpus/1f731b969edae07b5ea928e234d06f7fefc55cf4
Normal file
BIN
corpus/1f731b969edae07b5ea928e234d06f7fefc55cf4
Normal file
Binary file not shown.
BIN
corpus/2004286d3df20133de9d67de1db3e41404acccb6
Normal file
BIN
corpus/2004286d3df20133de9d67de1db3e41404acccb6
Normal file
Binary file not shown.
BIN
corpus/2054bc5cbcce55a94a6005ebb10e26f0a1aeee25
Normal file
BIN
corpus/2054bc5cbcce55a94a6005ebb10e26f0a1aeee25
Normal file
Binary file not shown.
BIN
corpus/208ed3a8f3ac81628a93659812e46928f25fd257
Normal file
BIN
corpus/208ed3a8f3ac81628a93659812e46928f25fd257
Normal file
Binary file not shown.
BIN
corpus/209994b63772c438d11e70b7a5db284a3485e8bd
Normal file
BIN
corpus/209994b63772c438d11e70b7a5db284a3485e8bd
Normal file
Binary file not shown.
BIN
corpus/2141e14989f6343621791863a12c8fc37f29f797
Normal file
BIN
corpus/2141e14989f6343621791863a12c8fc37f29f797
Normal file
Binary file not shown.
BIN
corpus/215cfa12adfcbbb7f57c65f277c655e22c58d49d
Normal file
BIN
corpus/215cfa12adfcbbb7f57c65f277c655e22c58d49d
Normal file
Binary file not shown.
BIN
corpus/2521403f60ba737fc15cad82c479399cb4cb9269
Normal file
BIN
corpus/2521403f60ba737fc15cad82c479399cb4cb9269
Normal file
Binary file not shown.
BIN
corpus/2572f83ef1fcb61e72eb5965ebcaff448b318b20
Normal file
BIN
corpus/2572f83ef1fcb61e72eb5965ebcaff448b318b20
Normal file
Binary file not shown.
BIN
corpus/259d4e035d0d262fa342d3541ce4ec750437901a
Normal file
BIN
corpus/259d4e035d0d262fa342d3541ce4ec750437901a
Normal file
Binary file not shown.
BIN
corpus/261718c505fdaa402ff1756b8d5d03ed3030a092
Normal file
BIN
corpus/261718c505fdaa402ff1756b8d5d03ed3030a092
Normal file
Binary file not shown.
BIN
corpus/26d56ba145cb67ba9d430e1aad0c0a036564691f
Normal file
BIN
corpus/26d56ba145cb67ba9d430e1aad0c0a036564691f
Normal file
Binary file not shown.
BIN
corpus/2b46e55d02b3ac0d41106598bf8a8f4cccca39c0
Normal file
BIN
corpus/2b46e55d02b3ac0d41106598bf8a8f4cccca39c0
Normal file
Binary file not shown.
BIN
corpus/2d3b4f10420d5a658056a67f79ccc8655cf1cdfb
Normal file
BIN
corpus/2d3b4f10420d5a658056a67f79ccc8655cf1cdfb
Normal file
Binary file not shown.
BIN
corpus/2e6bf7fb574e92b63c9d28a4803c6ce3e6870525
Normal file
BIN
corpus/2e6bf7fb574e92b63c9d28a4803c6ce3e6870525
Normal file
Binary file not shown.
BIN
corpus/2fae81616faf6fb0c230ad4a61571d06acb1e0ba
Normal file
BIN
corpus/2fae81616faf6fb0c230ad4a61571d06acb1e0ba
Normal file
Binary file not shown.
BIN
corpus/308a3b8692e0bc2d346fecc40cd95d3ae465bf85
Normal file
BIN
corpus/308a3b8692e0bc2d346fecc40cd95d3ae465bf85
Normal file
Binary file not shown.
BIN
corpus/33c3df6d25c82bcb4935180a6520fa8b06cc2400
Normal file
BIN
corpus/33c3df6d25c82bcb4935180a6520fa8b06cc2400
Normal file
Binary file not shown.
BIN
corpus/3433772ed46e9fba539363ac76449e774e4fb96b
Normal file
BIN
corpus/3433772ed46e9fba539363ac76449e774e4fb96b
Normal file
Binary file not shown.
BIN
corpus/3493d64bcfbfb60c4371931d7b05eded4ac45358
Normal file
BIN
corpus/3493d64bcfbfb60c4371931d7b05eded4ac45358
Normal file
Binary file not shown.
BIN
corpus/34fff67018503ae004c574e2653b2a5ee5a0ba9c
Normal file
BIN
corpus/34fff67018503ae004c574e2653b2a5ee5a0ba9c
Normal file
Binary file not shown.
BIN
corpus/369f55c58741c8eee864327dcde208a59786c037
Normal file
BIN
corpus/369f55c58741c8eee864327dcde208a59786c037
Normal file
Binary file not shown.
BIN
corpus/38865fd4e7a99583398b7d1e4ce31402f69bc3cb
Normal file
BIN
corpus/38865fd4e7a99583398b7d1e4ce31402f69bc3cb
Normal file
Binary file not shown.
BIN
corpus/38e4c12ac2487e74a1a995160611e875f75d17e4
Normal file
BIN
corpus/38e4c12ac2487e74a1a995160611e875f75d17e4
Normal file
Binary file not shown.
BIN
corpus/3901043b96e6df98dcd71e17456e8bb7be23101a
Normal file
BIN
corpus/3901043b96e6df98dcd71e17456e8bb7be23101a
Normal file
Binary file not shown.
BIN
corpus/3947a88a836ad235d81c297f302398fa159e519e
Normal file
BIN
corpus/3947a88a836ad235d81c297f302398fa159e519e
Normal file
Binary file not shown.
BIN
corpus/396135a8da5a76e2787afdc28ffc2b558df864a2
Normal file
BIN
corpus/396135a8da5a76e2787afdc28ffc2b558df864a2
Normal file
Binary file not shown.
BIN
corpus/3a2946154fbd0f4b329d82c268e768e81e913156
Normal file
BIN
corpus/3a2946154fbd0f4b329d82c268e768e81e913156
Normal file
Binary file not shown.
BIN
corpus/3bcee30fadd7a573963e3b6b9ce721447a6b8e77
Normal file
BIN
corpus/3bcee30fadd7a573963e3b6b9ce721447a6b8e77
Normal file
Binary file not shown.
BIN
corpus/3c2b7e814a249482da4236a9fd604f3a26c54b7a
Normal file
BIN
corpus/3c2b7e814a249482da4236a9fd604f3a26c54b7a
Normal file
Binary file not shown.
BIN
corpus/3d79f4fc62b9920aee682d12f461ce1777d3b87a
Normal file
BIN
corpus/3d79f4fc62b9920aee682d12f461ce1777d3b87a
Normal file
Binary file not shown.
BIN
corpus/405c89dbb1043a1aefa0f72f371ccf9da62b7dda
Normal file
BIN
corpus/405c89dbb1043a1aefa0f72f371ccf9da62b7dda
Normal file
Binary file not shown.
BIN
corpus/414e0b594ff601512f7bdc00dc87ce1027322a30
Normal file
BIN
corpus/414e0b594ff601512f7bdc00dc87ce1027322a30
Normal file
Binary file not shown.
BIN
corpus/41ccb87c128293dc1f78d36ca683a995b0ef64b7
Normal file
BIN
corpus/41ccb87c128293dc1f78d36ca683a995b0ef64b7
Normal file
Binary file not shown.
BIN
corpus/42c93a9b037ac5c7cbf6434fca4f96684ae4f57e
Normal file
BIN
corpus/42c93a9b037ac5c7cbf6434fca4f96684ae4f57e
Normal file
Binary file not shown.
BIN
corpus/434f826fe58dae5b06b59738c95757a88e1c9608
Normal file
BIN
corpus/434f826fe58dae5b06b59738c95757a88e1c9608
Normal file
Binary file not shown.
BIN
corpus/44fd86586bb8b35156655efa7282744af322b4c6
Normal file
BIN
corpus/44fd86586bb8b35156655efa7282744af322b4c6
Normal file
Binary file not shown.
BIN
corpus/451cf1bcecb3ee43e9e6679a48f8a7ccf13a2f3a
Normal file
BIN
corpus/451cf1bcecb3ee43e9e6679a48f8a7ccf13a2f3a
Normal file
Binary file not shown.
BIN
corpus/4586dbec4df2724e8aa0ff53ff281549ba9bf1fd
Normal file
BIN
corpus/4586dbec4df2724e8aa0ff53ff281549ba9bf1fd
Normal file
Binary file not shown.
BIN
corpus/465183bb5c50cfbea907287e80904697955dd2fb
Normal file
BIN
corpus/465183bb5c50cfbea907287e80904697955dd2fb
Normal file
Binary file not shown.
BIN
corpus/468821f8994715e5f0c1f5229a66bcc8691432fe
Normal file
BIN
corpus/468821f8994715e5f0c1f5229a66bcc8691432fe
Normal file
Binary file not shown.
BIN
corpus/475fd0a2a665bb387ce7fb7cad91691f745149ec
Normal file
BIN
corpus/475fd0a2a665bb387ce7fb7cad91691f745149ec
Normal file
Binary file not shown.
BIN
corpus/479aeeb4801184c00b4bf183640143b112af51c4
Normal file
BIN
corpus/479aeeb4801184c00b4bf183640143b112af51c4
Normal file
Binary file not shown.
BIN
corpus/47b701c17006f7dc56bd4ac45abd31e70c160274
Normal file
BIN
corpus/47b701c17006f7dc56bd4ac45abd31e70c160274
Normal file
Binary file not shown.
BIN
corpus/48c31f0bb9c3ef4bea384a6a46b52a9b113c65a4
Normal file
BIN
corpus/48c31f0bb9c3ef4bea384a6a46b52a9b113c65a4
Normal file
Binary file not shown.
BIN
corpus/48e6511ad3f1a659097ecdc9ae85d2e3a74d943d
Normal file
BIN
corpus/48e6511ad3f1a659097ecdc9ae85d2e3a74d943d
Normal file
Binary file not shown.
BIN
corpus/4a31a19f3558d76a8cb3e5431d564f1e5db37153
Normal file
BIN
corpus/4a31a19f3558d76a8cb3e5431d564f1e5db37153
Normal file
Binary file not shown.
BIN
corpus/4aa7d849a654be7034f0e2afa58e027754e659ad
Normal file
BIN
corpus/4aa7d849a654be7034f0e2afa58e027754e659ad
Normal file
Binary file not shown.
BIN
corpus/4b03b94377b450efa116a3ac1816c49b50303807
Normal file
BIN
corpus/4b03b94377b450efa116a3ac1816c49b50303807
Normal file
Binary file not shown.
BIN
corpus/4b6c88ef1ff7c3746969a810e449ab6632fdbebf
Normal file
BIN
corpus/4b6c88ef1ff7c3746969a810e449ab6632fdbebf
Normal file
Binary file not shown.
BIN
corpus/4cceb8617d8c0b5bf7af3c1d9f9be5b95d445fe6
Normal file
BIN
corpus/4cceb8617d8c0b5bf7af3c1d9f9be5b95d445fe6
Normal file
Binary file not shown.
BIN
corpus/4d90011a10e3fb8403c589b1e8d616b23d4e6b6a
Normal file
BIN
corpus/4d90011a10e3fb8403c589b1e8d616b23d4e6b6a
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user