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