blob: 9a99826217f41875e8fc2029d74d3a4604c963c2 [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
9int main (int argc, char **argv) {
10// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
11#pragma omp parallel
12{
13#pragma omp cancel parallel
14 argv[0][0] = argc;
15}
16// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
17#pragma omp sections
18{
19#pragma omp cancel sections
20}
21// CHECK: call i32 @__kmpc_single(
22// CHECK-NOT: @__kmpc_cancel
23// CHECK: call void @__kmpc_end_single(
24// CHECK: call void @__kmpc_barrier(%ident_t*
25#pragma omp sections
26{
27#pragma omp cancel sections
28#pragma omp section
29 {
30#pragma omp cancel sections
31 }
32}
33// CHECK: call void @__kmpc_for_static_init_4(
34// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
35// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
36// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
37// CHECK: [[EXIT]]
38// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
39// CHECK: br label
40// CHECK: [[CONTINUE]]
41// CHECK: br label
42// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
43// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
44// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
45// CHECK: [[EXIT]]
46// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
47// 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) {
53#pragma omp cancel for
54}
55// CHECK: call void @__kmpc_for_static_init_4(
56// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
57// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
58// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
59// CHECK: [[EXIT]]
60// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
61// CHECK: br label
62// CHECK: [[CONTINUE]]
63// CHECK: br label
64// CHECK: call void @__kmpc_for_static_fini(
65// CHECK: call void @__kmpc_barrier(%ident_t*
66#pragma omp task
67{
68#pragma omp cancel taskgroup
69}
70// CHECK: call i8* @__kmpc_omp_task_alloc(
71// CHECK: call i32 @__kmpc_omp_task(
Alexey Bataev25e5b442015-09-15 12:52:43 +000072#pragma omp parallel sections
73{
74#pragma omp cancel sections
75}
76// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
77#pragma omp parallel sections
78{
79#pragma omp cancel sections
80#pragma omp section
81 {
82#pragma omp cancel sections
83 }
84}
85// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
86#pragma omp parallel for
87for (int i = 0; i < argc; ++i) {
88#pragma omp cancel for
89}
90// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000091 return argc;
92}
93
94// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
95// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
96// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
97// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
98// CHECK: [[EXIT]]
99// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
100// CHECK: br label %[[RETURN:.+]]
101// CHECK: [[RETURN]]
102// CHECK: ret void
103
104// CHECK: define internal i32 @{{[^(]+}}(i32
105// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
106// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
107// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
108// CHECK: [[EXIT]]
109// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
110// CHECK: br label %[[RETURN:.+]]
111// CHECK: [[RETURN]]
112// CHECK: ret i32 0
113
Alexey Bataev25e5b442015-09-15 12:52:43 +0000114// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
115// CHECK: call i32 @__kmpc_single(
116// CHECK-NOT: @__kmpc_cancel
117// CHECK: call void @__kmpc_end_single(
118// CHECK: call void @__kmpc_barrier(%ident_t*
119// CHECK: ret void
120
121// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
122// CHECK: call void @__kmpc_for_static_init_4(
123// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
124// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
125// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
126// CHECK: [[EXIT]]
127// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
128// CHECK: br label
129// CHECK: [[CONTINUE]]
130// CHECK: br label
131// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
132// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
133// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
134// CHECK: [[EXIT]]
135// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
136// CHECK: br label
137// CHECK: [[CONTINUE]]
138// CHECK: br label
139// CHECK: call void @__kmpc_for_static_fini(
140// CHECK: ret void
141
142// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
143// CHECK: call void @__kmpc_for_static_init_4(
144// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
145// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
146// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
147// CHECK: [[EXIT]]
148// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
149// CHECK: br label
150// CHECK: [[CONTINUE]]
151// CHECK: br label
152// CHECK: call void @__kmpc_for_static_fini(
153// CHECK: call void @__kmpc_barrier(%ident_t*
154// CHECK: ret void
155
Alexey Bataev7d5d33e2015-07-06 05:50:32 +0000156#endif