diff options
author | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-12-03 15:24:30 +0100 |
---|---|---|
committer | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-12-03 15:24:30 +0100 |
commit | 743eb2d60054c2868bcb95184ffbeb9f12aac949 (patch) | |
tree | f728c09d0c94c5f3928803a519ebb3eae25274c4 | |
parent | adc77cc4807b0912fd9299dcf7d7b4fe8e307b93 (diff) |
some glue code
-rw-r--r-- | gcc/ipa-dfe.c | 20 | ||||
-rw-r--r-- | gcc/ipa-dfe.h | 6 | ||||
-rw-r--r-- | gcc/ipa-field-reorder.c | 16 | ||||
-rw-r--r-- | gcc/ipa-type-escape-analysis.c | 49 | ||||
-rw-r--r-- | gcc/ipa-type-escape-analysis.h | 8 |
5 files changed, 35 insertions, 64 deletions
diff --git a/gcc/ipa-dfe.c b/gcc/ipa-dfe.c index 033fb7564e7..c4507a95091 100644 --- a/gcc/ipa-dfe.c +++ b/gcc/ipa-dfe.c @@ -130,7 +130,7 @@ along with GCC; see the file COPYING3. If not see * record_field_offset_map. */ void -get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map, +get_all_types_pointing_to (record_field_offset_map4_t &record_field_offset_map2, tpartitions2_t casting, hash_set<tree> &to_modify2) { @@ -138,16 +138,6 @@ get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map, type_stringifier stringifier; hash_set<tree> specific_types2; - record_field_offset_map4_t record_field_offset_map2; - - // Here we are just placing the types of interest in a set. - for (std::map<tree, field_offsets2_t*>::iterator i - = record_field_offset_map.begin (), - e = record_field_offset_map.end (); - i != e; ++i) - { - record_field_offset_map2.put (i->first, i->second); - } // Here we are just placing the types of interest in a set. for (hash_map<tree, field_offsets2_t*>::iterator i @@ -193,17 +183,11 @@ get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map, * The second maps old FIELD_DECLs trees to the new FIELD_DECLs. */ reorg_maps_t -get_types_replacement (record_field_offset_map3_t record_field_offset_map, +get_types_replacement (record_field_offset_map4_t &record_field_offset_map2, hash_set<tree> &to_modify, reorg_record_map2_t &map2, reorg_field_map2_t &field_map2) { type_stringifier stringifier; - record_field_offset_map4_t record_field_offset_map2; - for (auto i = record_field_offset_map.begin(), e = record_field_offset_map.end(); i != e; ++i) - { - record_field_offset_map2.put(i->first, i->second); - } - type_reconstructor reconstructor (record_field_offset_map2, "reorg", map2, field_map2); for (hash_set<tree>::iterator i = to_modify.begin (), e = to_modify.end (); diff --git a/gcc/ipa-dfe.h b/gcc/ipa-dfe.h index d8c9b856d37..99ae3b76805 100644 --- a/gcc/ipa-dfe.h +++ b/gcc/ipa-dfe.h @@ -58,11 +58,9 @@ private: }; /* Map old RECORD_TYPE -> new RECORD_TYPE. */ -typedef std::map<tree, tree> reorg_record_map_t; typedef hash_map<tree, tree> reorg_record_map2_t; /* Map RECORD_TYPE -> (FIELD_DECL -> delete). */ -typedef std::map<tree, std::pair<tree, bool> > reorg_field_map_t; typedef hash_map<tree, std::pair<tree, bool> > reorg_field_map2_t; /* Class used to create new types derived from types that have fields @@ -245,7 +243,7 @@ private: // Get a set of all types pointing to types in RECORD_FIELD_OFFSET_MAP. void -get_all_types_pointing_to (record_field_offset_map3_t record_field_offset_map, +get_all_types_pointing_to (record_field_offset_map4_t &record_field_offset_map, tpartitions2_t casting, hash_set<tree> &to_modify); @@ -253,7 +251,7 @@ typedef std::pair<reorg_record_map2_t*, reorg_field_map2_t*> reorg_maps_t; // Compute the replacement types. reorg_maps_t -get_types_replacement (record_field_offset_map3_t record_field_offset_map, +get_types_replacement (record_field_offset_map4_t &record_field_offset_map, hash_set<tree> &to_modify, reorg_record_map2_t &, reorg_field_map2_t &); diff --git a/gcc/ipa-field-reorder.c b/gcc/ipa-field-reorder.c index 07f930a0caf..dd811ff01f6 100644 --- a/gcc/ipa-field-reorder.c +++ b/gcc/ipa-field-reorder.c @@ -520,18 +520,12 @@ record_field_map_t static find_fields_accessed () * The second maps old FIELD_DECLs trees to the new FIELD_DECLs. */ reorg_maps_t -get_reordered_field_maps (record_field_offset_map3_t record_field_offset_map, +get_reordered_field_maps (record_field_offset_map4_t &record_field_offset_map2, hash_set<tree> & to_modify, reorg_record_map2_t &map2, reorg_field_map2_t &field_map2) { type_stringifier stringifier; - record_field_offset_map4_t record_field_offset_map2; - for (auto i = record_field_offset_map.begin(), e = record_field_offset_map.end(); i != e; ++i) - { - record_field_offset_map2.put(i->first, i->second); - } - TypeReconstructorFieldReordering reconstructor (record_field_offset_map2, "reorder", map2, field_map2); for (hash_set<tree>::iterator i = to_modify.begin (), @@ -599,11 +593,11 @@ lto_fr_execute () tpartitions2_t escaping_nonescaping_sets; partition_types_into_escaping_nonescaping (escaping_nonescaping_sets, whitelisted2); record_field_map_t record_field_map = find_fields_accessed (); - record_field_offset_map3_t record_field_offset_map - = obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets, - record_field_map, 0); + record_field_offset_map4_t record_field_offset_map; + obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets, + record_field_map, 0, record_field_offset_map); - if (detected_incompatible_syntax || record_field_offset_map.empty ()) + if (detected_incompatible_syntax || record_field_offset_map.is_empty ()) return 0; // Prepare for transformation. diff --git a/gcc/ipa-type-escape-analysis.c b/gcc/ipa-type-escape-analysis.c index 0f920358424..bcc9901e5cb 100644 --- a/gcc/ipa-type-escape-analysis.c +++ b/gcc/ipa-type-escape-analysis.c @@ -362,10 +362,10 @@ lto_dead_field_elimination () if (detected_incompatible_syntax) return; record_field_map_t record_field_map = find_fields_accessed (); if (detected_incompatible_syntax) return; - record_field_offset_map3_t record_field_offset_map - = obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets, - record_field_map, OPT_Wdfa); - if (detected_incompatible_syntax || record_field_offset_map.empty ()) + record_field_offset_map4_t record_field_offset_map; + obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets, + record_field_map, OPT_Wdfa, record_field_offset_map); + if (detected_incompatible_syntax || record_field_offset_map.is_empty ()) return; // Prepare for transformation. @@ -534,15 +534,15 @@ keep_only_read_fields_from_equivalent_field_maps ( */ static void erase_if_no_fields_can_be_deleted ( - record_field_offset_map3_t &record_field_offset_map, + record_field_offset_map4_t &record_field_offset_map, std::set<tree> &to_keep, std::set<tree> &to_erase) { - for (std::map<tree, field_offsets2_t*>::iterator i + for (hash_map<tree, field_offsets2_t*>::iterator i = record_field_offset_map.begin (), e = record_field_offset_map.end (); i != e; ++i) { - tree record = i->first; + tree record = (*i).first; const bool keep = to_keep.find (record) != to_keep.end (); if (keep) continue; @@ -555,7 +555,7 @@ erase_if_no_fields_can_be_deleted ( i != e; ++i) { tree record = *i; - record_field_offset_map.erase (record); + record_field_offset_map.remove (record); } } @@ -565,16 +565,16 @@ erase_if_no_fields_can_be_deleted ( */ static void mark_escaping_types_to_be_deleted ( - record_field_offset_map3_t &record_field_offset_map, + record_field_offset_map4_t &record_field_offset_map, std::set<tree> &to_erase, tpartitions2_t casting) { tset2_t &non_escaping = casting.non_escaping; - for (std::map<tree, field_offsets2_t*>::iterator i + for (hash_map<tree, field_offsets2_t*>::iterator i = record_field_offset_map.begin (), e = record_field_offset_map.end (); i != e; ++i) { - tree record = i->first; + tree record = (*i).first; const bool in_set = non_escaping.contains (record); if (in_set) continue; @@ -584,13 +584,13 @@ mark_escaping_types_to_be_deleted ( } // Obtain nonescaping unaccessed fields -record_field_offset_map3_t +void obtain_nonescaping_unaccessed_fields (tpartitions2_t casting, record_field_map_t record_field_map, - int _warning) + int _warning, + record_field_offset_map4_t &record_field_offset_map) { bool has_fields_that_can_be_deleted = false; - record_field_offset_map3_t record_field_offset_map; for (std::map<tree, field_access_map_t>::iterator i = record_field_map.begin (), e = record_field_map.end (); @@ -607,7 +607,7 @@ obtain_nonescaping_unaccessed_fields (tpartitions2_t casting, *field_offset); // These map holds the following: // RECORD_TYPE -> unsigned (bit_pos_offset which has been read) - record_field_offset_map[r_i] = field_offset; + record_field_offset_map.put(r_i, field_offset); } // So now that we only have the FIELDS which are read, @@ -618,18 +618,18 @@ obtain_nonescaping_unaccessed_fields (tpartitions2_t casting, std::set<tree> to_keep; mark_escaping_types_to_be_deleted (record_field_offset_map, to_erase, casting); - for (std::map<tree, field_offsets2_t*>::iterator i + for (auto i = record_field_offset_map.begin (), e = record_field_offset_map.end (); i != e; ++i) { - tree record = i->first; + tree record = (*i).first; const bool will_be_erased = to_erase.find (record) != to_erase.end (); // No need to compute which fields can be deleted if type is escaping if (will_be_erased) continue; - field_offsets2_t *field_offset = i->second; + field_offsets2_t *field_offset = (*i).second; for (tree field = TYPE_FIELDS (record); field; field = DECL_CHAIN (field)) { unsigned f_offset = bitpos_of_field (field); @@ -653,20 +653,17 @@ obtain_nonescaping_unaccessed_fields (tpartitions2_t casting, warning (_warning, "RECORD_TYPE %qE has dead field %qE in LTO.\n", record, field); } - record_field_offset_map[record] = field_offset; + record_field_offset_map.put(record, field_offset); } - // Improve: Make this more elegant. - if (!has_fields_that_can_be_deleted) - { - record_field_offset_map3_t empty; - return empty; - } + if (!has_fields_that_can_be_deleted) { + record_field_offset_map.empty(); + return; + } erase_if_no_fields_can_be_deleted (record_field_offset_map, to_keep, to_erase); - return record_field_offset_map; } // Main interface to TypeWalker diff --git a/gcc/ipa-type-escape-analysis.h b/gcc/ipa-type-escape-analysis.h index f61c15299e9..805e4b2a3fa 100644 --- a/gcc/ipa-type-escape-analysis.h +++ b/gcc/ipa-type-escape-analysis.h @@ -1232,12 +1232,9 @@ private: // But we might need a gswitch. }; -typedef std::set<unsigned> field_offsets_t; typedef hash_set<int_hash <int , -1, -2>> field_offsets2_t; -typedef std::map<tree, field_offsets_t> record_field_offset_map_t; typedef std::map<tree, field_offsets2_t*> record_field_offset_map3_t; -typedef hash_map<tree, field_offsets_t> record_field_offset_map2_t; typedef hash_map<tree, field_offsets2_t*> record_field_offset_map4_t; // Partition types into escaping or non escaping sets. @@ -1245,10 +1242,11 @@ void partition_types_into_escaping_nonescaping (tpartitions2_t &p, hash_map<tree, bool>*); // Compute set of not escaping unaccessed fields -record_field_offset_map3_t +void obtain_nonescaping_unaccessed_fields (tpartitions2_t casting, record_field_map_t record_field_map, - int warning); + int warning, + record_field_offset_map4_t &a); extern bool detected_incompatible_syntax; hash_map<tree, bool> *get_whitelisted_nodes2(); |