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: 31a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 8 32*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1:[0-9]+]], i1 true, i1 false, i1 true) 33*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 34*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 35*e2cfbfccSJohannes Doerfert // CHECK1: user_code.entry: 36*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]]) 37*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP2:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 38*e2cfbfccSJohannes Doerfert // 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) 39*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 true, i1 true) 40*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: ret void 41*e2cfbfccSJohannes Doerfert // CHECK1: worker.exit: 42a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: ret void 43a2dbfb6bSGiorgis Georgakoudis // 44a2dbfb6bSGiorgis Georgakoudis // 45a2dbfb6bSGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__ 46a2dbfb6bSGiorgis Georgakoudis // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] { 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*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: call void @_Z3usev() #[[ATTR5:[0-9]+]] 53a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: ret void 54a2dbfb6bSGiorgis Georgakoudis // 55a2dbfb6bSGiorgis Georgakoudis // 56a2dbfb6bSGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_Z3usev 57*e2cfbfccSJohannes Doerfert // CHECK1-SAME: () #[[ATTR1:[0-9]+]] { 58a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: entry: 59a2dbfb6bSGiorgis 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]+]]) 61a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 62df729e2bSJohannes Doerfert // 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 67a2dbfb6bSGiorgis Georgakoudis // CHECK1-SAME: () #[[ATTR0]] { 68a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: entry: 69*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1]], i1 false, i1 true, i1 true) 70*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 71*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 72*e2cfbfccSJohannes Doerfert // CHECK1: user_code.entry: 73*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: call void @_Z3usev() #[[ATTR5]] 74*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 false, i1 true) 75*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: ret void 76*e2cfbfccSJohannes Doerfert // CHECK1: worker.exit: 77a2dbfb6bSGiorgis Georgakoudis // CHECK1-NEXT: ret void 78a2dbfb6bSGiorgis Georgakoudis // 79a2dbfb6bSGiorgis Georgakoudis // 80df729e2bSJohannes Doerfert // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1 81df729e2bSJohannes Doerfert // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] { 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*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: call void @_Z4workv() #[[ATTR5]] 88df729e2bSJohannes Doerfert // CHECK1-NEXT: ret void 89df729e2bSJohannes Doerfert // 90df729e2bSJohannes Doerfert // 91df729e2bSJohannes Doerfert // CHECK1-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper 92*e2cfbfccSJohannes Doerfert // CHECK1-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR4:[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*e2cfbfccSJohannes Doerfert // CHECK1-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]]) #[[ATTR2:[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: 109a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 4 110*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1:[0-9]+]], i1 true, i1 false, i1 true) 111*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 112*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 113*e2cfbfccSJohannes Doerfert // CHECK2: user_code.entry: 114*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]]) 115*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[TMP2:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 116*e2cfbfccSJohannes Doerfert // 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) 117*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 true, i1 true) 118*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: ret void 119*e2cfbfccSJohannes Doerfert // CHECK2: worker.exit: 120a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: ret void 121a2dbfb6bSGiorgis Georgakoudis // 122a2dbfb6bSGiorgis Georgakoudis // 123a2dbfb6bSGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__ 124a2dbfb6bSGiorgis Georgakoudis // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] { 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*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: call void @_Z3usev() #[[ATTR5:[0-9]+]] 131a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: ret void 132a2dbfb6bSGiorgis Georgakoudis // 133a2dbfb6bSGiorgis Georgakoudis // 134a2dbfb6bSGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_Z3usev 135*e2cfbfccSJohannes Doerfert // CHECK2-SAME: () #[[ATTR1:[0-9]+]] { 136a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: entry: 137a2dbfb6bSGiorgis 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]+]]) 139a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: [[TMP1:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 140df729e2bSJohannes Doerfert // 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 145a2dbfb6bSGiorgis Georgakoudis // CHECK2-SAME: () #[[ATTR0]] { 146a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: entry: 147*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1]], i1 false, i1 true, i1 true) 148*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 149*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 150*e2cfbfccSJohannes Doerfert // CHECK2: user_code.entry: 151*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: call void @_Z3usev() #[[ATTR5]] 152*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 false, i1 true) 153*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: ret void 154*e2cfbfccSJohannes Doerfert // CHECK2: worker.exit: 155a2dbfb6bSGiorgis Georgakoudis // CHECK2-NEXT: ret void 156a2dbfb6bSGiorgis Georgakoudis // 157a2dbfb6bSGiorgis Georgakoudis // 158df729e2bSJohannes Doerfert // CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1 159df729e2bSJohannes Doerfert // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] { 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*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: call void @_Z4workv() #[[ATTR5]] 166df729e2bSJohannes Doerfert // CHECK2-NEXT: ret void 167df729e2bSJohannes Doerfert // 168df729e2bSJohannes Doerfert // 169df729e2bSJohannes Doerfert // CHECK2-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper 170*e2cfbfccSJohannes Doerfert // CHECK2-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR4:[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*e2cfbfccSJohannes Doerfert // CHECK2-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]]) #[[ATTR2:[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: 187a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x i8*], align 4 188*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1:[0-9]+]], i1 true, i1 false, i1 true) 189*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 190*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 191*e2cfbfccSJohannes Doerfert // CHECK3: user_code.entry: 192*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]]) 193*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[TMP2:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 194*e2cfbfccSJohannes Doerfert // 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) 195*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 true, i1 true) 196*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: ret void 197*e2cfbfccSJohannes Doerfert // CHECK3: worker.exit: 198a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: ret void 199a2dbfb6bSGiorgis Georgakoudis // 200a2dbfb6bSGiorgis Georgakoudis // 201a2dbfb6bSGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__ 202a2dbfb6bSGiorgis Georgakoudis // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] { 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*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: call void @_Z3usev() #[[ATTR5:[0-9]+]] 209a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: ret void 210a2dbfb6bSGiorgis Georgakoudis // 211a2dbfb6bSGiorgis Georgakoudis // 212a2dbfb6bSGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@_Z3usev 213*e2cfbfccSJohannes Doerfert // CHECK3-SAME: () #[[ATTR1:[0-9]+]] { 214a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: entry: 215a2dbfb6bSGiorgis 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]+]]) 217a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: [[TMP1:%.*]] = bitcast [0 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 218df729e2bSJohannes Doerfert // 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 223a2dbfb6bSGiorgis Georgakoudis // CHECK3-SAME: () #[[ATTR0]] { 224a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: entry: 225*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1]], i1 false, i1 true, i1 true) 226*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 227*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 228*e2cfbfccSJohannes Doerfert // CHECK3: user_code.entry: 229*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: call void @_Z3usev() #[[ATTR5]] 230*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i1 false, i1 true) 231*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: ret void 232*e2cfbfccSJohannes Doerfert // CHECK3: worker.exit: 233a2dbfb6bSGiorgis Georgakoudis // CHECK3-NEXT: ret void 234a2dbfb6bSGiorgis Georgakoudis // 235df729e2bSJohannes Doerfert // 236df729e2bSJohannes Doerfert // CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1 237df729e2bSJohannes Doerfert // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR0]] { 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*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: call void @_Z4workv() #[[ATTR5]] 244df729e2bSJohannes Doerfert // CHECK3-NEXT: ret void 245df729e2bSJohannes Doerfert // 246df729e2bSJohannes Doerfert // 247df729e2bSJohannes Doerfert // CHECK3-LABEL: define {{[^@]+}}@__omp_outlined__1_wrapper 248*e2cfbfccSJohannes Doerfert // CHECK3-SAME: (i16 zeroext [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR4:[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*e2cfbfccSJohannes Doerfert // CHECK3-NEXT: call void @__omp_outlined__1(i32* [[DOTADDR1]], i32* [[DOTZERO_ADDR]]) #[[ATTR2:[0-9]+]] 259df729e2bSJohannes Doerfert // CHECK3-NEXT: ret void 260df729e2bSJohannes Doerfert // 261