diff options
author | Roger Sayle <roger@eyesopen.com> | 2007-01-27 19:02:25 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2007-01-27 19:02:25 +0000 |
commit | e8d366ec6bd731a594b9ba266f6720bc5274f830 (patch) | |
tree | a0770f87c543313505f4e635c59d46c79bd78a3c /gcc/fortran | |
parent | a00b8d1a38973eb176d7932bb2bd6cf7e59c5495 (diff) | |
download | gcc-e8d366ec6bd731a594b9ba266f6720bc5274f830.zip gcc-e8d366ec6bd731a594b9ba266f6720bc5274f830.tar.gz gcc-e8d366ec6bd731a594b9ba266f6720bc5274f830.tar.bz2 |
trans-stmt.c (forall_info): Replace the next_nest and outer fields that previously implemented a...
* trans-stmt.c (forall_info): Replace the next_nest and outer
fields that previously implemented a doubly-linked list with a
single prev_nest field (singly-linked list).
(gfc_trans_nested_forall_loop): The nested_forall_info argument
now denotes the innermost FORALL in the loop nest.
(compute_overall_iter_number): Use prev_nest instead of next_nest.
(gfc_trans_forall_1): Link/cons the new "info" to the head of the
nested_forall_info linked list. Free the current "info" when done.
* gfortran.dg/forall_7.f90: New test case.
From-SVN: r121236
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/fortran/trans-stmt.c | 26 |
2 files changed, 20 insertions, 17 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 75aa23f..963031d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2007-01-27 Roger Sayle <roger@eyesopen.com> + + * trans-stmt.c (forall_info): Replace the next_nest and outer + fields that previously implemented a doubly-linked list with a + single prev_nest field (singly-linked list). + (gfc_trans_nested_forall_loop): The nested_forall_info argument + now denotes the innermost FORALL in the loop nest. + (compute_overall_iter_number): Use prev_nest instead of next_nest. + (gfc_trans_forall_1): Link/cons the new "info" to the head of the + nested_forall_info linked list. Free the current "info" when done. + 2007-01-27 Paul Thomas <pault@gcc.gnu.org> PR fortran/30407 diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 6640cf7..f32a931 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -57,8 +57,7 @@ typedef struct forall_info tree maskindex; int nvar; tree size; - struct forall_info *outer; - struct forall_info *next_nest; + struct forall_info *prev_nest; } forall_info; @@ -1653,8 +1652,6 @@ gfc_trans_nested_forall_loop (forall_info * nested_forall_info, tree body, gfc_start_block (&header); forall_tmp = nested_forall_info; - while (forall_tmp->next_nest != NULL) - forall_tmp = forall_tmp->next_nest; while (forall_tmp != NULL) { /* Generate body with masks' control. */ @@ -1671,7 +1668,7 @@ gfc_trans_nested_forall_loop (forall_info * nested_forall_info, tree body, } } body = gfc_trans_forall_loop (forall_tmp, body, mask_flag, &header); - forall_tmp = forall_tmp->outer; + forall_tmp = forall_tmp->prev_nest; mask_flag = 1; } @@ -2043,7 +2040,7 @@ compute_overall_iter_number (forall_info *nested_forall_info, tree inner_size, /* First check whether all the bounds are constant. */ for (forall_tmp = nested_forall_info; forall_tmp; - forall_tmp = forall_tmp->next_nest) + forall_tmp = forall_tmp->prev_nest) if (forall_tmp->mask || !INTEGER_CST_P (forall_tmp->size)) { all_const_p = false; @@ -2055,7 +2052,7 @@ compute_overall_iter_number (forall_info *nested_forall_info, tree inner_size, tree tmp = inner_size; for (forall_tmp = nested_forall_info; forall_tmp; - forall_tmp = forall_tmp->next_nest) + forall_tmp = forall_tmp->prev_nest) tmp = fold_build2 (MULT_EXPR, gfc_array_index_type, tmp, forall_tmp->size); return tmp; @@ -2584,16 +2581,8 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info) } /* Link the current forall level to nested_forall_info. */ - if (nested_forall_info) - { - forall_info *forall_tmp = nested_forall_info; - while (forall_tmp->next_nest != NULL) - forall_tmp = forall_tmp->next_nest; - info->outer = forall_tmp; - forall_tmp->next_nest = info; - } - else - nested_forall_info = info; + info->prev_nest = nested_forall_info; + nested_forall_info = info; /* Copy the mask into a temporary variable if required. For now we assume a mask temporary is needed. */ @@ -2713,6 +2702,9 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info) gfc_free (varexpr); gfc_free (saved_vars); + /* Free the space for this forall_info. */ + gfc_free (info); + if (pmask) { /* Free the temporary for the mask. */ |