+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
tree maskindex;
int nvar;
tree size;
- struct forall_info *outer;
- struct forall_info *next_nest;
+ struct forall_info *prev_nest;
}
forall_info;
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. */
}
}
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;
}
/* 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;
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;
}
/* 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. */
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. */