]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/OpenMP/target_teams_distribute_parallel_for_simd_if_codegen.cpp
Vendor import of clang trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / test / OpenMP / target_teams_distribute_parallel_for_simd_if_codegen.cpp
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 %s --check-prefix SIMD-ONLY
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 %s --check-prefix SIMD-ONLY
8 // SIMD-ONLY-NOT: {{__kmpc|__tgt}}
9
10 // expected-no-diagnostics
11 #ifndef HEADER
12 #define HEADER
13
14 void fn1();
15 void fn2();
16 void fn3();
17 void fn4();
18 void fn5();
19 void fn6();
20
21 int Arg;
22
23 // CHECK-LABEL: define {{.*}}void @{{.+}}gtid_test
24 void gtid_test() {
25 // CHECK: call void @__kmpc_push_target_tripcount(i64 -1, i64 100)
26 // CHECK: call i{{[0-9]+}} @__tgt_target_teams(
27 // CHECK: call void [[OFFLOADING_FUN_0:@.+]](
28 // CHECK: call void @__kmpc_push_target_tripcount(i64 -1, i64 100)
29 // CHECK: call i{{[0-9]+}} @__tgt_target_teams(
30 // CHECK: call void [[OFFLOADING_FUN_1:@.+]](
31 #pragma omp target teams distribute parallel for simd
32   for(int i = 0 ; i < 100; i++) {}
33   // CHECK: define internal void [[OFFLOADING_FUN_0]](
34   // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}}* [[OMP_TEAMS_OUTLINED_0:@.+]] to {{.+}})
35   // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_0]](
36   // CHECK: call void @__kmpc_for_static_init_4(
37   // CHECK:  call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, {{.+}}* [[OMP_OUTLINED_0:@.+]] to void
38   // CHECK: call void @__kmpc_for_static_fini(
39
40   // CHECK: define{{.+}} void [[OMP_OUTLINED_0]](
41   // CHECK: call void @__kmpc_for_static_init_4(
42   // CHECK: call void @__kmpc_for_static_fini(
43   // CHECK: ret
44 #pragma omp target teams distribute parallel for simd if (parallel: false)
45   for(int i = 0 ; i < 100; i++) {
46   // CHECK: define internal void [[OFFLOADING_FUN_1]](
47   // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}}* [[OMP_TEAMS_OUTLINED_1:@.+]] to {{.+}})
48   // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_1]](
49   // CHECK: call void @__kmpc_for_static_init_4(
50   // CHECK: call void @__kmpc_serialized_parallel(
51   // CHECK: call void [[OMP_OUTLINED_1:@.+]](
52   // CHECK: call void @__kmpc_end_serialized_parallel(
53   // CHECK: call void @__kmpc_for_static_fini(
54   // CHECK: define{{.+}} void [[OMP_OUTLINED_1]](
55   // CHECK: call void @__kmpc_for_static_init_4(
56   // CHECK: call void @{{.+}}gtid_test
57   // CHECK: call void @__kmpc_for_static_fini(
58   // CHECK: ret
59     gtid_test();
60   }
61 }
62
63
64 template <typename T>
65 int tmain(T Arg) {
66 #pragma omp target teams distribute parallel for simd if (true)
67   for(int i = 0 ; i < 100; i++) {
68     fn1();
69   }
70 #pragma omp target teams distribute parallel for simd if (false)
71   for(int i = 0 ; i < 100; i++) {
72     fn2();
73   }
74 #pragma omp target teams distribute parallel for simd if (parallel: Arg)
75   for(int i = 0 ; i < 100; i++) {
76     fn3();
77   }
78   return 0;
79 }
80
81 // CHECK-LABEL: define {{.*}}i{{[0-9]+}} @main()
82 int main() {
83 // CHECK: call void @__kmpc_push_target_tripcount(i64 -1, i64 100)
84 // CHECK: call i{{[0-9]+}} @__tgt_target_teams(
85 // CHECK: call void [[OFFLOADING_FUN_0:@.+]](
86 // CHECK: call void @__kmpc_push_target_tripcount(i64 -1, i64 100)
87 // CHECK: call void [[OFFLOADING_FUN_1:@.+]](
88 // CHECK: call void @__kmpc_push_target_tripcount(i64 -1, i64 100)
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 teams distribute parallel for simd if (true)
93   for(int i = 0 ; i < 100; i++) {
94     // CHECK: define internal void [[OFFLOADING_FUN_0]](
95     // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}}* [[OMP_TEAMS_OUTLINED_0:@.+]] to {{.+}})
96     // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_0]](
97
98     // CHECK: call void @__kmpc_for_static_init_4(
99     // CHECK: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, {{.+}}* [[OMP_OUTLINED_2:@.+]] to void
100     // CHECK: call void @__kmpc_for_static_fini(
101     // CHECK: define{{.+}} void [[OMP_OUTLINED_2]](
102     // CHECK: call void @__kmpc_for_static_init_4(
103     // CHECK: call {{.*}}void @{{.+}}fn4
104     // CHECK: call void @__kmpc_for_static_fini(
105
106     fn4();
107   }
108
109 #pragma omp target teams distribute parallel for simd if (false)
110   for(int i = 0 ; i < 100; i++) {
111     // CHECK: define internal void [[OFFLOADING_FUN_1]](
112     // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}}* [[OMP_TEAMS_OUTLINED_1:@.+]] to {{.+}})
113     // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_1]](
114
115     // CHECK: call void @__kmpc_for_static_init_4(
116     // CHECK: call void @__kmpc_serialized_parallel(
117     // CHECK: call void [[OMP_OUTLINED_3:@.+]](
118     // CHECK: call void @__kmpc_end_serialized_parallel(
119     // CHECK: call void @__kmpc_for_static_fini(
120
121     // CHECK: define{{.+}} void [[OMP_OUTLINED_3]](
122     // CHECK: call void @__kmpc_for_static_init_4(
123     // CHECK: call {{.*}}void @{{.+}}fn5
124     // CHECK: call void @__kmpc_for_static_fini(
125     fn5();
126   }
127
128 #pragma omp target teams distribute parallel for simd if (Arg)
129   for(int i = 0 ; i < 100; i++) {
130     // CHECK: define internal void [[OFFLOADING_FUN_2]](
131     // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_teams({{.+}}, i32 1, {{.+}}* [[OMP_TEAMS_OUTLINED_2:@.+]] to {{.+}})
132     // CHECK: define{{.+}} void [[OMP_TEAMS_OUTLINED_2]](
133
134     // CHECK: call void @__kmpc_for_static_init_4(
135     // CHECK: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, {{.+}}* [[OMP_OUTLINED_4:@.+]] to void
136     // CHECK: call void @__kmpc_serialized_parallel(
137     // CHECK: call void [[OMP_OUTLINED_4:@.+]](
138     // CHECK: call void @__kmpc_end_serialized_parallel(
139     // CHECK: call void @__kmpc_for_static_fini(
140
141     // CHECK: define{{.+}} void [[OMP_OUTLINED_4]](
142     // CHECK: call void @__kmpc_for_static_init_4(
143     // CHECK: call {{.*}}void @{{.+}}fn6
144     // CHECK: call void @__kmpc_for_static_fini(
145     fn6();
146   }
147
148   return tmain(Arg);
149 }
150
151 // CHECK-LABEL: define {{.+}} @{{.+}}tmain
152
153 // CHECK: call void @__kmpc_for_static_init_4(
154 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, void {{.+}}* [[T_OUTLINE_FUN_1:@.+]] to void
155 // CHECK: call void @__kmpc_for_static_fini(
156
157 // CHECK: define internal {{.*}}void [[T_OUTLINE_FUN_1]]
158 // CHECK: call void @__kmpc_for_static_init_4(
159 // CHECK: call {{.*}}void @{{.+}}fn1
160 // CHECK: call void @__kmpc_for_static_fini(
161 // CHECK: ret void
162
163 // CHECK: call void @__kmpc_for_static_init_4(
164 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(
165 // CHECK: call void [[T_OUTLINE_FUN_2:@.+]](
166 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(
167 // CHECK: call void @__kmpc_for_static_fini(
168
169 // CHECK: define internal {{.*}}void [[T_OUTLINE_FUN_2]]
170 // CHECK: call void @__kmpc_for_static_init_4(
171 // CHECK: call {{.*}}void @{{.+}}fn2
172 // CHECK: call void @__kmpc_for_static_fini(
173 // CHECK: ret void
174
175 // CHECK: call void @__kmpc_for_static_init_4(
176 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 2, void {{.+}}* [[T_OUTLINE_FUN_3:@.+]] to void
177 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(
178 // call void [[T_OUTLINE_FUN_3:@.+]](
179 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(
180
181 // CHECK: define internal {{.*}}void [[T_OUTLINE_FUN_3]]
182 // CHECK: call void @__kmpc_for_static_init_4(
183 // CHECK: call {{.*}}void @{{.+}}fn3
184 // CHECK: call void @__kmpc_for_static_fini(
185 // CHECK: ret void
186 #endif