]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/OpenMP/cancellation_point_codegen.cpp
Vendor import of clang trunk r338150:
[FreeBSD/FreeBSD.git] / test / OpenMP / cancellation_point_codegen.cpp
1 // RUN: %clang_cc1 -verify -fopenmp -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s
4
5 // RUN: %clang_cc1 -verify -fopenmp-simd -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s
6 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -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 int main (int argc, char **argv) {
14 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
15 #pragma omp parallel
16 {
17 #pragma omp cancellation point parallel
18 #pragma omp cancel parallel
19   argv[0][0] = argc;
20 }
21 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
22 #pragma omp sections
23 {
24   {
25 #pragma omp cancellation point sections
26 #pragma omp cancel sections
27   }
28 }
29 // CHECK: call void @__kmpc_for_static_init_4(
30 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
31 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
32 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
33 // CHECK: [[EXIT]]
34 // CHECK: br label
35 // CHECK: [[CONTINUE]]
36 // CHECK: br label
37 // CHECK: call void @__kmpc_for_static_fini(
38 // CHECK: call void @__kmpc_barrier(%struct.ident_t*
39 #pragma omp sections
40 {
41 #pragma omp cancellation point sections
42 #pragma omp section
43   {
44 #pragma omp cancellation point sections
45 #pragma omp cancel sections
46   }
47 }
48 // CHECK: call void @__kmpc_for_static_init_4(
49 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
50 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
51 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
52 // CHECK: [[EXIT]]
53 // CHECK: br label
54 // CHECK: [[CONTINUE]]
55 // CHECK: br label
56 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
57 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
58 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
59 // CHECK: [[EXIT]]
60 // CHECK: br label
61 // CHECK: [[CONTINUE]]
62 // CHECK: br label
63 // CHECK: call void @__kmpc_for_static_fini(
64 #pragma omp for
65 for (int i = 0; i < argc; ++i) {
66 #pragma omp cancellation point for
67 #pragma omp cancel for
68 }
69 // CHECK: call void @__kmpc_for_static_init_4(
70 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
71 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
72 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
73 // CHECK: [[EXIT]]
74 // CHECK: br label
75 // CHECK: [[CONTINUE]]
76 // CHECK: br label
77 // CHECK: call void @__kmpc_for_static_fini(
78 // CHECK: call void @__kmpc_barrier(%struct.ident_t*
79 #pragma omp task
80 {
81 #pragma omp cancellation point taskgroup
82 #pragma omp cancel taskgroup
83 }
84 // CHECK: call i8* @__kmpc_omp_task_alloc(
85 // CHECK: call i32 @__kmpc_omp_task(
86 #pragma omp task
87 {
88 #pragma omp cancellation point taskgroup
89 }
90 // CHECK: call i8* @__kmpc_omp_task_alloc(
91 // CHECK: call i32 @__kmpc_omp_task(
92 #pragma omp parallel sections
93 {
94   {
95 #pragma omp cancellation point sections
96 #pragma omp cancel sections
97   }
98 }
99 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
100 #pragma omp parallel sections
101 {
102   {
103 #pragma omp cancellation point sections
104 #pragma omp cancel sections
105   }
106 #pragma omp section
107   {
108 #pragma omp cancellation point sections
109   }
110 }
111 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
112 #pragma omp parallel for
113 for (int i = 0; i < argc; ++i) {
114 #pragma omp cancellation point for
115 #pragma omp cancel for
116 }
117 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
118   return argc;
119 }
120
121 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
122 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
123 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
124 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
125 // CHECK: [[EXIT]]
126 // CHECK: br label %[[RETURN:.+]]
127 // CHECK: [[RETURN]]
128 // CHECK: ret void
129
130 // CHECK: define internal i32 @{{[^(]+}}(i32
131 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
132 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
133 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
134 // CHECK: [[EXIT]]
135 // CHECK: br label %[[RETURN:.+]]
136 // CHECK: [[RETURN]]
137 // CHECK: ret i32 0
138
139 // CHECK: define internal i32 @{{[^(]+}}(i32
140 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
141 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
142 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
143 // CHECK: [[EXIT]]
144 // CHECK: br label %[[RETURN:.+]]
145 // CHECK: [[RETURN]]
146 // CHECK: ret i32 0
147
148 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
149 // CHECK: call void @__kmpc_for_static_init_4(
150 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
151 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
152 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
153 // CHECK: [[EXIT]]
154 // CHECK: br label
155 // CHECK: [[CONTINUE]]
156 // CHECK: br label
157 // CHECK: call void @__kmpc_for_static_fini(
158 // CHECK: ret void
159
160 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
161 // CHECK: call void @__kmpc_for_static_init_4(
162 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
163 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
164 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
165 // CHECK: [[EXIT]]
166 // CHECK: br label
167 // CHECK: [[CONTINUE]]
168 // CHECK: br label
169 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
170 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
171 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
172 // CHECK: [[EXIT]]
173 // CHECK: br label
174 // CHECK: [[CONTINUE]]
175 // CHECK: br label
176 // CHECK: call void @__kmpc_for_static_fini(
177 // CHECK: ret void
178
179 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
180 // CHECK: call void @__kmpc_for_static_init_4(
181 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
182 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
183 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
184 // CHECK: [[EXIT]]
185 // CHECK: br label
186 // CHECK: [[CONTINUE]]
187 // CHECK: br label
188 // CHECK: call void @__kmpc_for_static_fini(
189 // CHECK: ret void
190
191 #endif