blob: c7eaa1a4a9f0dd7abf3566dd02070c515655e39a [file] [log] [blame]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +00001// 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
Adrian Prantlbc068582015-07-08 01:00:30 +00005// REQUIRES: x86-registered-target
Alexey Bataev7d5d33e2015-07-06 05:50:32 +00006#ifndef HEADER
7#define HEADER
8
Alexey Bataev87933c72015-09-18 08:07:34 +00009float flag;
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000010int main (int argc, char **argv) {
11// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
12#pragma omp parallel
13{
Alexey Bataev87933c72015-09-18 08:07:34 +000014#pragma omp cancel parallel if(flag)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000015 argv[0][0] = argc;
16}
17// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
18#pragma omp sections
19{
20#pragma omp cancel sections
21}
22// CHECK: call i32 @__kmpc_single(
23// CHECK-NOT: @__kmpc_cancel
24// CHECK: call void @__kmpc_end_single(
25// 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(
93#pragma omp parallel for
94for (int i = 0; i < argc; ++i) {
95#pragma omp cancel for
96}
97// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000098 return argc;
99}
100
101// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
Alexey Bataev87933c72015-09-18 08:07:34 +0000102// CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
103// CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
104// CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
105// CHECK: [[THEN]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000106// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
107// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
108// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
109// CHECK: [[EXIT]]
110// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
111// CHECK: br label %[[RETURN:.+]]
Alexey Bataev87933c72015-09-18 08:07:34 +0000112// CHECK: [[ELSE]]
113// CHECK: br label
114// CHECK: call void @__kmpc_barrier
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000115// CHECK: [[RETURN]]
116// CHECK: ret void
117
118// CHECK: define internal i32 @{{[^(]+}}(i32
119// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
120// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
121// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
122// CHECK: [[EXIT]]
123// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
124// CHECK: br label %[[RETURN:.+]]
125// CHECK: [[RETURN]]
126// CHECK: ret i32 0
127
Alexey Bataev25e5b442015-09-15 12:52:43 +0000128// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
129// CHECK: call i32 @__kmpc_single(
130// CHECK-NOT: @__kmpc_cancel
131// CHECK: call void @__kmpc_end_single(
132// CHECK: call void @__kmpc_barrier(%ident_t*
133// CHECK: ret void
134
135// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
136// CHECK: call void @__kmpc_for_static_init_4(
137// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%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: [[RES:%.+]] = call i32 @__kmpc_cancel(%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: call i32 @__kmpc_cancel_barrier(%ident_t*
150// CHECK: br label
151// CHECK: [[CONTINUE]]
152// CHECK: br label
153// CHECK: call void @__kmpc_for_static_fini(
154// CHECK: ret void
155
156// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
157// CHECK: call void @__kmpc_for_static_init_4(
158// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
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: call void @__kmpc_barrier(%ident_t*
168// CHECK: ret void
169
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000170#endif