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 |
130 | |