for-26.C 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. // { dg-do run }
  2. // { dg-additional-options "-std=c++17" }
  3. typedef __PTRDIFF_TYPE__ ptrdiff_t;
  4. extern "C" void abort ();
  5. namespace std {
  6. template<typename T> struct tuple_size;
  7. template<int, typename> struct tuple_element;
  8. }
  9. template <typename T>
  10. class I
  11. {
  12. public:
  13. typedef ptrdiff_t difference_type;
  14. I ();
  15. ~I ();
  16. I (T *);
  17. I (const I &);
  18. T &operator * ();
  19. T *operator -> ();
  20. T &operator [] (const difference_type &) const;
  21. I &operator = (const I &);
  22. I &operator ++ ();
  23. I operator ++ (int);
  24. I &operator -- ();
  25. I operator -- (int);
  26. I &operator += (const difference_type &);
  27. I &operator -= (const difference_type &);
  28. I operator + (const difference_type &) const;
  29. I operator - (const difference_type &) const;
  30. template <typename S> friend bool operator == (I<S> &, I<S> &);
  31. template <typename S> friend bool operator == (const I<S> &, const I<S> &);
  32. template <typename S> friend bool operator < (I<S> &, I<S> &);
  33. template <typename S> friend bool operator < (const I<S> &, const I<S> &);
  34. template <typename S> friend bool operator <= (I<S> &, I<S> &);
  35. template <typename S> friend bool operator <= (const I<S> &, const I<S> &);
  36. template <typename S> friend bool operator > (I<S> &, I<S> &);
  37. template <typename S> friend bool operator > (const I<S> &, const I<S> &);
  38. template <typename S> friend bool operator >= (I<S> &, I<S> &);
  39. template <typename S> friend bool operator >= (const I<S> &, const I<S> &);
  40. template <typename S> friend typename I<S>::difference_type operator - (I<S> &, I<S> &);
  41. template <typename S> friend typename I<S>::difference_type operator - (const I<S> &, const I<S> &);
  42. template <typename S> friend I<S> operator + (typename I<S>::difference_type , const I<S> &);
  43. private:
  44. T *p;
  45. };
  46. template <typename T> I<T>::I () : p (0) {}
  47. template <typename T> I<T>::~I () {}
  48. template <typename T> I<T>::I (T *x) : p (x) {}
  49. template <typename T> I<T>::I (const I &x) : p (x.p) {}
  50. template <typename T> T &I<T>::operator * () { return *p; }
  51. template <typename T> T *I<T>::operator -> () { return p; }
  52. template <typename T> T &I<T>::operator [] (const difference_type &x) const { return p[x]; }
  53. template <typename T> I<T> &I<T>::operator = (const I &x) { p = x.p; return *this; }
  54. template <typename T> I<T> &I<T>::operator ++ () { ++p; return *this; }
  55. template <typename T> I<T> I<T>::operator ++ (int) { return I (p++); }
  56. template <typename T> I<T> &I<T>::operator -- () { --p; return *this; }
  57. template <typename T> I<T> I<T>::operator -- (int) { return I (p--); }
  58. template <typename T> I<T> &I<T>::operator += (const difference_type &x) { p += x; return *this; }
  59. template <typename T> I<T> &I<T>::operator -= (const difference_type &x) { p -= x; return *this; }
  60. template <typename T> I<T> I<T>::operator + (const difference_type &x) const { return I (p + x); }
  61. template <typename T> I<T> I<T>::operator - (const difference_type &x) const { return I (p - x); }
  62. template <typename T> bool operator == (I<T> &x, I<T> &y) { return x.p == y.p; }
  63. template <typename T> bool operator == (const I<T> &x, const I<T> &y) { return x.p == y.p; }
  64. template <typename T> bool operator != (I<T> &x, I<T> &y) { return !(x == y); }
  65. template <typename T> bool operator != (const I<T> &x, const I<T> &y) { return !(x == y); }
  66. template <typename T> bool operator < (I<T> &x, I<T> &y) { return x.p < y.p; }
  67. template <typename T> bool operator < (const I<T> &x, const I<T> &y) { return x.p < y.p; }
  68. template <typename T> bool operator <= (I<T> &x, I<T> &y) { return x.p <= y.p; }
  69. template <typename T> bool operator <= (const I<T> &x, const I<T> &y) { return x.p <= y.p; }
  70. template <typename T> bool operator > (I<T> &x, I<T> &y) { return x.p > y.p; }
  71. template <typename T> bool operator > (const I<T> &x, const I<T> &y) { return x.p > y.p; }
  72. template <typename T> bool operator >= (I<T> &x, I<T> &y) { return x.p >= y.p; }
  73. template <typename T> bool operator >= (const I<T> &x, const I<T> &y) { return x.p >= y.p; }
  74. template <typename T> typename I<T>::difference_type operator - (I<T> &x, I<T> &y) { return x.p - y.p; }
  75. template <typename T> typename I<T>::difference_type operator - (const I<T> &x, const I<T> &y) { return x.p - y.p; }
  76. template <typename T> I<T> operator + (typename I<T>::difference_type x, const I<T> &y) { return I<T> (x + y.p); }
  77. template <typename T>
  78. class J
  79. {
  80. public:
  81. J(const I<T> &x, const I<T> &y) : b (x), e (y) {}
  82. const I<T> &begin ();
  83. const I<T> &end ();
  84. private:
  85. I<T> b, e;
  86. };
  87. template <typename T> const I<T> &J<T>::begin () { return b; }
  88. template <typename T> const I<T> &J<T>::end () { return e; }
  89. struct K
  90. {
  91. template <int N> int &get () { if (N == 0) return c; else if (N == 1) return b; return a; }
  92. int a, b, c;
  93. };
  94. template <> struct std::tuple_size<K> { static constexpr int value = 3; };
  95. template <int N> struct std::tuple_element<N, K> { using type = int; };
  96. struct L
  97. {
  98. int a, b, c;
  99. };
  100. int a[2000];
  101. long b[40];
  102. short c[50];
  103. int d[1024];
  104. K e[1089];
  105. L f[1093];
  106. int results[2000];
  107. template <typename T>
  108. void
  109. baz (I<T> &i)
  110. {
  111. if (*i < 0 || *i >= 2000)
  112. abort ();
  113. results[*i]++;
  114. }
  115. void
  116. baz (int i)
  117. {
  118. if (i < 0 || i >= 2000)
  119. abort ();
  120. results[i]++;
  121. }
  122. void
  123. f1 ()
  124. {
  125. #pragma omp distribute parallel for default(none) shared(a)
  126. for (auto i : a)
  127. baz (i);
  128. }
  129. void
  130. f2 ()
  131. {
  132. #pragma omp distribute parallel for default(none) shared(a)
  133. for (auto &i : a)
  134. if (&i != &a[i])
  135. abort ();
  136. else
  137. baz (i);
  138. }
  139. void
  140. f3 ()
  141. {
  142. #pragma omp distribute parallel for collapse(3) default(none) shared(b, c)
  143. for (auto &i : b)
  144. for (int j = 9; j < 10; j++)
  145. for (auto k : c)
  146. if (&i != &b[i] || i < 0 || i >= 40 || j != 9 || k < 0 || k >= 50)
  147. abort ();
  148. else
  149. baz (i * 50 + k);
  150. }
  151. void
  152. f4 (J<int> j)
  153. {
  154. #pragma omp distribute parallel for default(none) shared(j, a)
  155. for (auto &i : j)
  156. if (&i != &a[i])
  157. abort ();
  158. else
  159. baz (i);
  160. }
  161. void
  162. f5 ()
  163. {
  164. #pragma omp distribute parallel for simd default(none) shared(d, results)
  165. for (auto i : d)
  166. results[i % 1024] += 2 * ((unsigned) i >> 10) + 1;
  167. }
  168. void
  169. f6 (J<K> j)
  170. {
  171. #pragma omp distribute parallel for default(none) shared(j, e)
  172. for (auto & [k, l, m] : j)
  173. if (&k != &e[m].c || &l != &e[m].b || &m != &e[m].a || k != m * 3 || l != m * 2)
  174. abort ();
  175. else
  176. baz (m);
  177. }
  178. void
  179. f7 (J<L> j)
  180. {
  181. #pragma omp distribute parallel for default(none) shared(j, f)
  182. for (auto & [k, l, m] : j)
  183. if (&k != &f[k].a || &l != &f[k].b || &m != &f[k].c || l != k * 4 || m != k * 5)
  184. abort ();
  185. else
  186. baz (k);
  187. }
  188. void
  189. f8 (J<K> j)
  190. {
  191. #pragma omp distribute parallel for default(none) shared(j)
  192. for (auto [k, l, m] : j)
  193. if (k != m * 3 || l != m * 2)
  194. abort ();
  195. else
  196. baz (m);
  197. }
  198. void
  199. f9 (J<L> j)
  200. {
  201. #pragma omp distribute parallel for default(none) shared(j)
  202. for (auto [k, l, m] : j)
  203. if (l != k * 4 || m != k * 5)
  204. abort ();
  205. else
  206. baz (k);
  207. }
  208. template <int N>
  209. void
  210. f10 ()
  211. {
  212. #pragma omp distribute parallel for default(none) shared(a)
  213. for (auto i : a)
  214. baz (i);
  215. }
  216. template <int N>
  217. void
  218. f11 ()
  219. {
  220. #pragma omp distribute parallel for default(none) shared(a)
  221. for (auto &i : a)
  222. if (&i != &a[i])
  223. abort ();
  224. else
  225. baz (i);
  226. }
  227. template <int N>
  228. void
  229. f12 ()
  230. {
  231. #pragma omp distribute parallel for collapse(3) default(none) shared(a, b, c)
  232. for (auto &i : b)
  233. for (I<int> j = I<int> (&a[9]); j < I<int> (&a[10]); j++)
  234. for (auto k : c)
  235. if (&i != &b[i] || i < 0 || i >= 40 || *j != 9 || k < 0 || k >= 50)
  236. abort ();
  237. else
  238. baz (i * 50 + k);
  239. }
  240. template <typename T>
  241. void
  242. f13 (J<T> j)
  243. {
  244. #pragma omp distribute parallel for default(none) shared(j, a)
  245. for (auto &i : j)
  246. if (&i != &a[i])
  247. abort ();
  248. else
  249. baz (i);
  250. }
  251. template <int N>
  252. void
  253. f14 ()
  254. {
  255. #pragma omp distribute parallel for simd default(none) shared(d, results)
  256. for (auto i : d)
  257. results[i % N] += 2 * ((unsigned) i >> 10) + 1;
  258. }
  259. template <typename T>
  260. void
  261. f15 (J<T> j)
  262. {
  263. #pragma omp distribute parallel for default(none) shared(j, e)
  264. for (auto & [k, l, m] : j)
  265. if (&k != &e[m].c || &l != &e[m].b || &m != &e[m].a || k != m * 3 || l != m * 2)
  266. abort ();
  267. else
  268. baz (m);
  269. }
  270. template <typename T>
  271. void
  272. f16 (J<T> j)
  273. {
  274. #pragma omp distribute parallel for default(none) shared(j, f)
  275. for (auto & [k, l, m] : j)
  276. if (&k != &f[k].a || &l != &f[k].b || &m != &f[k].c || l != k * 4 || m != k * 5)
  277. abort ();
  278. else
  279. baz (k);
  280. }
  281. template <int N>
  282. void
  283. f17 (J<K> j)
  284. {
  285. #pragma omp distribute parallel for default(none) shared(j)
  286. for (auto [k, l, m] : j)
  287. if (k != m * 3 || l != m * 2)
  288. abort ();
  289. else
  290. baz (m);
  291. }
  292. template <int N>
  293. void
  294. f18 (J<L> j)
  295. {
  296. #pragma omp distribute parallel for default(none) shared(j)
  297. for (auto [k, l, m] : j)
  298. if (l != k * 4 || m != k * 5)
  299. abort ();
  300. else
  301. baz (k);
  302. }
  303. #define check(expr) \
  304. for (int i = 0; i < 2000; i++) \
  305. if (expr) \
  306. { \
  307. if (results[i] != 1) \
  308. abort (); \
  309. results[i] = 0; \
  310. } \
  311. else if (results[i]) \
  312. abort ()
  313. int
  314. main ()
  315. {
  316. for (int i = 0; i < 2000; i++)
  317. a[i] = i;
  318. for (int i = 0; i < 40; i++)
  319. b[i] = i;
  320. for (int i = 0; i < 50; i++)
  321. c[i] = i;
  322. for (int i = 0; i < 1024; i++)
  323. d[i] = i;
  324. for (int i = 0; i < 1089; i++)
  325. {
  326. e[i].a = i;
  327. e[i].b = 2 * i;
  328. e[i].c = 3 * i;
  329. }
  330. for (int i = 0; i < 1093; i++)
  331. {
  332. f[i].a = i;
  333. f[i].b = 4 * i;
  334. f[i].c = 5 * i;
  335. }
  336. #pragma omp teams
  337. f1 ();
  338. check (1);
  339. #pragma omp teams
  340. f2 ();
  341. check (1);
  342. #pragma omp teams
  343. f3 ();
  344. check (1);
  345. #pragma omp teams
  346. f4 (J<int> (&a[14], &a[1803]));
  347. check (i >= 14 && i < 1803);
  348. #pragma omp teams
  349. f5 ();
  350. check (i >= 0 && i < 1024);
  351. #pragma omp teams
  352. f6 (J<K> (&e[19], &e[1029]));
  353. check (i >= 19 && i < 1029);
  354. #pragma omp teams
  355. f7 (J<L> (&f[15], &f[1091]));
  356. check (i >= 15 && i < 1091);
  357. #pragma omp teams
  358. f8 (J<K> (&e[27], &e[1037]));
  359. check (i >= 27 && i < 1037);
  360. #pragma omp teams
  361. f9 (J<L> (&f[1], &f[1012]));
  362. check (i >= 1 && i < 1012);
  363. #pragma omp teams
  364. f10 <0> ();
  365. check (1);
  366. #pragma omp teams
  367. f11 <1> ();
  368. check (1);
  369. #pragma omp teams
  370. f12 <2> ();
  371. check (1);
  372. #pragma omp teams
  373. f13 (J<int> (&a[24], &a[1703]));
  374. check (i >= 24 && i < 1703);
  375. #pragma omp teams
  376. f14 <1024> ();
  377. check (i >= 0 && i < 1024);
  378. #pragma omp teams
  379. f15 (J<K> (&e[39], &e[929]));
  380. check (i >= 39 && i < 929);
  381. #pragma omp teams
  382. f16 (J<L> (&f[17], &f[1071]));
  383. check (i >= 17 && i < 1071);
  384. #pragma omp teams
  385. f17 <3> (J<K> (&e[7], &e[1017]));
  386. check (i >= 7 && i < 1017);
  387. #pragma omp teams
  388. f18 <5> (J<L> (&f[121], &f[1010]));
  389. check (i >= 121 && i < 1010);
  390. }