1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefixes=ALL,CHECK 2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,CHECK 4 5 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-enable-irbuilder -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefixes=ALL,IRBUILDER 6 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s 7 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-enable-irbuilder -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER 8 9 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s 10 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s 11 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -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 12 // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 13 14 // RUN: %clang_cc1 -verify -fopenmp -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefixes=ALL,CHECK 15 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s 16 // 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 --check-prefixes=ALL,CHECK 17 18 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-enable-irbuilder -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefixes=ALL,IRBUILDER 19 // RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s 20 // RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER 21 22 // RUN: %clang_cc1 -verify -fopenmp-simd -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s 23 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s 24 // 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 25 // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 26 27 // expected-no-diagnostics 28 #ifndef HEADER 29 #define HEADER 30 31 float flag; 32 int main (int argc, char **argv) { 33 #pragma omp parallel 34 { 35 #pragma omp cancel parallel if(flag) 36 argv[0][0] = argc; 37 #pragma omp barrier 38 argv[0][0] += argc; 39 } 40 // ALL: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 41 #pragma omp sections 42 { 43 #pragma omp cancel sections 44 } 45 // ALL: call void @__kmpc_for_static_init_4( 46 // ALL: call i32 @__kmpc_cancel( 47 // ALL: call void @__kmpc_for_static_fini( 48 // ALL: call void @__kmpc_barrier(%struct.ident_t* 49 #pragma omp sections 50 { 51 #pragma omp cancel sections 52 #pragma omp section 53 { 54 #pragma omp cancel sections 55 } 56 } 57 // ALL: call void @__kmpc_for_static_init_4( 58 // ALL: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.*]], i32 3) 59 // ALL: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 60 // ALL: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 61 // ALL: [[EXIT]] 62 // ALL: br label 63 // ALL: [[CONTINUE]] 64 // ALL: br label 65 // ALL: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.*]], i32 3) 66 // ALL: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 67 // ALL: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 68 // ALL: [[EXIT]] 69 // ALL: br label 70 // ALL: [[CONTINUE]] 71 // ALL: br label 72 // ALL: call void @__kmpc_for_static_fini( 73 #pragma omp for 74 for (int i = 0; i < argc; ++i) { 75 #pragma omp cancel for if(cancel: flag) 76 } 77 // ALL: call void @__kmpc_for_static_init_4( 78 // ALL: [[FLAG:%.+]] = load float, float* @{{.+}}, 79 // ALL: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00 80 // ALL: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]] 81 // ALL: [[THEN]] 82 // ALL: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 [[GTID:%.*]], i32 2) 83 // ALL: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 84 // ALL: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 85 // ALL: [[EXIT]] 86 // ALL: br label 87 // ALL: [[CONTINUE]] 88 // ALL: br label 89 // ALL: [[ELSE]] 90 // ALL: br label 91 // ALL: call void @__kmpc_for_static_fini( 92 // ALL: call void @__kmpc_barrier(%struct.ident_t* 93 #pragma omp task 94 { 95 #pragma omp cancel taskgroup 96 } 97 // ALL: call i8* @__kmpc_omp_task_alloc( 98 // ALL: call i32 @__kmpc_omp_task( 99 #pragma omp parallel sections 100 { 101 #pragma omp cancel sections 102 } 103 // ALL: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 104 #pragma omp parallel sections 105 { 106 #pragma omp cancel sections 107 #pragma omp section 108 { 109 #pragma omp cancel sections 110 } 111 } 112 // ALL: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 113 int r = 0; 114 #pragma omp parallel for reduction(+: r) 115 for (int i = 0; i < argc; ++i) { 116 #pragma omp cancel for 117 r += i; 118 } 119 // ALL: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call( 120 return argc; 121 } 122 123 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}, 124 // CHECK: [[FLAG:%.+]] = load float, float* @{{.+}}, 125 // CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00 126 // CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]] 127 // CHECK: [[THEN]] 128 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1) 129 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 130 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]], 131 // CHECK: [[EXIT]] 132 // CHECK: br label %[[RETURN:.+]] 133 // CHECK: [[ELSE]] 134 // The barrier directive should now call __kmpc_cancel_barrier 135 // CHECK: call i32 @__kmpc_cancel_barrier(%struct.ident_t* 136 // CHECK: br label 137 // CHECK: [[RETURN]] 138 // CHECK: ret void 139 140 // CHECK: define internal i32 @{{[^(]+}}(i32 141 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4) 142 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0 143 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]], 144 // CHECK: [[EXIT]] 145 // CHECK: br label %[[RETURN:.+]] 146 // CHECK: [[RETURN]] 147 // CHECK: ret i32 0 148 149 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}}) 150 // CHECK: call void @__kmpc_for_static_init_4( 151 // CHECK: call i32 @__kmpc_cancel( 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_cancel(%struct.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_cancel(%struct.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_cancel(%struct.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: call i32 @__kmpc_reduce_nowait( 185 // CHECK: call void @__kmpc_end_reduce_nowait( 186 // CHECK: call void @__kmpc_for_static_fini( 187 // CHECK: ret void 188 189 // IRBUILDER: define internal void @main 190 191 // IRBUILDER: [[RETURN:omp.par.outlined.exit[^:]*]] 192 // IRBUILDER-NEXT: ret void 193 // IRBUILDER: [[FLAG:%.+]] = load float, float* @{{.+}}, 194 195 // IRBUILDER: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00 196 // IRBUILDER: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]] 197 // IRBUILDER: [[ELSE]] 198 // IRBUILDER-NEXT: br label %[[ELSE2:.*]] 199 // IRBUILDER: [[ELSE2]] 200 // The barrier directive should now call __kmpc_cancel_barrier 201 // IRBUILDER: call i32 @__kmpc_cancel_barrier(%struct.ident_t* 202 // IRBUILDER: br label 203 // IRBUILDER: [[THEN]] 204 // IRBUILDER: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1) 205 // IRBUILDER: [[CMP:%.+]] = icmp eq i32 [[RES]], 0 206 // IRBUILDER: br i1 [[CMP]], label %[[CONTINUE:[^,].+]], label %[[EXIT:.+]] 207 // IRBUILDER: [[EXIT]] 208 // IRBUILDER: br label %[[RETURN]] 209 // IRBUILDER: [[CONTINUE]] 210 // IRBUILDER: br label %[[ELSE2:.+]] 211 212 #endif 213