This patch consolidates some repetitive code from gfc_trans_omp_clauses
into new functions, and adds some comments. There are no functional
changes.
gcc/fortran/ChangeLog
* trans-openmp.cc (handle_iterator): Add comments. Rename
iter_block parameter to outer_block, since that's what's actually
being passed; the start/end/step expressions are outside the scope
of the iterator variables.
(start_iterator_group, finish_iterator_group): New functions,
broken out from...
(gfc_trans_omp_clauses): ...here.
---
gcc/fortran/trans-openmp.cc | 160 +++++++++++++++++++-----------------
1 file changed, 85 insertions(+), 75 deletions(-)
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index aa4e8ebfa23..2ee633bf8de 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -3561,8 +3561,12 @@ gfc_trans_omp_array_section (stmtblock_t *block,
gfc_exec_op op,
ptr, base);
}
+/* Construct a list of omp_iterator objects for the iterators specified
+ in NS. Initialization statements for the start/end/step expressions
+ are added to OUTER_BLOCK. BLOCK is the tree block that contains the
+ iterator variable bindings. */
static tree
-handle_iterator (gfc_namespace *ns, stmtblock_t *iter_block, tree block)
+handle_iterator (gfc_namespace *ns, stmtblock_t *outer_block, tree block)
{
tree list = NULL_TREE;
for (gfc_symbol *sym = ns->omp_affinity_iterators; sym; sym = sym->tlink)
@@ -3581,20 +3585,20 @@ handle_iterator (gfc_namespace *ns, stmtblock_t
*iter_block, tree block)
c = gfc_constructor_first (sym->value->value.constructor);
gfc_init_se (&se, NULL);
gfc_conv_expr (&se, c->expr);
- gfc_add_block_to_block (iter_block, &se.pre);
- gfc_add_block_to_block (iter_block, &se.post);
+ gfc_add_block_to_block (outer_block, &se.pre);
+ gfc_add_block_to_block (outer_block, &se.post);
OMP_ITERATOR_BEGIN (last) = fold_convert (type,
gfc_evaluate_now (se.expr,
- iter_block));
+ outer_block));
/* end */
c = gfc_constructor_next (c);
gfc_init_se (&se, NULL);
gfc_conv_expr (&se, c->expr);
- gfc_add_block_to_block (iter_block, &se.pre);
- gfc_add_block_to_block (iter_block, &se.post);
+ gfc_add_block_to_block (outer_block, &se.pre);
+ gfc_add_block_to_block (outer_block, &se.post);
OMP_ITERATOR_END (last) = fold_convert (type,
gfc_evaluate_now (se.expr,
- iter_block));
+ outer_block));
/* step */
c = gfc_constructor_next (c);
tree step;
@@ -3602,12 +3606,12 @@ handle_iterator (gfc_namespace *ns, stmtblock_t
*iter_block, tree block)
{
gfc_init_se (&se, NULL);
gfc_conv_expr (&se, c->expr);
- gfc_add_block_to_block (iter_block, &se.pre);
- gfc_add_block_to_block (iter_block, &se.post);
+ gfc_add_block_to_block (outer_block, &se.pre);
+ gfc_add_block_to_block (outer_block, &se.post);
gfc_conv_expr (&se, c->expr);
step = fold_convert (type,
gfc_evaluate_now (se.expr,
- iter_block));
+ outer_block));
}
else
step = build_int_cst (type, 1);
@@ -3620,6 +3624,58 @@ handle_iterator (gfc_namespace *ns, stmtblock_t
*iter_block, tree block)
return list;
}
+/* Start an iterator group for the iterators in NS. OUTER_BLOCK is the
+ statement block to hold side-effects from evaluating the iterator
+ start/end/step expressions, and ITER_BLOCK is set to a newly initialized
+ block for the scope of the iterators. TREE_BLOCK is set to a new
+ tree BLOCK node to hold the iterator variables. Returns the list of
+ omp_iterator objects, as per handle_iterator above. */
+static tree
+start_iterator_group (gfc_namespace *ns, stmtblock_t *outer_block,
+ stmtblock_t *iter_block, tree &tree_block)
+{
+ gfc_init_block (iter_block);
+ tree_block = make_node (BLOCK);
+ TREE_USED (tree_block) = 1;
+ BLOCK_VARS (tree_block) = NULL_TREE;
+ return handle_iterator (ns, outer_block, tree_block);
+}
+
+/* Finish an iterator group. LIST identifies the namelist type for the
+ clause. ITER_BLOCK is the statement block within the scope of the
+ iterators, and TREE_BLOCK is the block for the iterator variables.
+ ITERATOR is the list of omp_iterator objects as previously returned by
+ start_iterator_group. OMP_CLAUSES is the list of clauses the iterators
+ apply to, ending at PREV_CLAUSES. */
+static void
+finish_iterator_group (int list, stmtblock_t *iter_block, tree tree_block,
+ tree iterator, tree omp_clauses, tree prev_clauses)
+{
+ gcc_assert (iterator);
+ BLOCK_SUBBLOCKS (tree_block) = gfc_finish_block (iter_block);
+ OMP_ITERATOR_BLOCK (iterator) = tree_block;
+ for (tree c = omp_clauses; c != prev_clauses; c = OMP_CLAUSE_CHAIN (c))
+ switch (list)
+ {
+ case OMP_LIST_AFFINITY:
+ case OMP_LIST_DEPEND:
+ OMP_CLAUSE_DECL (c) = build_tree_list (iterator, OMP_CLAUSE_DECL (c));
+ break;
+ case OMP_LIST_MAP:
+ if (OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_FIRSTPRIVATE_POINTER
+ && OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_FIRSTPRIVATE_REFERENCE)
+ OMP_CLAUSE_ITERATORS (c) = iterator;
+ break;
+ case OMP_LIST_TO:
+ case OMP_LIST_FROM:
+ case OMP_LIST_CACHE:
+ OMP_CLAUSE_ITERATORS (c) = iterator;
+ break;
+ default:
+ gcc_unreachable ();
+ }
+}
+
/* To alleviate quadratic behaviour in checking each entry of a
gfc_omp_namelist against every other entry, we build a hashtable indexed by
gfc_symbol pointer, which we can use in the usual case that a map
@@ -4204,24 +4260,15 @@ gfc_trans_omp_clauses (stmtblock_t *block,
gfc_omp_clauses *clauses,
{
if (iterator && prev->u2.ns != n->u2.ns)
{
- BLOCK_SUBBLOCKS (tree_block) = gfc_finish_block (&iter_block);
- OMP_ITERATOR_BLOCK (iterator) = tree_block;
- for (tree c = omp_clauses; c != prev_clauses;
- c = OMP_CLAUSE_CHAIN (c))
- OMP_CLAUSE_DECL (c) = build_tree_list (iterator,
- OMP_CLAUSE_DECL (c));
+ finish_iterator_group (list, &iter_block, tree_block,
+ iterator, omp_clauses, prev_clauses);
prev_clauses = omp_clauses;
iterator = NULL_TREE;
}
if (n->u2.ns && (!prev || prev->u2.ns != n->u2.ns))
- {
- gfc_init_block (&iter_block);
- tree_block = make_node (BLOCK);
- TREE_USED (tree_block) = 1;
- BLOCK_VARS (tree_block) = NULL_TREE;
- iterator = handle_iterator (n->u2.ns, block,
- tree_block);
- }
+
+ iterator = start_iterator_group (n->u2.ns, block, &iter_block,
+ tree_block);
if (!iterator)
gfc_init_block (&iter_block);
prev = n;
@@ -4364,14 +4411,8 @@ gfc_trans_omp_clauses (stmtblock_t *block,
gfc_omp_clauses *clauses,
omp_clauses = gfc_trans_add_clause (node, omp_clauses);
}
if (iterator)
- {
- BLOCK_SUBBLOCKS (tree_block) = gfc_finish_block (&iter_block);
- OMP_ITERATOR_BLOCK (iterator) = tree_block;
- for (tree c = omp_clauses; c != prev_clauses;
- c = OMP_CLAUSE_CHAIN (c))
- OMP_CLAUSE_DECL (c) = build_tree_list (iterator,
- OMP_CLAUSE_DECL (c));
- }
+ finish_iterator_group (list, &iter_block, tree_block,
+ iterator, omp_clauses, prev_clauses);
break;
case OMP_LIST_MAP:
iterator = NULL_TREE;
@@ -4421,26 +4462,16 @@ gfc_trans_omp_clauses (stmtblock_t *block,
gfc_omp_clauses *clauses,
if (iterator && prev->u2.ns != n->u2.ns)
{
- /* Finish previous iterator group. */
- BLOCK_SUBBLOCKS (tree_block) = gfc_finish_block (&iter_block);
- OMP_ITERATOR_BLOCK (iterator) = tree_block;
- for (tree c = omp_clauses; c != prev_clauses;
- c = OMP_CLAUSE_CHAIN (c))
- if (OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_FIRSTPRIVATE_POINTER
- && OMP_CLAUSE_MAP_KIND (c) !=
GOMP_MAP_FIRSTPRIVATE_REFERENCE)
- OMP_CLAUSE_ITERATORS (c) = iterator;
+ finish_iterator_group (list, &iter_block, tree_block,
+ iterator, omp_clauses, prev_clauses);
prev_clauses = omp_clauses;
iterator = NULL_TREE;
}
if (n->u2.ns && (!prev || prev->u2.ns != n->u2.ns))
{
- /* Start a new iterator group. */
- gfc_init_block (&iter_block);
- tree_block = make_node (BLOCK);
- TREE_USED (tree_block) = 1;
- BLOCK_VARS (tree_block) = NULL_TREE;
+ iterator = start_iterator_group (n->u2.ns, block,
+ &iter_block, tree_block);
prev_clauses = omp_clauses;
- iterator = handle_iterator (n->u2.ns, block, tree_block);
}
if (!iterator)
gfc_init_block (&iter_block);
@@ -5322,16 +5353,8 @@ gfc_trans_omp_clauses (stmtblock_t *block,
gfc_omp_clauses *clauses,
omp_clauses = gfc_trans_add_clause (node5, omp_clauses);
}
if (iterator)
- {
- /* Finish last iterator group. */
- BLOCK_SUBBLOCKS (tree_block) = gfc_finish_block (&iter_block);
- OMP_ITERATOR_BLOCK (iterator) = tree_block;
- for (tree c = omp_clauses; c != prev_clauses;
- c = OMP_CLAUSE_CHAIN (c))
- if (OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_FIRSTPRIVATE_POINTER
- && OMP_CLAUSE_MAP_KIND (c) !=
GOMP_MAP_FIRSTPRIVATE_REFERENCE)
- OMP_CLAUSE_ITERATORS (c) = iterator;
- }
+ finish_iterator_group (list, &iter_block, tree_block,
+ iterator, omp_clauses, prev_clauses);
break;
case OMP_LIST_TO:
case OMP_LIST_FROM:
@@ -5347,24 +5370,17 @@ gfc_trans_omp_clauses (stmtblock_t *block,
gfc_omp_clauses *clauses,
if (iterator && prev->u2.ns != n->u2.ns)
{
- /* Finish previous iterator group. */
- BLOCK_SUBBLOCKS (tree_block) = gfc_finish_block (&iter_block);
- OMP_ITERATOR_BLOCK (iterator) = tree_block;
- for (tree c = omp_clauses; c != prev_clauses;
- c = OMP_CLAUSE_CHAIN (c))
- OMP_CLAUSE_ITERATORS (c) = iterator;
+ finish_iterator_group (list, &iter_block, tree_block,
+ iterator, omp_clauses, prev_clauses);
prev_clauses = omp_clauses;
iterator = NULL_TREE;
}
if (n->u2.ns && (!prev || prev->u2.ns != n->u2.ns))
{
/* Start a new iterator group. */
- gfc_init_block (&iter_block);
- tree_block = make_node (BLOCK);
- TREE_USED (tree_block) = 1;
- BLOCK_VARS (tree_block) = NULL_TREE;
+ iterator = start_iterator_group (n->u2.ns, block,
+ &iter_block, tree_block);
prev_clauses = omp_clauses;
- iterator = handle_iterator (n->u2.ns, block, tree_block);
}
if (!iterator)
gfc_init_block (&iter_block);
@@ -5466,14 +5482,8 @@ gfc_trans_omp_clauses (stmtblock_t *block,
gfc_omp_clauses *clauses,
omp_clauses = gfc_trans_add_clause (node, omp_clauses);
}
if (iterator)
- {
- /* Finish last iterator group. */
- BLOCK_SUBBLOCKS (tree_block) = gfc_finish_block (&iter_block);
- OMP_ITERATOR_BLOCK (iterator) = tree_block;
- for (tree c = omp_clauses; c != prev_clauses;
- c = OMP_CLAUSE_CHAIN (c))
- OMP_CLAUSE_ITERATORS (c) = iterator;
- }
+ finish_iterator_group (list, &iter_block, tree_block,
+ iterator, omp_clauses, prev_clauses);
break;
case OMP_LIST_USES_ALLOCATORS:
for (; n != NULL; n = n->next)
--
2.39.5