blob: 6feb5df9dd45abe8d689584a31725b7a34eed669 [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 Prantl142ec392015-07-07 23:19:46 +00005
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(
72 return argc;
73}
74
75// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
76// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
77// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
78// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
79// CHECK: [[EXIT]]
80// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
81// CHECK: br label %[[RETURN:.+]]
82// CHECK: [[RETURN]]
83// CHECK: ret void
84
85// CHECK: define internal i32 @{{[^(]+}}(i32
86// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
87// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
88// CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
89// CHECK: [[EXIT]]
90// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
91// CHECK: br label %[[RETURN:.+]]
92// CHECK: [[RETURN]]
93// CHECK: ret i32 0
94
95#endif