https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116107

            Bug ID: 116107
           Summary: [OpenMP] Array-section mapping with 'declare target'
                    link accesses the wrong data
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: openmp, wrong-code
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
                CC: jakub at gcc dot gnu.org
  Target Milestone: ---

See also PR 115559 – which contains a Fortran testcase.

The problem is that the map does:
      #pragma omp target enter data map(to:arr[5] [len: 40])

and stores the resulting memory address on the device side. But it should store
it with the offset of -sizeof(arr[0])*5 bytes to ensure that arr[5] on the
device side accesses the right element …

* * *

int arr[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
#pragma omp declare target link(arr)

#pragma omp begin declare target
void f(int *res)
{
  __builtin_memcpy (res, &arr[5], sizeof(int)*10);
}
#pragma omp end declare target

int main()
{
  int res[10], res2;
  #pragma omp target enter data map(arr[5:10])
  #pragma omp target map(from:res)
    f(res);
  for (int i = 0; i < 10; i++)
    __builtin_printf("%d\n", res[i]);
  #pragma omp target map(from:res2)
    res2 = arr[5];
  __builtin_printf("res2 = %d\n", res2);
}

Reply via email to