This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix for PR fortran/31732


:ADDPATCH fortran:

Hello world,

this fixes PR fortran/31732.  The fix is fairly self-explanatory (and
matches, in function, what Paul T has also posted on the PR).

This bug only applies to trunk, so we don't have to worry about
backporting for once.

OK?

	Thomas

Index: dependency.c
===================================================================
--- dependency.c	(revision 123976)
+++ dependency.c	(working copy)
@@ -1126,6 +1126,26 @@ gfc_full_array_ref_p (gfc_ref *ref)
 
   for (i = 0; i < ref->u.ar.dimen; i++)
     {
+      /*
+	If we hange 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

Attachment: changelog
Description: Text document

! { 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" } }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]