From 72500605c11edd0ba6ea2af2e9ee78facabb18da Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 24 Jul 2015 16:13:04 +0000 Subject: [PATCH] gimplify.c (omp_default_clause): New function. * gimplify.c (omp_default_clause): New function. Reorganize flow for clarity. Broken out of ... (omp_notice_variable): ... here. From-SVN: r226170 --- gcc/ChangeLog | 6 ++ gcc/gimplify.c | 170 ++++++++++++++++++++++++++----------------------- 2 files changed, 97 insertions(+), 79 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc7bd761fcb..6fa995921fc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-07-24 Nathan Sidwell + + * gimplify.c (omp_default_clause): New function. Reorganize flow + for clarity. Broken out of ... + (omp_notice_variable): ... here. + 2015-07-24 Gary Funck PR middle-end/66984 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index b0b14455c8a..c8f27188418 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)) -- 2.30.2