simd-15.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /* { dg-do run } */
  2. /* { dg-additional-options "-msse2" { target sse2_runtime } } */
  3. /* { dg-additional-options "-mavx" { target avx_runtime } } */
  4. static inline void
  5. foo (int *b, int *i, int *j, int x)
  6. {
  7. *b = *b + x + (*i - *i) + (*j - *j);
  8. }
  9. int
  10. main ()
  11. {
  12. int i, j, b, c = 0;
  13. i = 4; j = 4; b = 7;
  14. #pragma omp simd linear(b:2) reduction(+:c)
  15. for (i = 0; i < 64; i++)
  16. {
  17. c = c + (b != 7 + 2 * i);
  18. foo (&b, &i, &j, 2);
  19. }
  20. if (c || i != 64 || b != 7 + 64 * 2)
  21. __builtin_abort ();
  22. i = 4; j = 4; b = 7;
  23. #pragma omp simd linear(b:3) reduction(+:c)
  24. for (i = 0; i < 64; i += 4)
  25. {
  26. c = c + (b != 7 + i / 4 * 3);
  27. foo (&b, &i, &j, 3);
  28. }
  29. if (c || i != 64 || b != 7 + 16 * 3)
  30. __builtin_abort ();
  31. i = 4; j = 4; b = 7;
  32. #pragma omp simd linear(i) linear(b:2) reduction(+:c)
  33. for (i = 0; i < 64; i++)
  34. {
  35. c = c + (b != 7 + 2 * i);
  36. foo (&b, &i, &j, 2);
  37. }
  38. if (c || i != 64 || b != 7 + 64 * 2)
  39. __builtin_abort ();
  40. i = 4; j = 4; b = 7;
  41. #pragma omp simd linear(i:4) linear(b:3) reduction(+:c)
  42. for (i = 0; i < 64; i += 4)
  43. {
  44. c = c + (b != 7 + i / 4 * 3);
  45. foo (&b, &i, &j, 3);
  46. }
  47. if (c || i != 64 || b != 7 + 16 * 3)
  48. __builtin_abort ();
  49. i = 4; j = 4; b = 7;
  50. #pragma omp simd collapse (2) linear(b:2) reduction(+:c)
  51. for (i = 0; i < 8; i++)
  52. for (j = 0; j < 8; j++)
  53. {
  54. c = c + (b != 7 + 2 * j + 2 * 8 * i);
  55. foo (&b, &i, &j, 2);
  56. }
  57. if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
  58. __builtin_abort ();
  59. i = 4; j = 4; b = 7;
  60. #pragma omp simd collapse (2) lastprivate (i, j) linear(b:2) reduction(+:c)
  61. for (i = 0; i < 8; i++)
  62. for (j = 0; j < 8; j++)
  63. {
  64. c = c + (b != 7 + 2 * j + 2 * 8 * i);
  65. foo (&b, &i, &j, 2);
  66. }
  67. if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
  68. __builtin_abort ();
  69. i = 4; j = 4; b = 7;
  70. #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
  71. for (i = 0; i < 64; i++)
  72. {
  73. c = c + (b != 7 + 2 * i);
  74. foo (&b, &i, &j, 2);
  75. }
  76. if (c || i != 64 || b != 7 + 64 * 2)
  77. __builtin_abort ();
  78. i = 4; j = 4; b = 7;
  79. #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
  80. for (i = 0; i < 64; i += 4)
  81. {
  82. c = c + (b != 7 + i / 4 * 3);
  83. foo (&b, &i, &j, 3);
  84. }
  85. if (c || i != 64 || b != 7 + 16 * 3)
  86. __builtin_abort ();
  87. i = 4; j = 4; b = 7;
  88. #pragma omp parallel for simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c)
  89. for (i = 0; i < 64; i++)
  90. {
  91. c = c + (b != 7 + 2 * i);
  92. foo (&b, &i, &j, 2);
  93. }
  94. if (c || i != 64 || b != 7 + 64 * 2)
  95. __builtin_abort ();
  96. i = 4; j = 4; b = 7;
  97. #pragma omp parallel for simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c)
  98. for (i = 0; i < 64; i += 4)
  99. {
  100. c = c + (b != 7 + i / 4 * 3);
  101. foo (&b, &i, &j, 3);
  102. }
  103. if (c || i != 64 || b != 7 + 16 * 3)
  104. __builtin_abort ();
  105. i = 4; j = 4; b = 7;
  106. #pragma omp parallel for simd lastprivate (i, j) collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
  107. for (i = 0; i < 8; i++)
  108. for (j = 0; j < 8; j++)
  109. {
  110. c = c + (b != 7 + 2 * j + 2 * 8 * i);
  111. foo (&b, &i, &j, 2);
  112. }
  113. if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
  114. __builtin_abort ();
  115. i = 4; j = 4; b = 7;
  116. #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
  117. for (i = 0; i < 8; i++)
  118. for (j = 0; j < 8; j++)
  119. {
  120. c = c + (b != 7 + 2 * j + 2 * 8 * i);
  121. foo (&b, &i, &j, 2);
  122. }
  123. if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
  124. __builtin_abort ();
  125. return 0;
  126. }