Commit f22f4340 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/44085 (OpenMP - untied task accesses threadprivate - non-conforming but no msg)

	PR middle-end/44085
	* gimplify.c (enum omp_region_type): Add ORT_UNTIED_TASK,
	change value of ORT_TASK.
	(new_omp_context): Handle ORT_UNTIED_TASK like ORT_TASK.
	(omp_notice_threadprivate_variable): New function.
	(omp_notice_variable): Call it for threadprivate variables.
	If enclosing ctx is a task, print enclosing task rather than
	enclosing parallel.  Handle ORT_UNTIED_TASK like ORT_TASK.
	(gimplify_omp_task): Pass ORT_UNTIED_TASK instead of ORT_TASK
	if task has untied clause.

	* gcc.dg/gomp/pr44085.c: New test.
	* gfortran.dg/gomp/pr44085.f90: New test.

From-SVN: r159316
parent 7c2db0d3
2010-05-12 Jakub Jelinek <jakub@redhat.com> 2010-05-12 Jakub Jelinek <jakub@redhat.com>
PR middle-end/44085
* gimplify.c (enum omp_region_type): Add ORT_UNTIED_TASK,
change value of ORT_TASK.
(new_omp_context): Handle ORT_UNTIED_TASK like ORT_TASK.
(omp_notice_threadprivate_variable): New function.
(omp_notice_variable): Call it for threadprivate variables.
If enclosing ctx is a task, print enclosing task rather than
enclosing parallel. Handle ORT_UNTIED_TASK like ORT_TASK.
(gimplify_omp_task): Pass ORT_UNTIED_TASK instead of ORT_TASK
if task has untied clause.
PR debug/42278 PR debug/42278
* dwarf2out.c (base_type_die): Don't add name attribute here. * dwarf2out.c (base_type_die): Don't add name attribute here.
(modified_type_die): Instead of sizetype use (modified_type_die): Instead of sizetype use
......
...@@ -74,9 +74,10 @@ enum gimplify_omp_var_data ...@@ -74,9 +74,10 @@ enum gimplify_omp_var_data
enum omp_region_type enum omp_region_type
{ {
ORT_WORKSHARE = 0, ORT_WORKSHARE = 0,
ORT_TASK = 1,
ORT_PARALLEL = 2, ORT_PARALLEL = 2,
ORT_COMBINED_PARALLEL = 3 ORT_COMBINED_PARALLEL = 3,
ORT_TASK = 4,
ORT_UNTIED_TASK = 5
}; };
struct gimplify_omp_ctx struct gimplify_omp_ctx
...@@ -318,7 +319,7 @@ new_omp_context (enum omp_region_type region_type) ...@@ -318,7 +319,7 @@ new_omp_context (enum omp_region_type region_type)
c->privatized_types = pointer_set_create (); c->privatized_types = pointer_set_create ();
c->location = input_location; c->location = input_location;
c->region_type = region_type; c->region_type = region_type;
if (region_type != ORT_TASK) if ((region_type & ORT_TASK) == 0)
c->default_kind = OMP_CLAUSE_DEFAULT_SHARED; c->default_kind = OMP_CLAUSE_DEFAULT_SHARED;
else else
c->default_kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED; c->default_kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
...@@ -5470,6 +5471,31 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags) ...@@ -5470,6 +5471,31 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags); splay_tree_insert (ctx->variables, (splay_tree_key)decl, flags);
} }
/* Notice a threadprivate variable DECL used in OpenMP context CTX.
This just prints out diagnostics about threadprivate variable uses
in untied tasks. If DECL2 is non-NULL, prevent this warning
on that variable. */
static bool
omp_notice_threadprivate_variable (struct gimplify_omp_ctx *ctx, tree decl,
tree decl2)
{
splay_tree_node n;
if (ctx->region_type != ORT_UNTIED_TASK)
return false;
n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
if (n == NULL)
{
error ("threadprivate variable %qE used in untied task", DECL_NAME (decl));
error_at (ctx->location, "enclosing task");
splay_tree_insert (ctx->variables, (splay_tree_key)decl, 0);
}
if (decl2)
splay_tree_insert (ctx->variables, (splay_tree_key)decl2, 0);
return false;
}
/* Record the fact that DECL was used within the OpenMP context CTX. /* Record the fact that DECL was used within the OpenMP context CTX.
IN_CODE is true when real code uses DECL, and false when we should 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 merely emit default(none) errors. Return true if DECL is going to
...@@ -5490,14 +5516,14 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code) ...@@ -5490,14 +5516,14 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
if (is_global_var (decl)) if (is_global_var (decl))
{ {
if (DECL_THREAD_LOCAL_P (decl)) if (DECL_THREAD_LOCAL_P (decl))
return false; return omp_notice_threadprivate_variable (ctx, decl, NULL_TREE);
if (DECL_HAS_VALUE_EXPR_P (decl)) if (DECL_HAS_VALUE_EXPR_P (decl))
{ {
tree value = get_base_address (DECL_VALUE_EXPR (decl)); tree value = get_base_address (DECL_VALUE_EXPR (decl));
if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value)) if (value && DECL_P (value) && DECL_THREAD_LOCAL_P (value))
return false; return omp_notice_threadprivate_variable (ctx, decl, value);
} }
} }
...@@ -5523,7 +5549,10 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code) ...@@ -5523,7 +5549,10 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
case OMP_CLAUSE_DEFAULT_NONE: case OMP_CLAUSE_DEFAULT_NONE:
error ("%qE not specified in enclosing parallel", error ("%qE not specified in enclosing parallel",
DECL_NAME (decl)); DECL_NAME (decl));
error_at (ctx->location, "enclosing parallel"); if ((ctx->region_type & ORT_TASK) != 0)
error_at (ctx->location, "enclosing task");
else
error_at (ctx->location, "enclosing parallel");
/* FALLTHRU */ /* FALLTHRU */
case OMP_CLAUSE_DEFAULT_SHARED: case OMP_CLAUSE_DEFAULT_SHARED:
flags |= GOVD_SHARED; flags |= GOVD_SHARED;
...@@ -5536,7 +5565,7 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code) ...@@ -5536,7 +5565,7 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
break; break;
case OMP_CLAUSE_DEFAULT_UNSPECIFIED: case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
/* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED. */ /* decl will be either GOVD_FIRSTPRIVATE or GOVD_SHARED. */
gcc_assert (ctx->region_type == ORT_TASK); gcc_assert ((ctx->region_type & ORT_TASK) != 0);
if (ctx->outer_context) if (ctx->outer_context)
omp_notice_variable (ctx->outer_context, decl, in_code); omp_notice_variable (ctx->outer_context, decl, in_code);
for (octx = ctx->outer_context; octx; octx = octx->outer_context) for (octx = ctx->outer_context; octx; octx = octx->outer_context)
...@@ -6039,7 +6068,10 @@ gimplify_omp_task (tree *expr_p, gimple_seq *pre_p) ...@@ -6039,7 +6068,10 @@ gimplify_omp_task (tree *expr_p, gimple_seq *pre_p)
gimple_seq body = NULL; gimple_seq body = NULL;
struct gimplify_ctx gctx; struct gimplify_ctx gctx;
gimplify_scan_omp_clauses (&OMP_TASK_CLAUSES (expr), pre_p, ORT_TASK); gimplify_scan_omp_clauses (&OMP_TASK_CLAUSES (expr), pre_p,
find_omp_clause (OMP_TASK_CLAUSES (expr),
OMP_CLAUSE_UNTIED)
? ORT_UNTIED_TASK : ORT_TASK);
push_gimplify_context (&gctx); push_gimplify_context (&gctx);
......
2010-05-12 Jakub Jelinek <jakub@redhat.com>
PR middle-end/44085
* gcc.dg/gomp/pr44085.c: New test.
* gfortran.dg/gomp/pr44085.f90: New test.
2010-05-12 Iain Sandoe <iains@gcc.gnu.org> 2010-05-12 Iain Sandoe <iains@gcc.gnu.org>
* objc-obj-c++-shared/Object1.m: New. * objc-obj-c++-shared/Object1.m: New.
......
/* PR middle-end/44085 */
/* { dg-do compile } */
/* { dg-require-effective-target tls_native } */
/* { dg-options "-fopenmp" } */
int thr1, thr2;
#pragma omp threadprivate (thr1, thr2)
void
foo (void)
{
#pragma omp task untied /* { dg-error "enclosing task" } */
{
thr1++; /* { dg-error "used in untied task" } */
thr2 |= 4; /* { dg-error "used in untied task" } */
}
}
void
bar (void)
{
#pragma omp task
{
thr1++;
thr2 |= 4;
}
}
! PR middle-end/44085
! { dg-do compile }
! { dg-require-effective-target tls_native }
! { dg-options "-fopenmp" }
integer, save :: thr1, thr2
integer :: thr3, thr4
common /thrs/ thr3, thr4
!$omp threadprivate (thr1, thr2, /thrs/)
!$omp task untied ! { dg-error "enclosing task" }
thr1 = thr1 + 1 ! { dg-error "used in untied task" }
thr2 = thr2 + 2 ! { dg-error "used in untied task" }
thr3 = thr3 + 3 ! { dg-error "used in untied task" }
thr4 = thr4 + 4 ! { dg-error "used in untied task" }
!$omp end task
!$omp task
thr1 = thr1 + 1
thr2 = thr2 + 2
thr3 = thr3 + 3
thr4 = thr4 + 4
!$omp end task
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment