diff options
Diffstat (limited to 'libgomp/testsuite/libgomp.c/target-link-1.c')
-rw-r--r-- | libgomp/testsuite/libgomp.c/target-link-1.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.c/target-link-1.c b/libgomp/testsuite/libgomp.c/target-link-1.c new file mode 100644 index 0000000..681677c --- /dev/null +++ b/libgomp/testsuite/libgomp.c/target-link-1.c @@ -0,0 +1,63 @@ +struct S { int s, t; }; + +int a = 1, b = 1; +double c[27]; +struct S d = { 8888, 8888 }; +#pragma omp declare target link (a) to (b) link (c, d) + +int +foo (void) +{ + return a++ + b++; +} + +int +bar (int n) +{ + int *p1 = &a; + int *p2 = &b; + c[n] += 2.0; + d.s -= 2; + d.t -= 2; + return *p1 + *p2 + d.s + d.t; +} + +#pragma omp declare target (foo, bar) + +int +main () +{ + a = b = 2; + d.s = 17; + d.t = 18; + + int res, n = 10; + #pragma omp target map (to: a, b, c, d) map (from: res) + { + res = foo () + foo (); + c[n] = 3.0; + res += bar (n); + } + + int shared_mem = 0; + #pragma omp target map (alloc: shared_mem) + shared_mem = 1; + + if ((shared_mem && res != (2 + 2) + (3 + 3) + (4 + 4 + 15 + 16)) + || (!shared_mem && res != (2 + 1) + (3 + 2) + (4 + 3 + 15 + 16))) + __builtin_abort (); + + #pragma omp target enter data map (to: c) + #pragma omp target update from (c) + res = (int) (c[n] + 0.5); + if ((shared_mem && res != 5) || (!shared_mem && res != 0)) + __builtin_abort (); + + #pragma omp target map (to: a, b) map (from: res) + res = foo (); + + if ((shared_mem && res != 4 + 4) || (!shared_mem && res != 2 + 3)) + __builtin_abort (); + + return 0; +} |