Hi!

It isn't entirely clear to me why all the tests in the testsuite happen to
pass, but in the simdlen(1)/if(simd:0) for simd loops lastprivate
conditional variables private in the simd need to be copied to the private
variables in the worksharing loop unconditionally at the end of the simd
loop, not only at the end of simd loop which ran the last iteration.

FIxed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
committed to trunk.

2019-07-06  Jakub Jelinek  <ja...@redhat.com>

        * omp-low.c (struct omp_context): Rename combined_into_simd_safelen0
        member to combined_into_simd_safelen1.
        (lower_rec_input_clauses, lower_omp_1): Adjust uses.
        (lower_lastprivate_clauses): Likewise.  For conditional lastprivate
        clauses if ctx->combined_into_simd_safelen1 put statements after the
        predicate conditionalized block rather than into it.

--- gcc/omp-low.c.jj    2019-07-06 09:51:48.363290048 +0200
+++ gcc/omp-low.c       2019-07-06 16:48:02.373495843 +0200
@@ -140,7 +140,7 @@ struct omp_context
 
   /* True if lower_omp_1 should look up lastprivate conditional in parent
      context.  */
-  bool combined_into_simd_safelen0;
+  bool combined_into_simd_safelen1;
 
   /* True if there is nested scan context with inclusive clause.  */
   bool scan_inclusive;
@@ -5703,7 +5703,7 @@ lower_rec_input_clauses (tree clauses, g
          if (gimple_omp_for_combined_into_p (ctx->stmt))
            {
              /* Signal to lower_omp_1 that it should use parent context.  */
-             ctx->combined_into_simd_safelen0 = true;
+             ctx->combined_into_simd_safelen1 = true;
              for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
                if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
                    && OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c))
@@ -6018,6 +6018,7 @@ lower_lastprivate_clauses (tree clauses,
   bool par_clauses = false;
   tree simduid = NULL, lastlane = NULL, simtcond = NULL, simtlast = NULL;
   unsigned HOST_WIDE_INT conditional_off = 0;
+  gimple_seq post_stmt_list = NULL;
 
   /* Early exit if there are no lastprivate or linear clauses.  */
   for (; clauses ; clauses = OMP_CLAUSE_CHAIN (clauses))
@@ -6107,7 +6108,7 @@ lower_lastprivate_clauses (tree clauses,
       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
          && OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c)
          && ctx->lastprivate_conditional_map
-         && !ctx->combined_into_simd_safelen0)
+         && !ctx->combined_into_simd_safelen1)
        {
          gcc_assert (body_p);
          if (simduid)
@@ -6144,6 +6145,12 @@ lower_lastprivate_clauses (tree clauses,
          gimple_seq_add_stmt (this_stmt_list, gimple_build_label (lab1));
          gimplify_assign (mem2, v, this_stmt_list);
        }
+      else if (predicate
+              && ctx->combined_into_simd_safelen1
+              && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
+              && OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c)
+              && ctx->lastprivate_conditional_map)
+       this_stmt_list = &post_stmt_list;
 
       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
          || (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
@@ -6274,6 +6281,7 @@ lower_lastprivate_clauses (tree clauses,
 
   if (label)
     gimple_seq_add_stmt (stmt_list, gimple_build_label (label));
+  gimple_seq_add_seq (stmt_list, post_stmt_list);
 }
 
 /* Lower the OpenACC reductions of CLAUSES for compute axis LEVEL
@@ -12412,7 +12420,7 @@ lower_omp_1 (gimple_stmt_iterator *gsi_p
            if (tree *v = up->lastprivate_conditional_map->get (lhs))
              {
                tree clauses;
-               if (up->combined_into_simd_safelen0)
+               if (up->combined_into_simd_safelen1)
                  up = up->outer;
                if (gimple_code (up->stmt) == GIMPLE_OMP_FOR)
                  clauses = gimple_omp_for_clauses (up->stmt);

        Jakub

Reply via email to