scan-2.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /* { dg-require-effective-target size32plus } */
  2. extern void abort (void);
  3. int r, a[1024], b[1024];
  4. #pragma omp declare reduction (foo: int: omp_out += omp_in) initializer (omp_priv = 0)
  5. __attribute__((noipa)) void
  6. foo (int *a, int *b)
  7. {
  8. #pragma omp for reduction (inscan, foo:r)
  9. for (int i = 0; i < 1024; i++)
  10. {
  11. r += a[i];
  12. #pragma omp scan inclusive(r)
  13. b[i] = r;
  14. }
  15. }
  16. __attribute__((noipa)) int
  17. bar (void)
  18. {
  19. int s = 0;
  20. #pragma omp parallel
  21. #pragma omp for reduction (inscan, foo:s)
  22. for (int i = 0; i < 1024; i++)
  23. {
  24. s += 2 * a[i];
  25. #pragma omp scan inclusive(s)
  26. b[i] = s;
  27. }
  28. return s;
  29. }
  30. __attribute__((noipa)) void
  31. baz (int *a, int *b)
  32. {
  33. #pragma omp parallel for reduction (inscan, foo:r)
  34. for (int i = 0; i < 1024; i++)
  35. {
  36. r += a[i];
  37. #pragma omp scan inclusive(r)
  38. b[i] = r;
  39. }
  40. }
  41. __attribute__((noipa)) int
  42. qux (void)
  43. {
  44. int s = 0;
  45. #pragma omp parallel for reduction (inscan, foo:s)
  46. for (int i = 0; i < 1024; i++)
  47. {
  48. s += 2 * a[i];
  49. #pragma omp scan inclusive(s)
  50. b[i] = s;
  51. }
  52. return s;
  53. }
  54. int
  55. main ()
  56. {
  57. int s = 0;
  58. for (int i = 0; i < 1024; ++i)
  59. {
  60. a[i] = i;
  61. b[i] = -1;
  62. asm ("" : "+g" (i));
  63. }
  64. #pragma omp parallel
  65. foo (a, b);
  66. if (r != 1024 * 1023 / 2)
  67. abort ();
  68. for (int i = 0; i < 1024; ++i)
  69. {
  70. s += i;
  71. if (b[i] != s)
  72. abort ();
  73. else
  74. b[i] = 25;
  75. }
  76. if (bar () != 1024 * 1023)
  77. abort ();
  78. s = 0;
  79. for (int i = 0; i < 1024; ++i)
  80. {
  81. s += 2 * i;
  82. if (b[i] != s)
  83. abort ();
  84. else
  85. b[i] = -1;
  86. }
  87. r = 0;
  88. baz (a, b);
  89. if (r != 1024 * 1023 / 2)
  90. abort ();
  91. s = 0;
  92. for (int i = 0; i < 1024; ++i)
  93. {
  94. s += i;
  95. if (b[i] != s)
  96. abort ();
  97. else
  98. b[i] = -25;
  99. }
  100. if (qux () != 1024 * 1023)
  101. abort ();
  102. s = 0;
  103. for (int i = 0; i < 1024; ++i)
  104. {
  105. s += 2 * i;
  106. if (b[i] != s)
  107. abort ();
  108. }
  109. return 0;
  110. }