Commit 08dcec61 by Mikael Morin

trans.h (struct gfc_ss, [...]): Move shape field from the former struct to the latter.

	* trans.h (struct gfc_ss, struct gfc_array_info): Move shape field
	from the former struct to the latter.
	* trans-array.c (gfc_conv_ss_startstride, gfc_conv_loop_setup):
	Update field references.
	* trans-expr.c (gfc_trans_subarray_assign): Update field references
	and factor common reference chains.
	* trans-io.c (transfer_array_component): Ditto.

From-SVN: r180866
parent cb4b9eae
2011-11-03 Mikael Morin <mikael@gcc.gnu.org> 2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
* trans.h (struct gfc_ss, struct gfc_array_info): Move shape field
from the former struct to the latter.
* trans-array.c (gfc_conv_ss_startstride, gfc_conv_loop_setup):
Update field references.
* trans-expr.c (gfc_trans_subarray_assign): Update field references
and factor common reference chains.
* trans-io.c (transfer_array_component): Ditto.
2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
* trans.h (struct gfc_array_info): Move dim and dimen fields... * trans.h (struct gfc_array_info): Move dim and dimen fields...
(struct gfc_ss): ... here. Remove gfc_ss::data::temp::dimen field. (struct gfc_ss): ... here. Remove gfc_ss::data::temp::dimen field.
* trans-array.c (gfc_conv_loop_setup): Remove temp_ss dim array * trans-array.c (gfc_conv_loop_setup): Remove temp_ss dim array
......
...@@ -3302,8 +3302,12 @@ done: ...@@ -3302,8 +3302,12 @@ done:
/* Loop over all the SS in the chain. */ /* Loop over all the SS in the chain. */
for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain) for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain)
{ {
if (ss->expr && ss->expr->shape && !ss->shape) gfc_array_info *info;
ss->shape = ss->expr->shape;
info = &ss->data.info;
if (ss->expr && ss->expr->shape && !info->shape)
info->shape = ss->expr->shape;
switch (ss->type) switch (ss->type)
{ {
...@@ -3891,12 +3895,12 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where) ...@@ -3891,12 +3895,12 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where)
spec_dim = 0; spec_dim = 0;
} }
if (ss->shape) if (info->shape)
{ {
gcc_assert (ss->shape[dim]); gcc_assert (info->shape[dim]);
/* The frontend has worked out the size for us. */ /* The frontend has worked out the size for us. */
if (!loopspec[n] if (!loopspec[n]
|| !loopspec[n]->shape || !specinfo->shape
|| !integer_zerop (specinfo->start[spec_dim])) || !integer_zerop (specinfo->start[spec_dim]))
/* Prefer zero-based descriptors if possible. */ /* Prefer zero-based descriptors if possible. */
loopspec[n] = ss; loopspec[n] = ss;
...@@ -3973,7 +3977,7 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where) ...@@ -3973,7 +3977,7 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where)
dim = loopspec[n]->dim[n]; dim = loopspec[n]->dim[n];
/* Set the extents of this range. */ /* Set the extents of this range. */
cshape = loopspec[n]->shape; cshape = info->shape;
if (cshape && INTEGER_CST_P (info->start[dim]) if (cshape && INTEGER_CST_P (info->start[dim])
&& INTEGER_CST_P (info->stride[dim])) && INTEGER_CST_P (info->stride[dim]))
{ {
......
...@@ -4344,6 +4344,7 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr) ...@@ -4344,6 +4344,7 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
gfc_se lse; gfc_se lse;
gfc_ss *rss; gfc_ss *rss;
gfc_ss *lss; gfc_ss *lss;
gfc_array_info *lss_array;
stmtblock_t body; stmtblock_t body;
stmtblock_t block; stmtblock_t block;
gfc_loopinfo loop; gfc_loopinfo loop;
...@@ -4367,19 +4368,20 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr) ...@@ -4367,19 +4368,20 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
/* Create a SS for the destination. */ /* Create a SS for the destination. */
lss = gfc_get_array_ss (gfc_ss_terminator, NULL, cm->as->rank, lss = gfc_get_array_ss (gfc_ss_terminator, NULL, cm->as->rank,
GFC_SS_COMPONENT); GFC_SS_COMPONENT);
lss->shape = gfc_get_shape (cm->as->rank); lss_array = &lss->data.info;
lss->data.info.descriptor = dest; lss_array->shape = gfc_get_shape (cm->as->rank);
lss->data.info.data = gfc_conv_array_data (dest); lss_array->descriptor = dest;
lss->data.info.offset = gfc_conv_array_offset (dest); lss_array->data = gfc_conv_array_data (dest);
lss_array->offset = gfc_conv_array_offset (dest);
for (n = 0; n < cm->as->rank; n++) for (n = 0; n < cm->as->rank; n++)
{ {
lss->data.info.start[n] = gfc_conv_array_lbound (dest, n); lss_array->start[n] = gfc_conv_array_lbound (dest, n);
lss->data.info.stride[n] = gfc_index_one_node; lss_array->stride[n] = gfc_index_one_node;
mpz_init (lss->shape[n]); mpz_init (lss_array->shape[n]);
mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer, mpz_sub (lss_array->shape[n], cm->as->upper[n]->value.integer,
cm->as->lower[n]->value.integer); cm->as->lower[n]->value.integer);
mpz_add_ui (lss->shape[n], lss->shape[n], 1); mpz_add_ui (lss_array->shape[n], lss_array->shape[n], 1);
} }
/* Associate the SS with the loop. */ /* Associate the SS with the loop. */
...@@ -4422,8 +4424,8 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr) ...@@ -4422,8 +4424,8 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
gfc_add_block_to_block (&block, &loop.pre); gfc_add_block_to_block (&block, &loop.pre);
gfc_add_block_to_block (&block, &loop.post); gfc_add_block_to_block (&block, &loop.post);
gcc_assert (lss->shape != NULL); gcc_assert (lss_array->shape != NULL);
gfc_free_shape (&lss->shape, cm->as->rank); gfc_free_shape (&lss_array->shape, cm->as->rank);
gfc_cleanup_loop (&loop); gfc_cleanup_loop (&loop);
return gfc_finish_block (&block); return gfc_finish_block (&block);
......
...@@ -1937,6 +1937,7 @@ transfer_array_component (tree expr, gfc_component * cm, locus * where) ...@@ -1937,6 +1937,7 @@ transfer_array_component (tree expr, gfc_component * cm, locus * where)
int n; int n;
gfc_ss *ss; gfc_ss *ss;
gfc_se se; gfc_se se;
gfc_array_info *ss_array;
gfc_start_block (&block); gfc_start_block (&block);
gfc_init_se (&se, NULL); gfc_init_se (&se, NULL);
...@@ -1948,19 +1949,20 @@ transfer_array_component (tree expr, gfc_component * cm, locus * where) ...@@ -1948,19 +1949,20 @@ transfer_array_component (tree expr, gfc_component * cm, locus * where)
ss = gfc_get_array_ss (gfc_ss_terminator, NULL, cm->as->rank, ss = gfc_get_array_ss (gfc_ss_terminator, NULL, cm->as->rank,
GFC_SS_COMPONENT); GFC_SS_COMPONENT);
ss->shape = gfc_get_shape (cm->as->rank); ss_array = &ss->data.info;
ss->data.info.descriptor = expr; ss_array->shape = gfc_get_shape (cm->as->rank);
ss->data.info.data = gfc_conv_array_data (expr); ss_array->descriptor = expr;
ss->data.info.offset = gfc_conv_array_offset (expr); ss_array->data = gfc_conv_array_data (expr);
ss_array->offset = gfc_conv_array_offset (expr);
for (n = 0; n < cm->as->rank; n++) for (n = 0; n < cm->as->rank; n++)
{ {
ss->data.info.start[n] = gfc_conv_array_lbound (expr, n); ss_array->start[n] = gfc_conv_array_lbound (expr, n);
ss->data.info.stride[n] = gfc_index_one_node; ss_array->stride[n] = gfc_index_one_node;
mpz_init (ss->shape[n]); mpz_init (ss_array->shape[n]);
mpz_sub (ss->shape[n], cm->as->upper[n]->value.integer, mpz_sub (ss_array->shape[n], cm->as->upper[n]->value.integer,
cm->as->lower[n]->value.integer); cm->as->lower[n]->value.integer);
mpz_add_ui (ss->shape[n], ss->shape[n], 1); mpz_add_ui (ss_array->shape[n], ss_array->shape[n], 1);
} }
/* Once we got ss, we use scalarizer to create the loop. */ /* Once we got ss, we use scalarizer to create the loop. */
...@@ -1995,8 +1997,8 @@ transfer_array_component (tree expr, gfc_component * cm, locus * where) ...@@ -1995,8 +1997,8 @@ transfer_array_component (tree expr, gfc_component * cm, locus * where)
gfc_add_block_to_block (&block, &loop.pre); gfc_add_block_to_block (&block, &loop.pre);
gfc_add_block_to_block (&block, &loop.post); gfc_add_block_to_block (&block, &loop.post);
gcc_assert (ss->shape != NULL); gcc_assert (ss_array->shape != NULL);
gfc_free_shape (&ss->shape, cm->as->rank); gfc_free_shape (&ss_array->shape, cm->as->rank);
gfc_cleanup_loop (&loop); gfc_cleanup_loop (&loop);
return gfc_finish_block (&block); return gfc_finish_block (&block);
......
...@@ -113,6 +113,8 @@ gfc_coarray_type; ...@@ -113,6 +113,8 @@ gfc_coarray_type;
typedef struct gfc_array_info typedef struct gfc_array_info
{ {
mpz_t *shape;
/* The ref that holds information on this section. */ /* The ref that holds information on this section. */
gfc_ref *ref; gfc_ref *ref;
/* The descriptor of this array. */ /* The descriptor of this array. */
...@@ -193,7 +195,6 @@ typedef struct gfc_ss ...@@ -193,7 +195,6 @@ typedef struct gfc_ss
{ {
gfc_ss_type type; gfc_ss_type type;
gfc_expr *expr; gfc_expr *expr;
mpz_t *shape;
tree string_length; tree string_length;
union union
{ {
......
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