trans-array.c (constant_array_constructor_loop_size): Handle multiple loops.

* trans-array.c (constant_array_constructor_loop_size):
	Handle multiple loops.

From-SVN: r180901
This commit is contained in:
Mikael Morin 2011-11-03 23:51:04 +00:00
parent b2f82aaa78
commit f03077b019
2 changed files with 29 additions and 18 deletions

View File

@ -1,3 +1,8 @@
2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
* trans-array.c (constant_array_constructor_loop_size):
Handle multiple loops.
2011-11-03 Mikael Morin <mikael@gcc.gnu.org> 2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
* trans-array.c (get_rank, get_loop_upper_bound_for_array): * trans-array.c (get_rank, get_loop_upper_bound_for_array):

View File

@ -2053,32 +2053,38 @@ get_rank (gfc_loopinfo *loop)
iteration count of the loop if suitable, and NULL_TREE otherwise. */ iteration count of the loop if suitable, and NULL_TREE otherwise. */
static tree static tree
constant_array_constructor_loop_size (gfc_loopinfo * loop) constant_array_constructor_loop_size (gfc_loopinfo * l)
{ {
gfc_loopinfo *loop;
tree size = gfc_index_one_node; tree size = gfc_index_one_node;
tree tmp; tree tmp;
int i; int i, total_dim;
for (i = 0; i < loop->dimen; i++) total_dim = get_rank (l);
for (loop = l; loop; loop = loop->parent)
{ {
/* If the bounds aren't constant, return NULL_TREE. */ for (i = 0; i < loop->dimen; i++)
if (!INTEGER_CST_P (loop->from[i]) || !INTEGER_CST_P (loop->to[i]))
return NULL_TREE;
if (!integer_zerop (loop->from[i]))
{ {
/* Only allow nonzero "from" in one-dimensional arrays. */ /* If the bounds aren't constant, return NULL_TREE. */
if (loop->dimen != 1) if (!INTEGER_CST_P (loop->from[i]) || !INTEGER_CST_P (loop->to[i]))
return NULL_TREE; return NULL_TREE;
tmp = fold_build2_loc (input_location, MINUS_EXPR, if (!integer_zerop (loop->from[i]))
gfc_array_index_type, {
loop->to[i], loop->from[i]); /* Only allow nonzero "from" in one-dimensional arrays. */
if (total_dim != 1)
return NULL_TREE;
tmp = fold_build2_loc (input_location, MINUS_EXPR,
gfc_array_index_type,
loop->to[i], loop->from[i]);
}
else
tmp = loop->to[i];
tmp = fold_build2_loc (input_location, PLUS_EXPR,
gfc_array_index_type, tmp, gfc_index_one_node);
size = fold_build2_loc (input_location, MULT_EXPR,
gfc_array_index_type, size, tmp);
} }
else
tmp = loop->to[i];
tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
tmp, gfc_index_one_node);
size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
size, tmp);
} }
return size; return size;