target-14.C 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. extern "C" void abort ();
  2. int x;
  3. __attribute__((noinline, noclone)) void
  4. foo (int &a, int (&b)[10], short &c, long (&d)[5], int n)
  5. {
  6. int err;
  7. int &t = x;
  8. int y[n + 1];
  9. int (&z)[n + 1] = y;
  10. for (int i = 0; i < n + 1; i++)
  11. z[i] = i + 27;
  12. #pragma omp target enter data map (to: z, c) map (alloc: b, t)
  13. #pragma omp target update to (b, t)
  14. #pragma omp target map (tofrom: a, d) map (from: b, c) map (alloc: t, z) map (from: err)
  15. {
  16. err = a++ != 7;
  17. for (int i = 0; i < 10; i++)
  18. {
  19. err |= b[i] != 10 - i;
  20. b[i] = i - 16;
  21. if (i >= 6) continue;
  22. err |= z[i] != i + 27;
  23. z[i] = 2 * i + 9;
  24. if (i == 5) continue;
  25. err |= d[i] != 12L + i;
  26. d[i] = i + 7;
  27. }
  28. err |= c != 25;
  29. c = 142;
  30. err |= t != 8;
  31. t = 19;
  32. }
  33. if (err) abort ();
  34. #pragma omp target update from (z, c)
  35. #pragma omp target exit data map (from: b, t) map (release: z, c)
  36. if (a != 8 || c != 142 || t != 19)
  37. abort ();
  38. a = 29;
  39. c = 149;
  40. t = 15;
  41. for (int i = 0; i < 10; i++)
  42. {
  43. if (b[i] != i - 16) abort ();
  44. b[i] = i ^ 1;
  45. if (i >= 6) continue;
  46. if (z[i] != 2 * i + 9) abort ();
  47. z[i]++;
  48. if (i == 5) continue;
  49. if (d[i] != i + 7) abort ();
  50. d[i] = 7 - i;
  51. }
  52. #pragma omp target defaultmap(tofrom: scalar)
  53. {
  54. err = a++ != 29;
  55. for (int i = 0; i < 10; i++)
  56. {
  57. err |= b[i] != i ^ 1;
  58. b[i] = i + 5;
  59. if (i >= 6) continue;
  60. err |= z[i] != 2 * i + 10;
  61. z[i] = 9 - 3 * i;
  62. if (i == 5) continue;
  63. err |= d[i] != 7L - i;
  64. d[i] = i;
  65. }
  66. err |= c != 149;
  67. c = -2;
  68. err |= t != 15;
  69. t = 155;
  70. }
  71. if (err || a != 30 || c != -2 || t != 155)
  72. abort ();
  73. for (int i = 0; i < 10; i++)
  74. {
  75. if (b[i] != i + 5) abort ();
  76. if (i >= 6) continue;
  77. if (z[i] != 9 - 3 * i) abort ();
  78. z[i]++;
  79. if (i == 5) continue;
  80. if (d[i] != i) abort ();
  81. }
  82. #pragma omp target data map (alloc: z)
  83. {
  84. #pragma omp target update to (z)
  85. #pragma omp target map(from: err)
  86. {
  87. err = 0;
  88. for (int i = 0; i < 6; i++)
  89. if (z[i] != 10 - 3 * i) err = 1;
  90. else z[i] = i;
  91. }
  92. if (err) abort ();
  93. #pragma omp target update from (z)
  94. }
  95. for (int i = 0; i < 6; i++)
  96. if (z[i] != i)
  97. abort ();
  98. }
  99. int
  100. main ()
  101. {
  102. int a = 7;
  103. int b[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
  104. short c = 25;
  105. long d[5] = { 12, 13, 14, 15, 16 };
  106. x = 8;
  107. foo (a, b, c, d, 5);
  108. }