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