+2016-07-28 Renlin Li <renlin.li@arm.com>
+
+ Revert
+ 2016-07-19 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/71902
+ * dependency.c (gfc_check_dependency): Use dep_ref. Handle case
+ if identical is true and two array element references differ.
+ (gfc_dep_resovler): Move most of the code to dep_ref.
+ (dep_ref): New function.
+ * frontend-passes.c (realloc_string_callback): Name temporary
+ variable "realloc_string".
+
2016-07-26 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/71862
static gfc_dependency check_section_vs_section (gfc_array_ref *,
gfc_array_ref *, int);
-static gfc_dependency dep_ref (gfc_ref *, gfc_ref *, gfc_reverse *);
-
/* Returns 1 if the expr is an integer constant value 1, 0 if it is not or
def if the value could not be determined. */
return 0;
}
+ if (identical)
+ return 1;
+
/* Identical and disjoint ranges return 0,
overlapping ranges return 1. */
if (expr1->ref && expr2->ref)
- {
- gfc_dependency dep;
- dep = dep_ref (expr1->ref, expr2->ref, NULL);
- switch (dep)
- {
- case GFC_DEP_EQUAL:
- return identical;
-
- case GFC_DEP_FORWARD:
- return 0;
-
- case GFC_DEP_BACKWARD:
- return 1;
-
- case GFC_DEP_OVERLAP:
- return 1;
-
- case GFC_DEP_NODEP:
- return 0;
-
- default:
- gcc_unreachable();
- }
- }
+ return gfc_dep_resolver (expr1->ref, expr2->ref, NULL);
return 1;
2 : array references are overlapping but reversal of one or
more dimensions will clear the dependency.
1 : array references are overlapping.
- 0 : array references are identical or can be handled in a forward loop. */
+ 0 : array references are identical or not overlapping. */
int
gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse)
{
- enum gfc_dependency dep;
- dep = dep_ref (lref, rref, reverse);
- switch (dep)
- {
- case GFC_DEP_EQUAL:
- return 0;
-
- case GFC_DEP_FORWARD:
- return 0;
-
- case GFC_DEP_BACKWARD:
- return 2;
-
- case GFC_DEP_OVERLAP:
- return 1;
-
- case GFC_DEP_NODEP:
- return 0;
-
- default:
- gcc_unreachable();
- }
-}
-
-
-static gfc_dependency
-dep_ref (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse)
-{
int n;
int m;
gfc_dependency fin_dep;
/* The two ranges can't overlap if they are from different
components. */
if (lref->u.c.component != rref->u.c.component)
- return GFC_DEP_NODEP;
+ return 0;
break;
case REF_SUBSTRING:
/* Substring overlaps are handled by the string assignment code
if there is not an underlying dependency. */
-
- return fin_dep == GFC_DEP_ERROR ? GFC_DEP_NODEP : fin_dep;
+ return (fin_dep == GFC_DEP_OVERLAP) ? 1 : 0;
case REF_ARRAY:
if (ref_same_as_full_array (lref, rref))
- return GFC_DEP_EQUAL;
+ return 0;
if (ref_same_as_full_array (rref, lref))
- return GFC_DEP_EQUAL;
+ return 0;
if (lref->u.ar.dimen != rref->u.ar.dimen)
{
fin_dep = gfc_full_array_ref_p (lref, NULL) ? GFC_DEP_EQUAL
: GFC_DEP_OVERLAP;
else
- return GFC_DEP_OVERLAP;
+ return 1;
break;
}
/* If any dimension doesn't overlap, we have no dependency. */
if (this_dep == GFC_DEP_NODEP)
- return GFC_DEP_NODEP;
+ return 0;
/* Now deal with the loop reversal logic: This only works on
ranges and is activated by setting
/* Exactly matching and forward overlapping ranges don't cause a
dependency. */
if (fin_dep < GFC_DEP_BACKWARD)
- return fin_dep == GFC_DEP_ERROR ? GFC_DEP_NODEP : fin_dep;
+ return 0;
/* Keep checking. We only have a dependency if
subsequent references also overlap. */
/* Assume the worst if we nest to different depths. */
if (lref || rref)
- return GFC_DEP_OVERLAP;
+ return 1;
- return fin_dep;
+ return fin_dep == GFC_DEP_OVERLAP;
}