From 3e44f600c333e30f361110f36a55dde7ad30209d Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Fri, 2 Dec 2011 13:53:03 +0100 Subject: [PATCH] re PR tree-optimization/50622 (ICE: verify_gimple failed for std::complex) 2011-12-02 Martin Jambor 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. From-SVN: r181908 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/tree-ssa/pr50622.C | 30 +++++++++++++++++++++++++ gcc/tree-sra.c | 4 ++++ 4 files changed, 45 insertions(+) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr50622.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0a15c038954..5e559196d8b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-12-02 Martin Jambor + + PR tree-optimization/50622 + * tree-sra.c (load_assign_lhs_subreplacements): Force gimple operand + if both lacc and racc are grp_partial_lhs. + 2011-12-01 Kaz Kojima PR target/50814. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cd9e27e77f8..2d3dc33784b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-12-02 Martin Jambor + + PR tree-optimization/50622 + * g++.dg/tree-ssa/pr50622.C: New test. + 2011-12-01 Jason Merrill * g++.dg/cpp0x/initlist61.C: New. diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr50622.C b/gcc/testsuite/g++.dg/tree-ssa/pr50622.C new file mode 100644 index 00000000000..d7f4fa74b95 --- /dev/null +++ b/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; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 472ad5d6f5d..dec5316468c 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2692,6 +2692,10 @@ load_assign_lhs_subreplacements (struct access *lacc, struct access *top_racc, 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 {