diff options
author | Roger Sayle <roger@eyesopen.com> | 2006-03-25 15:01:42 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2006-03-25 15:01:42 +0000 |
commit | bfd022c1ced0b4fb6c05cdc9a4aaf148c5f3a611 (patch) | |
tree | 1d3827fad81d880427f582a789b35d46ce275595 | |
parent | ccf37f77368e6f970e6b6e4681c393717d2f8e58 (diff) | |
download | gcc-bfd022c1ced0b4fb6c05cdc9a4aaf148c5f3a611.zip gcc-bfd022c1ced0b4fb6c05cdc9a4aaf148c5f3a611.tar.gz gcc-bfd022c1ced0b4fb6c05cdc9a4aaf148c5f3a611.tar.bz2 |
dependency.c (gfc_check_dependency): Improve handling of pointers...
* dependency.c (gfc_check_dependency): Improve handling of pointers;
Two variables of different types can't have a dependency, and two
variables with the same symbol are equal, even if pointers.
* gfortran.dg/dependency_12.f90: New test case.
From-SVN: r112377
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/dependency.c | 54 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/dependency_12.f90 | 12 |
4 files changed, 56 insertions, 20 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9bb4edc..52a55c6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2006-03-25 Roger Sayle <roger@eyesopen.com> + + * dependency.c (gfc_check_dependency): Improve handling of pointers; + Two variables of different types can't have a dependency, and two + variables with the same symbol are equal, even if pointers. + 2006-03-24 Roger Sayle <roger@eyesopen.com> * gfortran.h (gfc_symbol): Add a new "forall_index" bit field. diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 2c52882..ca370b6 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -494,15 +494,6 @@ gfc_check_dependency (gfc_expr * expr1, gfc_expr * expr2, bool identical) gcc_assert (expr1->expr_type == EXPR_VARIABLE); - /* TODO: -fassume-no-pointer-aliasing */ - if (expr1->symtree->n.sym->attr.pointer) - return 1; - for (ref = expr1->ref; ref; ref = ref->next) - { - if (ref->type == REF_COMPONENT && ref->u.c.component->pointer) - return 1; - } - switch (expr2->expr_type) { case EXPR_OP: @@ -514,21 +505,44 @@ gfc_check_dependency (gfc_expr * expr1, gfc_expr * expr2, bool identical) return 0; case EXPR_VARIABLE: - if (expr2->symtree->n.sym->attr.pointer) - return 1; - - for (ref = expr2->ref; ref; ref = ref->next) + /* The interesting cases are when the symbols don't match. */ + if (expr1->symtree->n.sym != expr2->symtree->n.sym) { - if (ref->type == REF_COMPONENT && ref->u.c.component->pointer) + gfc_typespec *ts1 = &expr1->symtree->n.sym->ts; + gfc_typespec *ts2 = &expr2->symtree->n.sym->ts; + + /* Return 1 if expr1 and expr2 are equivalenced arrays. */ + if (gfc_are_equivalenced_arrays (expr1, expr2)) return 1; - } - /* Return 1 if expr1 and expr2 are equivalenced arrays. */ - if (gfc_are_equivalenced_arrays (expr1, expr2)) - return 1; + /* Symbols can only alias if they have the same type. */ + if (ts1->type != BT_UNKNOWN + && ts2->type != BT_UNKNOWN + && ts1->type != BT_DERIVED + && ts2->type != BT_DERIVED) + { + if (ts1->type != ts2->type + || ts1->kind != ts2->kind) + return 0; + } - if (expr1->symtree->n.sym != expr2->symtree->n.sym) - return 0; + /* If either variable is a pointer, assume the worst. */ + /* TODO: -fassume-no-pointer-aliasing */ + if (expr1->symtree->n.sym->attr.pointer) + return 1; + for (ref = expr1->ref; ref; ref = ref->next) + if (ref->type == REF_COMPONENT && ref->u.c.component->pointer) + return 1; + + if (expr2->symtree->n.sym->attr.pointer) + return 1; + for (ref = expr2->ref; ref; ref = ref->next) + if (ref->type == REF_COMPONENT && ref->u.c.component->pointer) + return 1; + + /* Otherwise distinct symbols have no dependencies. */ + return 0; + } if (identical) return 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa61c52..ce46847 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-03-25 Roger Sayle <roger@eyesopen.com> + + * gfortran.dg/dependency_12.f90: New test case. + 2006-03-24 Roger Sayle <roger@eyesopen.com> * gfortran.dg/dependency_9.f90: New (resurected) test case. diff --git a/gcc/testsuite/gfortran.dg/dependency_12.f90 b/gcc/testsuite/gfortran.dg/dependency_12.f90 new file mode 100644 index 0000000..09fe196 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dependency_12.f90 @@ -0,0 +1,12 @@ +! { dg-do compile } +! { dg-options "-O2 -fdump-tree-original" } +subroutine foo(a,b) + integer, pointer, dimension (:,:) :: a + real, dimension(:,:) :: b + + where (a == 0) + b = 0.0 + endwhere +end subroutine +! { dg-final { scan-tree-dump-times "malloc" 0 "original" } } +! { dg-final { cleanup-tree-dump "original" } } |