From: Martin Jambor Date: Tue, 21 Dec 2010 11:05:49 +0000 (+0100) Subject: backport: re PR middle-end/46734 (ICE in create_tmp_var, at gimplify.c:505) X-Git-Tag: releases/gcc-4.5.3~352 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57261dd786117289ba5cbb327de6f07140a22ea1;p=thirdparty%2Fgcc.git backport: re PR middle-end/46734 (ICE in create_tmp_var, at gimplify.c:505) 2010-12-21 Martin Jambor Backport from mainline: 2010-12-09 Martin Jambor PR middle-end/46734 * tree-sra.c (splice_param_accesses): Check that there are not multiple ADDRESSABLE types. * testsuite/g++.dg/tree-ssa/pr46734.C: New test. From-SVN: r168109 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 925094d4cc2f..257d125c55fa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2010-12-21 Martin Jambor + + Backport from mainline: + 2010-12-09 Martin Jambor + + PR middle-end/46734 + * tree-sra.c (splice_param_accesses): Check that there are not + multiple ADDRESSABLE types. + 2010-12-19 John David Anglin Backport from mainline: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f720112b233d..3ed2ee7fcc57 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-21 Martin Jambor + + PR middle-end/46734 + * g++.dg/tree-ssa/pr46734.C: New test. + 2010-12-18 Alexandre Oliva PR debug/46756 diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr46734.C b/gcc/testsuite/g++.dg/tree-ssa/pr46734.C new file mode 100644 index 000000000000..e95c62089749 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr46734.C @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fipa-sra" } */ + +struct A +{ + int *p; + A() {p = (int *) -1;} + ~A() {if (p && p != (int *) -1) *p = 0;} +}; + +struct B +{ + A a; + char data[23]; + B() : a() {data[0] = 0;} +}; + +extern A ga; +extern int *gi; +extern void *gz; +extern B *gb; + +static int * __attribute__ ((noinline)) foo (B *b, void *z) +{ + __builtin_memcpy (gz, z, 28); + ga = b->a; + return b->a.p; +} + +int *bar (B *b, void *z) +{ + gb = b; + return foo (b, z); +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 05ca33cb3785..06d2cdf71813 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -3413,7 +3413,10 @@ splice_param_accesses (tree parm, bool *ro_grp) else if (ac2->size != access->size) return NULL; - if (access_precludes_ipa_sra_p (ac2)) + if (access_precludes_ipa_sra_p (ac2) + || (ac2->type != access->type + && (TREE_ADDRESSABLE (ac2->type) + || TREE_ADDRESSABLE (access->type)))) return NULL; modification |= ac2->write;