Commit e9e2ef9f by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/80809 (Multi-free error for variable size array used within OpenMP task)

	PR middle-end/80809
	* gimplify.c (omp_add_variable): For GOVD_DEBUG_PRIVATE use
	GOVD_SHARED rather than GOVD_PRIVATE with it.
	(gimplify_adjust_omp_clauses_1, gimplify_adjust_omp_clauses): Expect
	GOVD_SHARED rather than GOVD_PRIVATE with GOVD_DEBUG_PRIVATE.

	* testsuite/libgomp.c/pr80809-1.c: New test.

From-SVN: r248345
parent c24783c4
2017-05-22 Jakub Jelinek <jakub@redhat.com> 2017-05-22 Jakub Jelinek <jakub@redhat.com>
PR middle-end/80809
* gimplify.c (omp_add_variable): For GOVD_DEBUG_PRIVATE use
GOVD_SHARED rather than GOVD_PRIVATE with it.
(gimplify_adjust_omp_clauses_1, gimplify_adjust_omp_clauses): Expect
GOVD_SHARED rather than GOVD_PRIVATE with GOVD_DEBUG_PRIVATE.
PR middle-end/80853 PR middle-end/80853
* omp-low.c (lower_reduction_clauses): Pass OMP_CLAUSE_PRIVATE * omp-low.c (lower_reduction_clauses): Pass OMP_CLAUSE_PRIVATE
as last argument to build_outer_var_ref for pointer bases of array as last argument to build_outer_var_ref for pointer bases of array
......
...@@ -6693,7 +6693,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags) ...@@ -6693,7 +6693,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
of PRIVATE. The sharing would take place via the pointer variable of PRIVATE. The sharing would take place via the pointer variable
which we remapped above. */ which we remapped above. */
if (flags & GOVD_SHARED) if (flags & GOVD_SHARED)
flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE flags = GOVD_SHARED | GOVD_DEBUG_PRIVATE
| (flags & (GOVD_SEEN | GOVD_EXPLICIT)); | (flags & (GOVD_SEEN | GOVD_EXPLICIT));
/* We're going to make use of the TYPE_SIZE_UNIT at least in the /* We're going to make use of the TYPE_SIZE_UNIT at least in the
...@@ -8616,7 +8616,7 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data) ...@@ -8616,7 +8616,7 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
return 0; return 0;
if (flags & GOVD_DEBUG_PRIVATE) if (flags & GOVD_DEBUG_PRIVATE)
{ {
gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_PRIVATE); gcc_assert ((flags & GOVD_DATA_SHARE_CLASS) == GOVD_SHARED);
private_debug = true; private_debug = true;
} }
else if (flags & GOVD_MAP) else if (flags & GOVD_MAP)
...@@ -8878,7 +8878,7 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, gimple_seq body, tree *list_p, ...@@ -8878,7 +8878,7 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, gimple_seq body, tree *list_p,
{ {
gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0 gcc_assert ((n->value & GOVD_DEBUG_PRIVATE) == 0
|| ((n->value & GOVD_DATA_SHARE_CLASS) || ((n->value & GOVD_DATA_SHARE_CLASS)
== GOVD_PRIVATE)); == GOVD_SHARED));
OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE); OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
OMP_CLAUSE_PRIVATE_DEBUG (c) = 1; OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
} }
......
2017-05-22 Jakub Jelinek <jakub@redhat.com> 2017-05-22 Jakub Jelinek <jakub@redhat.com>
PR middle-end/80809
* testsuite/libgomp.c/pr80809-1.c: New test.
PR middle-end/80853 PR middle-end/80853
* testsuite/libgomp.c/pr80853.c: New test. * testsuite/libgomp.c/pr80853.c: New test.
......
/* PR middle-end/80809 */
/* { dg-do run } */
__attribute__((noinline, noclone)) void
foo (int x)
{
int i, j, v[x], *w[16];
for (i = 0; i < x; i++)
v[i] = i;
#pragma omp parallel
#pragma omp single
for (i = 0; i < 16; i++)
/* Make sure v is implicitly determined shared in task, because it
is shared on the parallel. */
#pragma omp task private (j)
w[i] = v;
for (i = 0; i < 16; i++)
if (w[i] != v)
__builtin_abort ();
}
int
main ()
{
foo (4);
foo (27);
foo (196);
return 0;
}
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