===================================================================
*************** gfc_trans_assignment_1 (gfc_expr * expr1
/* 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;
/* Resolve any data dependencies in the statement. */
gfc_conv_resolve_dependencies (&loop, lss, rss);
/* Setup the scalarizing loops. */
/* Calculate the bounds of the scalarization. */
gfc_conv_ss_startstride (&loop);
/* Enable loop reversal. */
! for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
! loop.reverse[n] = GFC_ENABLE_REVERSE;
/* Resolve any data dependencies in the statement. */
gfc_conv_resolve_dependencies (&loop, lss, rss);
/* Setup the scalarizing loops. */
===================================================================
*************** 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->ss = gfc_ss_terminator;
for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
{
loop->order[n] = n;
! loop->reverse[n] = GFC_INHIBIT_REVERSE;
}
loop->ss = gfc_ss_terminator;
===================================================================
*************** gfc_fcoarray;
typedef enum
{
! GFC_REVERSE_NOT_SET,
GFC_REVERSE_SET,
! GFC_CAN_REVERSE,
! GFC_CANNOT_REVERSE
}
gfc_reverse;
typedef enum
{
! GFC_ENABLE_REVERSE,
! GFC_FORWARD_SET,
GFC_REVERSE_SET,
! GFC_INHIBIT_REVERSE
}
gfc_reverse;
===================================================================
*************** gfc_dep_resolver (gfc_ref *lref, gfc_ref
/* Now deal with the loop reversal logic: This only works on
ranges and is activated by setting
! reverse[n] == GFC_CAN_REVERSE
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. */
/* Now deal with the loop reversal logic: This only works on
ranges and is activated by setting
! reverse[n] == GFC_ENABLE_REVERSE
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. */
*************** gfc_dep_resolver (gfc_ref *lref, gfc_ref
&& 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];
! /* 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)
{
! reverse[n] = GFC_CANNOT_REVERSE;
! if (this_dep != GFC_DEP_FORWARD)
! 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;
}
&& lref->u.ar.dimen_type[n] == DIMEN_RANGE)
{
/* Set reverse if backward dependence and not inhibited. */
! if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
reverse[n] = (this_dep == GFC_DEP_BACKWARD) ?
GFC_REVERSE_SET : reverse[n];
! /* Set forward if forward dependence and not inhibited. */
! if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
! reverse[n] = (this_dep == GFC_DEP_FORWARD) ?
! GFC_FORWARD_SET : reverse[n];
!
! /* Flag up overlap if dependence not compatible with
! the overall state of the expression. */
! if (reverse && reverse[n] == GFC_REVERSE_SET
! && this_dep == GFC_DEP_FORWARD)
{
! reverse[n] = GFC_INHIBIT_REVERSE;
! this_dep = GFC_DEP_OVERLAP;
! }
! else if (reverse && reverse[n] == GFC_FORWARD_SET
! && this_dep == GFC_DEP_BACKWARD)
! {
! reverse[n] = GFC_INHIBIT_REVERSE;
! this_dep = GFC_DEP_OVERLAP;
}
/* If no intention of reversing or reversing is explicitly
inhibited, convert backward dependence to overlap. */
! if ((reverse == NULL && this_dep == GFC_DEP_BACKWARD)
! || (reverse != NULL && reverse[n] == GFC_INHIBIT_REVERSE))
this_dep = GFC_DEP_OVERLAP;
}
===================================================================
***************
+ ! { dg-do run }
+ ! PR 48955 - missing array temporary when there was both a forward
+ ! and a backward dependency.
+ ! Test case slightly modified from the original one by Kacper Kowalik.
+ program ala
+ implicit none
+
+ integer, parameter :: n = 6
+ real, dimension(n), parameter :: result = [1.,10.,30.,90.,270., 243.];
+ real, dimension(n) :: v0, v1
+ character(len=80) :: line1, line2
+
+ v0 = [1.0, 3.0, 9.0, 27.0, 81.0, 243.0]
+ v1 = v0
+
+ v1(2:n-1) = v1(1:n-2) + v1(3:n)
+ if (any(v1 /= result)) call abort
+ v1 = v0
+ v1(2:n-1) = v0(1:n-2) + v0(3:n)
+ if (any(v1 /= result)) call abort
+
+ v1 = v0
+ v1(2:n-1) = v1(3:n) + v1(1:n-2)
+ if (any(v1 /= result)) call abort
+ v1 = v0
+ v1(2:n-1) = v0(3:n) + v0(1:n-2)
+ if (any(v1 /= result)) call abort
+
+ end program ala