Clang Project

clang_source_code/test/OpenMP/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 --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// 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 simd
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 simd 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
63template <typename T>
64int tmain(T Arg) {
65#pragma omp target
66#pragma omp teams distribute parallel for simd if (true)
67  for(int i = 0 ; i < 100; i++) {
68    fn1();
69  }
70#pragma omp target
71#pragma omp teams distribute parallel for simd if (false)
72  for(int i = 0 ; i < 100; i++) {
73    fn2();
74  }
75#pragma omp target
76#pragma omp teams distribute parallel for simd 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()
84int 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 simd 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 simd 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 simd 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
190// CHECK: !{!"llvm.loop.vectorize.enable", i1 true}
191
192#endif
193