xref: /llvm-project/clang/test/OpenMP/loop_bind_codegen.cpp (revision 8ab62da18d47fa0ce6aef9da50cca34a26ea775c)
1*8ab62da1SChi Chun Chen // expected-no-diagnostics
2*8ab62da1SChi Chun Chen // RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ %s -emit-llvm -o - | FileCheck %s
3*8ab62da1SChi Chun Chen // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
4*8ab62da1SChi Chun Chen 
5*8ab62da1SChi Chun Chen 
6*8ab62da1SChi Chun Chen #define NNN 50
7*8ab62da1SChi Chun Chen int aaa[NNN];
8*8ab62da1SChi Chun Chen 
parallel_loop()9*8ab62da1SChi Chun Chen void parallel_loop() {
10*8ab62da1SChi Chun Chen   #pragma omp parallel
11*8ab62da1SChi Chun Chen   {
12*8ab62da1SChi Chun Chen     #pragma omp loop bind(parallel)
13*8ab62da1SChi Chun Chen     for (int j = 0 ; j < NNN ; j++) {
14*8ab62da1SChi Chun Chen       aaa[j] = j*NNN;
15*8ab62da1SChi Chun Chen     }
16*8ab62da1SChi Chun Chen   }
17*8ab62da1SChi Chun Chen }
18*8ab62da1SChi Chun Chen 
parallel_loop_orphan()19*8ab62da1SChi Chun Chen void parallel_loop_orphan() {
20*8ab62da1SChi Chun Chen   #pragma omp loop bind(parallel)
21*8ab62da1SChi Chun Chen   for (int j = 0 ; j < NNN ; j++) {
22*8ab62da1SChi Chun Chen      aaa[j] = j*NNN;
23*8ab62da1SChi Chun Chen   }
24*8ab62da1SChi Chun Chen }
25*8ab62da1SChi Chun Chen 
26*8ab62da1SChi Chun Chen 
teams_loop()27*8ab62da1SChi Chun Chen void teams_loop() {
28*8ab62da1SChi Chun Chen   #pragma omp teams
29*8ab62da1SChi Chun Chen   {
30*8ab62da1SChi Chun Chen      #pragma omp loop bind(teams)
31*8ab62da1SChi Chun Chen      for (int j = 0 ; j < NNN ; j++) {
32*8ab62da1SChi Chun Chen        aaa[j] = j*NNN;
33*8ab62da1SChi Chun Chen      }
34*8ab62da1SChi Chun Chen    }
35*8ab62da1SChi Chun Chen }
36*8ab62da1SChi Chun Chen 
thread_loop()37*8ab62da1SChi Chun Chen void thread_loop() {
38*8ab62da1SChi Chun Chen   #pragma omp parallel
39*8ab62da1SChi Chun Chen   {
40*8ab62da1SChi Chun Chen      #pragma omp loop bind(thread)
41*8ab62da1SChi Chun Chen      for (int j = 0 ; j < NNN ; j++) {
42*8ab62da1SChi Chun Chen        aaa[j] = j*NNN;
43*8ab62da1SChi Chun Chen      }
44*8ab62da1SChi Chun Chen    }
45*8ab62da1SChi Chun Chen }
46*8ab62da1SChi Chun Chen 
thread_loop_orphan()47*8ab62da1SChi Chun Chen void thread_loop_orphan() {
48*8ab62da1SChi Chun Chen   #pragma omp loop bind(thread)
49*8ab62da1SChi Chun Chen   for (int j = 0 ; j < NNN ; j++) {
50*8ab62da1SChi Chun Chen     aaa[j] = j*NNN;
51*8ab62da1SChi Chun Chen   }
52*8ab62da1SChi Chun Chen }
53*8ab62da1SChi Chun Chen 
main()54*8ab62da1SChi Chun Chen int main() {
55*8ab62da1SChi Chun Chen   parallel_loop();
56*8ab62da1SChi Chun Chen   parallel_loop_orphan();
57*8ab62da1SChi Chun Chen   teams_loop();
58*8ab62da1SChi Chun Chen   thread_loop();
59*8ab62da1SChi Chun Chen   thread_loop_orphan();
60*8ab62da1SChi Chun Chen 
61*8ab62da1SChi Chun Chen   return 0;
62*8ab62da1SChi Chun Chen }
63*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}parallel_loop{{.+}}
64*8ab62da1SChi Chun Chen // CHECK:    call {{.+}}__kmpc_fork_call({{.+}}parallel_loop{{.+}}.omp_outlined{{.*}})
65*8ab62da1SChi Chun Chen //
66*8ab62da1SChi Chun Chen //
67*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}parallel_loop{{.+}}.omp_outlined{{.+}}
68*8ab62da1SChi Chun Chen // CHECK:         call {{.+}}__kmpc_for_static_init_4
69*8ab62da1SChi Chun Chen // CHECK:       omp.inner.for.body:
70*8ab62da1SChi Chun Chen // CHECK:       omp.loop.exit:
71*8ab62da1SChi Chun Chen // CHECK-NEXT:    call {{.+}}__kmpc_for_static_fini
72*8ab62da1SChi Chun Chen // CHECK-NEXT:    call {{.+}}__kmpc_barrier
73*8ab62da1SChi Chun Chen //
74*8ab62da1SChi Chun Chen //
75*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}parallel_loop_orphan{{.+}}
76*8ab62da1SChi Chun Chen // CHECK:         [[TMP0:%.*]] = call {{.+}}__kmpc_global_thread_num
77*8ab62da1SChi Chun Chen // CHECK:         call {{.+}}__kmpc_for_static_init_4
78*8ab62da1SChi Chun Chen // CHECK:       omp.inner.for.body:
79*8ab62da1SChi Chun Chen // CHECK:       omp.inner.for.end:
80*8ab62da1SChi Chun Chen // CHECK:       omp.loop.exit:
81*8ab62da1SChi Chun Chen // CHECK-NEXT:    call {{.+}}__kmpc_for_static_fini
82*8ab62da1SChi Chun Chen // CHECK-NEXT:    call {{.+}}__kmpc_barrier
83*8ab62da1SChi Chun Chen //
84*8ab62da1SChi Chun Chen //
85*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}teams_loop{{.+}}
86*8ab62da1SChi Chun Chen // CHECK:    call {{.+}}__kmpc_fork_teams({{.+}}teams_loop{{.+}}.omp_outlined{{.*}})
87*8ab62da1SChi Chun Chen //
88*8ab62da1SChi Chun Chen //
89*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}teams_loop{{.+}}.omp_outlined{{.+}}
90*8ab62da1SChi Chun Chen // CHECK:         call {{.+}}__kmpc_for_static_init_4
91*8ab62da1SChi Chun Chen // CHECK:       omp.inner.for.body:
92*8ab62da1SChi Chun Chen // CHECK:       omp.loop.exit:
93*8ab62da1SChi Chun Chen // CHECK-NEXT:    call {{.+}}__kmpc_for_static_fini
94*8ab62da1SChi Chun Chen //
95*8ab62da1SChi Chun Chen //
96*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}thread_loop{{.+}}
97*8ab62da1SChi Chun Chen // CHECK:    call {{.+}}__kmpc_fork_call({{.+}}thread_loop{{.+}}.omp_outlined{{.*}})
98*8ab62da1SChi Chun Chen //
99*8ab62da1SChi Chun Chen //
100*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}thread_loop{{.+}}.omp_outlined{{.+}}
101*8ab62da1SChi Chun Chen // CHECK:       omp.inner.for.body:
102*8ab62da1SChi Chun Chen // CHECK:       omp.inner.for.end:
103*8ab62da1SChi Chun Chen //
104*8ab62da1SChi Chun Chen //
105*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}thread_loop_orphan{{.+}}
106*8ab62da1SChi Chun Chen // CHECK:       omp.inner.for.cond:
107*8ab62da1SChi Chun Chen // CHECK:       omp.inner.for.body:
108*8ab62da1SChi Chun Chen // CHECK:       omp.inner.for.end:
109*8ab62da1SChi Chun Chen //
110*8ab62da1SChi Chun Chen //
111*8ab62da1SChi Chun Chen // CHECK-LABEL: define {{.+}}main{{.+}}
112*8ab62da1SChi Chun Chen // CHECK:         call {{.+}}parallel_loop{{.+}}()
113*8ab62da1SChi Chun Chen // CHECK-NEXT:    call {{.+}}parallel_loop_orphan{{.+}}()
114*8ab62da1SChi Chun Chen // CHECK-NEXT:    call {{.+}}teams_loop{{.+}}()
115*8ab62da1SChi Chun Chen // CHECK-NEXT:    call {{.+}}thread_loop{{.+}}()
116*8ab62da1SChi Chun Chen // CHECK-NEXT:    call {{.+}}thread_loop_orphan{{.+}}()
117*8ab62da1SChi Chun Chen //
118