1*de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefixes=ALL,NORMAL 2*de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s 3*de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,NORMAL 4*de59f564SAaron Ballman // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fopenmp-version=51 -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG 5*de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -fopenmp-enable-irbuilder -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER 6*de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -fopenmp-enable-irbuilder -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s 7*de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -fopenmp-enable-irbuilder -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER 8*de59f564SAaron Ballman 9*de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s 10*de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=51 -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s 11*de59f564SAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=51 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s 12*de59f564SAaron Ballman // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fopenmp-version=51 -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s 13*de59f564SAaron Ballman // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 14*de59f564SAaron Ballman // expected-no-diagnostics 15*de59f564SAaron Ballman #ifndef HEADER 16*de59f564SAaron Ballman #define HEADER 17*de59f564SAaron Ballman 18*de59f564SAaron Ballman // ALL: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, i8* } 19*de59f564SAaron Ballman // ALL: [[UNNAMED_LOCK:@.+]] = common global [8 x i32] zeroinitializer 20*de59f564SAaron Ballman // ALL: [[THE_NAME_LOCK:@.+]] = common global [8 x i32] zeroinitializer 21*de59f564SAaron Ballman // ALL: [[THE_NAME_LOCK1:@.+]] = common global [8 x i32] zeroinitializer 22*de59f564SAaron Ballman 23*de59f564SAaron Ballman // ALL: define {{.*}}void [[FOO:@.+]]() 24*de59f564SAaron Ballman 25*de59f564SAaron Ballman void foo() { extern void mayThrow(); mayThrow(); } 26*de59f564SAaron Ballman 27*de59f564SAaron Ballman // ALL-LABEL: @main 28*de59f564SAaron Ballman // TERM_DEBUG-LABEL: @main 29*de59f564SAaron Ballman int main() { 30*de59f564SAaron Ballman // ALL: [[A_ADDR:%.+]] = alloca i8 31*de59f564SAaron Ballman char a; 32*de59f564SAaron Ballman 33*de59f564SAaron Ballman // ALL: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]]) 34*de59f564SAaron Ballman // ALL: call {{.*}}void @__kmpc_critical([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[UNNAMED_LOCK]]) 35*de59f564SAaron Ballman // ALL-NEXT: store i8 2, i8* [[A_ADDR]] 36*de59f564SAaron Ballman // ALL-NEXT: call {{.*}}void @__kmpc_end_critical([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[UNNAMED_LOCK]]) 37*de59f564SAaron Ballman [[omp::directive(critical)]] 38*de59f564SAaron Ballman a = 2; 39*de59f564SAaron Ballman // IRBUILDER: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]]) 40*de59f564SAaron Ballman // ALL: call {{.*}}void @__kmpc_critical([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[THE_NAME_LOCK]]) 41*de59f564SAaron Ballman // IRBUILDER-NEXT: call {{.*}}void [[FOO]]() 42*de59f564SAaron Ballman // NORMAL-NEXT: invoke {{.*}}void [[FOO]]() 43*de59f564SAaron Ballman // ALL: call {{.*}}void @__kmpc_end_critical([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[THE_NAME_LOCK]]) 44*de59f564SAaron Ballman [[omp::directive(critical(the_name))]] 45*de59f564SAaron Ballman foo(); 46*de59f564SAaron Ballman // IRBUILDER: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]]) 47*de59f564SAaron Ballman // ALL: call {{.*}}void @__kmpc_critical_with_hint([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[THE_NAME_LOCK1]], i{{64|32}} 23) 48*de59f564SAaron Ballman // IRBUILDER-NEXT: call {{.*}}void [[FOO]]() 49*de59f564SAaron Ballman // NORMAL-NEXT: invoke {{.*}}void [[FOO]]() 50*de59f564SAaron Ballman // ALL: call {{.*}}void @__kmpc_end_critical([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[THE_NAME_LOCK1]]) 51*de59f564SAaron Ballman [[omp::directive(critical(the_name1) hint(23))]] 52*de59f564SAaron Ballman foo(); 53*de59f564SAaron Ballman // IRBUILDER: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]]) 54*de59f564SAaron Ballman // ALL: call {{.*}}void @__kmpc_critical([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], [8 x i32]* [[THE_NAME_LOCK]]) 55*de59f564SAaron Ballman // ALL: br label 56*de59f564SAaron Ballman // ALL-NOT: call {{.*}}void @__kmpc_end_critical( 57*de59f564SAaron Ballman // ALL: br label 58*de59f564SAaron Ballman // ALL-NOT: call {{.*}}void @__kmpc_end_critical( 59*de59f564SAaron Ballman // NORMAL: br label 60*de59f564SAaron Ballman if (a) 61*de59f564SAaron Ballman [[omp::directive(critical(the_name))]] 62*de59f564SAaron Ballman while (1) 63*de59f564SAaron Ballman ; 64*de59f564SAaron Ballman // ALL: call {{.*}}void [[FOO]]() 65*de59f564SAaron Ballman foo(); 66*de59f564SAaron Ballman // ALL-NOT: call void @__kmpc_critical 67*de59f564SAaron Ballman // ALL-NOT: call void @__kmpc_end_critical 68*de59f564SAaron Ballman return a; 69*de59f564SAaron Ballman } 70*de59f564SAaron Ballman 71*de59f564SAaron Ballman // ALL-LABEL: lambda_critical 72*de59f564SAaron Ballman // TERM_DEBUG-LABEL: lambda_critical 73*de59f564SAaron Ballman void lambda_critical(int a, int b) { 74*de59f564SAaron Ballman auto l = [=]() { 75*de59f564SAaron Ballman [[omp::directive(critical)]] 76*de59f564SAaron Ballman { 77*de59f564SAaron Ballman // ALL: call void @__kmpc_critical( 78*de59f564SAaron Ballman int c = a + b; 79*de59f564SAaron Ballman } 80*de59f564SAaron Ballman }; 81*de59f564SAaron Ballman 82*de59f564SAaron Ballman l(); 83*de59f564SAaron Ballman 84*de59f564SAaron Ballman auto l1 = [=]() { 85*de59f564SAaron Ballman [[omp::sequence(directive(parallel), directive(critical))]] 86*de59f564SAaron Ballman { 87*de59f564SAaron Ballman // ALL: call void @__kmpc_critical( 88*de59f564SAaron Ballman int c = a + b; 89*de59f564SAaron Ballman } 90*de59f564SAaron Ballman }; 91*de59f564SAaron Ballman 92*de59f564SAaron Ballman l1(); 93*de59f564SAaron Ballman } 94*de59f564SAaron Ballman 95*de59f564SAaron Ballman struct S { 96*de59f564SAaron Ballman int a; 97*de59f564SAaron Ballman }; 98*de59f564SAaron Ballman // ALL-LABEL: critical_ref 99*de59f564SAaron Ballman void critical_ref(S &s) { 100*de59f564SAaron Ballman // ALL: [[S_ADDR:%.+]] = alloca %struct.S*, 101*de59f564SAaron Ballman // ALL: [[S_REF:%.+]] = load %struct.S*, %struct.S** [[S_ADDR]], 102*de59f564SAaron Ballman // ALL: [[S_A_REF:%.+]] = getelementptr inbounds %struct.S, %struct.S* [[S_REF]], i32 0, i32 0 103*de59f564SAaron Ballman ++s.a; 104*de59f564SAaron Ballman // ALL: call void @__kmpc_critical( 105*de59f564SAaron Ballman [[omp::directive(critical)]] 106*de59f564SAaron Ballman // ALL: [[S_REF:%.+]] = load %struct.S*, %struct.S** [[S_ADDR]], 107*de59f564SAaron Ballman // ALL: [[S_A_REF:%.+]] = getelementptr inbounds %struct.S, %struct.S* [[S_REF]], i32 0, i32 0 108*de59f564SAaron Ballman ++s.a; 109*de59f564SAaron Ballman // ALL: call void @__kmpc_end_critical( 110*de59f564SAaron Ballman } 111*de59f564SAaron Ballman 112*de59f564SAaron Ballman // ALL-LABEL: parallel_critical 113*de59f564SAaron Ballman // TERM_DEBUG-LABEL: parallel_critical 114*de59f564SAaron Ballman void parallel_critical() { 115*de59f564SAaron Ballman [[omp::sequence(directive(parallel), directive(critical))]] 116*de59f564SAaron Ballman // TERM_DEBUG-NOT: __kmpc_global_thread_num 117*de59f564SAaron Ballman // TERM_DEBUG: call void @__kmpc_critical({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]] 118*de59f564SAaron Ballman // TERM_DEBUG: invoke void {{.*}}foo{{.*}}() 119*de59f564SAaron Ballman // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], 120*de59f564SAaron Ballman // TERM_DEBUG-NOT: __kmpc_global_thread_num 121*de59f564SAaron Ballman // TERM_DEBUG: call void @__kmpc_end_critical({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]] 122*de59f564SAaron Ballman // TERM_DEBUG: [[TERM_LPAD]] 123*de59f564SAaron Ballman // TERM_DEBUG: call void @__clang_call_terminate 124*de59f564SAaron Ballman // TERM_DEBUG: unreachable 125*de59f564SAaron Ballman foo(); 126*de59f564SAaron Ballman } 127*de59f564SAaron Ballman // TERM_DEBUG-DAG: [[DBG_LOC_START]] = !DILocation(line: [[@LINE-12]], 128*de59f564SAaron Ballman // TERM_DEBUG-DAG: [[DBG_LOC_END]] = !DILocation(line: [[@LINE-3]], 129*de59f564SAaron Ballman #endif 130*de59f564SAaron Ballman 131