From: Thomas Koenig Date: Fri, 6 Aug 2010 22:33:37 +0000 (+0000) Subject: re PR fortran/45159 (Unnecessary temporaries) X-Git-Tag: releases/gcc-4.6.0~5192 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a0f25c3e783c450c75a139adf91c826584afd10;p=thirdparty%2Fgcc.git re PR fortran/45159 (Unnecessary temporaries) 2010-08-06 Thomas Koenig 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-06 Thomas Koenig PR fortran/45159 * gfortran.dg/dependency_31.f90: New test. From-SVN: r162966 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 752b187c6f60..fa2aaa65505c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2010-08-06 Thomas Koenig + + 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-04 Janus Weil PR fortran/42207 diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 90b2d679ec92..dfb0c94e541d 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -1196,13 +1196,33 @@ check_section_vs_section (gfc_array_ref *l_ar, gfc_array_ref *r_ar, int n) 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 backwards dependencies. */ /* x:y vs. x+1:z. */ if (l_dir == 1 && r_dir == 1 && l_start && r_start diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 49a72cd6c3db..e39d0450bde1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-06 Thomas Koenig + + PR fortran/45159 + * gfortran.dg/dependency_31.f90: New test. + 2010-08-06 Thomas Koenig * gfortran.dg/dependency_30.f90: Fix incorrect dg-do line. diff --git a/gcc/testsuite/gfortran.dg/dependency_31.f90 b/gcc/testsuite/gfortran.dg/dependency_31.f90 new file mode 100644 index 000000000000..afab24984867 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dependency_31.f90 @@ -0,0 +1,10 @@ +! { dg-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