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