summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-04-29 10:30:41 +0200
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-04-29 10:30:41 +0200
commit28ae7783a2a36e4303e886aeed04a8812d95c5a1 (patch)
tree20fbe1feafe41cba3eee508fa94f524a272be04d
parent8a5a3a5b7cc72724576e36555b2fff135bec2d7d (diff)
Fixes bug #2 found by creduce
-rw-r--r--gcc/ipa-hello-world.c10
-rw-r--r--gcc/ipa-str-reorg-dead-field-eliminate.c11
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipa-structreorg-52-creduce-1.c11
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() {}