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 -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 -DCK1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
10 // RUN: %clang_cc1 -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 -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 -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 -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 -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 -DCK2 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
32 // RUN: %clang_cc1 -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 -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 -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 -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 -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 -DCK3 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
53 // RUN: %clang_cc1 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -DCK4 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
137 // RUN: %clang_cc1 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -DCK5 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK29
165 // RUN: %clang_cc1 -DCK5 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s
166 
167 // RUN: %clang_cc1 -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 -DCK6 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s
190 
191 // RUN: %clang_cc1 -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 -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 -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 -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 -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 -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 -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:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
300 // CHECK1-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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
301 // CHECK1-NEXT:    ret void
302 //
303 //
304 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
305 // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR3:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
306 // CHECK1-NEXT:  entry:
307 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
308 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
309 // CHECK1-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
310 // CHECK1-NEXT:    [[EXN_SLOT:%.*]] = alloca i8*, align 8
311 // CHECK1-NEXT:    [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
312 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
313 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
314 // CHECK1-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
315 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
316 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
317 // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
318 // CHECK1-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
319 // CHECK1-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
320 // CHECK1-NEXT:    br i1 [[TMP4]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
321 // CHECK1:       omp_if.then:
322 // CHECK1-NEXT:    invoke void @_Z3foov()
323 // CHECK1-NEXT:    to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
324 // CHECK1:       invoke.cont:
325 // CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
326 // CHECK1-NEXT:    br label [[OMP_IF_END]]
327 // CHECK1:       lpad:
328 // CHECK1-NEXT:    [[TMP5:%.*]] = landingpad { i8*, i32 }
329 // CHECK1-NEXT:    catch i8* null
330 // CHECK1-NEXT:    [[TMP6:%.*]] = extractvalue { i8*, i32 } [[TMP5]], 0
331 // CHECK1-NEXT:    store i8* [[TMP6]], i8** [[EXN_SLOT]], align 8
332 // CHECK1-NEXT:    [[TMP7:%.*]] = extractvalue { i8*, i32 } [[TMP5]], 1
333 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[EHSELECTOR_SLOT]], align 4
334 // CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
335 // CHECK1-NEXT:    br label [[TERMINATE_HANDLER:%.*]]
336 // CHECK1:       omp_if.end:
337 // CHECK1-NEXT:    ret void
338 // CHECK1:       terminate.handler:
339 // CHECK1-NEXT:    [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
340 // CHECK1-NEXT:    call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR6:[0-9]+]]
341 // CHECK1-NEXT:    unreachable
342 //
343 //
344 // CHECK1-LABEL: define {{[^@]+}}@__clang_call_terminate
345 // CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR5:[0-9]+]] comdat {
346 // CHECK1-NEXT:    [[TMP2:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP0]]) #[[ATTR4:[0-9]+]]
347 // CHECK1-NEXT:    call void @_ZSt9terminatev() #[[ATTR6]]
348 // CHECK1-NEXT:    unreachable
349 //
350 //
351 // CHECK2-LABEL: define {{[^@]+}}@_Z3foov
352 // CHECK2-SAME: () #[[ATTR0:[0-9]+]] {
353 // CHECK2-NEXT:  entry:
354 // CHECK2-NEXT:    call void @_Z8mayThrowv()
355 // CHECK2-NEXT:    ret void
356 //
357 //
358 // CHECK2-LABEL: define {{[^@]+}}@_Z15parallel_masterv
359 // CHECK2-SAME: () #[[ATTR2:[0-9]+]] {
360 // CHECK2-NEXT:  entry:
361 // CHECK2-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
362 // CHECK2-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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
363 // CHECK2-NEXT:    ret void
364 //
365 //
366 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
367 // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR3:[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
368 // CHECK2-NEXT:  entry:
369 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
370 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
371 // CHECK2-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
372 // CHECK2-NEXT:    [[EXN_SLOT:%.*]] = alloca i8*, align 8
373 // CHECK2-NEXT:    [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4
374 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
375 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
376 // CHECK2-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
377 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
378 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
379 // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
380 // CHECK2-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
381 // CHECK2-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
382 // CHECK2-NEXT:    br i1 [[TMP4]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
383 // CHECK2:       omp_if.then:
384 // CHECK2-NEXT:    invoke void @_Z3foov()
385 // CHECK2-NEXT:    to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
386 // CHECK2:       invoke.cont:
387 // CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
388 // CHECK2-NEXT:    br label [[OMP_IF_END]]
389 // CHECK2:       lpad:
390 // CHECK2-NEXT:    [[TMP5:%.*]] = landingpad { i8*, i32 }
391 // CHECK2-NEXT:    catch i8* null
392 // CHECK2-NEXT:    [[TMP6:%.*]] = extractvalue { i8*, i32 } [[TMP5]], 0
393 // CHECK2-NEXT:    store i8* [[TMP6]], i8** [[EXN_SLOT]], align 8
394 // CHECK2-NEXT:    [[TMP7:%.*]] = extractvalue { i8*, i32 } [[TMP5]], 1
395 // CHECK2-NEXT:    store i32 [[TMP7]], i32* [[EHSELECTOR_SLOT]], align 4
396 // CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
397 // CHECK2-NEXT:    br label [[TERMINATE_HANDLER:%.*]]
398 // CHECK2:       omp_if.end:
399 // CHECK2-NEXT:    ret void
400 // CHECK2:       terminate.handler:
401 // CHECK2-NEXT:    [[EXN:%.*]] = load i8*, i8** [[EXN_SLOT]], align 8
402 // CHECK2-NEXT:    call void @__clang_call_terminate(i8* [[EXN]]) #[[ATTR6:[0-9]+]]
403 // CHECK2-NEXT:    unreachable
404 //
405 //
406 // CHECK2-LABEL: define {{[^@]+}}@__clang_call_terminate
407 // CHECK2-SAME: (i8* [[TMP0:%.*]]) #[[ATTR5:[0-9]+]] comdat {
408 // CHECK2-NEXT:    [[TMP2:%.*]] = call i8* @__cxa_begin_catch(i8* [[TMP0]]) #[[ATTR4:[0-9]+]]
409 // CHECK2-NEXT:    call void @_ZSt9terminatev() #[[ATTR6]]
410 // CHECK2-NEXT:    unreachable
411 //
412 //
413 // CHECK5-LABEL: define {{[^@]+}}@_Z23parallel_master_privatev
414 // CHECK5-SAME: () #[[ATTR0:[0-9]+]] {
415 // CHECK5-NEXT:  entry:
416 // CHECK5-NEXT:    [[A:%.*]] = alloca i32, align 4
417 // CHECK5-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
418 // CHECK5-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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
419 // CHECK5-NEXT:    ret void
420 //
421 //
422 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined.
423 // CHECK5-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
424 // CHECK5-NEXT:  entry:
425 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
426 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
427 // CHECK5-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
428 // CHECK5-NEXT:    [[A:%.*]] = alloca i32, align 4
429 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
430 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
431 // CHECK5-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
432 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
433 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
434 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
435 // CHECK5-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
436 // CHECK5-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
437 // CHECK5-NEXT:    br i1 [[TMP4]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
438 // CHECK5:       omp_if.then:
439 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, i32* [[A]], align 4
440 // CHECK5-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP5]], 1
441 // CHECK5-NEXT:    store i32 [[INC]], i32* [[A]], align 4
442 // CHECK5-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
443 // CHECK5-NEXT:    br label [[OMP_IF_END]]
444 // CHECK5:       omp_if.end:
445 // CHECK5-NEXT:    ret void
446 //
447 //
448 // CHECK6-LABEL: define {{[^@]+}}@_Z23parallel_master_privatev
449 // CHECK6-SAME: () #[[ATTR0:[0-9]+]] {
450 // CHECK6-NEXT:  entry:
451 // CHECK6-NEXT:    [[A:%.*]] = alloca i32, align 4
452 // CHECK6-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
453 // CHECK6-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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
454 // CHECK6-NEXT:    ret void
455 //
456 //
457 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined.
458 // CHECK6-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
459 // CHECK6-NEXT:  entry:
460 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
461 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
462 // CHECK6-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
463 // CHECK6-NEXT:    [[A:%.*]] = alloca i32, align 4
464 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
465 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
466 // CHECK6-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
467 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
468 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
469 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
470 // CHECK6-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
471 // CHECK6-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
472 // CHECK6-NEXT:    br i1 [[TMP4]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
473 // CHECK6:       omp_if.then:
474 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32, i32* [[A]], align 4
475 // CHECK6-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP5]], 1
476 // CHECK6-NEXT:    store i32 [[INC]], i32* [[A]], align 4
477 // CHECK6-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
478 // CHECK6-NEXT:    br label [[OMP_IF_END]]
479 // CHECK6:       omp_if.end:
480 // CHECK6-NEXT:    ret void
481 //
482 //
483 // CHECK9-LABEL: define {{[^@]+}}@_Z23parallel_master_privatev
484 // CHECK9-SAME: () #[[ATTR0:[0-9]+]] {
485 // CHECK9-NEXT:  entry:
486 // CHECK9-NEXT:    [[A:%.*]] = alloca i32, align 4
487 // CHECK9-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8
488 // CHECK9-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 0
489 // CHECK9-NEXT:    store i32* [[A]], i32** [[TMP0]], align 8
490 // 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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
491 // CHECK9-NEXT:    ret void
492 //
493 //
494 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined.
495 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
496 // CHECK9-NEXT:  entry:
497 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
498 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
499 // CHECK9-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
500 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
501 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
502 // CHECK9-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
503 // CHECK9-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
504 // CHECK9-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP0]], i32 0, i32 0
505 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[TMP1]], align 8
506 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
507 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
508 // CHECK9-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
509 // CHECK9-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
510 // CHECK9-NEXT:    br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
511 // CHECK9:       omp_if.then:
512 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[TMP2]], align 4
513 // CHECK9-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP7]], 1
514 // CHECK9-NEXT:    store i32 [[INC]], i32* [[TMP2]], align 4
515 // CHECK9-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
516 // CHECK9-NEXT:    br label [[OMP_IF_END]]
517 // CHECK9:       omp_if.end:
518 // CHECK9-NEXT:    ret void
519 //
520 //
521 // CHECK10-LABEL: define {{[^@]+}}@_Z23parallel_master_privatev
522 // CHECK10-SAME: () #[[ATTR0:[0-9]+]] {
523 // CHECK10-NEXT:  entry:
524 // CHECK10-NEXT:    [[A:%.*]] = alloca i32, align 4
525 // CHECK10-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8
526 // CHECK10-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 0
527 // CHECK10-NEXT:    store i32* [[A]], i32** [[TMP0]], align 8
528 // 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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
529 // CHECK10-NEXT:    ret void
530 //
531 //
532 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined.
533 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
534 // CHECK10-NEXT:  entry:
535 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
536 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
537 // CHECK10-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
538 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
539 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
540 // CHECK10-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
541 // CHECK10-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
542 // CHECK10-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP0]], i32 0, i32 0
543 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[TMP1]], align 8
544 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
545 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
546 // CHECK10-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
547 // CHECK10-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
548 // CHECK10-NEXT:    br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
549 // CHECK10:       omp_if.then:
550 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32, i32* [[TMP2]], align 4
551 // CHECK10-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP7]], 1
552 // CHECK10-NEXT:    store i32 [[INC]], i32* [[TMP2]], align 4
553 // CHECK10-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
554 // CHECK10-NEXT:    br label [[OMP_IF_END]]
555 // CHECK10:       omp_if.end:
556 // CHECK10-NEXT:    ret void
557 //
558 //
559 // CHECK13-LABEL: define {{[^@]+}}@_Z36parallel_master_default_firstprivatev
560 // CHECK13-SAME: () #[[ATTR0:[0-9]+]] {
561 // CHECK13-NEXT:  entry:
562 // CHECK13-NEXT:    [[A:%.*]] = alloca i32, align 4
563 // CHECK13-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 4
564 // CHECK13-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 0
565 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A]], align 4
566 // CHECK13-NEXT:    store i32 [[TMP1]], i32* [[TMP0]], align 4
567 // 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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
568 // CHECK13-NEXT:    ret void
569 //
570 //
571 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined.
572 // CHECK13-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
573 // CHECK13-NEXT:  entry:
574 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
575 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
576 // CHECK13-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
577 // CHECK13-NEXT:    [[A:%.*]] = alloca i32, align 4
578 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
579 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
580 // CHECK13-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
581 // CHECK13-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
582 // CHECK13-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP0]], i32 0, i32 0
583 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
584 // CHECK13-NEXT:    store i32 [[TMP2]], i32* [[A]], align 4
585 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
586 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
587 // CHECK13-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
588 // CHECK13-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
589 // CHECK13-NEXT:    br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
590 // CHECK13:       omp_if.then:
591 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[A]], align 4
592 // CHECK13-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP7]], 1
593 // CHECK13-NEXT:    store i32 [[INC]], i32* [[A]], align 4
594 // CHECK13-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
595 // CHECK13-NEXT:    br label [[OMP_IF_END]]
596 // CHECK13:       omp_if.end:
597 // CHECK13-NEXT:    ret void
598 //
599 //
600 // CHECK14-LABEL: define {{[^@]+}}@_Z36parallel_master_default_firstprivatev
601 // CHECK14-SAME: () #[[ATTR0:[0-9]+]] {
602 // CHECK14-NEXT:  entry:
603 // CHECK14-NEXT:    [[A:%.*]] = alloca i32, align 4
604 // CHECK14-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 4
605 // CHECK14-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 0
606 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A]], align 4
607 // CHECK14-NEXT:    store i32 [[TMP1]], i32* [[TMP0]], align 4
608 // 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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
609 // CHECK14-NEXT:    ret void
610 //
611 //
612 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined.
613 // CHECK14-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
614 // CHECK14-NEXT:  entry:
615 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
616 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
617 // CHECK14-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
618 // CHECK14-NEXT:    [[A:%.*]] = alloca i32, align 4
619 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
620 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
621 // CHECK14-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
622 // CHECK14-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
623 // CHECK14-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP0]], i32 0, i32 0
624 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
625 // CHECK14-NEXT:    store i32 [[TMP2]], i32* [[A]], align 4
626 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
627 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
628 // CHECK14-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
629 // CHECK14-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
630 // CHECK14-NEXT:    br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
631 // CHECK14:       omp_if.then:
632 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[A]], align 4
633 // CHECK14-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP7]], 1
634 // CHECK14-NEXT:    store i32 [[INC]], i32* [[A]], align 4
635 // CHECK14-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
636 // CHECK14-NEXT:    br label [[OMP_IF_END]]
637 // CHECK14:       omp_if.end:
638 // CHECK14-NEXT:    ret void
639 //
640 //
641 // CHECK17-LABEL: define {{[^@]+}}@_Z36parallel_master_default_firstprivatev
642 // CHECK17-SAME: () #[[ATTR0:[0-9]+]] {
643 // CHECK17-NEXT:  entry:
644 // CHECK17-NEXT:    [[A:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
645 // CHECK17-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8
646 // CHECK17-NEXT:    call void @_ZN2StC1Ev(%struct.St* nonnull align 4 dereferenceable(8) [[A]])
647 // CHECK17-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 0
648 // CHECK17-NEXT:    store %struct.St* [[A]], %struct.St** [[TMP0]], align 8
649 // CHECK17-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 1
650 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* @_ZZ36parallel_master_default_firstprivatevE1y, align 4
651 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[TMP1]], align 8
652 // CHECK17-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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
653 // CHECK17-NEXT:    call void @_ZN2StD1Ev(%struct.St* nonnull align 4 dereferenceable(8) [[A]]) #[[ATTR3:[0-9]+]]
654 // CHECK17-NEXT:    ret void
655 //
656 //
657 // CHECK17-LABEL: define {{[^@]+}}@_ZN2StC1Ev
658 // CHECK17-SAME: (%struct.St* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
659 // CHECK17-NEXT:  entry:
660 // CHECK17-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
661 // CHECK17-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
662 // CHECK17-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
663 // CHECK17-NEXT:    call void @_ZN2StC2Ev(%struct.St* nonnull align 4 dereferenceable(8) [[THIS1]])
664 // CHECK17-NEXT:    ret void
665 //
666 //
667 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined.
668 // CHECK17-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR2:[0-9]+]] {
669 // CHECK17-NEXT:  entry:
670 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
671 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
672 // CHECK17-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
673 // CHECK17-NEXT:    [[Y:%.*]] = alloca i32, align 4
674 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
675 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
676 // CHECK17-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
677 // CHECK17-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
678 // CHECK17-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP0]], i32 0, i32 0
679 // CHECK17-NEXT:    [[TMP2:%.*]] = load %struct.St*, %struct.St** [[TMP1]], align 8
680 // CHECK17-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[TMP0]], i32 0, i32 1
681 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 8
682 // CHECK17-NEXT:    store i32 [[TMP4]], i32* [[Y]], align 4
683 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
684 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
685 // CHECK17-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]])
686 // CHECK17-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
687 // CHECK17-NEXT:    br i1 [[TMP8]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
688 // CHECK17:       omp_if.then:
689 // CHECK17-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.St* [[TMP2]], i32 0, i32 0
690 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[A]], align 4
691 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP9]], 1
692 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[A]], align 4
693 // CHECK17-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[TMP2]], i32 0, i32 1
694 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[B]], align 4
695 // CHECK17-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP10]], 1
696 // CHECK17-NEXT:    store i32 [[ADD1]], i32* [[B]], align 4
697 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[Y]], align 4
698 // CHECK17-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP11]], 1
699 // CHECK17-NEXT:    store i32 [[INC]], i32* [[Y]], align 4
700 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* @_ZN2St1yE, align 4
701 // CHECK17-NEXT:    [[INC2:%.*]] = add nsw i32 [[TMP12]], 1
702 // CHECK17-NEXT:    store i32 [[INC2]], i32* @_ZN2St1yE, align 4
703 // CHECK17-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]])
704 // CHECK17-NEXT:    br label [[OMP_IF_END]]
705 // CHECK17:       omp_if.end:
706 // CHECK17-NEXT:    ret void
707 //
708 //
709 // CHECK17-LABEL: define {{[^@]+}}@_ZN2StD1Ev
710 // CHECK17-SAME: (%struct.St* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR4:[0-9]+]] comdat align 2 {
711 // CHECK17-NEXT:  entry:
712 // CHECK17-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
713 // CHECK17-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
714 // CHECK17-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
715 // CHECK17-NEXT:    call void @_ZN2StD2Ev(%struct.St* nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR3]]
716 // CHECK17-NEXT:    ret void
717 //
718 //
719 // CHECK17-LABEL: define {{[^@]+}}@_ZN2StC2Ev
720 // CHECK17-SAME: (%struct.St* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR4]] comdat align 2 {
721 // CHECK17-NEXT:  entry:
722 // CHECK17-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
723 // CHECK17-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
724 // CHECK17-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
725 // CHECK17-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.St* [[THIS1]], i32 0, i32 0
726 // CHECK17-NEXT:    store i32 0, i32* [[A]], align 4
727 // CHECK17-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[THIS1]], i32 0, i32 1
728 // CHECK17-NEXT:    store i32 0, i32* [[B]], align 4
729 // CHECK17-NEXT:    ret void
730 //
731 //
732 // CHECK17-LABEL: define {{[^@]+}}@_ZN2StD2Ev
733 // CHECK17-SAME: (%struct.St* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR4]] comdat align 2 {
734 // CHECK17-NEXT:  entry:
735 // CHECK17-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
736 // CHECK17-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
737 // CHECK17-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
738 // CHECK17-NEXT:    ret void
739 //
740 //
741 // CHECK18-LABEL: define {{[^@]+}}@_Z36parallel_master_default_firstprivatev
742 // CHECK18-SAME: () #[[ATTR0:[0-9]+]] {
743 // CHECK18-NEXT:  entry:
744 // CHECK18-NEXT:    [[A:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
745 // CHECK18-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8
746 // CHECK18-NEXT:    call void @_ZN2StC1Ev(%struct.St* nonnull align 4 dereferenceable(8) [[A]])
747 // CHECK18-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 0
748 // CHECK18-NEXT:    store %struct.St* [[A]], %struct.St** [[TMP0]], align 8
749 // CHECK18-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 1
750 // CHECK18-NEXT:    [[TMP2:%.*]] = load i32, i32* @_ZZ36parallel_master_default_firstprivatevE1y, align 4
751 // CHECK18-NEXT:    store i32 [[TMP2]], i32* [[TMP1]], align 8
752 // CHECK18-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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
753 // CHECK18-NEXT:    call void @_ZN2StD1Ev(%struct.St* nonnull align 4 dereferenceable(8) [[A]]) #[[ATTR3:[0-9]+]]
754 // CHECK18-NEXT:    ret void
755 //
756 //
757 // CHECK18-LABEL: define {{[^@]+}}@_ZN2StC1Ev
758 // CHECK18-SAME: (%struct.St* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
759 // CHECK18-NEXT:  entry:
760 // CHECK18-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
761 // CHECK18-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
762 // CHECK18-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
763 // CHECK18-NEXT:    call void @_ZN2StC2Ev(%struct.St* nonnull align 4 dereferenceable(8) [[THIS1]])
764 // CHECK18-NEXT:    ret void
765 //
766 //
767 // CHECK18-LABEL: define {{[^@]+}}@.omp_outlined.
768 // CHECK18-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR2:[0-9]+]] {
769 // CHECK18-NEXT:  entry:
770 // CHECK18-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
771 // CHECK18-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
772 // CHECK18-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
773 // CHECK18-NEXT:    [[Y:%.*]] = alloca i32, align 4
774 // CHECK18-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
775 // CHECK18-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
776 // CHECK18-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
777 // CHECK18-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
778 // CHECK18-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP0]], i32 0, i32 0
779 // CHECK18-NEXT:    [[TMP2:%.*]] = load %struct.St*, %struct.St** [[TMP1]], align 8
780 // CHECK18-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[TMP0]], i32 0, i32 1
781 // CHECK18-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 8
782 // CHECK18-NEXT:    store i32 [[TMP4]], i32* [[Y]], align 4
783 // CHECK18-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
784 // CHECK18-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
785 // CHECK18-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]])
786 // CHECK18-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
787 // CHECK18-NEXT:    br i1 [[TMP8]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
788 // CHECK18:       omp_if.then:
789 // CHECK18-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.St* [[TMP2]], i32 0, i32 0
790 // CHECK18-NEXT:    [[TMP9:%.*]] = load i32, i32* [[A]], align 4
791 // CHECK18-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP9]], 1
792 // CHECK18-NEXT:    store i32 [[ADD]], i32* [[A]], align 4
793 // CHECK18-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[TMP2]], i32 0, i32 1
794 // CHECK18-NEXT:    [[TMP10:%.*]] = load i32, i32* [[B]], align 4
795 // CHECK18-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP10]], 1
796 // CHECK18-NEXT:    store i32 [[ADD1]], i32* [[B]], align 4
797 // CHECK18-NEXT:    [[TMP11:%.*]] = load i32, i32* [[Y]], align 4
798 // CHECK18-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP11]], 1
799 // CHECK18-NEXT:    store i32 [[INC]], i32* [[Y]], align 4
800 // CHECK18-NEXT:    [[TMP12:%.*]] = load i32, i32* @_ZN2St1yE, align 4
801 // CHECK18-NEXT:    [[INC2:%.*]] = add nsw i32 [[TMP12]], 1
802 // CHECK18-NEXT:    store i32 [[INC2]], i32* @_ZN2St1yE, align 4
803 // CHECK18-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]])
804 // CHECK18-NEXT:    br label [[OMP_IF_END]]
805 // CHECK18:       omp_if.end:
806 // CHECK18-NEXT:    ret void
807 //
808 //
809 // CHECK18-LABEL: define {{[^@]+}}@_ZN2StD1Ev
810 // CHECK18-SAME: (%struct.St* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR4:[0-9]+]] comdat align 2 {
811 // CHECK18-NEXT:  entry:
812 // CHECK18-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
813 // CHECK18-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
814 // CHECK18-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
815 // CHECK18-NEXT:    call void @_ZN2StD2Ev(%struct.St* nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR3]]
816 // CHECK18-NEXT:    ret void
817 //
818 //
819 // CHECK18-LABEL: define {{[^@]+}}@_ZN2StC2Ev
820 // CHECK18-SAME: (%struct.St* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR4]] comdat align 2 {
821 // CHECK18-NEXT:  entry:
822 // CHECK18-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
823 // CHECK18-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
824 // CHECK18-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
825 // CHECK18-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.St* [[THIS1]], i32 0, i32 0
826 // CHECK18-NEXT:    store i32 0, i32* [[A]], align 4
827 // CHECK18-NEXT:    [[B:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.St* [[THIS1]], i32 0, i32 1
828 // CHECK18-NEXT:    store i32 0, i32* [[B]], align 4
829 // CHECK18-NEXT:    ret void
830 //
831 //
832 // CHECK18-LABEL: define {{[^@]+}}@_ZN2StD2Ev
833 // CHECK18-SAME: (%struct.St* nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR4]] comdat align 2 {
834 // CHECK18-NEXT:  entry:
835 // CHECK18-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.St*, align 8
836 // CHECK18-NEXT:    store %struct.St* [[THIS]], %struct.St** [[THIS_ADDR]], align 8
837 // CHECK18-NEXT:    [[THIS1:%.*]] = load %struct.St*, %struct.St** [[THIS_ADDR]], align 8
838 // CHECK18-NEXT:    ret void
839 //
840 //
841 // CHECK21-LABEL: define {{[^@]+}}@_Z28parallel_master_firstprivatev
842 // CHECK21-SAME: () #[[ATTR0:[0-9]+]] {
843 // CHECK21-NEXT:  entry:
844 // CHECK21-NEXT:    [[A:%.*]] = alloca i32, align 4
845 // CHECK21-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 4
846 // CHECK21-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 0
847 // CHECK21-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A]], align 4
848 // CHECK21-NEXT:    store i32 [[TMP1]], i32* [[TMP0]], align 4
849 // 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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
850 // CHECK21-NEXT:    ret void
851 //
852 //
853 // CHECK21-LABEL: define {{[^@]+}}@.omp_outlined.
854 // CHECK21-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
855 // CHECK21-NEXT:  entry:
856 // CHECK21-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
857 // CHECK21-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
858 // CHECK21-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
859 // CHECK21-NEXT:    [[A:%.*]] = alloca i32, align 4
860 // CHECK21-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
861 // CHECK21-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
862 // CHECK21-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
863 // CHECK21-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
864 // CHECK21-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP0]], i32 0, i32 0
865 // CHECK21-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
866 // CHECK21-NEXT:    store i32 [[TMP2]], i32* [[A]], align 4
867 // CHECK21-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
868 // CHECK21-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
869 // CHECK21-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
870 // CHECK21-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
871 // CHECK21-NEXT:    br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
872 // CHECK21:       omp_if.then:
873 // CHECK21-NEXT:    [[TMP7:%.*]] = load i32, i32* [[A]], align 4
874 // CHECK21-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP7]], 1
875 // CHECK21-NEXT:    store i32 [[INC]], i32* [[A]], align 4
876 // CHECK21-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
877 // CHECK21-NEXT:    br label [[OMP_IF_END]]
878 // CHECK21:       omp_if.end:
879 // CHECK21-NEXT:    ret void
880 //
881 //
882 // CHECK22-LABEL: define {{[^@]+}}@_Z28parallel_master_firstprivatev
883 // CHECK22-SAME: () #[[ATTR0:[0-9]+]] {
884 // CHECK22-NEXT:  entry:
885 // CHECK22-NEXT:    [[A:%.*]] = alloca i32, align 4
886 // CHECK22-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 4
887 // CHECK22-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 0
888 // CHECK22-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A]], align 4
889 // CHECK22-NEXT:    store i32 [[TMP1]], i32* [[TMP0]], align 4
890 // 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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
891 // CHECK22-NEXT:    ret void
892 //
893 //
894 // CHECK22-LABEL: define {{[^@]+}}@.omp_outlined.
895 // CHECK22-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
896 // CHECK22-NEXT:  entry:
897 // CHECK22-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
898 // CHECK22-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
899 // CHECK22-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
900 // CHECK22-NEXT:    [[A:%.*]] = alloca i32, align 4
901 // CHECK22-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
902 // CHECK22-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
903 // CHECK22-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
904 // CHECK22-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
905 // CHECK22-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP0]], i32 0, i32 0
906 // CHECK22-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
907 // CHECK22-NEXT:    store i32 [[TMP2]], i32* [[A]], align 4
908 // CHECK22-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
909 // CHECK22-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
910 // CHECK22-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
911 // CHECK22-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
912 // CHECK22-NEXT:    br i1 [[TMP6]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
913 // CHECK22:       omp_if.then:
914 // CHECK22-NEXT:    [[TMP7:%.*]] = load i32, i32* [[A]], align 4
915 // CHECK22-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP7]], 1
916 // CHECK22-NEXT:    store i32 [[INC]], i32* [[A]], align 4
917 // CHECK22-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
918 // CHECK22-NEXT:    br label [[OMP_IF_END]]
919 // CHECK22:       omp_if.end:
920 // CHECK22-NEXT:    ret void
921 //
922 //
923 // CHECK25-LABEL: define {{[^@]+}}@_Z22parallel_master_copyinv
924 // CHECK25-SAME: () #[[ATTR0:[0-9]+]] {
925 // CHECK25-NEXT:  entry:
926 // CHECK25-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
927 // CHECK25-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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
928 // CHECK25-NEXT:    ret void
929 //
930 //
931 // CHECK25-LABEL: define {{[^@]+}}@.omp_outlined.
932 // CHECK25-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
933 // CHECK25-NEXT:  entry:
934 // CHECK25-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
935 // CHECK25-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
936 // CHECK25-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
937 // CHECK25-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
938 // CHECK25-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
939 // CHECK25-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
940 // CHECK25-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
941 // CHECK25-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
942 // CHECK25-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
943 // CHECK25-NEXT:    [[TMP3:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i8* bitcast (i32* @a to i8*), i64 4, i8*** @a.cache.)
944 // CHECK25-NEXT:    [[TMP4:%.*]] = bitcast i8* [[TMP3]] to i32*
945 // CHECK25-NEXT:    [[TMP5:%.*]] = ptrtoint i32* [[TMP4]] to i64
946 // CHECK25-NEXT:    [[TMP6:%.*]] = icmp ne i64 ptrtoint (i32* @a to i64), [[TMP5]]
947 // CHECK25-NEXT:    br i1 [[TMP6]], label [[COPYIN_NOT_MASTER:%.*]], label [[COPYIN_NOT_MASTER_END:%.*]]
948 // CHECK25:       copyin.not.master:
949 // CHECK25-NEXT:    [[TMP7:%.*]] = load i32, i32* @a, align 4
950 // CHECK25-NEXT:    store i32 [[TMP7]], i32* [[TMP4]], align 4
951 // CHECK25-NEXT:    br label [[COPYIN_NOT_MASTER_END]]
952 // CHECK25:       copyin.not.master.end:
953 // CHECK25-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP2]])
954 // CHECK25-NEXT:    [[TMP8:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
955 // CHECK25-NEXT:    [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0
956 // CHECK25-NEXT:    br i1 [[TMP9]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
957 // CHECK25:       omp_if.then:
958 // CHECK25-NEXT:    [[TMP10:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i8* bitcast (i32* @a to i8*), i64 4, i8*** @a.cache.)
959 // CHECK25-NEXT:    [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
960 // CHECK25-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
961 // CHECK25-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP12]], 1
962 // CHECK25-NEXT:    store i32 [[INC]], i32* [[TMP11]], align 4
963 // CHECK25-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
964 // CHECK25-NEXT:    br label [[OMP_IF_END]]
965 // CHECK25:       omp_if.end:
966 // CHECK25-NEXT:    ret void
967 //
968 //
969 // CHECK26-LABEL: define {{[^@]+}}@_Z22parallel_master_copyinv
970 // CHECK26-SAME: () #[[ATTR0:[0-9]+]] {
971 // CHECK26-NEXT:  entry:
972 // CHECK26-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
973 // CHECK26-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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
974 // CHECK26-NEXT:    ret void
975 //
976 //
977 // CHECK26-LABEL: define {{[^@]+}}@.omp_outlined.
978 // CHECK26-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
979 // CHECK26-NEXT:  entry:
980 // CHECK26-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
981 // CHECK26-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
982 // CHECK26-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
983 // CHECK26-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
984 // CHECK26-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
985 // CHECK26-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
986 // CHECK26-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
987 // CHECK26-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
988 // CHECK26-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
989 // CHECK26-NEXT:    [[TMP3:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i8* bitcast (i32* @a to i8*), i64 4, i8*** @a.cache.)
990 // CHECK26-NEXT:    [[TMP4:%.*]] = bitcast i8* [[TMP3]] to i32*
991 // CHECK26-NEXT:    [[TMP5:%.*]] = ptrtoint i32* [[TMP4]] to i64
992 // CHECK26-NEXT:    [[TMP6:%.*]] = icmp ne i64 ptrtoint (i32* @a to i64), [[TMP5]]
993 // CHECK26-NEXT:    br i1 [[TMP6]], label [[COPYIN_NOT_MASTER:%.*]], label [[COPYIN_NOT_MASTER_END:%.*]]
994 // CHECK26:       copyin.not.master:
995 // CHECK26-NEXT:    [[TMP7:%.*]] = load i32, i32* @a, align 4
996 // CHECK26-NEXT:    store i32 [[TMP7]], i32* [[TMP4]], align 4
997 // CHECK26-NEXT:    br label [[COPYIN_NOT_MASTER_END]]
998 // CHECK26:       copyin.not.master.end:
999 // CHECK26-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP2]])
1000 // CHECK26-NEXT:    [[TMP8:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1001 // CHECK26-NEXT:    [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0
1002 // CHECK26-NEXT:    br i1 [[TMP9]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
1003 // CHECK26:       omp_if.then:
1004 // CHECK26-NEXT:    [[TMP10:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i8* bitcast (i32* @a to i8*), i64 4, i8*** @a.cache.)
1005 // CHECK26-NEXT:    [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
1006 // CHECK26-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
1007 // CHECK26-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP12]], 1
1008 // CHECK26-NEXT:    store i32 [[INC]], i32* [[TMP11]], align 4
1009 // CHECK26-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1010 // CHECK26-NEXT:    br label [[OMP_IF_END]]
1011 // CHECK26:       omp_if.end:
1012 // CHECK26-NEXT:    ret void
1013 //
1014 //
1015 // CHECK29-LABEL: define {{[^@]+}}@_Z22parallel_master_copyinv
1016 // CHECK29-SAME: () #[[ATTR0:[0-9]+]] {
1017 // CHECK29-NEXT:  entry:
1018 // CHECK29-NEXT:    [[OMP_OUTLINED_ARG_AGG_:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8
1019 // CHECK29-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[OMP_OUTLINED_ARG_AGG_]], i32 0, i32 0
1020 // CHECK29-NEXT:    store i32* @a, i32** [[TMP0]], align 8
1021 // 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*, %struct.anon*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.anon* [[OMP_OUTLINED_ARG_AGG_]])
1022 // CHECK29-NEXT:    ret void
1023 //
1024 //
1025 // CHECK29-LABEL: define {{[^@]+}}@.omp_outlined.
1026 // CHECK29-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.anon* noalias [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {
1027 // CHECK29-NEXT:  entry:
1028 // CHECK29-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1029 // CHECK29-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1030 // CHECK29-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca %struct.anon*, align 8
1031 // CHECK29-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1032 // CHECK29-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1033 // CHECK29-NEXT:    store %struct.anon* [[__CONTEXT]], %struct.anon** [[__CONTEXT_ADDR]], align 8
1034 // CHECK29-NEXT:    [[TMP0:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR]], align 8
1035 // CHECK29-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP0]], i32 0, i32 0
1036 // CHECK29-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[TMP1]], align 8
1037 // CHECK29-NEXT:    [[TMP3:%.*]] = ptrtoint i32* [[TMP2]] to i64
1038 // CHECK29-NEXT:    [[TMP4:%.*]] = icmp ne i64 [[TMP3]], ptrtoint (i32* @a to i64)
1039 // CHECK29-NEXT:    br i1 [[TMP4]], label [[COPYIN_NOT_MASTER:%.*]], label [[COPYIN_NOT_MASTER_END:%.*]]
1040 // CHECK29:       copyin.not.master:
1041 // CHECK29-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP2]], align 4
1042 // CHECK29-NEXT:    store i32 [[TMP5]], i32* @a, align 4
1043 // CHECK29-NEXT:    br label [[COPYIN_NOT_MASTER_END]]
1044 // CHECK29:       copyin.not.master.end:
1045 // CHECK29-NEXT:    [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1046 // CHECK29-NEXT:    [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
1047 // CHECK29-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP7]])
1048 // CHECK29-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1049 // CHECK29-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
1050 // CHECK29-NEXT:    [[TMP10:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[TMP9]])
1051 // CHECK29-NEXT:    [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 0
1052 // CHECK29-NEXT:    br i1 [[TMP11]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]]
1053 // CHECK29:       omp_if.then:
1054 // CHECK29-NEXT:    [[TMP12:%.*]] = load i32, i32* @a, align 4
1055 // CHECK29-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP12]], 1
1056 // CHECK29-NEXT:    store i32 [[INC]], i32* @a, align 4
1057 // CHECK29-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[TMP9]])
1058 // CHECK29-NEXT:    br label [[OMP_IF_END]]
1059 // CHECK29:       omp_if.end:
1060 // CHECK29-NEXT:    ret void
1061 //
1062 //
1063 // CHECK29-LABEL: define {{[^@]+}}@_ZTW1a
1064 // CHECK29-SAME: () #[[ATTR4:[0-9]+]] comdat {
1065 // CHECK29-NEXT:    ret i32* @a
1066 //
1067