diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2011-11-03 22:54:37 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2011-11-03 22:54:37 +0000 |
commit | 4615abe8569bedef58b8400e881cf10a49e5383c (patch) | |
tree | 76d69fd45ec296d10eee88ad7f8b62be67d52f31 /gcc/fortran | |
parent | c7bf4f1e646ac15f269ac01128c75cccc2bb05bf (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 23 | ||||
-rw-r--r-- | gcc/fortran/trans.h | 3 |
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; |