xref: /llvm-project/offload/test/offloading/bug64959_compile_only.c (revision 330d8983d25d08580fc1642fea48b2473f47a9da)
1*330d8983SJohannes Doerfert // RUN: %libomptarget-compile-generic
2*330d8983SJohannes Doerfert // RUN: %libomptarget-compileopt-generic
3*330d8983SJohannes Doerfert 
4*330d8983SJohannes Doerfert #include <stdio.h>
5*330d8983SJohannes Doerfert #define N 10
6*330d8983SJohannes Doerfert 
main(void)7*330d8983SJohannes Doerfert int main(void) {
8*330d8983SJohannes Doerfert   long int aa = 0;
9*330d8983SJohannes Doerfert   int res = 0;
10*330d8983SJohannes Doerfert 
11*330d8983SJohannes Doerfert   int ng = 12;
12*330d8983SJohannes Doerfert   int cmom = 14;
13*330d8983SJohannes Doerfert   int nxyz = 5000;
14*330d8983SJohannes Doerfert 
15*330d8983SJohannes Doerfert #pragma omp target teams distribute num_teams(nxyz)                            \
16*330d8983SJohannes Doerfert     thread_limit(ng *(cmom - 1)) map(tofrom : aa)
17*330d8983SJohannes Doerfert   for (int gid = 0; gid < nxyz; gid++) {
18*330d8983SJohannes Doerfert #pragma omp parallel for collapse(2)
19*330d8983SJohannes Doerfert     for (unsigned int g = 0; g < ng; g++) {
20*330d8983SJohannes Doerfert       for (unsigned int l = 0; l < cmom - 1; l++) {
21*330d8983SJohannes Doerfert         int a = 0;
22*330d8983SJohannes Doerfert #pragma omp parallel for reduction(+ : a)
23*330d8983SJohannes Doerfert         for (int i = 0; i < N; i++) {
24*330d8983SJohannes Doerfert           a += i;
25*330d8983SJohannes Doerfert         }
26*330d8983SJohannes Doerfert #pragma omp atomic
27*330d8983SJohannes Doerfert         aa += a;
28*330d8983SJohannes Doerfert       }
29*330d8983SJohannes Doerfert     }
30*330d8983SJohannes Doerfert   }
31*330d8983SJohannes Doerfert   long exp = (long)ng * (cmom - 1) * nxyz * (N * (N - 1) / 2);
32*330d8983SJohannes Doerfert   printf("The result is = %ld exp:%ld!\n", aa, exp);
33*330d8983SJohannes Doerfert   if (aa != exp) {
34*330d8983SJohannes Doerfert     printf("Failed %ld\n", aa);
35*330d8983SJohannes Doerfert     return 1;
36*330d8983SJohannes Doerfert   }
37*330d8983SJohannes Doerfert   // CHECK: Success
38*330d8983SJohannes Doerfert   printf("Success\n");
39*330d8983SJohannes Doerfert   return 0;
40*330d8983SJohannes Doerfert }
41