Looks like there is a bug (in GOMP_target lowering? or in gomp_map_vars_existing?) The reproducer:
#define N 1000 void foo () { int *a = malloc (N * sizeof (int)); printf ("1: %p\n", a); #pragma omp target data map(tofrom: a[0:N]) { printf ("2: %p\n", a); #pragma omp target { int i; for (i = 0; i < N; i++) a[i] = i; } printf ("3: %p\n", a); } printf ("4: %p\n", a); free (a); } Here GOMP_target believes that the pointer 'a' has a type TOFROM, so it sets copy_from to true for the existing mapping of the pointer 'a', that was mapped in GOMP_target_data. Therefore the output is incorrect: 1: [host addr] 2: [host addr] 3: [host addr] 4: [target addr] -- Ilya