omp-expand.c (struct omp_region): Add has_lastprivate_conditional member.
authorJakub Jelinek <jakub@redhat.com>
Wed, 5 Jun 2019 07:52:23 +0000 (09:52 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 5 Jun 2019 07:52:23 +0000 (09:52 +0200)
* 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

gcc/ChangeLog
gcc/omp-expand.c

index cc706e207b57eab316e3be6106fd636d8ddf36d3..6dc657f943feea16d833d500a3130f19becffbc6 100644 (file)
@@ -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.
index 2eae8c02007b8f5c410f223cd2099a081e84deea..69344f449c9fea9030ea181de637deb274b4ee50 100644 (file)
@@ -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;