This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, PR 50622] Force a gimple operand in load_assign_lhs_subreplacements when necessary
- From: Richard Guenther <rguenther at suse dot de>
- To: Martin Jambor <mjambor at suse dot cz>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 2 Dec 2011 10:18:04 +0100 (CET)
- Subject: Re: [PATCH, PR 50622] Force a gimple operand in load_assign_lhs_subreplacements when necessary
- References: <20111201161524.GA4447@virgil.arch.suse.de>
On Thu, 1 Dec 2011, Martin Jambor wrote:
> Hi,
>
> PR 50622 is an omission in load_assign_lhs_subreplacements, which
> should force a gimple operand on a RHS of a gimple assignment if both
> sides are new replacements of scalar types which are not gimple
> registers, because they are partially modified (which can happen to
> complex numbers and bit-fields).
>
> Fixed with the patch below. It passes bootstrap and testsuite on
> x86_64-linux, I am about to do the same on the 4.6 branch because I'd
> like to commit it there as well. OK for trunk and the 4.6 branch?
Ok for both.
Thanks,
Richard.
> Thanks,
>
> Martin
>
>
> 2011-12-01 Martin Jambor <mjambor@suse.cz>
>
> PR tree-optimization/50622
> * tree-sra.c (load_assign_lhs_subreplacements): Force gimple operand
> if both lacc and racc are grp_partial_lhs.
>
> * testsuite/g++.dg/tree-ssa/pr50622.C: New test.
>
> Index: src/gcc/tree-sra.c
> ===================================================================
> --- src.orig/gcc/tree-sra.c
> +++ src/gcc/tree-sra.c
> @@ -2692,6 +2692,10 @@ load_assign_lhs_subreplacements (struct
> rhs = get_access_replacement (racc);
> if (!useless_type_conversion_p (lacc->type, racc->type))
> rhs = fold_build1_loc (loc, VIEW_CONVERT_EXPR, lacc->type, rhs);
> +
> + if (racc->grp_partial_lhs && lacc->grp_partial_lhs)
> + rhs = force_gimple_operand_gsi (old_gsi, rhs, true, NULL_TREE,
> + true, GSI_SAME_STMT);
> }
> else
> {
> Index: src/gcc/testsuite/g++.dg/tree-ssa/pr50622.C
> ===================================================================
> --- /dev/null
> +++ src/gcc/testsuite/g++.dg/tree-ssa/pr50622.C
> @@ -0,0 +1,30 @@
> +// { dg-do compile }
> +// { dg-options "-O2" }
> +
> +typedef __complex__ double Value;
> +struct LorentzVector
> +{
> + LorentzVector & operator+=(const LorentzVector & a) {
> + theX += a.theX;
> + theY += a.theY;
> + theZ += a.theZ;
> + theT += a.theT;
> + return *this;
> + }
> +
> + Value theX;
> + Value theY;
> + Value theZ;
> + Value theT;
> +};
> +
> +inline LorentzVector
> +operator+(LorentzVector a, const LorentzVector & b) {
> + return a += b;
> +}
> +
> +Value ex, et;
> +LorentzVector sum() {
> + LorentzVector v1; v1.theX =ex; v1.theY =ex+et; v1.theZ =ex-et; v1.theT =et;
> + return v1+v1;
> +}
>
>
--
Richard Guenther <rguenther@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix ImendÃrffer