summaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-stmt.c
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-18 18:17:08 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-18 18:17:08 +0000
commitd6de944394df3fdcba3272c4ae0626d0f328d06e (patch)
tree8e73ebedbd664148992d609d0ca894ca246ff53c /gcc/fortran/trans-stmt.c
parent58f4ce52a1be9bd6554b62589e433797b3120a82 (diff)
downloadgcc-d6de944394df3fdcba3272c4ae0626d0f328d06e.tar.gz
* trans-stmt.c (compute_overall_iter_number): Enhance to precompute
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
Diffstat (limited to 'gcc/fortran/trans-stmt.c')
-rw-r--r--gcc/fortran/trans-stmt.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 437aa364248..c36d6faf0e9 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -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");