]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
trans-array.c (gfc_conv_resolve_dependencies): Handle same-array transposed references.
authorMikael Morin <mikael@gcc.gnu.org>
Fri, 10 Sep 2010 10:27:59 +0000 (10:27 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Fri, 10 Sep 2010 10:27:59 +0000 (10:27 +0000)
2010-09-10  Mikael Morin  <mikael@gcc.gnu.org>

* trans-array.c (gfc_conv_resolve_dependencies): Handle same-array
transposed references.

From-SVN: r164158

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c

index f7f5272f0d9205bacd0381ad103d0ff775b75d4f..daf4cd6dbe64666a7ac160a20c58ba9f4f10ebc1 100644 (file)
@@ -1,3 +1,8 @@
+2010-09-10  Mikael Morin  <mikael@gcc.gnu.org>
+
+       * trans-array.c (gfc_conv_resolve_dependencies): Handle same-array
+       transposed references.
+
 2010-09-10  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/45186
index 44c47d776cdb57adb66dcb700ce30ee5d526b625..cd5f4384042d7b15aec049fac0934e7cf84a9e3c 100644 (file)
@@ -3577,6 +3577,7 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop, gfc_ss * dest,
   gfc_ref *lref;
   gfc_ref *rref;
   int nDepend = 0;
+  int i, j;
 
   loop->temp_ss = NULL;
 
@@ -3603,6 +3604,17 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop, gfc_ss * dest,
 
          if (nDepend == 1)
            break;
+
+         for (i = 0; i < dest->data.info.dimen; i++)
+           for (j = 0; j < ss->data.info.dimen; j++)
+             if (i != j
+                 && dest->data.info.dim[i] == ss->data.info.dim[j])
+               {
+                 /* If we don't access array elements in the same order,
+                    there is a dependency.  */
+                 nDepend = 1;
+                 goto temporary;
+               }
 #if 0
          /* TODO : loop shifting.  */
          if (nDepend == 1)
@@ -3641,6 +3653,8 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop, gfc_ss * dest,
        }
     }
 
+temporary:
+
   if (nDepend == 1)
     {
       tree base_type = gfc_typenode_for_spec (&dest->expr->ts);