]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/OpenMP/parallel_if_codegen.cpp
Vendor import of clang trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / test / OpenMP / parallel_if_codegen.cpp
1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -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 -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 -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -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 // CHECK:  call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, {{.+}}* [[GTID_TEST_REGION1:@.+]] to void
25 #pragma omp parallel
26 #pragma omp parallel if (parallel: false)
27   gtid_test();
28 // CHECK: ret void
29 }
30
31 // CHECK: define internal {{.*}}void [[GTID_TEST_REGION1]](i{{.+}}* noalias [[GTID_PARAM:%.+]], i32* noalias
32 // CHECK: store i32 0, i32* [[ZERO_ADDR:%.+]],
33 // CHECK: store i{{[0-9]+}}* [[GTID_PARAM]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]],
34 // CHECK: [[GTID_ADDR:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
35 // CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_ADDR]]
36 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]])
37 // CHECK: call void [[GTID_TEST_REGION2:@.+]](i{{[0-9]+}}* [[ZERO_ADDR]]
38 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]])
39 // CHECK: ret void
40
41 // CHECK: define internal {{.*}}void [[GTID_TEST_REGION2]](
42 // CHECK: call {{.*}}void @{{.+}}gtid_test
43 // CHECK: ret void
44
45 template <typename T>
46 int tmain(T Arg) {
47 #pragma omp parallel if (true)
48   fn1();
49 #pragma omp parallel if (false)
50   fn2();
51 #pragma omp parallel if (parallel: Arg)
52   fn3();
53   return 0;
54 }
55
56 // CHECK-LABEL: define {{.*}}i{{[0-9]+}} @main()
57 int main() {
58 // CHECK: store i32 0, i32* [[ZERO_ADDR2:%.+]],
59 // CHECK: store i32 0, i32* [[ZERO_ADDR1:%.+]],
60 // CHECK: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num(
61 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, void {{.+}}* [[CAP_FN4:@.+]] to void
62 #pragma omp parallel if (true)
63   fn4();
64 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
65 // CHECK: call void [[CAP_FN5:@.+]](i32* [[ZERO_ADDR1]], i32* [[ZERO_ADDR1]])
66 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
67 #pragma omp parallel if (false)
68   fn5();
69
70 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
71 // CHECK: [[OMP_THEN]]
72 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, void {{.+}}* [[CAP_FN6:@.+]] to void
73 // CHECK: br label %[[OMP_END:.+]]
74 // CHECK: [[OMP_ELSE]]
75 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
76 // CHECK: call void [[CAP_FN6]](i32* [[ZERO_ADDR2]], i32* [[ZERO_ADDR2]])
77 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
78 // CHECK: br label %[[OMP_END]]
79 // CHECK: [[OMP_END]]
80 #pragma omp parallel if (Arg)
81   fn6();
82   // CHECK: = call {{.*}}i{{.+}} @{{.+}}tmain
83   return tmain(Arg);
84 }
85
86 // CHECK: define internal {{.*}}void [[CAP_FN4]]
87 // CHECK: call {{.*}}void @{{.+}}fn4
88 // CHECK: ret void
89
90 // CHECK: define internal {{.*}}void [[CAP_FN5]]
91 // CHECK: call {{.*}}void @{{.+}}fn5
92 // CHECK: ret void
93
94 // CHECK: define internal {{.*}}void [[CAP_FN6]]
95 // CHECK: call {{.*}}void @{{.+}}fn6
96 // CHECK: ret void
97
98 // CHECK-LABEL: define {{.+}} @{{.+}}tmain
99 // CHECK: store i32 0, i32* [[ZERO_ADDR2:%.+]],
100 // CHECK: store i32 0, i32* [[ZERO_ADDR1:%.+]],
101 // CHECK: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num(
102 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, void {{.+}}* [[CAP_FN1:@.+]] to void
103 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
104 // CHECK: call void [[CAP_FN2:@.+]](i32* [[ZERO_ADDR1]], i32* [[ZERO_ADDR1]])
105 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
106 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
107 // CHECK: [[OMP_THEN]]
108 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, void {{.+}}* [[CAP_FN3:@.+]] to void
109 // CHECK: br label %[[OMP_END:.+]]
110 // CHECK: [[OMP_ELSE]]
111 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
112 // CHECK: call void [[CAP_FN3]](i32* [[ZERO_ADDR2]], i32* [[ZERO_ADDR2]])
113 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
114 // CHECK: br label %[[OMP_END]]
115 // CHECK: [[OMP_END]]
116
117 // CHECK: define internal {{.*}}void [[CAP_FN1]]
118 // CHECK: call {{.*}}void @{{.+}}fn1
119 // CHECK: ret void
120
121 // CHECK: define internal {{.*}}void [[CAP_FN2]]
122 // CHECK: call {{.*}}void @{{.+}}fn2
123 // CHECK: ret void
124
125 // CHECK: define internal {{.*}}void [[CAP_FN3]]
126 // CHECK: call {{.*}}void @{{.+}}fn3
127 // CHECK: ret void
128
129 #endif