From ec5b8cec1c1869a8d5968e78b7105aa8e1762fc0 Mon Sep 17 00:00:00 2001 From: Erick Ochoa Date: Wed, 29 Apr 2020 11:48:19 +0200 Subject: Fixes bug #3 found by csmith --- gcc/ipa-str-reorg-dead-field-eliminate.c | 42 +++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/gcc/ipa-str-reorg-dead-field-eliminate.c b/gcc/ipa-str-reorg-dead-field-eliminate.c index 9a77b7a6553..a99f9f4ddf0 100644 --- a/gcc/ipa-str-reorg-dead-field-eliminate.c +++ b/gcc/ipa-str-reorg-dead-field-eliminate.c @@ -587,6 +587,7 @@ struct cstrless { }; std::set interesting_records; std::set interesting_fields; +std::set record_field_pair_name; std::set updated_functions; static bool @@ -647,6 +648,27 @@ is_interesting_struct (const_tree record_1) return use_escape_analysis_info ? is_interesting_struct_escape_analysis(record_1) : is_interesting_struct_manual(record_1); } +static bool +is_interesting_pair (const char* pair_name) +{ + const bool use_escape_analysis_info = !flag_ipa_typelist_struct && !flag_ipa_typelist_field; + //TODO: If we are not in escape analysis we shouldn't be calling this function. + //We need to define a better interface for specifying record type and name to avoid + //having this problem. + if (!use_escape_analysis_info) return true; + const bool in_set = +#if __cplusplus > 201703L + record_field_pair_name.contains(pair_name); +#else + record_field_pair_name.find(pair_name) != record_field_pair_name.end() +#endif + ; + + log("is interesting pair? %s\n", in_set ? "true" : "false"); + + return in_set; +} + static bool is_interesting_struct_manual(const_tree record_1) { @@ -1152,11 +1174,20 @@ make_new_record_based_on_old (const_tree old, { const bool are_field_names_equal = is_interesting_field (old_field); - log("am i deleting fields ? %s\n", will_definitely_change && are_field_names_equal ? "true" : "false"); + log("am i deleting field %s ? %s\n", get_field_name(old_field), will_definitely_change && are_field_names_equal ? "true" : "false"); if (will_definitely_change && are_field_names_equal) { + char *buffer; + char *buffer2; + asprintf(&buffer, "%s.%s", get_type_name(old), get_field_name(old_field)); + asprintf(&buffer2, "%s.%s", get_type_name(TYPE_MAIN_VARIANT(old)), get_field_name(old_field)); + log("buffer %s\n", buffer); + log("buffer2 %s\n", buffer2); + if (is_interesting_pair(buffer) || is_interesting_pair(buffer2)) + { deleted_fields->add(old_field); continue; + } } tree new_field = make_node (FIELD_DECL); @@ -2606,10 +2637,19 @@ separate_set_of_pairs_into_pair_of_sets(const record_field_set &set_of_pairs, st { fields record_field_pair = *it; const_tree record = record_field_pair.first; + if (strcmp(get_record_name(record), "") == 0) continue; const_tree field = record_field_pair.second; one.insert(get_type_name(record)); one.insert(get_type_name(TYPE_MAIN_VARIANT(record))); two.insert(get_field_name(field)); + char *buffer; + char *buffer2; + asprintf(&buffer, "%s.%s", get_type_name(record), get_field_name(field)); + asprintf(&buffer2, "%s.%s", get_type_name(TYPE_MAIN_VARIANT(record)), get_field_name(field)); + log("putting in %s\n", buffer); + log("putting in %s\n", buffer2); + record_field_pair_name.insert(buffer); + record_field_pair_name.insert(buffer2); } } -- cgit v1.2.3