/* { dg-do compile } */ /* { dg-additional-options "-fdump-tree-gimple" } */ struct S { int s; }; void foo (char *); void bar (int, char *, struct S, int *); #pragma omp declare target to (bar) #define N 16 void f1 (int sc1, struct S ag1, int *pt1) { char ar1[N]; foo (ar1); #pragma omp target bar (sc1, ar1, ag1, pt1); /* { dg-final { scan-tree-dump "firstprivate\\(sc1\\)" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(tofrom:ar1" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(tofrom:ag1" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(firstprivate:pt1 .pointer assign" "gimple" } } */ } void f2 (int sc2, struct S ag2, int *pt2) { char ar2[N]; foo (ar2); #pragma omp target firstprivate (sc2, ar2, ag2, pt2) defaultmap (none) bar (sc2, ar2, ag2, pt2); /* { dg-final { scan-tree-dump "firstprivate\\(sc2\\)" "gimple" } } */ /* { dg-final { scan-tree-dump "firstprivate\\(ar2\\)" "gimple" } } */ /* { dg-final { scan-tree-dump "firstprivate\\(ag2\\)" "gimple" } } */ /* { dg-final { scan-tree-dump "firstprivate\\(pt2\\)" "gimple" } } */ } void f3 (int sc3, struct S ag3, int *pt3) { char ar3[N]; foo (ar3); #pragma omp target defaultmap(none:scalar) defaultmap(none:aggregate) \ map (sc3, ar3, ag3, pt3) defaultmap(none:pointer) bar (sc3, ar3, ag3, pt3); /* { dg-final { scan-tree-dump "map\\(tofrom:sc3" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(tofrom:ar3" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(tofrom:ag3" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(tofrom:pt3" "gimple" } } */ } void f4 (int sc4, struct S ag4, int *pt4) { char ar4[N]; foo (ar4); #pragma omp target defaultmap(tofrom:scalar) bar (sc4, ar4, ag4, pt4); /* { dg-final { scan-tree-dump "map\\(tofrom:sc4" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(tofrom:ar4" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(tofrom:ag4" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(firstprivate:pt4 .pointer assign" "gimple" } } */ } void f5 (int sc5, struct S ag5, int *pt5) { char ar5[N]; foo (ar5); #pragma omp target defaultmap(to) bar (sc5, ar5, ag5, pt5); /* { dg-final { scan-tree-dump "map\\(to:sc5" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(to:ar5" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(to:ag5" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(to:pt5" "gimple" } } */ } void f6 (int sc6, struct S ag6, int *pt6) { char ar6[N]; foo (ar6); #pragma omp target defaultmap(firstprivate) bar (sc6, ar6, ag6, pt6); /* { dg-final { scan-tree-dump "firstprivate\\(sc6\\)" "gimple" } } */ /* { dg-final { scan-tree-dump "firstprivate\\(ar6\\)" "gimple" } } */ /* { dg-final { scan-tree-dump "firstprivate\\(ag6\\)" "gimple" } } */ /* { dg-final { scan-tree-dump "firstprivate\\(pt6\\)" "gimple" } } */ } void f7 (int sc7, struct S ag7, int *pt7) { char ar7[N]; foo (ar7); #pragma omp target defaultmap(alloc: scalar) defaultmap(from: aggregate) defaultmap(default: pointer) { int *q = &sc7; *q = 6; ag7.s = 5; int i; for (i = 0; i < N; ++i) ar7[i] = 7; bar (sc7, ar7, ag7, pt7); } /* { dg-final { scan-tree-dump "map\\(alloc:sc7" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(from:ar7" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(from:ag7" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(firstprivate:pt7 .pointer assign" "gimple" } } */ } void f8 (int sc8, struct S ag8, int *pt8) { char ar8[N]; foo (ar8); #pragma omp target defaultmap(firstprivate:aggregate) defaultmap(none:scalar) \ defaultmap(tofrom:pointer) map(to: sc8) bar (sc8, ar8, ag8, pt8); /* { dg-final { scan-tree-dump "map\\(to:sc8" "gimple" } } */ /* { dg-final { scan-tree-dump "firstprivate\\(ar8\\)" "gimple" } } */ /* { dg-final { scan-tree-dump "firstprivate\\(ag8\\)" "gimple" } } */ /* { dg-final { scan-tree-dump "map\\(tofrom:pt8" "gimple" } } */ } void f9 (int sc9, struct S ag9) { char ar9[sc9 + 2]; foo (ar9); #pragma omp target defaultmap(none) map(to: ar9, ag9) firstprivate (sc9) bar (sc9, ar9, ag9, &sc9); }