gcc/libgomp/testsuite/libgomp.c-c++-common/pr93515.c
Jakub Jelinek cb3f06480a openmp: Fix handling of non-addressable shared scalars in parallel nested inside of target [PR93515]
As the following testcase shows, we need to consider even target to be a construct
that forces not to use copy in/out for shared on parallel inside of the target.
E.g. for parallel nested inside another parallel or host teams, we already avoid
copy in/out and we need to treat target the same.

2020-02-06  Jakub Jelinek  <jakub@redhat.com>

	PR libgomp/93515
	* omp-low.c (use_pointer_for_field): For nested constructs, also
	look for map clauses on target construct.
	(scan_omp_1_stmt) <case GIMPLE_OMP_TARGET>: Bump temporarily
	taskreg_nesting_level.

	* testsuite/libgomp.c-c++-common/pr93515.c: New test.
2020-02-06 09:19:08 +01:00

37 lines
718 B
C

/* PR libgomp/93515 */
#include <omp.h>
#include <stdlib.h>
int
main ()
{
int i;
int a = 42;
#pragma omp target teams distribute parallel for defaultmap(tofrom: scalar)
for (i = 0; i < 64; ++i)
if (omp_get_team_num () == 0)
if (omp_get_thread_num () == 0)
a = 142;
if (a != 142)
__builtin_abort ();
a = 42;
#pragma omp target parallel for defaultmap(tofrom: scalar)
for (i = 0; i < 64; ++i)
if (omp_get_thread_num () == 0)
a = 143;
if (a != 143)
__builtin_abort ();
a = 42;
#pragma omp target firstprivate(a)
{
#pragma omp parallel for
for (i = 0; i < 64; ++i)
if (omp_get_thread_num () == 0)
a = 144;
if (a != 144)
abort ();
}
return 0;
}