Clang Project

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