diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-18 18:17:08 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-01-18 18:17:08 +0000 |
commit | d6de944394df3fdcba3272c4ae0626d0f328d06e (patch) | |
tree | 8e73ebedbd664148992d609d0ca894ca246ff53c /gcc/fortran/trans-stmt.c | |
parent | 58f4ce52a1be9bd6554b62589e433797b3120a82 (diff) | |
download | gcc-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.c | 30 |
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"); |