mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
Rose: allow DR literals to share vertices
This commit is contained in:
parent
31dea6c275
commit
cc5db61686
@ -501,7 +501,7 @@ bool isPureFloating(const RoseBuildImpl &tbi) {
|
|||||||
continue;
|
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);
|
DEBUG_PRINTF("vertex %zu isn't floating and direct\n", g[v].idx);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -3979,16 +3979,14 @@ map<u32, vector<RoseEdge>> findEdgesByLiteral(const RoseBuildImpl &build) {
|
|||||||
const auto &g = build.g;
|
const auto &g = build.g;
|
||||||
for (const auto &e : edges_range(g)) {
|
for (const auto &e : edges_range(g)) {
|
||||||
const auto &v = target(e, 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) {
|
for (const auto &lit_id : g[v].literals) {
|
||||||
assert(lit_id < build.literal_info.size());
|
assert(lit_id < build.literal_info.size());
|
||||||
u32 final_id = build.literal_info.at(lit_id).final_id;
|
u32 final_id = build.literal_info.at(lit_id).final_id;
|
||||||
if (final_id != MO_INVALID_IDX) {
|
if (final_id == MO_INVALID_IDX || final_id & LITERAL_MDR_FLAG) {
|
||||||
unique_lit_edge_map[final_id].insert(e);
|
// Unused, special or direct report IDs are handled elsewhere.
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
unique_lit_edge_map[final_id].insert(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -588,11 +588,7 @@ bool RoseBuildImpl::isDirectReport(u32 id) const {
|
|||||||
// role's reports from a list.
|
// role's reports from a list.
|
||||||
|
|
||||||
for (auto v : info.vertices) {
|
for (auto v : info.vertices) {
|
||||||
if (g[v].literals.size() != 1) {
|
assert(contains(g[v].literals, id));
|
||||||
return false; // Avoid roles with multiple literals at this stage.
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(*g[v].literals.begin() == id);
|
|
||||||
|
|
||||||
if (g[v].reports.empty() ||
|
if (g[v].reports.empty() ||
|
||||||
g[v].eod_accept || // no accept EOD
|
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;
|
return literal_info.at(id).final_id & LITERAL_MDR_FLAG;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RoseBuildImpl::hasDirectFinalId(RoseVertex v) const {
|
bool RoseBuildImpl::allDirectFinalIds(RoseVertex v) const {
|
||||||
if (g[v].literals.empty()) {
|
const auto &lits = g[v].literals;
|
||||||
|
if (lits.empty()) {
|
||||||
return false;
|
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 {
|
bool RoseBuildImpl::hasFinalId(u32 id) const {
|
||||||
|
@ -440,8 +440,18 @@ public:
|
|||||||
|
|
||||||
bool isDirectReport(u32 id) const;
|
bool isDirectReport(u32 id) const;
|
||||||
bool isDelayed(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(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 hasFinalId(u32 id) const;
|
||||||
|
|
||||||
bool isAnchored(RoseVertex v) const; /* true iff has literal in anchored
|
bool isAnchored(RoseVertex v) const; /* true iff has literal in anchored
|
||||||
|
Loading…
x
Reference in New Issue
Block a user