]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
ng_region: don't realloc exits
authorJustin Viiret <justin.viiret@intel.com>
Tue, 21 Mar 2017 06:19:56 +0000 (17:19 +1100)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 26 Apr 2017 05:18:13 +0000 (15:18 +1000)
src/nfagraph/ng_region.cpp

index 39a8a504b77b1e770d5f345f8087cc5cc43c6127..2391082a085c1a4d984382f299f4429cb7ce698f 100644 (file)
@@ -104,15 +104,12 @@ void checkAndAddExitCandidate(const AcyclicGraph &g,
 }
 
 static
-vector<exit_info> findExits(const AcyclicGraph &g,
-                            const ue2::unordered_set<NFAVertex> &r) {
-    vector<exit_info> exits;
-
+void findExits(const AcyclicGraph &g, const ue2::unordered_set<NFAVertex> &r,
+               vector<exit_info> &exits) {
+    exits.clear();
     for (auto v : r) {
         checkAndAddExitCandidate(g, r, v, exits);
     }
-
-    return exits;
 }
 
 static
@@ -179,26 +176,26 @@ void buildInitialCandidate(const AcyclicGraph &g,
                            ue2::unordered_set<NFAVertex> *candidate,
                            /* in exits of prev region;
                             * out exits from candidate */
-                           vector<exit_info> *exits,
+                           vector<exit_info> &exits,
                            flat_set<NFAVertex> *open_jumps) {
     if (it == ite) {
         candidate->clear();
-        exits->clear();
+        exits.clear();
         return;
     }
 
-    if (exits->empty()) {
+    if (exits.empty()) {
         DEBUG_PRINTF("odd\n");
         candidate->clear();
         DEBUG_PRINTF("adding %zu to initial\n", g[*it].index);
         candidate->insert(*it);
         open_jumps->erase(*it);
-        checkAndAddExitCandidate(g, *candidate, *it, *exits);
+        checkAndAddExitCandidate(g, *candidate, *it, exits);
         ++it;
         return;
     }
 
-    auto enters = (*exits)[0].open; // copy
+    auto enters = exits.front().open; // copy
     candidate->clear();
 
     for (; it != ite; ++it) {
@@ -218,7 +215,7 @@ void buildInitialCandidate(const AcyclicGraph &g,
         open_jumps->clear();
     }
 
-    *exits = findExits(g, *candidate);
+    findExits(g, *candidate, exits);
 }
 
 static
@@ -237,7 +234,8 @@ void findDagLeaders(const NGHolder &h, const AcyclicGraph &g,
     assert(t_it != topo.rend());
     candidate.insert(*t_it++);
 
-    auto exits = findExits(g, candidate);
+    vector<exit_info> exits;
+    findExits(g, candidate, exits);
 
     while (t_it != topo.rend()) {
         assert(!candidate.empty());
@@ -253,7 +251,7 @@ void findDagLeaders(const NGHolder &h, const AcyclicGraph &g,
                 DEBUG_PRINTF("setting region %u\n", curr_id);
             }
             setRegion(candidate, curr_id++, regions);
-            buildInitialCandidate(g, t_it, topo.rend(), &candidate, &exits,
+            buildInitialCandidate(g, t_it, topo.rend(), &candidate, exits,
                                   &open_jumps);
         } else {
             NFAVertex curr = *t_it;