While we potentially need to align partially mapped structs more than the first member, we do not need to align past the struct itself. This prevents us from moving the base pointer past the struct beginning too. See https://reviews.llvm.org/D142508 for a discussion. Reviewed By: pavelkopyl, grokos, jhuber6 Differential Revision: https://reviews.llvm.org/D142586
50 lines
747 B
C
50 lines
747 B
C
// RUN: %libomptarget-compilexx-run-and-check-generic
|
|
|
|
#include <omp.h>
|
|
#include <stdio.h>
|
|
|
|
int main() {
|
|
struct S {
|
|
int i;
|
|
int j;
|
|
} s;
|
|
s.i = 20;
|
|
s.j = 30;
|
|
#pragma omp target data map(tofrom : s)
|
|
{
|
|
#pragma omp target map(from : s.i, s.j)
|
|
{
|
|
s.i = 21;
|
|
s.j = 31;
|
|
}
|
|
}
|
|
if (s.i == 21 && s.j == 31)
|
|
printf("PASS 1\n");
|
|
// CHECK: PASS 1
|
|
|
|
struct T {
|
|
int a;
|
|
int b;
|
|
int c;
|
|
int d;
|
|
int i;
|
|
int j;
|
|
} t;
|
|
t.a = 10;
|
|
t.i = 20;
|
|
t.j = 30;
|
|
#pragma omp target data map(from : t.i, t.j)
|
|
{
|
|
#pragma omp target map(from : t.a)
|
|
{
|
|
t.a = 11;
|
|
t.i = 21;
|
|
t.j = 31;
|
|
}
|
|
}
|
|
if (t.a == 11 && t.i == 21 && t.j == 31)
|
|
printf("PASS 2\n");
|
|
// CHECK: PASS 2
|
|
return 0;
|
|
}
|