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
5 // RUN: %clang_cc1 -verify -fopenmp-simd -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s
6 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -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}}
9 // expected-no-diagnostics
13 int main (int argc, char **argv) {
14 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
17 #pragma omp cancellation point parallel
18 #pragma omp cancel parallel
21 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
25 #pragma omp cancellation point sections
26 #pragma omp cancel sections
29 // CHECK: call void @__kmpc_for_static_init_4(
30 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
31 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
32 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
35 // CHECK: [[CONTINUE]]
37 // CHECK: call void @__kmpc_for_static_fini(
38 // CHECK: call void @__kmpc_barrier(%struct.ident_t*
41 #pragma omp cancellation point sections
44 #pragma omp cancellation point sections
45 #pragma omp cancel sections
48 // CHECK: call void @__kmpc_for_static_init_4(
49 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
50 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
51 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
54 // CHECK: [[CONTINUE]]
56 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
57 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
58 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
61 // CHECK: [[CONTINUE]]
63 // CHECK: call void @__kmpc_for_static_fini(
65 for (int i = 0; i < argc; ++i) {
66 #pragma omp cancellation point for
67 #pragma omp cancel for
69 // CHECK: call void @__kmpc_for_static_init_4(
70 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
71 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
72 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
75 // CHECK: [[CONTINUE]]
77 // CHECK: call void @__kmpc_for_static_fini(
78 // CHECK: call void @__kmpc_barrier(%struct.ident_t*
81 #pragma omp cancellation point taskgroup
82 #pragma omp cancel taskgroup
84 // CHECK: call i8* @__kmpc_omp_task_alloc(
85 // CHECK: call i32 @__kmpc_omp_task(
88 #pragma omp cancellation point taskgroup
90 // CHECK: call i8* @__kmpc_omp_task_alloc(
91 // CHECK: call i32 @__kmpc_omp_task(
92 #pragma omp parallel sections
95 #pragma omp cancellation point sections
96 #pragma omp cancel sections
99 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
100 #pragma omp parallel sections
103 #pragma omp cancellation point sections
104 #pragma omp cancel sections
108 #pragma omp cancellation point sections
111 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
112 #pragma omp parallel for
113 for (int i = 0; i < argc; ++i) {
114 #pragma omp cancellation point for
115 #pragma omp cancel for
117 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
121 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
122 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
123 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
124 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
126 // CHECK: br label %[[RETURN:.+]]
130 // CHECK: define internal i32 @{{[^(]+}}(i32
131 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
132 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
133 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
135 // CHECK: br label %[[RETURN:.+]]
139 // CHECK: define internal i32 @{{[^(]+}}(i32
140 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
141 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
142 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
144 // CHECK: br label %[[RETURN:.+]]
148 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
149 // CHECK: call void @__kmpc_for_static_init_4(
150 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
151 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
152 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
155 // CHECK: [[CONTINUE]]
157 // CHECK: call void @__kmpc_for_static_fini(
160 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
161 // CHECK: call void @__kmpc_for_static_init_4(
162 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
163 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
164 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
167 // CHECK: [[CONTINUE]]
169 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
170 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
171 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
174 // CHECK: [[CONTINUE]]
176 // CHECK: call void @__kmpc_for_static_fini(
179 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
180 // CHECK: call void @__kmpc_for_static_init_4(
181 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
182 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
183 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
186 // CHECK: [[CONTINUE]]
188 // CHECK: call void @__kmpc_for_static_fini(