Dear Jakub, As you might have noticed, I am forced to spend a couple of months out from gfortran support in order to move from France back to the UK. I am therefore dealing very sporadically with patches. Since we seem to have entered a phase where all the other gfortran contributors have gone quiet, I suggest that where omp patches are concerned you commit when you are satisfied that all is well.
I have taken a rapid look through your patch and cannot see anything to object to. OK by me for trunk. Cheers Paul On 6 May 2016 at 21:32, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > This patch adds parsing of most of the OpenMP 4.5 clause changes, > though doesn't do anything during resolve or later with them yet. > Missing is still depend clause parsing changes (sink and source) and > link and to clause for declare target construct. > > 2016-05-06 Jakub Jelinek <ja...@redhat.com> > > * gfortran.h (enum gfc_omp_map_op): Add OMP_MAP_RELEASE, > OMP_MAP_ALWAYS_TO, OMP_MAP_ALWAYS_FROM and OMP_MAP_ALWAYS_TOFROM. > (OMP_LIST_IS_DEVICE_PTR, OMP_LIST_USE_DEVICE_PTR): New. > (enum gfc_omp_if_kind): New. > (struct gfc_omp_clauses): Add orderedc, defaultmap, nogroup, > sched_simd, sched_monotonic, sched_nonmonotonic, simd, threads, > grainsize, hint, num_tasks, priority and if_exprs fields. > * openmp.c (gfc_free_omp_clauses): Free grainsize, hint, num_tasks, > priority and if_exprs. > (enum omp_mask1): Add OMP_CLAUSE_DEFAULTMAP, OMP_CLAUSE_GRAINSIZE, > OMP_CLAUSE_HINT, OMP_CLAUSE_IS_DEVICE_PTR, OMP_CLAUSE_LINK, > OMP_CLAUSE_NOGROUP, OMP_CLAUSE_NUM_TASKS, OMP_CLAUSE_PRIORITY, > OMP_CLAUSE_SIMD, OMP_CLAUSE_THREADS, OMP_CLAUSE_USE_DEVICE_PTR > and OMP_CLAUSE_NOWAIT. > (enum omp_mask2): Remove OMP_CLAUSE_OACC_DEVICE and OMP_CLAUSE_LINK. > (gfc_match_omp_clauses): Move delete clause handling to where it > alphabetically belongs. Parse defaultmap, grainsize, hint, > is_device_ptr, nogroup, nowait, num_tasks, priority, simd, threads > and use_device_ptr clauses. Parse if clause modifier. Parse map > clause always modifier, and release and delete kinds. Parse ordered > clause with argument. Parse schedule clause modifiers. Differentiate > device clause parsing based on openacc flag. Guard link clause > parsing with openacc flag. > (OACC_UPDATE_CLAUSES): Replace OMP_CLAUSE_OACC_DEVICE with > OMP_CLAUSE_DEVICE. > (OMP_TASK_CLAUSES): Add OMP_CLAUSE_PRIORITY. > (OMP_TARGET_CLAUSES): Add OMP_CLAUSE_DEPEND, OMP_CLAUSE_NOWAIT, > OMP_CLAUSE_PRIVATE, OMP_CLAUSE_FIRSTPRIVATE, OMP_CLAUSE_DEFAULTMAP > and OMP_CLAUSE_IS_DEVICE_PTR. > (OMP_TARGET_DATA_CLAUSES): Add OMP_CLAUSE_USE_DEVICE_PTR. > (OMP_TARGET_UPDATE_CLAUSES): Add OMP_CLAUSE_DEPEND and > OMP_CLAUSE_NOWAIT. > (resolve_omp_clauses): Add dummy OMP_LIST_IS_DEVICE_PTR and > OMP_LIST_USE_DEVICE_PTR cases. > * frontend-passes.c (gfc_code_walker): Handle new OpenMP 4.5 > expressions. > * dump-parse-tree.c (show_omp_clauses): Adjust for OpenMP 4.5 > clause changes. > > --- gcc/fortran/gfortran.h.jj 2016-05-04 18:37:26.000000000 +0200 > +++ gcc/fortran/gfortran.h 2016-05-06 19:01:13.813857650 +0200 > @@ -1120,7 +1120,11 @@ enum gfc_omp_map_op > OMP_MAP_FORCE_PRESENT, > OMP_MAP_FORCE_DEVICEPTR, > OMP_MAP_DEVICE_RESIDENT, > - OMP_MAP_LINK > + OMP_MAP_LINK, > + OMP_MAP_RELEASE, > + OMP_MAP_ALWAYS_TO, > + OMP_MAP_ALWAYS_FROM, > + OMP_MAP_ALWAYS_TOFROM > }; > > /* For use in OpenMP clauses in case we need extra information > @@ -1165,6 +1169,8 @@ enum > OMP_LIST_LINK, > OMP_LIST_USE_DEVICE, > OMP_LIST_CACHE, > + OMP_LIST_IS_DEVICE_PTR, > + OMP_LIST_USE_DEVICE_PTR, > OMP_LIST_NUM > }; > > @@ -1207,6 +1213,19 @@ enum gfc_omp_cancel_kind > OMP_CANCEL_TASKGROUP > }; > > +enum gfc_omp_if_kind > +{ > + OMP_IF_PARALLEL, > + OMP_IF_TASK, > + OMP_IF_TASKLOOP, > + OMP_IF_TARGET, > + OMP_IF_TARGET_DATA, > + OMP_IF_TARGET_UPDATE, > + OMP_IF_TARGET_ENTER_DATA, > + OMP_IF_TARGET_EXIT_DATA, > + OMP_IF_LAST > +}; > + > typedef struct gfc_omp_clauses > { > struct gfc_expr *if_expr; > @@ -1216,9 +1235,11 @@ typedef struct gfc_omp_clauses > enum gfc_omp_sched_kind sched_kind; > struct gfc_expr *chunk_size; > enum gfc_omp_default_sharing default_sharing; > - int collapse; > + int collapse, orderedc; > bool nowait, ordered, untied, mergeable; > - bool inbranch, notinbranch; > + bool inbranch, notinbranch, defaultmap, nogroup; > + bool sched_simd, sched_monotonic, sched_nonmonotonic; > + bool simd, threads; > enum gfc_omp_cancel_kind cancel; > enum gfc_omp_proc_bind_kind proc_bind; > struct gfc_expr *safelen_expr; > @@ -1226,6 +1247,11 @@ typedef struct gfc_omp_clauses > struct gfc_expr *num_teams; > struct gfc_expr *device; > struct gfc_expr *thread_limit; > + struct gfc_expr *grainsize; > + struct gfc_expr *hint; > + struct gfc_expr *num_tasks; > + struct gfc_expr *priority; > + struct gfc_expr *if_exprs[OMP_IF_LAST]; > enum gfc_omp_sched_kind dist_sched_kind; > struct gfc_expr *dist_chunk_size; > > --- gcc/fortran/openmp.c.jj 2016-05-06 11:25:50.322794151 +0200 > +++ gcc/fortran/openmp.c 2016-05-06 19:00:17.642600199 +0200 > @@ -76,6 +76,12 @@ gfc_free_omp_clauses (gfc_omp_clauses *c > gfc_free_expr (c->device); > gfc_free_expr (c->thread_limit); > gfc_free_expr (c->dist_chunk_size); > + gfc_free_expr (c->grainsize); > + gfc_free_expr (c->hint); > + gfc_free_expr (c->num_tasks); > + gfc_free_expr (c->priority); > + for (i = 0; i < OMP_IF_LAST; i++) > + gfc_free_expr (c->if_exprs[i]); > gfc_free_expr (c->async_expr); > gfc_free_expr (c->gang_num_expr); > gfc_free_expr (c->gang_static_expr); > @@ -574,6 +580,18 @@ enum omp_mask1 > OMP_CLAUSE_NUM_TEAMS, > OMP_CLAUSE_THREAD_LIMIT, > OMP_CLAUSE_DIST_SCHEDULE, > + OMP_CLAUSE_DEFAULTMAP, > + OMP_CLAUSE_GRAINSIZE, > + OMP_CLAUSE_HINT, > + OMP_CLAUSE_IS_DEVICE_PTR, > + OMP_CLAUSE_LINK, > + OMP_CLAUSE_NOGROUP, > + OMP_CLAUSE_NUM_TASKS, > + OMP_CLAUSE_PRIORITY, > + OMP_CLAUSE_SIMD, > + OMP_CLAUSE_THREADS, > + OMP_CLAUSE_USE_DEVICE_PTR, > + OMP_CLAUSE_NOWAIT, > /* This must come last. */ > OMP_MASK1_LAST > }; > @@ -602,12 +620,10 @@ enum omp_mask2 > OMP_CLAUSE_USE_DEVICE, > OMP_CLAUSE_DEVICE_RESIDENT, > OMP_CLAUSE_HOST_SELF, > - OMP_CLAUSE_OACC_DEVICE, > OMP_CLAUSE_WAIT, > OMP_CLAUSE_DELETE, > OMP_CLAUSE_AUTO, > OMP_CLAUSE_TILE, > - OMP_CLAUSE_LINK, > /* This must come last. */ > OMP_MASK2_LAST > }; > @@ -867,11 +883,6 @@ gfc_match_omp_clauses (gfc_omp_clauses * > continue; > break; > case 'd': > - if ((mask & OMP_CLAUSE_DELETE) > - && gfc_match ("delete ( ") == MATCH_YES > - && gfc_match_omp_map_clause (&c->lists[OMP_LIST_MAP], > - OMP_MAP_DELETE)) > - continue; > if ((mask & OMP_CLAUSE_DEFAULT) > && c->default_sharing == OMP_DEFAULT_UNKNOWN) > { > @@ -888,6 +899,18 @@ gfc_match_omp_clauses (gfc_omp_clauses * > if (c->default_sharing != OMP_DEFAULT_UNKNOWN) > continue; > } > + if ((mask & OMP_CLAUSE_DEFAULTMAP) > + && !c->defaultmap > + && gfc_match ("defaultmap ( tofrom : scalar )") == MATCH_YES) > + { > + c->defaultmap = true; > + continue; > + } > + if ((mask & OMP_CLAUSE_DELETE) > + && gfc_match ("delete ( ") == MATCH_YES > + && gfc_match_omp_map_clause (&c->lists[OMP_LIST_MAP], > + OMP_MAP_DELETE)) > + continue; > if ((mask & OMP_CLAUSE_DEPEND) > && gfc_match ("depend ( ") == MATCH_YES) > { > @@ -917,10 +940,12 @@ gfc_match_omp_clauses (gfc_omp_clauses * > gfc_current_locus = old_loc; > } > if ((mask & OMP_CLAUSE_DEVICE) > + && !openacc > && c->device == NULL > && gfc_match ("device ( %e )", &c->device) == MATCH_YES) > continue; > - if ((mask & OMP_CLAUSE_OACC_DEVICE) > + if ((mask & OMP_CLAUSE_DEVICE) > + && openacc > && gfc_match ("device ( ") == MATCH_YES > && gfc_match_omp_map_clause (&c->lists[OMP_LIST_MAP], > OMP_MAP_FORCE_TO)) > @@ -990,8 +1015,16 @@ gfc_match_omp_clauses (gfc_omp_clauses * > needs_space = true; > continue; > } > + if ((mask & OMP_CLAUSE_GRAINSIZE) > + && c->grainsize == NULL > + && gfc_match ("grainsize ( %e )", &c->grainsize) == MATCH_YES) > + continue; > break; > case 'h': > + if ((mask & OMP_CLAUSE_HINT) > + && c->hint == NULL > + && gfc_match ("hint ( %e )", &c->hint) == MATCH_YES) > + continue; > if ((mask & OMP_CLAUSE_HOST_SELF) > && gfc_match ("host ( ") == MATCH_YES > && gfc_match_omp_map_clause (&c->lists[OMP_LIST_MAP], > @@ -1001,8 +1034,32 @@ gfc_match_omp_clauses (gfc_omp_clauses * > case 'i': > if ((mask & OMP_CLAUSE_IF) > && c->if_expr == NULL > - && gfc_match ("if ( %e )", &c->if_expr) == MATCH_YES) > - continue; > + && gfc_match ("if ( ") == MATCH_YES) > + { > + if (gfc_match ("%e )", &c->if_expr) == MATCH_YES) > + continue; > + if (!openacc) > + { > + /* This should match the enum gfc_omp_if_kind order. */ > + static const char *ifs[OMP_IF_LAST] = { > + " parallel : %e )", > + " task : %e )", > + " taskloop : %e )", > + " target : %e )", > + " target data : %e )", > + " target update : %e )", > + " target enter data : %e )", > + " target exit data : %e )" }; > + int i; > + for (i = 0; i < OMP_IF_LAST; i++) > + if (c->if_exprs[i] == NULL > + && gfc_match (ifs[i], &c->if_exprs[i]) == MATCH_YES) > + break; > + if (i < OMP_IF_LAST) > + continue; > + } > + gfc_current_locus = old_loc; > + } > if ((mask & OMP_CLAUSE_INBRANCH) > && !c->inbranch > && !c->notinbranch > @@ -1019,6 +1076,11 @@ gfc_match_omp_clauses (gfc_omp_clauses * > needs_space = true; > continue; > } > + if ((mask & OMP_CLAUSE_IS_DEVICE_PTR) > + && gfc_match_omp_variable_list > + ("is_device_ptr (", > + &c->lists[OMP_LIST_IS_DEVICE_PTR], false) == MATCH_YES) > + continue; > break; > case 'l': > if ((mask & OMP_CLAUSE_LASTPRIVATE) > @@ -1054,6 +1116,7 @@ gfc_match_omp_clauses (gfc_omp_clauses * > continue; > } > if ((mask & OMP_CLAUSE_LINK) > + && openacc > && (gfc_match_oacc_clause_link ("link (", > &c->lists[OMP_LIST_LINK]) > == MATCH_YES)) > @@ -1063,15 +1126,28 @@ gfc_match_omp_clauses (gfc_omp_clauses * > if ((mask & OMP_CLAUSE_MAP) > && gfc_match ("map ( ") == MATCH_YES) > { > + locus old_loc2 = gfc_current_locus; > + bool always = false; > gfc_omp_map_op map_op = OMP_MAP_TOFROM; > + if (gfc_match ("always , ") == MATCH_YES) > + always = true; > if (gfc_match ("alloc : ") == MATCH_YES) > map_op = OMP_MAP_ALLOC; > else if (gfc_match ("tofrom : ") == MATCH_YES) > - map_op = OMP_MAP_TOFROM; > + map_op = always ? OMP_MAP_ALWAYS_TOFROM : OMP_MAP_TOFROM; > else if (gfc_match ("to : ") == MATCH_YES) > - map_op = OMP_MAP_TO; > + map_op = always ? OMP_MAP_ALWAYS_TO : OMP_MAP_TO; > else if (gfc_match ("from : ") == MATCH_YES) > - map_op = OMP_MAP_FROM; > + map_op = always ? OMP_MAP_ALWAYS_FROM : OMP_MAP_FROM; > + else if (gfc_match ("release : ") == MATCH_YES) > + map_op = OMP_MAP_RELEASE; > + else if (gfc_match ("delete : ") == MATCH_YES) > + map_op = OMP_MAP_DELETE; > + else if (always) > + { > + gfc_current_locus = old_loc2; > + always = false; > + } > head = NULL; > if (gfc_match_omp_variable_list ("", &c->lists[OMP_LIST_MAP], > false, NULL, &head, > @@ -1093,6 +1169,13 @@ gfc_match_omp_clauses (gfc_omp_clauses * > } > break; > case 'n': > + if ((mask & OMP_CLAUSE_NOGROUP) > + && !c->nogroup > + && gfc_match ("nogroup") == MATCH_YES) > + { > + c->nogroup = needs_space = true; > + continue; > + } > if ((mask & OMP_CLAUSE_NOTINBRANCH) > && !c->notinbranch > && !c->inbranch > @@ -1101,11 +1184,22 @@ gfc_match_omp_clauses (gfc_omp_clauses * > c->notinbranch = needs_space = true; > continue; > } > + if ((mask & OMP_CLAUSE_NOWAIT) > + && !c->nowait > + && gfc_match ("nowait") == MATCH_YES) > + { > + c->nowait = needs_space = true; > + continue; > + } > if ((mask & OMP_CLAUSE_NUM_GANGS) > && c->num_gangs_expr == NULL > && gfc_match ("num_gangs ( %e )", > &c->num_gangs_expr) == MATCH_YES) > continue; > + if ((mask & OMP_CLAUSE_NUM_TASKS) > + && c->num_tasks == NULL > + && gfc_match ("num_tasks ( %e )", &c->num_tasks) == MATCH_YES) > + continue; > if ((mask & OMP_CLAUSE_NUM_TEAMS) > && c->num_teams == NULL > && gfc_match ("num_teams ( %e )", &c->num_teams) == MATCH_YES) > @@ -1126,7 +1220,31 @@ gfc_match_omp_clauses (gfc_omp_clauses * > && !c->ordered > && gfc_match ("ordered") == MATCH_YES) > { > - c->ordered = needs_space = true; > + gfc_expr *cexpr = NULL; > + match m = gfc_match (" ( %e )", &cexpr); > + > + c->ordered = true; > + if (m == MATCH_YES) > + { > + int ordered = 0; > + const char *p = gfc_extract_int (cexpr, &ordered); > + if (p) > + { > + gfc_error_now (p); > + ordered = 0; > + } > + else if (ordered <= 0) > + { > + gfc_error_now ("ORDERED clause argument not" > + " constant positive integer at %C"); > + ordered = 0; > + } > + c->orderedc = ordered; > + gfc_free_expr (cexpr); > + continue; > + } > + > + needs_space = true; > continue; > } > break; > @@ -1176,6 +1294,10 @@ gfc_match_omp_clauses (gfc_omp_clauses * > && gfc_match_omp_map_clause (&c->lists[OMP_LIST_MAP], > OMP_MAP_ALLOC)) > continue; > + if ((mask & OMP_CLAUSE_PRIORITY) > + && c->priority == NULL > + && gfc_match ("priority ( %e )", &c->priority) == MATCH_YES) > + continue; > if ((mask & OMP_CLAUSE_PRIVATE) > && gfc_match_omp_variable_list ("private (", > &c->lists[OMP_LIST_PRIVATE], > @@ -1325,6 +1447,45 @@ gfc_match_omp_clauses (gfc_omp_clauses * > && c->sched_kind == OMP_SCHED_NONE > && gfc_match ("schedule ( ") == MATCH_YES) > { > + int nmodifiers = 0; > + locus old_loc2 = gfc_current_locus; > + do > + { > + if (!c->sched_simd > + && gfc_match ("simd") == MATCH_YES) > + { > + c->sched_simd = true; > + nmodifiers++; > + } > + else if (!c->sched_monotonic > + && !c->sched_nonmonotonic > + && gfc_match ("monotonic") == MATCH_YES) > + { > + c->sched_monotonic = true; > + nmodifiers++; > + } > + else if (!c->sched_monotonic > + && !c->sched_nonmonotonic > + && gfc_match ("nonmonotonic") == MATCH_YES) > + { > + c->sched_nonmonotonic = true; > + nmodifiers++; > + } > + else > + { > + if (nmodifiers) > + gfc_current_locus = old_loc2; > + break; > + } > + if (nmodifiers == 0 > + && gfc_match (" , ") == MATCH_YES) > + continue; > + else if (gfc_match (" : ") == MATCH_YES) > + break; > + gfc_current_locus = old_loc2; > + break; > + } > + while (1); > if (gfc_match ("static") == MATCH_YES) > c->sched_kind = OMP_SCHED_STATIC; > else if (gfc_match ("dynamic") == MATCH_YES) > @@ -1373,6 +1534,13 @@ gfc_match_omp_clauses (gfc_omp_clauses * > && c->simdlen_expr == NULL > && gfc_match ("simdlen ( %e )", &c->simdlen_expr) == MATCH_YES) > continue; > + if ((mask & OMP_CLAUSE_SIMD) > + && !c->simd > + && gfc_match ("simd") == MATCH_YES) > + { > + c->simd = needs_space = true; > + continue; > + } > break; > case 't': > if ((mask & OMP_CLAUSE_THREAD_LIMIT) > @@ -1380,6 +1548,13 @@ gfc_match_omp_clauses (gfc_omp_clauses * > && gfc_match ("thread_limit ( %e )", > &c->thread_limit) == MATCH_YES) > continue; > + if ((mask & OMP_CLAUSE_THREADS) > + && !c->threads > + && gfc_match ("threads") == MATCH_YES) > + { > + c->threads = needs_space = true; > + continue; > + } > if ((mask & OMP_CLAUSE_TILE) > && !c->tile_list > && match_oacc_expr_list ("tile (", &c->tile_list, > @@ -1409,6 +1584,11 @@ gfc_match_omp_clauses (gfc_omp_clauses * > &c->lists[OMP_LIST_USE_DEVICE], > true) == MATCH_YES) > continue; > + if ((mask & OMP_CLAUSE_USE_DEVICE_PTR) > + && gfc_match_omp_variable_list > + ("use_device_ptr (", > + &c->lists[OMP_LIST_USE_DEVICE_PTR], false) == MATCH_YES) > + continue; > break; > case 'v': > if ((mask & OMP_CLAUSE_VECTOR) > @@ -1504,7 +1684,7 @@ gfc_match_omp_clauses (gfc_omp_clauses * > | OMP_CLAUSE_PRESENT_OR_CREATE | OMP_CLAUSE_LINK) > #define OACC_UPDATE_CLAUSES \ > (omp_mask (OMP_CLAUSE_IF) | OMP_CLAUSE_ASYNC | OMP_CLAUSE_HOST_SELF > \ > - | OMP_CLAUSE_OACC_DEVICE | OMP_CLAUSE_WAIT) > + | OMP_CLAUSE_DEVICE | OMP_CLAUSE_WAIT) > #define OACC_ENTER_DATA_CLAUSES \ > (omp_mask (OMP_CLAUSE_IF) | OMP_CLAUSE_ASYNC | OMP_CLAUSE_WAIT > \ > | OMP_CLAUSE_COPYIN | OMP_CLAUSE_CREATE | OMP_CLAUSE_PRESENT_OR_COPYIN > \ > @@ -1980,14 +2160,18 @@ cleanup: > (omp_mask (OMP_CLAUSE_PRIVATE) | OMP_CLAUSE_FIRSTPRIVATE \ > | OMP_CLAUSE_SHARED | OMP_CLAUSE_IF | OMP_CLAUSE_DEFAULT \ > | OMP_CLAUSE_UNTIED | OMP_CLAUSE_FINAL | OMP_CLAUSE_MERGEABLE \ > - | OMP_CLAUSE_DEPEND) > + | OMP_CLAUSE_DEPEND | OMP_CLAUSE_PRIORITY) > #define OMP_TARGET_CLAUSES \ > - (omp_mask (OMP_CLAUSE_DEVICE) | OMP_CLAUSE_MAP | OMP_CLAUSE_IF) > + (omp_mask (OMP_CLAUSE_DEVICE) | OMP_CLAUSE_MAP | OMP_CLAUSE_IF \ > + | OMP_CLAUSE_DEPEND | OMP_CLAUSE_NOWAIT | OMP_CLAUSE_PRIVATE > \ > + | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_DEFAULTMAP \ > + | OMP_CLAUSE_IS_DEVICE_PTR) > #define OMP_TARGET_DATA_CLAUSES \ > - (omp_mask (OMP_CLAUSE_DEVICE) | OMP_CLAUSE_MAP | OMP_CLAUSE_IF) > + (omp_mask (OMP_CLAUSE_DEVICE) | OMP_CLAUSE_MAP | OMP_CLAUSE_IF \ > + | OMP_CLAUSE_USE_DEVICE_PTR) > #define OMP_TARGET_UPDATE_CLAUSES \ > (omp_mask (OMP_CLAUSE_DEVICE) | OMP_CLAUSE_IF | OMP_CLAUSE_TO > \ > - | OMP_CLAUSE_FROM) > + | OMP_CLAUSE_FROM | OMP_CLAUSE_DEPEND | OMP_CLAUSE_NOWAIT) > #define OMP_TEAMS_CLAUSES \ > (omp_mask (OMP_CLAUSE_NUM_TEAMS) | OMP_CLAUSE_THREAD_LIMIT \ > | OMP_CLAUSE_DEFAULT | OMP_CLAUSE_PRIVATE | > OMP_CLAUSE_FIRSTPRIVATE \ > @@ -3668,6 +3852,10 @@ resolve_omp_clauses (gfc_code *code, gfc > n->sym->name, name, &n->where); > } > break; > + case OMP_LIST_IS_DEVICE_PTR: > + case OMP_LIST_USE_DEVICE_PTR: > + /* FIXME: Handle these. */ > + break; > default: > for (; n != NULL; n = n->next) > { > --- gcc/fortran/frontend-passes.c.jj 2016-05-04 18:37:32.000000000 +0200 > +++ gcc/fortran/frontend-passes.c 2016-05-06 18:57:25.319878198 +0200 > @@ -3633,6 +3633,12 @@ gfc_code_walker (gfc_code **c, walk_code > WALK_SUBEXPR (co->ext.omp_clauses->device); > WALK_SUBEXPR (co->ext.omp_clauses->thread_limit); > WALK_SUBEXPR (co->ext.omp_clauses->dist_chunk_size); > + WALK_SUBEXPR (co->ext.omp_clauses->grainsize); > + WALK_SUBEXPR (co->ext.omp_clauses->hint); > + WALK_SUBEXPR (co->ext.omp_clauses->num_tasks); > + WALK_SUBEXPR (co->ext.omp_clauses->priority); > + for (idx = 0; idx < OMP_IF_LAST; idx++) > + WALK_SUBEXPR (co->ext.omp_clauses->if_exprs[idx]); > for (idx = 0; > idx < sizeof (list_types) / sizeof (list_types[0]); > idx++) > --- gcc/fortran/dump-parse-tree.c.jj 2016-05-04 18:37:25.000000000 +0200 > +++ gcc/fortran/dump-parse-tree.c 2016-05-06 18:57:25.312878290 +0200 > @@ -1078,7 +1078,7 @@ show_omp_namelist (int list_type, gfc_om > static void > show_omp_clauses (gfc_omp_clauses *omp_clauses) > { > - int list_type; > + int list_type, i; > > switch (omp_clauses->cancel) > { > @@ -1200,7 +1200,20 @@ show_omp_clauses (gfc_omp_clauses *omp_c > default: > gcc_unreachable (); > } > - fprintf (dumpfile, " SCHEDULE (%s", type); > + fputs (" SCHEDULE (", dumpfile); > + if (omp_clauses->sched_simd) > + { > + if (omp_clauses->sched_monotonic > + || omp_clauses->sched_nonmonotonic) > + fputs ("SIMD, ", dumpfile); > + else > + fputs ("SIMD: ", dumpfile); > + } > + if (omp_clauses->sched_monotonic) > + fputs ("MONOTONIC: ", dumpfile); > + else if (omp_clauses->sched_nonmonotonic) > + fputs ("NONMONOTONIC: ", dumpfile); > + fputs (type, dumpfile); > if (omp_clauses->chunk_size) > { > fputc (',', dumpfile); > @@ -1251,7 +1264,12 @@ show_omp_clauses (gfc_omp_clauses *omp_c > if (omp_clauses->independent) > fputs (" INDEPENDENT", dumpfile); > if (omp_clauses->ordered) > - fputs (" ORDERED", dumpfile); > + { > + if (omp_clauses->orderedc) > + fprintf (dumpfile, " ORDERED(%d)", omp_clauses->orderedc); > + else > + fputs (" ORDERED", dumpfile); > + } > if (omp_clauses->untied) > fputs (" UNTIED", dumpfile); > if (omp_clauses->mergeable) > @@ -1277,6 +1295,8 @@ show_omp_clauses (gfc_omp_clauses *omp_c > case OMP_LIST_ALIGNED: type = "ALIGNED"; break; > case OMP_LIST_LINEAR: type = "LINEAR"; break; > case OMP_LIST_REDUCTION: type = "REDUCTION"; break; > + case OMP_LIST_IS_DEVICE_PTR: type = "IS_DEVICE_PTR"; break; > + case OMP_LIST_USE_DEVICE_PTR: type = "USE_DEVICE_PTR"; break; > case OMP_LIST_DEPEND: type = "DEPEND"; break; > default: > gcc_unreachable (); > @@ -1334,7 +1354,7 @@ show_omp_clauses (gfc_omp_clauses *omp_c > } > if (omp_clauses->dist_sched_kind != OMP_SCHED_NONE) > { > - fprintf (dumpfile, " DIST_SCHEDULE (static"); > + fprintf (dumpfile, " DIST_SCHEDULE (STATIC"); > if (omp_clauses->dist_chunk_size) > { > fputc (',', dumpfile); > @@ -1342,6 +1362,57 @@ show_omp_clauses (gfc_omp_clauses *omp_c > } > fputc (')', dumpfile); > } > + if (omp_clauses->defaultmap) > + fputs (" DEFALTMAP (TOFROM: SCALAR)", dumpfile); > + if (omp_clauses->nogroup) > + fputs (" NOGROUP", dumpfile); > + if (omp_clauses->simd) > + fputs (" SIMD", dumpfile); > + if (omp_clauses->threads) > + fputs (" THREADS", dumpfile); > + if (omp_clauses->grainsize) > + { > + fputs (" GRAINSIZE(", dumpfile); > + show_expr (omp_clauses->grainsize); > + fputc (')', dumpfile); > + } > + if (omp_clauses->hint) > + { > + fputs (" HINT(", dumpfile); > + show_expr (omp_clauses->hint); > + fputc (')', dumpfile); > + } > + if (omp_clauses->num_tasks) > + { > + fputs (" NUM_TASKS(", dumpfile); > + show_expr (omp_clauses->num_tasks); > + fputc (')', dumpfile); > + } > + if (omp_clauses->priority) > + { > + fputs (" PRIORITY(", dumpfile); > + show_expr (omp_clauses->priority); > + fputc (')', dumpfile); > + } > + for (i = 0; i < OMP_IF_LAST; i++) > + if (omp_clauses->if_exprs[i]) > + { > + static const char *ifs[] = { > + "PARALLEL", > + "TASK", > + "TASKLOOP", > + "TARGET", > + "TARGET DATA", > + "TARGET UPDATE", > + "TARGET ENTER DATA", > + "TARGET EXIT DATA" > + }; > + fputs (" IF(", dumpfile); > + fputs (ifs[i], dumpfile); > + fputs (": ", dumpfile); > + show_expr (omp_clauses->if_exprs[i]); > + fputc (')', dumpfile); > + } > } > > /* Show a single OpenMP or OpenACC directive node and everything underneath > it > > Jakub -- The difference between genius and stupidity is; genius has its limits. Albert Einstein