From 9f68560cb5dd86f27ed0df035cc4821b39885887 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 18 Dec 2008 08:52:07 +0100 Subject: [PATCH] re PR middle-end/38505 (Revision 142061 caused ICE on __builtin_memcpy) PR middle-end/38505 * tree-ssa.c (useless_type_conversion_p_1): Return false if inner_type is incomplete and outer_type is complete. * gcc.c-torture/compile/pr38505.c: New test. From-SVN: r142806 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/compile/pr38505.c | 23 +++++++++++++++++++ gcc/tree-ssa.c | 5 ++++ 4 files changed, 39 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr38505.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index df3ced5215ff..49176895d484 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-12-18 Jakub Jelinek + + PR middle-end/38505 + * tree-ssa.c (useless_type_conversion_p_1): Return + false if inner_type is incomplete and outer_type is complete. + 2008-12-17 Sebastian Pop * doc/install.texi (Prerequisites): Document PPL and CLooG-PPL diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 11a6a7095314..0bf69e2562b4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-12-18 Jakub Jelinek + + PR middle-end/38505 + * gcc.c-torture/compile/pr38505.c: New test. + 2008-12-17 Jason Merrill * g++.dg/cpp0x/auto6.C: Test more stuff. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr38505.c b/gcc/testsuite/gcc.c-torture/compile/pr38505.c new file mode 100644 index 000000000000..b3b4a10c7734 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr38505.c @@ -0,0 +1,23 @@ +/* PR middle-end/38505 */ +/* { dg-do compile } */ + +struct S +{ + unsigned short a[50]; + unsigned short b[20]; +}; +extern void bar (struct S *); +extern void baz (unsigned short *); +extern unsigned short d[]; + +void +foo (void) +{ + struct S s; + unsigned short g[50]; + + baz (g); + __builtin_memcpy (&s, g, sizeof (g)); + __builtin_memcpy (s.b, d, sizeof (s.b)); + bar (&s); +} diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 935cad676c14..ce0f1e4ee67b 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1188,6 +1188,11 @@ useless_type_conversion_p_1 (tree outer_type, tree inner_type) if (TREE_CODE (inner_type) != TREE_CODE (outer_type)) return false; + /* Conversion from an incomplete to a complete type is never + useless. */ + if (!COMPLETE_TYPE_P (inner_type) && COMPLETE_TYPE_P (outer_type)) + return false; + /* ??? This seems to be necessary even for aggregates that don't have TYPE_STRUCTURAL_EQUALITY_P set. */ -- 2.43.5