This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch, fortran] Handle missing vs. 1 strides
- 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: Wed, 11 Aug 2010 08:32:02 +0200
- Subject: [patch, fortran] Handle missing vs. 1 strides
Hello world,
another patch, pretty self-explanatory.
I won't have time to commit this until the end of August, so if this is
approved, then if someone feels like it, please feel free to commit.
OK for trunk?
Thomas
2010-08-11 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/45159
* dependency.c (check_section_vs_section): Single test for
identical strides which takes into account that only one
of the strides may be NULL.
2010-08-11 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/45159
* gfortran.dg/dependency_33.f90: New test.
Index: dependency.c
===================================================================
--- dependency.c (Revision 163040)
+++ dependency.c (Arbeitskopie)
@@ -1023,6 +1023,7 @@ check_section_vs_section (gfc_array_ref *l_ar, gfc
gfc_expr *r_lower;
gfc_expr *r_upper;
int r_dir;
+ bool identical_strides;
/* If they are the same range, return without more ado. */
if (gfc_is_same_range (l_ar, r_ar, n, 0))
@@ -1076,6 +1077,23 @@ check_section_vs_section (gfc_array_ref *l_ar, gfc
if (l_dir == 0 || r_dir == 0)
return GFC_DEP_OVERLAP;
+ /* Determine if the strides are equal. */
+
+ if (l_stride)
+ {
+ if (r_stride)
+ identical_strides = gfc_dep_compare_expr (l_stride, r_stride) == 0;
+ else
+ identical_strides = gfc_expr_is_one (l_stride, 0) == 1;
+ }
+ else
+ {
+ if (r_stride)
+ identical_strides = gfc_expr_is_one (r_stride, 0) == 1;
+ else
+ identical_strides = true;
+ }
+
/* Determine LHS upper and lower bounds. */
if (l_dir == 1)
{
@@ -1175,12 +1193,8 @@ check_section_vs_section (gfc_array_ref *l_ar, gfc
&& l_start && r_start && gfc_dep_compare_expr (l_start, r_start) == -1
&& l_end && r_end && gfc_dep_compare_expr (l_end, r_end) == -1)
{
- /* Check that the strides are the same. */
- if (!l_stride && !r_stride)
+ if (identical_strides)
return GFC_DEP_FORWARD;
- if (l_stride && r_stride
- && gfc_dep_compare_expr (l_stride, r_stride) == 0)
- return GFC_DEP_FORWARD;
}
/* Check for forward dependencies x:y:-1 vs. x-1:z:-1. */
@@ -1188,20 +1202,12 @@ check_section_vs_section (gfc_array_ref *l_ar, gfc
&& l_start && r_start && gfc_dep_compare_expr (l_start, r_start) == 1
&& l_end && r_end && gfc_dep_compare_expr (l_end, r_end) == 1)
{
- /* Check that the strides are the same. */
- if (!l_stride && !r_stride)
+ if (identical_strides)
return GFC_DEP_FORWARD;
- if (l_stride && r_stride
- && gfc_dep_compare_expr (l_stride, r_stride) == 0)
- return GFC_DEP_FORWARD;
}
- /* Are the strides the same? */
- if ((!l_stride && !r_stride)
- ||
- (l_stride && r_stride
- && gfc_dep_compare_expr (l_stride, r_stride) == 0))
+ if (identical_strides)
{
if (l_start && IS_ARRAY_EXPLICIT (l_ar->as))
! { dg-do compile }
! { dg-options "-Warray-temporaries" }
! No temporary should be created for this, as a missing stride and
! a stride equal to one should be equal.
program main
integer a(100)
a(10:16) = a(11:17)
a(10:16) = a(11:17:1)
a(10:16:1) = a(11:17)
a(10:16:1) = a(11:17:1)
end program main