From: Mikael Morin Date: Thu, 3 Nov 2011 23:17:08 +0000 (+0000) Subject: trans.h (struct gfc_ss): New field parent. X-Git-Tag: releases/gcc-4.7.0~2547 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2eace29ac3f8879577920f6d863e58fa2f281b59;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ce4e619b7783..a552beade86a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2011-11-03 Mikael Morin + + * 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 * trans-array.h (gfc_trans_create_temp_array): Remove loop argument. diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index d386a228a0e4..abff8b5dc732 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 e091c89d6962..72d35f8de894 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 62bcc643fb53..53c5ce25fa4b 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;