static tree gfc_trans_omp_parallel_do (gfc_code *code) { stmtblock_t block, *pblock = NULL; gfc_omp_clauses parallel_clauses, do_clauses; tree stmt, omp_clauses = NULL_TREE; gfc_start_block (&block); memset (&do_clauses, 0, sizeof (do_clauses)); if (code->ext.omp_clauses != NULL) { memcpy (¶llel_clauses, code->ext.omp_clauses, sizeof (parallel_clauses)); do_clauses.sched_kind = parallel_clauses.sched_kind; do_clauses.chunk_size = parallel_clauses.chunk_size; do_clauses.ordered = parallel_clauses.ordered; do_clauses.collapse = parallel_clauses.collapse; parallel_clauses.sched_kind = OMP_SCHED_NONE; parallel_clauses.chunk_size = NULL; parallel_clauses.ordered = false; parallel_clauses.collapse = 0; omp_clauses = gfc_trans_omp_clauses (&block, ¶llel_clauses, code->loc); } do_clauses.nowait = true; if (!do_clauses.ordered && do_clauses.sched_kind != OMP_SCHED_STATIC) pblock = █ else pushlevel (0); stmt = gfc_trans_omp_do (code, pblock, &do_clauses, omp_clauses); if (TREE_CODE (stmt) != BIND_EXPR) stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0)); else poplevel (0, 0, 0); stmt = build2 (OMP_PARALLEL, void_type_node, stmt, omp_clauses); OMP_PARALLEL_COMBINED (stmt) = 1; gfc_add_expr_to_block (&block, stmt); return gfc_finish_block (&block); }
static tree gfc_trans_omp_parallel_workshare (gfc_code *code) { stmtblock_t block; gfc_omp_clauses workshare_clauses; tree stmt, omp_clauses; memset (&workshare_clauses, 0, sizeof (workshare_clauses)); workshare_clauses.nowait = true; gfc_start_block (&block); omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses, code->loc); pushlevel (0); stmt = gfc_trans_omp_workshare (code, &workshare_clauses); if (TREE_CODE (stmt) != BIND_EXPR) stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0, 0)); else poplevel (0, 0, 0); stmt = build4_v (OMP_PARALLEL, stmt, omp_clauses, NULL, NULL); OMP_PARALLEL_COMBINED (stmt) = 1; gfc_add_expr_to_block (&block, stmt); return gfc_finish_block (&block); }