xref: /llvm-project/openmp/runtime/test/worksharing/for/omp_for_bigbounds.c (revision d7fdd236d59f5850a1205929dae5a9e26a6b8c0b)
1 // RUN: %libomp-compile -DMY_SCHEDULE=static && %libomp-run
2 // RUN: %libomp-compile -DMY_SCHEDULE=dynamic && %libomp-run
3 // RUN: %libomp-compile -DMY_SCHEDULE=guided && %libomp-run
4 
5 // Only works with Intel Compiler since at least version 15.0 and clang since
6 // version 11.
7 
8 // XFAIL: gcc, clang-3, clang-4, clang-5, clang-6, clang-7, clang-8, clang-9, clang-10
9 
10 // icc 21 seems to have an issue with the loop boundaries and runs very long
11 // UNSUPPORTED: icc-21
12 
13 /*
14  * Test that large bounds are handled properly and calculations of
15  * loop iterations don't accidentally overflow
16  */
17 #include <stdio.h>
18 #include <omp.h>
19 #include <stdlib.h>
20 #include <limits.h>
21 #include "omp_testsuite.h"
22 
23 #define INCR      50000000
24 #define MY_MAX  2000000000
25 #define MY_MIN -2000000000
26 #ifndef MY_SCHEDULE
27 # define MY_SCHEDULE static
28 #endif
29 
30 int a, b, a_known_value, b_known_value;
31 
test_omp_for_bigbounds()32 int test_omp_for_bigbounds()
33 {
34   a = 0;
35   b = 0;
36   #pragma omp parallel
37   {
38     int i;
39     #pragma omp for schedule(MY_SCHEDULE) reduction(+:a)
40     for (i = INT_MIN; i < MY_MAX; i+=INCR) {
41         a++;
42     }
43     #pragma omp for schedule(MY_SCHEDULE) reduction(+:b)
44     for (i = INT_MAX; i >= MY_MIN; i-=INCR) {
45         b++;
46     }
47   }
48   printf("a = %d (should be %d), b = %d (should be %d)\n", a, a_known_value, b, b_known_value);
49   return (a == a_known_value && b == b_known_value);
50 }
51 
main()52 int main()
53 {
54   int i;
55   int num_failed=0;
56 
57   a_known_value = 0;
58   for (i = INT_MIN; i < MY_MAX; i+=INCR) {
59       a_known_value++;
60   }
61 
62   b_known_value = 0;
63   for (i = INT_MAX; i >= MY_MIN; i-=INCR) {
64       b_known_value++;
65   }
66 
67   for(i = 0; i < REPETITIONS; i++) {
68     if(!test_omp_for_bigbounds()) {
69       num_failed++;
70     }
71   }
72   return num_failed;
73 }
74