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