mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
rose: Do HWLM advisory masks as a complete pass
This commit is contained in:
parent
beec5e59df
commit
6a6b0e5da6
@ -34,6 +34,7 @@
|
|||||||
#include "rose_build_castle.h"
|
#include "rose_build_castle.h"
|
||||||
#include "rose_build_convert.h"
|
#include "rose_build_convert.h"
|
||||||
#include "rose_build_dump.h"
|
#include "rose_build_dump.h"
|
||||||
|
#include "rose_build_matchers.h"
|
||||||
#include "rose_build_merge.h"
|
#include "rose_build_merge.h"
|
||||||
#include "rose_build_role_aliasing.h"
|
#include "rose_build_role_aliasing.h"
|
||||||
#include "rose_build_util.h"
|
#include "rose_build_util.h"
|
||||||
@ -2181,6 +2182,8 @@ aligned_unique_ptr<RoseEngine> RoseBuildImpl::buildRose(u32 minWidth) {
|
|||||||
|
|
||||||
assert(!danglingVertexRef(*this));
|
assert(!danglingVertexRef(*this));
|
||||||
|
|
||||||
|
findMoreLiteralMasks(*this);
|
||||||
|
|
||||||
assignGroupsToLiterals();
|
assignGroupsToLiterals();
|
||||||
assignGroupsToRoles();
|
assignGroupsToRoles();
|
||||||
findGroupSquashers(*this);
|
findGroupSquashers(*this);
|
||||||
|
@ -333,6 +333,73 @@ bool findHamsterMask(const RoseBuildImpl &build, const rose_literal_id &id,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void findMoreLiteralMasks(RoseBuildImpl &build) {
|
||||||
|
if (!build.cc.grey.roseHamsterMasks) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<u32> candidates;
|
||||||
|
for (const auto &e : build.literals.right) {
|
||||||
|
const u32 id = e.first;
|
||||||
|
const auto &lit = e.second;
|
||||||
|
|
||||||
|
// This pass takes place before final IDs are assigned to literals.
|
||||||
|
assert(!build.hasFinalId(id));
|
||||||
|
|
||||||
|
if (lit.delay || build.isDelayed(id)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Literal masks are only allowed for literals that will end up in an
|
||||||
|
// HWLM table.
|
||||||
|
switch (lit.table) {
|
||||||
|
case ROSE_FLOATING:
|
||||||
|
case ROSE_EOD_ANCHORED:
|
||||||
|
case ROSE_ANCHORED_SMALL_BLOCK:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lit.msk.empty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto &lit_info = build.literal_info.at(id);
|
||||||
|
if (lit_info.requires_benefits) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
candidates.push_back(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const u32 &id : candidates) {
|
||||||
|
const auto &lit = build.literals.right.at(id);
|
||||||
|
auto &lit_info = build.literal_info.at(id);
|
||||||
|
|
||||||
|
vector<u8> msk, cmp;
|
||||||
|
if (!findHamsterMask(build, lit, lit_info, msk, cmp)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
assert(!msk.empty());
|
||||||
|
DEBUG_PRINTF("found advisory mask for lit_id=%u\n", id);
|
||||||
|
u32 new_id = build.getLiteralId(lit.s, msk, cmp, lit.delay, lit.table);
|
||||||
|
assert(new_id != id);
|
||||||
|
DEBUG_PRINTF("replacing with new lit_id=%u\n", new_id);
|
||||||
|
|
||||||
|
// Note that our new literal may already exist and have vertices, etc.
|
||||||
|
// We assume that this transform is happening prior to group assignment.
|
||||||
|
assert(lit_info.group_mask == 0);
|
||||||
|
auto &new_info = build.literal_info.at(new_id);
|
||||||
|
new_info.vertices.insert(begin(lit_info.vertices),
|
||||||
|
end(lit_info.vertices));
|
||||||
|
for (auto v : lit_info.vertices) {
|
||||||
|
build.g[v].literals.erase(id);
|
||||||
|
build.g[v].literals.insert(new_id);
|
||||||
|
}
|
||||||
|
lit_info.vertices.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
bool isDirectHighlander(const RoseBuildImpl &build, const u32 id,
|
bool isDirectHighlander(const RoseBuildImpl &build, const u32 id,
|
||||||
const rose_literal_info &info) {
|
const rose_literal_info &info) {
|
||||||
@ -472,17 +539,8 @@ vector<hwlmLiteral> fillHamsterLiteralList(const RoseBuildImpl &build,
|
|||||||
|
|
||||||
DEBUG_PRINTF("lit='%s'\n", escapeString(lit).c_str());
|
DEBUG_PRINTF("lit='%s'\n", escapeString(lit).c_str());
|
||||||
|
|
||||||
vector<u8> msk = e.second.msk; // copy
|
const vector<u8> &msk = e.second.msk;
|
||||||
vector<u8> cmp = e.second.cmp; // copy
|
const vector<u8> &cmp = e.second.cmp;
|
||||||
|
|
||||||
if (msk.empty()) {
|
|
||||||
// Try and pick up an advisory mask.
|
|
||||||
if (!findHamsterMask(build, e.second, info, msk, cmp)) {
|
|
||||||
msk.clear(); cmp.clear();
|
|
||||||
} else {
|
|
||||||
DEBUG_PRINTF("picked up late mask %zu\n", msk.size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool noruns = isNoRunsLiteral(build, id, info);
|
bool noruns = isNoRunsLiteral(build, id, info);
|
||||||
|
|
||||||
@ -514,8 +572,7 @@ vector<hwlmLiteral> fillHamsterLiteralList(const RoseBuildImpl &build,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
lits.emplace_back(lit.get_string(), lit.any_nocase(), noruns,
|
lits.emplace_back(s, nocase, noruns, final_id, groups, msk, cmp);
|
||||||
final_id, groups, msk, cmp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,6 +58,8 @@ aligned_unique_ptr<HWLM> buildSmallBlockMatcher(const RoseBuildImpl &build,
|
|||||||
aligned_unique_ptr<HWLM> buildEodAnchoredMatcher(const RoseBuildImpl &build,
|
aligned_unique_ptr<HWLM> buildEodAnchoredMatcher(const RoseBuildImpl &build,
|
||||||
size_t *esize);
|
size_t *esize);
|
||||||
|
|
||||||
|
void findMoreLiteralMasks(RoseBuildImpl &build);
|
||||||
|
|
||||||
} // namespace ue2
|
} // namespace ue2
|
||||||
|
|
||||||
#endif // ROSE_BUILD_MATCHERS_H
|
#endif // ROSE_BUILD_MATCHERS_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user