summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-04-29 11:59:14 +0200
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-04-29 11:59:14 +0200
commitcf2feafa7e367cf1f115abe0099d5fde94d52b8b (patch)
tree1f3db0abf3f573cf454fb394d30d9336fd32ac2a
parentec5b8cec1c1869a8d5968e78b7105aa8e1762fc0 (diff)
Fixes csmith test #4
-rw-r--r--gcc/ipa-str-reorg-dead-field-eliminate.c13
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipa-structreorg-55-csmith-4.c10
2 files changed, 23 insertions, 0 deletions
diff --git a/gcc/ipa-str-reorg-dead-field-eliminate.c b/gcc/ipa-str-reorg-dead-field-eliminate.c
index a99f9f4ddf0..0d6b5df18d8 100644
--- a/gcc/ipa-str-reorg-dead-field-eliminate.c
+++ b/gcc/ipa-str-reorg-dead-field-eliminate.c
@@ -1508,7 +1508,20 @@ rewrite_component_ref_def_lhs (gimple_stmt_iterator &gsi, tree expr, t_map &type
tree _struct = TREE_OPERAND (expr, 0);
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);
delete_info = delete_info ? delete_info : type_map.get (TYPE_MAIN_VARIANT(_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-55-csmith-4.c b/gcc/testsuite/gcc.dg/ipa/ipa-structreorg-55-csmith-4.c
new file mode 100644
index 00000000000..e745c6aa8fb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/ipa-structreorg-55-csmith-4.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-options "-w -flto -flto-partition=none -fipa-dead-field-eliminate" } */
+
+#include <stdint.h>
+union a {
+ int8_t b
+} c() {
+ union a d = {4073709551608};
+}
+main() {}