From ef99ae108f0c37d6e3ee1d582f8eb1ac3eb95011 Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Wed, 23 Nov 2016 15:38:26 +1100 Subject: [PATCH] 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. --- src/nfagraph/ng_uncalc_components.cpp | 16 ++++++++-------- src/nfagraph/ng_uncalc_components.h | 13 +++++-------- src/rose/rose_build_merge.cpp | 6 +++--- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/nfagraph/ng_uncalc_components.cpp b/src/nfagraph/ng_uncalc_components.cpp index 877c396c..4ad5ff78 100644 --- a/src/nfagraph/ng_uncalc_components.cpp +++ b/src/nfagraph/ng_uncalc_components.cpp @@ -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 &cluster, - const ReportManager *rm, - map &merged, - const CompileContext &cc) { +map mergeNfaCluster(const vector &cluster, + const ReportManager *rm, + const CompileContext &cc) { + map merged; + if (cluster.size() < 2) { - return; + return merged; } DEBUG_PRINTF("new cluster, size %zu\n", cluster.size()); - merged.clear(); priority_queue pq; buildNfaMergeQueue(cluster, &pq); @@ -591,6 +589,8 @@ void mergeNfaCluster(const vector &cluster, } } } + + return merged; } } // namespace ue2 diff --git a/src/nfagraph/ng_uncalc_components.h b/src/nfagraph/ng_uncalc_components.h index d7883578..b0f42670 100644 --- a/src/nfagraph/ng_uncalc_components.h +++ b/src/nfagraph/ng_uncalc_components.h @@ -36,13 +36,11 @@ #include #include -#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 &cluster, - const ReportManager *rm, - std::map &merged, - const CompileContext &cc); +std::map +mergeNfaCluster(const std::vector &cluster, const ReportManager *rm, + const CompileContext &cc); /** * \brief Merge graph \p ga into graph \p gb. diff --git a/src/rose/rose_build_merge.cpp b/src/rose/rose_build_merge.cpp index 2643bdca..54a7390e 100644 --- a/src/rose/rose_build_merge.cpp +++ b/src/rose/rose_build_merge.cpp @@ -311,8 +311,7 @@ void mergeCluster(RoseGraph &g, const ReportManager &rm, it = it2; DEBUG_PRINTF("merging cluster %zu\n", cluster.size()); - map 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 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(); } }