blob: 2ff9dcc186c99aa89c7850e1dbebe8f469a521a6 [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;
Jonas Hahnfeld20fce722017-02-17 18:32:51 +000015#pragma omp barrier
16 argv[0][0] += argc;
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000017}
18// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
19#pragma omp sections
20{
21#pragma omp cancel sections
22}
Alexey Bataev3015bcc2016-01-22 08:56:50 +000023// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev9619f042016-01-20 12:29:47 +000024// CHECK: call i32 @__kmpc_cancel(
Alexey Bataev3015bcc2016-01-22 08:56:50 +000025// 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]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000040// 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]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000047// CHECK: br label
48// CHECK: [[CONTINUE]]
49// CHECK: br label
50// CHECK: call void @__kmpc_for_static_fini(
51#pragma omp for
52for (int i = 0; i < argc; ++i) {
Alexey Bataev87933c72015-09-18 08:07:34 +000053#pragma omp cancel for if(cancel: flag)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000054}
55// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev87933c72015-09-18 08:07:34 +000056// CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
57// CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
58// CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
59// CHECK: [[THEN]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000060// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
61// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
62// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
63// CHECK: [[EXIT]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000064// CHECK: br label
65// CHECK: [[CONTINUE]]
66// CHECK: br label
Alexey Bataev87933c72015-09-18 08:07:34 +000067// CHECK: [[ELSE]]
68// CHECK: br label
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000069// CHECK: call void @__kmpc_for_static_fini(
70// CHECK: call void @__kmpc_barrier(%ident_t*
71#pragma omp task
72{
73#pragma omp cancel taskgroup
74}
75// CHECK: call i8* @__kmpc_omp_task_alloc(
76// CHECK: call i32 @__kmpc_omp_task(
Alexey Bataev25e5b442015-09-15 12:52:43 +000077#pragma omp parallel sections
78{
79#pragma omp cancel sections
80}
81// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
82#pragma omp parallel sections
83{
84#pragma omp cancel sections
85#pragma omp section
86 {
87#pragma omp cancel sections
88 }
89}
90// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev957d8562016-11-17 15:12:05 +000091int r = 0;
92#pragma omp parallel for reduction(+: r)
Alexey Bataev25e5b442015-09-15 12:52:43 +000093for (int i = 0; i < argc; ++i) {
94#pragma omp cancel for
Alexey Bataev957d8562016-11-17 15:12:05 +000095 r += i;
Alexey Bataev25e5b442015-09-15 12:52:43 +000096}
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]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000110// CHECK: br label %[[RETURN:.+]]
Alexey Bataev87933c72015-09-18 08:07:34 +0000111// CHECK: [[ELSE]]
Jonas Hahnfeld20fce722017-02-17 18:32:51 +0000112// The barrier directive should now call __kmpc_cancel_barrier
113// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
Alexey Bataev87933c72015-09-18 08:07:34 +0000114// 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]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000123// CHECK: br label %[[RETURN:.+]]
124// CHECK: [[RETURN]]
125// CHECK: ret i32 0
126
Alexey Bataev25e5b442015-09-15 12:52:43 +0000127// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
Alexey Bataev3015bcc2016-01-22 08:56:50 +0000128// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev9619f042016-01-20 12:29:47 +0000129// CHECK: call i32 @__kmpc_cancel(
Alexey Bataev3015bcc2016-01-22 08:56:50 +0000130// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev25e5b442015-09-15 12:52:43 +0000131// CHECK: ret void
132
133// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
134// CHECK: call void @__kmpc_for_static_init_4(
135// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
136// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
137// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
138// CHECK: [[EXIT]]
Alexey Bataev25e5b442015-09-15 12:52:43 +0000139// CHECK: br label
140// CHECK: [[CONTINUE]]
141// CHECK: br label
142// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
143// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
144// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
145// CHECK: [[EXIT]]
Alexey Bataev25e5b442015-09-15 12:52:43 +0000146// CHECK: br label
147// CHECK: [[CONTINUE]]
148// CHECK: br label
149// CHECK: call void @__kmpc_for_static_fini(
150// CHECK: ret void
151
152// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
153// CHECK: call void @__kmpc_for_static_init_4(
154// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
155// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
156// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
157// CHECK: [[EXIT]]
Alexey Bataev25e5b442015-09-15 12:52:43 +0000158// CHECK: br label
159// CHECK: [[CONTINUE]]
160// CHECK: br label
161// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev957d8562016-11-17 15:12:05 +0000162// CHECK: call i32 @__kmpc_reduce_nowait(
163// CHECK: call void @__kmpc_end_reduce_nowait(
164// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev25e5b442015-09-15 12:52:43 +0000165// CHECK: ret void
166
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000167#endif