mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
deterministic assembleProgramBlocks()
This commit is contained in:
parent
e12298568e
commit
2b1a7da188
@ -2819,7 +2819,6 @@ vector<LitFragment> groupByFragment(const RoseBuildImpl &build) {
|
|||||||
auto &fi = m.second;
|
auto &fi = m.second;
|
||||||
DEBUG_PRINTF("frag %s -> ids: %s\n", dumpString(m.first.s).c_str(),
|
DEBUG_PRINTF("frag %s -> ids: %s\n", dumpString(m.first.s).c_str(),
|
||||||
as_string_list(fi.lit_ids).c_str());
|
as_string_list(fi.lit_ids).c_str());
|
||||||
sort(fi.lit_ids.begin(), fi.lit_ids.end()); /* to match old behaviour */
|
|
||||||
fragments.emplace_back(frag_id, fi.groups, move(fi.lit_ids));
|
fragments.emplace_back(frag_id, fi.groups, move(fi.lit_ids));
|
||||||
frag_id++;
|
frag_id++;
|
||||||
assert(frag_id == fragments.size());
|
assert(frag_id == fragments.size());
|
||||||
|
@ -1923,17 +1923,37 @@ void makeGroupSquashInstruction(const RoseBuildImpl &build, u32 lit_id,
|
|||||||
prog.add_before_end(make_unique<RoseInstrSquashGroups>(~info.group_mask));
|
prog.add_before_end(make_unique<RoseInstrSquashGroups>(~info.group_mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
RoseProgram assembleProgramBlocks(vector<RoseProgram> &&blocks) {
|
namespace {
|
||||||
DEBUG_PRINTF("%zu blocks before dedupe\n", blocks.size());
|
struct ProgKey {
|
||||||
|
ProgKey(const RoseProgram &p) : prog(&p) { }
|
||||||
|
|
||||||
sort(blocks.begin(), blocks.end(),
|
bool operator==(const ProgKey &b) const {
|
||||||
[](const RoseProgram &a, const RoseProgram &b) {
|
return RoseProgramEquivalence()(*prog, *b.prog);
|
||||||
RoseProgramHash hasher;
|
}
|
||||||
return hasher(a) < hasher(b);
|
|
||||||
});
|
|
||||||
|
|
||||||
blocks.erase(unique(blocks.begin(), blocks.end(), RoseProgramEquivalence()),
|
friend size_t hash_value(const ProgKey &a) {
|
||||||
blocks.end());
|
return RoseProgramHash()(*a.prog);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
const RoseProgram *prog;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
RoseProgram assembleProgramBlocks(vector<RoseProgram> &&blocks_in) {
|
||||||
|
DEBUG_PRINTF("%zu blocks before dedupe\n", blocks_in.size());
|
||||||
|
|
||||||
|
vector<RoseProgram> blocks;
|
||||||
|
blocks.reserve(blocks_in.size()); /* to ensure stable reference for seen */
|
||||||
|
|
||||||
|
unordered_set<ProgKey> seen;
|
||||||
|
for (auto &block : blocks_in) {
|
||||||
|
if (contains(seen, block)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
blocks.push_back(move(block));
|
||||||
|
seen.emplace(blocks.back());
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG_PRINTF("%zu blocks after dedupe\n", blocks.size());
|
DEBUG_PRINTF("%zu blocks after dedupe\n", blocks.size());
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user