blob: 69acb3d4906ebfac812085c6c24eb7443744a24e [file] [log] [blame]
Alexey Bataev2a6de8c2016-12-20 12:10:05 +00001// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s
2// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s
3// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s
Alexey Bataev7d5d33e2015-07-06 05:50:32 +00004// expected-no-diagnostics
Alexey Bataev7d5d33e2015-07-06 05:50:32 +00005#ifndef HEADER
6#define HEADER
7
Alexey Bataev87933c72015-09-18 08:07:34 +00008float flag;
Alexey Bataev7d5d33e2015-07-06 05:50:32 +00009int main (int argc, char **argv) {
10// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
11#pragma omp parallel
12{
Alexey Bataev87933c72015-09-18 08:07:34 +000013#pragma omp cancel parallel if(flag)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000014 argv[0][0] = argc;
15}
16// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
17#pragma omp sections
18{
19#pragma omp cancel sections
20}
Alexey Bataev3015bcc2016-01-22 08:56:50 +000021// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev9619f042016-01-20 12:29:47 +000022// CHECK: call i32 @__kmpc_cancel(
Alexey Bataev3015bcc2016-01-22 08:56:50 +000023// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
24// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000025// CHECK: call void @__kmpc_barrier(%ident_t*
26#pragma omp sections
27{
28#pragma omp cancel sections
29#pragma omp section
30 {
31#pragma omp cancel sections
32 }
33}
34// CHECK: call void @__kmpc_for_static_init_4(
35// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
36// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
37// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
38// CHECK: [[EXIT]]
39// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
40// CHECK: br label
41// CHECK: [[CONTINUE]]
42// CHECK: br label
43// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
44// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
45// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
46// CHECK: [[EXIT]]
47// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
48// CHECK: br label
49// CHECK: [[CONTINUE]]
50// CHECK: br label
51// CHECK: call void @__kmpc_for_static_fini(
52#pragma omp for
53for (int i = 0; i < argc; ++i) {
Alexey Bataev87933c72015-09-18 08:07:34 +000054#pragma omp cancel for if(cancel: flag)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000055}
56// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev87933c72015-09-18 08:07:34 +000057// CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
58// CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
59// CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
60// CHECK: [[THEN]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000061// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
62// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
63// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
64// CHECK: [[EXIT]]
65// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
66// CHECK: br label
67// CHECK: [[CONTINUE]]
68// CHECK: br label
Alexey Bataev87933c72015-09-18 08:07:34 +000069// CHECK: [[ELSE]]
70// CHECK: br label
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000071// CHECK: call void @__kmpc_for_static_fini(
72// CHECK: call void @__kmpc_barrier(%ident_t*
73#pragma omp task
74{
75#pragma omp cancel taskgroup
76}
77// CHECK: call i8* @__kmpc_omp_task_alloc(
78// CHECK: call i32 @__kmpc_omp_task(
Alexey Bataev25e5b442015-09-15 12:52:43 +000079#pragma omp parallel sections
80{
81#pragma omp cancel sections
82}
83// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
84#pragma omp parallel sections
85{
86#pragma omp cancel sections
87#pragma omp section
88 {
89#pragma omp cancel sections
90 }
91}
92// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev957d8562016-11-17 15:12:05 +000093int r = 0;
94#pragma omp parallel for reduction(+: r)
Alexey Bataev25e5b442015-09-15 12:52:43 +000095for (int i = 0; i < argc; ++i) {
96#pragma omp cancel for
Alexey Bataev957d8562016-11-17 15:12:05 +000097 r += i;
Alexey Bataev25e5b442015-09-15 12:52:43 +000098}
99// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000100 return argc;
101}
102
103// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
Alexey Bataev87933c72015-09-18 08:07:34 +0000104// CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
105// CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
106// CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
107// CHECK: [[THEN]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000108// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
109// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
110// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
111// CHECK: [[EXIT]]
112// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
113// CHECK: br label %[[RETURN:.+]]
Alexey Bataev87933c72015-09-18 08:07:34 +0000114// CHECK: [[ELSE]]
115// CHECK: br label
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000116// CHECK: [[RETURN]]
117// CHECK: ret void
118
119// CHECK: define internal i32 @{{[^(]+}}(i32
120// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
121// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
122// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
123// CHECK: [[EXIT]]
124// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
125// CHECK: br label %[[RETURN:.+]]
126// CHECK: [[RETURN]]
127// CHECK: ret i32 0
128
Alexey Bataev25e5b442015-09-15 12:52:43 +0000129// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
Alexey Bataev3015bcc2016-01-22 08:56:50 +0000130// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev9619f042016-01-20 12:29:47 +0000131// CHECK: call i32 @__kmpc_cancel(
Alexey Bataev3015bcc2016-01-22 08:56:50 +0000132// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
133// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev25e5b442015-09-15 12:52:43 +0000134// CHECK: ret void
135
136// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
137// CHECK: call void @__kmpc_for_static_init_4(
138// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
139// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
140// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
141// CHECK: [[EXIT]]
142// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
143// CHECK: br label
144// CHECK: [[CONTINUE]]
145// CHECK: br label
146// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
147// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
148// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
149// CHECK: [[EXIT]]
150// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
151// CHECK: br label
152// CHECK: [[CONTINUE]]
153// CHECK: br label
154// CHECK: call void @__kmpc_for_static_fini(
155// CHECK: ret void
156
157// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
158// CHECK: call void @__kmpc_for_static_init_4(
159// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
160// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
161// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
162// CHECK: [[EXIT]]
163// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
164// CHECK: br label
165// CHECK: [[CONTINUE]]
166// CHECK: br label
167// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev957d8562016-11-17 15:12:05 +0000168// CHECK: call i32 @__kmpc_reduce_nowait(
169// CHECK: call void @__kmpc_end_reduce_nowait(
170// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev25e5b442015-09-15 12:52:43 +0000171// CHECK: ret void
172
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000173#endif