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