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