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