abhinavgaba wrote:

> Even for cases where both the pointer, pointee are mapped, the expectation is 
> for the pointer to still be captured by-ref.
>Why?

Because we don't know if the pointer/pointee were both already existing on the 
device, in which case, there should be no pointer-attachment for them.

```c
  int x = 111;
  #pragma omp target enter data map(x) // map the pointee
  int *p = &x;
  #pragma omp target enter data map(p) // map the pointer

  #pragma omp target map(p, p[0:1]) // No pointer-attachment between p and 
p[0], since both
                                    // already existed on the device
  {
    p = (int*) 111;
  }

  printf("%ld\n", (long) p); // CHECK: 111
```

And as I mentioend, even if there is a pointer attachment, and the value of p 
cannot be modified in the region, a user may still assert that the address of p 
in the device matches its mapped address, like:

```c
int x;
int *p = &x;
#pragma omp target enter data map(p)
int64_t mapped_p = (int64_t) omp_get_mapped_ptr(&p, omp_get_default_device());

#pragma omp target map(p, p[0:1]) // pointer-attachment succeeds here
{
 assert(mapped_p == (int64_t) &p && "address of p in device should match the 
mapped address before the region.");
}
```


https://github.com/llvm/llvm-project/pull/145454
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to