This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch, fortran] Further dependency improvements
- From: Thomas Koenig <tkoenig at netcologne dot de>
- To: fortran at gcc dot gnu dot org
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 05 Aug 2010 09:13:08 +0200
- Subject: [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