[multiple changes]
authorPaul Thomas <pault@gcc.gnu.org>
Thu, 26 May 2011 18:19:36 +0000 (18:19 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Thu, 26 May 2011 18:19:36 +0000 (18:19 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/dependency.c
gcc/fortran/gfortran.h
gcc/fortran/trans-array.c
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dependency_40.f90 [new file with mode: 0644]

index 79d4a2515d2fa7d2df47e3a5f4f18ae4615b4d9c..304c887f2220853122a74b500c9b75886ec134d4 100644 (file)
@@ -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
index d237a92a62e5093e62292320ff3566d86a98fc7f..cb5d10ca84bb5ca8468861a304d5fb89dbc2f161 100644 (file)
@@ -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_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;
-                     if (this_dep != GFC_DEP_FORWARD)
-                       this_dep = GFC_DEP_OVERLAP;
+                     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;
                }
 
index 3b4967de63af63163f4568e199105282deef3e4f..6d9eb88a116c1c0e6e873d265c0b552eef3bfe25 100644 (file)
@@ -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;
 
index 29c7f835475ebde0f081697f1a42806254e5b9fd..b2992f0233dde857044f5177f6ff3f4accc37187 100644 (file)
@@ -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;
index 3dde29837cbf0d2d46bb3b1fc0c25b1e6bed3f7c..bfe966f3f955c230a687eb9bcea275b2c69d5e09 100644 (file)
@@ -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.  */
index eec8fa7061962c8ce6041138565998f5d0f85816..4805e9d27d0fb0e554a9984fe43c500ac38f44a3 100644 (file)
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/dependency_40.f90 b/gcc/testsuite/gfortran.dg/dependency_40.f90
new file mode 100644 (file)
index 0000000..b7bd4f9
--- /dev/null
@@ -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