Commit 5125d6d5 by Mikael Morin

trans-array.c (gfc_set_loop_bounds_from_array_spec): Loop over the parents.

	* trans-array.c (gfc_set_loop_bounds_from_array_spec): Loop over the
	parents.

From-SVN: r180890
parent 2eace29a
2011-11-03 Mikael Morin <mikael@gcc.gnu.org> 2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
* trans-array.c (gfc_set_loop_bounds_from_array_spec): Loop over the
parents.
2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
* trans.h (struct gfc_ss): New field parent. * trans.h (struct gfc_ss): New field parent.
* trans-array.c (gfc_trans_scalarizing_loops): Skip clearing if a * trans-array.c (gfc_trans_scalarizing_loops): Skip clearing if a
parent exists. parent exists.
......
...@@ -688,41 +688,54 @@ void ...@@ -688,41 +688,54 @@ void
gfc_set_loop_bounds_from_array_spec (gfc_interface_mapping * mapping, gfc_set_loop_bounds_from_array_spec (gfc_interface_mapping * mapping,
gfc_se * se, gfc_array_spec * as) gfc_se * se, gfc_array_spec * as)
{ {
int n, dim; int n, dim, total_dim;
gfc_se tmpse; gfc_se tmpse;
gfc_ss *ss;
tree lower; tree lower;
tree upper; tree upper;
tree tmp; tree tmp;
if (as && as->type == AS_EXPLICIT) total_dim = 0;
for (n = 0; n < se->loop->dimen; n++)
{ if (!as || as->type != AS_EXPLICIT)
dim = se->ss->dim[n]; return;
gcc_assert (dim < as->rank);
gcc_assert (se->loop->dimen == as->rank); for (ss = se->ss; ss; ss = ss->parent)
if (se->loop->to[n] == NULL_TREE) {
{ total_dim += ss->loop->dimen;
/* Evaluate the lower bound. */ for (n = 0; n < ss->loop->dimen; n++)
gfc_init_se (&tmpse, NULL); {
gfc_apply_interface_mapping (mapping, &tmpse, as->lower[dim]); /* The bound is known, nothing to do. */
gfc_add_block_to_block (&se->pre, &tmpse.pre); if (ss->loop->to[n] != NULL_TREE)
gfc_add_block_to_block (&se->post, &tmpse.post); continue;
lower = fold_convert (gfc_array_index_type, tmpse.expr);
dim = ss->dim[n];
/* ...and the upper bound. */ gcc_assert (dim < as->rank);
gfc_init_se (&tmpse, NULL); gcc_assert (ss->loop->dimen <= as->rank);
gfc_apply_interface_mapping (mapping, &tmpse, as->upper[dim]);
gfc_add_block_to_block (&se->pre, &tmpse.pre); /* Evaluate the lower bound. */
gfc_add_block_to_block (&se->post, &tmpse.post); gfc_init_se (&tmpse, NULL);
upper = fold_convert (gfc_array_index_type, tmpse.expr); gfc_apply_interface_mapping (mapping, &tmpse, as->lower[dim]);
gfc_add_block_to_block (&se->pre, &tmpse.pre);
/* Set the upper bound of the loop to UPPER - LOWER. */ gfc_add_block_to_block (&se->post, &tmpse.post);
tmp = fold_build2_loc (input_location, MINUS_EXPR, lower = fold_convert (gfc_array_index_type, tmpse.expr);
gfc_array_index_type, upper, lower);
tmp = gfc_evaluate_now (tmp, &se->pre); /* ...and the upper bound. */
se->loop->to[n] = tmp; gfc_init_se (&tmpse, NULL);
} gfc_apply_interface_mapping (mapping, &tmpse, as->upper[dim]);
} gfc_add_block_to_block (&se->pre, &tmpse.pre);
gfc_add_block_to_block (&se->post, &tmpse.post);
upper = fold_convert (gfc_array_index_type, tmpse.expr);
/* Set the upper bound of the loop to UPPER - LOWER. */
tmp = fold_build2_loc (input_location, MINUS_EXPR,
gfc_array_index_type, upper, lower);
tmp = gfc_evaluate_now (tmp, &se->pre);
ss->loop->to[n] = tmp;
}
}
gcc_assert (total_dim == as->rank);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment