aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/torture/pr42704.C44
-rw-r--r--gcc/tree-sra.c4
4 files changed, 59 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b8a4ec0..0bf51b8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2010-01-13 Martin Jambor <mjambor@suse.cz>
+ PR tree-optimization/42704
+ * tree-sra.c (sra_modify_assign): Do not delete assignments to
+ SSA_NAMEs.
+
+2010-01-13 Martin Jambor <mjambor@suse.cz>
+
PR tree-optimization/42703
* tree-sra.c (analyze_access_subtree): Check that we can build a
reference to the original data within the aggregate.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 148ba87..5bce27b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,7 +1,12 @@
2010-01-13 Martin Jambor <mjambor@suse.cz>
+ PR tree-optimization/42704
+ * g++.dg/torture/pr42704.C: New test.
+
+2010-01-13 Martin Jambor <mjambor@suse.cz>
+
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 <rguenther@suse.de>
diff --git a/gcc/testsuite/g++.dg/torture/pr42704.C b/gcc/testsuite/g++.dg/torture/pr42704.C
new file mode 100644
index 0000000..735b1e7
--- /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 38b3cf5..e9766d7 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,