diff options
author | Roger Sayle <sayle@gcc.gnu.org> | 2006-03-11 22:25:58 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2006-03-11 22:25:58 +0000 |
commit | 37ad72f254edb8fd60b95939254f4847505173c9 (patch) | |
tree | 160412e4c30689240c5cb4f4ee1ae6194d4735b6 /gcc/fortran/dependency.c | |
parent | fc6c490eea79b69d94d4400c043c329728abb463 (diff) | |
download | gcc-37ad72f254edb8fd60b95939254f4847505173c9.zip gcc-37ad72f254edb8fd60b95939254f4847505173c9.tar.gz gcc-37ad72f254edb8fd60b95939254f4847505173c9.tar.bz2 |
dependency.c (gfc_dep_compare_expr): Allow unary and binary operators to compare equal if their operands are equal.
* dependency.c (gfc_dep_compare_expr) <EXPR_OP>: Allow unary and
binary operators to compare equal if their operands are equal.
<EXPR_FUNCTION>: Allow "constant" intrinsic conversion functions
to compare equal, if their operands are equal.
* gfortran.dg/dependency_10.f90: New test case.
* gfortran.dg/dependency_11.f90: Likewise.
From-SVN: r111970
Diffstat (limited to 'gcc/fortran/dependency.c')
-rw-r--r-- | gcc/fortran/dependency.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 187b207..d60b7eb 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -97,6 +97,57 @@ gfc_dep_compare_expr (gfc_expr * e1, gfc_expr * e2) return 0; return -2; + case EXPR_OP: + /* Intrinsic operators are the same if their operands are the same. */ + if (e1->value.op.operator != e2->value.op.operator) + return -2; + if (e1->value.op.op2 == 0) + { + i = gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1); + return i == 0 ? 0 : -2; + } + if (gfc_dep_compare_expr (e1->value.op.op1, e2->value.op.op1) == 0 + && gfc_dep_compare_expr (e1->value.op.op2, e2->value.op.op2) == 0) + return 0; + /* TODO Handle commutative binary operators here? */ + return -2; + + case EXPR_FUNCTION: + /* We can only compare calls to the same intrinsic function. */ + if (e1->value.function.isym == 0 + || e2->value.function.isym == 0 + || e1->value.function.isym != e2->value.function.isym) + return -2; + + /* We should list the "constant" intrinsic functions. Those + without side-effects that provide equal results given equal + argument lists. */ + switch (e1->value.function.isym->generic_id) + { + case GFC_ISYM_CONVERSION: + case GFC_ISYM_REAL: + case GFC_ISYM_LOGICAL: + case GFC_ISYM_DBLE: + break; + + default: + return -2; + } + + /* Compare the argument lists for equality. */ + { + gfc_actual_arglist *args1 = e1->value.function.actual; + gfc_actual_arglist *args2 = e2->value.function.actual; + while (args1 && args2) + { + if (gfc_dep_compare_expr (args1->expr, args2->expr) != 0) + return -2; + args1 = args1->next; + args2 = args2->next; + } + return (args1 || args2) ? -2 : 0; + } + default: return -2; } |