From a0260c036264091e064fafb785c9902d38923d92 Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Tue, 31 Jan 2017 12:49:43 +1100 Subject: [PATCH] rose: do fragment group assignment earlier --- src/rose/rose_build_bytecode.cpp | 40 ++++++++++++++++++++++++-------- src/rose/rose_build_impl.h | 4 +++- src/rose/rose_build_matchers.cpp | 23 +----------------- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/rose/rose_build_bytecode.cpp b/src/rose/rose_build_bytecode.cpp index 0dbe20ea..82e1945f 100644 --- a/src/rose/rose_build_bytecode.cpp +++ b/src/rose/rose_build_bytecode.cpp @@ -4649,48 +4649,68 @@ rose_literal_id getFragment(const rose_literal_id &lit) { return frag; } +static +rose_group getGroups(const RoseBuildImpl &build, const set &lit_ids) { + rose_group groups = 0; + for (auto lit_id : lit_ids) { + auto &info = build.literal_info.at(lit_id); + groups |= info.group_mask; + } + return groups; +} + static map groupByFragment(const RoseBuildImpl &build) { u32 frag_id = 0; map final_to_frag; - map> frag_lits; + struct FragmentInfo { + vector final_ids; + rose_group groups = 0; + }; + + map frag_info; + for (const auto &m : build.final_id_to_literal) { u32 final_id = m.first; const auto &lit_ids = m.second; assert(!lit_ids.empty()); + auto groups = getGroups(build, lit_ids); + if (lit_ids.size() > 1) { - final_to_frag.emplace(final_id, LitFragment(frag_id++)); + final_to_frag.emplace(final_id, LitFragment(frag_id++, groups)); continue; } const auto lit_id = *lit_ids.begin(); const auto &lit = build.literals.right.at(lit_id); if (lit.s.length() < ROSE_SHORT_LITERAL_LEN_MAX) { - final_to_frag.emplace(final_id, LitFragment(frag_id++)); + final_to_frag.emplace(final_id, LitFragment(frag_id++, groups)); continue; } // Combining fragments that squash their groups is unsafe. const auto &info = build.literal_info[lit_id]; if (info.squash_group) { - final_to_frag.emplace(final_id, LitFragment(frag_id++)); + final_to_frag.emplace(final_id, LitFragment(frag_id++, groups)); continue; } DEBUG_PRINTF("fragment candidate: final_id=%u %s\n", final_id, dumpString(lit.s).c_str()); - auto frag = getFragment(lit); - frag_lits[frag].push_back(final_id); + auto &fi = frag_info[getFragment(lit)]; + fi.final_ids.push_back(final_id); + fi.groups |= groups; } - for (const auto &m : frag_lits) { + for (const auto &m : frag_info) { + const auto &fi = m.second; DEBUG_PRINTF("frag %s -> ids: %s\n", dumpString(m.first.s).c_str(), - as_string_list(m.second).c_str()); - for (const auto final_id : m.second) { + as_string_list(fi.final_ids).c_str()); + for (const auto final_id : fi.final_ids) { assert(!contains(final_to_frag, final_id)); - final_to_frag.emplace(final_id, LitFragment(frag_id)); + final_to_frag.emplace(final_id, LitFragment(frag_id, fi.groups)); } frag_id++; } diff --git a/src/rose/rose_build_impl.h b/src/rose/rose_build_impl.h index dc696ddd..0c881f64 100644 --- a/src/rose/rose_build_impl.h +++ b/src/rose/rose_build_impl.h @@ -437,8 +437,10 @@ private: std::set all_reports(const OutfixInfo &outfix); struct LitFragment { - explicit LitFragment(u32 fragment_id_in) : fragment_id(fragment_id_in) {} + LitFragment(u32 fragment_id_in, rose_group groups_in) + : fragment_id(fragment_id_in), groups(groups_in) {} u32 fragment_id; + rose_group groups; u32 lit_program_offset = 0; u32 delay_program_offset = 0; }; diff --git a/src/rose/rose_build_matchers.cpp b/src/rose/rose_build_matchers.cpp index 998cd545..b92941d7 100644 --- a/src/rose/rose_build_matchers.cpp +++ b/src/rose/rose_build_matchers.cpp @@ -635,24 +635,6 @@ u64a literalMinReportOffset(const RoseBuildImpl &build, return lit_min_offset; } -static -map makeFragGroupMap(const RoseBuildImpl &build) { - map frag_to_group; - - for (const auto &m : build.final_to_frag_map) { - u32 final_id = m.first; - u32 frag_id = m.second.fragment_id; - hwlm_group_t groups = 0; - const auto &lits = build.final_id_to_literal.at(final_id); - for (auto lit_id : lits) { - groups |= build.literal_info[lit_id].group_mask; - } - frag_to_group[frag_id] |= groups; - } - - return frag_to_group; -} - template void trim_to_suffix(Container &c, size_t len) { if (c.size() <= len) { @@ -751,16 +733,13 @@ MatcherProto makeMatcherProto(const RoseBuildImpl &build, cmp); } - auto frag_group_map = makeFragGroupMap(build); - for (auto &lit : mp.lits) { u32 final_id = lit.id; assert(contains(build.final_to_frag_map, final_id)); const auto &frag = build.final_to_frag_map.at(final_id); lit.id = delay_rebuild ? frag.delay_program_offset : frag.lit_program_offset; - assert(contains(frag_group_map, frag.fragment_id)); - lit.groups = frag_group_map.at(frag.fragment_id); + lit.groups = frag.groups; } sort_and_unique(mp.lits);