mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-06 02:20:34 +08:00
[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
This commit is contained in:
parent
b8ff4e88e7
commit
aed5574e7b
@ -1,3 +1,18 @@
|
||||
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>
|
||||
|
||||
PR fortran/18918
|
||||
|
@ -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
|
||||
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
|
||||
in this dimension. If reversal is not activated, the
|
||||
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)
|
||||
&& lref->u.ar.dimen_type[n] == DIMEN_RANGE)
|
||||
{
|
||||
/* 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) ?
|
||||
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)
|
||||
/* 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_CANNOT_REVERSE;
|
||||
if (this_dep != GFC_DEP_FORWARD)
|
||||
this_dep = GFC_DEP_OVERLAP;
|
||||
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 (this_dep == GFC_DEP_BACKWARD
|
||||
&& (reverse == NULL || reverse[n] == GFC_CANNOT_REVERSE))
|
||||
if ((reverse == NULL && this_dep == GFC_DEP_BACKWARD)
|
||||
|| (reverse != NULL && reverse[n] == GFC_INHIBIT_REVERSE))
|
||||
this_dep = GFC_DEP_OVERLAP;
|
||||
}
|
||||
|
||||
|
@ -578,10 +578,10 @@ gfc_fcoarray;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GFC_REVERSE_NOT_SET,
|
||||
GFC_ENABLE_REVERSE,
|
||||
GFC_FORWARD_SET,
|
||||
GFC_REVERSE_SET,
|
||||
GFC_CAN_REVERSE,
|
||||
GFC_CANNOT_REVERSE
|
||||
GFC_INHIBIT_REVERSE
|
||||
}
|
||||
gfc_reverse;
|
||||
|
||||
|
@ -2244,7 +2244,7 @@ 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] = GFC_INHIBIT_REVERSE;
|
||||
}
|
||||
|
||||
loop->ss = gfc_ss_terminator;
|
||||
|
@ -6069,8 +6069,8 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
|
||||
/* 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;
|
||||
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. */
|
||||
|
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
PR fortran/18918
|
||||
|
29
gcc/testsuite/gfortran.dg/dependency_40.f90
Normal file
29
gcc/testsuite/gfortran.dg/dependency_40.f90
Normal file
@ -0,0 +1,29 @@
|
||||
! { 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
|
Loading…
x
Reference in New Issue
Block a user