for-13.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. unsigned short a[256];
  2. __attribute__((noinline, noclone)) void
  3. bar (void *x, unsigned short z)
  4. {
  5. unsigned short *y = (unsigned short *) x;
  6. if (y < &a[5] || y > &a[222] || y == &a[124])
  7. __builtin_abort ();
  8. *y += z;
  9. }
  10. __attribute__((noinline, noclone)) void
  11. foo (void *qx, void *rx, void *sx, int n)
  12. {
  13. unsigned short (*q)[n], (*r)[n], (*s)[n], (*p)[n];
  14. q = (typeof (q)) qx;
  15. r = (typeof (r)) rx;
  16. s = (typeof (s)) sx;
  17. #pragma omp for
  18. for (p = q; p != r; p++)
  19. bar (p, 1);
  20. #pragma omp for
  21. for (p = s; p != r; p--)
  22. bar (p, 2);
  23. #pragma omp for
  24. for (p = q; p != r; p = p + 1)
  25. bar (p, 4);
  26. #pragma omp for
  27. for (p = s; p != r; p = p - 1)
  28. bar (p, 8);
  29. #pragma omp for
  30. for (p = q; p != r; p = 1 + p)
  31. bar (p, 16);
  32. #pragma omp for
  33. for (p = s; p != r; p = -1 + p)
  34. bar (p, 32);
  35. #pragma omp for
  36. for (p = q; p != r; p += 1)
  37. bar (p, 64);
  38. #pragma omp for
  39. for (p = s; p != r; p -= 1)
  40. bar (p, 128);
  41. }
  42. __attribute__((noinline, noclone)) void
  43. baz (void *qx, void *rx, void *sx, int n)
  44. {
  45. unsigned short (*q)[n], (*r)[n], (*s)[n], (*p)[n];
  46. q = (typeof (q)) qx;
  47. r = (typeof (r)) rx;
  48. s = (typeof (s)) sx;
  49. #pragma omp for
  50. for (p = q; p < r; p++)
  51. bar (p, 256);
  52. #pragma omp for
  53. for (p = s; p > r; p--)
  54. bar (p, 512);
  55. #pragma omp for
  56. for (p = q; p < r; p = p + 1)
  57. bar (p, 1024);
  58. #pragma omp for
  59. for (p = s; p > r; p = p - 1)
  60. bar (p, 2048);
  61. #pragma omp for
  62. for (p = q; p < r; p = 1 + p)
  63. bar (p, 4096);
  64. #pragma omp for
  65. for (p = s; p > r; p = -1 + p)
  66. bar (p, 8192);
  67. #pragma omp for
  68. for (p = q; p < r; p += 1)
  69. bar (p, 16384);
  70. #pragma omp for
  71. for (p = s; p > r; p -= 1)
  72. bar (p, 32768U);
  73. }
  74. int
  75. main ()
  76. {
  77. int i;
  78. volatile int j = 7;
  79. #pragma omp parallel
  80. {
  81. foo (&a[5 + (j - 7)], &a[124 + (j - 7)], &a[222 + (j - 7)], j);
  82. baz (&a[5 + (j - 7)], &a[124 + (j - 7)], &a[222 + (j - 7)], j);
  83. }
  84. for (i = 0; i < 256; i++)
  85. if (i < 5 || i > 222 || i == 124 || ((i - 5) % 7) != 0)
  86. {
  87. if (a[i])
  88. __builtin_abort ();
  89. }
  90. else if (i < 124 && a[i] != 1 + 4 + 16 + 64 + 256 + 1024 + 4096 + 16384)
  91. __builtin_abort ();
  92. else if (i > 124 && a[i] != 2 + 8 + 32 + 128 + 512 + 2048 + 8192 + 32768U)
  93. __builtin_abort ();
  94. return 0;
  95. }