blob: 75fd5e46618c2604b18720ab9cbb5444bdd1a390 [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 Bataeva8a9153a2017-12-29 18:07:07 +00004
5// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s
6// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s
7// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
8// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
Alexey Bataev7d5d33e2015-07-06 05:50:32 +00009// expected-no-diagnostics
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000010#ifndef HEADER
11#define HEADER
12
Alexey Bataev87933c72015-09-18 08:07:34 +000013float flag;
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000014int main (int argc, char **argv) {
15// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
16#pragma omp parallel
17{
Alexey Bataev87933c72015-09-18 08:07:34 +000018#pragma omp cancel parallel if(flag)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000019 argv[0][0] = argc;
Jonas Hahnfeld20fce722017-02-17 18:32:51 +000020#pragma omp barrier
21 argv[0][0] += argc;
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000022}
Alexey Bataeva4fa0b82018-04-16 17:59:34 +000023// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000024#pragma omp sections
25{
26#pragma omp cancel sections
27}
Alexey Bataev3015bcc2016-01-22 08:56:50 +000028// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev9619f042016-01-20 12:29:47 +000029// CHECK: call i32 @__kmpc_cancel(
Alexey Bataev3015bcc2016-01-22 08:56:50 +000030// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataeva4fa0b82018-04-16 17:59:34 +000031// CHECK: call void @__kmpc_barrier(%struct.ident_t*
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000032#pragma omp sections
33{
34#pragma omp cancel sections
35#pragma omp section
36 {
37#pragma omp cancel sections
38 }
39}
40// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataeva4fa0b82018-04-16 17:59:34 +000041// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000042// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
43// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
44// CHECK: [[EXIT]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000045// CHECK: br label
46// CHECK: [[CONTINUE]]
47// CHECK: br label
Alexey Bataeva4fa0b82018-04-16 17:59:34 +000048// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000049// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
50// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
51// CHECK: [[EXIT]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000052// CHECK: br label
53// CHECK: [[CONTINUE]]
54// CHECK: br label
55// CHECK: call void @__kmpc_for_static_fini(
56#pragma omp for
57for (int i = 0; i < argc; ++i) {
Alexey Bataev87933c72015-09-18 08:07:34 +000058#pragma omp cancel for if(cancel: flag)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000059}
60// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev87933c72015-09-18 08:07:34 +000061// CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
62// CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
63// CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
64// CHECK: [[THEN]]
Alexey Bataeva4fa0b82018-04-16 17:59:34 +000065// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000066// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
67// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
68// CHECK: [[EXIT]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000069// CHECK: br label
70// CHECK: [[CONTINUE]]
71// CHECK: br label
Alexey Bataev87933c72015-09-18 08:07:34 +000072// CHECK: [[ELSE]]
73// CHECK: br label
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000074// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataeva4fa0b82018-04-16 17:59:34 +000075// CHECK: call void @__kmpc_barrier(%struct.ident_t*
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000076#pragma omp task
77{
78#pragma omp cancel taskgroup
79}
80// CHECK: call i8* @__kmpc_omp_task_alloc(
81// CHECK: call i32 @__kmpc_omp_task(
Alexey Bataev25e5b442015-09-15 12:52:43 +000082#pragma omp parallel sections
83{
84#pragma omp cancel sections
85}
Alexey Bataeva4fa0b82018-04-16 17:59:34 +000086// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev25e5b442015-09-15 12:52:43 +000087#pragma omp parallel sections
88{
89#pragma omp cancel sections
90#pragma omp section
91 {
92#pragma omp cancel sections
93 }
94}
Alexey Bataeva4fa0b82018-04-16 17:59:34 +000095// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev957d8562016-11-17 15:12:05 +000096int r = 0;
97#pragma omp parallel for reduction(+: r)
Alexey Bataev25e5b442015-09-15 12:52:43 +000098for (int i = 0; i < argc; ++i) {
99#pragma omp cancel for
Alexey Bataev957d8562016-11-17 15:12:05 +0000100 r += i;
Alexey Bataev25e5b442015-09-15 12:52:43 +0000101}
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000102// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000103 return argc;
104}
105
106// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
Alexey Bataev87933c72015-09-18 08:07:34 +0000107// CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
108// CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
109// CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
110// CHECK: [[THEN]]
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000111// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000112// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
113// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
114// CHECK: [[EXIT]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000115// CHECK: br label %[[RETURN:.+]]
Alexey Bataev87933c72015-09-18 08:07:34 +0000116// CHECK: [[ELSE]]
Jonas Hahnfeld20fce722017-02-17 18:32:51 +0000117// The barrier directive should now call __kmpc_cancel_barrier
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000118// CHECK: call i32 @__kmpc_cancel_barrier(%struct.ident_t*
Alexey Bataev87933c72015-09-18 08:07:34 +0000119// CHECK: br label
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000120// CHECK: [[RETURN]]
121// CHECK: ret void
122
123// CHECK: define internal i32 @{{[^(]+}}(i32
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000124// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000125// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
126// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
127// CHECK: [[EXIT]]
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000128// CHECK: br label %[[RETURN:.+]]
129// CHECK: [[RETURN]]
130// CHECK: ret i32 0
131
Alexey Bataev25e5b442015-09-15 12:52:43 +0000132// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
Alexey Bataev3015bcc2016-01-22 08:56:50 +0000133// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev9619f042016-01-20 12:29:47 +0000134// CHECK: call i32 @__kmpc_cancel(
Alexey Bataev3015bcc2016-01-22 08:56:50 +0000135// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev25e5b442015-09-15 12:52:43 +0000136// CHECK: ret void
137
138// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
139// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000140// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
Alexey Bataev25e5b442015-09-15 12:52:43 +0000141// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
142// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
143// CHECK: [[EXIT]]
Alexey Bataev25e5b442015-09-15 12:52:43 +0000144// CHECK: br label
145// CHECK: [[CONTINUE]]
146// CHECK: br label
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000147// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
Alexey Bataev25e5b442015-09-15 12:52:43 +0000148// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
149// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
150// CHECK: [[EXIT]]
Alexey Bataev25e5b442015-09-15 12:52:43 +0000151// 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(
Alexey Bataeva4fa0b82018-04-16 17:59:34 +0000159// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
Alexey Bataev25e5b442015-09-15 12:52:43 +0000160// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
161// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
162// CHECK: [[EXIT]]
Alexey Bataev25e5b442015-09-15 12:52:43 +0000163// CHECK: br label
164// CHECK: [[CONTINUE]]
165// CHECK: br label
166// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev957d8562016-11-17 15:12:05 +0000167// CHECK: call i32 @__kmpc_reduce_nowait(
168// CHECK: call void @__kmpc_end_reduce_nowait(
169// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev25e5b442015-09-15 12:52:43 +0000170// CHECK: ret void
171
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000172#endif