re PR fortran/31732 (Assignment to array slice affects whole array)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 1 May 2007 13:11:36 +0000 (13:11 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 1 May 2007 13:11:36 +0000 (13:11 +0000)
2007-05-01  Thomas Koenig  <tkoenig@gcc.gnu.org>

        PR fortran/31732
* dependency.c (gfc_full_array_ref_p):  If the reference is
to a single element, check that the array has a single
element and that the correct element is referenced.

2007-05-01  Thomas Koenig  <tkoenig@gcc.gnu.org>

        PR fortran/31732
* gfortran.dg/array_memset_2:  New test case.

From-SVN: r124326

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

index ca1991d0c5d494090b6806db56944d1be89629d5..66e61587fc095a2e4a46fa62cdccc6fd2798d44a 100644 (file)
@@ -1,3 +1,10 @@
+2007-05-01  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+        PR fortran/31732
+       * dependency.c (gfc_full_array_ref_p):  If the reference is
+       to a single element, check that the array has a single
+       element and that the correct element is referenced.
+
 2007-05-01  Daniel Franke  <franke.daniel@gmail.com>
 
        * intrinsic.c (add_functions): Fixed ELEMENTAL specifications.
index b79f222983594ce12edbefb9d86c32f455570d9b..bdda6d871d3febf5ac2c0a2cf0cf6b1f8ffc817b 100644 (file)
@@ -1126,6 +1126,24 @@ gfc_full_array_ref_p (gfc_ref *ref)
 
   for (i = 0; i < ref->u.ar.dimen; i++)
     {
+      /* If we have a single element in the reference, we need to check
+        that the array has a single element and that we actually reference
+        the correct element.  */
+      if (ref->u.ar.dimen_type[i] == DIMEN_ELEMENT)
+       {
+         if (!ref->u.ar.as
+             || !ref->u.ar.as->lower[i]
+             || !ref->u.ar.as->upper[i]
+             || gfc_dep_compare_expr (ref->u.ar.as->lower[i],
+                                      ref->u.ar.as->upper[i])
+             || !ref->u.ar.start[i]
+             || gfc_dep_compare_expr (ref->u.ar.start[i],
+                                      ref->u.ar.as->lower[i]))
+           return false;
+         else
+           continue;
+       }
+
       /* Check the lower bound.  */
       if (ref->u.ar.start[i]
          && (!ref->u.ar.as
index 617de905e5021e4ffb2c3e1c063fc712846502ae..82c9109817f309e7e2c820cc724295583f952793 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-01  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+        PR fortran/31732
+       * gfortran.dg/array_memset_2:  New test case.
+
 2007-05-01  Dorit Nuzman  <dorit@il.ibm.com>
 
        PR testsuite/31615
diff --git a/gcc/testsuite/gfortran.dg/array_memset_2.f90 b/gcc/testsuite/gfortran.dg/array_memset_2.f90
new file mode 100644 (file)
index 0000000..58ce8fe
--- /dev/null
@@ -0,0 +1,38 @@
+! { dg-do run }
+! { dg-options "-O2 -fdump-tree-original" }
+
+module foo
+contains
+  subroutine bar(a)
+    real, dimension(:,:) :: a
+    a(1,:) = 0.
+  end subroutine bar
+end module foo
+
+program test
+  use foo
+  implicit none
+  real, dimension (2,2) :: a, d, e
+  real, dimension (1,2) :: b
+  real, dimension (2) :: c
+  data a, d, e /12*1.0/
+  data b /2*1.0/
+  data c /2*1.0/
+
+  a(1,:) = 0.    ! This can't be optimized to a memset.
+  b(1,:) = 0.    ! This is optimized to memset.
+  c = 0.         ! This is optimized to memset.
+  d(:,1) = 0.    ! This can't be otimized to a memset.
+  call bar(e)
+
+  if (any(a /= reshape((/ 0.0, 1.0, 0.0, 1.0/), shape(a)))) call abort
+  if (any(b /= 0.)) call abort
+  if (any(c /= 0.)) call abort
+  if (any(d /= reshape((/ 0.0, 0.0, 1.0, 1.0/), shape(d)))) call abort
+  if (any(e /= reshape((/ 0.0, 1.0, 0.0, 1.0/), shape(e)))) call abort
+
+end program
+
+! { dg-final { scan-tree-dump-times "memset" 2 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }
+! { dg-final { cleanup-modules "foo" } }