This patch updates how the OpenACC device, self and host clauses are handled in gfortan. Specifically these clauses now map to OMP_MAP_FORCE_TO (host) and OMP_MAP_FORCE_FROM (device and self) in a similar fashion to the c/c++ front ends.
I've also included a minor cleanup to gfc_trans_oacc_executable_directive. That function no longer gets called to process the wait directive, so I made that function aware of that. The wait patch still has not been checked in yet because it depends on some middle end support which hasn't gone into gomp-4_0-branch yet. Therefore, I'll hold of committing this patch until the wait patch goes in. It this OK for gomp-4_0-branch? Thanks, Cesar
2014-10-20 Cesar Philippidis <ce...@codesourcery.com> gcc/fortran/ * gfortran.h (enum OMP_LIST_HOST): Remove. (enum OMP_LIST_DEVICE): Remove. * dump-parse-tree.c (show_omp_clauses): Remove OMP_LIST_HOST and OMP_LIST_DEVICE from here also. * openmp.c (OMP_CLAUSE_SELF): New define. (gfc_match_omp_clauses): Update handling of OMP_CLAUSE_HOST and OMP_CLAUSE_DEVICE. Add support for OMP_CLAUSE_SELF. * trans-openmp.c (gfc_trans_omp_clauses): Remove support for OMP_LIST_HOST and OMP_LIST_DEVICE since they are treated as memory maps now. (gfc_trans_oacc_executable_directive): Remove stale EXEC_OACC_WAIT. diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c index f85f6b6..57af730 100644 --- a/gcc/fortran/dump-parse-tree.c +++ b/gcc/fortran/dump-parse-tree.c @@ -1255,8 +1255,6 @@ show_omp_clauses (gfc_omp_clauses *omp_clauses) case OMP_LIST_DEVICEPTR: type = "DEVICEPTR"; break; case OMP_LIST_USE_DEVICE: type = "USE_DEVICE"; break; case OMP_LIST_DEVICE_RESIDENT: type = "USE_DEVICE"; break; - case OMP_LIST_HOST: type = "HOST"; break; - case OMP_LIST_DEVICE: type = "DEVICE"; break; case OMP_LIST_CACHE: type = ""; break; case OMP_LIST_PRIVATE: type = "PRIVATE"; break; case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break; diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index cdcd002..42afdc9 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1188,8 +1188,6 @@ enum OMP_LIST_DATA_CLAUSE_LAST = OMP_LIST_DEVICEPTR, OMP_LIST_DEVICE_RESIDENT, OMP_LIST_USE_DEVICE, - OMP_LIST_HOST, - OMP_LIST_DEVICE, OMP_LIST_CACHE, OMP_LIST_NUM, OMP_LIST_LAST = OMP_LIST_NUM diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 1970730..c7af004 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -451,6 +451,7 @@ match_oacc_clause_gang (gfc_omp_clauses *cp) #define OMP_CLAUSE_DELETE (1ULL << 55) #define OMP_CLAUSE_AUTO (1ULL << 56) #define OMP_CLAUSE_TILE (1ULL << 57) +#define OMP_CLAUSE_SELF (1ULL << 58) /* Helper function for OpenACC and OpenMP clauses involving memory mapping. */ @@ -682,18 +683,23 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, unsigned long long mask, == MATCH_YES) continue; if ((mask & OMP_CLAUSE_HOST) - && gfc_match_omp_variable_list ("host (", - &c->lists[OMP_LIST_HOST], true) - == MATCH_YES) + && gfc_match ("host ( ") == MATCH_YES + && gfc_match_omp_map_clause (&c->lists[OMP_LIST_MAP], + OMP_MAP_FORCE_FROM)) continue; if ((mask & OMP_CLAUSE_OACC_DEVICE) - && gfc_match_omp_variable_list ("device (", - &c->lists[OMP_LIST_DEVICE], true) - == MATCH_YES) + && gfc_match ("device ( ") == MATCH_YES + && gfc_match_omp_map_clause (&c->lists[OMP_LIST_MAP], + OMP_MAP_FORCE_TO)) continue; if ((mask & OMP_CLAUSE_TILE) && match_oacc_expr_list ("tile (", &c->tile_list, true) == MATCH_YES) continue; + if ((mask & OMP_CLAUSE_SELF) + && gfc_match ("self ( ") == MATCH_YES + && gfc_match_omp_map_clause (&c->lists[OMP_LIST_MAP], + OMP_MAP_FORCE_FROM)) + continue; if ((mask & OMP_CLAUSE_SEQ) && !c->seq && gfc_match ("seq") == MATCH_YES) { @@ -1164,7 +1170,8 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, unsigned long long mask, | OMP_CLAUSE_PRESENT_OR_COPYIN | OMP_CLAUSE_PRESENT_OR_COPYOUT \ | OMP_CLAUSE_PRESENT_OR_CREATE) #define OACC_UPDATE_CLAUSES \ - (OMP_CLAUSE_IF | OMP_CLAUSE_ASYNC | OMP_CLAUSE_HOST | OMP_CLAUSE_OACC_DEVICE) + (OMP_CLAUSE_IF | OMP_CLAUSE_ASYNC | OMP_CLAUSE_HOST | OMP_CLAUSE_SELF \ + | OMP_CLAUSE_OACC_DEVICE | OMP_CLAUSE_WAIT) #define OACC_ENTER_DATA_CLAUSES \ (OMP_CLAUSE_IF | OMP_CLAUSE_ASYNC | OMP_CLAUSE_WAIT | OMP_CLAUSE_COPYIN \ | OMP_CLAUSE_CREATE | OMP_CLAUSE_PRESENT_OR_COPYIN \ diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index 23628e8..ce97dc4 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -1796,12 +1796,6 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, case OMP_LIST_DEVICE_RESIDENT: clause_code = OMP_CLAUSE_DEVICE_RESIDENT; goto add_clause; - case OMP_LIST_HOST: - clause_code = OMP_CLAUSE_HOST; - goto add_clause; - case OMP_LIST_DEVICE: - clause_code = OMP_CLAUSE_OACC_DEVICE; - goto add_clause; case OMP_LIST_CACHE: clause_code = OMP_NO_CLAUSE_CACHE; goto add_clause; @@ -2548,17 +2542,14 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, if (clauses->wait_list) { gfc_expr_list *el; - tree list = NULL; for (el = clauses->wait_list; el; el = el->next) { c = build_omp_clause (where.lb->location, OMP_CLAUSE_WAIT); OMP_CLAUSE_DECL (c) = gfc_convert_expr_to_tree (block, el->expr); - OMP_CLAUSE_CHAIN (c) = list; - list = c; + OMP_CLAUSE_CHAIN (c) = omp_clauses; + omp_clauses = c; } - - omp_clauses = list; } if (clauses->num_gangs_expr) { @@ -2716,9 +2707,6 @@ gfc_trans_oacc_executable_directive (gfc_code *code) case EXEC_OACC_EXIT_DATA: construct_code = OACC_EXIT_DATA; break; - case EXEC_OACC_WAIT: - construct_code = OACC_WAIT; - break; case EXEC_OACC_CACHE: construct_code = OACC_CACHE; break;