1 /* PR libgomp/29947 */ 2 /* { dg-options "-O2 -fopenmp" } */ 3 /* { dg-do run } */ 4 5 extern void abort (void); 6 7 int cnt; 8 9 void 10 test1 (long j1, long k1, long j2, long k2) 11 { 12 long i, e = 0, c = 0; 13 #pragma omp parallel reduction (+:e,c) 14 { 15 #pragma omp for schedule (dynamic) 16 for (i = j1; i <= k1; ++i) 17 { 18 if (i < j2 || i > k2) 19 ++e; 20 ++c; 21 } 22 #pragma omp atomic 23 ++cnt; 24 } 25 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 26 abort (); 27 } 28 29 void 30 test2 (long j1, long k1, long j2, long k2) 31 { 32 long i, e = 0, c = 0; 33 #pragma omp parallel reduction (+:e,c) 34 { 35 #pragma omp for schedule (dynamic) 36 for (i = k1; i >= j1; --i) 37 { 38 if (i < j2 || i > k2) 39 ++e; 40 ++c; 41 } 42 #pragma omp atomic 43 ++cnt; 44 } 45 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 46 abort (); 47 } 48 49 void 50 test3 (long j1, long k1, long j2, long k2) 51 { 52 long i, e = 0, c = 0; 53 #pragma omp parallel reduction (+:e,c) 54 { 55 #pragma omp for schedule (guided) 56 for (i = j1; i <= k1; ++i) 57 { 58 if (i < j2 || i > k2) 59 ++e; 60 ++c; 61 } 62 #pragma omp atomic 63 ++cnt; 64 } 65 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 66 abort (); 67 } 68 69 void 70 test4 (long j1, long k1, long j2, long k2) 71 { 72 long i, e = 0, c = 0; 73 #pragma omp parallel reduction (+:e,c) 74 { 75 #pragma omp for schedule (guided) 76 for (i = k1; i >= j1; --i) 77 { 78 if (i < j2 || i > k2) 79 ++e; 80 ++c; 81 } 82 #pragma omp atomic 83 ++cnt; 84 } 85 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 86 abort (); 87 } 88 89 void 90 test5 (long j1, long k1, long j2, long k2) 91 { 92 long i, e = 0, c = 0; 93 #pragma omp parallel reduction (+:e,c) 94 { 95 #pragma omp for schedule (dynamic) ordered 96 for (i = j1; i <= k1; ++i) 97 { 98 if (i < j2 || i > k2) 99 ++e; 100 #pragma omp ordered 101 ++c; 102 } 103 #pragma omp atomic 104 ++cnt; 105 } 106 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 107 abort (); 108 } 109 110 void 111 test6 (long j1, long k1, long j2, long k2) 112 { 113 long i, e = 0, c = 0; 114 #pragma omp parallel reduction (+:e,c) 115 { 116 #pragma omp for schedule (dynamic) ordered 117 for (i = k1; i >= j1; --i) 118 { 119 if (i < j2 || i > k2) 120 ++e; 121 #pragma omp ordered 122 ++c; 123 } 124 #pragma omp atomic 125 ++cnt; 126 } 127 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 128 abort (); 129 } 130 131 void 132 test7 (long j1, long k1, long j2, long k2) 133 { 134 long i, e = 0, c = 0; 135 #pragma omp parallel reduction (+:e,c) 136 { 137 #pragma omp for schedule (guided) ordered 138 for (i = j1; i <= k1; ++i) 139 { 140 if (i < j2 || i > k2) 141 ++e; 142 #pragma omp ordered 143 ++c; 144 } 145 #pragma omp atomic 146 ++cnt; 147 } 148 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 149 abort (); 150 } 151 152 void 153 test8 (long j1, long k1, long j2, long k2) 154 { 155 long i, e = 0, c = 0; 156 #pragma omp parallel reduction (+:e,c) 157 { 158 #pragma omp for schedule (guided) ordered 159 for (i = k1; i >= j1; --i) 160 { 161 if (i < j2 || i > k2) 162 ++e; 163 #pragma omp ordered 164 ++c; 165 } 166 #pragma omp atomic 167 ++cnt; 168 } 169 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 170 abort (); 171 } 172 173 void 174 test9 (long j1, long k1, long j2, long k2) 175 { 176 long i, e = 0, c = 0; 177 #pragma omp parallel for reduction (+:e,c) schedule (dynamic) 178 for (i = j1; i <= k1; ++i) 179 { 180 if (i < j2 || i > k2) 181 ++e; 182 ++c; 183 } 184 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 185 abort (); 186 } 187 188 void 189 test10 (long j1, long k1, long j2, long k2) 190 { 191 long i, e = 0, c = 0; 192 #pragma omp parallel for reduction (+:e,c) schedule (dynamic) 193 for (i = k1; i >= j1; --i) 194 { 195 if (i < j2 || i > k2) 196 ++e; 197 ++c; 198 } 199 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 200 abort (); 201 } 202 203 void 204 test11 (long j1, long k1, long j2, long k2) 205 { 206 long i, e = 0, c = 0; 207 #pragma omp parallel for reduction (+:e,c) schedule (guided) 208 for (i = j1; i <= k1; ++i) 209 { 210 if (i < j2 || i > k2) 211 ++e; 212 ++c; 213 } 214 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 215 abort (); 216 } 217 218 void 219 test12 (long j1, long k1, long j2, long k2) 220 { 221 long i, e = 0, c = 0; 222 #pragma omp parallel for reduction (+:e,c) schedule (guided) 223 for (i = k1; i >= j1; --i) 224 { 225 if (i < j2 || i > k2) 226 ++e; 227 ++c; 228 } 229 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 230 abort (); 231 } 232 233 void 234 test13 (long j1, long k1, long j2, long k2) 235 { 236 long i, e = 0, c = 0; 237 #pragma omp parallel for reduction (+:e,c) schedule (dynamic) ordered 238 for (i = j1; i <= k1; ++i) 239 { 240 if (i < j2 || i > k2) 241 ++e; 242 #pragma omp ordered 243 ++c; 244 } 245 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 246 abort (); 247 } 248 249 void 250 test14 (long j1, long k1, long j2, long k2) 251 { 252 long i, e = 0, c = 0; 253 #pragma omp parallel for reduction (+:e,c) schedule (dynamic) ordered 254 for (i = k1; i >= j1; --i) 255 { 256 if (i < j2 || i > k2) 257 ++e; 258 #pragma omp ordered 259 ++c; 260 } 261 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 262 abort (); 263 } 264 265 void 266 test15 (long j1, long k1, long j2, long k2) 267 { 268 long i, e = 0, c = 0; 269 #pragma omp parallel for reduction (+:e,c) schedule (guided) ordered 270 for (i = j1; i <= k1; ++i) 271 { 272 if (i < j2 || i > k2) 273 ++e; 274 #pragma omp ordered 275 ++c; 276 } 277 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 278 abort (); 279 } 280 281 void 282 test16 (long j1, long k1, long j2, long k2) 283 { 284 long i, e = 0, c = 0; 285 #pragma omp parallel for reduction (+:e,c) schedule (guided) ordered 286 for (i = k1; i >= j1; --i) 287 { 288 if (i < j2 || i > k2) 289 ++e; 290 #pragma omp ordered 291 ++c; 292 } 293 if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1)) 294 abort (); 295 } 296 297 int 298 __attribute__((noinline)) 299 test (long j1, long k1, long j2, long k2) 300 { 301 test1 (j1, k1, j2, k2); 302 test2 (j1, k1, j2, k2); 303 test3 (j1, k1, j2, k2); 304 test4 (j1, k1, j2, k2); 305 test5 (j1, k1, j2, k2); 306 test6 (j1, k1, j2, k2); 307 test7 (j1, k1, j2, k2); 308 test8 (j1, k1, j2, k2); 309 test9 (j1, k1, j2, k2); 310 test10 (j1, k1, j2, k2); 311 test11 (j1, k1, j2, k2); 312 test12 (j1, k1, j2, k2); 313 test13 (j1, k1, j2, k2); 314 test14 (j1, k1, j2, k2); 315 test15 (j1, k1, j2, k2); 316 test16 (j1, k1, j2, k2); 317 return cnt; 318 } 319 320 int 321 main (void) 322 { 323 test (1, 5, 1, 5); 324 test (5, 5, 5, 5); 325 test (5, 4, 5, 4); 326 test (5, 1, 5, 1); 327 return 0; 328 } 329