diff options
author | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-12-03 13:11:18 +0100 |
---|---|---|
committer | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-12-03 13:11:18 +0100 |
commit | 4d0db073fc59bcf7d7171278662610b2596ad3e5 (patch) | |
tree | fbfd65b5ce118f6faef4e0b3887c0e8b55ab2630 | |
parent | ebc0425ea232cb739a7d86d97b4ededcf9f612f1 (diff) |
wip
-rw-r--r-- | gcc/ipa-dfe.c | 21 | ||||
-rw-r--r-- | gcc/ipa-dfe.h | 16 | ||||
-rw-r--r-- | gcc/ipa-field-reorder.c | 16 | ||||
-rw-r--r-- | gcc/ipa-type-escape-analysis.h | 3 |
4 files changed, 43 insertions, 13 deletions
diff --git a/gcc/ipa-dfe.c b/gcc/ipa-dfe.c index ccaf9a64007..93c3c40d202 100644 --- a/gcc/ipa-dfe.c +++ b/gcc/ipa-dfe.c @@ -198,7 +198,19 @@ get_types_replacement (record_field_offset_map_t record_field_offset_map, { type_stringifier stringifier; - type_reconstructor reconstructor (record_field_offset_map, "reorg"); + record_field_offset_map3_t record_field_offset_map2; + for (auto i = record_field_offset_map.begin(), e = record_field_offset_map.end(); i != e; ++i) + { + field_offsets2_t _second2; + std::set<unsigned> _second1 = i->second; + for (auto j = _second1.begin(), f = _second1.end(); j != f; ++j) + { + _second2.add (*j); + } + record_field_offset_map2.insert({i->first, _second2}); + } + + type_reconstructor reconstructor (record_field_offset_map2, "reorg"); for (hash_set<tree>::iterator i = to_modify.begin (), e = to_modify.end (); i != e; ++i) @@ -718,15 +730,16 @@ type_reconstructor::_walk_field_post (tree t) // What record does this field belongs to? tree record = for_reference2.last (); - field_offsets_t *field_offsets = _records2->get(record); - if (!field_offsets) return; + field_offsets2_t **field_offsets_ptr = _records2->get(record); + if (!field_offsets_ptr) return; + field_offsets2_t *field_offsets = *field_offsets_ptr; // What's the field offset? unsigned f_byte_offset = tree_to_uhwi (DECL_FIELD_OFFSET (t)); unsigned f_bit_offset = tree_to_uhwi (DECL_FIELD_BIT_OFFSET (t)); unsigned f_offset = 8 * f_byte_offset + f_bit_offset; const bool can_field_be_deleted - = field_offsets->find (f_offset) != field_offsets->end (); + = field_offsets->contains (f_offset); if (can_field_be_deleted) mark_all_pointing_here_as_modified (); tree original_type = TREE_TYPE (t); diff --git a/gcc/ipa-dfe.h b/gcc/ipa-dfe.h index fdd9a2783e6..26630713f40 100644 --- a/gcc/ipa-dfe.h +++ b/gcc/ipa-dfe.h @@ -70,23 +70,26 @@ typedef hash_map<tree, std::pair<tree, bool> > reorg_field_map2_t; class type_reconstructor : public type_walker { public: - type_reconstructor (record_field_offset_map_t records, const char *suffix) + type_reconstructor (record_field_offset_map3_t records, const char *suffix) : _suffix (suffix), in_progress2(vNULL), for_reference2(vNULL), field_list2_stack2 (vNULL) { _reorg_map2 = new reorg_record_map2_t; _reorg_fields2 = new reorg_field_map2_t; modified_map2 = new is_modified_map2_t; - _records2 = new record_field_offset_map2_t; + _records2 = new record_field_offset_map4_t; for (auto i = records.begin(), e = records.end(); i != e; ++i) { - _records2->put(i->first, i->second); + field_offsets2_t *new_second = new field_offsets2_t; + for (auto j = i->second.begin(), f = i->second.end(); j != f; ++j) + { + new_second->add (*j); + } + _records2->put(i->first, new_second); } }; ~type_reconstructor() { - // I think we need this a little bit longer... - // but I don't think there is a copy constructor for this... delete _reorg_map2; delete _reorg_fields2; delete modified_map2; @@ -126,8 +129,7 @@ protected: typedef vec<field_tuple_list2_t> field_tuple_list2_stack2_t; // Which records can be modified. - //record_field_offset_map_t _records; - record_field_offset_map2_t* _records2; + record_field_offset_map4_t* _records2; const char *get_new_suffix (); diff --git a/gcc/ipa-field-reorder.c b/gcc/ipa-field-reorder.c index bf990f182cd..04eea5fb90e 100644 --- a/gcc/ipa-field-reorder.c +++ b/gcc/ipa-field-reorder.c @@ -170,7 +170,7 @@ private: class TypeReconstructorFieldReordering : public type_reconstructor { public: - TypeReconstructorFieldReordering (record_field_offset_map_t records, + TypeReconstructorFieldReordering (record_field_offset_map3_t records, const char *suffix) : type_reconstructor (records, suffix) {}; @@ -524,7 +524,19 @@ get_reordered_field_maps (record_field_offset_map_t record_field_offset_map, { type_stringifier stringifier; - TypeReconstructorFieldReordering reconstructor (record_field_offset_map, + record_field_offset_map3_t record_field_offset_map2; + for (auto i = record_field_offset_map.begin(), e = record_field_offset_map.end(); i != e; ++i) + { + field_offsets2_t _second2; + std::set<unsigned> _second1 = i->second; + for (auto j = _second1.begin(), f = _second1.end(); j != f; ++j) + { + _second2.add (*j); + } + record_field_offset_map2.insert({i->first, _second2}); + } + + TypeReconstructorFieldReordering reconstructor (record_field_offset_map2, "reorder"); for (hash_set<tree>::iterator i = to_modify.begin (), e = to_modify.end (); diff --git a/gcc/ipa-type-escape-analysis.h b/gcc/ipa-type-escape-analysis.h index 1c9826416cd..cf09c0705de 100644 --- a/gcc/ipa-type-escape-analysis.h +++ b/gcc/ipa-type-escape-analysis.h @@ -1233,9 +1233,12 @@ private: }; 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. void |