]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
ng_violet: fix non-det in lookForCleanEarlySplits
authorJustin Viiret <justin.viiret@intel.com>
Wed, 27 Jul 2016 01:19:58 +0000 (11:19 +1000)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 10 Aug 2016 05:07:45 +0000 (15:07 +1000)
src/nfagraph/ng_violet.cpp

index 757582f56440da27aedcacd0b01390781b5f8021..26fb0ef58485a4986d41b31ebafad5e42dc51ae8 100644 (file)
@@ -2529,15 +2529,22 @@ bool lookForCleanSplit(const NGHolder &h, const vector<RoseInEdge> &ee,
 static
 void lookForCleanEarlySplits(RoseInGraph &vg, const CompileContext &cc) {
     u32 gen = 0;
-    set<RoseInVertex> prev = {getStart(vg)};
+
+    vector<RoseInVertex> prev = {getStart(vg)};
 
     while (gen < MAX_DESIRED_CLEAN_SPLIT_DEPTH) {
-        set<RoseInVertex> curr;
+        /* collect vertices in edge order for determinism */
+        vector<RoseInVertex> curr;
+        set<RoseInVertex> curr_seen;
         for (RoseInVertex u : prev) {
-            insert(&curr, adjacent_vertices(u, vg));
+            for (auto v : adjacent_vertices_range(u, vg)) {
+                if (curr_seen.insert(v).second) {
+                    curr.push_back(v);
+                }
+            }
         }
 
-        map<const NGHolder *, vector<RoseInEdge> > rightfixes;
+        map<const NGHolder *, vector<RoseInEdge>> rightfixes;
         vector<NGHolder *> ordered_graphs;
         for (RoseInVertex v : curr) {
             for (const RoseInEdge &e : out_edges_range(v, vg)) {