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