From 9d75804367cd7c3aac109d33a98f3a038cbe8020 Mon Sep 17 00:00:00 2001 From: Mikael Morin Date: Thu, 3 Nov 2011 23:39:11 +0000 Subject: [PATCH] trans.h (struct gfc_loopinfo): New fields nested and next. * trans.h (struct gfc_loopinfo): New fields nested and next. * trans-array.c (gfc_add_ss_to_loop): Update list of nested list if ss has non-null nested_ss field. From-SVN: r180897 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/trans-array.c | 16 ++++++++++++++++ gcc/fortran/trans.h | 3 +++ 3 files changed, 25 insertions(+) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e973d487553..a8d38424326 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2011-11-03 Mikael Morin + + * trans.h (struct gfc_loopinfo): New fields nested and next. + * trans-array.c (gfc_add_ss_to_loop): Update list of nested list if + ss has non-null nested_ss field. + 2011-11-03 Mikael Morin * trans-array.c (gfc_trans_create_temp_array): Loop over the parents. diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 1a86ae66c59..0c1dc895d0d 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -645,6 +645,7 @@ void gfc_add_ss_to_loop (gfc_loopinfo * loop, gfc_ss * head) { gfc_ss *ss; + gfc_loopinfo *nested_loop; if (head == gfc_ss_terminator) return; @@ -654,6 +655,21 @@ gfc_add_ss_to_loop (gfc_loopinfo * loop, gfc_ss * head) ss = head; for (; ss && ss != gfc_ss_terminator; ss = ss->next) { + if (ss->nested_ss) + { + nested_loop = ss->nested_ss->loop; + + /* More than one ss can belong to the same loop. Hence, we add the + loop to the chain only if it is different from the previously + added one, to avoid duplicate nested loops. */ + if (nested_loop != loop->nested) + { + gcc_assert (nested_loop->next == NULL); + nested_loop->next = loop->nested; + loop->nested = nested_loop; + } + } + if (ss->next == gfc_ss_terminator) ss->loop_chain = loop->ss; else diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 06088797f64..0549aa79301 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -279,6 +279,9 @@ typedef struct gfc_loopinfo /* The SS describing the temporary used in an assignment. */ gfc_ss *temp_ss; + /* Chain of nested loops. */ + struct gfc_loopinfo *nested, *next; + /* The scalarization loop index variables. */ tree loopvar[GFC_MAX_DIMENSIONS];