diff options
author | Martin Jambor <mjambor@suse.cz> | 2009-06-30 12:10:29 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2009-06-30 12:10:29 +0200 |
commit | 71d4d3eb2e301548f8d560b618179abd66f58637 (patch) | |
tree | d215d6cb73fb06f4e42cf6671199fea294a20c16 /gcc | |
parent | f57017cdbb460190ba75d6c7c1590253a2df849c (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr40582.c | 18 | ||||
-rw-r--r-- | gcc/tree-sra.c | 4 |
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) |