diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-06-05 09:52:23 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-06-05 09:52:23 +0200 |
commit | 0b887b756ab330b3d37e6831094510c435240b00 (patch) | |
tree | a77bf26a0bc59ac2242d306d5e54f9978c90eeb7 | |
parent | 28b3a77ca055b31aa20c6d263be42c49be32756b (diff) | |
download | gcc-0b887b756ab330b3d37e6831094510c435240b00.zip gcc-0b887b756ab330b3d37e6831094510c435240b00.tar.gz gcc-0b887b756ab330b3d37e6831094510c435240b00.tar.bz2 |
omp-expand.c (struct omp_region): Add has_lastprivate_conditional member.
* omp-expand.c (struct omp_region): Add has_lastprivate_conditional
member.
(expand_parallel_call): If region->inner->has_lastprivate_conditional,
treat it like explicit monotonic schedule modifier.
(expand_omp_for): Initialize has_lastprivate_conditional.
If fd.lastprivate_conditional != 0, treat it like explicit monotonic
schedule modifier.
From-SVN: r271949
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/omp-expand.c | 24 |
2 files changed, 26 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cc706e2..6dc657f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2019-06-05 Jakub Jelinek <jakub@redhat.com> + * omp-expand.c (struct omp_region): Add has_lastprivate_conditional + member. + (expand_parallel_call): If region->inner->has_lastprivate_conditional, + treat it like explicit monotonic schedule modifier. + (expand_omp_for): Initialize has_lastprivate_conditional. + If fd.lastprivate_conditional != 0, treat it like explicit monotonic + schedule modifier. + * omp-low.c (lower_rec_input_clauses): For lastprivate conditional references, lookup in in hash map MEM_REF operand instead of the MEM_REF itself. diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c index 2eae8c0..69344f4 100644 --- a/gcc/omp-expand.c +++ b/gcc/omp-expand.c @@ -100,6 +100,9 @@ struct omp_region /* True if this is a combined parallel+workshare region. */ bool is_combined_parallel; + /* Copy of fd.lastprivate_conditional != 0. */ + bool has_lastprivate_conditional; + /* The ordered stmt if type is GIMPLE_OMP_ORDERED and it has a depend clause. */ gomp_ordered *ord_stmt; @@ -601,8 +604,12 @@ expand_parallel_call (struct omp_region *region, basic_block bb, switch (region->inner->sched_kind) { case OMP_CLAUSE_SCHEDULE_RUNTIME: - if ((region->inner->sched_modifiers - & OMP_CLAUSE_SCHEDULE_NONMONOTONIC) != 0) + /* For lastprivate(conditional:), our implementation + requires monotonic behavior. */ + if (region->inner->has_lastprivate_conditional != 0) + start_ix2 = 3; + else if ((region->inner->sched_modifiers + & OMP_CLAUSE_SCHEDULE_NONMONOTONIC) != 0) start_ix2 = 6; else if ((region->inner->sched_modifiers & OMP_CLAUSE_SCHEDULE_MONOTONIC) == 0) @@ -613,7 +620,8 @@ expand_parallel_call (struct omp_region *region, basic_block bb, case OMP_CLAUSE_SCHEDULE_DYNAMIC: case OMP_CLAUSE_SCHEDULE_GUIDED: if ((region->inner->sched_modifiers - & OMP_CLAUSE_SCHEDULE_MONOTONIC) == 0) + & OMP_CLAUSE_SCHEDULE_MONOTONIC) == 0 + && !region->inner->has_lastprivate_conditional) { start_ix2 = 3 + region->inner->sched_kind; break; @@ -6228,6 +6236,7 @@ expand_omp_for (struct omp_region *region, gimple *inner_stmt) &fd, loops); region->sched_kind = fd.sched_kind; region->sched_modifiers = fd.sched_modifiers; + region->has_lastprivate_conditional = fd.lastprivate_conditional != 0; gcc_assert (EDGE_COUNT (region->entry->succs) == 2); BRANCH_EDGE (region->entry)->flags &= ~EDGE_ABNORMAL; @@ -6280,14 +6289,16 @@ expand_omp_for (struct omp_region *region, gimple *inner_stmt) switch (fd.sched_kind) { case OMP_CLAUSE_SCHEDULE_RUNTIME: - if ((fd.sched_modifiers & OMP_CLAUSE_SCHEDULE_NONMONOTONIC) != 0) + if ((fd.sched_modifiers & OMP_CLAUSE_SCHEDULE_NONMONOTONIC) != 0 + && fd.lastprivate_conditional == 0) { gcc_assert (!fd.have_ordered); fn_index = 6; sched = 4; } else if ((fd.sched_modifiers & OMP_CLAUSE_SCHEDULE_MONOTONIC) == 0 - && !fd.have_ordered) + && !fd.have_ordered + && fd.lastprivate_conditional == 0) fn_index = 7; else { @@ -6298,7 +6309,8 @@ expand_omp_for (struct omp_region *region, gimple *inner_stmt) case OMP_CLAUSE_SCHEDULE_DYNAMIC: case OMP_CLAUSE_SCHEDULE_GUIDED: if ((fd.sched_modifiers & OMP_CLAUSE_SCHEDULE_MONOTONIC) == 0 - && !fd.have_ordered) + && !fd.have_ordered + && fd.lastprivate_conditional == 0) { fn_index = 3 + fd.sched_kind; sched = (fd.sched_kind == OMP_CLAUSE_SCHEDULE_GUIDED) + 2; |