llvm-project/openmp/libomptarget/test/mapping/target_pointers_members_map.cpp
Alexey Bataev ab8989ab87 [OPENMP]Fix overlapped mapping for dereferenced pointer members.
If the base is used in a map clause and later we have a memberexpr with
this base, and the member is a pointer, and this pointer is dereferenced
anyhow (subscript, array section, dereference, etc.), such components
should be considered as overlapped, otherwise it may lead to incorrect
size computations, since we try to map a pointee as a part of the whole
struct, which is not true for the pointer members.

Differential Revision: https://reviews.llvm.org/D105562
2021-07-09 12:51:26 -07:00

56 lines
1.6 KiB
C++

// RUN: %libomptarget-compilexx-run-and-check-aarch64-unknown-linux-gnu
// RUN: %libomptarget-compilexx-run-and-check-powerpc64-ibm-linux-gnu
// RUN: %libomptarget-compilexx-run-and-check-powerpc64le-ibm-linux-gnu
// RUN: %libomptarget-compilexx-run-and-check-x86_64-pc-linux-gnu
// RUN: %libomptarget-compilexx-run-and-check-nvptx64-nvidia-cuda
#include <cstdio>
#include <cstdlib>
typedef struct {
short *a;
long d1, d2;
} DV_A;
typedef struct {
DV_A b;
long d3;
} C;
typedef struct {
C *c;
long d4, d5;
} DV_B;
int main() {
short arr1[10] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
short arr2[10] = {20, 31, 22, 23, 24, 25, 26, 27, 28, 29};
C c1[2];
c1[0].b.a = (short *)arr1;
c1[1].b.a = (short *)arr2;
c1[0].b.d1 = 111;
DV_B dvb1;
dvb1.c = (C *)&c1;
// CHECK: 10 111
printf("%d %ld %p %p %p %p\n", dvb1.c[0].b.a[0], dvb1.c[0].b.d1, &dvb1,
&dvb1.c[0], &dvb1.c[0].b, &dvb1.c[0].b.a[0]);
#pragma omp target map(to \
: dvb1, dvb1.c [0:2]) \
map(tofrom \
: dvb1.c[0].b.a [0:10], dvb1.c[1].b.a [0:10])
{
// CHECK: 10 111
printf("%d %ld %p %p %p %p\n", dvb1.c[0].b.a[0], dvb1.c[0].b.d1, &dvb1,
&dvb1.c[0], &dvb1.c[0].b, &dvb1.c[0].b.a[0]);
dvb1.c[0].b.a[0] = 333;
dvb1.c[0].b.d1 = 444;
}
// CHECK: 333 111
printf("%d %ld %p %p %p %p\n", dvb1.c[0].b.a[0], dvb1.c[0].b.d1, &dvb1,
&dvb1.c[0], &dvb1.c[0].b, &dvb1.c[0].b.a[0]);
}