------- 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