mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
rose: dedupe anch programs and RECORD_ANCHOREDs
This commit is contained in:
parent
75c7f42314
commit
a2d2f7cb95
@ -4271,12 +4271,18 @@ void makeRecordAnchoredInstruction(const RoseBuildImpl &build,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dedupe anch_ids to fire.
|
||||||
|
flat_set<u32> anch_ids;
|
||||||
|
|
||||||
for (const auto &lit_id : lit_ids) {
|
for (const auto &lit_id : lit_ids) {
|
||||||
assert(build.literals.right.at(lit_id).table == ROSE_ANCHORED);
|
assert(build.literals.right.at(lit_id).table == ROSE_ANCHORED);
|
||||||
if (!contains(bc.anchored_programs, lit_id)) {
|
if (!contains(bc.anchored_programs, lit_id)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
u32 anch_id = bc.anchored_programs.at(lit_id);
|
anch_ids.insert(bc.anchored_programs.at(lit_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &anch_id : anch_ids) {
|
||||||
DEBUG_PRINTF("adding RECORD_ANCHORED for anch_id=%u\n", anch_id);
|
DEBUG_PRINTF("adding RECORD_ANCHORED for anch_id=%u\n", anch_id);
|
||||||
program.add_before_end(make_unique<RoseInstrRecordAnchored>(anch_id));
|
program.add_before_end(make_unique<RoseInstrRecordAnchored>(anch_id));
|
||||||
}
|
}
|
||||||
@ -4771,11 +4777,18 @@ u32 buildDelayPrograms(RoseBuildImpl &build, build_context &bc) {
|
|||||||
return bc.engine_blob.add(begin(programs), end(programs));
|
return bc.engine_blob.add(begin(programs), end(programs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Write anchored replay programs to the bytecode.
|
||||||
|
*
|
||||||
|
* Returns the offset of the beginning of the program array, and the number of
|
||||||
|
* programs.
|
||||||
|
*/
|
||||||
static
|
static
|
||||||
u32 writeAnchoredPrograms(RoseBuildImpl &build, build_context &bc) {
|
pair<u32, u32> writeAnchoredPrograms(RoseBuildImpl &build, build_context &bc) {
|
||||||
auto lit_edge_map = findEdgesByLiteral(build);
|
auto lit_edge_map = findEdgesByLiteral(build);
|
||||||
|
|
||||||
vector<u32> programs;
|
vector<u32> programs; // program offsets indexed by anchored id
|
||||||
|
unordered_map<u32, u32> cache; // program offsets we have already seen
|
||||||
|
|
||||||
for (const auto &m : build.literals.right) {
|
for (const auto &m : build.literals.right) {
|
||||||
u32 lit_id = m.first;
|
u32 lit_id = m.first;
|
||||||
@ -4803,13 +4816,25 @@ u32 writeAnchoredPrograms(RoseBuildImpl &build, build_context &bc) {
|
|||||||
writeLiteralProgram(build, bc, {final_id}, lit_edge_map, true);
|
writeLiteralProgram(build, bc, {final_id}, lit_edge_map, true);
|
||||||
DEBUG_PRINTF("lit_id=%u, final_id %u -> anch prog at %u\n", lit_id,
|
DEBUG_PRINTF("lit_id=%u, final_id %u -> anch prog at %u\n", lit_id,
|
||||||
final_id, offset);
|
final_id, offset);
|
||||||
u32 anch_id = verify_u32(programs.size());
|
|
||||||
programs.push_back(offset);
|
u32 anch_id;
|
||||||
|
auto it = cache.find(offset);
|
||||||
|
if (it != end(cache)) {
|
||||||
|
anch_id = it->second;
|
||||||
|
DEBUG_PRINTF("reusing anch_id %u for offset %u\n", anch_id, offset);
|
||||||
|
} else {
|
||||||
|
anch_id = verify_u32(programs.size());
|
||||||
|
programs.push_back(offset);
|
||||||
|
cache.emplace(offset, anch_id);
|
||||||
|
DEBUG_PRINTF("assigned new anch_id %u for offset %u\n", anch_id,
|
||||||
|
offset);
|
||||||
|
}
|
||||||
bc.anchored_programs.emplace(lit_id, anch_id);
|
bc.anchored_programs.emplace(lit_id, anch_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_PRINTF("%zu anchored programs\n", programs.size());
|
DEBUG_PRINTF("%zu anchored programs\n", programs.size());
|
||||||
return bc.engine_blob.add(begin(programs), end(programs));
|
return {bc.engine_blob.add(begin(programs), end(programs)),
|
||||||
|
verify_u32(programs.size())};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -5513,7 +5538,10 @@ aligned_unique_ptr<RoseEngine> RoseBuildImpl::buildFinalEngine(u32 minWidth) {
|
|||||||
queue_count - leftfixBeginQueue, leftInfoTable,
|
queue_count - leftfixBeginQueue, leftInfoTable,
|
||||||
&laggedRoseCount, &historyRequired);
|
&laggedRoseCount, &historyRequired);
|
||||||
|
|
||||||
u32 anchoredProgramOffset = writeAnchoredPrograms(*this, bc);
|
u32 anchoredProgramOffset;
|
||||||
|
u32 anchoredProgramCount;
|
||||||
|
tie(anchoredProgramOffset, anchoredProgramCount) =
|
||||||
|
writeAnchoredPrograms(*this, bc);
|
||||||
|
|
||||||
buildLiteralPrograms(*this, bc);
|
buildLiteralPrograms(*this, bc);
|
||||||
u32 delayProgramOffset = buildDelayPrograms(*this, bc);
|
u32 delayProgramOffset = buildDelayPrograms(*this, bc);
|
||||||
@ -5744,7 +5772,7 @@ aligned_unique_ptr<RoseEngine> RoseBuildImpl::buildFinalEngine(u32 minWidth) {
|
|||||||
|
|
||||||
engine->delay_count = verify_u32(bc.delay_programs.size());
|
engine->delay_count = verify_u32(bc.delay_programs.size());
|
||||||
engine->delay_fatbit_size = fatbit_size(engine->delay_count);
|
engine->delay_fatbit_size = fatbit_size(engine->delay_count);
|
||||||
engine->anchored_count = verify_u32(bc.anchored_programs.size());
|
engine->anchored_count = anchoredProgramCount;
|
||||||
engine->anchored_fatbit_size = fatbit_size(engine->anchored_count);
|
engine->anchored_fatbit_size = fatbit_size(engine->anchored_count);
|
||||||
|
|
||||||
engine->rosePrefixCount = rosePrefixCount;
|
engine->rosePrefixCount = rosePrefixCount;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user