diff options
author | Richard Sandiford <richard@codesourcery.com> | 2005-12-13 05:23:12 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2005-12-13 05:23:12 +0000 |
commit | 1524f80b1ceeda3c293142f4e370616be6dcf2cf (patch) | |
tree | 8b430f1a509f3fecd45aafac44d2707a38eb02d2 /gcc/fortran/resolve.c | |
parent | 264c41eda5b1d3b073053da88f7e757635269cc3 (diff) | |
download | gcc-1524f80b1ceeda3c293142f4e370616be6dcf2cf.zip gcc-1524f80b1ceeda3c293142f4e370616be6dcf2cf.tar.gz gcc-1524f80b1ceeda3c293142f4e370616be6dcf2cf.tar.bz2 |
Make-lang.in (fortran/trans-resolve.o): Depend on fortran/dependency.h.
gcc/fortran/
* Make-lang.in (fortran/trans-resolve.o): Depend on
fortran/dependency.h.
* gfortran.h (gfc_expr): Add an "inline_noncopying_intrinsic" flag.
* dependency.h (gfc_get_noncopying_intrinsic_argument): Declare.
(gfc_check_fncall_dependency): Change prototype.
* dependency.c (gfc_get_noncopying_intrinsic_argument): New function.
(gfc_check_argument_var_dependency): New function, split from
gfc_check_fncall_dependency.
(gfc_check_argument_dependency): New function.
(gfc_check_fncall_dependency): Replace the expression parameter with
separate symbol and argument list parameters. Generalize the function
to handle dependencies for any type of expression, not just variables.
Accept a further argument giving the intent of the expression being
tested. Ignore intent(in) arguments if that expression is also
intent(in).
* resolve.c: Include dependency.h.
(find_noncopying_intrinsics): New function.
(resolve_function, resolve_call): Call it on success.
* trans-array.h (gfc_conv_array_transpose): Declare.
(gfc_check_fncall_dependency): Remove prototype.
* trans-array.c (gfc_conv_array_transpose): New function.
* trans-intrinsic.c (gfc_conv_intrinsic_function): Don't use the
libcall handling if the expression is to be evaluated inline.
Add a case for handling inline transpose()s.
* trans-expr.c (gfc_trans_arrayfunc_assign): Adjust for the new
interface provided by gfc_check_fncall_dependency.
libgfortran/
* m4/matmul.m4: Use a different order in the special case of a
transposed first argument.
* generated/matmul_c4.c, generated/matmul_c8.c, generated/matmul_c10.c,
* generated/matmul_c16.c, generated/matmul_i4.c, generated/matmul_i8.c,
* generated/matmul_i10.c, generated/matmul_r4.c, generated/matmul_r8.c
* generated/matmul_r10.c, generated/matmul_r16.c: Regenerated.
Co-Authored-By: Victor Leikehman <LEI@il.ibm.com>
From-SVN: r108459
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index c543a95..e363763 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -24,6 +24,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor,Boston, MA #include "system.h" #include "gfortran.h" #include "arith.h" /* For gfc_compare_expr(). */ +#include "dependency.h" /* Types used in equivalence statements. */ @@ -804,6 +805,24 @@ resolve_actual_arglist (gfc_actual_arglist * arg) } +/* Go through each actual argument in ACTUAL and see if it can be + implemented as an inlined, non-copying intrinsic. FNSYM is the + function being called, or NULL if not known. */ + +static void +find_noncopying_intrinsics (gfc_symbol * fnsym, gfc_actual_arglist * actual) +{ + gfc_actual_arglist *ap; + gfc_expr *expr; + + for (ap = actual; ap; ap = ap->next) + if (ap->expr + && (expr = gfc_get_noncopying_intrinsic_argument (ap->expr)) + && !gfc_check_fncall_dependency (expr, INTENT_IN, fnsym, actual)) + ap->expr->inline_noncopying_intrinsic = 1; +} + + /************* Function resolution *************/ /* Resolve a function call known to be generic. @@ -1150,6 +1169,9 @@ resolve_function (gfc_expr * expr) } } + if (t == SUCCESS) + find_noncopying_intrinsics (expr->value.function.esym, + expr->value.function.actual); return t; } @@ -1372,27 +1394,28 @@ resolve_call (gfc_code * c) if (resolve_actual_arglist (c->ext.actual) == FAILURE) return FAILURE; - if (c->resolved_sym != NULL) - return SUCCESS; - - switch (procedure_kind (c->symtree->n.sym)) - { - case PTYPE_GENERIC: - t = resolve_generic_s (c); - break; + t = SUCCESS; + if (c->resolved_sym == NULL) + switch (procedure_kind (c->symtree->n.sym)) + { + case PTYPE_GENERIC: + t = resolve_generic_s (c); + break; - case PTYPE_SPECIFIC: - t = resolve_specific_s (c); - break; + case PTYPE_SPECIFIC: + t = resolve_specific_s (c); + break; - case PTYPE_UNKNOWN: - t = resolve_unknown_s (c); - break; + case PTYPE_UNKNOWN: + t = resolve_unknown_s (c); + break; - default: - gfc_internal_error ("resolve_subroutine(): bad function type"); - } + default: + gfc_internal_error ("resolve_subroutine(): bad function type"); + } + if (t == SUCCESS) + find_noncopying_intrinsics (c->resolved_sym, c->ext.actual); return t; } |