diff options
author | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-04-29 10:30:41 +0200 |
---|---|---|
committer | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-04-29 10:30:41 +0200 |
commit | 28ae7783a2a36e4303e886aeed04a8812d95c5a1 (patch) | |
tree | 20fbe1feafe41cba3eee508fa94f524a272be04d | |
parent | 8a5a3a5b7cc72724576e36555b2fff135bec2d7d (diff) |
Fixes bug #2 found by creduce
-rw-r--r-- | gcc/ipa-hello-world.c | 10 | ||||
-rw-r--r-- | gcc/ipa-str-reorg-dead-field-eliminate.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/ipa/ipa-structreorg-52-creduce-1.c | 11 |
3 files changed, 31 insertions, 1 deletions
diff --git a/gcc/ipa-hello-world.c b/gcc/ipa-hello-world.c index 65a1ba9c6a4..7489478f1f4 100644 --- a/gcc/ipa-hello-world.c +++ b/gcc/ipa-hello-world.c @@ -107,6 +107,7 @@ typedef std::set<const_tree> record_set; enum access_code { READ_ACCESS, WRITE_ACCESS }; + void count_access_for_type_in_component_ref(const_tree component_ref, const record_set &non_escaping_records, field_access_counter &counter, const enum access_code access) { @@ -121,9 +122,16 @@ count_access_for_type_in_component_ref(const_tree component_ref, const record_se gcc_assert(tree_type_struct); enum tree_code tree_type_struct_code = TREE_CODE(tree_type_struct); const bool is_record_type = RECORD_TYPE == tree_type_struct_code; + //TODO: Also write something for UNION_TYPE + switch (tree_type_struct_code) + { + case UNION_TYPE: return; break; + case RECORD_TYPE: break; + default: gcc_unreachable(); break; + } gcc_assert(is_record_type); - //FIXME: Future proofing or makinng things more difficult to read? + //FIXME: Future proofing or making things more difficult to read? const bool in_set = #if __cplusplus > 201703L non_escaping_records.contains(tree_type_struct) diff --git a/gcc/ipa-str-reorg-dead-field-eliminate.c b/gcc/ipa-str-reorg-dead-field-eliminate.c index f2e3ccedbb1..9a77b7a6553 100644 --- a/gcc/ipa-str-reorg-dead-field-eliminate.c +++ b/gcc/ipa-str-reorg-dead-field-eliminate.c @@ -1530,6 +1530,7 @@ rewrite_component_ref_def (tree expr, gcc_assert (expr); tree expr_type = TREE_TYPE (expr); gcc_assert (expr_type); + delete_info_t *delete_info1 = type_map.get (expr_type); const_tree *new_expr_type_ptr = delete_info1 ? &(delete_info1->new_record) : NULL; if (new_expr_type_ptr) @@ -1539,6 +1540,16 @@ rewrite_component_ref_def (tree expr, gcc_assert (_struct); tree _struct_type = TREE_TYPE (_struct); gcc_assert (_struct_type); + const enum tree_code code = TREE_CODE(_struct_type); + const bool is_record = RECORD_TYPE == code; + //TODO: Handle unions better + switch (code) + { + case UNION_TYPE: return false; break; + case RECORD_TYPE: break; + default: gcc_unreachable(); break; + } + gcc_assert(is_record); delete_info_t *delete_info = type_map.get (_struct_type); const_tree *new_struct_type_ptr = delete_info ? &(delete_info->new_record) : NULL; diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-structreorg-52-creduce-1.c b/gcc/testsuite/gcc.dg/ipa/ipa-structreorg-52-creduce-1.c new file mode 100644 index 00000000000..711952d21e9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/ipa-structreorg-52-creduce-1.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-w -flto -flto-partition=none -fipa-dead-field-eliminate" } */ + +#include <stdint.h> +union a { + int16_t b +} c() { + union a d; + -d.b; +} +main() {} |