trans-array.c (gfc_conv_expr_descriptor): We don't need to use a temporary array to pass a constant non-character array...
* trans-array.c (gfc_conv_expr_descriptor): We don't need to use a temporary array to pass a constant non-character array constructor. Generalize the descriptor generation code to handle scalarizer "info" without an array reference. From-SVN: r121491
This commit is contained in:
parent
d4f8b5672a
commit
114e4d106d
2 changed files with 39 additions and 9 deletions
|
@ -1,3 +1,10 @@
|
|||
2007-02-01 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
* trans-array.c (gfc_conv_expr_descriptor): We don't need to use
|
||||
a temporary array to pass a constant non-character array constructor.
|
||||
Generalize the descriptor generation code to handle scalarizer
|
||||
"info" without an array reference.
|
||||
|
||||
2007-02-01 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
* dependency.c (gfc_check_dependency) <EXPR_ARRAY>: Implement
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Array translation routines
|
||||
Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
|
||||
Inc.
|
||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Paul Brook <paul@nowt.org>
|
||||
and Steven Bosscher <s.bosscher@student.tudelft.nl>
|
||||
|
||||
|
@ -4306,7 +4306,6 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
|
|||
|
||||
gcc_assert (ss != gfc_ss_terminator);
|
||||
|
||||
/* TODO: Pass constant array constructors without a temporary. */
|
||||
/* Special case things we know we can pass easily. */
|
||||
switch (expr->expr_type)
|
||||
{
|
||||
|
@ -4402,6 +4401,24 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
|
|||
}
|
||||
break;
|
||||
|
||||
case EXPR_ARRAY:
|
||||
/* Constant array constructors don't need a temporary. */
|
||||
if (ss->type == GFC_SS_CONSTRUCTOR
|
||||
&& expr->ts.type != BT_CHARACTER
|
||||
&& gfc_constant_array_constructor_p (expr->value.constructor))
|
||||
{
|
||||
need_tmp = 0;
|
||||
info = &ss->data.info;
|
||||
secss = ss;
|
||||
}
|
||||
else
|
||||
{
|
||||
need_tmp = 1;
|
||||
secss = NULL;
|
||||
info = NULL;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Something complicated. Copy it into a temporary. */
|
||||
need_tmp = 1;
|
||||
|
@ -4553,7 +4570,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
|
|||
limits will be the limits of the section.
|
||||
A function may decide to repack the array to speed up access, but
|
||||
we're not bothered about that here. */
|
||||
int dim;
|
||||
int dim, ndim;
|
||||
tree parm;
|
||||
tree parmtype;
|
||||
tree stride;
|
||||
|
@ -4603,12 +4620,14 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
|
|||
else
|
||||
base = NULL_TREE;
|
||||
|
||||
for (n = 0; n < info->ref->u.ar.dimen; n++)
|
||||
ndim = info->ref ? info->ref->u.ar.dimen : info->dimen;
|
||||
for (n = 0; n < ndim; n++)
|
||||
{
|
||||
stride = gfc_conv_array_stride (desc, n);
|
||||
|
||||
/* Work out the offset. */
|
||||
if (info->ref->u.ar.dimen_type[n] == DIMEN_ELEMENT)
|
||||
if (info->ref
|
||||
&& info->ref->u.ar.dimen_type[n] == DIMEN_ELEMENT)
|
||||
{
|
||||
gcc_assert (info->subscript[n]
|
||||
&& info->subscript[n]->type == GFC_SS_SCALAR);
|
||||
|
@ -4630,14 +4649,16 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
|
|||
tmp = fold_build2 (MULT_EXPR, TREE_TYPE (tmp), tmp, stride);
|
||||
offset = fold_build2 (PLUS_EXPR, TREE_TYPE (tmp), offset, tmp);
|
||||
|
||||
if (info->ref->u.ar.dimen_type[n] == DIMEN_ELEMENT)
|
||||
if (info->ref
|
||||
&& info->ref->u.ar.dimen_type[n] == DIMEN_ELEMENT)
|
||||
{
|
||||
/* For elemental dimensions, we only need the offset. */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Vector subscripts need copying and are handled elsewhere. */
|
||||
gcc_assert (info->ref->u.ar.dimen_type[n] == DIMEN_RANGE);
|
||||
if (info->ref)
|
||||
gcc_assert (info->ref->u.ar.dimen_type[n] == DIMEN_RANGE);
|
||||
|
||||
/* Set the new lower bound. */
|
||||
from = loop.from[dim];
|
||||
|
@ -4646,7 +4667,9 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
|
|||
/* If we have an array section or are assigning to a pointer,
|
||||
make sure that the lower bound is 1. References to the full
|
||||
array should otherwise keep the original bounds. */
|
||||
if ((info->ref->u.ar.type != AR_FULL || se->direct_byref)
|
||||
if ((!info->ref
|
||||
|| info->ref->u.ar.type != AR_FULL
|
||||
|| se->direct_byref)
|
||||
&& !integer_onep (from))
|
||||
{
|
||||
tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
|
||||
|
|
Loading…
Add table
Reference in a new issue