From 114e4d106d80f2b5cd8fa398b78bcef9aae74150 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Fri, 2 Feb 2007 04:06:23 +0000 Subject: [PATCH] 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 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/trans-array.c | 41 ++++++++++++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f794e51f803..e8649c35234 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2007-02-01 Roger Sayle + + * 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 * dependency.c (gfc_check_dependency) : Implement diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 03c24d6d517..529d721795e 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 and Steven Bosscher @@ -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,