diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2021-11-11 17:27:00 +0100 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2021-11-11 17:27:00 +0100 |
commit | 407eaad25f45ccba6e45e6f07d6c69c51cc567f3 (patch) | |
tree | d47e4ef29dbdf0ad836c7a4b48e989c1520fee35 /gcc/fortran/trans-openmp.c | |
parent | e1b218d1748136d02c99a5e5f3f664e9c5a563ed (diff) | |
download | gcc-407eaad25f45ccba6e45e6f07d6c69c51cc567f3.zip gcc-407eaad25f45ccba6e45e6f07d6c69c51cc567f3.tar.gz gcc-407eaad25f45ccba6e45e6f07d6c69c51cc567f3.tar.bz2 |
Fortran/openmp: Add support for 2 argument num_teams clause
Fortran part to commit r12-5146-g48d7327f2aaf65
gcc/fortran/ChangeLog:
* gfortran.h (struct gfc_omp_clauses): Rename num_teams to
num_teams_upper, add num_teams_upper.
* dump-parse-tree.c (show_omp_clauses): Update to handle
lower-bound num_teams clause.
* frontend-passes.c (gfc_code_walker): Likewise
* openmp.c (gfc_free_omp_clauses, gfc_match_omp_clauses,
resolve_omp_clauses): Likewise.
* trans-openmp.c (gfc_trans_omp_clauses, gfc_split_omp_clauses,
gfc_trans_omp_target): Likewise.
libgomp/ChangeLog:
* testsuite/libgomp.fortran/teams-1.f90: New test.
Diffstat (limited to 'gcc/fortran/trans-openmp.c')
-rw-r--r-- | gcc/fortran/trans-openmp.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index 22d6662..6bc7e9a 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -3927,18 +3927,27 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, } } - if (clauses->num_teams) + if (clauses->num_teams_upper) { - tree num_teams; + tree num_teams_lower = NULL_TREE, num_teams_upper; gfc_init_se (&se, NULL); - gfc_conv_expr (&se, clauses->num_teams); + gfc_conv_expr (&se, clauses->num_teams_upper); gfc_add_block_to_block (block, &se.pre); - num_teams = gfc_evaluate_now (se.expr, block); + num_teams_upper = gfc_evaluate_now (se.expr, block); gfc_add_block_to_block (block, &se.post); + if (clauses->num_teams_lower) + { + gfc_init_se (&se, NULL); + gfc_conv_expr (&se, clauses->num_teams_lower); + gfc_add_block_to_block (block, &se.pre); + num_teams_lower = gfc_evaluate_now (se.expr, block); + gfc_add_block_to_block (block, &se.post); + } c = build_omp_clause (gfc_get_location (&where), OMP_CLAUSE_NUM_TEAMS); - OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR (c) = num_teams; + OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (c) = num_teams_lower; + OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR (c) = num_teams_upper; omp_clauses = gfc_trans_add_clause (c, omp_clauses); } @@ -5873,8 +5882,10 @@ gfc_split_omp_clauses (gfc_code *code, if (mask & GFC_OMP_MASK_TEAMS) { /* First the clauses that are unique to some constructs. */ - clausesa[GFC_OMP_SPLIT_TEAMS].num_teams - = code->ext.omp_clauses->num_teams; + clausesa[GFC_OMP_SPLIT_TEAMS].num_teams_lower + = code->ext.omp_clauses->num_teams_lower; + clausesa[GFC_OMP_SPLIT_TEAMS].num_teams_upper + = code->ext.omp_clauses->num_teams_upper; clausesa[GFC_OMP_SPLIT_TEAMS].thread_limit = code->ext.omp_clauses->thread_limit; /* Shared and default clauses are allowed on parallel, teams @@ -6649,7 +6660,7 @@ gfc_trans_omp_target (gfc_code *code) break; default: if (flag_openmp - && (clausesa[GFC_OMP_SPLIT_TEAMS].num_teams + && (clausesa[GFC_OMP_SPLIT_TEAMS].num_teams_upper || clausesa[GFC_OMP_SPLIT_TEAMS].thread_limit)) { gfc_omp_clauses clausesb; @@ -6658,9 +6669,13 @@ gfc_trans_omp_target (gfc_code *code) thread_limit clauses are evaluated before entering the target construct. */ memset (&clausesb, '\0', sizeof (clausesb)); - clausesb.num_teams = clausesa[GFC_OMP_SPLIT_TEAMS].num_teams; + clausesb.num_teams_lower + = clausesa[GFC_OMP_SPLIT_TEAMS].num_teams_lower; + clausesb.num_teams_upper + = clausesa[GFC_OMP_SPLIT_TEAMS].num_teams_upper; clausesb.thread_limit = clausesa[GFC_OMP_SPLIT_TEAMS].thread_limit; - clausesa[GFC_OMP_SPLIT_TEAMS].num_teams = NULL; + clausesa[GFC_OMP_SPLIT_TEAMS].num_teams_lower = NULL; + clausesa[GFC_OMP_SPLIT_TEAMS].num_teams_upper = NULL; clausesa[GFC_OMP_SPLIT_TEAMS].thread_limit = NULL; teams_clauses = gfc_trans_omp_clauses (&block, &clausesb, code->loc); |