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
This commit is contained in:
parent
c24783c499
commit
e9e2ef9f2f
4 changed files with 41 additions and 3 deletions
|
@ -1,5 +1,11 @@
|
|||
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
|
||||
* omp-low.c (lower_reduction_clauses): Pass OMP_CLAUSE_PRIVATE
|
||||
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)
|
|||
of PRIVATE. The sharing would take place via the pointer variable
|
||||
which we remapped above. */
|
||||
if (flags & GOVD_SHARED)
|
||||
flags = GOVD_PRIVATE | GOVD_DEBUG_PRIVATE
|
||||
flags = GOVD_SHARED | GOVD_DEBUG_PRIVATE
|
||||
| (flags & (GOVD_SEEN | GOVD_EXPLICIT));
|
||||
|
||||
/* 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)
|
|||
return 0;
|
||||
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;
|
||||
}
|
||||
else if (flags & GOVD_MAP)
|
||||
|
@ -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
|
||||
|| ((n->value & GOVD_DATA_SHARE_CLASS)
|
||||
== GOVD_PRIVATE));
|
||||
== GOVD_SHARED));
|
||||
OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE);
|
||||
OMP_CLAUSE_PRIVATE_DEBUG (c) = 1;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2017-05-22 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/80809
|
||||
* testsuite/libgomp.c/pr80809-1.c: New test.
|
||||
|
||||
PR middle-end/80853
|
||||
* testsuite/libgomp.c/pr80853.c: New test.
|
||||
|
||||
|
|
29
libgomp/testsuite/libgomp.c/pr80809-1.c
Normal file
29
libgomp/testsuite/libgomp.c/pr80809-1.c
Normal file
|
@ -0,0 +1,29 @@
|
|||
/* 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue