refactor restoreTrailingLiteral use

This commit is contained in:
Alex Coyte 2017-01-04 11:41:59 +11:00 committed by Matthew Barr
parent 7767651b59
commit 8741759c3a

View File

@ -1821,6 +1821,25 @@ bool makeTransientFromLongLiteral(NGHolder &h, RoseInGraph &vg,
return true; return true;
} }
static
void restoreTrailingLiteralStates(NGHolder &g,
const vector<pair<ue2_literal, u32>> &lits) {
vector<NFAVertex> preds;
insert(&preds, preds.end(), inv_adjacent_vertices(g.accept, g));
clear_in_edges(g.accept, g);
for (auto v : preds) {
g[v].reports.clear(); /* clear report from old accepts */
}
for (const auto &p : lits) {
const ue2_literal &lit = p.first;
u32 delay = p.second;
restoreTrailingLiteralStates(g, lit, delay, preds);
}
}
static static
bool improvePrefix(NGHolder &h, RoseInGraph &vg, const vector<RoseInEdge> &ee, bool improvePrefix(NGHolder &h, RoseInGraph &vg, const vector<RoseInEdge> &ee,
const CompileContext &cc) { const CompileContext &cc) {
@ -1900,27 +1919,18 @@ bool improvePrefix(NGHolder &h, RoseInGraph &vg, const vector<RoseInEdge> &ee,
trimmed.clear(); trimmed.clear();
for (auto &elem : trimmed_vec) { for (auto &elem : trimmed_vec) {
shared_ptr<NGHolder> &hp = elem.first; shared_ptr<NGHolder> &hp = elem.first;
NGHolder &eh = *hp; vector<pair<ue2_literal, u32>> succ_lits;
vector<NFAVertex> base_states;
insert(&base_states, base_states.end(),
inv_adjacent_vertices(eh.accept, eh));
clear_in_edges(eh.accept, eh);
for (auto v : base_states) {
eh[v].reports.clear(); /* clear report from old accepts */
}
for (const auto &edge_delay : elem.second) { for (const auto &edge_delay : elem.second) {
const RoseInEdge &e = edge_delay.first; const RoseInEdge &e = edge_delay.first;
u32 delay = edge_delay.second; u32 delay = edge_delay.second;
auto succ_lit = vg[target(e, vg)].s; auto lit = vg[target(e, vg)].s;
vg[e].graph = hp; vg[e].graph = hp;
assert(delay <= succ_lit.length()); assert(delay <= lit.length());
restoreTrailingLiteralStates(*vg[e].graph, succ_lit, delay, succ_lits.emplace_back(lit, delay);
base_states);
} }
restoreTrailingLiteralStates(*hp, succ_lits);
} }
return true; return true;
} }
@ -2819,7 +2829,6 @@ bool doViolet(RoseBuild &rose, const NGHolder &h, bool prefilter,
renumber_vertices(vg); renumber_vertices(vg);
calcVertexOffsets(vg); calcVertexOffsets(vg);
/* Step 5: avoid unimplementable, or overly large engines if possible */ /* Step 5: avoid unimplementable, or overly large engines if possible */
if (!ensureImplementable(rose, vg, last_chance, last_chance, rm, cc)) { if (!ensureImplementable(rose, vg, last_chance, last_chance, rm, cc)) {
return false; return false;