scan-5.c 1.8 KB

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