summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-04-16 13:51:18 +0200
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-04-28 23:35:53 +0200
commita924212d60f2ca55698916d5b4fd76240cd8dcf9 (patch)
tree14950acd3b0f9d58c912565f1ede8700ea25d1ba
parentf9e344f641cf61514e552b2b1d8f896c6e3d44c5 (diff)
wip
-rw-r--r--gcc/ipa-hello-world.c2
-rw-r--r--gcc/ipa-hello-world.h1
-rw-r--r--gcc/ipa-str-reorg-dead-field-eliminate.c118
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;
}