From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 94532 invoked by alias); 27 Jan 2016 08:37:37 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 94508 invoked by uid 89); 27 Jan 2016 08:37:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:2795 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Wed, 27 Jan 2016 08:37:35 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B6896ABB5 for ; Wed, 27 Jan 2016 08:37:31 +0000 (UTC) Date: Wed, 27 Jan 2016 08:37:00 -0000 From: Richard Biener To: Martin Jambor cc: GCC Patches Subject: Re: [PR 69355] Correct hole detection when total_scalarization fails In-Reply-To: <20160126172131.GJ32511@virgil.suse.cz> Message-ID: References: <20160126172131.GJ32511@virgil.suse.cz> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2016-01/txt/msg02088.txt.bz2 On Tue, 26 Jan 2016, Martin Jambor wrote: > Hi, > > PR 69355 has revealed that when SRA attempts total scalarization of an > aggregate but this fails because the user type-casts a scalar field > and stores into a it a smaller aggregate (and the scalar field is not > written to, whether directly or as a part of an aggregate store), the > pass can loose track of unscalarized data there. > > I think that this can happen only when violating strict aliasing rules > but with -fno-strict-aliasing it should work. > > Fixed thusly with the patch below (the condition is there to avoid > detecting padding after aggregate-fields in totally-scalarized > aggregates as unscalarized data). Bootstrapped and tested on > x86_64-linux. OK for trunk? And the gcc-5 branch? Ok. Thanks, Richard. > Thanks, > > Martin > > > 2016-01-26 Martin Jambor > > PR tree-optimization/69355 > * tree-sra.c (analyze_access_subtree): Correct hole detection when > total_scalarization fails. > > testsuite/ > * gcc.dg/tree-ssa/pr69355.c: New test. > > --- > gcc/testsuite/gcc.dg/tree-ssa/pr69355.c | 44 +++++++++++++++++++++++++++++++++ > gcc/tree-sra.c | 2 +- > 2 files changed, 45 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr69355.c > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr69355.c b/gcc/testsuite/gcc.dg/tree-ssa/pr69355.c > new file mode 100644 > index 0000000..f515c21 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr69355.c > @@ -0,0 +1,44 @@ > +/* { dg-do run } */ > +/* { dg-options "-O -fno-strict-aliasing" } */ > + > +struct S > +{ > + void *a; > + long double b; > +}; > + > +struct Z > +{ > + long long l; > + short s; > +} __attribute__((packed)); > + > +struct S __attribute__((noclone, noinline)) > +foo (void *v, struct Z *z) > +{ > + struct S t; > + t.a = v; > + *(struct Z *) &t.b = *z; > + return t; > +} > + > +struct Z gz; > + > +int > +main (int argc, char **argv) > +{ > + struct S s; > + > + if (sizeof (long double) < sizeof (struct Z)) > + return 0; > + > + gz.l = 0xbeef; > + gz.s = 0xab; > + > + s = foo ((void *) 0, &gz); > + > + if ((((struct Z *) &s.b)->l != gz.l) > + || (((struct Z *) &s.b)->s != gz.s)) > + __builtin_abort (); > + return 0; > +} > diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c > index 740542f..b0e737a 100644 > --- a/gcc/tree-sra.c > +++ b/gcc/tree-sra.c > @@ -2421,7 +2421,7 @@ analyze_access_subtree (struct access *root, struct access *parent, > > if (covered_to < limit) > hole = true; > - if (scalar) > + if (scalar || !allow_replacements) > root->grp_total_scalarization = 0; > } > > -- Richard Biener SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)