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]

[patch, fortran] Further dependency improvements


Hello world,

this patch handles another dependency checking improvement.
Regression-tested.

OK for trunk?

	Thomas

2010-08-05  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/45159
	* dependency.c (check_section_vs_section):  Handle cases where
	the start expression coincides with the lower or upper
	bound of the array.

2010-08-05  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/45159
	* gfortran.dg/dependency_31.f90:  New test.

Index: dependency.c
===================================================================
--- dependency.c	(Revision 162848)
+++ dependency.c	(Arbeitskopie)
@@ -1196,13 +1196,33 @@ check_section_vs_section (gfc_array_ref *l_ar, gfc
 	return GFC_DEP_FORWARD;
     }
 
-  /* Check for backward dependencies:
-     Are the strides the same?.  */
+
+  /*  Are the strides the same?  */
   if ((!l_stride && !r_stride)
 	||
       (l_stride && r_stride
 	&& gfc_dep_compare_expr (l_stride, r_stride) == 0))
     {
+
+      if (l_start && IS_ARRAY_EXPLICIT (l_ar->as))
+	{
+
+	  /* Check for a(low:y:s) vs. a(z:a:s) where a has a lower bound
+	     of low, which is always at least a forward dependence.  */
+
+	  if (r_dir == 1
+	      && gfc_dep_compare_expr (l_start, l_ar->as->lower[n]) == 0)
+	    return GFC_DEP_FORWARD;
+
+	  /* Check for a(high:y:-s) vs. a(z:a:-s) where a has a higher bound
+	     of high, which is always at least a forward dependence.  */
+
+	  if (r_dir == -1
+	      && gfc_dep_compare_expr (l_start, l_ar->as->upper[n]) == 0)
+	    return GFC_DEP_FORWARD;
+	}
+
+      /* From here, check for backards dependencies.  */
       /* x:y vs. x+1:z.  */
       if (l_dir == 1 && r_dir == 1
 	    && l_start && r_start
! { do-do compile }
! { dg-options "-Warray-temporaries" }
! PR 45159 - make sure no temporary is created for this.
subroutine foo(a,n,i,j)
  implicit none
  integer, intent(in) :: i,j,n
  real, dimension(20) :: a
  a(1:10) = a(i:j)
  a(20:n:-3) = a(n:i:-3)
end subroutine foo

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