1 // 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 _
2 // expected-no-diagnostics
3 #ifndef HEADER
4 #define HEADER
5 
6 #ifdef CK1
7 ///==========================================================================///
8 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK1
9 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
10 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK2
11 
12 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
13 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
14 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
15 
16 
17 void foo() { extern void mayThrow(); mayThrow(); }
18 
19 void parallel_master() {
20 #pragma omp parallel master
21   foo();
22 }
23 
24 
25 
26 #endif
27 
28 #ifdef CK2
29 ///==========================================================================///
30 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK5
31 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
32 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK6
33 
34 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
35 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
36 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
37 
38 
39 void parallel_master_private() {
40   int a;
41 #pragma omp parallel master private(a)
42   a++;
43 }
44 
45 
46 
47 #endif
48 
49 #ifdef CK3
50 ///==========================================================================///
51 // RUN: %clang_cc1 -no-opaque-pointers -DCK3 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK9
52 // RUN: %clang_cc1 -no-opaque-pointers -DCK3 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
53 // RUN: %clang_cc1 -no-opaque-pointers -DCK3 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK10
54 
55 // RUN: %clang_cc1 -no-opaque-pointers -DCK3 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
56 // RUN: %clang_cc1 -no-opaque-pointers -DCK3 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
57 // RUN: %clang_cc1 -no-opaque-pointers -DCK3 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
58 
59 
60 void parallel_master_private() {
61   int a;
62 #pragma omp parallel master default(shared)
63   a++;
64 }
65 
66 
67 
68 #endif
69 
70 #ifdef CK31
71 ///==========================================================================///
72 // RUN: %clang_cc1 -no-opaque-pointers -DCK31 -fopenmp-version=51 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK13
73 // RUN: %clang_cc1 -no-opaque-pointers -DCK31 -fopenmp-version=51 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
74 // RUN: %clang_cc1 -no-opaque-pointers -DCK31 -fopenmp-version=51 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK14
75 
76 // RUN: %clang_cc1 -no-opaque-pointers -DCK31 -fopenmp-version=51 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
77 // RUN: %clang_cc1 -no-opaque-pointers -DCK31 -fopenmp-version=51 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
78 // RUN: %clang_cc1 -no-opaque-pointers -DCK31 -fopenmp-version=51 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
79 
80 
81 void parallel_master_default_firstprivate() {
82   int a;
83 #pragma omp parallel master default(firstprivate)
84   a++;
85 }
86 
87 
88 
89 
90 
91 #endif
92 
93 #ifdef CK32
94 ///==========================================================================///
95 // RUN: %clang_cc1 -no-opaque-pointers -DCK32 -fopenmp-version=51 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK17
96 // RUN: %clang_cc1 -no-opaque-pointers -DCK32 -fopenmp-version=51 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
97 // RUN: %clang_cc1 -no-opaque-pointers -DCK32 -fopenmp-version=51 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK18
98 
99 // RUN: %clang_cc1 -no-opaque-pointers -DCK32 -fopenmp-version=51 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
100 // RUN: %clang_cc1 -no-opaque-pointers -DCK32 -fopenmp-version=51 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
101 // RUN: %clang_cc1 -no-opaque-pointers -DCK32 -fopenmp-version=51 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
102 
103 
104 struct St {
105   int a, b;
106   static int y;
107   St() : a(0), b(0) {}
108   ~St() {}
109 };
110 int St::y = 0;
111 
112 void parallel_master_default_firstprivate() {
113   St a = St();
114   static int y = 0;
115 #pragma omp parallel master default(firstprivate)
116   {
117     a.a += 1;
118     a.b += 1;
119     y++;
120     a.y++;
121   }
122 }
123 
124 
125 
126 
127 
128 
129 
130 
131 #endif
132 
133 #ifdef CK4
134 ///==========================================================================///
135 // RUN: %clang_cc1 -no-opaque-pointers -DCK4 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK21
136 // RUN: %clang_cc1 -no-opaque-pointers -DCK4 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
137 // RUN: %clang_cc1 -no-opaque-pointers -DCK4 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK22
138 
139 // RUN: %clang_cc1 -no-opaque-pointers -DCK4 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
140 // RUN: %clang_cc1 -no-opaque-pointers -DCK4 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
141 // RUN: %clang_cc1 -no-opaque-pointers -DCK4 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
142 
143 
144 void parallel_master_firstprivate() {
145   int a;
146 #pragma omp parallel master firstprivate(a)
147   a++;
148 }
149 
150 
151 
152 #endif
153 
154 #ifdef CK5
155 ///==========================================================================///
156 // RUN: %clang_cc1 -no-opaque-pointers -DCK5 -verify -fopenmp -fopenmp -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefix=CHECK25
157 // RUN: %clang_cc1 -no-opaque-pointers -DCK5 -fopenmp -fopenmp -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
158 // RUN: %clang_cc1 -no-opaque-pointers -DCK5 -fopenmp -fopenmp -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK26
159 
160 // RUN: %clang_cc1 -no-opaque-pointers -DCK5 -verify -fopenmp-simd -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
161 // RUN: %clang_cc1 -no-opaque-pointers -DCK5 -fopenmp-simd -fnoopenmp-use-tls -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
162 // RUN: %clang_cc1 -no-opaque-pointers -DCK5 -fopenmp-simd -fnoopenmp-use-tls -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
163 
164 // RUN: %clang_cc1 -no-opaque-pointers -DCK5 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK29
165 // RUN: %clang_cc1 -no-opaque-pointers -DCK5 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s
166 
167 // RUN: %clang_cc1 -no-opaque-pointers -DCK5 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s
168 
169 
170 int a;
171 #pragma omp threadprivate(a)
172 
173 void parallel_master_copyin() {
174 #pragma omp parallel master copyin(a)
175   a++;
176 }
177 
178 
179 
180 
181 
182 
183 // TLC-CHECK-DAG:   [[INC:%.+]] = add nsw i32 [[TEN]], 1
184 // TLC-CHECK-DAG:   store i32 [[INC]], i32* [[TEN]]
185 
186 #endif
187 #ifdef CK6
188 ///==========================================================================///
189 // RUN: %clang_cc1 -no-opaque-pointers -DCK6 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s
190 
191 // RUN: %clang_cc1 -no-opaque-pointers -DCK6 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s
192 
193 
194 void parallel_master_reduction() {
195   int g;
196 #pragma omp parallel master reduction(+:g)
197   g = 1;
198 }
199 
200 
201 
202 
203 
204 // switch
205 
206 // case 1:
207 
208 // case 2:
209 
210 #endif
211 #ifdef CK7
212 ///==========================================================================///
213 // RUN: %clang_cc1 -no-opaque-pointers -DCK7 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
214 
215 // RUN: %clang_cc1 -no-opaque-pointers -DCK7 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
216 
217 
218 void parallel_master_if() {
219 #pragma omp parallel master if (parallel: false)
220   parallel_master_if();
221 }
222 
223 
224 
225 #endif
226 #ifdef CK8
227 ///==========================================================================///
228 // RUN: %clang_cc1 -no-opaque-pointers -DCK8 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
229 
230 // RUN: %clang_cc1 -no-opaque-pointers -DCK8 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
231 
232 typedef __INTPTR_TYPE__ intptr_t;
233 
234 
235 void foo();
236 
237 struct S {
238   intptr_t a, b, c;
239   S(intptr_t a) : a(a) {}
240   operator char() { return a; }
241   ~S() {}
242 };
243 
244 template <typename T>
245 T tmain() {
246 #pragma omp parallel master proc_bind(master)
247   foo();
248   return T();
249 }
250 
251 int main() {
252 #pragma omp parallel master proc_bind(spread)
253   foo();
254 #pragma omp parallel master proc_bind(close)
255   foo();
256   return tmain<int>();
257 }
258 
259 
260 
261 
262 #endif
263 #ifdef CK9
264 ///==========================================================================///
265 // RUN: %clang_cc1 -no-opaque-pointers -DCK9 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
266 
267 // RUN: %clang_cc1 -no-opaque-pointers -DCK9 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
268 typedef void **omp_allocator_handle_t;
269 extern const omp_allocator_handle_t omp_null_allocator;
270 extern const omp_allocator_handle_t omp_default_mem_alloc;
271 extern const omp_allocator_handle_t omp_large_cap_mem_alloc;
272 extern const omp_allocator_handle_t omp_const_mem_alloc;
273 extern const omp_allocator_handle_t omp_high_bw_mem_alloc;
274 extern const omp_allocator_handle_t omp_low_lat_mem_alloc;
275 extern const omp_allocator_handle_t omp_cgroup_mem_alloc;
276 extern const omp_allocator_handle_t omp_pteam_mem_alloc;
277 extern const omp_allocator_handle_t omp_thread_mem_alloc;
278 
279 void parallel_master_allocate() {
280   int a;
281   omp_allocator_handle_t myalloc = nullptr;
282 #pragma omp parallel master firstprivate(a) allocate(myalloc:a)
283   a++;
284 }
285 
286 
287 #endif
288 #endif
289 // CHECK1-LABEL: define {{[^@]+}}@_Z3foov
290 // CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
291 // CHECK1-NEXT:  entry:
292 // CHECK1-NEXT:    call void @_Z8mayThrowv()
293 // CHECK1-NEXT:    ret void
294 //
295 //
296 // CHECK1-LABEL: define {{[^@]+}}@_Z15parallel_masterv
297 // CHECK1-SAME: () #[[ATTR2:[0-9]+]] {
298 // CHECK1-NEXT:  entry:
299 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
300 // CHECK1-NEXT:    ret void
301 //
302 //
303 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
304 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR3:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
305 // CHECK1-NEXT:  entry:
306 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
307 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
308 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
309 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
310 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
311 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
312 // CHECK1-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
313 // CHECK1-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
314 // CHECK1-NEXT:    br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
315 // CHECK1:       omp_if.then:
316 // CHECK1-NEXT:    invoke void @_Z3foov()
317 // CHECK1-NEXT:    to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
318 // CHECK1:       invoke.cont:
319 // CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
320 // CHECK1-NEXT:    br label [[OMP_IF_END]]
321 // CHECK1:       omp_if.end:
322 // CHECK1-NEXT:    ret void
323 // CHECK1:       terminate.lpad:
324 // CHECK1-NEXT:    [[TMP4:%.*]] = landingpad { i8*, i32 }
325 // CHECK1-NEXT:    catch i8* null
326 // CHECK1-NEXT:    [[TMP5:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 0
327 // CHECK1-NEXT:    call void @__clang_call_terminate(i8* [[TMP5]]) #[[ATTR6:[0-9]+]]
328 // CHECK1-NEXT:    unreachable
329 //
330 //
331 // CHECK1-LABEL: define {{[^@]+}}@__clang_call_terminate
332 // CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR5:[0-9]+]] comdat {
333 // CHECK1-NEXT:    [[TMP2:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP0]]) #[[ATTR4:[0-9]+]]
334 // CHECK1-NEXT:    call void @_ZSt9terminatev() #[[ATTR6]]
335 // CHECK1-NEXT:    unreachable
336 //
337 //
338 // CHECK2-LABEL: define {{[^@]+}}@_Z3foov
339 // CHECK2-SAME: () #[[ATTR0:[0-9]+]] {
340 // CHECK2-NEXT:  entry:
341 // CHECK2-NEXT:    call void @_Z8mayThrowv()
342 // CHECK2-NEXT:    ret void
343 //
344 //
345 // CHECK2-LABEL: define {{[^@]+}}@_Z15parallel_masterv
346 // CHECK2-SAME: () #[[ATTR2:[0-9]+]] {
347 // CHECK2-NEXT:  entry:
348 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
349 // CHECK2-NEXT:    ret void
350 //
351 //
352 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
353 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR3:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
354 // CHECK2-NEXT:  entry:
355 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
356 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
357 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
358 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
359 // CHECK2-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
360 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
361 // CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
362 // CHECK2-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
363 // CHECK2-NEXT:    br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
364 // CHECK2:       omp_if.then:
365 // CHECK2-NEXT:    invoke void @_Z3foov()
366 // CHECK2-NEXT:    to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]]
367 // CHECK2:       invoke.cont:
368 // CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
369 // CHECK2-NEXT:    br label [[OMP_IF_END]]
370 // CHECK2:       omp_if.end:
371 // CHECK2-NEXT:    ret void
372 // CHECK2:       terminate.lpad:
373 // CHECK2-NEXT:    [[TMP4:%.*]] = landingpad { i8*, i32 }
374 // CHECK2-NEXT:    catch i8* null
375 // CHECK2-NEXT:    [[TMP5:%.*]] = extractvalue { i8*, i32 } [[TMP4]], 0
376 // CHECK2-NEXT:    call void @__clang_call_terminate(i8* [[TMP5]]) #[[ATTR6:[0-9]+]]
377 // CHECK2-NEXT:    unreachable
378 //
379 //
380 // CHECK2-LABEL: define {{[^@]+}}@__clang_call_terminate
381 // CHECK2-SAME: (i8* [[TMP0:%.*]]) #[[ATTR5:[0-9]+]] comdat {
382 // CHECK2-NEXT:    [[TMP2:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP0]]) #[[ATTR4:[0-9]+]]
383 // CHECK2-NEXT:    call void @_ZSt9terminatev() #[[ATTR6]]
384 // CHECK2-NEXT:    unreachable
385 //
386 //
387 // CHECK5-LABEL: define {{[^@]+}}@_Z23parallel_master_privatev
388 // CHECK5-SAME: () #[[ATTR0:[0-9]+]] {
389 // CHECK5-NEXT:  entry:
390 // CHECK5-NEXT:    [[A:%.*]] = alloca i32, align 4
391 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
392 // CHECK5-NEXT:    ret void
393 //
394 //
395 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined.
396 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1:[0-9]+]] {
397 // CHECK5-NEXT:  entry:
398 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
399 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
400 // CHECK5-NEXT:    [[A:%.*]] = alloca i32, align 4
401 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
402 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
403 // CHECK5-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
404 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
405 // CHECK5-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
406 // CHECK5-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
407 // CHECK5-NEXT:    br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
408 // CHECK5:       omp_if.then:
409 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[A]], align 4
410 // CHECK5-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP4]], 1
411 // CHECK5-NEXT:    store i32 [[INC]], i32* [[A]], align 4
412 // CHECK5-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
413 // CHECK5-NEXT:    br label [[OMP_IF_END]]
414 // CHECK5:       omp_if.end:
415 // CHECK5-NEXT:    ret void
416 //
417 //
418 // CHECK6-LABEL: define {{[^@]+}}@_Z23parallel_master_privatev
419 // CHECK6-SAME: () #[[ATTR0:[0-9]+]] {
420 // CHECK6-NEXT:  entry:
421 // CHECK6-NEXT:    [[A:%.*]] = alloca i32, align 4
422 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
423 // CHECK6-NEXT:    ret void
424 //
425 //
426 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined.
427 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1:[0-9]+]] {
428 // CHECK6-NEXT:  entry:
429 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
430 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
431 // CHECK6-NEXT:    [[A:%.*]] = alloca i32, align 4
432 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
433 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
434 // CHECK6-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
435 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
436 // CHECK6-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
437 // CHECK6-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
438 // CHECK6-NEXT:    br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
439 // CHECK6:       omp_if.then:
440 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[A]], align 4
441 // CHECK6-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP4]], 1
442 // CHECK6-NEXT:    store i32 [[INC]], i32* [[A]], align 4
443 // CHECK6-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
444 // CHECK6-NEXT:    br label [[OMP_IF_END]]
445 // CHECK6:       omp_if.end:
446 // CHECK6-NEXT:    ret void
447 //
448 //
449 // CHECK9-LABEL: define {{[^@]+}}@_Z23parallel_master_privatev
450 // CHECK9-SAME: () #[[ATTR0:[0-9]+]] {
451 // CHECK9-NEXT:  entry:
452 // CHECK9-NEXT:    [[A:%.*]] = alloca i32, align 4
453 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[A]])
454 // CHECK9-NEXT:    ret void
455 //
456 //
457 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined.
458 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR1:[0-9]+]] {
459 // CHECK9-NEXT:  entry:
460 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
461 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
462 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
463 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
464 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
465 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
466 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[A_ADDR]], align 8
467 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
468 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
469 // CHECK9-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
470 // CHECK9-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
471 // CHECK9-NEXT:    br i1 [[TMP4]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
472 // CHECK9:       omp_if.then:
473 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
474 // CHECK9-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP5]], 1
475 // CHECK9-NEXT:    store i32 [[INC]], i32* [[TMP0]], align 4
476 // CHECK9-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
477 // CHECK9-NEXT:    br label [[OMP_IF_END]]
478 // CHECK9:       omp_if.end:
479 // CHECK9-NEXT:    ret void
480 //
481 //
482 // CHECK10-LABEL: define {{[^@]+}}@_Z23parallel_master_privatev
483 // CHECK10-SAME: () #[[ATTR0:[0-9]+]] {
484 // CHECK10-NEXT:  entry:
485 // CHECK10-NEXT:    [[A:%.*]] = alloca i32, align 4
486 // CHECK10-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[A]])
487 // CHECK10-NEXT:    ret void
488 //
489 //
490 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined.
491 // CHECK10-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR1:[0-9]+]] {
492 // CHECK10-NEXT:  entry:
493 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
494 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
495 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
496 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
497 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
498 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
499 // CHECK10-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[A_ADDR]], align 8
500 // CHECK10-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
501 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
502 // CHECK10-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
503 // CHECK10-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
504 // CHECK10-NEXT:    br i1 [[TMP4]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
505 // CHECK10:       omp_if.then:
506 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
507 // CHECK10-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP5]], 1
508 // CHECK10-NEXT:    store i32 [[INC]], i32* [[TMP0]], align 4
509 // CHECK10-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
510 // CHECK10-NEXT:    br label [[OMP_IF_END]]
511 // CHECK10:       omp_if.end:
512 // CHECK10-NEXT:    ret void
513 //
514 //
515 // CHECK13-LABEL: define {{[^@]+}}@_Z36parallel_master_default_firstprivatev
516 // CHECK13-SAME: () #[[ATTR0:[0-9]+]] {
517 // CHECK13-NEXT:  entry:
518 // CHECK13-NEXT:    [[A:%.*]] = alloca i32, align 4
519 // CHECK13-NEXT:    [[A_CASTED:%.*]] = alloca i64, align 8
520 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
521 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[A_CASTED]] to i32*
522 // CHECK13-NEXT:    store i32 [[TMP0]], i32* [[CONV]], align 4
523 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[A_CASTED]], align 8
524 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i64 [[TMP1]])
525 // CHECK13-NEXT:    ret void
526 //
527 //
528 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined.
529 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1:[0-9]+]] {
530 // CHECK13-NEXT:  entry:
531 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
532 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
533 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i64, align 8
534 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
535 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
536 // CHECK13-NEXT:    store i64 [[A]], i64* [[A_ADDR]], align 8
537 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
538 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
539 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
540 // CHECK13-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
541 // CHECK13-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
542 // CHECK13-NEXT:    br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
543 // CHECK13:       omp_if.then:
544 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[CONV]], align 4
545 // CHECK13-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP4]], 1
546 // CHECK13-NEXT:    store i32 [[INC]], i32* [[CONV]], align 4
547 // CHECK13-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
548 // CHECK13-NEXT:    br label [[OMP_IF_END]]
549 // CHECK13:       omp_if.end:
550 // CHECK13-NEXT:    ret void
551 //
552 //
553 // CHECK14-LABEL: define {{[^@]+}}@_Z36parallel_master_default_firstprivatev
554 // CHECK14-SAME: () #[[ATTR0:[0-9]+]] {
555 // CHECK14-NEXT:  entry:
556 // CHECK14-NEXT:    [[A:%.*]] = alloca i32, align 4
557 // CHECK14-NEXT:    [[A_CASTED:%.*]] = alloca i64, align 8
558 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
559 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[A_CASTED]] to i32*
560 // CHECK14-NEXT:    store i32 [[TMP0]], i32* [[CONV]], align 4
561 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[A_CASTED]], align 8
562 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i64 [[TMP1]])
563 // CHECK14-NEXT:    ret void
564 //
565 //
566 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined.
567 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1:[0-9]+]] {
568 // CHECK14-NEXT:  entry:
569 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
570 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
571 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i64, align 8
572 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
573 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
574 // CHECK14-NEXT:    store i64 [[A]], i64* [[A_ADDR]], align 8
575 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
576 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
577 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
578 // CHECK14-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
579 // CHECK14-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
580 // CHECK14-NEXT:    br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
581 // CHECK14:       omp_if.then:
582 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[CONV]], align 4
583 // CHECK14-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP4]], 1
584 // CHECK14-NEXT:    store i32 [[INC]], i32* [[CONV]], align 4
585 // CHECK14-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
586 // CHECK14-NEXT:    br label [[OMP_IF_END]]
587 // CHECK14:       omp_if.end:
588 // CHECK14-NEXT:    ret void
589 //
590 //
591 // CHECK17-LABEL: define {{[^@]+}}@_Z36parallel_master_default_firstprivatev
592 // CHECK17-SAME: () #[[ATTR0:[0-9]+]] {
593 // CHECK17-NEXT:  entry:
594 // CHECK17-NEXT:    [[A:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
595 // CHECK17-NEXT:    [[Y_CASTED:%.*]] = alloca i64, align 8
596 // CHECK17-NEXT:    [[Y_CASTED1:%.*]] = alloca i64, align 8
597 // CHECK17-NEXT:    call void @_ZN2StC1Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[A]])
598 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32, i32* @_ZZ36parallel_master_default_firstprivatevE1y, align 4
599 // CHECK17-NEXT:    [[CONV:%.*]] = bitcast i64* [[Y_CASTED]] to i32*
600 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[CONV]], align 4
601 // CHECK17-NEXT:    [[TMP1:%.*]] = load i64, i64* [[Y_CASTED]], align 8
602 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* @_ZN2St1yE, align 4
603 // CHECK17-NEXT:    [[CONV2:%.*]] = bitcast i64* [[Y_CASTED1]] to i32*
604 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[CONV2]], align 4
605 // CHECK17-NEXT:    [[TMP3:%.*]] = load i64, i64* [[Y_CASTED1]], align 8
606 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.St*, i64, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.St* [[A]], i64 [[TMP1]], i64 [[TMP3]])
607 // CHECK17-NEXT:    call void @_ZN2StD1Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[A]]) #[[ATTR4:[0-9]+]]
608 // CHECK17-NEXT:    ret void
609 //
610 //
611 // CHECK17-LABEL: define {{[^@]+}}@_ZN2StC1Ev
612 // CHECK17-SAME: (%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
613 // CHECK17-NEXT:  entry:
614 // CHECK17-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
615 // CHECK17-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
616 // CHECK17-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
617 // CHECK17-NEXT:    call void @_ZN2StC2Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS1]])
618 // CHECK17-NEXT:    ret void
619 //
620 //
621 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined.
622 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.St* noundef nonnull align 4 dereferenceable(8) [[A:%.*]], i64 noundef [[Y:%.*]], i64 noundef [[Y1:%.*]]) #[[ATTR2:[0-9]+]] {
623 // CHECK17-NEXT:  entry:
624 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
625 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
626 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca %struct.St*, align 8
627 // CHECK17-NEXT:    [[Y_ADDR:%.*]] = alloca i64, align 8
628 // CHECK17-NEXT:    [[Y_ADDR2:%.*]] = alloca i64, align 8
629 // CHECK17-NEXT:    [[A4:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
630 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
631 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
632 // CHECK17-NEXT:    store %struct.St* [[A]], %struct.St** [[A_ADDR]], align 8
633 // CHECK17-NEXT:    store i64 [[Y]], i64* [[Y_ADDR]], align 8
634 // CHECK17-NEXT:    store i64 [[Y1]], i64* [[Y_ADDR2]], align 8
635 // CHECK17-NEXT:    [[TMP0:%.*]] = load %struct.St*, %struct.St** [[A_ADDR]], align 8
636 // CHECK17-NEXT:    [[CONV:%.*]] = bitcast i64* [[Y_ADDR]] to i32*
637 // CHECK17-NEXT:    [[CONV3:%.*]] = bitcast i64* [[Y_ADDR2]] to i32*
638 // CHECK17-NEXT:    [[TMP1:%.*]] = bitcast %struct.St* [[A4]] to i8*
639 // CHECK17-NEXT:    [[TMP2:%.*]] = bitcast %struct.St* [[TMP0]] to i8*
640 // CHECK17-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[TMP1]], i8* align 4 [[TMP2]], i64 8, i1 false)
641 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
642 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
643 // CHECK17-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
644 // CHECK17-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
645 // CHECK17-NEXT:    br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
646 // CHECK17:       omp_if.then:
647 // CHECK17-NEXT:    [[A5:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[A4]], i32 0, i32 0
648 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[A5]], align 4
649 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP7]], 1
650 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[A5]], align 4
651 // CHECK17-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[A4]], i32 0, i32 1
652 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[B]], align 4
653 // CHECK17-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP8]], 1
654 // CHECK17-NEXT:    store i32 [[ADD6]], i32* [[B]], align 4
655 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[CONV]], align 4
656 // CHECK17-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP9]], 1
657 // CHECK17-NEXT:    store i32 [[INC]], i32* [[CONV]], align 4
658 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* @_ZN2St1yE, align 4
659 // CHECK17-NEXT:    [[INC7:%.*]] = add nsw i32 [[TMP10]], 1
660 // CHECK17-NEXT:    store i32 [[INC7]], i32* @_ZN2St1yE, align 4
661 // CHECK17-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
662 // CHECK17-NEXT:    br label [[OMP_IF_END]]
663 // CHECK17:       omp_if.end:
664 // CHECK17-NEXT:    call void @_ZN2StD1Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[A4]]) #[[ATTR4]]
665 // CHECK17-NEXT:    ret void
666 //
667 //
668 // CHECK17-LABEL: define {{[^@]+}}@_ZN2StD1Ev
669 // CHECK17-SAME: (%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR5:[0-9]+]] comdat align 2 {
670 // CHECK17-NEXT:  entry:
671 // CHECK17-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
672 // CHECK17-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
673 // CHECK17-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
674 // CHECK17-NEXT:    call void @_ZN2StD2Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR4]]
675 // CHECK17-NEXT:    ret void
676 //
677 //
678 // CHECK17-LABEL: define {{[^@]+}}@_ZN2StC2Ev
679 // CHECK17-SAME: (%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR5]] comdat align 2 {
680 // CHECK17-NEXT:  entry:
681 // CHECK17-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
682 // CHECK17-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
683 // CHECK17-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
684 // CHECK17-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.St* [[THIS1]], i32 0, i32 0
685 // CHECK17-NEXT:    store i32 0, i32* [[A]], align 4
686 // CHECK17-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[THIS1]], i32 0, i32 1
687 // CHECK17-NEXT:    store i32 0, i32* [[B]], align 4
688 // CHECK17-NEXT:    ret void
689 //
690 //
691 // CHECK17-LABEL: define {{[^@]+}}@_ZN2StD2Ev
692 // CHECK17-SAME: (%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR5]] comdat align 2 {
693 // CHECK17-NEXT:  entry:
694 // CHECK17-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
695 // CHECK17-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
696 // CHECK17-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
697 // CHECK17-NEXT:    ret void
698 //
699 //
700 // CHECK18-LABEL: define {{[^@]+}}@_Z36parallel_master_default_firstprivatev
701 // CHECK18-SAME: () #[[ATTR0:[0-9]+]] {
702 // CHECK18-NEXT:  entry:
703 // CHECK18-NEXT:    [[A:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
704 // CHECK18-NEXT:    [[Y_CASTED:%.*]] = alloca i64, align 8
705 // CHECK18-NEXT:    [[Y_CASTED1:%.*]] = alloca i64, align 8
706 // CHECK18-NEXT:    call void @_ZN2StC1Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[A]])
707 // CHECK18-NEXT:    [[TMP0:%.*]] = load i32, i32* @_ZZ36parallel_master_default_firstprivatevE1y, align 4
708 // CHECK18-NEXT:    [[CONV:%.*]] = bitcast i64* [[Y_CASTED]] to i32*
709 // CHECK18-NEXT:    store i32 [[TMP0]], i32* [[CONV]], align 4
710 // CHECK18-NEXT:    [[TMP1:%.*]] = load i64, i64* [[Y_CASTED]], align 8
711 // CHECK18-NEXT:    [[TMP2:%.*]] = load i32, i32* @_ZN2St1yE, align 4
712 // CHECK18-NEXT:    [[CONV2:%.*]] = bitcast i64* [[Y_CASTED1]] to i32*
713 // CHECK18-NEXT:    store i32 [[TMP2]], i32* [[CONV2]], align 4
714 // CHECK18-NEXT:    [[TMP3:%.*]] = load i64, i64* [[Y_CASTED1]], align 8
715 // CHECK18-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.St*, i64, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.St* [[A]], i64 [[TMP1]], i64 [[TMP3]])
716 // CHECK18-NEXT:    call void @_ZN2StD1Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[A]]) #[[ATTR4:[0-9]+]]
717 // CHECK18-NEXT:    ret void
718 //
719 //
720 // CHECK18-LABEL: define {{[^@]+}}@_ZN2StC1Ev
721 // CHECK18-SAME: (%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
722 // CHECK18-NEXT:  entry:
723 // CHECK18-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
724 // CHECK18-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
725 // CHECK18-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
726 // CHECK18-NEXT:    call void @_ZN2StC2Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS1]])
727 // CHECK18-NEXT:    ret void
728 //
729 //
730 // CHECK18-LABEL: define {{[^@]+}}@.omp_outlined.
731 // CHECK18-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.St* noundef nonnull align 4 dereferenceable(8) [[A:%.*]], i64 noundef [[Y:%.*]], i64 noundef [[Y1:%.*]]) #[[ATTR2:[0-9]+]] {
732 // CHECK18-NEXT:  entry:
733 // CHECK18-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
734 // CHECK18-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
735 // CHECK18-NEXT:    [[A_ADDR:%.*]] = alloca %struct.St*, align 8
736 // CHECK18-NEXT:    [[Y_ADDR:%.*]] = alloca i64, align 8
737 // CHECK18-NEXT:    [[Y_ADDR2:%.*]] = alloca i64, align 8
738 // CHECK18-NEXT:    [[A4:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
739 // CHECK18-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
740 // CHECK18-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
741 // CHECK18-NEXT:    store %struct.St* [[A]], %struct.St** [[A_ADDR]], align 8
742 // CHECK18-NEXT:    store i64 [[Y]], i64* [[Y_ADDR]], align 8
743 // CHECK18-NEXT:    store i64 [[Y1]], i64* [[Y_ADDR2]], align 8
744 // CHECK18-NEXT:    [[TMP0:%.*]] = load %struct.St*, %struct.St** [[A_ADDR]], align 8
745 // CHECK18-NEXT:    [[CONV:%.*]] = bitcast i64* [[Y_ADDR]] to i32*
746 // CHECK18-NEXT:    [[CONV3:%.*]] = bitcast i64* [[Y_ADDR2]] to i32*
747 // CHECK18-NEXT:    [[TMP1:%.*]] = bitcast %struct.St* [[A4]] to i8*
748 // CHECK18-NEXT:    [[TMP2:%.*]] = bitcast %struct.St* [[TMP0]] to i8*
749 // CHECK18-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[TMP1]], i8* align 4 [[TMP2]], i64 8, i1 false)
750 // CHECK18-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
751 // CHECK18-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
752 // CHECK18-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
753 // CHECK18-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
754 // CHECK18-NEXT:    br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
755 // CHECK18:       omp_if.then:
756 // CHECK18-NEXT:    [[A5:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[A4]], i32 0, i32 0
757 // CHECK18-NEXT:    [[TMP7:%.*]] = load i32, i32* [[A5]], align 4
758 // CHECK18-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP7]], 1
759 // CHECK18-NEXT:    store i32 [[ADD]], i32* [[A5]], align 4
760 // CHECK18-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[A4]], i32 0, i32 1
761 // CHECK18-NEXT:    [[TMP8:%.*]] = load i32, i32* [[B]], align 4
762 // CHECK18-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP8]], 1
763 // CHECK18-NEXT:    store i32 [[ADD6]], i32* [[B]], align 4
764 // CHECK18-NEXT:    [[TMP9:%.*]] = load i32, i32* [[CONV]], align 4
765 // CHECK18-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP9]], 1
766 // CHECK18-NEXT:    store i32 [[INC]], i32* [[CONV]], align 4
767 // CHECK18-NEXT:    [[TMP10:%.*]] = load i32, i32* @_ZN2St1yE, align 4
768 // CHECK18-NEXT:    [[INC7:%.*]] = add nsw i32 [[TMP10]], 1
769 // CHECK18-NEXT:    store i32 [[INC7]], i32* @_ZN2St1yE, align 4
770 // CHECK18-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
771 // CHECK18-NEXT:    br label [[OMP_IF_END]]
772 // CHECK18:       omp_if.end:
773 // CHECK18-NEXT:    call void @_ZN2StD1Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[A4]]) #[[ATTR4]]
774 // CHECK18-NEXT:    ret void
775 //
776 //
777 // CHECK18-LABEL: define {{[^@]+}}@_ZN2StD1Ev
778 // CHECK18-SAME: (%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR5:[0-9]+]] comdat align 2 {
779 // CHECK18-NEXT:  entry:
780 // CHECK18-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
781 // CHECK18-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
782 // CHECK18-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
783 // CHECK18-NEXT:    call void @_ZN2StD2Ev(%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR4]]
784 // CHECK18-NEXT:    ret void
785 //
786 //
787 // CHECK18-LABEL: define {{[^@]+}}@_ZN2StC2Ev
788 // CHECK18-SAME: (%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR5]] comdat align 2 {
789 // CHECK18-NEXT:  entry:
790 // CHECK18-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
791 // CHECK18-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
792 // CHECK18-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
793 // CHECK18-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.St* [[THIS1]], i32 0, i32 0
794 // CHECK18-NEXT:    store i32 0, i32* [[A]], align 4
795 // CHECK18-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[THIS1]], i32 0, i32 1
796 // CHECK18-NEXT:    store i32 0, i32* [[B]], align 4
797 // CHECK18-NEXT:    ret void
798 //
799 //
800 // CHECK18-LABEL: define {{[^@]+}}@_ZN2StD2Ev
801 // CHECK18-SAME: (%struct.St* noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR5]] comdat align 2 {
802 // CHECK18-NEXT:  entry:
803 // CHECK18-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
804 // CHECK18-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
805 // CHECK18-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
806 // CHECK18-NEXT:    ret void
807 //
808 //
809 // CHECK21-LABEL: define {{[^@]+}}@_Z28parallel_master_firstprivatev
810 // CHECK21-SAME: () #[[ATTR0:[0-9]+]] {
811 // CHECK21-NEXT:  entry:
812 // CHECK21-NEXT:    [[A:%.*]] = alloca i32, align 4
813 // CHECK21-NEXT:    [[A_CASTED:%.*]] = alloca i64, align 8
814 // CHECK21-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
815 // CHECK21-NEXT:    [[CONV:%.*]] = bitcast i64* [[A_CASTED]] to i32*
816 // CHECK21-NEXT:    store i32 [[TMP0]], i32* [[CONV]], align 4
817 // CHECK21-NEXT:    [[TMP1:%.*]] = load i64, i64* [[A_CASTED]], align 8
818 // CHECK21-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i64 [[TMP1]])
819 // CHECK21-NEXT:    ret void
820 //
821 //
822 // CHECK21-LABEL: define {{[^@]+}}@.omp_outlined.
823 // CHECK21-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1:[0-9]+]] {
824 // CHECK21-NEXT:  entry:
825 // CHECK21-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
826 // CHECK21-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
827 // CHECK21-NEXT:    [[A_ADDR:%.*]] = alloca i64, align 8
828 // CHECK21-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
829 // CHECK21-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
830 // CHECK21-NEXT:    store i64 [[A]], i64* [[A_ADDR]], align 8
831 // CHECK21-NEXT:    [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
832 // CHECK21-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
833 // CHECK21-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
834 // CHECK21-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
835 // CHECK21-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
836 // CHECK21-NEXT:    br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
837 // CHECK21:       omp_if.then:
838 // CHECK21-NEXT:    [[TMP4:%.*]] = load i32, i32* [[CONV]], align 4
839 // CHECK21-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP4]], 1
840 // CHECK21-NEXT:    store i32 [[INC]], i32* [[CONV]], align 4
841 // CHECK21-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
842 // CHECK21-NEXT:    br label [[OMP_IF_END]]
843 // CHECK21:       omp_if.end:
844 // CHECK21-NEXT:    ret void
845 //
846 //
847 // CHECK22-LABEL: define {{[^@]+}}@_Z28parallel_master_firstprivatev
848 // CHECK22-SAME: () #[[ATTR0:[0-9]+]] {
849 // CHECK22-NEXT:  entry:
850 // CHECK22-NEXT:    [[A:%.*]] = alloca i32, align 4
851 // CHECK22-NEXT:    [[A_CASTED:%.*]] = alloca i64, align 8
852 // CHECK22-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
853 // CHECK22-NEXT:    [[CONV:%.*]] = bitcast i64* [[A_CASTED]] to i32*
854 // CHECK22-NEXT:    store i32 [[TMP0]], i32* [[CONV]], align 4
855 // CHECK22-NEXT:    [[TMP1:%.*]] = load i64, i64* [[A_CASTED]], align 8
856 // CHECK22-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i64 [[TMP1]])
857 // CHECK22-NEXT:    ret void
858 //
859 //
860 // CHECK22-LABEL: define {{[^@]+}}@.omp_outlined.
861 // CHECK22-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1:[0-9]+]] {
862 // CHECK22-NEXT:  entry:
863 // CHECK22-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
864 // CHECK22-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
865 // CHECK22-NEXT:    [[A_ADDR:%.*]] = alloca i64, align 8
866 // CHECK22-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
867 // CHECK22-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
868 // CHECK22-NEXT:    store i64 [[A]], i64* [[A_ADDR]], align 8
869 // CHECK22-NEXT:    [[CONV:%.*]] = bitcast i64* [[A_ADDR]] to i32*
870 // CHECK22-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
871 // CHECK22-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
872 // CHECK22-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
873 // CHECK22-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
874 // CHECK22-NEXT:    br i1 [[TMP3]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
875 // CHECK22:       omp_if.then:
876 // CHECK22-NEXT:    [[TMP4:%.*]] = load i32, i32* [[CONV]], align 4
877 // CHECK22-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP4]], 1
878 // CHECK22-NEXT:    store i32 [[INC]], i32* [[CONV]], align 4
879 // CHECK22-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
880 // CHECK22-NEXT:    br label [[OMP_IF_END]]
881 // CHECK22:       omp_if.end:
882 // CHECK22-NEXT:    ret void
883 //
884 //
885 // CHECK25-LABEL: define {{[^@]+}}@_Z22parallel_master_copyinv
886 // CHECK25-SAME: () #[[ATTR0:[0-9]+]] {
887 // CHECK25-NEXT:  entry:
888 // CHECK25-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
889 // CHECK25-NEXT:    ret void
890 //
891 //
892 // CHECK25-LABEL: define {{[^@]+}}@.omp_outlined.
893 // CHECK25-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1:[0-9]+]] {
894 // CHECK25-NEXT:  entry:
895 // CHECK25-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
896 // CHECK25-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
897 // CHECK25-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
898 // CHECK25-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
899 // CHECK25-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
900 // CHECK25-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
901 // CHECK25-NEXT:    [[TMP2:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i8* bitcast (i32* @a to i8*), i64 4, i8*** @a.cache.)
902 // CHECK25-NEXT:    [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32*
903 // CHECK25-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[TMP3]] to i64
904 // CHECK25-NEXT:    [[TMP5:%.*]] = icmp ne i64 ptrtoint (i32* @a to i64), [[TMP4]]
905 // CHECK25-NEXT:    br i1 [[TMP5]], label [[COPYIN_NOT_MASTER:%.*]], label [[COPYIN_NOT_MASTER_END:%.*]]
906 // CHECK25:       copyin.not.master:
907 // CHECK25-NEXT:    [[TMP6:%.*]] = load i32, i32* @a, align 4
908 // CHECK25-NEXT:    store i32 [[TMP6]], i32* [[TMP3]], align 4
909 // CHECK25-NEXT:    br label [[COPYIN_NOT_MASTER_END]]
910 // CHECK25:       copyin.not.master.end:
911 // CHECK25-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP1]])
912 // CHECK25-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
913 // CHECK25-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
914 // CHECK25-NEXT:    br i1 [[TMP8]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
915 // CHECK25:       omp_if.then:
916 // CHECK25-NEXT:    [[TMP9:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i8* bitcast (i32* @a to i8*), i64 4, i8*** @a.cache.)
917 // CHECK25-NEXT:    [[TMP10:%.*]] = bitcast i8* [[TMP9]] to i32*
918 // CHECK25-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
919 // CHECK25-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP11]], 1
920 // CHECK25-NEXT:    store i32 [[INC]], i32* [[TMP10]], align 4
921 // CHECK25-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
922 // CHECK25-NEXT:    br label [[OMP_IF_END]]
923 // CHECK25:       omp_if.end:
924 // CHECK25-NEXT:    ret void
925 //
926 //
927 // CHECK26-LABEL: define {{[^@]+}}@_Z22parallel_master_copyinv
928 // CHECK26-SAME: () #[[ATTR0:[0-9]+]] {
929 // CHECK26-NEXT:  entry:
930 // CHECK26-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
931 // CHECK26-NEXT:    ret void
932 //
933 //
934 // CHECK26-LABEL: define {{[^@]+}}@.omp_outlined.
935 // CHECK26-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1:[0-9]+]] {
936 // CHECK26-NEXT:  entry:
937 // CHECK26-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
938 // CHECK26-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
939 // CHECK26-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
940 // CHECK26-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
941 // CHECK26-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
942 // CHECK26-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
943 // CHECK26-NEXT:    [[TMP2:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i8* bitcast (i32* @a to i8*), i64 4, i8*** @a.cache.)
944 // CHECK26-NEXT:    [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32*
945 // CHECK26-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[TMP3]] to i64
946 // CHECK26-NEXT:    [[TMP5:%.*]] = icmp ne i64 ptrtoint (i32* @a to i64), [[TMP4]]
947 // CHECK26-NEXT:    br i1 [[TMP5]], label [[COPYIN_NOT_MASTER:%.*]], label [[COPYIN_NOT_MASTER_END:%.*]]
948 // CHECK26:       copyin.not.master:
949 // CHECK26-NEXT:    [[TMP6:%.*]] = load i32, i32* @a, align 4
950 // CHECK26-NEXT:    store i32 [[TMP6]], i32* [[TMP3]], align 4
951 // CHECK26-NEXT:    br label [[COPYIN_NOT_MASTER_END]]
952 // CHECK26:       copyin.not.master.end:
953 // CHECK26-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP1]])
954 // CHECK26-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
955 // CHECK26-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
956 // CHECK26-NEXT:    br i1 [[TMP8]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
957 // CHECK26:       omp_if.then:
958 // CHECK26-NEXT:    [[TMP9:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i8* bitcast (i32* @a to i8*), i64 4, i8*** @a.cache.)
959 // CHECK26-NEXT:    [[TMP10:%.*]] = bitcast i8* [[TMP9]] to i32*
960 // CHECK26-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
961 // CHECK26-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP11]], 1
962 // CHECK26-NEXT:    store i32 [[INC]], i32* [[TMP10]], align 4
963 // CHECK26-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]])
964 // CHECK26-NEXT:    br label [[OMP_IF_END]]
965 // CHECK26:       omp_if.end:
966 // CHECK26-NEXT:    ret void
967 //
968 //
969 // CHECK29-LABEL: define {{[^@]+}}@_Z22parallel_master_copyinv
970 // CHECK29-SAME: () #[[ATTR0:[0-9]+]] {
971 // CHECK29-NEXT:  entry:
972 // CHECK29-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* @a)
973 // CHECK29-NEXT:    ret void
974 //
975 //
976 // CHECK29-LABEL: define {{[^@]+}}@.omp_outlined.
977 // CHECK29-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR1:[0-9]+]] {
978 // CHECK29-NEXT:  entry:
979 // CHECK29-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
980 // CHECK29-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
981 // CHECK29-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
982 // CHECK29-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
983 // CHECK29-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
984 // CHECK29-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
985 // CHECK29-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[A_ADDR]], align 8
986 // CHECK29-NEXT:    [[TMP1:%.*]] = ptrtoint i32* [[TMP0]] to i64
987 // CHECK29-NEXT:    [[TMP2:%.*]] = icmp ne i64 [[TMP1]], ptrtoint (i32* @a to i64)
988 // CHECK29-NEXT:    br i1 [[TMP2]], label [[COPYIN_NOT_MASTER:%.*]], label [[COPYIN_NOT_MASTER_END:%.*]]
989 // CHECK29:       copyin.not.master:
990 // CHECK29-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
991 // CHECK29-NEXT:    store i32 [[TMP3]], i32* @a, align 4
992 // CHECK29-NEXT:    br label [[COPYIN_NOT_MASTER_END]]
993 // CHECK29:       copyin.not.master.end:
994 // CHECK29-NEXT:    [[TMP4:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
995 // CHECK29-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP4]], align 4
996 // CHECK29-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP5]])
997 // CHECK29-NEXT:    [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
998 // CHECK29-NEXT:    [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
999 // CHECK29-NEXT:    [[TMP8:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[TMP7]])
1000 // CHECK29-NEXT:    [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0
1001 // CHECK29-NEXT:    br i1 [[TMP9]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
1002 // CHECK29:       omp_if.then:
1003 // CHECK29-NEXT:    [[TMP10:%.*]] = load i32, i32* @a, align 4
1004 // CHECK29-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP10]], 1
1005 // CHECK29-NEXT:    store i32 [[INC]], i32* @a, align 4
1006 // CHECK29-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[TMP7]])
1007 // CHECK29-NEXT:    br label [[OMP_IF_END]]
1008 // CHECK29:       omp_if.end:
1009 // CHECK29-NEXT:    ret void
1010 //
1011 //
1012 // CHECK29-LABEL: define {{[^@]+}}@_ZTW1a
1013 // CHECK29-SAME: () #[[ATTR4:[0-9]+]] comdat {
1014 // CHECK29-NEXT:    ret i32* @a
1015 //
1016