diff --git a/src/rose/rose_build_bytecode.cpp b/src/rose/rose_build_bytecode.cpp index 4518b434..a6ab726d 100644 --- a/src/rose/rose_build_bytecode.cpp +++ b/src/rose/rose_build_bytecode.cpp @@ -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> 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); } } diff --git a/src/rose/rose_build_compile.cpp b/src/rose/rose_build_compile.cpp index c71743bf..70bf0cf3 100644 --- a/src/rose/rose_build_compile.cpp +++ b/src/rose/rose_build_compile.cpp @@ -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 { diff --git a/src/rose/rose_build_impl.h b/src/rose/rose_build_impl.h index c6d10063..1a5e77aa 100644 --- a/src/rose/rose_build_impl.h +++ b/src/rose/rose_build_impl.h @@ -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