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 #ifndef HEADER 6 #define HEADER 7 8 int main (int argc, char **argv) { 9 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num( 10 #pragma omp parallel 11 { 12 #pragma omp cancellation point parallel 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 { 20 #pragma omp cancellation point sections 21 #pragma omp cancel sections 22 } 23 } 24 // CHECK: call void @__kmpc_for_static_init_4( 25 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3) 26 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 27 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 28 // CHECK: [[EXIT]] 29 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 30 // CHECK: br label 31 // CHECK: [[CONTINUE]] 32 // CHECK: br label 33 // CHECK: call void @__kmpc_for_static_fini( 34 // CHECK: call void @__kmpc_barrier(%ident_t* 35 #pragma omp sections 36 { 37 #pragma omp cancellation point sections 38 #pragma omp section 39 { 40 #pragma omp cancellation point sections 41 #pragma omp cancel sections 42 } 43 } 44 // CHECK: call void @__kmpc_for_static_init_4( 45 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3) 46 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 47 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 48 // CHECK: [[EXIT]] 49 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 50 // CHECK: br label 51 // CHECK: [[CONTINUE]] 52 // CHECK: br label 53 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3) 54 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 55 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 56 // CHECK: [[EXIT]] 57 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 58 // CHECK: br label 59 // CHECK: [[CONTINUE]] 60 // CHECK: br label 61 // CHECK: call void @__kmpc_for_static_fini( 62 #pragma omp for 63 for (int i = 0; i < argc; ++i) { 64 #pragma omp cancellation point for 65 #pragma omp cancel for 66 } 67 // CHECK: call void @__kmpc_for_static_init_4( 68 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 2) 69 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 70 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 71 // CHECK: [[EXIT]] 72 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 73 // CHECK: br label 74 // CHECK: [[CONTINUE]] 75 // CHECK: br label 76 // CHECK: call void @__kmpc_for_static_fini( 77 // CHECK: call void @__kmpc_barrier(%ident_t* 78 #pragma omp task 79 { 80 #pragma omp cancellation point taskgroup 81 #pragma omp cancel taskgroup 82 } 83 // CHECK: call i8* @__kmpc_omp_task_alloc( 84 // CHECK: call i32 @__kmpc_omp_task( 85 #pragma omp parallel sections 86 { 87 { 88 #pragma omp cancellation point sections 89 #pragma omp cancel sections 90 } 91 } 92 // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 93 #pragma omp parallel sections 94 { 95 { 96 #pragma omp cancellation point sections 97 #pragma omp cancel sections 98 } 99 #pragma omp section 100 { 101 #pragma omp cancellation point sections 102 } 103 } 104 // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 105 #pragma omp parallel for 106 for (int i = 0; i < argc; ++i) { 107 #pragma omp cancellation point for 108 #pragma omp cancel for 109 } 110 // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 111 return argc; 112 } 113 114 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}, 115 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1) 116 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 117 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]], 118 // CHECK: [[EXIT]] 119 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 120 // CHECK: br label %[[RETURN:.+]] 121 // CHECK: [[RETURN]] 122 // CHECK: ret void 123 124 // CHECK: define internal i32 @{{[^(]+}}(i32 125 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4) 126 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 127 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]], 128 // CHECK: [[EXIT]] 129 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 130 // CHECK: br label %[[RETURN:.+]] 131 // CHECK: [[RETURN]] 132 // CHECK: ret i32 0 133 134 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}) 135 // CHECK: call void @__kmpc_for_static_init_4( 136 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3) 137 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 138 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 139 // CHECK: [[EXIT]] 140 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 141 // CHECK: br label 142 // CHECK: [[CONTINUE]] 143 // CHECK: br label 144 // CHECK: call void @__kmpc_for_static_fini( 145 // CHECK: ret void 146 147 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}) 148 // CHECK: call void @__kmpc_for_static_init_4( 149 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3) 150 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 151 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 152 // CHECK: [[EXIT]] 153 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 154 // CHECK: br label 155 // CHECK: [[CONTINUE]] 156 // CHECK: br label 157 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3) 158 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 159 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 160 // CHECK: [[EXIT]] 161 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 162 // CHECK: br label 163 // CHECK: [[CONTINUE]] 164 // CHECK: br label 165 // CHECK: call void @__kmpc_for_static_fini( 166 // CHECK: ret void 167 168 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}, 169 // CHECK: call void @__kmpc_for_static_init_4( 170 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2) 171 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 172 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 173 // CHECK: [[EXIT]] 174 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t* 175 // CHECK: br label 176 // CHECK: [[CONTINUE]] 177 // CHECK: br label 178 // CHECK: call void @__kmpc_for_static_fini( 179 // CHECK: ret void 180 181 #endif 182