pr93566.c 2.1 KB

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