From 71d4d3eb2e301548f8d560b618179abd66f58637 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Tue, 30 Jun 2009 12:10:29 +0200 Subject: [PATCH] re PR tree-optimization/40582 (ice for non-trivial conversion at assignment with -O2) 2009-06-30 Martin Jambor 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 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr40582.c | 18 ++++++++++++++++++ gcc/tree-sra.c | 4 ++-- 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr40582.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 554de52b80e..79637f070fd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2009-06-30 Martin Jambor + + 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 PR middle-end/40554 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 42456c814d7..49ca9c1ba60 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-06-30 Martin Jambor + + PR tree-optimization/40582 + * gcc.c-torture/compile/pr40582.c: New test. + 2009-06-30 Wei Guozhi 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 00000000000..51234da40f2 --- /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 4529754108c..2381ac34d1e 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)