aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2006-03-25 15:01:42 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2006-03-25 15:01:42 +0000
commitbfd022c1ced0b4fb6c05cdc9a4aaf148c5f3a611 (patch)
tree1d3827fad81d880427f582a789b35d46ce275595
parentccf37f77368e6f970e6b6e4681c393717d2f8e58 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/dependency.c54
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gfortran.dg/dependency_12.f9012
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" } }