1 // RUN: %clang_cc1 -verify -fopenmp -DOMP5 -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -DOMP5 -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -DOMP5 -x c++ -triple x86_64-apple-darwin10 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s 4 5 // RUN: %clang_cc1 -verify -fopenmp-simd -DOMP5 -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s 6 // RUN: %clang_cc1 -fopenmp-simd -DOMP5 -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s 7 // RUN: %clang_cc1 -fopenmp-simd -DOMP5 -x c++ -triple x86_64-apple-darwin10 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s 8 // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 9 // expected-no-diagnostics 10 11 #ifndef HEADER 12 #define HEADER 13 14 int main() { 15 int a = 0; 16 #pragma omp parallel for lastprivate(conditional: a) 17 for (int i = 0; i < 10; ++i) { 18 if (i < 5) { 19 a = 0; 20 #pragma omp parallel reduction(+:a) num_threads(10) 21 a += i; 22 #pragma omp atomic 23 a += i; 24 #pragma omp parallel num_threads(10) 25 #pragma omp atomic 26 a += i; 27 } 28 } 29 return 0; 30 } 31 32 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @{{.+}}, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* [[OUTLINED:@.+]] to void (i32*, i32*, ...)*), i32* %{{.+}}) 33 34 // CHECK: define internal void [[OUTLINED]]( 35 // CHECK: call void @__kmpc_push_num_threads(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i32 10) 36 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @{{.+}}, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @{{.+}} to void (i32*, i32*, ...)*), i32* {{.+}} i32* %{{.+}}) 37 // CHECK: call void @__kmpc_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}}) 38 // CHECK: [[LAST_IV_VAL:%.+]] = load i32, i32* [[LAST_IV:@.+]], 39 // CHECK: [[RES:%.+]] = icmp sle i32 [[LAST_IV_VAL]], [[IV:%.+]] 40 // CHECK: br i1 [[RES]], label %[[THEN:.+]], label %[[DONE:.+]] 41 // CHECK: [[THEN]]: 42 // CHECK: store i32 [[IV]], i32* [[LAST_IV]], 43 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_PRIV:%.+]], 44 // CHECK: store i32 [[A_VAL]], i32* [[A_GLOB:@.+]], 45 // CHECK: br label %[[DONE]] 46 // CHECK: [[DONE]]: 47 // CHECK: call void @__kmpc_end_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}}) 48 // CHECK: atomicrmw add i32* {{.*}}, align 4 49 // CHECK: call void @__kmpc_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}}) 50 // CHECK: [[LAST_IV_VAL:%.+]] = load i32, i32* [[LAST_IV:@.+]], 51 // CHECK: [[RES:%.+]] = icmp sle i32 [[LAST_IV_VAL]], [[IV:%.+]] 52 // CHECK: br i1 [[RES]], label %[[THEN:.+]], label %[[DONE:.+]] 53 // CHECK: [[THEN]]: 54 // CHECK: store i32 [[IV]], i32* [[LAST_IV]], 55 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_PRIV:%.+]], 56 // CHECK: store i32 [[A_VAL]], i32* [[A_GLOB:@.+]], 57 // CHECK: br label %[[DONE]] 58 // CHECK: [[DONE]]: 59 // CHECK: call void @__kmpc_end_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}}) 60 // CHECK: call void @__kmpc_push_num_threads(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i32 10) 61 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @{{.+}}, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* [[OUTLINED2:@.+]] to void (i32*, i32*, ...)*), i32* {{.+}} i32* %{{.+}}) 62 // CHECK: [[FIRED:%.+]] = getelementptr inbounds %struct.{{.+}}, %struct.{{.+}}* %{{.+}}, i{{.+}} 0, i{{.+}} 1 63 // CHECK: [[FIRED_VAL:%.+]] = load i8, i8* [[FIRED]], 64 // CHECK: [[CMP:%.+]] = icmp ne i8 [[FIRED_VAL]], 0 65 // CHECK: br i1 [[CMP]], label %[[CHECK_THEN:.+]], label %[[CHECK_DONE:.+]] 66 // CHECK: [[CHECK_THEN]]: 67 // CHECK: call void @__kmpc_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}}) 68 // CHECK: [[LAST_IV_VAL:%.+]] = load i32, i32* [[LAST_IV:@.+]], 69 // CHECK: [[RES:%.+]] = icmp sle i32 [[LAST_IV_VAL]], [[IV:%.+]] 70 // CHECK: br i1 [[RES]], label %[[THEN:.+]], label %[[DONE:.+]] 71 // CHECK: [[THEN]]: 72 // CHECK: store i32 [[IV]], i32* [[LAST_IV]], 73 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_PRIV:%.+]], 74 // CHECK: store i32 [[A_VAL]], i32* [[A_GLOB:@.+]], 75 // CHECK: br label %[[DONE]] 76 // CHECK: [[DONE]]: 77 // CHECK: call void @__kmpc_end_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}}) 78 // CHECK: br label %[[CHECK_DONE]] 79 // CHECK: [[CHECK_DONE]]: 80 // CHECK: call void @__kmpc_for_static_fini(%struct.ident_t* @{{.+}}, i32 %{{.+}}) 81 // CHECK: [[IS_LAST:%.+]] = load i32, i32* %{{.+}}, 82 // CHECK: [[RES:%.+]] = icmp ne i32 [[IS_LAST]], 0 83 // CHECK: call void @__kmpc_barrier(%struct.ident_t* @{{.+}}, i32 %{{.+}}) 84 // CHECK: br i1 [[RES]], label %[[THEN:.+]], label %[[DONE:.+]] 85 // CHECK: [[THEN]]: 86 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_GLOB]], 87 // CHECK: store i32 [[A_VAL]], i32* [[A_PRIV]], 88 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_PRIV]], 89 // CHECK: store i32 [[A_VAL]], i32* %{{.+}}, 90 // CHECK: br label %[[DONE]] 91 // CHECK: [[DONE]]: 92 // CHECK: ret void 93 94 // CHECK: define internal void [[OUTLINED2]](i32* {{.+}}, i32* {{.+}}, i32* {{.+}}, i32* {{.+}}) 95 // CHECK: atomicrmw add i32* [[A_SHARED:%.+]], i32 %{{.+}} monotonic, align 4 96 // CHECK: [[BASE:%.+]] = bitcast i32* [[A_SHARED]] to [[STRUCT:%struct[.].+]]* 97 // CHECK: [[FIRED:%.+]] = getelementptr inbounds [[STRUCT]], [[STRUCT]]* [[BASE]], i{{.+}} 0, i{{.+}} 1 98 // CHECK: store atomic volatile i8 1, i8* [[FIRED]] unordered, align 1 99 // CHECK: ret void 100 101 #endif // HEADER 102