blob: ee557fd065daa47a0ab3d92f116aed255a9042e3 [file] [log] [blame]
Alexey Bataev0f34da12015-07-02 04:17:07 +00001// RUN: %clang_cc1 -verify -fopenmp -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s
Alexey Bataevbb045d42015-07-02 04:36:13 +00002// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s
Alexey Bataev0f34da12015-07-02 04:17:07 +00003// 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 Bataev0f34da12015-07-02 04:17:07 +00006#ifndef HEADER
7#define HEADER
8
9int main (int argc, char **argv) {
10// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
11#pragma omp parallel
12{
13#pragma omp cancellation point parallel
Alexey Bataev25e5b442015-09-15 12:52:43 +000014#pragma omp cancel parallel
Alexey Bataev0f34da12015-07-02 04:17:07 +000015 argv[0][0] = argc;
16}
17// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
18#pragma omp sections
19{
Alexey Bataev25e5b442015-09-15 12:52:43 +000020 {
Alexey Bataev0f34da12015-07-02 04:17:07 +000021#pragma omp cancellation point sections
Alexey Bataev25e5b442015-09-15 12:52:43 +000022#pragma omp cancel sections
23 }
Alexey Bataev0f34da12015-07-02 04:17:07 +000024}
25// CHECK: call i32 @__kmpc_single(
Alexey Bataev81c7ea02015-07-03 09:56:58 +000026// CHECK-NOT: @__kmpc_cancellationpoint
27// CHECK: call void @__kmpc_end_single(
28// CHECK: call void @__kmpc_barrier(%ident_t*
29#pragma omp sections
30{
31#pragma omp cancellation point sections
32#pragma omp section
33 {
34#pragma omp cancellation point sections
Alexey Bataev25e5b442015-09-15 12:52:43 +000035#pragma omp cancel sections
Alexey Bataev81c7ea02015-07-03 09:56:58 +000036 }
37}
38// CHECK: call void @__kmpc_for_static_init_4(
Alexey Bataev0f34da12015-07-02 04:17:07 +000039// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
40// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
41// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
42// CHECK: [[EXIT]]
Alexey Bataev81c7ea02015-07-03 09:56:58 +000043// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
Alexey Bataev0f34da12015-07-02 04:17:07 +000044// CHECK: br label
45// CHECK: [[CONTINUE]]
46// CHECK: br label
Alexey Bataev81c7ea02015-07-03 09:56:58 +000047// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
48// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
49// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
50// CHECK: [[EXIT]]
51// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
52// CHECK: br label
53// CHECK: [[CONTINUE]]
54// CHECK: br label
55// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev0f34da12015-07-02 04:17:07 +000056#pragma omp for
57for (int i = 0; i < argc; ++i) {
58#pragma omp cancellation point for
Alexey Bataev25e5b442015-09-15 12:52:43 +000059#pragma omp cancel for
Alexey Bataev0f34da12015-07-02 04:17:07 +000060}
61// CHECK: call void @__kmpc_for_static_init_4(
62// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%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]]
Alexey Bataev81c7ea02015-07-03 09:56:58 +000066// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
Alexey Bataev0f34da12015-07-02 04:17:07 +000067// CHECK: br label
68// CHECK: [[CONTINUE]]
69// CHECK: br label
70// CHECK: call void @__kmpc_for_static_fini(
Alexey Bataev81c7ea02015-07-03 09:56:58 +000071// CHECK: call void @__kmpc_barrier(%ident_t*
Alexey Bataev0f34da12015-07-02 04:17:07 +000072#pragma omp task
73{
74#pragma omp cancellation point taskgroup
Alexey Bataev25e5b442015-09-15 12:52:43 +000075#pragma omp cancel taskgroup
Alexey Bataev0f34da12015-07-02 04:17:07 +000076}
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 {
82#pragma omp cancellation point sections
83#pragma omp cancel sections
84 }
85}
86// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
87#pragma omp parallel sections
88{
89 {
90#pragma omp cancellation point sections
91#pragma omp cancel sections
92 }
93#pragma omp section
94 {
95#pragma omp cancellation point sections
96 }
97}
98// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
99#pragma omp parallel for
100for (int i = 0; i < argc; ++i) {
101#pragma omp cancellation point for
102#pragma omp cancel for
103}
104// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev0f34da12015-07-02 04:17:07 +0000105 return argc;
106}
107
108// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
109// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
110// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
111// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
112// CHECK: [[EXIT]]
Alexey Bataev81c7ea02015-07-03 09:56:58 +0000113// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
Alexey Bataev0f34da12015-07-02 04:17:07 +0000114// CHECK: br label %[[RETURN:.+]]
115// CHECK: [[RETURN]]
116// CHECK: ret void
117
118// CHECK: define internal i32 @{{[^(]+}}(i32
119// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
120// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
121// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
122// CHECK: [[EXIT]]
Alexey Bataev81c7ea02015-07-03 09:56:58 +0000123// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
Alexey Bataev0f34da12015-07-02 04:17:07 +0000124// 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_cancellationpoint
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_cancellationpoint(%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_cancellationpoint(%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_cancellationpoint(%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 Bataev0f34da12015-07-02 04:17:07 +0000170#endif