123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- extern "C" void abort ();
- int x;
- __attribute__((noinline, noclone)) void
- foo (int &a, int (&b)[10], short &c, long (&d)[5], int n)
- {
- int err;
- int &t = x;
- int y[n + 1];
- int (&z)[n + 1] = y;
- for (int i = 0; i < n + 1; i++)
- z[i] = i + 27;
- #pragma omp target enter data map (to: z, c) map (alloc: b, t)
- #pragma omp target update to (b, t)
- #pragma omp target map (tofrom: a, d) map (from: b, c) map (alloc: t, z) map (from: err)
- {
- err = a++ != 7;
- for (int i = 0; i < 10; i++)
- {
- err |= b[i] != 10 - i;
- b[i] = i - 16;
- if (i >= 6) continue;
- err |= z[i] != i + 27;
- z[i] = 2 * i + 9;
- if (i == 5) continue;
- err |= d[i] != 12L + i;
- d[i] = i + 7;
- }
- err |= c != 25;
- c = 142;
- err |= t != 8;
- t = 19;
- }
- if (err) abort ();
- #pragma omp target update from (z, c)
- #pragma omp target exit data map (from: b, t) map (release: z, c)
- if (a != 8 || c != 142 || t != 19)
- abort ();
- a = 29;
- c = 149;
- t = 15;
- for (int i = 0; i < 10; i++)
- {
- if (b[i] != i - 16) abort ();
- b[i] = i ^ 1;
- if (i >= 6) continue;
- if (z[i] != 2 * i + 9) abort ();
- z[i]++;
- if (i == 5) continue;
- if (d[i] != i + 7) abort ();
- d[i] = 7 - i;
- }
- #pragma omp target defaultmap(tofrom: scalar)
- {
- err = a++ != 29;
- for (int i = 0; i < 10; i++)
- {
- err |= b[i] != i ^ 1;
- b[i] = i + 5;
- if (i >= 6) continue;
- err |= z[i] != 2 * i + 10;
- z[i] = 9 - 3 * i;
- if (i == 5) continue;
- err |= d[i] != 7L - i;
- d[i] = i;
- }
- err |= c != 149;
- c = -2;
- err |= t != 15;
- t = 155;
- }
- if (err || a != 30 || c != -2 || t != 155)
- abort ();
- for (int i = 0; i < 10; i++)
- {
- if (b[i] != i + 5) abort ();
- if (i >= 6) continue;
- if (z[i] != 9 - 3 * i) abort ();
- z[i]++;
- if (i == 5) continue;
- if (d[i] != i) abort ();
- }
- #pragma omp target data map (alloc: z)
- {
- #pragma omp target update to (z)
- #pragma omp target map(from: err)
- {
- err = 0;
- for (int i = 0; i < 6; i++)
- if (z[i] != 10 - 3 * i) err = 1;
- else z[i] = i;
- }
- if (err) abort ();
- #pragma omp target update from (z)
- }
- for (int i = 0; i < 6; i++)
- if (z[i] != i)
- abort ();
- }
- int
- main ()
- {
- int a = 7;
- int b[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
- short c = 25;
- long d[5] = { 12, 13, 14, 15, 16 };
- x = 8;
- foo (a, b, c, d, 5);
- }
|