]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* trans-stmt.c (compute_overall_iter_number): Enhance to precompute
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 18 Jan 2007 18:17:08 +0000 (18:17 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 18 Jan 2007 18:17:08 +0000 (18:17 +0000)
the number of interations in unconditional FORALL nests with constant
bounds.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120905 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 55c5ecedf92a00dc1d6434f32e02e17f265abd19..4c1a3c528e74a41045357f4f89db94ff59f6290d 100644 (file)
@@ -1,3 +1,9 @@
+2007-01-18  Roger Sayle  <roger@eyesopen.com>
+
+       * trans-stmt.c (compute_overall_iter_number): Enhance to precompute
+       the number of interations in unconditional FORALL nests with constant
+       bounds.
+
 2007-01-18  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
            Tobias Burnus  <burnus@net-b.de>
 
index 437aa3642484859e79492f504ee78004e5183bd1..c36d6faf0e9e154de3c8c96439906b8d9c999a55 100644 (file)
@@ -2034,9 +2034,33 @@ compute_overall_iter_number (forall_info *nested_forall_info, tree inner_size,
   tree tmp, number;
   stmtblock_t body;
 
-  /* Optimize the case for an outer-most loop with constant bounds.  */
-  if (INTEGER_CST_P (inner_size) && !nested_forall_info)
-    return inner_size;
+  /* Optimize the case of unconditional FORALL nests with constant bounds.  */
+  if (INTEGER_CST_P (inner_size))
+    {
+      bool all_const_p = true;
+      forall_info *forall_tmp;
+
+      /* First check whether all the bounds are constant.  */
+      for (forall_tmp = nested_forall_info;
+          forall_tmp;
+          forall_tmp = forall_tmp->next_nest)
+       if (forall_tmp->mask || !INTEGER_CST_P (forall_tmp->size))
+         {
+           all_const_p = false;
+           break;
+         }
+
+      if (all_const_p)
+       {
+         tree tmp = inner_size;
+         for (forall_tmp = nested_forall_info;
+              forall_tmp;
+              forall_tmp = forall_tmp->next_nest)
+           tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
+                              tmp, forall->size);
+         return tmp;
+       }
+    }
   
   /* TODO: optimizing the computing process.  */
   number = gfc_create_var (gfc_array_index_type, "num");