diff options
author | Roger Sayle <roger@eyesopen.com> | 2007-02-02 04:06:23 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2007-02-02 04:06:23 +0000 |
commit | 114e4d106d80f2b5cd8fa398b78bcef9aae74150 (patch) | |
tree | d85dc905fa6fb5da2c6d13e3a99cfaffc5a9495b /gcc | |
parent | d4f8b5672a9b7349426fc54e27f7ea67a1078081 (diff) | |
download | gcc-114e4d106d80f2b5cd8fa398b78bcef9aae74150.zip gcc-114e4d106d80f2b5cd8fa398b78bcef9aae74150.tar.gz gcc-114e4d106d80f2b5cd8fa398b78bcef9aae74150.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 41 |
2 files changed, 39 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f794e51..e8649c3 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,12 @@ 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 dependency checking for array constructors. diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 03c24d6..529d721 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -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, |