aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-06-05 09:52:23 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2019-06-05 09:52:23 +0200
commit0b887b756ab330b3d37e6831094510c435240b00 (patch)
treea77bf26a0bc59ac2242d306d5e54f9978c90eeb7
parent28b3a77ca055b31aa20c6d263be42c49be32756b (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/omp-expand.c24
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;