From: Martin Jambor Date: Wed, 13 Jan 2010 18:47:19 +0000 (+0100) Subject: re PR tree-optimization/42704 (ICE in verify_ssa after early SRA) X-Git-Tag: releases/gcc-4.5.0~1254 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=19656178bc77d347cb674bb990bb5c9e1476df4a;p=thirdparty%2Fgcc.git re PR tree-optimization/42704 (ICE in verify_ssa after early SRA) 2010-01-13 Martin Jambor PR tree-optimization/42704 * tree-sra.c (sra_modify_assign): Do not delete assignments to SSA_NAMEs. * testsuite/g++.dg/torture/pr42704.C: New test. From-SVN: r155865 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b8a4ec0008c0..0bf51b8ac901 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-01-13 Martin Jambor + + PR tree-optimization/42704 + * tree-sra.c (sra_modify_assign): Do not delete assignments to + SSA_NAMEs. + 2010-01-13 Martin Jambor PR tree-optimization/42703 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 148ba87203df..5bce27b598bc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,12 @@ +2010-01-13 Martin Jambor + + PR tree-optimization/42704 + * g++.dg/torture/pr42704.C: New test. + 2010-01-13 Martin Jambor PR tree-optimization/42703 - * testsuite/gcc.c-torture/compile/pr42703.c: New test. + * gcc.c-torture/compile/pr42703.c: New test. 2010-01-13 Richard Guenther diff --git a/gcc/testsuite/g++.dg/torture/pr42704.C b/gcc/testsuite/g++.dg/torture/pr42704.C new file mode 100644 index 000000000000..735b1e7bdea7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42704.C @@ -0,0 +1,44 @@ +/* { dg-do compile } */ + +typedef int PRInt32; +class nsTreeRows { + class Subtree { }; + enum { kMaxDepth = 32 }; + struct Link { + Subtree* mParent; + PRInt32 mChildIndex; + Link& operator=(const Link& aLink) { + mParent = aLink.mParent; + mChildIndex = aLink.mChildIndex; + } + }; + class iterator { + PRInt32 mTop; + PRInt32 mRowIndex; + Link mLink[kMaxDepth]; + public: + iterator() : mTop(-1), mRowIndex(-1) { } + iterator& operator=(const iterator& aIterator); + }; + Subtree* EnsureSubtreeFor(Subtree* aParent, PRInt32 aChildIndex); + Subtree* GetSubtreeFor(const Subtree* aParent, +PRInt32 aChildIndex, PRInt32* aSubtreeSize = 0); + void InvalidateCachedRow() { + mLastRow = iterator(); + } + iterator mLastRow; +}; +nsTreeRows::Subtree* nsTreeRows::EnsureSubtreeFor(Subtree* aParent, + PRInt32 aChildIndex) { + Subtree* subtree = GetSubtreeFor(aParent, aChildIndex); + if (! subtree) { + InvalidateCachedRow(); + } +} +nsTreeRows::iterator& nsTreeRows::iterator::operator=(const iterator& +aIterator) { + mTop = aIterator.mTop; + for (PRInt32 i = mTop; + i >= 0; + --i) mLink[i] = aIterator.mLink[i]; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 38b3cf507e06..e9766d78a54e 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2533,7 +2533,9 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi, { if (access_has_children_p (racc)) { - if (!racc->grp_unscalarized_data) + if (!racc->grp_unscalarized_data + /* Do not remove SSA name definitions (PR 42704). */ + && TREE_CODE (lhs) != SSA_NAME) { generate_subtree_copies (racc->first_child, lhs, racc->offset, 0, 0, gsi,