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