aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2011-11-03 22:54:37 +0000
committerMikael Morin <mikael@gcc.gnu.org>2011-11-03 22:54:37 +0000
commit4615abe8569bedef58b8400e881cf10a49e5383c (patch)
tree76d69fd45ec296d10eee88ad7f8b62be67d52f31 /gcc/fortran
parentc7bf4f1e646ac15f269ac01128c75cccc2bb05bf (diff)
downloadgcc-4615abe8569bedef58b8400e881cf10a49e5383c.zip
gcc-4615abe8569bedef58b8400e881cf10a49e5383c.tar.gz
gcc-4615abe8569bedef58b8400e881cf10a49e5383c.tar.bz2
trans.h (struct gfc_ss): New field loop.
* trans.h (struct gfc_ss): New field loop. * trans-array.c (set_ss_loop): New function. (gfc_add_ss_to_loop): Call set_ss_loop. From-SVN: r180884
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-array.c23
-rw-r--r--gcc/fortran/trans.h3
3 files changed, 32 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d014b9d..57d62be 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
+ * trans.h (struct gfc_ss): New field loop.
+ * trans-array.c (set_ss_loop): New function.
+ (gfc_add_ss_to_loop): Call set_ss_loop.
+
+2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
+
* trans.h (struct gfc_ss_info): New field refcount.
* trans-array.c (free_ss_info): Decrement refcount. Return early if
still non-zero.
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index abb6db2..e64767a 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -618,6 +618,27 @@ gfc_cleanup_loop (gfc_loopinfo * loop)
}
+static void
+set_ss_loop (gfc_ss *ss, gfc_loopinfo *loop)
+{
+ int n;
+
+ for (; ss != gfc_ss_terminator; ss = ss->next)
+ {
+ ss->loop = loop;
+
+ if (ss->info->type == GFC_SS_SCALAR
+ || ss->info->type == GFC_SS_REFERENCE
+ || ss->info->type == GFC_SS_TEMP)
+ continue;
+
+ for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
+ if (ss->info->data.array.subscript[n] != NULL)
+ set_ss_loop (ss->info->data.array.subscript[n], loop);
+ }
+}
+
+
/* Associate a SS chain with a loop. */
void
@@ -628,6 +649,8 @@ gfc_add_ss_to_loop (gfc_loopinfo * loop, gfc_ss * head)
if (head == gfc_ss_terminator)
return;
+ set_ss_loop (head, loop);
+
ss = head;
for (; ss && ss != gfc_ss_terminator; ss = ss->next)
{
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index 02f2b42..62bcc64 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;
+ /* The loop this gfc_ss is in. */
+ struct gfc_loopinfo *loop;
+
unsigned is_alloc_lhs:1;
}
gfc_ss;