]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
trans-array.c (constant_array_constructor_loop_size): Handle multiple loops.
authorMikael Morin <mikael@gcc.gnu.org>
Thu, 3 Nov 2011 23:51:04 +0000 (23:51 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Thu, 3 Nov 2011 23:51:04 +0000 (23:51 +0000)
* trans-array.c (constant_array_constructor_loop_size):
Handle multiple loops.

From-SVN: r180901

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

index 091ae6e273e120bdd85e017930c8eb443377eaa9..e359eca5f0781ab84f651a102910294a3acdaf6d 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-03  Mikael Morin  <mikael@gcc.gnu.org>
+
+       * trans-array.c (constant_array_constructor_loop_size):
+       Handle multiple loops.
+
 2011-11-03  Mikael Morin  <mikael@gcc.gnu.org>
 
        * trans-array.c (get_rank, get_loop_upper_bound_for_array):
index 083ce5c77ee5a97219710a7274575d03bd82db37..299bd80756401aa68435a99bff874e0ff9981aa1 100644 (file)
@@ -2053,32 +2053,38 @@ get_rank (gfc_loopinfo *loop)
    iteration count of the loop if suitable, and NULL_TREE otherwise.  */
 
 static tree
-constant_array_constructor_loop_size (gfc_loopinfo * loop)
+constant_array_constructor_loop_size (gfc_loopinfo * l)
 {
+  gfc_loopinfo *loop;
   tree size = gfc_index_one_node;
   tree tmp;
-  int i;
+  int i, total_dim;
+
+  total_dim = get_rank (l);
 
-  for (i = 0; i < loop->dimen; i++)
+  for (loop = l; loop; loop = loop->parent)
     {
-      /* If the bounds aren't constant, return NULL_TREE.  */
-      if (!INTEGER_CST_P (loop->from[i]) || !INTEGER_CST_P (loop->to[i]))
-       return NULL_TREE;
-      if (!integer_zerop (loop->from[i]))
+      for (i = 0; i < loop->dimen; i++)
        {
-         /* Only allow nonzero "from" in one-dimensional arrays.  */
-         if (loop->dimen != 1)
+         /* If the bounds aren't constant, return NULL_TREE.  */
+         if (!INTEGER_CST_P (loop->from[i]) || !INTEGER_CST_P (loop->to[i]))
            return NULL_TREE;
-         tmp = fold_build2_loc (input_location, MINUS_EXPR,
-                                gfc_array_index_type,
-                                loop->to[i], loop->from[i]);
+         if (!integer_zerop (loop->from[i]))
+           {
+             /* Only allow nonzero "from" in one-dimensional arrays.  */
+             if (total_dim != 1)
+               return NULL_TREE;
+             tmp = fold_build2_loc (input_location, MINUS_EXPR,
+                                    gfc_array_index_type,
+                                    loop->to[i], loop->from[i]);
+           }
+         else
+           tmp = loop->to[i];
+         tmp = fold_build2_loc (input_location, PLUS_EXPR,
+                                gfc_array_index_type, tmp, gfc_index_one_node);
+         size = fold_build2_loc (input_location, MULT_EXPR,
+                                 gfc_array_index_type, size, tmp);
        }
-      else
-       tmp = loop->to[i];
-      tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
-                            tmp, gfc_index_one_node);
-      size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
-                             size, tmp);
     }
 
   return size;