diff options
author | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-04-16 13:51:18 +0200 |
---|---|---|
committer | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-04-28 23:35:53 +0200 |
commit | a924212d60f2ca55698916d5b4fd76240cd8dcf9 (patch) | |
tree | 14950acd3b0f9d58c912565f1ede8700ea25d1ba | |
parent | f9e344f641cf61514e552b2b1d8f896c6e3d44c5 (diff) |
wip
-rw-r--r-- | gcc/ipa-hello-world.c | 2 | ||||
-rw-r--r-- | gcc/ipa-hello-world.h | 1 | ||||
-rw-r--r-- | gcc/ipa-str-reorg-dead-field-eliminate.c | 118 |
3 files changed, 109 insertions, 12 deletions
diff --git a/gcc/ipa-hello-world.c b/gcc/ipa-hello-world.c index 3d438cf00ee..594998aadbb 100644 --- a/gcc/ipa-hello-world.c +++ b/gcc/ipa-hello-world.c @@ -441,7 +441,7 @@ count_field_accesses() return counter; } -static record_field_set +record_field_set get_fields_to_reorg() { const field_access_counter counter = count_field_accesses(); diff --git a/gcc/ipa-hello-world.h b/gcc/ipa-hello-world.h index 7a06d2223b3..e001ac17041 100644 --- a/gcc/ipa-hello-world.h +++ b/gcc/ipa-hello-world.h @@ -13,5 +13,6 @@ //This names are unintelligible typedef std::pair<const_tree /* record */, const_tree /* field */> fields; typedef std::set<fields> record_field_set; +record_field_set get_fields_to_reorg(); #endif diff --git a/gcc/ipa-str-reorg-dead-field-eliminate.c b/gcc/ipa-str-reorg-dead-field-eliminate.c index 76a498541a9..38d9c7b9182 100644 --- a/gcc/ipa-str-reorg-dead-field-eliminate.c +++ b/gcc/ipa-str-reorg-dead-field-eliminate.c @@ -582,14 +582,41 @@ is_record_p(const_tree record) gcc_assert(is_record); } +std::set<const_tree> interesting_records; +std::set<const_tree> interesting_fields; + static bool -is_interesting_record_field_pair (fields &f, record_field_set &set) +is_interesting_struct_escape_analysis(const_tree record) { + is_record_p(record); + const_tree main_variant = TYPE_MAIN_VARIANT(record); + is_record_p(main_variant); + + + const bool in_set = +#if __cplusplus > 201703L + interesting_records.contains(main_variant) +#else + interesting_records.find(main_variant) != interesting_records.end() +#endif + ; + + return in_set; + } +static bool is_interesting_struct_manual(const_tree); + static bool is_interesting_struct (const_tree record_1) { + const bool use_escape_analysis_info = !flag_ipa_typelist_struct && !flag_ipa_typelist_field; + return use_escape_analysis_info ? is_interesting_struct_escape_analysis(record_1) : is_interesting_struct_manual(record_1); +} + +static bool +is_interesting_struct_manual(const_tree record_1) +{ is_record_p(record_1); const_tree record = TYPE_MAIN_VARIANT(record_1); @@ -615,11 +642,21 @@ is_interesting_struct (const_tree record_1) return retval; } + +inline static bool +is_field_decl_p(const_tree field) +{ + gcc_assert(field); + const enum tree_code code = TREE_CODE(field); + const bool is_field = FIELD_DECL == code; + gcc_assert(is_field); +} + static bool -is_interesting_field (const_tree field) +is_interesting_field_manual (const_tree field) { - enum tree_code code = TREE_CODE (field); - gcc_assert (code == FIELD_DECL); + log ("HERE HERE %s\n", get_type_name(field)); + is_field_decl_p(field); const char *field_name = get_field_name (field); const int buffer_size = 1024; @@ -639,6 +676,32 @@ is_interesting_field (const_tree field) } static bool +is_interesting_field_escape_analysis(const_tree field) +{ + is_field_decl_p(field); + const_tree main_variant = TYPE_MAIN_VARIANT(field); + is_field_decl_p(main_variant); + + + const bool in_set = +#if __cplusplus > 201703L + interesting_fields.contains(main_variant) +#else + interesting_fields.find(main_variant) != interesting_fields.end() +#endif + ; + + return in_set; +} + +static bool +is_interesting_field (const_tree field) +{ + const bool use_escape_analysis_info = !flag_ipa_typelist_struct && !flag_ipa_typelist_field; + return use_escape_analysis_info ? is_interesting_field_escape_analysis(field) : is_interesting_field_manual(field); +} + +static bool filter_out_boring_record (const_tree record, hash_set<const_tree> &map) { test_log ("filter_out_boring_record", 0); @@ -1041,12 +1104,14 @@ make_new_record_based_on_old (const_tree old, for (tree old_field = TYPE_FIELDS (old); old_field; old_field = DECL_CHAIN (old_field)) { - const bool are_field_names_equal = is_interesting_field (old_field); - if (are_field_names_equal && will_definitely_change) + if (will_definitely_change) { - deleted_fields->add(old_field); - continue; + const bool are_field_names_equal = is_interesting_field (old_field); + if (are_field_names_equal) { + deleted_fields->add(old_field); + continue; + } } tree new_field = make_node (FIELD_DECL); @@ -2458,10 +2523,33 @@ compute_inverse_type_map ( t_map &mod_type_map, compute_inverse_type_map_internal> (&inverse_map); } -static unsigned int -iphw_execute () + +static void +separate_set_of_pairs_into_pair_of_sets(const record_field_set &set_of_pairs, std::set<const_tree> &one, std::set<const_tree> &two) { - test_log ("Executing structreorg", 0); + + for (auto it = set_of_pairs.cbegin(); it != set_of_pairs.cend() ; ++it) + { + fields record_field_pair = *it; + const_tree record = record_field_pair.first; + const_tree field = record_field_pair.second; + one.insert(record); + two.insert(field); + } +} + +static void +iphw_execute_escape_analysis() +{ + gcc_assert(!flag_ipa_typelist_struct && !flag_ipa_typelist_field); + const record_field_set to_reorg = get_fields_to_reorg(); + separate_set_of_pairs_into_pair_of_sets(to_reorg, interesting_records, interesting_fields); +} + +static void +iphw_execute_cli_args() +{ + gcc_assert(flag_ipa_typelist_struct && flag_ipa_typelist_field); hash_set<const_tree> orig_type_map; collect_orig_structs (orig_type_map); @@ -2486,6 +2574,14 @@ iphw_execute () t_map inverse_type_map; compute_inverse_type_map (mod_type_map, inverse_type_map); rewrite_references_to_modified_structs (mod_type_map, inverse_type_map); +} + +static unsigned int +iphw_execute () +{ + test_log ("Executing structreorg", 0); + const bool perform_escape_analysis = !flag_ipa_typelist_struct && !flag_ipa_typelist_field ; + perform_escape_analysis ? iphw_execute_escape_analysis() : iphw_execute_cli_args(); return 0; } |