aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/dependency.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2006-02-05 22:12:20 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2006-02-05 22:12:20 +0000
commit3ded621059e0edd541e3b5b921d8e499d7e668f5 (patch)
tree6fff194e6c0dfb03db079b04df84ee2e9dc134ae /gcc/fortran/dependency.c
parent71ab8de85aada56287c4954e6d7fe24529c5ef74 (diff)
downloadgcc-3ded621059e0edd541e3b5b921d8e499d7e668f5.zip
gcc-3ded621059e0edd541e3b5b921d8e499d7e668f5.tar.gz
gcc-3ded621059e0edd541e3b5b921d8e499d7e668f5.tar.bz2
dependency.c (gfc_check_dependency): Remove unused vars and nvars arguments.
* dependency.c (gfc_check_dependency): Remove unused vars and nvars arguments. Replace with an "identical" argument. A full array reference to the same symbol is a dependency if identical is true. * dependency.h (gfc_check_dependency): Update prototype. * trans-array.h (gfc_check_dependency): Delete duplicate prototype. * trans-stmt.c: #include dependency.h for gfc_check_dependency. (gfc_trans_forall_1): Update calls to gfc_check_dependency. (gfc_trans_where_2): Likewise. Remove unneeded variables. (gfc_trans_where_3): New function for simple non-dependent WHEREs. (gfc_trans_where): Call gfc_trans_where_3 to translate simple F90-style WHERE statements without internal dependencies. * Make-lang.in (trans-stmt.o): Depend upon dependency.h. From-SVN: r110625
Diffstat (limited to 'gcc/fortran/dependency.c')
-rw-r--r--gcc/fortran/dependency.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c
index 4a79560..62f3aa6 100644
--- a/gcc/fortran/dependency.c
+++ b/gcc/fortran/dependency.c
@@ -259,10 +259,10 @@ gfc_check_argument_var_dependency (gfc_expr * var, sym_intent intent,
{
case EXPR_VARIABLE:
return (gfc_ref_needs_temporary_p (expr->ref)
- || gfc_check_dependency (var, expr, NULL, 0));
+ || gfc_check_dependency (var, expr, 1));
case EXPR_ARRAY:
- return gfc_check_dependency (var, expr, NULL, 0);
+ return gfc_check_dependency (var, expr, 1);
case EXPR_FUNCTION:
if (intent != INTENT_IN && expr->inline_noncopying_intrinsic)
@@ -339,15 +339,14 @@ gfc_check_fncall_dependency (gfc_expr * other, sym_intent intent,
/* Return true if the statement body redefines the condition. Returns
true if expr2 depends on expr1. expr1 should be a single term
- suitable for the lhs of an assignment. The symbols listed in VARS
- must be considered to have all possible values. All other scalar
- variables may be considered constant. Used for forall and where
+ suitable for the lhs of an assignment. The IDENTICAL flag indicates
+ whether array references to the same symbol with identical range
+ references count as a dependency or not. Used for forall and where
statements. Also used with functions returning arrays without a
temporary. */
int
-gfc_check_dependency (gfc_expr * expr1, gfc_expr * expr2, gfc_expr ** vars,
- int nvars)
+gfc_check_dependency (gfc_expr * expr1, gfc_expr * expr2, bool identical)
{
gfc_ref *ref;
int n;
@@ -367,11 +366,11 @@ gfc_check_dependency (gfc_expr * expr1, gfc_expr * expr2, gfc_expr ** vars,
switch (expr2->expr_type)
{
case EXPR_OP:
- n = gfc_check_dependency (expr1, expr2->value.op.op1, vars, nvars);
+ n = gfc_check_dependency (expr1, expr2->value.op.op1, identical);
if (n)
return n;
if (expr2->value.op.op2)
- return gfc_check_dependency (expr1, expr2->value.op.op2, vars, nvars);
+ return gfc_check_dependency (expr1, expr2->value.op.op2, identical);
return 0;
case EXPR_VARIABLE:
@@ -387,15 +386,25 @@ gfc_check_dependency (gfc_expr * expr1, gfc_expr * expr2, gfc_expr ** vars,
if (expr1->symtree->n.sym != expr2->symtree->n.sym)
return 0;
- for (ref = expr2->ref; ref; ref = ref->next)
- {
- /* Identical ranges return 0, overlapping ranges return 1. */
- if (ref->type == REF_ARRAY)
- return 1;
- }
+ if (identical)
+ return 1;
+
+ /* Identical ranges return 0, overlapping ranges return 1. */
+
+ /* Return zero if we refer to the same full arrays. */
+ if (expr1->ref->type == REF_ARRAY
+ && expr2->ref->type == REF_ARRAY
+ && expr1->ref->u.ar.type == AR_FULL
+ && expr2->ref->u.ar.type == AR_FULL
+ && !expr1->ref->next
+ && !expr2->ref->next)
+ return 0;
+
return 1;
case EXPR_FUNCTION:
+ if (expr2->inline_noncopying_intrinsic)
+ identical = 1;
/* Remember possible differences between elemental and
transformational functions. All functions inside a FORALL
will be pure. */
@@ -404,7 +413,7 @@ gfc_check_dependency (gfc_expr * expr1, gfc_expr * expr2, gfc_expr ** vars,
{
if (!actual->expr)
continue;
- n = gfc_check_dependency (expr1, actual->expr, vars, nvars);
+ n = gfc_check_dependency (expr1, actual->expr, identical);
if (n)
return n;
}