On 06/16/2016 08:30 PM, Cesar Philippidis wrote: > This patch introduces a match_acc function to the fortran FE. It's > almost identical to match_omp, but it passes openacc = true to > gfc_match_omp_clauses. I supposed I could have consolidated those two > functions, but they are reasonably simple so I left them separate. Maybe > a follow up patch can consolidate them. I was able to eliminate a lot of > duplicate code with this function. > > Is this ok for trunk and gcc-6?
And here's the patch. Cesar
2016-06-16 Cesar Philippidis <ce...@codesourcery.com> gcc/fortran/ * openmp.c (match_acc): New generic function to parse OpenACC directives. (gfc_match_oacc_parallel_loop): Use it. (gfc_match_oacc_parallel): Likewise. (gfc_match_oacc_kernels_loop): Likewise. (gfc_match_oacc_kernels): Likewise. (gfc_match_oacc_data): Likewise. (gfc_match_oacc_host_data): Likewise. (gfc_match_oacc_loop): Likewise. (gfc_match_oacc_enter_data): Likewise. (gfc_match_oacc_exit_data): Likewise. diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index b780f26..435c709 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -1412,63 +1412,101 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, uint64_t mask, (OMP_CLAUSE_GANG | OMP_CLAUSE_WORKER | OMP_CLAUSE_VECTOR | OMP_CLAUSE_SEQ) -static match -match_acc (gfc_exec_op op, uint64_t mask) +match +gfc_match_oacc_parallel_loop (void) { gfc_omp_clauses *c; - if (gfc_match_omp_clauses (&c, mask, false, false, true) != MATCH_YES) + if (gfc_match_omp_clauses (&c, OACC_PARALLEL_LOOP_CLAUSES, false, false, + true) != MATCH_YES) return MATCH_ERROR; - new_st.op = op; + + new_st.op = EXEC_OACC_PARALLEL_LOOP; new_st.ext.omp_clauses = c; return MATCH_YES; } -match -gfc_match_oacc_parallel_loop (void) -{ - return match_acc (EXEC_OACC_PARALLEL_LOOP, OACC_PARALLEL_LOOP_CLAUSES); -} - match gfc_match_oacc_parallel (void) { - return match_acc (EXEC_OACC_PARALLEL, OACC_PARALLEL_CLAUSES); + gfc_omp_clauses *c; + if (gfc_match_omp_clauses (&c, OACC_PARALLEL_CLAUSES, false, false, true) + != MATCH_YES) + return MATCH_ERROR; + + new_st.op = EXEC_OACC_PARALLEL; + new_st.ext.omp_clauses = c; + return MATCH_YES; } match gfc_match_oacc_kernels_loop (void) { - return match_acc (EXEC_OACC_KERNELS_LOOP, OACC_KERNELS_LOOP_CLAUSES); + gfc_omp_clauses *c; + if (gfc_match_omp_clauses (&c, OACC_KERNELS_LOOP_CLAUSES, false, false, + true) != MATCH_YES) + return MATCH_ERROR; + + new_st.op = EXEC_OACC_KERNELS_LOOP; + new_st.ext.omp_clauses = c; + return MATCH_YES; } match gfc_match_oacc_kernels (void) { - return match_acc (EXEC_OACC_KERNELS, OACC_KERNELS_CLAUSES); + gfc_omp_clauses *c; + if (gfc_match_omp_clauses (&c, OACC_KERNELS_CLAUSES, false, false, true) + != MATCH_YES) + return MATCH_ERROR; + + new_st.op = EXEC_OACC_KERNELS; + new_st.ext.omp_clauses = c; + return MATCH_YES; } match gfc_match_oacc_data (void) { - return match_acc (EXEC_OACC_DATA, OACC_DATA_CLAUSES); + gfc_omp_clauses *c; + if (gfc_match_omp_clauses (&c, OACC_DATA_CLAUSES, false, false, true) + != MATCH_YES) + return MATCH_ERROR; + + new_st.op = EXEC_OACC_DATA; + new_st.ext.omp_clauses = c; + return MATCH_YES; } match gfc_match_oacc_host_data (void) { - return match_acc (EXEC_OACC_HOST_DATA, OACC_HOST_DATA_CLAUSES); + gfc_omp_clauses *c; + if (gfc_match_omp_clauses (&c, OACC_HOST_DATA_CLAUSES, false, false, true) + != MATCH_YES) + return MATCH_ERROR; + + new_st.op = EXEC_OACC_HOST_DATA; + new_st.ext.omp_clauses = c; + return MATCH_YES; } match gfc_match_oacc_loop (void) { - return match_acc (EXEC_OACC_LOOP, OACC_LOOP_CLAUSES); + gfc_omp_clauses *c; + if (gfc_match_omp_clauses (&c, OACC_LOOP_CLAUSES, false, false, true) + != MATCH_YES) + return MATCH_ERROR; + + new_st.op = EXEC_OACC_LOOP; + new_st.ext.omp_clauses = c; + return MATCH_YES; } @@ -1580,14 +1618,28 @@ gfc_match_oacc_update (void) match gfc_match_oacc_enter_data (void) { - return match_acc (EXEC_OACC_ENTER_DATA, OACC_ENTER_DATA_CLAUSES); + gfc_omp_clauses *c; + if (gfc_match_omp_clauses (&c, OACC_ENTER_DATA_CLAUSES, false, false, true) + != MATCH_YES) + return MATCH_ERROR; + + new_st.op = EXEC_OACC_ENTER_DATA; + new_st.ext.omp_clauses = c; + return MATCH_YES; } match gfc_match_oacc_exit_data (void) { - return match_acc (EXEC_OACC_EXIT_DATA, OACC_EXIT_DATA_CLAUSES); + gfc_omp_clauses *c; + if (gfc_match_omp_clauses (&c, OACC_EXIT_DATA_CLAUSES, false, false, true) + != MATCH_YES) + return MATCH_ERROR; + + new_st.op = EXEC_OACC_EXIT_DATA; + new_st.ext.omp_clauses = c; + return MATCH_YES; }