aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2009-06-30 12:10:29 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2009-06-30 12:10:29 +0200
commit71d4d3eb2e301548f8d560b618179abd66f58637 (patch)
treed215d6cb73fb06f4e42cf6671199fea294a20c16 /gcc
parentf57017cdbb460190ba75d6c7c1590253a2df849c (diff)
downloadgcc-71d4d3eb2e301548f8d560b618179abd66f58637.zip
gcc-71d4d3eb2e301548f8d560b618179abd66f58637.tar.gz
gcc-71d4d3eb2e301548f8d560b618179abd66f58637.tar.bz2
re PR tree-optimization/40582 (ice for non-trivial conversion at assignment with -O2)
2009-06-30 Martin Jambor <mjambor@suse.cz> PR tree-optimization/40582 * tree-sra.c (build_ref_for_offset_1): Use types_compatible_p rather than useless_type_conversion_p. (generate_subtree_copies): Increment sra_stats.subtree_copies at a proper place. * testsuite/gcc.c-torture/compile/pr40582.c: New test. From-SVN: r149088
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr40582.c18
-rw-r--r--gcc/tree-sra.c4
4 files changed, 33 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 554de52..79637f0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2009-06-30 Martin Jambor <mjambor@suse.cz>
+ PR tree-optimization/40582
+ * tree-sra.c (build_ref_for_offset_1): Use types_compatible_p rather
+ than useless_type_conversion_p.
+ (generate_subtree_copies): Increment sra_stats.subtree_copies at a
+ proper place.
+
+2009-06-30 Martin Jambor <mjambor@suse.cz>
+
PR middle-end/40554
* tree-sra.c (sra_modify_expr): Add access->offset to start_offset.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 42456c8..49ca9c1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-06-30 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/40582
+ * gcc.c-torture/compile/pr40582.c: New test.
+
2009-06-30 Wei Guozhi <carrot@google.com>
PR/40416
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr40582.c b/gcc/testsuite/gcc.c-torture/compile/pr40582.c
new file mode 100644
index 0000000..51234da
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr40582.c
@@ -0,0 +1,18 @@
+struct A
+{
+ void* q;
+ short i;
+};
+
+union U
+{
+ char* p;
+ struct A a;
+};
+
+struct A foo(union U u)
+{
+ struct A a = { 0, 0 };
+ a = u.a;
+ return a;
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 4529754..2381ac3 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1036,7 +1036,7 @@ build_ref_for_offset_1 (tree *res, tree type, HOST_WIDE_INT offset,
HOST_WIDE_INT el_size;
if (offset == 0 && exp_type
- && useless_type_conversion_p (exp_type, type))
+ && types_compatible_p (exp_type, type))
return true;
switch (TREE_CODE (type))
@@ -1760,7 +1760,6 @@ generate_subtree_copies (struct access *access, tree agg,
insert_after ? GSI_NEW_STMT
: GSI_SAME_STMT);
stmt = gimple_build_assign (expr, repl);
- sra_stats.subtree_copies++;
}
if (insert_after)
@@ -1768,6 +1767,7 @@ generate_subtree_copies (struct access *access, tree agg,
else
gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
update_stmt (stmt);
+ sra_stats.subtree_copies++;
}
if (access->first_child)