]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
Rose: allow DR literals to share vertices
authorJustin Viiret <justin.viiret@intel.com>
Tue, 16 Feb 2016 06:14:13 +0000 (17:14 +1100)
committerMatthew Barr <matthew.barr@intel.com>
Tue, 1 Mar 2016 00:36:09 +0000 (11:36 +1100)
src/rose/rose_build_bytecode.cpp
src/rose/rose_build_compile.cpp
src/rose/rose_build_impl.h

index 4518b43406bd994739755975e35f5d7ef5f50fbc..a6ab726df9a1344b82626b259ee9a0fa45182363 100644 (file)
@@ -501,7 +501,7 @@ bool isPureFloating(const RoseBuildImpl &tbi) {
             continue;
         }
 
-        if (!tbi.hasDirectFinalId(v) || !tbi.isFloating(v)) {
+        if (!tbi.allDirectFinalIds(v) || !tbi.isFloating(v)) {
             DEBUG_PRINTF("vertex %zu isn't floating and direct\n", g[v].idx);
             return false;
         }
@@ -3979,16 +3979,14 @@ map<u32, vector<RoseEdge>> findEdgesByLiteral(const RoseBuildImpl &build) {
     const auto &g = build.g;
     for (const auto &e : edges_range(g)) {
         const auto &v = target(e, g);
-        if (build.hasDirectFinalId(v)) {
-            // Skip direct reports, which do not have RoseLiteral entries.
-            continue;
-        }
         for (const auto &lit_id : g[v].literals) {
             assert(lit_id < build.literal_info.size());
             u32 final_id = build.literal_info.at(lit_id).final_id;
-            if (final_id != MO_INVALID_IDX) {
-                unique_lit_edge_map[final_id].insert(e);
+            if (final_id == MO_INVALID_IDX || final_id & LITERAL_MDR_FLAG) {
+                // Unused, special or direct report IDs are handled elsewhere.
+                continue;
             }
+            unique_lit_edge_map[final_id].insert(e);
         }
     }
 
index c71743bfea28cff20ec990ba0f671844b98105ea..70bf0cf3a0ce120684a8c8d9caca60701208090e 100644 (file)
@@ -588,11 +588,7 @@ bool RoseBuildImpl::isDirectReport(u32 id) const {
     // role's reports from a list.
 
     for (auto v : info.vertices) {
-        if (g[v].literals.size() != 1) {
-            return false; // Avoid roles with multiple literals at this stage.
-        }
-
-        assert(*g[v].literals.begin() == id);
+        assert(contains(g[v].literals, id));
 
         if (g[v].reports.empty() ||
             g[v].eod_accept || // no accept EOD
@@ -903,11 +899,17 @@ bool RoseBuildImpl::hasDirectFinalId(u32 id) const {
     return literal_info.at(id).final_id & LITERAL_MDR_FLAG;
 }
 
-bool RoseBuildImpl::hasDirectFinalId(RoseVertex v) const {
-    if (g[v].literals.empty()) {
+bool RoseBuildImpl::allDirectFinalIds(RoseVertex v) const {
+    const auto &lits = g[v].literals;
+    if (lits.empty()) {
         return false;
     }
-    return hasDirectFinalId(*g[v].literals.begin());
+    for (const auto &lit : lits) {
+        if (!hasDirectFinalId(lit)) {
+            return false;
+        }
+    }
+    return true;
 }
 
 bool RoseBuildImpl::hasFinalId(u32 id) const {
index c6d10063f1d633207a34c403c781205023632fdc..1a5e77aa33644f9295bb82f2447ea7363be35612 100644 (file)
@@ -440,8 +440,18 @@ public:
 
     bool isDirectReport(u32 id) const;
     bool isDelayed(u32 id) const;
+
+    /**
+     * \brief True if the given literal ID is a direct or multi-direct report.
+     */
     bool hasDirectFinalId(u32 id) const;
-    bool hasDirectFinalId(RoseVertex v) const;
+
+    /**
+     * \brief True if all the literals associated with the given vertex are
+     * direct or multi-direct reports.
+     */
+    bool allDirectFinalIds(RoseVertex v) const;
+
     bool hasFinalId(u32 id) const;
 
     bool isAnchored(RoseVertex v) const; /* true iff has literal in anchored