From: Jakub Jelinek Date: Wed, 3 Jul 2019 04:56:25 +0000 (+0200) Subject: gimplify.c (gimplify_scan_omp_clauses): For inscan reductions on worksharing loop... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=83eb9522087c0f1f152873da00ade34e5f3e67e5;p=gcc.git gimplify.c (gimplify_scan_omp_clauses): For inscan reductions on worksharing loop propagate it as shared clause to... * gimplify.c (gimplify_scan_omp_clauses): For inscan reductions on worksharing loop propagate it as shared clause to containing combined parallel. * c-omp.c (c_omp_split_clauses): Put OMP_CLAUSE_REDUCTION_INSCAN clauses on OMP_FOR rather than OMP_PARALLEL when OMP_FOR is combined with OMP_PARALLEL. * c-c++-common/gomp/scan-5.c: New test. From-SVN: r272957 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 58937b0496b..0f00fce6e38 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2019-07-03 Jakub Jelinek + * gimplify.c (gimplify_scan_omp_clauses): For inscan reductions + on worksharing loop propagate it as shared clause to containing + combined parallel. + * omp-expand.c (expand_omp_for_static_nochunk, expand_omp_for_static_chunk): For nowait worksharing loop with conditional lastprivate clause(s), emit GOMP_loop_end_nowait call diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index e56bd7a8e35..3907d3a5fff 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2019-07-03 Jakub Jelinek + + * c-omp.c (c_omp_split_clauses): Put OMP_CLAUSE_REDUCTION_INSCAN + clauses on OMP_FOR rather than OMP_PARALLEL when OMP_FOR is combined + with OMP_PARALLEL. + 2019-07-02 qing zhao PR preprocessor/90581 diff --git a/gcc/c-family/c-omp.c b/gcc/c-family/c-omp.c index 97206a122d2..583305e268b 100644 --- a/gcc/c-family/c-omp.c +++ b/gcc/c-family/c-omp.c @@ -1634,7 +1634,8 @@ c_omp_split_clauses (location_t loc, enum tree_code code, break; /* Reduction is allowed on simd, for, parallel, sections, taskloop and teams. Duplicate it on all of them, but omit on for or - sections if parallel is present. If taskloop is combined with + sections if parallel is present (unless inscan, in that case + omit on parallel). If taskloop is combined with parallel, omit it on parallel. */ case OMP_CLAUSE_REDUCTION: if (OMP_CLAUSE_REDUCTION_TASK (clauses)) @@ -1708,7 +1709,8 @@ c_omp_split_clauses (location_t loc, enum tree_code code, s = C_OMP_CLAUSE_SPLIT_PARALLEL; } else if ((mask & (OMP_CLAUSE_MASK_1 - << PRAGMA_OMP_CLAUSE_NUM_THREADS)) != 0) + << PRAGMA_OMP_CLAUSE_NUM_THREADS)) != 0 + && !OMP_CLAUSE_REDUCTION_INSCAN (clauses)) s = C_OMP_CLAUSE_SPLIT_PARALLEL; else s = C_OMP_CLAUSE_SPLIT_FOR; diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 5c51f504368..9e5e4230941 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -9125,7 +9125,10 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p, " or private in outer context", DECL_NAME (decl)); } do_notice: - if ((region_type & ORT_TASKLOOP) == ORT_TASKLOOP + if (((region_type & ORT_TASKLOOP) == ORT_TASKLOOP + || (region_type == ORT_WORKSHARE + && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION + && OMP_CLAUSE_REDUCTION_INSCAN (c))) && outer_ctx && outer_ctx->region_type == ORT_COMBINED_PARALLEL && (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5abcceec601..2e3999ed9ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2019-07-03 Jakub Jelinek + * c-c++-common/gomp/scan-5.c: New test. + * c-c++-common/gomp/lastprivate-conditional-5.c: New test. 2019-07-02 Jeff Law diff --git a/gcc/testsuite/c-c++-common/gomp/scan-5.c b/gcc/testsuite/c-c++-common/gomp/scan-5.c new file mode 100644 index 00000000000..92945bab016 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/scan-5.c @@ -0,0 +1,13 @@ +int +foo (int *a, int *b) +{ + int r = 0; + #pragma omp parallel for reduction (inscan, +:r) default(none) firstprivate (a, b) + for (int i = 0; i < 64; i++) + { + r += a[i]; + #pragma omp scan inclusive (r) /* { dg-message "sorry, unimplemented: '#pragma omp scan' not supported yet" } */ + b[i] = r; + } + return r; +}