rose: preserve lit properties when building masks

This fixes a bug with commit 6a6b0e5, which did not preserve the
requires_explode and requires_benefits properties when a new literal was
generated to add an HWLM and/cmp mask.

Also extends the requires_explode handling to allow masked literals.
This commit is contained in:
Justin Viiret 2016-06-02 10:55:22 +10:00 committed by Matthew Barr
parent b73bd9b6e1
commit bfaa0acaea

View File

@ -381,7 +381,8 @@ void findMoreLiteralMasks(RoseBuildImpl &build) {
continue; continue;
} }
assert(!msk.empty()); assert(!msk.empty());
DEBUG_PRINTF("found advisory mask for lit_id=%u\n", id); DEBUG_PRINTF("found advisory mask for lit_id=%u (%s)\n", id,
dumpString(lit.s).c_str());
u32 new_id = build.getLiteralId(lit.s, msk, cmp, lit.delay, lit.table); u32 new_id = build.getLiteralId(lit.s, msk, cmp, lit.delay, lit.table);
assert(new_id != id); assert(new_id != id);
DEBUG_PRINTF("replacing with new lit_id=%u\n", new_id); DEBUG_PRINTF("replacing with new lit_id=%u\n", new_id);
@ -390,6 +391,8 @@ void findMoreLiteralMasks(RoseBuildImpl &build) {
// We assume that this transform is happening prior to group assignment. // We assume that this transform is happening prior to group assignment.
assert(lit_info.group_mask == 0); assert(lit_info.group_mask == 0);
auto &new_info = build.literal_info.at(new_id); auto &new_info = build.literal_info.at(new_id);
// Move the vertices across.
new_info.vertices.insert(begin(lit_info.vertices), new_info.vertices.insert(begin(lit_info.vertices),
end(lit_info.vertices)); end(lit_info.vertices));
for (auto v : lit_info.vertices) { for (auto v : lit_info.vertices) {
@ -397,6 +400,10 @@ void findMoreLiteralMasks(RoseBuildImpl &build) {
build.g[v].literals.insert(new_id); build.g[v].literals.insert(new_id);
} }
lit_info.vertices.clear(); lit_info.vertices.clear();
// Preserve other properties.
new_info.requires_explode = lit_info.requires_explode;
new_info.requires_benefits = lit_info.requires_benefits;
} }
} }
@ -546,17 +553,24 @@ vector<hwlmLiteral> fillHamsterLiteralList(const RoseBuildImpl &build,
if (info.requires_explode) { if (info.requires_explode) {
DEBUG_PRINTF("exploding lit\n"); DEBUG_PRINTF("exploding lit\n");
const vector<u8> empty_msk; // msk/cmp will be empty
case_iter cit = caseIterateBegin(lit); case_iter cit = caseIterateBegin(lit);
case_iter cite = caseIterateEnd(); case_iter cite = caseIterateEnd();
for (; cit != cite; ++cit) { for (; cit != cite; ++cit) {
string s = *cit;
bool nocase = false;
DEBUG_PRINTF("id=%u, s='%s', nocase=%d, noruns=%d msk=%s, " DEBUG_PRINTF("id=%u, s='%s', nocase=%d, noruns=%d msk=%s, "
"cmp=%s (exploded)\n", "cmp=%s (exploded)\n",
final_id, escapeString(lit.get_string()).c_str(), final_id, escapeString(s).c_str(), nocase, noruns,
0, noruns, dumpMask(msk).c_str(), dumpMask(msk).c_str(), dumpMask(cmp).c_str());
dumpMask(cmp).c_str());
lits.emplace_back(*cit, false, noruns, final_id, groups, if (!maskIsConsistent(s, nocase, msk, cmp)) {
empty_msk, empty_msk); DEBUG_PRINTF("msk/cmp for literal can't match, skipping\n");
continue;
}
lits.emplace_back(move(s), nocase, noruns, final_id, groups,
msk, cmp);
} }
} else { } else {
const std::string &s = lit.get_string(); const std::string &s = lit.get_string();