1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix=CHECK %s
4 // expected-no-diagnostics
5 #ifndef HEADER
6 #define HEADER
7 
8 void fn1();
9 void fn2();
10 void fn3();
11 void fn4();
12 void fn5();
13 void fn6();
14 
15 int Arg;
16 
17 // CHECK-LABEL: define {{.*}}void @{{.+}}gtid_test
18 void gtid_test() {
19 #pragma omp target
20 #pragma omp teams
21 // CHECK: call i{{[0-9]+}} @__tgt_target_teams(
22 // CHECK: call void [[OFFLOADING_FUN_0:@.+]](
23 // CHECK: call i{{[0-9]+}} @__tgt_target_teams(
24 // CHECK: call void [[OFFLOADING_FUN_1:@.+]](
25 #pragma omp distribute parallel for
26   for(int i = 0 ; i < 100; i++) {}
27   // CHECK: define internal void [[OFFLOADING_FUN_0]](
28   // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}}* [[OMP_TEAMS_OUTLINED_0:@.+]] to {{.+}})
29   // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_0]](
30   // CHECK: call void @__kmpc_for_static_init_4(
31   // CHECK:  call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, {{.+}}* [[OMP_OUTLINED_0:@.+]] to void
32   // CHECK: call void @__kmpc_for_static_fini(
33 
34   // CHECK: define{{.+}} void [[OMP_OUTLINED_0]](
35   // CHECK: call void @__kmpc_for_static_init_4(
36   // CHECK: call void @__kmpc_for_static_fini(
37   // CHECK: ret
38 #pragma omp target
39 #pragma omp teams
40 #pragma omp distribute parallel for if (parallel: false)
41   for(int i = 0 ; i < 100; i++) {
42   // CHECK: define internal void [[OFFLOADING_FUN_1]](
43   // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}}* [[OMP_TEAMS_OUTLINED_1:@.+]] to {{.+}})
44   // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_1]](
45   // CHECK: call void @__kmpc_for_static_init_4(
46   // CHECK: call void @__kmpc_serialized_parallel(
47   // CHECK: call void [[OMP_OUTLINED_1:@.+]](
48   // CHECK: call void @__kmpc_end_serialized_parallel(
49   // CHECK: call void @__kmpc_for_static_fini(
50   // CHECK: define{{.+}} void [[OMP_OUTLINED_1]](
51   // CHECK: call void @__kmpc_for_static_init_4(
52   // CHECK: call void @{{.+}}gtid_test
53   // CHECK: call void @__kmpc_for_static_fini(
54   // CHECK: ret
55     gtid_test();
56   }
57 }
58 
59 
60 template <typename T>
61 int tmain(T Arg) {
62 #pragma omp target
63 #pragma omp teams
64 #pragma omp distribute parallel for if (true)
65   for(int i = 0 ; i < 100; i++) {
66     fn1();
67   }
68 #pragma omp target
69 #pragma omp teams
70 #pragma omp distribute parallel for if (false)
71   for(int i = 0 ; i < 100; i++) {
72     fn2();
73   }
74 #pragma omp target
75 #pragma omp teams
76 #pragma omp distribute parallel for if (parallel: Arg)
77   for(int i = 0 ; i < 100; i++) {
78     fn3();
79   }
80   return 0;
81 }
82 
83 // CHECK-LABEL: define {{.*}}i{{[0-9]+}} @main()
84 int main() {
85 // CHECK: call i{{[0-9]+}} @__tgt_target_teams(
86 // CHECK: call void [[OFFLOADING_FUN_0:@.+]](
87 // CHECK: call i{{[0-9]+}} @__tgt_target_teams(
88 // CHECK: call void [[OFFLOADING_FUN_1:@.+]](
89 // CHECK: call i{{[0-9]+}} @__tgt_target_teams(
90 // CHECK: call void [[OFFLOADING_FUN_2:@.+]](
91 // CHECK: = call {{.*}}i{{.+}} @{{.+}}tmain
92 #pragma omp target
93 #pragma omp teams
94 #pragma omp distribute parallel for if (true)
95   for(int i = 0 ; i < 100; i++) {
96     // CHECK: define internal void [[OFFLOADING_FUN_0]](
97     // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}}* [[OMP_TEAMS_OUTLINED_0:@.+]] to {{.+}})
98     // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_0]](
99 
100     // CHECK: call void @__kmpc_for_static_init_4(
101     // CHECK: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, {{.+}}* [[OMP_OUTLINED_2:@.+]] to void
102     // CHECK: call void @__kmpc_for_static_fini(
103     // CHECK: define{{.+}} void [[OMP_OUTLINED_2]](
104     // CHECK: call void @__kmpc_for_static_init_4(
105     // CHECK: call {{.*}}void @{{.+}}fn4
106     // CHECK: call void @__kmpc_for_static_fini(
107 
108     fn4();
109   }
110 
111 #pragma omp target
112 #pragma omp teams
113 #pragma omp distribute parallel for if (false)
114   for(int i = 0 ; i < 100; i++) {
115     // CHECK: define internal void [[OFFLOADING_FUN_1]](
116     // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}}* [[OMP_TEAMS_OUTLINED_1:@.+]] to {{.+}})
117     // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_1]](
118 
119     // CHECK: call void @__kmpc_for_static_init_4(
120     // CHECK: call void @__kmpc_serialized_parallel(
121     // CHECK: call void [[OMP_OUTLINED_3:@.+]](
122     // CHECK: call void @__kmpc_end_serialized_parallel(
123     // CHECK: call void @__kmpc_for_static_fini(
124 
125     // CHECK: define{{.+}} void [[OMP_OUTLINED_3]](
126     // CHECK: call void @__kmpc_for_static_init_4(
127     // CHECK: call {{.*}}void @{{.+}}fn5
128     // CHECK: call void @__kmpc_for_static_fini(
129     fn5();
130   }
131 
132 #pragma omp target
133 #pragma omp teams
134 #pragma omp distribute parallel for if (Arg)
135   for(int i = 0 ; i < 100; i++) {
136     // CHECK: define internal void [[OFFLOADING_FUN_2]](
137     // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 1, {{.+}}* [[OMP_TEAMS_OUTLINED_2:@.+]] to {{.+}})
138     // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_2]](
139 
140     // CHECK: call void @__kmpc_for_static_init_4(
141     // CHECK: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, {{.+}}* [[OMP_OUTLINED_4:@.+]] to void
142     // CHECK: call void @__kmpc_serialized_parallel(
143     // CHECK: call void [[OMP_OUTLINED_4:@.+]](
144     // CHECK: call void @__kmpc_end_serialized_parallel(
145     // CHECK: call void @__kmpc_for_static_fini(
146 
147     // CHECK: define{{.+}} void [[OMP_OUTLINED_4]](
148     // CHECK: call void @__kmpc_for_static_init_4(
149     // CHECK: call {{.*}}void @{{.+}}fn6
150     // CHECK: call void @__kmpc_for_static_fini(
151     fn6();
152   }
153 
154   return tmain(Arg);
155 }
156 
157 // CHECK-LABEL: define {{.+}} @{{.+}}tmain
158 
159 // CHECK: call void @__kmpc_for_static_init_4(
160 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, void {{.+}}* [[T_OUTLINE_FUN_1:@.+]] to void
161 // CHECK: call void @__kmpc_for_static_fini(
162 
163 // CHECK: define internal {{.*}}void [[T_OUTLINE_FUN_1]]
164 // CHECK: call void @__kmpc_for_static_init_4(
165 // CHECK: call {{.*}}void @{{.+}}fn1
166 // CHECK: call void @__kmpc_for_static_fini(
167 // CHECK: ret void
168 
169 // CHECK: call void @__kmpc_for_static_init_4(
170 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(
171 // CHECK: call void [[T_OUTLINE_FUN_2:@.+]](
172 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(
173 // CHECK: call void @__kmpc_for_static_fini(
174 
175 // CHECK: define internal {{.*}}void [[T_OUTLINE_FUN_2]]
176 // CHECK: call void @__kmpc_for_static_init_4(
177 // CHECK: call {{.*}}void @{{.+}}fn2
178 // CHECK: call void @__kmpc_for_static_fini(
179 // CHECK: ret void
180 
181 // CHECK: call void @__kmpc_for_static_init_4(
182 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, void {{.+}}* [[T_OUTLINE_FUN_3:@.+]] to void
183 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(
184 // call void [[T_OUTLINE_FUN_3:@.+]](
185 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(
186 
187 // CHECK: define internal {{.*}}void [[T_OUTLINE_FUN_3]]
188 // CHECK: call void @__kmpc_for_static_init_4(
189 // CHECK: call {{.*}}void @{{.+}}fn3
190 // CHECK: call void @__kmpc_for_static_fini(
191 // CHECK: ret void
192 #endif
193