cb3f06480a
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.
37 lines
718 B
C
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;
|
|
}
|