Commit aed5574e by Paul Thomas

[multiple changes]

2011-05-26  Paul Thomas  <pault@gcc.gnu.org>
	    Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/48955
	* trans-expr.c (gfc_trans_assignment_1): GFC_REVERSE_NOT_SET
	changed to GFC_ENABLE_REVERSE.
	* trans-array.c (gfc_init_loopinfo): GFC_CANNOT_REVERSE changed
	to GFC_INHIBIT_REVERSE.
	* gfortran.h : Enum gfc_reverse is now GFC_ENABLE_REVERSE,
	GFC_FORWARD_SET, GFC_REVERSE_SET and GFC_INHIBIT_REVERSE.
	* dependency.c (gfc_dep_resolver): Change names for elements of
	gfc_reverse as necessary. Change the logic so that forward
	dependences are remembered as well as backward ones. When both
	have appeared, force a temporary.

2011-05-26  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/48955
	* gfortran.dg/dependency_40.f90 : New test.

From-SVN: r174302
parent b8ff4e88
2011-05-26 Paul Thomas <pault@gcc.gnu.org>
Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/48955
* trans-expr.c (gfc_trans_assignment_1): GFC_REVERSE_NOT_SET
changed to GFC_ENABLE_REVERSE.
* trans-array.c (gfc_init_loopinfo): GFC_CANNOT_REVERSE changed
to GFC_INHIBIT_REVERSE.
* gfortran.h : Enum gfc_reverse is now GFC_ENABLE_REVERSE,
GFC_FORWARD_SET, GFC_REVERSE_SET and GFC_INHIBIT_REVERSE.
* dependency.c (gfc_dep_resolver): Change names for elements of
gfc_reverse as necessary. Change the logic so that forward
dependences are remembered as well as backward ones. When both
have appeared, force a temporary.
2011-05-26 Tobias Burnus <burnus@net-b.de> 2011-05-26 Tobias Burnus <burnus@net-b.de>
PR fortran/18918 PR fortran/18918
......
...@@ -1807,7 +1807,7 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) ...@@ -1807,7 +1807,7 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse)
/* Now deal with the loop reversal logic: This only works on /* Now deal with the loop reversal logic: This only works on
ranges and is activated by setting ranges and is activated by setting
reverse[n] == GFC_CAN_REVERSE reverse[n] == GFC_ENABLE_REVERSE
The ability to reverse or not is set by previous conditions The ability to reverse or not is set by previous conditions
in this dimension. If reversal is not activated, the in this dimension. If reversal is not activated, the
value GFC_DEP_BACKWARD is reset to GFC_DEP_OVERLAP. */ value GFC_DEP_BACKWARD is reset to GFC_DEP_OVERLAP. */
...@@ -1815,25 +1815,34 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse) ...@@ -1815,25 +1815,34 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse)
&& lref->u.ar.dimen_type[n] == DIMEN_RANGE) && lref->u.ar.dimen_type[n] == DIMEN_RANGE)
{ {
/* Set reverse if backward dependence and not inhibited. */ /* Set reverse if backward dependence and not inhibited. */
if (reverse && reverse[n] != GFC_CANNOT_REVERSE) if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
reverse[n] = (this_dep == GFC_DEP_BACKWARD) ? reverse[n] = (this_dep == GFC_DEP_BACKWARD) ?
GFC_REVERSE_SET : reverse[n]; GFC_REVERSE_SET : reverse[n];
/* Inhibit loop reversal if dependence not compatible. */ /* Set forward if forward dependence and not inhibited. */
if (reverse && reverse[n] != GFC_REVERSE_NOT_SET if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
&& this_dep != GFC_DEP_EQUAL reverse[n] = (this_dep == GFC_DEP_FORWARD) ?
&& this_dep != GFC_DEP_BACKWARD GFC_FORWARD_SET : reverse[n];
&& this_dep != GFC_DEP_NODEP)
/* 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_CANNOT_REVERSE; reverse[n] = GFC_INHIBIT_REVERSE;
if (this_dep != GFC_DEP_FORWARD) this_dep = GFC_DEP_OVERLAP;
this_dep = GFC_DEP_OVERLAP;
} }
/* If no intention of reversing or reversing is explicitly /* If no intention of reversing or reversing is explicitly
inhibited, convert backward dependence to overlap. */ inhibited, convert backward dependence to overlap. */
if (this_dep == GFC_DEP_BACKWARD if ((reverse == NULL && this_dep == GFC_DEP_BACKWARD)
&& (reverse == NULL || reverse[n] == GFC_CANNOT_REVERSE)) || (reverse != NULL && reverse[n] == GFC_INHIBIT_REVERSE))
this_dep = GFC_DEP_OVERLAP; this_dep = GFC_DEP_OVERLAP;
} }
......
...@@ -578,10 +578,10 @@ gfc_fcoarray; ...@@ -578,10 +578,10 @@ gfc_fcoarray;
typedef enum typedef enum
{ {
GFC_REVERSE_NOT_SET, GFC_ENABLE_REVERSE,
GFC_FORWARD_SET,
GFC_REVERSE_SET, GFC_REVERSE_SET,
GFC_CAN_REVERSE, GFC_INHIBIT_REVERSE
GFC_CANNOT_REVERSE
} }
gfc_reverse; gfc_reverse;
......
...@@ -2244,7 +2244,7 @@ gfc_init_loopinfo (gfc_loopinfo * loop) ...@@ -2244,7 +2244,7 @@ gfc_init_loopinfo (gfc_loopinfo * loop)
for (n = 0; n < GFC_MAX_DIMENSIONS; n++) for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
{ {
loop->order[n] = n; loop->order[n] = n;
loop->reverse[n] = GFC_CANNOT_REVERSE; loop->reverse[n] = GFC_INHIBIT_REVERSE;
} }
loop->ss = gfc_ss_terminator; loop->ss = gfc_ss_terminator;
......
...@@ -6069,8 +6069,8 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, ...@@ -6069,8 +6069,8 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
/* Calculate the bounds of the scalarization. */ /* Calculate the bounds of the scalarization. */
gfc_conv_ss_startstride (&loop); gfc_conv_ss_startstride (&loop);
/* Enable loop reversal. */ /* Enable loop reversal. */
for (n = 0; n < loop.dimen; n++) for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
loop.reverse[n] = GFC_REVERSE_NOT_SET; loop.reverse[n] = GFC_ENABLE_REVERSE;
/* Resolve any data dependencies in the statement. */ /* Resolve any data dependencies in the statement. */
gfc_conv_resolve_dependencies (&loop, lss, rss); gfc_conv_resolve_dependencies (&loop, lss, rss);
/* Setup the scalarizing loops. */ /* Setup the scalarizing loops. */
......
2011-05-26 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/48955
* gfortran.dg/dependency_40.f90 : New test.
2011-05-26 Tobias Burnus <burnus@net-b.de> 2011-05-26 Tobias Burnus <burnus@net-b.de>
PR fortran/18918 PR fortran/18918
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment