1 // 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
5 // REQUIRES: x86-registered-target
6 #ifndef HEADER
7 #define HEADER
8 
9 int 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
52 for (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
96