Index: trans-expr.c =================================================================== --- trans-expr.c (Revision 173754) +++ trans-expr.c (Arbeitskopie) @@ -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. */ Index: trans-array.c =================================================================== --- trans-array.c (Revision 173754) +++ trans-array.c (Arbeitskopie) @@ -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); Index: gfortran.h =================================================================== --- gfortran.h (Revision 173754) +++ gfortran.h (Arbeitskopie) @@ -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; Index: dependency.c =================================================================== --- dependency.c (Revision 173754) +++ dependency.c (Arbeitskopie) @@ -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