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