OSDN Git Service

* dependency.c (gfc_check_dependency): Improve handling of pointers;
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Mar 2006 15:01:42 +0000 (15:01 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Mar 2006 15:01:42 +0000 (15:01 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112377 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/dependency.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dependency_12.f90 [new file with mode: 0644]

index 9bb4edc..52a55c6 100644 (file)
@@ -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.
index 2c52882..ca370b6 100644 (file)
@@ -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;
index aa61c52..ce46847 100644 (file)
@@ -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 (file)
index 0000000..09fe196
--- /dev/null
@@ -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" } }