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