mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
rose_build_merge: correctly merge NFA outfixes
We were not doing our bookkeeping properly for merges where the number of NFAs was greater than the batch size of 200.
This commit is contained in:
parent
eb7759361d
commit
ef99ae108f
@ -551,18 +551,16 @@ bool mergeNfaPair(const NGHolder &ga, NGHolder &gb, const ReportManager *rm,
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Merge the group of graphs in \p cluster where possible. The (from, to)
|
||||
* mapping of merged graphs is returned in \p merged. */
|
||||
void mergeNfaCluster(const vector<NGHolder *> &cluster,
|
||||
const ReportManager *rm,
|
||||
map<NGHolder *, NGHolder *> &merged,
|
||||
const CompileContext &cc) {
|
||||
map<NGHolder *, NGHolder *> mergeNfaCluster(const vector<NGHolder *> &cluster,
|
||||
const ReportManager *rm,
|
||||
const CompileContext &cc) {
|
||||
map<NGHolder *, NGHolder *> merged;
|
||||
|
||||
if (cluster.size() < 2) {
|
||||
return;
|
||||
return merged;
|
||||
}
|
||||
|
||||
DEBUG_PRINTF("new cluster, size %zu\n", cluster.size());
|
||||
merged.clear();
|
||||
|
||||
priority_queue<NfaMergeCandidateH> pq;
|
||||
buildNfaMergeQueue(cluster, &pq);
|
||||
@ -591,6 +589,8 @@ void mergeNfaCluster(const vector<NGHolder *> &cluster,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return merged;
|
||||
}
|
||||
|
||||
} // namespace ue2
|
||||
|
@ -36,13 +36,11 @@
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
#include "nfagraph/ng_holder.h"
|
||||
#include "util/ue2_containers.h"
|
||||
|
||||
namespace ue2 {
|
||||
|
||||
struct CompileContext;
|
||||
struct Grey;
|
||||
class NGHolder;
|
||||
class ReportManager;
|
||||
|
||||
/**
|
||||
@ -56,12 +54,11 @@ u32 commonPrefixLength(const NGHolder &ga, const NGHolder &gb);
|
||||
/**
|
||||
* \brief Merge the group of graphs in \p cluster where possible.
|
||||
*
|
||||
* The (from, to) mapping of merged graphs is returned in \p merged.
|
||||
* The (from, to) mapping of merged graphs is returned.
|
||||
*/
|
||||
void mergeNfaCluster(const std::vector<NGHolder *> &cluster,
|
||||
const ReportManager *rm,
|
||||
std::map<NGHolder *, NGHolder *> &merged,
|
||||
const CompileContext &cc);
|
||||
std::map<NGHolder *, NGHolder *>
|
||||
mergeNfaCluster(const std::vector<NGHolder *> &cluster, const ReportManager *rm,
|
||||
const CompileContext &cc);
|
||||
|
||||
/**
|
||||
* \brief Merge graph \p ga into graph \p gb.
|
||||
|
@ -311,8 +311,7 @@ void mergeCluster(RoseGraph &g, const ReportManager &rm,
|
||||
it = it2;
|
||||
|
||||
DEBUG_PRINTF("merging cluster %zu\n", cluster.size());
|
||||
map<NGHolder *, NGHolder *> merged;
|
||||
mergeNfaCluster(cluster, &rm, merged, cc);
|
||||
auto merged = mergeNfaCluster(cluster, &rm, cc);
|
||||
DEBUG_PRINTF("done\n");
|
||||
|
||||
for (const auto &m : merged) {
|
||||
@ -2414,7 +2413,8 @@ map<NGHolder *, NGHolder *> chunkedNfaMerge(RoseBuildImpl &build,
|
||||
batch.push_back(*it);
|
||||
assert((*it)->kind == NFA_OUTFIX);
|
||||
if (batch.size() == MERGE_GROUP_SIZE_MAX || next(it) == ite) {
|
||||
mergeNfaCluster(batch, &build.rm, merged, build.cc);
|
||||
auto batch_merged = mergeNfaCluster(batch, &build.rm, build.cc);
|
||||
insert(&merged, batch_merged);
|
||||
batch.clear();
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user