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