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 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 10 #ifndef HEADER 11 #define HEADER 12 13 int main (int argc, char **argv) { 14 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num( 15 #pragma omp parallel 16 { 17 #pragma omp cancellation point parallel 18 #pragma omp cancel parallel 19 argv[0][0] = argc; 20 } 21 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 22 #pragma omp sections 23 { 24 { 25 #pragma omp cancellation point sections 26 #pragma omp cancel sections 27 } 28 } 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:.+]] 33 // CHECK: [[EXIT]] 34 // CHECK: br label 35 // CHECK: [[CONTINUE]] 36 // CHECK: br label 37 // CHECK: call void @__kmpc_for_static_fini( 38 // CHECK: call void @__kmpc_barrier(%struct.ident_t* 39 #pragma omp sections 40 { 41 #pragma omp cancellation point sections 42 #pragma omp section 43 { 44 #pragma omp cancellation point sections 45 #pragma omp cancel sections 46 } 47 } 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:.+]] 52 // CHECK: [[EXIT]] 53 // CHECK: br label 54 // CHECK: [[CONTINUE]] 55 // CHECK: br label 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:.+]] 59 // CHECK: [[EXIT]] 60 // CHECK: br label 61 // CHECK: [[CONTINUE]] 62 // CHECK: br label 63 // CHECK: call void @__kmpc_for_static_fini( 64 #pragma omp for 65 for (int i = 0; i < argc; ++i) { 66 #pragma omp cancellation point for 67 #pragma omp cancel for 68 } 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:.+]] 73 // CHECK: [[EXIT]] 74 // CHECK: br label 75 // CHECK: [[CONTINUE]] 76 // CHECK: br label 77 // CHECK: call void @__kmpc_for_static_fini( 78 // CHECK: call void @__kmpc_barrier(%struct.ident_t* 79 #pragma omp task 80 { 81 #pragma omp cancellation point taskgroup 82 #pragma omp cancel taskgroup 83 } 84 // CHECK: call i8* @__kmpc_omp_task_alloc( 85 // CHECK: call i32 @__kmpc_omp_task( 86 #pragma omp task 87 { 88 #pragma omp cancellation point taskgroup 89 } 90 // CHECK: call i8* @__kmpc_omp_task_alloc( 91 // CHECK: call i32 @__kmpc_omp_task( 92 #pragma omp parallel sections 93 { 94 { 95 #pragma omp cancellation point sections 96 #pragma omp cancel sections 97 } 98 } 99 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 100 #pragma omp parallel sections 101 { 102 { 103 #pragma omp cancellation point sections 104 #pragma omp cancel sections 105 } 106 #pragma omp section 107 { 108 #pragma omp cancellation point sections 109 } 110 } 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 116 } 117 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 118 return argc; 119 } 120 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:[^,]+]], 125 // CHECK: [[EXIT]] 126 // CHECK: br label %[[RETURN:.+]] 127 // CHECK: [[RETURN]] 128 // CHECK: ret void 129 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:[^,]+]], 134 // CHECK: [[EXIT]] 135 // CHECK: br label %[[RETURN:.+]] 136 // CHECK: [[RETURN]] 137 // CHECK: ret i32 0 138 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:[^,]+]], 143 // CHECK: [[EXIT]] 144 // CHECK: br label %[[RETURN:.+]] 145 // CHECK: [[RETURN]] 146 // CHECK: ret i32 0 147 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:.+]] 153 // CHECK: [[EXIT]] 154 // CHECK: br label 155 // CHECK: [[CONTINUE]] 156 // CHECK: br label 157 // CHECK: call void @__kmpc_for_static_fini( 158 // CHECK: ret void 159 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:.+]] 165 // CHECK: [[EXIT]] 166 // CHECK: br label 167 // CHECK: [[CONTINUE]] 168 // CHECK: br label 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:.+]] 172 // CHECK: [[EXIT]] 173 // CHECK: br label 174 // CHECK: [[CONTINUE]] 175 // CHECK: br label 176 // CHECK: call void @__kmpc_for_static_fini( 177 // CHECK: ret void 178 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:.+]] 184 // CHECK: [[EXIT]] 185 // CHECK: br label 186 // CHECK: [[CONTINUE]] 187 // CHECK: br label 188 // CHECK: call void @__kmpc_for_static_fini( 189 // CHECK: ret void 190 191 #endif 192