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