Commit cb4b9eae by Mikael Morin

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.
	* trans-array.c (gfc_conv_loop_setup): Remove temp_ss dim array
	initialization.
	(gfc_get_temp_ss): Initialize dim and dimen.
	(gfc_free_ss, gfc_get_array_ss, gfc_get_temp_ss,
	gfc_set_loop_bounds_from_array_spec, get_array_ref_dim,
	gfc_trans_create_temp_array, gfc_trans_constant_array_constructor,
	gfc_set_vector_loop_bounds, gfc_conv_scalarized_array_ref,
	gfc_trans_preloop_setup, gfc_conv_ss_startstride,
	gfc_conv_resolve_dependencies, gfc_conv_loop_setup, transposed_dims,
	gfc_conv_expr_descriptor, gfc_alloc_allocatable_for_assignment,
	gfc_walk_array_ref): Update field references.
	* trans-expr.c (gfc_conv_subref_array_arg, gfc_conv_procedure_call):
	Ditto.
	* trans-intrinsic.c (walk_inline_intrinsic_transpose): Ditto.
	* trans-stmt.c (gfc_conv_elemental_dependencies): Ditto.

From-SVN: r180865
parent 6d63e468
2011-11-03 Mikael Morin <mikael@gcc.gnu.org> 2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
* trans.h (struct gfc_array_info): Move dim and dimen fields...
(struct gfc_ss): ... here. Remove gfc_ss::data::temp::dimen field.
* trans-array.c (gfc_conv_loop_setup): Remove temp_ss dim array
initialization.
(gfc_get_temp_ss): Initialize dim and dimen.
(gfc_free_ss, gfc_get_array_ss, gfc_get_temp_ss,
gfc_set_loop_bounds_from_array_spec, get_array_ref_dim,
gfc_trans_create_temp_array, gfc_trans_constant_array_constructor,
gfc_set_vector_loop_bounds, gfc_conv_scalarized_array_ref,
gfc_trans_preloop_setup, gfc_conv_ss_startstride,
gfc_conv_resolve_dependencies, gfc_conv_loop_setup, transposed_dims,
gfc_conv_expr_descriptor, gfc_alloc_allocatable_for_assignment,
gfc_walk_array_ref): Update field references.
* trans-expr.c (gfc_conv_subref_array_arg, gfc_conv_procedure_call):
Ditto.
* trans-intrinsic.c (walk_inline_intrinsic_transpose): Ditto.
* trans-stmt.c (gfc_conv_elemental_dependencies): Ditto.
2011-11-03 Mikael Morin <mikael@gcc.gnu.org>
* trans.h (struct gfc_ss_info, struct gfc_array_info): * trans.h (struct gfc_ss_info, struct gfc_array_info):
Rename the former to the latter. Rename the former to the latter.
* trans-array.c (gfc_get_array_ss, gfc_trans_allocate_array_storage, * trans-array.c (gfc_get_array_ss, gfc_trans_allocate_array_storage,
......
...@@ -496,10 +496,10 @@ gfc_free_ss (gfc_ss * ss) ...@@ -496,10 +496,10 @@ gfc_free_ss (gfc_ss * ss)
switch (ss->type) switch (ss->type)
{ {
case GFC_SS_SECTION: case GFC_SS_SECTION:
for (n = 0; n < ss->data.info.dimen; n++) for (n = 0; n < ss->dimen; n++)
{ {
if (ss->data.info.subscript[ss->data.info.dim[n]]) if (ss->data.info.subscript[ss->dim[n]])
gfc_free_ss_chain (ss->data.info.subscript[ss->data.info.dim[n]]); gfc_free_ss_chain (ss->data.info.subscript[ss->dim[n]]);
} }
break; break;
...@@ -517,17 +517,15 @@ gfc_ss * ...@@ -517,17 +517,15 @@ gfc_ss *
gfc_get_array_ss (gfc_ss *next, gfc_expr *expr, int dimen, gfc_ss_type type) gfc_get_array_ss (gfc_ss *next, gfc_expr *expr, int dimen, gfc_ss_type type)
{ {
gfc_ss *ss; gfc_ss *ss;
gfc_array_info *info;
int i; int i;
ss = gfc_get_ss (); ss = gfc_get_ss ();
ss->next = next; ss->next = next;
ss->type = type; ss->type = type;
ss->expr = expr; ss->expr = expr;
info = &ss->data.info; ss->dimen = dimen;
info->dimen = dimen; for (i = 0; i < ss->dimen; i++)
for (i = 0; i < info->dimen; i++) ss->dim[i] = i;
info->dim[i] = i;
return ss; return ss;
} }
...@@ -539,13 +537,16 @@ gfc_ss * ...@@ -539,13 +537,16 @@ gfc_ss *
gfc_get_temp_ss (tree type, tree string_length, int dimen) gfc_get_temp_ss (tree type, tree string_length, int dimen)
{ {
gfc_ss *ss; gfc_ss *ss;
int i;
ss = gfc_get_ss (); ss = gfc_get_ss ();
ss->next = gfc_ss_terminator; ss->next = gfc_ss_terminator;
ss->type = GFC_SS_TEMP; ss->type = GFC_SS_TEMP;
ss->string_length = string_length; ss->string_length = string_length;
ss->data.temp.dimen = dimen;
ss->data.temp.type = type; ss->data.temp.type = type;
ss->dimen = dimen;
for (i = 0; i < ss->dimen; i++)
ss->dim[i] = i;
return ss; return ss;
} }
...@@ -642,7 +643,7 @@ gfc_set_loop_bounds_from_array_spec (gfc_interface_mapping * mapping, ...@@ -642,7 +643,7 @@ gfc_set_loop_bounds_from_array_spec (gfc_interface_mapping * mapping,
if (as && as->type == AS_EXPLICIT) if (as && as->type == AS_EXPLICIT)
for (n = 0; n < se->loop->dimen; n++) for (n = 0; n < se->loop->dimen; n++)
{ {
dim = se->ss->data.info.dim[n]; dim = se->ss->dim[n];
gcc_assert (dim < as->rank); gcc_assert (dim < as->rank);
gcc_assert (se->loop->dimen == as->rank); gcc_assert (se->loop->dimen == as->rank);
if (se->loop->to[n] == NULL_TREE) if (se->loop->to[n] == NULL_TREE)
...@@ -810,15 +811,12 @@ static int ...@@ -810,15 +811,12 @@ static int
get_array_ref_dim (gfc_ss *ss, int loop_dim) get_array_ref_dim (gfc_ss *ss, int loop_dim)
{ {
int n, array_dim, array_ref_dim; int n, array_dim, array_ref_dim;
gfc_array_info *info;
info = &ss->data.info;
array_ref_dim = 0; array_ref_dim = 0;
array_dim = info->dim[loop_dim]; array_dim = ss->dim[loop_dim];
for (n = 0; n < info->dimen; n++) for (n = 0; n < ss->dimen; n++)
if (info->dim[n] < array_dim) if (ss->dim[n] < array_dim)
array_ref_dim++; array_ref_dim++;
return array_ref_dim; return array_ref_dim;
...@@ -861,8 +859,8 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, ...@@ -861,8 +859,8 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post,
info = &ss->data.info; info = &ss->data.info;
gcc_assert (info->dimen > 0); gcc_assert (ss->dimen > 0);
gcc_assert (loop->dimen == info->dimen); gcc_assert (loop->dimen == ss->dimen);
if (gfc_option.warn_array_temp && where) if (gfc_option.warn_array_temp && where)
gfc_warning ("Creating array temporary at %L", where); gfc_warning ("Creating array temporary at %L", where);
...@@ -870,7 +868,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, ...@@ -870,7 +868,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post,
/* Set the lower bound to zero. */ /* Set the lower bound to zero. */
for (n = 0; n < loop->dimen; n++) for (n = 0; n < loop->dimen; n++)
{ {
dim = info->dim[n]; dim = ss->dim[n];
/* Callee allocated arrays may not have a known bound yet. */ /* Callee allocated arrays may not have a known bound yet. */
if (loop->to[n]) if (loop->to[n])
...@@ -899,7 +897,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, ...@@ -899,7 +897,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post,
/* Initialize the descriptor. */ /* Initialize the descriptor. */
type = type =
gfc_get_array_type_bounds (eltype, info->dimen, 0, from, to, 1, gfc_get_array_type_bounds (eltype, ss->dimen, 0, from, to, 1,
GFC_ARRAY_UNKNOWN, true); GFC_ARRAY_UNKNOWN, true);
desc = gfc_create_var (type, "atmp"); desc = gfc_create_var (type, "atmp");
GFC_DECL_PACKED_ARRAY (desc) = 1; GFC_DECL_PACKED_ARRAY (desc) = 1;
...@@ -937,7 +935,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, ...@@ -937,7 +935,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post,
for (n = 0; n < loop->dimen; n++) for (n = 0; n < loop->dimen; n++)
{ {
dim = info->dim[n]; dim = ss->dim[n];
if (size == NULL_TREE) if (size == NULL_TREE)
{ {
...@@ -1003,8 +1001,8 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, ...@@ -1003,8 +1001,8 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post,
gfc_trans_allocate_array_storage (pre, post, info, size, nelem, initial, gfc_trans_allocate_array_storage (pre, post, info, size, nelem, initial,
dynamic, dealloc); dynamic, dealloc);
if (info->dimen > loop->temp_dim) if (ss->dimen > loop->temp_dim)
loop->temp_dim = info->dimen; loop->temp_dim = ss->dimen;
return size; return size;
} }
...@@ -1869,7 +1867,7 @@ trans_constant_array_constructor (gfc_ss * ss, tree type) ...@@ -1869,7 +1867,7 @@ trans_constant_array_constructor (gfc_ss * ss, tree type)
info->data = gfc_build_addr_expr (NULL_TREE, tmp); info->data = gfc_build_addr_expr (NULL_TREE, tmp);
info->offset = gfc_index_zero_node; info->offset = gfc_index_zero_node;
for (i = 0; i < info->dimen; i++) for (i = 0; i < ss->dimen; i++)
{ {
info->delta[i] = gfc_index_zero_node; info->delta[i] = gfc_index_zero_node;
info->start[i] = gfc_index_zero_node; info->start[i] = gfc_index_zero_node;
...@@ -1950,7 +1948,7 @@ gfc_trans_array_constructor (gfc_loopinfo * loop, gfc_ss * ss, locus * where) ...@@ -1950,7 +1948,7 @@ gfc_trans_array_constructor (gfc_loopinfo * loop, gfc_ss * ss, locus * where)
first_len = true; first_len = true;
} }
gcc_assert (ss->data.info.dimen == loop->dimen); gcc_assert (ss->dimen == loop->dimen);
c = ss->expr->value.constructor; c = ss->expr->value.constructor;
if (ss->expr->ts.type == BT_CHARACTER) if (ss->expr->ts.type == BT_CHARACTER)
...@@ -2111,7 +2109,7 @@ set_vector_loop_bounds (gfc_loopinfo * loop, gfc_ss * ss) ...@@ -2111,7 +2109,7 @@ set_vector_loop_bounds (gfc_loopinfo * loop, gfc_ss * ss)
for (n = 0; n < loop->dimen; n++) for (n = 0; n < loop->dimen; n++)
{ {
dim = info->dim[n]; dim = ss->dim[n];
if (info->ref->u.ar.dimen_type[dim] == DIMEN_VECTOR if (info->ref->u.ar.dimen_type[dim] == DIMEN_VECTOR
&& loop->to[n] == NULL) && loop->to[n] == NULL)
{ {
...@@ -2633,16 +2631,17 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar) ...@@ -2633,16 +2631,17 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar)
tree decl = NULL_TREE; tree decl = NULL_TREE;
tree index; tree index;
tree tmp; tree tmp;
gfc_ss *ss;
int n; int n;
info = &se->ss->data.info; ss = se->ss;
info = &ss->data.info;
if (ar) if (ar)
n = se->loop->order[0]; n = se->loop->order[0];
else else
n = 0; n = 0;
index = conv_array_index_offset (se, se->ss, info->dim[n], n, ar, index = conv_array_index_offset (se, ss, ss->dim[n], n, ar, info->stride0);
info->stride0);
/* Add the offset for this dimension to the stored offset for all other /* Add the offset for this dimension to the stored offset for all other
dimensions. */ dimensions. */
if (!integer_zerop (info->offset)) if (!integer_zerop (info->offset))
...@@ -2873,8 +2872,8 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, ...@@ -2873,8 +2872,8 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag,
info = &ss->data.info; info = &ss->data.info;
gcc_assert (dim < info->dimen); gcc_assert (dim < ss->dimen);
gcc_assert (info->dimen == loop->dimen); gcc_assert (ss->dimen == loop->dimen);
if (info->ref) if (info->ref)
ar = &info->ref->u.ar; ar = &info->ref->u.ar;
...@@ -2892,7 +2891,7 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, ...@@ -2892,7 +2891,7 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag,
if (dim == loop->dimen - 1) if (dim == loop->dimen - 1)
{ {
stride = gfc_conv_array_stride (info->descriptor, info->dim[i]); stride = gfc_conv_array_stride (info->descriptor, ss->dim[i]);
/* Calculate the stride of the innermost loop. Hopefully this will /* Calculate the stride of the innermost loop. Hopefully this will
allow the backend optimizers to do their stuff more effectively. allow the backend optimizers to do their stuff more effectively.
...@@ -2915,7 +2914,7 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, ...@@ -2915,7 +2914,7 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag,
} }
else else
/* Add the offset for the previous loop dimension. */ /* Add the offset for the previous loop dimension. */
add_array_offset (pblock, loop, ss, ar, info->dim[i], i); add_array_offset (pblock, loop, ss, ar, ss->dim[i], i);
/* Remember this offset for the second loop. */ /* Remember this offset for the second loop. */
if (dim == loop->temp_dim - 1) if (dim == loop->temp_dim - 1)
...@@ -3271,7 +3270,7 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop) ...@@ -3271,7 +3270,7 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop)
case GFC_SS_CONSTRUCTOR: case GFC_SS_CONSTRUCTOR:
case GFC_SS_FUNCTION: case GFC_SS_FUNCTION:
case GFC_SS_COMPONENT: case GFC_SS_COMPONENT:
loop->dimen = ss->data.info.dimen; loop->dimen = ss->dimen;
goto done; goto done;
/* As usual, lbound and ubound are exceptions!. */ /* As usual, lbound and ubound are exceptions!. */
...@@ -3283,7 +3282,7 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop) ...@@ -3283,7 +3282,7 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop)
case GFC_ISYM_LCOBOUND: case GFC_ISYM_LCOBOUND:
case GFC_ISYM_UCOBOUND: case GFC_ISYM_UCOBOUND:
case GFC_ISYM_THIS_IMAGE: case GFC_ISYM_THIS_IMAGE:
loop->dimen = ss->data.info.dimen; loop->dimen = ss->dimen;
goto done; goto done;
default: default:
...@@ -3312,8 +3311,8 @@ done: ...@@ -3312,8 +3311,8 @@ done:
/* Get the descriptor for the array. */ /* Get the descriptor for the array. */
gfc_conv_ss_descriptor (&loop->pre, ss, !loop->array_parameter); gfc_conv_ss_descriptor (&loop->pre, ss, !loop->array_parameter);
for (n = 0; n < ss->data.info.dimen; n++) for (n = 0; n < ss->dimen; n++)
gfc_conv_section_startstride (loop, ss, ss->data.info.dim[n]); gfc_conv_section_startstride (loop, ss, ss->dim[n]);
break; break;
case GFC_SS_INTRINSIC: case GFC_SS_INTRINSIC:
...@@ -3333,9 +3332,9 @@ done: ...@@ -3333,9 +3332,9 @@ done:
case GFC_SS_CONSTRUCTOR: case GFC_SS_CONSTRUCTOR:
case GFC_SS_FUNCTION: case GFC_SS_FUNCTION:
for (n = 0; n < ss->data.info.dimen; n++) for (n = 0; n < ss->dimen; n++)
{ {
int dim = ss->data.info.dim[n]; int dim = ss->dim[n];
ss->data.info.start[dim] = gfc_index_zero_node; ss->data.info.start[dim] = gfc_index_zero_node;
ss->data.info.end[dim] = gfc_index_zero_node; ss->data.info.end[dim] = gfc_index_zero_node;
...@@ -3387,7 +3386,7 @@ done: ...@@ -3387,7 +3386,7 @@ done:
{ {
bool check_upper; bool check_upper;
dim = info->dim[n]; dim = ss->dim[n];
if (info->ref->u.ar.dimen_type[dim] != DIMEN_RANGE) if (info->ref->u.ar.dimen_type[dim] != DIMEN_RANGE)
continue; continue;
...@@ -3776,10 +3775,10 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop, gfc_ss * dest, ...@@ -3776,10 +3775,10 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop, gfc_ss * dest,
if (nDepend == 1) if (nDepend == 1)
break; break;
for (i = 0; i < dest->data.info.dimen; i++) for (i = 0; i < dest->dimen; i++)
for (j = 0; j < ss->data.info.dimen; j++) for (j = 0; j < ss->dimen; j++)
if (i != j if (i != j
&& dest->data.info.dim[i] == ss->data.info.dim[j]) && dest->dim[i] == ss->dim[j])
{ {
/* If we don't access array elements in the same order, /* If we don't access array elements in the same order,
there is a dependency. */ there is a dependency. */
...@@ -3853,7 +3852,7 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where) ...@@ -3853,7 +3852,7 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where)
int n, dim, spec_dim; int n, dim, spec_dim;
gfc_array_info *info; gfc_array_info *info;
gfc_array_info *specinfo; gfc_array_info *specinfo;
gfc_ss *ss; gfc_ss *ss, *tmp_ss;
tree tmp; tree tmp;
gfc_ss *loopspec[GFC_MAX_DIMENSIONS]; gfc_ss *loopspec[GFC_MAX_DIMENSIONS];
bool dynamic[GFC_MAX_DIMENSIONS]; bool dynamic[GFC_MAX_DIMENSIONS];
...@@ -3878,12 +3877,12 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where) ...@@ -3878,12 +3877,12 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where)
continue; continue;
info = &ss->data.info; info = &ss->data.info;
dim = info->dim[n]; dim = ss->dim[n];
if (loopspec[n] != NULL) if (loopspec[n] != NULL)
{ {
specinfo = &loopspec[n]->data.info; specinfo = &loopspec[n]->data.info;
spec_dim = specinfo->dim[n]; spec_dim = loopspec[n]->dim[n];
} }
else else
{ {
...@@ -3971,7 +3970,7 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where) ...@@ -3971,7 +3970,7 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where)
gcc_assert (loopspec[n]); gcc_assert (loopspec[n]);
info = &loopspec[n]->data.info; info = &loopspec[n]->data.info;
dim = info->dim[n]; dim = loopspec[n]->dim[n];
/* Set the extents of this range. */ /* Set the extents of this range. */
cshape = loopspec[n]->shape; cshape = loopspec[n]->shape;
...@@ -4047,8 +4046,9 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where) ...@@ -4047,8 +4046,9 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where)
allocating the temporary. */ allocating the temporary. */
gfc_add_loop_ss_code (loop, loop->ss, false, where); gfc_add_loop_ss_code (loop, loop->ss, false, where);
tmp_ss = loop->temp_ss;
/* If we want a temporary then create it. */ /* If we want a temporary then create it. */
if (loop->temp_ss != NULL) if (tmp_ss != NULL)
{ {
gcc_assert (loop->temp_ss->type == GFC_SS_TEMP); gcc_assert (loop->temp_ss->type == GFC_SS_TEMP);
...@@ -4060,17 +4060,13 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where) ...@@ -4060,17 +4060,13 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where)
loop->temp_ss->string_length); loop->temp_ss->string_length);
tmp = loop->temp_ss->data.temp.type; tmp = loop->temp_ss->data.temp.type;
n = loop->temp_ss->data.temp.dimen;
memset (&loop->temp_ss->data.info, 0, sizeof (gfc_array_info)); memset (&loop->temp_ss->data.info, 0, sizeof (gfc_array_info));
loop->temp_ss->type = GFC_SS_SECTION; loop->temp_ss->type = GFC_SS_SECTION;
loop->temp_ss->data.info.dimen = n;
gcc_assert (loop->temp_ss->data.info.dimen != 0); gcc_assert (tmp_ss->dimen != 0);
for (n = 0; n < loop->temp_ss->data.info.dimen; n++)
loop->temp_ss->data.info.dim[n] = n;
gfc_trans_create_temp_array (&loop->pre, &loop->post, loop, gfc_trans_create_temp_array (&loop->pre, &loop->post, loop,
loop->temp_ss, tmp, NULL_TREE, tmp_ss, tmp, NULL_TREE,
false, true, false, where); false, true, false, where);
} }
...@@ -4094,12 +4090,12 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where) ...@@ -4094,12 +4090,12 @@ gfc_conv_loop_setup (gfc_loopinfo * loop, locus * where)
info = &ss->data.info; info = &ss->data.info;
for (n = 0; n < info->dimen; n++) for (n = 0; n < ss->dimen; n++)
{ {
/* If we are specifying the range the delta is already set. */ /* If we are specifying the range the delta is already set. */
if (loopspec[n] != ss) if (loopspec[n] != ss)
{ {
dim = ss->data.info.dim[n]; dim = ss->dim[n];
/* Calculate the offset relative to the loop variable. /* Calculate the offset relative to the loop variable.
First multiply by the stride. */ First multiply by the stride. */
...@@ -5657,16 +5653,15 @@ get_array_charlen (gfc_expr *expr, gfc_se *se) ...@@ -5657,16 +5653,15 @@ get_array_charlen (gfc_expr *expr, gfc_se *se)
} }
} }
/* Helper function to check dimensions. */ /* Helper function to check dimensions. */
static bool static bool
transposed_dims (gfc_ss *ss) transposed_dims (gfc_ss *ss)
{ {
gfc_array_info *info;
int n; int n;
info = &ss->data.info; for (n = 0; n < ss->dimen; n++)
for (n = 0; n < info->dimen; n++) if (ss->dim[n] != n)
if (info->dim[n] != n)
return true; return true;
return false; return false;
} }
...@@ -5899,7 +5894,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) ...@@ -5899,7 +5894,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
loop.dimen); loop.dimen);
se->string_length = loop.temp_ss->string_length; se->string_length = loop.temp_ss->string_length;
gcc_assert (loop.temp_ss->data.temp.dimen == loop.dimen); gcc_assert (loop.temp_ss->dimen == loop.dimen);
gfc_add_ss_to_loop (&loop, loop.temp_ss); gfc_add_ss_to_loop (&loop, loop.temp_ss);
} }
...@@ -5972,7 +5967,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) ...@@ -5972,7 +5967,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
tree to; tree to;
tree base; tree base;
ndim = info->ref ? info->ref->u.ar.dimen : info->dimen; ndim = info->ref ? info->ref->u.ar.dimen : ss->dimen;
if (se->want_coarray) if (se->want_coarray)
{ {
...@@ -6087,7 +6082,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) ...@@ -6087,7 +6082,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
/* look for the corresponding scalarizer dimension: dim. */ /* look for the corresponding scalarizer dimension: dim. */
for (dim = 0; dim < ndim; dim++) for (dim = 0; dim < ndim; dim++)
if (info->dim[dim] == n) if (ss->dim[dim] == n)
break; break;
/* loop exited early: the DIM being looked for has been found. */ /* loop exited early: the DIM being looked for has been found. */
...@@ -7376,7 +7371,7 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop, ...@@ -7376,7 +7371,7 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
for (n = 0; n < expr1->rank; n++) for (n = 0; n < expr1->rank; n++)
{ {
tmp = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[n]); tmp = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[n]);
dim = lss->data.info.dim[n]; dim = lss->dim[n];
tmp = fold_build2_loc (input_location, MINUS_EXPR, tmp = fold_build2_loc (input_location, MINUS_EXPR,
gfc_array_index_type, tmp, gfc_array_index_type, tmp,
loop->from[dim]); loop->from[dim]);
...@@ -7678,8 +7673,8 @@ gfc_walk_array_ref (gfc_ss * ss, gfc_expr * expr, gfc_ref * ref) ...@@ -7678,8 +7673,8 @@ gfc_walk_array_ref (gfc_ss * ss, gfc_expr * expr, gfc_ref * ref)
case DIMEN_RANGE: case DIMEN_RANGE:
/* We don't add anything for sections, just remember this /* We don't add anything for sections, just remember this
dimension for later. */ dimension for later. */
newss->data.info.dim[newss->data.info.dimen] = n; newss->dim[newss->dimen] = n;
newss->data.info.dimen++; newss->dimen++;
break; break;
case DIMEN_VECTOR: case DIMEN_VECTOR:
...@@ -7689,8 +7684,8 @@ gfc_walk_array_ref (gfc_ss * ss, gfc_expr * expr, gfc_ref * ref) ...@@ -7689,8 +7684,8 @@ gfc_walk_array_ref (gfc_ss * ss, gfc_expr * expr, gfc_ref * ref)
1, GFC_SS_VECTOR); 1, GFC_SS_VECTOR);
indexss->loop_chain = gfc_ss_terminator; indexss->loop_chain = gfc_ss_terminator;
newss->data.info.subscript[n] = indexss; newss->data.info.subscript[n] = indexss;
newss->data.info.dim[newss->data.info.dimen] = n; newss->dim[newss->dimen] = n;
newss->data.info.dimen++; newss->dimen++;
break; break;
default: default:
...@@ -7700,7 +7695,7 @@ gfc_walk_array_ref (gfc_ss * ss, gfc_expr * expr, gfc_ref * ref) ...@@ -7700,7 +7695,7 @@ gfc_walk_array_ref (gfc_ss * ss, gfc_expr * expr, gfc_ref * ref)
} }
/* We should have at least one non-elemental dimension, /* We should have at least one non-elemental dimension,
unless we are creating a descriptor for a (scalar) coarray. */ unless we are creating a descriptor for a (scalar) coarray. */
gcc_assert (newss->data.info.dimen > 0 gcc_assert (newss->dimen > 0
|| newss->data.info.ref->u.ar.as->corank > 0); || newss->data.info.ref->u.ar.as->corank > 0);
ss = newss; ss = newss;
break; break;
......
...@@ -2489,7 +2489,7 @@ gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77, ...@@ -2489,7 +2489,7 @@ gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77,
outside the innermost loop, so the overall transfer could be outside the innermost loop, so the overall transfer could be
optimized further. */ optimized further. */
info = &rse.ss->data.info; info = &rse.ss->data.info;
dimen = info->dimen; dimen = rse.ss->dimen;
tmp_index = gfc_index_zero_node; tmp_index = gfc_index_zero_node;
for (n = dimen - 1; n > 0; n--) for (n = dimen - 1; n > 0; n--)
...@@ -3582,7 +3582,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, ...@@ -3582,7 +3582,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
/* Set the type of the array. */ /* Set the type of the array. */
tmp = gfc_typenode_for_spec (&comp->ts); tmp = gfc_typenode_for_spec (&comp->ts);
gcc_assert (info->dimen == se->loop->dimen); gcc_assert (se->ss->dimen == se->loop->dimen);
/* Evaluate the bounds of the result, if known. */ /* Evaluate the bounds of the result, if known. */
gfc_set_loop_bounds_from_array_spec (&mapping, se, comp->as); gfc_set_loop_bounds_from_array_spec (&mapping, se, comp->as);
...@@ -3618,7 +3618,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, ...@@ -3618,7 +3618,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
/* Set the type of the array. */ /* Set the type of the array. */
tmp = gfc_typenode_for_spec (&ts); tmp = gfc_typenode_for_spec (&ts);
gcc_assert (info->dimen == se->loop->dimen); gcc_assert (se->ss->dimen == se->loop->dimen);
/* Evaluate the bounds of the result, if known. */ /* Evaluate the bounds of the result, if known. */
gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as); gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
......
...@@ -6757,15 +6757,13 @@ walk_inline_intrinsic_transpose (gfc_ss *ss, gfc_expr *expr) ...@@ -6757,15 +6757,13 @@ walk_inline_intrinsic_transpose (gfc_ss *ss, gfc_expr *expr)
&& tmp_ss->type != GFC_SS_REFERENCE) && tmp_ss->type != GFC_SS_REFERENCE)
{ {
int tmp_dim; int tmp_dim;
gfc_array_info *info;
info = &tmp_ss->data.info; gcc_assert (tmp_ss->dimen == 2);
gcc_assert (info->dimen == 2);
/* We just invert dimensions. */ /* We just invert dimensions. */
tmp_dim = info->dim[0]; tmp_dim = tmp_ss->dim[0];
info->dim[0] = info->dim[1]; tmp_ss->dim[0] = tmp_ss->dim[1];
info->dim[1] = tmp_dim; tmp_ss->dim[1] = tmp_dim;
} }
/* Stop when tmp_ss points to the last valid element of the chain... */ /* Stop when tmp_ss points to the last valid element of the chain... */
......
...@@ -241,8 +241,8 @@ gfc_conv_elemental_dependencies (gfc_se * se, gfc_se * loopse, ...@@ -241,8 +241,8 @@ gfc_conv_elemental_dependencies (gfc_se * se, gfc_se * loopse,
/* Make a local loopinfo for the temporary creation, so that /* Make a local loopinfo for the temporary creation, so that
none of the other ss->info's have to be renormalized. */ none of the other ss->info's have to be renormalized. */
gfc_init_loopinfo (&tmp_loop); gfc_init_loopinfo (&tmp_loop);
tmp_loop.dimen = info->dimen; tmp_loop.dimen = ss->dimen;
for (n = 0; n < info->dimen; n++) for (n = 0; n < ss->dimen; n++)
{ {
tmp_loop.to[n] = loopse->loop->to[n]; tmp_loop.to[n] = loopse->loop->to[n];
tmp_loop.from[n] = loopse->loop->from[n]; tmp_loop.from[n] = loopse->loop->from[n];
...@@ -320,7 +320,7 @@ gfc_conv_elemental_dependencies (gfc_se * se, gfc_se * loopse, ...@@ -320,7 +320,7 @@ gfc_conv_elemental_dependencies (gfc_se * se, gfc_se * loopse,
/* Calculate the offset for the temporary. */ /* Calculate the offset for the temporary. */
offset = gfc_index_zero_node; offset = gfc_index_zero_node;
for (n = 0; n < info->dimen; n++) for (n = 0; n < ss->dimen; n++)
{ {
tmp = gfc_conv_descriptor_stride_get (info->descriptor, tmp = gfc_conv_descriptor_stride_get (info->descriptor,
gfc_rank_cst[n]); gfc_rank_cst[n]);
......
...@@ -113,7 +113,6 @@ gfc_coarray_type; ...@@ -113,7 +113,6 @@ gfc_coarray_type;
typedef struct gfc_array_info typedef struct gfc_array_info
{ {
int dimen;
/* 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. */
...@@ -134,10 +133,6 @@ typedef struct gfc_array_info ...@@ -134,10 +133,6 @@ typedef struct gfc_array_info
tree end[GFC_MAX_DIMENSIONS]; tree end[GFC_MAX_DIMENSIONS];
tree stride[GFC_MAX_DIMENSIONS]; tree stride[GFC_MAX_DIMENSIONS];
tree delta[GFC_MAX_DIMENSIONS]; tree delta[GFC_MAX_DIMENSIONS];
/* Translation from loop dimensions to actual dimensions.
actual_dim = dim[loop_dim] */
int dim[GFC_MAX_DIMENSIONS];
} }
gfc_array_info; gfc_array_info;
...@@ -212,9 +207,6 @@ typedef struct gfc_ss ...@@ -212,9 +207,6 @@ typedef struct gfc_ss
/* GFC_SS_TEMP. */ /* GFC_SS_TEMP. */
struct struct
{ {
/* The rank of the temporary. May be less than the rank of the
assigned expression. */
int dimen;
tree type; tree type;
} }
temp; temp;
...@@ -223,6 +215,11 @@ typedef struct gfc_ss ...@@ -223,6 +215,11 @@ typedef struct gfc_ss
} }
data; data;
int dimen;
/* Translation from loop dimensions to actual array dimensions.
actual_dim = dim[loop_dim] */
int dim[GFC_MAX_DIMENSIONS];
/* All the SS in a loop and linked through loop_chain. The SS for an /* All the SS in a loop and linked through loop_chain. The SS for an
expression are linked by the next pointer. */ expression are linked by the next pointer. */
struct gfc_ss *loop_chain; struct gfc_ss *loop_chain;
......
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