1207b08a9SGiorgis Georgakoudis // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _ 2a2dbfb6bSGiorgis Georgakoudis // Test target codegen - host bc file has to be created first. 3a2dbfb6bSGiorgis Georgakoudis // RUN: %clang_cc1 -verify -fopenmp -fopenmp-cuda-mode -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc 4207b08a9SGiorgis Georgakoudis // RUN: %clang_cc1 -verify -fopenmp -fopenmp-cuda-mode -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -disable-llvm-optzns | FileCheck %s --check-prefix=CHECK1 5a2dbfb6bSGiorgis Georgakoudis // RUN: %clang_cc1 -verify -fopenmp -fopenmp-cuda-mode -x c++ -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc 6207b08a9SGiorgis Georgakoudis // RUN: %clang_cc1 -verify -fopenmp -fopenmp-cuda-mode -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - -disable-llvm-optzns | FileCheck %s --check-prefix=CHECK2 7207b08a9SGiorgis Georgakoudis // RUN: %clang_cc1 -verify -fopenmp -fopenmp-cuda-mode -fexceptions -fcxx-exceptions -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - -disable-llvm-optzns | FileCheck %s --check-prefix=CHECK3 8a2dbfb6bSGiorgis Georgakoudis 9a2dbfb6bSGiorgis Georgakoudis // expected-no-diagnostics 10a2dbfb6bSGiorgis Georgakoudis #ifndef HEADER 11a2dbfb6bSGiorgis Georgakoudis #define HEADER 12a2dbfb6bSGiorgis Georgakoudis 13a2dbfb6bSGiorgis Georgakoudis void work(); 14a2dbfb6bSGiorgis Georgakoudis 15a2dbfb6bSGiorgis Georgakoudis void use() { 16a2dbfb6bSGiorgis Georgakoudis #pragma omp parallel 17a2dbfb6bSGiorgis Georgakoudis work(); 18a2dbfb6bSGiorgis Georgakoudis } 19a2dbfb6bSGiorgis Georgakoudis 20a2dbfb6bSGiorgis Georgakoudis int main() { 21a2dbfb6bSGiorgis Georgakoudis #pragma omp target parallel 22a2dbfb6bSGiorgis Georgakoudis { use(); } 23a2dbfb6bSGiorgis Georgakoudis #pragma omp target 24a2dbfb6bSGiorgis Georgakoudis { use(); } 25a2dbfb6bSGiorgis Georgakoudis } 26a2dbfb6bSGiorgis Georgakoudis 27a2dbfb6bSGiorgis Georgakoudis #endif 28a2dbfb6bSGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l21 29a2dbfb6bSGiorgis Georgakoudis // CHECK1-SAME: () #[[ATTR0:[0-9]+]] { 30a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: entry: 31*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 8 32e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1:[0-9]+]], i1 true, i1 false, i1 true) 33e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 34e2cfbfccSJohannes Doerfert // CHECK1-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 35e2cfbfccSJohannes Doerfert // CHECK1: user_code.entry: 36e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]]) 37*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 38*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB2]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__ to i8*), i8* null, i8** [[TMP2]], i64 0) 39e2cfbfccSJohannes Doerfert // CHECK1-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 true, i1 true) 40e2cfbfccSJohannes Doerfert // CHECK1-NEXT: ret void 41e2cfbfccSJohannes Doerfert // CHECK1: worker.exit: 42a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: ret void 43a2dbfb6bSGiorgis Georgakoudis // 44a2dbfb6bSGiorgis Georgakoudis // 45a2dbfb6bSGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__ 46*ac90dfc4SGiorgis Georgakoudis // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1:[0-9]+]] { 47a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: entry: 48a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 49a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 50a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 51a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 52*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @_Z3usev() #[[ATTR6:[0-9]+]] 53a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: ret void 54a2dbfb6bSGiorgis Georgakoudis // 55a2dbfb6bSGiorgis Georgakoudis // 56a2dbfb6bSGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_Z3usev 570276db14SJose M Monsalve Diaz // CHECK1-SAME: () #[[ATTR2:[0-9]+]] { 58a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: entry: 59*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 8 60df729e2bSJohannes Doerfert // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]]) 61*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 62*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP1]], i64 0) 63a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: ret void 64a2dbfb6bSGiorgis Georgakoudis // 65a2dbfb6bSGiorgis Georgakoudis // 66a2dbfb6bSGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23 670276db14SJose M Monsalve Diaz // CHECK1-SAME: () #[[ATTR1]] { 68a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: entry: 69e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1]], i1 false, i1 true, i1 true) 70e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 71e2cfbfccSJohannes Doerfert // CHECK1-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 72e2cfbfccSJohannes Doerfert // CHECK1: user_code.entry: 73*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @_Z3usev() #[[ATTR6]] 74e2cfbfccSJohannes Doerfert // CHECK1-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 false, i1 true) 75e2cfbfccSJohannes Doerfert // CHECK1-NEXT: ret void 76e2cfbfccSJohannes Doerfert // CHECK1: worker.exit: 77a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: ret void 78a2dbfb6bSGiorgis Georgakoudis // 79a2dbfb6bSGiorgis Georgakoudis // 80df729e2bSJohannes Doerfert // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1 81*ac90dfc4SGiorgis Georgakoudis // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] { 82df729e2bSJohannes Doerfert // CHECK1-NEXT: entry: 83df729e2bSJohannes Doerfert // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 84df729e2bSJohannes Doerfert // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 85df729e2bSJohannes Doerfert // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 86df729e2bSJohannes Doerfert // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 87*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @_Z4workv() #[[ATTR6]] 88df729e2bSJohannes Doerfert // CHECK1-NEXT: ret void 89df729e2bSJohannes Doerfert // 90df729e2bSJohannes Doerfert // 91df729e2bSJohannes Doerfert // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper 92*ac90dfc4SGiorgis Georgakoudis // CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR5:[0-9]+]] { 93df729e2bSJohannes Doerfert // CHECK1-NEXT: entry: 94df729e2bSJohannes Doerfert // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2 95df729e2bSJohannes Doerfert // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4 96df729e2bSJohannes Doerfert // CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4 97df729e2bSJohannes Doerfert // CHECK1-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 8 98df729e2bSJohannes Doerfert // CHECK1-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4 99df729e2bSJohannes Doerfert // CHECK1-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2 100df729e2bSJohannes Doerfert // CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4 101df729e2bSJohannes Doerfert // CHECK1-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]]) 102*ac90dfc4SGiorgis Georgakoudis // CHECK1-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]]) #[[ATTR3:[0-9]+]] 103df729e2bSJohannes Doerfert // CHECK1-NEXT: ret void 104df729e2bSJohannes Doerfert // 105df729e2bSJohannes Doerfert // 106a2dbfb6bSGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l21 107a2dbfb6bSGiorgis Georgakoudis // CHECK2-SAME: () #[[ATTR0:[0-9]+]] { 108a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: entry: 109*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 4 110e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1:[0-9]+]], i1 true, i1 false, i1 true) 111e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 112e2cfbfccSJohannes Doerfert // CHECK2-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 113e2cfbfccSJohannes Doerfert // CHECK2: user_code.entry: 114e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]]) 115*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 116*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB2]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__ to i8*), i8* null, i8** [[TMP2]], i32 0) 117e2cfbfccSJohannes Doerfert // CHECK2-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 true, i1 true) 118e2cfbfccSJohannes Doerfert // CHECK2-NEXT: ret void 119e2cfbfccSJohannes Doerfert // CHECK2: worker.exit: 120a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: ret void 121a2dbfb6bSGiorgis Georgakoudis // 122a2dbfb6bSGiorgis Georgakoudis // 123a2dbfb6bSGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__ 124*ac90dfc4SGiorgis Georgakoudis // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1:[0-9]+]] { 125a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: entry: 126a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 127a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 128a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 129a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 130*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: call void @_Z3usev() #[[ATTR6:[0-9]+]] 131a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: ret void 132a2dbfb6bSGiorgis Georgakoudis // 133a2dbfb6bSGiorgis Georgakoudis // 134a2dbfb6bSGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_Z3usev 1350276db14SJose M Monsalve Diaz // CHECK2-SAME: () #[[ATTR2:[0-9]+]] { 136a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: entry: 137*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 4 138df729e2bSJohannes Doerfert // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]]) 139*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP1:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 140*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP1]], i32 0) 141a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: ret void 142a2dbfb6bSGiorgis Georgakoudis // 143a2dbfb6bSGiorgis Georgakoudis // 144a2dbfb6bSGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23 1450276db14SJose M Monsalve Diaz // CHECK2-SAME: () #[[ATTR1]] { 146a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: entry: 147e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1]], i1 false, i1 true, i1 true) 148e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 149e2cfbfccSJohannes Doerfert // CHECK2-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 150e2cfbfccSJohannes Doerfert // CHECK2: user_code.entry: 151*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: call void @_Z3usev() #[[ATTR6]] 152e2cfbfccSJohannes Doerfert // CHECK2-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 false, i1 true) 153e2cfbfccSJohannes Doerfert // CHECK2-NEXT: ret void 154e2cfbfccSJohannes Doerfert // CHECK2: worker.exit: 155a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: ret void 156a2dbfb6bSGiorgis Georgakoudis // 157a2dbfb6bSGiorgis Georgakoudis // 158df729e2bSJohannes Doerfert // CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1 159*ac90dfc4SGiorgis Georgakoudis // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] { 160df729e2bSJohannes Doerfert // CHECK2-NEXT: entry: 161df729e2bSJohannes Doerfert // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 162df729e2bSJohannes Doerfert // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 163df729e2bSJohannes Doerfert // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 164df729e2bSJohannes Doerfert // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 165*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: call void @_Z4workv() #[[ATTR6]] 166df729e2bSJohannes Doerfert // CHECK2-NEXT: ret void 167df729e2bSJohannes Doerfert // 168df729e2bSJohannes Doerfert // 169df729e2bSJohannes Doerfert // CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper 170*ac90dfc4SGiorgis Georgakoudis // CHECK2-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR5:[0-9]+]] { 171df729e2bSJohannes Doerfert // CHECK2-NEXT: entry: 172df729e2bSJohannes Doerfert // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2 173df729e2bSJohannes Doerfert // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4 174df729e2bSJohannes Doerfert // CHECK2-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4 175df729e2bSJohannes Doerfert // CHECK2-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4 176df729e2bSJohannes Doerfert // CHECK2-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4 177df729e2bSJohannes Doerfert // CHECK2-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2 178df729e2bSJohannes Doerfert // CHECK2-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4 179df729e2bSJohannes Doerfert // CHECK2-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]]) 180*ac90dfc4SGiorgis Georgakoudis // CHECK2-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]]) #[[ATTR3:[0-9]+]] 181df729e2bSJohannes Doerfert // CHECK2-NEXT: ret void 182df729e2bSJohannes Doerfert // 183df729e2bSJohannes Doerfert // 184a2dbfb6bSGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l21 185a2dbfb6bSGiorgis Georgakoudis // CHECK3-SAME: () #[[ATTR0:[0-9]+]] { 186a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: entry: 187*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 4 188e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1:[0-9]+]], i1 true, i1 false, i1 true) 189e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 190e2cfbfccSJohannes Doerfert // CHECK3-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 191e2cfbfccSJohannes Doerfert // CHECK3: user_code.entry: 192e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]]) 193*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP2:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 194*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB2]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__ to i8*), i8* null, i8** [[TMP2]], i32 0) 195e2cfbfccSJohannes Doerfert // CHECK3-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 true, i1 true) 196e2cfbfccSJohannes Doerfert // CHECK3-NEXT: ret void 197e2cfbfccSJohannes Doerfert // CHECK3: worker.exit: 198a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: ret void 199a2dbfb6bSGiorgis Georgakoudis // 200a2dbfb6bSGiorgis Georgakoudis // 201a2dbfb6bSGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__ 202*ac90dfc4SGiorgis Georgakoudis // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1:[0-9]+]] { 203a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: entry: 204a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 205a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 206a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 207a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 208*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: call void @_Z3usev() #[[ATTR6:[0-9]+]] 209a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: ret void 210a2dbfb6bSGiorgis Georgakoudis // 211a2dbfb6bSGiorgis Georgakoudis // 212a2dbfb6bSGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@_Z3usev 2130276db14SJose M Monsalve Diaz // CHECK3-SAME: () #[[ATTR2:[0-9]+]] { 214a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: entry: 215*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 4 216df729e2bSJohannes Doerfert // CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]]) 217*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP1:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 218*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*)* @__omp_outlined__1 to i8*), i8* bitcast (void (i16, i32)* @__omp_outlined__1_wrapper to i8*), i8** [[TMP1]], i32 0) 219a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: ret void 220a2dbfb6bSGiorgis Georgakoudis // 221a2dbfb6bSGiorgis Georgakoudis // 222a2dbfb6bSGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l23 2230276db14SJose M Monsalve Diaz // CHECK3-SAME: () #[[ATTR1]] { 224a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: entry: 225e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1]], i1 false, i1 true, i1 true) 226e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 227e2cfbfccSJohannes Doerfert // CHECK3-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 228e2cfbfccSJohannes Doerfert // CHECK3: user_code.entry: 229*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: call void @_Z3usev() #[[ATTR6]] 230e2cfbfccSJohannes Doerfert // CHECK3-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 false, i1 true) 231e2cfbfccSJohannes Doerfert // CHECK3-NEXT: ret void 232e2cfbfccSJohannes Doerfert // CHECK3: worker.exit: 233a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: ret void 234a2dbfb6bSGiorgis Georgakoudis // 235df729e2bSJohannes Doerfert // 236df729e2bSJohannes Doerfert // CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1 237*ac90dfc4SGiorgis Georgakoudis // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] { 238df729e2bSJohannes Doerfert // CHECK3-NEXT: entry: 239df729e2bSJohannes Doerfert // CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 240df729e2bSJohannes Doerfert // CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 241df729e2bSJohannes Doerfert // CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 242df729e2bSJohannes Doerfert // CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 243*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: call void @_Z4workv() #[[ATTR6]] 244df729e2bSJohannes Doerfert // CHECK3-NEXT: ret void 245df729e2bSJohannes Doerfert // 246df729e2bSJohannes Doerfert // 247df729e2bSJohannes Doerfert // CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper 248*ac90dfc4SGiorgis Georgakoudis // CHECK3-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR5:[0-9]+]] { 249df729e2bSJohannes Doerfert // CHECK3-NEXT: entry: 250df729e2bSJohannes Doerfert // CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i16, align 2 251df729e2bSJohannes Doerfert // CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4 252df729e2bSJohannes Doerfert // CHECK3-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4 253df729e2bSJohannes Doerfert // CHECK3-NEXT: [[GLOBAL_ARGS:%.*]] = alloca i8**, align 4 254df729e2bSJohannes Doerfert // CHECK3-NEXT: store i32 0, i32* [[DOTZERO_ADDR]], align 4 255df729e2bSJohannes Doerfert // CHECK3-NEXT: store i16 [[TMP0]], i16* [[DOTADDR]], align 2 256df729e2bSJohannes Doerfert // CHECK3-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4 257df729e2bSJohannes Doerfert // CHECK3-NEXT: call void @__kmpc_get_shared_variables(i8*** [[GLOBAL_ARGS]]) 258*ac90dfc4SGiorgis Georgakoudis // CHECK3-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]]) #[[ATTR3:[0-9]+]] 259df729e2bSJohannes Doerfert // CHECK3-NEXT: ret void 260df729e2bSJohannes Doerfert // 261