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