Clang Project

clang_source_code/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
13int 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
65for (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
113for (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
192