------- Comment #16 from tkoenig at gcc dot gnu dot org 2010-08-09 22:56
-------
(In reply to comment #15)
> Here's another case where we generate a temporary:
>
> program main
> integer a(100)
> a(10:16) = a(11:17:1)
> end program main
Here's a tentative patch:
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) == 1;
+ else
+ identical_strides = gfc_expr_is_one (l_stride, 0) == 0;
+ }
+ 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))
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45159