aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2011-11-03 23:17:08 +0000
committerMikael Morin <mikael@gcc.gnu.org>2011-11-03 23:17:08 +0000
commit2eace29ac3f8879577920f6d863e58fa2f281b59 (patch)
treea269c2bd3b9affda08aaf4c98ba705eb1e1d2b1c
parent4164579308306672bbc5c1b8f6261d2cae352320 (diff)
downloadgcc-2eace29ac3f8879577920f6d863e58fa2f281b59.zip
gcc-2eace29ac3f8879577920f6d863e58fa2f281b59.tar.gz
gcc-2eace29ac3f8879577920f6d863e58fa2f281b59.tar.bz2
trans.h (struct gfc_ss): New field parent.
* trans.h (struct gfc_ss): New field parent. * trans-array.c (gfc_trans_scalarizing_loops): Skip clearing if a parent exists. * trans-expr.c (gfc_advance_se_ss_chain): Move to parent ss at the end of the chain. From-SVN: r180889
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/trans-array.c3
-rw-r--r--gcc/fortran/trans-expr.c11
-rw-r--r--gcc/fortran/trans.h3
4 files changed, 23 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ce4e619..a552bea 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,13 @@
2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
+ * trans.h (struct gfc_ss): New field parent.
+ * trans-array.c (gfc_trans_scalarizing_loops): Skip clearing if a
+ parent exists.
+ * trans-expr.c (gfc_advance_se_ss_chain): Move to parent ss at the
+ end of the chain.
+
+2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
+
* trans-array.h (gfc_trans_create_temp_array): Remove loop argument.
* trans-array.c (gfc_trans_create_temp_array): Ditto. Get loop from ss.
Update reference to loop. Remove loop argument.
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index d386a22..abff8b5 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -3193,7 +3193,8 @@ gfc_trans_scalarizing_loops (gfc_loopinfo * loop, stmtblock_t * body)
/* Clear all the used flags. */
for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain)
- ss->info->useflags = 0;
+ if (ss->parent == NULL)
+ ss->info->useflags = 0;
}
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index e091c89..72d35f8 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -83,6 +83,7 @@ void
gfc_advance_se_ss_chain (gfc_se * se)
{
gfc_se *p;
+ gfc_ss *ss;
gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator);
@@ -93,7 +94,15 @@ gfc_advance_se_ss_chain (gfc_se * se)
/* Simple consistency check. */
gcc_assert (p->parent == NULL || p->parent->ss == p->ss);
- p->ss = p->ss->next;
+ /* If we were in a nested loop, the next scalarized expression can be
+ on the parent ss' next pointer. Thus we should not take the next
+ pointer blindly, but rather go up one nest level as long as next
+ is the end of chain. */
+ ss = p->ss;
+ while (ss->next == gfc_ss_terminator && ss->parent != NULL)
+ ss = ss->parent;
+
+ p->ss = ss->next;
p = p->parent;
}
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index 62bcc64..53c5ce2 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -246,6 +246,9 @@ typedef struct gfc_ss
struct gfc_ss *loop_chain;
struct gfc_ss *next;
+ /* Non-null if the ss is part of a nested loop. */
+ struct gfc_ss *parent;
+
/* The loop this gfc_ss is in. */
struct gfc_loopinfo *loop;