===================================================================
@@ -6068,9 +6068,14 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr
/* Calculate the bounds of the scalarization. */
gfc_conv_ss_startstride (&loop);
+
/* Enable loop reversal. */
for (n = 0; n < loop.dimen; n++)
- loop.reverse[n] = GFC_REVERSE_NOT_SET;
+ {
+ loop.reverse[n].forward_ok = true;
+ loop.reverse[n].backward_ok = true;
+ }
+
/* Resolve any data dependencies in the statement. */
gfc_conv_resolve_dependencies (&loop, lss, rss);
/* Setup the scalarizing loops. */
===================================================================
@@ -2244,7 +2244,8 @@ gfc_init_loopinfo (gfc_loopinfo * loop)
for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
{
loop->order[n] = n;
- loop->reverse[n] = GFC_CANNOT_REVERSE;
+ loop->reverse[n].forward_ok = true;
+ loop->reverse[n].backward_ok = false;
}
loop->ss = gfc_ss_terminator;
@@ -2925,7 +2926,8 @@ gfc_trans_scalarized_loop_end (gfc_loopinfo * loop
}
else
{
- bool reverse_loop = (loop->reverse[n] == GFC_REVERSE_SET)
+ bool reverse_loop = loop->reverse[n].backward_ok
+ && !loop->reverse[n].forward_ok
&& (loop->temp_ss == NULL);
loopbody = gfc_finish_block (pbody);
===================================================================
@@ -576,12 +576,10 @@ typedef enum
}
gfc_fcoarray;
-typedef enum
+typedef struct
{
- GFC_REVERSE_NOT_SET,
- GFC_REVERSE_SET,
- GFC_CAN_REVERSE,
- GFC_CANNOT_REVERSE
+ bool forward_ok;
+ bool backward_ok;
}
gfc_reverse;
===================================================================
@@ -1807,34 +1807,35 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gf
/* Now deal with the loop reversal logic: This only works on
ranges and is activated by setting
- reverse[n] == GFC_CAN_REVERSE
+ reverse[n].backward_ok = true
The ability to reverse or not is set by previous conditions
in this dimension. If reversal is not activated, the
value GFC_DEP_BACKWARD is reset to GFC_DEP_OVERLAP. */
if (rref->u.ar.dimen_type[n] == DIMEN_RANGE
- && lref->u.ar.dimen_type[n] == DIMEN_RANGE)
+ && lref->u.ar.dimen_type[n] == DIMEN_RANGE)
{
- /* Set reverse if backward dependence and not inhibited. */
- if (reverse && reverse[n] != GFC_CANNOT_REVERSE)
- reverse[n] = (this_dep == GFC_DEP_BACKWARD) ?
- GFC_REVERSE_SET : reverse[n];
+ if (reverse)
+ {
+ if (this_dep == GFC_DEP_FORWARD
+ || this_dep == GFC_DEP_OVERLAP
+ || this_dep == GFC_DEP_ERROR)
+ reverse[n].backward_ok = false;
- /* Inhibit loop reversal if dependence not compatible. */
- if (reverse && reverse[n] != GFC_REVERSE_NOT_SET
- && this_dep != GFC_DEP_EQUAL
- && this_dep != GFC_DEP_BACKWARD
- && this_dep != GFC_DEP_NODEP)
+ if (this_dep == GFC_DEP_BACKWARD
+ || this_dep == GFC_DEP_OVERLAP
+ || this_dep == GFC_DEP_ERROR)
+ reverse[n].forward_ok = false;
+
+ if (!reverse[n].forward_ok && !reverse[n].backward_ok)
+ this_dep = GFC_DEP_OVERLAP;
+ }
+ else
{
- reverse[n] = GFC_CANNOT_REVERSE;
- if (this_dep != GFC_DEP_FORWARD)
+ /* If no intention of reversing, convert backward
+ dependence to overlap. */
+ if (this_dep == GFC_DEP_BACKWARD)
this_dep = GFC_DEP_OVERLAP;
}
-
- /* If no intention of reversing or reversing is explicitly
- inhibited, convert backward dependence to overlap. */
- if (this_dep == GFC_DEP_BACKWARD
- && (reverse == NULL || reverse[n] == GFC_CANNOT_REVERSE))
- this_dep = GFC_DEP_OVERLAP;
}
/* Overlap codes are in order of priority. We only need to