blob: 8234193e8f9533f04884226883349a204992a1c1 [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}
Alexey Bataev3015bcc2016-01-22 08:56:50 +000022// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev9619f042016-01-20 12:29:47 +000023// CHECK: call i32 @__kmpc_cancel(
Alexey Bataev3015bcc2016-01-22 08:56:50 +000024// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
25// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000026// CHECK: call void @__kmpc_barrier(%ident_t*
27#pragma omp sections
28{
29#pragma omp cancel sections
30#pragma omp section
31 {
32#pragma omp cancel sections
33 }
34}
35// CHECK: call void @__kmpc_for_static_init_4(
36// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
37// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
38// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
39// CHECK: [[EXIT]]
40// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
41// CHECK: br label
42// CHECK: [[CONTINUE]]
43// CHECK: br label
44// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%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: call i32 @__kmpc_cancel_barrier(%ident_t*
49// CHECK: br label
50// CHECK: [[CONTINUE]]
51// CHECK: br label
52// CHECK: call void @__kmpc_for_static_fini(
53#pragma omp for
54for (int i = 0; i < argc; ++i) {
Alexey Bataev87933c72015-09-18 08:07:34 +000055#pragma omp cancel for if(cancel: flag)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000056}
57// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev87933c72015-09-18 08:07:34 +000058// CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
59// CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
60// CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
61// CHECK: [[THEN]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000062// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
63// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
64// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
65// CHECK: [[EXIT]]
66// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
67// CHECK: br label
68// CHECK: [[CONTINUE]]
69// CHECK: br label
Alexey Bataev87933c72015-09-18 08:07:34 +000070// CHECK: [[ELSE]]
71// CHECK: br label
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000072// CHECK: call void @__kmpc_for_static_fini(
73// CHECK: call void @__kmpc_barrier(%ident_t*
74#pragma omp task
75{
76#pragma omp cancel taskgroup
77}
78// CHECK: call i8* @__kmpc_omp_task_alloc(
79// CHECK: call i32 @__kmpc_omp_task(
Alexey Bataev25e5b442015-09-15 12:52:43 +000080#pragma omp parallel sections
81{
82#pragma omp cancel sections
83}
84// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
85#pragma omp parallel sections
86{
87#pragma omp cancel sections
88#pragma omp section
89 {
90#pragma omp cancel sections
91 }
92}
93// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
94#pragma omp parallel for
95for (int i = 0; i < argc; ++i) {
96#pragma omp cancel for
97}
98// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000099 return argc;
100}
101
102// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
Alexey Bataev87933c72015-09-18 08:07:34 +0000103// CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
104// CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
105// CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
106// CHECK: [[THEN]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000107// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
108// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
109// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
110// CHECK: [[EXIT]]
111// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
112// CHECK: br label %[[RETURN:.+]]
Alexey Bataev87933c72015-09-18 08:07:34 +0000113// CHECK: [[ELSE]]
114// CHECK: br label
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* {{[^,]+}})
Alexey Bataev3015bcc2016-01-22 08:56:50 +0000129// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev9619f042016-01-20 12:29:47 +0000130// CHECK: call i32 @__kmpc_cancel(
Alexey Bataev3015bcc2016-01-22 08:56:50 +0000131// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
132// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev25e5b442015-09-15 12:52:43 +0000133// 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(
Alexey Bataev25e5b442015-09-15 12:52:43 +0000167// CHECK: ret void
168
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000169#endif