diff options
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 170 |
1 files changed, 91 insertions, 79 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index b0b1445..c8f2718 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -5764,6 +5764,96 @@ omp_notice_threadprivate_variable (struct gimplify_omp_ctx *ctx, tree decl, return false; } +/* Determine outer default flags for DECL mentioned in an OMP region + but not declared in an enclosing clause. + + ??? Some compiler-generated variables (like SAVE_EXPRs) could be + remapped firstprivate instead of shared. To some extent this is + addressed in omp_firstprivatize_type_sizes, but not + effectively. */ + +static unsigned +omp_default_clause (struct gimplify_omp_ctx *ctx, tree decl, + bool in_code, unsigned flags) +{ + enum omp_clause_default_kind default_kind = ctx->default_kind; + enum omp_clause_default_kind kind; + + kind = lang_hooks.decls.omp_predetermined_sharing (decl); + if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED) + default_kind = kind; + + switch (default_kind) + { + case OMP_CLAUSE_DEFAULT_NONE: + { + const char *rtype; + + if (ctx->region_type & ORT_PARALLEL) + rtype = "parallel"; + else if (ctx->region_type & ORT_TASK) + rtype = "task"; + else if (ctx->region_type & ORT_TEAMS) + rtype = "teams"; + else + gcc_unreachable (); + + error ("%qE not specified in enclosing %s", + DECL_NAME (lang_hooks.decls.omp_report_decl (decl)), rtype); + error_at (ctx->location, "enclosing %s", rtype); + } + /* FALLTHRU */ + case OMP_CLAUSE_DEFAULT_SHARED: + flags |= GOVD_SHARED; + break; + case OMP_CLAUSE_DEFAULT_PRIVATE: + flags |= GOVD_PRIVATE; + break; + case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE: + flags |= GOVD_FIRSTPRIVATE; + break; + case OMP_CLAUSE_DEFAULT_UNSPECIFIED: + /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED. */ + gcc_assert ((ctx->region_type & ORT_TASK) != 0); + if (struct gimplify_omp_ctx *octx = ctx->outer_context) + { + omp_notice_variable (octx, decl, in_code); + for (; octx; octx = octx->outer_context) + { + splay_tree_node n2; + + if ((octx->region_type & (ORT_TARGET_DATA | ORT_TARGET)) != 0) + continue; + n2 = splay_tree_lookup (octx->variables, (splay_tree_key) decl); + if (n2 && (n2->value & GOVD_DATA_SHARE_CLASS) != GOVD_SHARED) + { + flags |= GOVD_FIRSTPRIVATE; + goto found_outer; + } + if ((octx->region_type & (ORT_PARALLEL | ORT_TEAMS)) != 0) + { + flags |= GOVD_SHARED; + goto found_outer; + } + } + } + + if (TREE_CODE (decl) == PARM_DECL + || (!is_global_var (decl) + && DECL_CONTEXT (decl) == current_function_decl)) + flags |= GOVD_FIRSTPRIVATE; + else + flags |= GOVD_SHARED; + found_outer: + break; + + default: + gcc_unreachable (); + } + + return flags; +} + /* Record the fact that DECL was used within the OMP context CTX. IN_CODE is true when real code uses DECL, and false when we should merely emit default(none) errors. Return true if DECL is going to @@ -5822,90 +5912,12 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code) if (n == NULL) { - enum omp_clause_default_kind default_kind, kind; - struct gimplify_omp_ctx *octx; - if (ctx->region_type == ORT_WORKSHARE || ctx->region_type == ORT_SIMD || ctx->region_type == ORT_TARGET_DATA) goto do_outer; - /* ??? Some compiler-generated variables (like SAVE_EXPRs) could be - remapped firstprivate instead of shared. To some extent this is - addressed in omp_firstprivatize_type_sizes, but not effectively. */ - default_kind = ctx->default_kind; - kind = lang_hooks.decls.omp_predetermined_sharing (decl); - if (kind != OMP_CLAUSE_DEFAULT_UNSPECIFIED) - default_kind = kind; - - switch (default_kind) - { - case OMP_CLAUSE_DEFAULT_NONE: - if ((ctx->region_type & ORT_PARALLEL) != 0) - { - error ("%qE not specified in enclosing parallel", - DECL_NAME (lang_hooks.decls.omp_report_decl (decl))); - error_at (ctx->location, "enclosing parallel"); - } - else if ((ctx->region_type & ORT_TASK) != 0) - { - error ("%qE not specified in enclosing task", - DECL_NAME (lang_hooks.decls.omp_report_decl (decl))); - error_at (ctx->location, "enclosing task"); - } - else if (ctx->region_type & ORT_TEAMS) - { - error ("%qE not specified in enclosing teams construct", - DECL_NAME (lang_hooks.decls.omp_report_decl (decl))); - error_at (ctx->location, "enclosing teams construct"); - } - else - gcc_unreachable (); - /* FALLTHRU */ - case OMP_CLAUSE_DEFAULT_SHARED: - flags |= GOVD_SHARED; - break; - case OMP_CLAUSE_DEFAULT_PRIVATE: - flags |= GOVD_PRIVATE; - break; - case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE: - flags |= GOVD_FIRSTPRIVATE; - break; - case OMP_CLAUSE_DEFAULT_UNSPECIFIED: - /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED. */ - gcc_assert ((ctx->region_type & ORT_TASK) != 0); - if (ctx->outer_context) - omp_notice_variable (ctx->outer_context, decl, in_code); - for (octx = ctx->outer_context; octx; octx = octx->outer_context) - { - splay_tree_node n2; - - if ((octx->region_type & (ORT_TARGET_DATA | ORT_TARGET)) != 0) - continue; - n2 = splay_tree_lookup (octx->variables, (splay_tree_key) decl); - if (n2 && (n2->value & GOVD_DATA_SHARE_CLASS) != GOVD_SHARED) - { - flags |= GOVD_FIRSTPRIVATE; - break; - } - if ((octx->region_type & (ORT_PARALLEL | ORT_TEAMS)) != 0) - break; - } - if (flags & GOVD_FIRSTPRIVATE) - break; - if (octx == NULL - && (TREE_CODE (decl) == PARM_DECL - || (!is_global_var (decl) - && DECL_CONTEXT (decl) == current_function_decl))) - { - flags |= GOVD_FIRSTPRIVATE; - break; - } - flags |= GOVD_SHARED; - break; - default: - gcc_unreachable (); - } + flags = omp_default_clause (ctx, decl, in_code, flags); if ((flags & GOVD_PRIVATE) && lang_hooks.decls.omp_private_outer_ref (decl)) |