]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
rose_build_merge: correctly merge NFA outfixes
authorJustin Viiret <justin.viiret@intel.com>
Wed, 23 Nov 2016 04:38:26 +0000 (15:38 +1100)
committerMatthew Barr <matthew.barr@intel.com>
Fri, 2 Dec 2016 00:34:52 +0000 (11:34 +1100)
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
src/nfagraph/ng_uncalc_components.h
src/rose/rose_build_merge.cpp

index 877c396c0189cd1b820ebb2a29a96dc00ea4ccd7..4ad5ff7875a8547899b4e73bfffcc15c8d994652 100644 (file)
@@ -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
index d78835789071ee6b0514a0d6e91332ce275b6854..b0f42670a36f4105d564f4d3f1a8eccb309f4a4b 100644 (file)
 #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.
index 2643bdcaafe01dcb82136f5e38424b6d906347b2..54a7390ea917f026a0768674d5837421625d9436 100644 (file)
@@ -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();
         }
     }