1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs
2; RUN: opt -S -attributor -openmp-opt-cgscc -openmp-opt-enable-merging -enable-new-pm=0 < %s | FileCheck %s --check-prefix=CHECK1
3; RUN: opt -S -aa-pipeline= -passes='attributor,cgscc(openmp-opt-cgscc)' -openmp-opt-enable-merging  < %s | FileCheck %s --check-prefix=CHECK2
4; #include <omp.h>
5; void foo();
6; void use(int);
7; void usef(float);
8; void merge(int a) {
9; #pragma omp parallel
10;     {
11;         use(a);
12;     }
13; #pragma omp parallel
14;     {
15;         use(a);
16;     }
17; }
18; void unmergable_proc_bind(int a) {
19; #pragma omp parallel proc_bind(close)
20;     {
21;         use(a);
22;     }
23; #pragma omp parallel
24;     {
25;         use(a);
26;     }
27; }
28; void unmergable_num_threads(int a) {
29; #pragma omp parallel num_threads(a)
30;     {
31;         use(a);
32;     }
33; #pragma omp parallel
34;     {
35;         use(a);
36;     }
37; }
38; void unmergable_seq_call(int a) {
39; #pragma omp parallel
40;     {
41;         use(a);
42;     }
43;     foo();
44; #pragma omp parallel
45;     {
46;         use(a);
47;     }
48; }
49; void merge_seq(int a) {
50; #pragma omp parallel
51;     {
52;         use(a);
53;     }
54;     a = a + 1;
55; #pragma omp parallel
56;     {
57;         use(a);
58;     }
59;     use(a);
60; }
61; void merge_seq_float(float f, float *p) {
62; #pragma omp parallel
63;     {
64;         use(f);
65;     }
66;     *p = f + 3.14f;
67; #pragma omp parallel
68;     {
69;         use(f);
70;     }
71; }
72; void merge_seq_firstprivate(int a) {
73; #pragma omp parallel
74;     {
75;         use(a);
76;     }
77;     a = a + 1;
78; #pragma omp parallel firstprivate(a)
79;     {
80;         use(a);
81;     }
82;     use(a);
83; }
84; void merge_seq_sink_lt(int a) {
85; #pragma omp parallel
86;     {
87;         use(a);
88;     }
89;     {
90;         int b = (int)&b;
91;     }
92; #pragma omp parallel
93;     {
94;         use(a);
95;     }
96; }
97; void merge_seq_par_use(int a) {
98; #pragma omp parallel
99;     {
100;         use(a);
101;     }
102;     int b = a + 1;
103; #pragma omp parallel
104;     {
105;         use(a);
106;         use(b);
107;     }
108; }
109; void merge_cancellable_regions(int cancel1, int cancel2)
110; {
111; #pragma omp parallel
112;     {
113;         if(cancel1) {
114; #pragma omp cancel parallel
115;         }
116;     }
117; #pragma omp parallel
118;     {
119;         if (cancel2) {
120; #pragma omp cancel parallel
121;         }
122;     }
123; }
124; void merge_cancellable_regions_seq(int cancel1, int cancel2)
125; {
126; #pragma omp parallel
127;     {
128;         if(cancel1) {
129; #pragma omp cancel parallel
130;         }
131;     }
132;     cancel2 = !cancel1;
133; #pragma omp parallel
134;     {
135;         if (cancel2) {
136; #pragma omp cancel parallel
137;         }
138;     }
139; }
140; void merge_3(int a) {
141; #pragma omp parallel
142;     {
143;         use(a);
144;     }
145; #pragma omp parallel
146;     {
147;         use(a);
148;     }
149; #pragma omp parallel
150;     {
151;         use(a);
152;     }
153; }
154; void merge_3_seq(int a, int b) {
155; #pragma omp parallel
156;     {
157;         use(a);
158;     }
159;     b = a + 1;
160; #pragma omp parallel
161;     {
162;         use(a);
163;     }
164;     b = b + a;
165; #pragma omp parallel
166;     {
167;         use(a);
168;     }
169;     use(b);
170; }
171; void unmergable_3_seq_call(int a) {
172; #pragma omp parallel
173;     {
174;         use(a);
175;     }
176;     foo();
177; #pragma omp parallel
178;     {
179;         use(a);
180;     }
181;     foo();
182; #pragma omp parallel
183;     {
184;         use(a);
185;     }
186; }
187; void unmergable_3_proc_bind(int a) {
188; #pragma omp parallel
189;     {
190;         use(a);
191;     }
192; #pragma omp parallel proc_bind(close)
193;     {
194;         use(a);
195;     }
196; #pragma omp parallel
197;     {
198;         use(a);
199;     }
200; }
201; void unmergable_3_num_threads(int a) {
202; #pragma omp parallel
203;     {
204;         use(a);
205;     }
206; #pragma omp parallel num_threads(a)
207;     {
208;         use(a);
209;     }
210; #pragma omp parallel
211;     {
212;         use(a);
213;     }
214; }
215; void merge_2_unmergable_1(int a) {
216; #pragma omp parallel
217;     {
218;         use(a);
219;     }
220; #pragma omp parallel
221;     {
222;         use(a);
223;     }
224;     foo();
225; #pragma omp parallel
226;     {
227;         use(a);
228;     }
229; }
230target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
231
232%struct.ident_t = type { i32, i32, i32, i32, i8* }
233
234@0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
235@1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @0, i32 0, i32 0) }, align 8
236
237define dso_local void @merge(i32 %a) local_unnamed_addr  {
238entry:
239  %a.addr = alloca i32, align 4
240  store i32 %a, i32* %a.addr, align 4
241  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
242  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
243  ret void
244}
245
246define internal void @.omp_outlined.(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
247entry:
248  %0 = load i32, i32* %a, align 4
249  call void @use(i32 %0)
250  ret void
251}
252
253declare dso_local void @use(i32) local_unnamed_addr
254
255declare !callback !1 void @__kmpc_fork_call(%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) local_unnamed_addr
256
257define internal void @.omp_outlined..1(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
258entry:
259  %0 = load i32, i32* %a, align 4
260  call void @use(i32 %0)
261  ret void
262}
263
264define dso_local void @unmergable_proc_bind(i32 %a) local_unnamed_addr  {
265entry:
266  %a.addr = alloca i32, align 4
267  %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1)
268  store i32 %a, i32* %a.addr, align 4
269  call void @__kmpc_push_proc_bind(%struct.ident_t* nonnull @1, i32 %0, i32 3)
270  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
271  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
272  ret void
273}
274
275define internal void @.omp_outlined..2(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
276entry:
277  %0 = load i32, i32* %a, align 4
278  call void @use(i32 %0)
279  ret void
280}
281
282declare i32 @__kmpc_global_thread_num(%struct.ident_t*) local_unnamed_addr
283
284declare void @__kmpc_push_proc_bind(%struct.ident_t*, i32, i32) local_unnamed_addr
285
286define internal void @.omp_outlined..3(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
287entry:
288  %0 = load i32, i32* %a, align 4
289  call void @use(i32 %0)
290  ret void
291}
292
293define dso_local void @unmergable_num_threads(i32 %a) local_unnamed_addr  {
294entry:
295  %a.addr = alloca i32, align 4
296  %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1)
297  store i32 %a, i32* %a.addr, align 4
298  call void @__kmpc_push_num_threads(%struct.ident_t* nonnull @1, i32 %0, i32 %a)
299  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
300  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
301  ret void
302}
303
304define internal void @.omp_outlined..4(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
305entry:
306  %0 = load i32, i32* %a, align 4
307  call void @use(i32 %0)
308  ret void
309}
310
311declare void @__kmpc_push_num_threads(%struct.ident_t*, i32, i32) local_unnamed_addr
312
313define internal void @.omp_outlined..5(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
314entry:
315  %0 = load i32, i32* %a, align 4
316  call void @use(i32 %0)
317  ret void
318}
319
320define dso_local void @unmergable_seq_call(i32 %a) local_unnamed_addr  {
321entry:
322  %a.addr = alloca i32, align 4
323  store i32 %a, i32* %a.addr, align 4
324  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
325  call void (...) @foo()
326  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
327  ret void
328}
329
330define internal void @.omp_outlined..6(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
331entry:
332  %0 = load i32, i32* %a, align 4
333  call void @use(i32 %0)
334  ret void
335}
336
337declare dso_local void @foo(...) local_unnamed_addr
338
339define internal void @.omp_outlined..7(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
340entry:
341  %0 = load i32, i32* %a, align 4
342  call void @use(i32 %0)
343  ret void
344}
345
346define dso_local void @merge_seq(i32 %a) local_unnamed_addr  {
347entry:
348  %a.addr = alloca i32, align 4
349  store i32 %a, i32* %a.addr, align 4
350  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..8 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
351  %0 = load i32, i32* %a.addr, align 4
352  %add = add nsw i32 %0, 1
353  store i32 %add, i32* %a.addr, align 4
354  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..9 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
355  %1 = load i32, i32* %a.addr, align 4
356  call void @use(i32 %1)
357  ret void
358}
359
360define internal void @.omp_outlined..8(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
361entry:
362  %0 = load i32, i32* %a, align 4
363  call void @use(i32 %0)
364  ret void
365}
366
367define internal void @.omp_outlined..9(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
368entry:
369  %0 = load i32, i32* %a, align 4
370  call void @use(i32 %0)
371  ret void
372}
373
374define dso_local void @merge_seq_float(float %f, float* nocapture %p) local_unnamed_addr  {
375entry:
376  %f.addr = alloca float, align 4
377  store float %f, float* %f.addr, align 4
378  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), float* nonnull %f.addr)
379  %0 = load float, float* %f.addr, align 4
380  %add = fadd float %0, 0x40091EB860000000
381  store float %add, float* %p, align 4
382  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), float* nonnull %f.addr)
383  ret void
384}
385
386define internal void @.omp_outlined..10(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., float* nocapture nonnull readonly align 4 dereferenceable(4) %f)  {
387entry:
388  %0 = load float, float* %f, align 4
389  %conv = fptosi float %0 to i32
390  call void @use(i32 %conv)
391  ret void
392}
393
394define internal void @.omp_outlined..11(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., float* nocapture nonnull readonly align 4 dereferenceable(4) %f)  {
395entry:
396  %0 = load float, float* %f, align 4
397  %conv = fptosi float %0 to i32
398  call void @use(i32 %conv)
399  ret void
400}
401
402define dso_local void @merge_seq_firstprivate(i32 %a) local_unnamed_addr  {
403entry:
404  %a.addr = alloca i32, align 4
405  store i32 %a, i32* %a.addr, align 4
406  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..12 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
407  %0 = load i32, i32* %a.addr, align 4
408  %add = add nsw i32 %0, 1
409  store i32 %add, i32* %a.addr, align 4
410  %a.casted.sroa.0.0.insert.ext = zext i32 %add to i64
411  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* @.omp_outlined..13 to void (i32*, i32*, ...)*), i64 %a.casted.sroa.0.0.insert.ext)
412  %1 = load i32, i32* %a.addr, align 4
413  call void @use(i32 %1)
414  ret void
415}
416
417define internal void @.omp_outlined..12(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
418entry:
419  %0 = load i32, i32* %a, align 4
420  call void @use(i32 %0)
421  ret void
422}
423
424define internal void @.omp_outlined..13(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i64 %a)  {
425entry:
426  %a.addr.sroa.0.0.extract.trunc = trunc i64 %a to i32
427  call void @use(i32 %a.addr.sroa.0.0.extract.trunc)
428  ret void
429}
430
431define dso_local void @merge_seq_sink_lt(i32 %a) local_unnamed_addr  {
432entry:
433  %a.addr = alloca i32, align 4
434  %b = alloca i32, align 4
435  store i32 %a, i32* %a.addr, align 4
436  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..14 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
437  %0 = bitcast i32* %b to i8*
438  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0)
439  %1 = ptrtoint i32* %b to i64
440  %2 = trunc i64 %1 to i32
441  store i32 %2, i32* %b, align 4
442  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0)
443  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
444  ret void
445}
446
447define internal void @.omp_outlined..14(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
448entry:
449  %0 = load i32, i32* %a, align 4
450  call void @use(i32 %0)
451  ret void
452}
453
454declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture)
455
456declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture)
457
458define internal void @.omp_outlined..15(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
459entry:
460  %0 = load i32, i32* %a, align 4
461  call void @use(i32 %0)
462  ret void
463}
464
465define dso_local void @merge_seq_par_use(i32 %a) local_unnamed_addr  {
466entry:
467  %a.addr = alloca i32, align 4
468  %b = alloca i32, align 4
469  store i32 %a, i32* %a.addr, align 4
470  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..16 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
471  %0 = bitcast i32* %b to i8*
472  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0)
473  %1 = load i32, i32* %a.addr, align 4
474  %add = add nsw i32 %1, 1
475  store i32 %add, i32* %b, align 4
476  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..17 to void (i32*, i32*, ...)*), i32* nonnull %a.addr, i32* nonnull %b)
477  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0)
478  ret void
479}
480
481define internal void @.omp_outlined..16(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
482entry:
483  %0 = load i32, i32* %a, align 4
484  call void @use(i32 %0)
485  ret void
486}
487
488define internal void @.omp_outlined..17(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a, i32* nocapture nonnull readonly align 4 dereferenceable(4) %b)  {
489entry:
490  %0 = load i32, i32* %a, align 4
491  call void @use(i32 %0)
492  %1 = load i32, i32* %b, align 4
493  call void @use(i32 %1)
494  ret void
495}
496
497define dso_local void @merge_cancellable_regions(i32 %cancel1, i32 %cancel2) local_unnamed_addr  {
498entry:
499  %cancel1.addr = alloca i32, align 4
500  %cancel2.addr = alloca i32, align 4
501  store i32 %cancel1, i32* %cancel1.addr, align 4
502  store i32 %cancel2, i32* %cancel2.addr, align 4
503  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..18 to void (i32*, i32*, ...)*), i32* nonnull %cancel1.addr)
504  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i32* nonnull %cancel2.addr)
505  ret void
506}
507
508define internal void @.omp_outlined..18(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel1)  {
509entry:
510  %0 = load i32, i32* %cancel1, align 4
511  %tobool.not = icmp eq i32 %0, 0
512  br i1 %tobool.not, label %if.end, label %if.then
513
514if.then:                                          ; preds = %entry
515  %1 = load i32, i32* %.global_tid., align 4
516  %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1)
517  ret void
518
519if.end:                                           ; preds = %entry
520  ret void
521}
522
523declare i32 @__kmpc_cancel(%struct.ident_t*, i32, i32) local_unnamed_addr
524
525define internal void @.omp_outlined..19(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel2)  {
526entry:
527  %0 = load i32, i32* %cancel2, align 4
528  %tobool.not = icmp eq i32 %0, 0
529  br i1 %tobool.not, label %if.end, label %if.then
530
531if.then:                                          ; preds = %entry
532  %1 = load i32, i32* %.global_tid., align 4
533  %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1)
534  ret void
535
536if.end:                                           ; preds = %entry
537  ret void
538}
539
540define dso_local void @merge_cancellable_regions_seq(i32 %cancel1, i32 %cancel2) local_unnamed_addr  {
541entry:
542  %cancel1.addr = alloca i32, align 4
543  %cancel2.addr = alloca i32, align 4
544  store i32 %cancel1, i32* %cancel1.addr, align 4
545  store i32 %cancel2, i32* %cancel2.addr, align 4
546  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..20 to void (i32*, i32*, ...)*), i32* nonnull %cancel1.addr)
547  %0 = load i32, i32* %cancel1.addr, align 4
548  %tobool.not = icmp eq i32 %0, 0
549  %lnot.ext = zext i1 %tobool.not to i32
550  store i32 %lnot.ext, i32* %cancel2.addr, align 4
551  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..21 to void (i32*, i32*, ...)*), i32* nonnull %cancel2.addr)
552  ret void
553}
554
555define internal void @.omp_outlined..20(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel1)  {
556entry:
557  %0 = load i32, i32* %cancel1, align 4
558  %tobool.not = icmp eq i32 %0, 0
559  br i1 %tobool.not, label %if.end, label %if.then
560
561if.then:                                          ; preds = %entry
562  %1 = load i32, i32* %.global_tid., align 4
563  %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1)
564  ret void
565
566if.end:                                           ; preds = %entry
567  ret void
568}
569
570define internal void @.omp_outlined..21(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel2)  {
571entry:
572  %0 = load i32, i32* %cancel2, align 4
573  %tobool.not = icmp eq i32 %0, 0
574  br i1 %tobool.not, label %if.end, label %if.then
575
576if.then:                                          ; preds = %entry
577  %1 = load i32, i32* %.global_tid., align 4
578  %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1)
579  ret void
580
581if.end:                                           ; preds = %entry
582  ret void
583}
584
585define dso_local void @merge_3(i32 %a) local_unnamed_addr  {
586entry:
587  %a.addr = alloca i32, align 4
588  store i32 %a, i32* %a.addr, align 4
589  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..22 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
590  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
591  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..24 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
592  ret void
593}
594
595define internal void @.omp_outlined..22(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
596entry:
597  %0 = load i32, i32* %a, align 4
598  call void @use(i32 %0)
599  ret void
600}
601
602define internal void @.omp_outlined..23(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
603entry:
604  %0 = load i32, i32* %a, align 4
605  call void @use(i32 %0)
606  ret void
607}
608
609define internal void @.omp_outlined..24(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
610entry:
611  %0 = load i32, i32* %a, align 4
612  call void @use(i32 %0)
613  ret void
614}
615
616define dso_local void @merge_3_seq(i32 %a, i32 %b) local_unnamed_addr  {
617entry:
618  %a.addr = alloca i32, align 4
619  store i32 %a, i32* %a.addr, align 4
620  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..25 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
621  %0 = load i32, i32* %a.addr, align 4
622  %add = add nsw i32 %0, 1
623  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..26 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
624  %1 = load i32, i32* %a.addr, align 4
625  %add1 = add nsw i32 %add, %1
626  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..27 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
627  call void @use(i32 %add1)
628  ret void
629}
630
631define internal void @.omp_outlined..25(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
632entry:
633  %0 = load i32, i32* %a, align 4
634  call void @use(i32 %0)
635  ret void
636}
637
638define internal void @.omp_outlined..26(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
639entry:
640  %0 = load i32, i32* %a, align 4
641  call void @use(i32 %0)
642  ret void
643}
644
645define internal void @.omp_outlined..27(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
646entry:
647  %0 = load i32, i32* %a, align 4
648  call void @use(i32 %0)
649  ret void
650}
651
652define dso_local void @unmergable_3_seq_call(i32 %a) local_unnamed_addr  {
653entry:
654  %a.addr = alloca i32, align 4
655  store i32 %a, i32* %a.addr, align 4
656  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
657  call void (...) @foo()
658  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
659  call void (...) @foo()
660  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
661  ret void
662}
663
664define internal void @.omp_outlined..28(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
665entry:
666  %0 = load i32, i32* %a, align 4
667  call void @use(i32 %0)
668  ret void
669}
670
671define internal void @.omp_outlined..29(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
672entry:
673  %0 = load i32, i32* %a, align 4
674  call void @use(i32 %0)
675  ret void
676}
677
678define internal void @.omp_outlined..30(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
679entry:
680  %0 = load i32, i32* %a, align 4
681  call void @use(i32 %0)
682  ret void
683}
684
685define dso_local void @unmergable_3_proc_bind(i32 %a) local_unnamed_addr  {
686entry:
687  %a.addr = alloca i32, align 4
688  %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1)
689  store i32 %a, i32* %a.addr, align 4
690  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
691  call void @__kmpc_push_proc_bind(%struct.ident_t* nonnull @1, i32 %0, i32 3)
692  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
693  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
694  ret void
695}
696
697define internal void @.omp_outlined..31(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
698entry:
699  %0 = load i32, i32* %a, align 4
700  call void @use(i32 %0)
701  ret void
702}
703
704define internal void @.omp_outlined..32(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
705entry:
706  %0 = load i32, i32* %a, align 4
707  call void @use(i32 %0)
708  ret void
709}
710
711define internal void @.omp_outlined..33(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
712entry:
713  %0 = load i32, i32* %a, align 4
714  call void @use(i32 %0)
715  ret void
716}
717
718define dso_local void @unmergable_3_num_threads(i32 %a) local_unnamed_addr  {
719entry:
720  %a.addr = alloca i32, align 4
721  %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1)
722  store i32 %a, i32* %a.addr, align 4
723  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
724  %1 = load i32, i32* %a.addr, align 4
725  call void @__kmpc_push_num_threads(%struct.ident_t* nonnull @1, i32 %0, i32 %1)
726  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
727  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
728  ret void
729}
730
731define internal void @.omp_outlined..34(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
732entry:
733  %0 = load i32, i32* %a, align 4
734  call void @use(i32 %0)
735  ret void
736}
737
738define internal void @.omp_outlined..35(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
739entry:
740  %0 = load i32, i32* %a, align 4
741  call void @use(i32 %0)
742  ret void
743}
744
745define internal void @.omp_outlined..36(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
746entry:
747  %0 = load i32, i32* %a, align 4
748  call void @use(i32 %0)
749  ret void
750}
751
752define dso_local void @merge_2_unmergable_1(i32 %a) local_unnamed_addr  {
753entry:
754  %a.addr = alloca i32, align 4
755  store i32 %a, i32* %a.addr, align 4
756  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..37 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
757  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..38 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
758  call void (...) @foo()
759  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
760  ret void
761}
762
763define internal void @.omp_outlined..37(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
764entry:
765  %0 = load i32, i32* %a, align 4
766  call void @use(i32 %0)
767  ret void
768}
769
770define internal void @.omp_outlined..38(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
771entry:
772  %0 = load i32, i32* %a, align 4
773  call void @use(i32 %0)
774  ret void
775}
776
777define internal void @.omp_outlined..39(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
778entry:
779  %0 = load i32, i32* %a, align 4
780  call void @use(i32 %0)
781  ret void
782}
783
784
785!llvm.module.flags = !{!0, !3}
786
787!0 = !{i32 1, !"wchar_size", i32 4}
788!1 = !{!2}
789!2 = !{i64 2, i64 -1, i64 -1, i1 true}
790!3 = !{i32 7, !"openmp", i32 50}
791; CHECK-LABEL: define {{[^@]+}}@merge
792; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
793; CHECK-NEXT:  entry:
794; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
795; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
796; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
797; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
798; CHECK:       omp_parallel:
799; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
800; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
801; CHECK:       omp.par.outlined.exit:
802; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
803; CHECK:       omp.par.exit.split:
804; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
805; CHECK:       entry.split.split:
806; CHECK-NEXT:    ret void
807; CHECK-LABEL: define {{[^@]+}}@merge..omp_par
808; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0:[0-9]+]] {
809; CHECK-NEXT:  omp.par.entry:
810; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
811; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
812; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
813; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
814; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
815; CHECK:       omp.par.outlined.exit.exitStub:
816; CHECK-NEXT:    ret void
817; CHECK:       omp.par.region:
818; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
819; CHECK:       omp.par.merged:
820; CHECK-NEXT:    call void @.omp_outlined.(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
821; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
822; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]])
823; CHECK-NEXT:    call void @.omp_outlined..1(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
824; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
825; CHECK:       entry.split:
826; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
827; CHECK:       omp.par.region.split:
828; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
829; CHECK:       omp.par.pre_finalize:
830; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
831; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
832; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
833; CHECK-NEXT:  entry:
834; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
835; CHECK-NEXT:    call void @use(i32 [[TMP0]])
836; CHECK-NEXT:    ret void
837; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
838; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
839; CHECK-NEXT:  entry:
840; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
841; CHECK-NEXT:    call void @use(i32 [[TMP0]])
842; CHECK-NEXT:    ret void
843; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind
844; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
845; CHECK-NEXT:  entry:
846; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
847; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
848; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
849; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
850; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
851; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
852; CHECK-NEXT:    ret void
853; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
854; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
855; CHECK-NEXT:  entry:
856; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
857; CHECK-NEXT:    call void @use(i32 [[TMP0]])
858; CHECK-NEXT:    ret void
859; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3
860; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
861; CHECK-NEXT:  entry:
862; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
863; CHECK-NEXT:    call void @use(i32 [[TMP0]])
864; CHECK-NEXT:    ret void
865; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads
866; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
867; CHECK-NEXT:  entry:
868; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
869; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
870; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
871; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
872; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
873; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
874; CHECK-NEXT:    ret void
875; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4
876; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
877; CHECK-NEXT:  entry:
878; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
879; CHECK-NEXT:    call void @use(i32 [[TMP0]])
880; CHECK-NEXT:    ret void
881; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5
882; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
883; CHECK-NEXT:  entry:
884; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
885; CHECK-NEXT:    call void @use(i32 [[TMP0]])
886; CHECK-NEXT:    ret void
887; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call
888; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
889; CHECK-NEXT:  entry:
890; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
891; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
892; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
893; CHECK-NEXT:    call void (...) @foo()
894; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
895; CHECK-NEXT:    ret void
896; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6
897; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
898; CHECK-NEXT:  entry:
899; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
900; CHECK-NEXT:    call void @use(i32 [[TMP0]])
901; CHECK-NEXT:    ret void
902; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7
903; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
904; CHECK-NEXT:  entry:
905; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
906; CHECK-NEXT:    call void @use(i32 [[TMP0]])
907; CHECK-NEXT:    ret void
908; CHECK-LABEL: define {{[^@]+}}@merge_seq
909; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
910; CHECK-NEXT:  entry:
911; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
912; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
913; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
914; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
915; CHECK:       omp_parallel:
916; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
917; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
918; CHECK:       omp.par.outlined.exit:
919; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
920; CHECK:       omp.par.exit.split:
921; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
922; CHECK:       entry.split.split:
923; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
924; CHECK-NEXT:    call void @use(i32 [[TMP0]])
925; CHECK-NEXT:    ret void
926; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par
927; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
928; CHECK-NEXT:  omp.par.entry:
929; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
930; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
931; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
932; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
933; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
934; CHECK:       omp.par.outlined.exit.exitStub:
935; CHECK-NEXT:    ret void
936; CHECK:       omp.par.region:
937; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
938; CHECK:       omp.par.merged:
939; CHECK-NEXT:    call void @.omp_outlined..8(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
940; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
941; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
942; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
943; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
944; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
945; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
946; CHECK:       omp_region.end:
947; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
948; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
949; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
950; CHECK:       omp.par.merged.split.split:
951; CHECK-NEXT:    call void @.omp_outlined..9(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
952; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
953; CHECK:       entry.split:
954; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
955; CHECK:       omp.par.region.split:
956; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
957; CHECK:       omp.par.pre_finalize:
958; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
959; CHECK:       omp_region.body:
960; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
961; CHECK:       seq.par.merged:
962; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
963; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
964; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
965; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
966; CHECK:       omp.par.merged.split:
967; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
968; CHECK:       omp_region.body.split:
969; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
970; CHECK-NEXT:    br label [[OMP_REGION_END]]
971; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8
972; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
973; CHECK-NEXT:  entry:
974; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
975; CHECK-NEXT:    call void @use(i32 [[TMP0]])
976; CHECK-NEXT:    ret void
977; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9
978; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
979; CHECK-NEXT:  entry:
980; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
981; CHECK-NEXT:    call void @use(i32 [[TMP0]])
982; CHECK-NEXT:    ret void
983; CHECK-LABEL: define {{[^@]+}}@merge_seq_float
984; CHECK-SAME: (float [[F:%.*]], float* nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
985; CHECK-NEXT:  entry:
986; CHECK-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
987; CHECK-NEXT:    store float [[F]], float* [[F_ADDR]], align 4
988; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
989; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
990; CHECK:       omp_parallel:
991; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*, float*)* @merge_seq_float..omp_par to void (i32*, i32*, ...)*), float* [[F_ADDR]], float* [[P]])
992; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
993; CHECK:       omp.par.outlined.exit:
994; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
995; CHECK:       omp.par.exit.split:
996; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
997; CHECK:       entry.split.split:
998; CHECK-NEXT:    ret void
999; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
1000; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], float* [[F_ADDR:%.*]], float* [[P:%.*]]) #[[ATTR0]] {
1001; CHECK-NEXT:  omp.par.entry:
1002; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1003; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1004; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1005; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1006; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1007; CHECK:       omp.par.outlined.exit.exitStub:
1008; CHECK-NEXT:    ret void
1009; CHECK:       omp.par.region:
1010; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1011; CHECK:       omp.par.merged:
1012; CHECK-NEXT:    call void @.omp_outlined..10(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
1013; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1014; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1015; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1016; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1017; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1018; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1019; CHECK:       omp_region.end:
1020; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1021; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1022; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1023; CHECK:       omp.par.merged.split.split:
1024; CHECK-NEXT:    call void @.omp_outlined..11(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
1025; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1026; CHECK:       entry.split:
1027; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1028; CHECK:       omp.par.region.split:
1029; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1030; CHECK:       omp.par.pre_finalize:
1031; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1032; CHECK:       omp_region.body:
1033; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1034; CHECK:       seq.par.merged:
1035; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[F_ADDR]], align 4
1036; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000
1037; CHECK-NEXT:    store float [[ADD]], float* [[P]], align 4
1038; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1039; CHECK:       omp.par.merged.split:
1040; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1041; CHECK:       omp_region.body.split:
1042; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1043; CHECK-NEXT:    br label [[OMP_REGION_END]]
1044; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10
1045; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
1046; CHECK-NEXT:  entry:
1047; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
1048; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
1049; CHECK-NEXT:    call void @use(i32 [[CONV]])
1050; CHECK-NEXT:    ret void
1051; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11
1052; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
1053; CHECK-NEXT:  entry:
1054; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
1055; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
1056; CHECK-NEXT:    call void @use(i32 [[CONV]])
1057; CHECK-NEXT:    ret void
1058; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate
1059; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1060; CHECK-NEXT:  entry:
1061; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
1062; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1063; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1064; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1065; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1066; CHECK:       omp_parallel:
1067; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64*)* @merge_seq_firstprivate..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]])
1068; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1069; CHECK:       omp.par.outlined.exit:
1070; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1071; CHECK:       omp.par.exit.split:
1072; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1073; CHECK:       entry.split.split:
1074; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
1075; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1076; CHECK-NEXT:    ret void
1077; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
1078; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
1079; CHECK-NEXT:  omp.par.entry:
1080; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1081; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1082; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1083; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1084; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1085; CHECK:       omp.par.outlined.exit.exitStub:
1086; CHECK-NEXT:    ret void
1087; CHECK:       omp.par.region:
1088; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1089; CHECK:       omp.par.merged:
1090; CHECK-NEXT:    call void @.omp_outlined..12(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1091; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1092; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1093; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1094; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1095; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1096; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1097; CHECK:       omp_region.end:
1098; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1099; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1100; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1101; CHECK:       omp.par.merged.split.split:
1102; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
1103; CHECK-NEXT:    call void @.omp_outlined..13(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
1104; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1105; CHECK:       entry.split:
1106; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1107; CHECK:       omp.par.region.split:
1108; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1109; CHECK:       omp.par.pre_finalize:
1110; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1111; CHECK:       omp_region.body:
1112; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1113; CHECK:       seq.par.merged:
1114; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
1115; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
1116; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
1117; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
1118; CHECK-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
1119; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1120; CHECK:       omp.par.merged.split:
1121; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1122; CHECK:       omp_region.body.split:
1123; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1124; CHECK-NEXT:    br label [[OMP_REGION_END]]
1125; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12
1126; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1127; CHECK-NEXT:  entry:
1128; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1129; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1130; CHECK-NEXT:    ret void
1131; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13
1132; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
1133; CHECK-NEXT:  entry:
1134; CHECK-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
1135; CHECK-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
1136; CHECK-NEXT:    ret void
1137; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt
1138; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1139; CHECK-NEXT:  entry:
1140; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1141; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1142; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1143; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1144; CHECK:       omp_parallel:
1145; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq_sink_lt..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
1146; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1147; CHECK:       omp.par.outlined.exit:
1148; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1149; CHECK:       omp.par.exit.split:
1150; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1151; CHECK:       entry.split.split:
1152; CHECK-NEXT:    ret void
1153; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
1154; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
1155; CHECK-NEXT:  omp.par.entry:
1156; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
1157; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1158; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1159; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1160; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1161; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1162; CHECK:       omp.par.outlined.exit.exitStub:
1163; CHECK-NEXT:    ret void
1164; CHECK:       omp.par.region:
1165; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1166; CHECK:       omp.par.merged:
1167; CHECK-NEXT:    call void @.omp_outlined..14(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1168; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1169; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1170; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1171; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1172; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1173; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1174; CHECK:       omp_region.end:
1175; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1176; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1177; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1178; CHECK:       omp.par.merged.split.split:
1179; CHECK-NEXT:    call void @.omp_outlined..15(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1180; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1181; CHECK:       entry.split:
1182; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1183; CHECK:       omp.par.region.split:
1184; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1185; CHECK:       omp.par.pre_finalize:
1186; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1187; CHECK:       omp_region.body:
1188; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1189; CHECK:       seq.par.merged:
1190; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
1191; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
1192; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[B]] to i64
1193; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
1194; CHECK-NEXT:    store i32 [[TMP5]], i32* [[B]], align 4
1195; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
1196; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1197; CHECK:       omp.par.merged.split:
1198; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1199; CHECK:       omp_region.body.split:
1200; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1201; CHECK-NEXT:    br label [[OMP_REGION_END]]
1202; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14
1203; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1204; CHECK-NEXT:  entry:
1205; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1206; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1207; CHECK-NEXT:    ret void
1208; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15
1209; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1210; CHECK-NEXT:  entry:
1211; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1212; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1213; CHECK-NEXT:    ret void
1214; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use
1215; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1216; CHECK-NEXT:  entry:
1217; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1218; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
1219; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1220; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1221; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1222; CHECK:       omp_parallel:
1223; CHECK-NEXT:    [[LT_CAST3:%.*]] = bitcast i32* [[B]] to i8*
1224; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]])
1225; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_seq_par_use..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[B]])
1226; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1227; CHECK:       omp.par.outlined.exit:
1228; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1229; CHECK:       omp.par.exit.split:
1230; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1231; CHECK:       entry.split.split:
1232; CHECK-NEXT:    [[LT_CAST:%.*]] = bitcast i32* [[B]] to i8*
1233; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[LT_CAST]])
1234; CHECK-NEXT:    ret void
1235; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
1236; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[B:%.*]]) #[[ATTR0]] {
1237; CHECK-NEXT:  omp.par.entry:
1238; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1239; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1240; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1241; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1242; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1243; CHECK:       omp.par.outlined.exit.exitStub:
1244; CHECK-NEXT:    ret void
1245; CHECK:       omp.par.region:
1246; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1247; CHECK:       omp.par.merged:
1248; CHECK-NEXT:    call void @.omp_outlined..16(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1249; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1250; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1251; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1252; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1253; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1254; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1255; CHECK:       omp_region.end:
1256; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1257; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1258; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1259; CHECK:       omp.par.merged.split.split:
1260; CHECK-NEXT:    call void @.omp_outlined..17(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B]])
1261; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1262; CHECK:       entry.split:
1263; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1264; CHECK:       omp.par.region.split:
1265; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1266; CHECK:       omp.par.pre_finalize:
1267; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1268; CHECK:       omp_region.body:
1269; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1270; CHECK:       seq.par.merged:
1271; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
1272; CHECK-NEXT:    [[TMP4:%.*]] = load i32, i32* [[A_ADDR]], align 4
1273; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
1274; CHECK-NEXT:    store i32 [[ADD]], i32* [[B]], align 4
1275; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1276; CHECK:       omp.par.merged.split:
1277; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1278; CHECK:       omp_region.body.split:
1279; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1280; CHECK-NEXT:    br label [[OMP_REGION_END]]
1281; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16
1282; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1283; CHECK-NEXT:  entry:
1284; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1285; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1286; CHECK-NEXT:    ret void
1287; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17
1288; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
1289; CHECK-NEXT:  entry:
1290; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1291; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1292; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4
1293; CHECK-NEXT:    call void @use(i32 [[TMP1]])
1294; CHECK-NEXT:    ret void
1295; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions
1296; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
1297; CHECK-NEXT:  entry:
1298; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
1299; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
1300; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
1301; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
1302; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1303; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1304; CHECK:       omp_parallel:
1305; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
1306; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1307; CHECK:       omp.par.outlined.exit:
1308; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1309; CHECK:       omp.par.exit.split:
1310; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1311; CHECK:       entry.split.split:
1312; CHECK-NEXT:    ret void
1313; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
1314; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
1315; CHECK-NEXT:  omp.par.entry:
1316; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1317; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1318; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1319; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1320; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1321; CHECK:       omp.par.outlined.exit.exitStub:
1322; CHECK-NEXT:    ret void
1323; CHECK:       omp.par.region:
1324; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1325; CHECK:       omp.par.merged:
1326; CHECK-NEXT:    call void @.omp_outlined..18(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
1327; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1328; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1329; CHECK-NEXT:    call void @.omp_outlined..19(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
1330; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1331; CHECK:       entry.split:
1332; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1333; CHECK:       omp.par.region.split:
1334; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1335; CHECK:       omp.par.pre_finalize:
1336; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1337; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18
1338; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
1339; CHECK-NEXT:  entry:
1340; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
1341; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1342; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1343; CHECK:       if.then:
1344; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
1345; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1346; CHECK-NEXT:    ret void
1347; CHECK:       if.end:
1348; CHECK-NEXT:    ret void
1349; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19
1350; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
1351; CHECK-NEXT:  entry:
1352; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
1353; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1354; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1355; CHECK:       if.then:
1356; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
1357; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1358; CHECK-NEXT:    ret void
1359; CHECK:       if.end:
1360; CHECK-NEXT:    ret void
1361; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
1362; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
1363; CHECK-NEXT:  entry:
1364; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
1365; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
1366; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
1367; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
1368; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1369; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1370; CHECK:       omp_parallel:
1371; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions_seq..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
1372; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1373; CHECK:       omp.par.outlined.exit:
1374; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1375; CHECK:       omp.par.exit.split:
1376; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1377; CHECK:       entry.split.split:
1378; CHECK-NEXT:    ret void
1379; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
1380; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
1381; CHECK-NEXT:  omp.par.entry:
1382; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1383; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1384; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1385; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1386; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1387; CHECK:       omp.par.outlined.exit.exitStub:
1388; CHECK-NEXT:    ret void
1389; CHECK:       omp.par.region:
1390; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1391; CHECK:       omp.par.merged:
1392; CHECK-NEXT:    call void @.omp_outlined..20(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
1393; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1394; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1395; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1396; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1397; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1398; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1399; CHECK:       omp_region.end:
1400; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1401; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1402; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1403; CHECK:       omp.par.merged.split.split:
1404; CHECK-NEXT:    call void @.omp_outlined..21(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
1405; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1406; CHECK:       entry.split:
1407; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1408; CHECK:       omp.par.region.split:
1409; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1410; CHECK:       omp.par.pre_finalize:
1411; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1412; CHECK:       omp_region.body:
1413; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1414; CHECK:       seq.par.merged:
1415; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[CANCEL1_ADDR]], align 4
1416; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
1417; CHECK-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
1418; CHECK-NEXT:    store i32 [[LNOT_EXT]], i32* [[CANCEL2_ADDR]], align 4
1419; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1420; CHECK:       omp.par.merged.split:
1421; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1422; CHECK:       omp_region.body.split:
1423; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1424; CHECK-NEXT:    br label [[OMP_REGION_END]]
1425; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20
1426; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
1427; CHECK-NEXT:  entry:
1428; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
1429; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1430; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1431; CHECK:       if.then:
1432; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
1433; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1434; CHECK-NEXT:    ret void
1435; CHECK:       if.end:
1436; CHECK-NEXT:    ret void
1437; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21
1438; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
1439; CHECK-NEXT:  entry:
1440; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
1441; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1442; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1443; CHECK:       if.then:
1444; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
1445; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1446; CHECK-NEXT:    ret void
1447; CHECK:       if.end:
1448; CHECK-NEXT:    ret void
1449; CHECK-LABEL: define {{[^@]+}}@merge_3
1450; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1451; CHECK-NEXT:  entry:
1452; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1453; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1454; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1455; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1456; CHECK:       omp_parallel:
1457; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_3..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
1458; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1459; CHECK:       omp.par.outlined.exit:
1460; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1461; CHECK:       omp.par.exit.split:
1462; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1463; CHECK:       entry.split.split:
1464; CHECK-NEXT:    ret void
1465; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par
1466; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
1467; CHECK-NEXT:  omp.par.entry:
1468; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1469; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1470; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1471; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1472; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1473; CHECK:       omp.par.outlined.exit.exitStub:
1474; CHECK-NEXT:    ret void
1475; CHECK:       omp.par.region:
1476; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1477; CHECK:       omp.par.merged:
1478; CHECK-NEXT:    call void @.omp_outlined..22(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1479; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1480; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1481; CHECK-NEXT:    call void @.omp_outlined..23(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1482; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1483; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1484; CHECK-NEXT:    call void @.omp_outlined..24(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1485; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1486; CHECK:       entry.split:
1487; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1488; CHECK:       omp.par.region.split:
1489; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1490; CHECK:       omp.par.pre_finalize:
1491; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1492; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22
1493; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1494; CHECK-NEXT:  entry:
1495; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1496; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1497; CHECK-NEXT:    ret void
1498; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23
1499; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1500; CHECK-NEXT:  entry:
1501; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1502; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1503; CHECK-NEXT:    ret void
1504; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24
1505; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1506; CHECK-NEXT:  entry:
1507; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1508; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1509; CHECK-NEXT:    ret void
1510; CHECK-LABEL: define {{[^@]+}}@merge_3_seq
1511; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
1512; CHECK-NEXT:  entry:
1513; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
1514; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
1515; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1516; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1517; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1518; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1519; CHECK:       omp_parallel:
1520; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32*)* @merge_3_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]])
1521; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1522; CHECK:       omp.par.outlined.exit:
1523; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1524; CHECK:       omp.par.exit.split:
1525; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1526; CHECK:       entry.split.split:
1527; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
1528; CHECK-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
1529; CHECK-NEXT:    ret void
1530; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
1531; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[ADD_SEQ_OUTPUT_ALLOC:%.*]], i32* [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
1532; CHECK-NEXT:  omp.par.entry:
1533; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1534; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1535; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1536; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1537; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1538; CHECK:       omp.par.outlined.exit.exitStub:
1539; CHECK-NEXT:    ret void
1540; CHECK:       omp.par.region:
1541; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1542; CHECK:       omp.par.merged:
1543; CHECK-NEXT:    call void @.omp_outlined..25(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1544; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1545; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1546; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1547; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1548; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1549; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1550; CHECK:       omp_region.end:
1551; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1552; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1553; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1554; CHECK:       omp.par.merged.split.split:
1555; CHECK-NEXT:    call void @.omp_outlined..26(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1556; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1557; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
1558; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1559; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
1560; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
1561; CHECK-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
1562; CHECK:       omp_region.end4:
1563; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1564; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
1565; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
1566; CHECK:       omp.par.merged.split.split.split.split:
1567; CHECK-NEXT:    call void @.omp_outlined..27(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1568; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1569; CHECK:       entry.split:
1570; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1571; CHECK:       omp.par.region.split:
1572; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1573; CHECK:       omp.par.pre_finalize:
1574; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1575; CHECK:       omp_region.body5:
1576; CHECK-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
1577; CHECK:       seq.par.merged2:
1578; CHECK-NEXT:    [[TMP5:%.*]] = load i32, i32* [[A_ADDR]], align 4
1579; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
1580; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]]
1581; CHECK-NEXT:    store i32 [[ADD1]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
1582; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
1583; CHECK:       omp.par.merged.split.split.split:
1584; CHECK-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
1585; CHECK:       omp_region.body5.split:
1586; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
1587; CHECK-NEXT:    br label [[OMP_REGION_END4]]
1588; CHECK:       omp_region.body:
1589; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1590; CHECK:       seq.par.merged:
1591; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[A_ADDR]], align 4
1592; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], 1
1593; CHECK-NEXT:    store i32 [[ADD]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
1594; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1595; CHECK:       omp.par.merged.split:
1596; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1597; CHECK:       omp_region.body.split:
1598; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1599; CHECK-NEXT:    br label [[OMP_REGION_END]]
1600; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25
1601; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1602; CHECK-NEXT:  entry:
1603; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1604; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1605; CHECK-NEXT:    ret void
1606; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26
1607; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1608; CHECK-NEXT:  entry:
1609; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1610; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1611; CHECK-NEXT:    ret void
1612; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27
1613; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1614; CHECK-NEXT:  entry:
1615; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1616; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1617; CHECK-NEXT:    ret void
1618; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call
1619; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1620; CHECK-NEXT:  entry:
1621; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1622; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1623; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1624; CHECK-NEXT:    call void (...) @foo()
1625; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1626; CHECK-NEXT:    call void (...) @foo()
1627; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1628; CHECK-NEXT:    ret void
1629; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28
1630; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1631; CHECK-NEXT:  entry:
1632; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1633; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1634; CHECK-NEXT:    ret void
1635; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29
1636; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1637; CHECK-NEXT:  entry:
1638; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1639; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1640; CHECK-NEXT:    ret void
1641; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30
1642; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1643; CHECK-NEXT:  entry:
1644; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1645; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1646; CHECK-NEXT:    ret void
1647; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
1648; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1649; CHECK-NEXT:  entry:
1650; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1651; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
1652; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1653; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1654; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
1655; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1656; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1657; CHECK-NEXT:    ret void
1658; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31
1659; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1660; CHECK-NEXT:  entry:
1661; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1662; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1663; CHECK-NEXT:    ret void
1664; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32
1665; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1666; CHECK-NEXT:  entry:
1667; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1668; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1669; CHECK-NEXT:    ret void
1670; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33
1671; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1672; CHECK-NEXT:  entry:
1673; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1674; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1675; CHECK-NEXT:    ret void
1676; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads
1677; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1678; CHECK-NEXT:  entry:
1679; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1680; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
1681; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1682; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1683; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
1684; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]])
1685; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1686; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1687; CHECK-NEXT:    ret void
1688; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34
1689; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1690; CHECK-NEXT:  entry:
1691; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1692; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1693; CHECK-NEXT:    ret void
1694; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35
1695; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1696; CHECK-NEXT:  entry:
1697; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1698; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1699; CHECK-NEXT:    ret void
1700; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36
1701; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1702; CHECK-NEXT:  entry:
1703; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1704; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1705; CHECK-NEXT:    ret void
1706; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1
1707; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1708; CHECK-NEXT:  entry:
1709; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1710; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1711; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1712; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1713; CHECK:       omp_parallel:
1714; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_2_unmergable_1..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
1715; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1716; CHECK:       omp.par.outlined.exit:
1717; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1718; CHECK:       omp.par.exit.split:
1719; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1720; CHECK:       entry.split.split:
1721; CHECK-NEXT:    call void (...) @foo()
1722; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1723; CHECK-NEXT:    ret void
1724; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
1725; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
1726; CHECK-NEXT:  omp.par.entry:
1727; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1728; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1729; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1730; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1731; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1732; CHECK:       omp.par.outlined.exit.exitStub:
1733; CHECK-NEXT:    ret void
1734; CHECK:       omp.par.region:
1735; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1736; CHECK:       omp.par.merged:
1737; CHECK-NEXT:    call void @.omp_outlined..37(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1738; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1739; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1740; CHECK-NEXT:    call void @.omp_outlined..38(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1741; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1742; CHECK:       entry.split:
1743; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1744; CHECK:       omp.par.region.split:
1745; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1746; CHECK:       omp.par.pre_finalize:
1747; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1748; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37
1749; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1750; CHECK-NEXT:  entry:
1751; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1752; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1753; CHECK-NEXT:    ret void
1754; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38
1755; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1756; CHECK-NEXT:  entry:
1757; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1758; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1759; CHECK-NEXT:    ret void
1760; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39
1761; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1762; CHECK-NEXT:  entry:
1763; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1764; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1765; CHECK-NEXT:    ret void
1766; CHECK-LABEL: define {{[^@]+}}@merge
1767; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1768; CHECK-NEXT:  entry:
1769; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1770; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1771; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1772; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1773; CHECK:       omp_parallel:
1774; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
1775; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1776; CHECK:       omp.par.outlined.exit:
1777; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1778; CHECK:       omp.par.exit.split:
1779; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1780; CHECK:       entry.split.split:
1781; CHECK-NEXT:    ret void
1782; CHECK-LABEL: define {{[^@]+}}@merge..omp_par
1783; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
1784; CHECK-NEXT:  omp.par.entry:
1785; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1786; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1787; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1788; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1789; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1790; CHECK:       omp.par.outlined.exit.exitStub:
1791; CHECK-NEXT:    ret void
1792; CHECK:       omp.par.region:
1793; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1794; CHECK:       omp.par.merged:
1795; CHECK-NEXT:    call void @.omp_outlined.(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1796; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1797; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1798; CHECK-NEXT:    call void @.omp_outlined..1(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1799; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1800; CHECK:       entry.split:
1801; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1802; CHECK:       omp.par.region.split:
1803; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1804; CHECK:       omp.par.pre_finalize:
1805; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1806; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
1807; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1808; CHECK-NEXT:  entry:
1809; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1810; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1811; CHECK-NEXT:    ret void
1812; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
1813; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1814; CHECK-NEXT:  entry:
1815; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1816; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1817; CHECK-NEXT:    ret void
1818; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind
1819; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1820; CHECK-NEXT:  entry:
1821; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1822; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
1823; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1824; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
1825; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1826; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1827; CHECK-NEXT:    ret void
1828; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
1829; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1830; CHECK-NEXT:  entry:
1831; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1832; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1833; CHECK-NEXT:    ret void
1834; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3
1835; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1836; CHECK-NEXT:  entry:
1837; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1838; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1839; CHECK-NEXT:    ret void
1840; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads
1841; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1842; CHECK-NEXT:  entry:
1843; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1844; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
1845; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1846; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
1847; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1848; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1849; CHECK-NEXT:    ret void
1850; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4
1851; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1852; CHECK-NEXT:  entry:
1853; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1854; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1855; CHECK-NEXT:    ret void
1856; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5
1857; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1858; CHECK-NEXT:  entry:
1859; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1860; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1861; CHECK-NEXT:    ret void
1862; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call
1863; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1864; CHECK-NEXT:  entry:
1865; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1866; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1867; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1868; CHECK-NEXT:    call void (...) @foo()
1869; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1870; CHECK-NEXT:    ret void
1871; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6
1872; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1873; CHECK-NEXT:  entry:
1874; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1875; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1876; CHECK-NEXT:    ret void
1877; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7
1878; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1879; CHECK-NEXT:  entry:
1880; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1881; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1882; CHECK-NEXT:    ret void
1883; CHECK-LABEL: define {{[^@]+}}@merge_seq
1884; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1885; CHECK-NEXT:  entry:
1886; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1887; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1888; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1889; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1890; CHECK:       omp_parallel:
1891; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
1892; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1893; CHECK:       omp.par.outlined.exit:
1894; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1895; CHECK:       omp.par.exit.split:
1896; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1897; CHECK:       entry.split.split:
1898; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
1899; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1900; CHECK-NEXT:    ret void
1901; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par
1902; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
1903; CHECK-NEXT:  omp.par.entry:
1904; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1905; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1906; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1907; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1908; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1909; CHECK:       omp.par.outlined.exit.exitStub:
1910; CHECK-NEXT:    ret void
1911; CHECK:       omp.par.region:
1912; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1913; CHECK:       omp.par.merged:
1914; CHECK-NEXT:    call void @.omp_outlined..8(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1915; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1916; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1917; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1918; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1919; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1920; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1921; CHECK:       omp_region.end:
1922; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1923; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1924; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1925; CHECK:       omp.par.merged.split.split:
1926; CHECK-NEXT:    call void @.omp_outlined..9(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1927; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1928; CHECK:       entry.split:
1929; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1930; CHECK:       omp.par.region.split:
1931; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1932; CHECK:       omp.par.pre_finalize:
1933; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1934; CHECK:       omp_region.body:
1935; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1936; CHECK:       seq.par.merged:
1937; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
1938; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
1939; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
1940; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1941; CHECK:       omp.par.merged.split:
1942; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1943; CHECK:       omp_region.body.split:
1944; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1945; CHECK-NEXT:    br label [[OMP_REGION_END]]
1946; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8
1947; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1948; CHECK-NEXT:  entry:
1949; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1950; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1951; CHECK-NEXT:    ret void
1952; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9
1953; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1954; CHECK-NEXT:  entry:
1955; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1956; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1957; CHECK-NEXT:    ret void
1958; CHECK-LABEL: define {{[^@]+}}@merge_seq_float
1959; CHECK-SAME: (float [[F:%.*]], float* nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
1960; CHECK-NEXT:  entry:
1961; CHECK-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
1962; CHECK-NEXT:    store float [[F]], float* [[F_ADDR]], align 4
1963; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1964; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1965; CHECK:       omp_parallel:
1966; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*, float*)* @merge_seq_float..omp_par to void (i32*, i32*, ...)*), float* [[F_ADDR]], float* [[P]])
1967; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1968; CHECK:       omp.par.outlined.exit:
1969; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1970; CHECK:       omp.par.exit.split:
1971; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1972; CHECK:       entry.split.split:
1973; CHECK-NEXT:    ret void
1974; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
1975; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], float* [[F_ADDR:%.*]], float* [[P:%.*]]) #[[ATTR0]] {
1976; CHECK-NEXT:  omp.par.entry:
1977; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1978; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1979; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1980; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1981; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1982; CHECK:       omp.par.outlined.exit.exitStub:
1983; CHECK-NEXT:    ret void
1984; CHECK:       omp.par.region:
1985; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1986; CHECK:       omp.par.merged:
1987; CHECK-NEXT:    call void @.omp_outlined..10(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
1988; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1989; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1990; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1991; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1992; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1993; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1994; CHECK:       omp_region.end:
1995; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1996; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1997; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1998; CHECK:       omp.par.merged.split.split:
1999; CHECK-NEXT:    call void @.omp_outlined..11(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
2000; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2001; CHECK:       entry.split:
2002; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2003; CHECK:       omp.par.region.split:
2004; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2005; CHECK:       omp.par.pre_finalize:
2006; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2007; CHECK:       omp_region.body:
2008; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2009; CHECK:       seq.par.merged:
2010; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[F_ADDR]], align 4
2011; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000
2012; CHECK-NEXT:    store float [[ADD]], float* [[P]], align 4
2013; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2014; CHECK:       omp.par.merged.split:
2015; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2016; CHECK:       omp_region.body.split:
2017; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2018; CHECK-NEXT:    br label [[OMP_REGION_END]]
2019; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10
2020; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
2021; CHECK-NEXT:  entry:
2022; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
2023; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
2024; CHECK-NEXT:    call void @use(i32 [[CONV]])
2025; CHECK-NEXT:    ret void
2026; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11
2027; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
2028; CHECK-NEXT:  entry:
2029; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
2030; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
2031; CHECK-NEXT:    call void @use(i32 [[CONV]])
2032; CHECK-NEXT:    ret void
2033; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate
2034; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2035; CHECK-NEXT:  entry:
2036; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
2037; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2038; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2039; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2040; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2041; CHECK:       omp_parallel:
2042; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64*)* @merge_seq_firstprivate..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]])
2043; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2044; CHECK:       omp.par.outlined.exit:
2045; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2046; CHECK:       omp.par.exit.split:
2047; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2048; CHECK:       entry.split.split:
2049; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
2050; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2051; CHECK-NEXT:    ret void
2052; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
2053; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
2054; CHECK-NEXT:  omp.par.entry:
2055; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2056; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2057; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2058; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2059; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2060; CHECK:       omp.par.outlined.exit.exitStub:
2061; CHECK-NEXT:    ret void
2062; CHECK:       omp.par.region:
2063; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2064; CHECK:       omp.par.merged:
2065; CHECK-NEXT:    call void @.omp_outlined..12(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2066; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2067; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2068; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2069; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2070; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2071; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2072; CHECK:       omp_region.end:
2073; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2074; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2075; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2076; CHECK:       omp.par.merged.split.split:
2077; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
2078; CHECK-NEXT:    call void @.omp_outlined..13(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
2079; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2080; CHECK:       entry.split:
2081; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2082; CHECK:       omp.par.region.split:
2083; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2084; CHECK:       omp.par.pre_finalize:
2085; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2086; CHECK:       omp_region.body:
2087; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2088; CHECK:       seq.par.merged:
2089; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
2090; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
2091; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
2092; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
2093; CHECK-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
2094; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2095; CHECK:       omp.par.merged.split:
2096; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2097; CHECK:       omp_region.body.split:
2098; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2099; CHECK-NEXT:    br label [[OMP_REGION_END]]
2100; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12
2101; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2102; CHECK-NEXT:  entry:
2103; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2104; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2105; CHECK-NEXT:    ret void
2106; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13
2107; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
2108; CHECK-NEXT:  entry:
2109; CHECK-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
2110; CHECK-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
2111; CHECK-NEXT:    ret void
2112; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt
2113; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2114; CHECK-NEXT:  entry:
2115; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2116; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2117; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2118; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2119; CHECK:       omp_parallel:
2120; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq_sink_lt..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
2121; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2122; CHECK:       omp.par.outlined.exit:
2123; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2124; CHECK:       omp.par.exit.split:
2125; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2126; CHECK:       entry.split.split:
2127; CHECK-NEXT:    ret void
2128; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
2129; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
2130; CHECK-NEXT:  omp.par.entry:
2131; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
2132; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2133; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2134; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2135; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2136; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2137; CHECK:       omp.par.outlined.exit.exitStub:
2138; CHECK-NEXT:    ret void
2139; CHECK:       omp.par.region:
2140; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2141; CHECK:       omp.par.merged:
2142; CHECK-NEXT:    call void @.omp_outlined..14(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2143; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2144; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2145; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2146; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2147; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2148; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2149; CHECK:       omp_region.end:
2150; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2151; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2152; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2153; CHECK:       omp.par.merged.split.split:
2154; CHECK-NEXT:    call void @.omp_outlined..15(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2155; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2156; CHECK:       entry.split:
2157; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2158; CHECK:       omp.par.region.split:
2159; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2160; CHECK:       omp.par.pre_finalize:
2161; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2162; CHECK:       omp_region.body:
2163; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2164; CHECK:       seq.par.merged:
2165; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
2166; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
2167; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[B]] to i64
2168; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
2169; CHECK-NEXT:    store i32 [[TMP5]], i32* [[B]], align 4
2170; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
2171; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2172; CHECK:       omp.par.merged.split:
2173; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2174; CHECK:       omp_region.body.split:
2175; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2176; CHECK-NEXT:    br label [[OMP_REGION_END]]
2177; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14
2178; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2179; CHECK-NEXT:  entry:
2180; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2181; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2182; CHECK-NEXT:    ret void
2183; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15
2184; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2185; CHECK-NEXT:  entry:
2186; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2187; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2188; CHECK-NEXT:    ret void
2189; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use
2190; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2191; CHECK-NEXT:  entry:
2192; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2193; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
2194; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2195; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2196; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2197; CHECK:       omp_parallel:
2198; CHECK-NEXT:    [[LT_CAST3:%.*]] = bitcast i32* [[B]] to i8*
2199; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]])
2200; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_seq_par_use..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[B]])
2201; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2202; CHECK:       omp.par.outlined.exit:
2203; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2204; CHECK:       omp.par.exit.split:
2205; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2206; CHECK:       entry.split.split:
2207; CHECK-NEXT:    [[LT_CAST:%.*]] = bitcast i32* [[B]] to i8*
2208; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[LT_CAST]])
2209; CHECK-NEXT:    ret void
2210; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
2211; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[B:%.*]]) #[[ATTR0]] {
2212; CHECK-NEXT:  omp.par.entry:
2213; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2214; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2215; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2216; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2217; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2218; CHECK:       omp.par.outlined.exit.exitStub:
2219; CHECK-NEXT:    ret void
2220; CHECK:       omp.par.region:
2221; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2222; CHECK:       omp.par.merged:
2223; CHECK-NEXT:    call void @.omp_outlined..16(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2224; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2225; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2226; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2227; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2228; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2229; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2230; CHECK:       omp_region.end:
2231; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2232; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2233; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2234; CHECK:       omp.par.merged.split.split:
2235; CHECK-NEXT:    call void @.omp_outlined..17(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B]])
2236; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2237; CHECK:       entry.split:
2238; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2239; CHECK:       omp.par.region.split:
2240; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2241; CHECK:       omp.par.pre_finalize:
2242; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2243; CHECK:       omp_region.body:
2244; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2245; CHECK:       seq.par.merged:
2246; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
2247; CHECK-NEXT:    [[TMP4:%.*]] = load i32, i32* [[A_ADDR]], align 4
2248; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
2249; CHECK-NEXT:    store i32 [[ADD]], i32* [[B]], align 4
2250; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2251; CHECK:       omp.par.merged.split:
2252; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2253; CHECK:       omp_region.body.split:
2254; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2255; CHECK-NEXT:    br label [[OMP_REGION_END]]
2256; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16
2257; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2258; CHECK-NEXT:  entry:
2259; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2260; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2261; CHECK-NEXT:    ret void
2262; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17
2263; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
2264; CHECK-NEXT:  entry:
2265; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2266; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2267; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4
2268; CHECK-NEXT:    call void @use(i32 [[TMP1]])
2269; CHECK-NEXT:    ret void
2270; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions
2271; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
2272; CHECK-NEXT:  entry:
2273; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
2274; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
2275; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
2276; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
2277; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2278; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2279; CHECK:       omp_parallel:
2280; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
2281; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2282; CHECK:       omp.par.outlined.exit:
2283; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2284; CHECK:       omp.par.exit.split:
2285; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2286; CHECK:       entry.split.split:
2287; CHECK-NEXT:    ret void
2288; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
2289; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
2290; CHECK-NEXT:  omp.par.entry:
2291; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2292; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2293; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2294; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2295; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2296; CHECK:       omp.par.outlined.exit.exitStub:
2297; CHECK-NEXT:    ret void
2298; CHECK:       omp.par.region:
2299; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2300; CHECK:       omp.par.merged:
2301; CHECK-NEXT:    call void @.omp_outlined..18(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
2302; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2303; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2304; CHECK-NEXT:    call void @.omp_outlined..19(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
2305; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2306; CHECK:       entry.split:
2307; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2308; CHECK:       omp.par.region.split:
2309; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2310; CHECK:       omp.par.pre_finalize:
2311; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2312; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18
2313; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
2314; CHECK-NEXT:  entry:
2315; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
2316; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
2317; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
2318; CHECK:       if.then:
2319; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
2320; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
2321; CHECK-NEXT:    ret void
2322; CHECK:       if.end:
2323; CHECK-NEXT:    ret void
2324; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19
2325; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
2326; CHECK-NEXT:  entry:
2327; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
2328; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
2329; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
2330; CHECK:       if.then:
2331; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
2332; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
2333; CHECK-NEXT:    ret void
2334; CHECK:       if.end:
2335; CHECK-NEXT:    ret void
2336; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
2337; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
2338; CHECK-NEXT:  entry:
2339; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
2340; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
2341; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
2342; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
2343; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2344; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2345; CHECK:       omp_parallel:
2346; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions_seq..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
2347; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2348; CHECK:       omp.par.outlined.exit:
2349; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2350; CHECK:       omp.par.exit.split:
2351; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2352; CHECK:       entry.split.split:
2353; CHECK-NEXT:    ret void
2354; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
2355; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
2356; CHECK-NEXT:  omp.par.entry:
2357; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2358; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2359; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2360; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2361; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2362; CHECK:       omp.par.outlined.exit.exitStub:
2363; CHECK-NEXT:    ret void
2364; CHECK:       omp.par.region:
2365; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2366; CHECK:       omp.par.merged:
2367; CHECK-NEXT:    call void @.omp_outlined..20(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
2368; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2369; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2370; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2371; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2372; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2373; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2374; CHECK:       omp_region.end:
2375; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2376; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2377; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2378; CHECK:       omp.par.merged.split.split:
2379; CHECK-NEXT:    call void @.omp_outlined..21(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
2380; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2381; CHECK:       entry.split:
2382; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2383; CHECK:       omp.par.region.split:
2384; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2385; CHECK:       omp.par.pre_finalize:
2386; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2387; CHECK:       omp_region.body:
2388; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2389; CHECK:       seq.par.merged:
2390; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[CANCEL1_ADDR]], align 4
2391; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
2392; CHECK-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
2393; CHECK-NEXT:    store i32 [[LNOT_EXT]], i32* [[CANCEL2_ADDR]], align 4
2394; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2395; CHECK:       omp.par.merged.split:
2396; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2397; CHECK:       omp_region.body.split:
2398; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2399; CHECK-NEXT:    br label [[OMP_REGION_END]]
2400; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20
2401; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
2402; CHECK-NEXT:  entry:
2403; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
2404; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
2405; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
2406; CHECK:       if.then:
2407; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
2408; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
2409; CHECK-NEXT:    ret void
2410; CHECK:       if.end:
2411; CHECK-NEXT:    ret void
2412; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21
2413; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
2414; CHECK-NEXT:  entry:
2415; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
2416; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
2417; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
2418; CHECK:       if.then:
2419; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
2420; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
2421; CHECK-NEXT:    ret void
2422; CHECK:       if.end:
2423; CHECK-NEXT:    ret void
2424; CHECK-LABEL: define {{[^@]+}}@merge_3
2425; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2426; CHECK-NEXT:  entry:
2427; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2428; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2429; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2430; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2431; CHECK:       omp_parallel:
2432; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_3..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
2433; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2434; CHECK:       omp.par.outlined.exit:
2435; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2436; CHECK:       omp.par.exit.split:
2437; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2438; CHECK:       entry.split.split:
2439; CHECK-NEXT:    ret void
2440; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par
2441; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
2442; CHECK-NEXT:  omp.par.entry:
2443; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2444; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2445; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2446; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2447; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2448; CHECK:       omp.par.outlined.exit.exitStub:
2449; CHECK-NEXT:    ret void
2450; CHECK:       omp.par.region:
2451; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2452; CHECK:       omp.par.merged:
2453; CHECK-NEXT:    call void @.omp_outlined..22(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2454; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2455; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2456; CHECK-NEXT:    call void @.omp_outlined..23(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2457; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2458; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2459; CHECK-NEXT:    call void @.omp_outlined..24(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2460; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2461; CHECK:       entry.split:
2462; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2463; CHECK:       omp.par.region.split:
2464; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2465; CHECK:       omp.par.pre_finalize:
2466; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2467; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22
2468; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2469; CHECK-NEXT:  entry:
2470; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2471; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2472; CHECK-NEXT:    ret void
2473; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23
2474; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2475; CHECK-NEXT:  entry:
2476; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2477; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2478; CHECK-NEXT:    ret void
2479; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24
2480; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2481; CHECK-NEXT:  entry:
2482; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2483; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2484; CHECK-NEXT:    ret void
2485; CHECK-LABEL: define {{[^@]+}}@merge_3_seq
2486; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
2487; CHECK-NEXT:  entry:
2488; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
2489; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
2490; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2491; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2492; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2493; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2494; CHECK:       omp_parallel:
2495; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32*)* @merge_3_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]])
2496; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2497; CHECK:       omp.par.outlined.exit:
2498; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2499; CHECK:       omp.par.exit.split:
2500; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2501; CHECK:       entry.split.split:
2502; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
2503; CHECK-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
2504; CHECK-NEXT:    ret void
2505; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
2506; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[ADD_SEQ_OUTPUT_ALLOC:%.*]], i32* [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
2507; CHECK-NEXT:  omp.par.entry:
2508; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2509; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2510; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2511; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2512; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2513; CHECK:       omp.par.outlined.exit.exitStub:
2514; CHECK-NEXT:    ret void
2515; CHECK:       omp.par.region:
2516; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2517; CHECK:       omp.par.merged:
2518; CHECK-NEXT:    call void @.omp_outlined..25(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2519; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2520; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2521; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2522; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2523; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2524; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2525; CHECK:       omp_region.end:
2526; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2527; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2528; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2529; CHECK:       omp.par.merged.split.split:
2530; CHECK-NEXT:    call void @.omp_outlined..26(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2531; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2532; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
2533; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2534; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
2535; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
2536; CHECK-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
2537; CHECK:       omp_region.end4:
2538; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2539; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
2540; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
2541; CHECK:       omp.par.merged.split.split.split.split:
2542; CHECK-NEXT:    call void @.omp_outlined..27(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2543; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2544; CHECK:       entry.split:
2545; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2546; CHECK:       omp.par.region.split:
2547; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2548; CHECK:       omp.par.pre_finalize:
2549; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2550; CHECK:       omp_region.body5:
2551; CHECK-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
2552; CHECK:       seq.par.merged2:
2553; CHECK-NEXT:    [[TMP5:%.*]] = load i32, i32* [[A_ADDR]], align 4
2554; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
2555; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]]
2556; CHECK-NEXT:    store i32 [[ADD1]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
2557; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
2558; CHECK:       omp.par.merged.split.split.split:
2559; CHECK-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
2560; CHECK:       omp_region.body5.split:
2561; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
2562; CHECK-NEXT:    br label [[OMP_REGION_END4]]
2563; CHECK:       omp_region.body:
2564; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2565; CHECK:       seq.par.merged:
2566; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[A_ADDR]], align 4
2567; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], 1
2568; CHECK-NEXT:    store i32 [[ADD]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
2569; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2570; CHECK:       omp.par.merged.split:
2571; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2572; CHECK:       omp_region.body.split:
2573; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2574; CHECK-NEXT:    br label [[OMP_REGION_END]]
2575; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25
2576; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2577; CHECK-NEXT:  entry:
2578; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2579; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2580; CHECK-NEXT:    ret void
2581; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26
2582; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2583; CHECK-NEXT:  entry:
2584; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2585; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2586; CHECK-NEXT:    ret void
2587; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27
2588; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2589; CHECK-NEXT:  entry:
2590; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2591; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2592; CHECK-NEXT:    ret void
2593; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call
2594; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2595; CHECK-NEXT:  entry:
2596; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2597; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2598; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2599; CHECK-NEXT:    call void (...) @foo()
2600; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2601; CHECK-NEXT:    call void (...) @foo()
2602; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2603; CHECK-NEXT:    ret void
2604; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28
2605; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2606; CHECK-NEXT:  entry:
2607; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2608; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2609; CHECK-NEXT:    ret void
2610; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29
2611; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2612; CHECK-NEXT:  entry:
2613; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2614; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2615; CHECK-NEXT:    ret void
2616; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30
2617; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2618; CHECK-NEXT:  entry:
2619; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2620; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2621; CHECK-NEXT:    ret void
2622; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
2623; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2624; CHECK-NEXT:  entry:
2625; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2626; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
2627; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2628; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2629; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
2630; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2631; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2632; CHECK-NEXT:    ret void
2633; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31
2634; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2635; CHECK-NEXT:  entry:
2636; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2637; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2638; CHECK-NEXT:    ret void
2639; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32
2640; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2641; CHECK-NEXT:  entry:
2642; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2643; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2644; CHECK-NEXT:    ret void
2645; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33
2646; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2647; CHECK-NEXT:  entry:
2648; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2649; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2650; CHECK-NEXT:    ret void
2651; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads
2652; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2653; CHECK-NEXT:  entry:
2654; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2655; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
2656; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2657; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2658; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
2659; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]])
2660; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2661; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2662; CHECK-NEXT:    ret void
2663; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34
2664; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2665; CHECK-NEXT:  entry:
2666; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2667; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2668; CHECK-NEXT:    ret void
2669; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35
2670; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2671; CHECK-NEXT:  entry:
2672; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2673; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2674; CHECK-NEXT:    ret void
2675; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36
2676; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2677; CHECK-NEXT:  entry:
2678; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2679; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2680; CHECK-NEXT:    ret void
2681; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1
2682; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2683; CHECK-NEXT:  entry:
2684; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2685; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2686; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2687; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2688; CHECK:       omp_parallel:
2689; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_2_unmergable_1..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
2690; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2691; CHECK:       omp.par.outlined.exit:
2692; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2693; CHECK:       omp.par.exit.split:
2694; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2695; CHECK:       entry.split.split:
2696; CHECK-NEXT:    call void (...) @foo()
2697; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2698; CHECK-NEXT:    ret void
2699; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
2700; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
2701; CHECK-NEXT:  omp.par.entry:
2702; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2703; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2704; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2705; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2706; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2707; CHECK:       omp.par.outlined.exit.exitStub:
2708; CHECK-NEXT:    ret void
2709; CHECK:       omp.par.region:
2710; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2711; CHECK:       omp.par.merged:
2712; CHECK-NEXT:    call void @.omp_outlined..37(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2713; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2714; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2715; CHECK-NEXT:    call void @.omp_outlined..38(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2716; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2717; CHECK:       entry.split:
2718; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2719; CHECK:       omp.par.region.split:
2720; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2721; CHECK:       omp.par.pre_finalize:
2722; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2723; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37
2724; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2725; CHECK-NEXT:  entry:
2726; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2727; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2728; CHECK-NEXT:    ret void
2729; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38
2730; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2731; CHECK-NEXT:  entry:
2732; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2733; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2734; CHECK-NEXT:    ret void
2735; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39
2736; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2737; CHECK-NEXT:  entry:
2738; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2739; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2740; CHECK-NEXT:    ret void
2741; CHECK-LABEL: define {{[^@]+}}@merge
2742; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2743; CHECK-NEXT:  entry:
2744; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2745; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2746; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2747; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2748; CHECK:       omp_parallel:
2749; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
2750; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2751; CHECK:       omp.par.outlined.exit:
2752; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2753; CHECK:       omp.par.exit.split:
2754; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2755; CHECK:       entry.split.split:
2756; CHECK-NEXT:    ret void
2757; CHECK-LABEL: define {{[^@]+}}@merge..omp_par
2758; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
2759; CHECK-NEXT:  omp.par.entry:
2760; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2761; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2762; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2763; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2764; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2765; CHECK:       omp.par.outlined.exit.exitStub:
2766; CHECK-NEXT:    ret void
2767; CHECK:       omp.par.region:
2768; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2769; CHECK:       omp.par.merged:
2770; CHECK-NEXT:    call void @.omp_outlined.(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2771; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2772; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2773; CHECK-NEXT:    call void @.omp_outlined..1(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2774; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2775; CHECK:       entry.split:
2776; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2777; CHECK:       omp.par.region.split:
2778; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2779; CHECK:       omp.par.pre_finalize:
2780; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2781; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
2782; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2783; CHECK-NEXT:  entry:
2784; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2785; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2786; CHECK-NEXT:    ret void
2787; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
2788; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2789; CHECK-NEXT:  entry:
2790; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2791; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2792; CHECK-NEXT:    ret void
2793; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind
2794; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2795; CHECK-NEXT:  entry:
2796; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2797; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
2798; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2799; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
2800; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2801; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2802; CHECK-NEXT:    ret void
2803; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
2804; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2805; CHECK-NEXT:  entry:
2806; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2807; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2808; CHECK-NEXT:    ret void
2809; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3
2810; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2811; CHECK-NEXT:  entry:
2812; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2813; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2814; CHECK-NEXT:    ret void
2815; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads
2816; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2817; CHECK-NEXT:  entry:
2818; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2819; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
2820; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2821; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
2822; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2823; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2824; CHECK-NEXT:    ret void
2825; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4
2826; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2827; CHECK-NEXT:  entry:
2828; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2829; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2830; CHECK-NEXT:    ret void
2831; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5
2832; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2833; CHECK-NEXT:  entry:
2834; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2835; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2836; CHECK-NEXT:    ret void
2837; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call
2838; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2839; CHECK-NEXT:  entry:
2840; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2841; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2842; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2843; CHECK-NEXT:    call void (...) @foo()
2844; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2845; CHECK-NEXT:    ret void
2846; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6
2847; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2848; CHECK-NEXT:  entry:
2849; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2850; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2851; CHECK-NEXT:    ret void
2852; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7
2853; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2854; CHECK-NEXT:  entry:
2855; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2856; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2857; CHECK-NEXT:    ret void
2858; CHECK-LABEL: define {{[^@]+}}@merge_seq
2859; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2860; CHECK-NEXT:  entry:
2861; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2862; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
2863; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2864; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2865; CHECK:       omp_parallel:
2866; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
2867; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2868; CHECK:       omp.par.outlined.exit:
2869; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2870; CHECK:       omp.par.exit.split:
2871; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2872; CHECK:       entry.split.split:
2873; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
2874; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2875; CHECK-NEXT:    ret void
2876; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par
2877; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
2878; CHECK-NEXT:  omp.par.entry:
2879; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2880; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2881; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2882; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2883; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2884; CHECK:       omp.par.outlined.exit.exitStub:
2885; CHECK-NEXT:    ret void
2886; CHECK:       omp.par.region:
2887; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2888; CHECK:       omp.par.merged:
2889; CHECK-NEXT:    call void @.omp_outlined..8(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2890; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2891; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2892; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2893; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2894; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2895; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2896; CHECK:       omp_region.end:
2897; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2898; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2899; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2900; CHECK:       omp.par.merged.split.split:
2901; CHECK-NEXT:    call void @.omp_outlined..9(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2902; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2903; CHECK:       entry.split:
2904; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2905; CHECK:       omp.par.region.split:
2906; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2907; CHECK:       omp.par.pre_finalize:
2908; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2909; CHECK:       omp_region.body:
2910; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2911; CHECK:       seq.par.merged:
2912; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
2913; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
2914; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
2915; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2916; CHECK:       omp.par.merged.split:
2917; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2918; CHECK:       omp_region.body.split:
2919; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2920; CHECK-NEXT:    br label [[OMP_REGION_END]]
2921; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8
2922; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2923; CHECK-NEXT:  entry:
2924; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2925; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2926; CHECK-NEXT:    ret void
2927; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9
2928; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2929; CHECK-NEXT:  entry:
2930; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
2931; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2932; CHECK-NEXT:    ret void
2933; CHECK-LABEL: define {{[^@]+}}@merge_seq_float
2934; CHECK-SAME: (float [[F:%.*]], float* nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
2935; CHECK-NEXT:  entry:
2936; CHECK-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
2937; CHECK-NEXT:    store float [[F]], float* [[F_ADDR]], align 4
2938; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2939; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2940; CHECK:       omp_parallel:
2941; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*, float*)* @merge_seq_float..omp_par to void (i32*, i32*, ...)*), float* [[F_ADDR]], float* [[P]])
2942; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2943; CHECK:       omp.par.outlined.exit:
2944; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2945; CHECK:       omp.par.exit.split:
2946; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2947; CHECK:       entry.split.split:
2948; CHECK-NEXT:    ret void
2949; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
2950; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], float* [[F_ADDR:%.*]], float* [[P:%.*]]) #[[ATTR0]] {
2951; CHECK-NEXT:  omp.par.entry:
2952; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2953; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2954; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2955; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2956; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2957; CHECK:       omp.par.outlined.exit.exitStub:
2958; CHECK-NEXT:    ret void
2959; CHECK:       omp.par.region:
2960; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2961; CHECK:       omp.par.merged:
2962; CHECK-NEXT:    call void @.omp_outlined..10(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
2963; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2964; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2965; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2966; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2967; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2968; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2969; CHECK:       omp_region.end:
2970; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2971; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2972; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2973; CHECK:       omp.par.merged.split.split:
2974; CHECK-NEXT:    call void @.omp_outlined..11(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
2975; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2976; CHECK:       entry.split:
2977; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2978; CHECK:       omp.par.region.split:
2979; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2980; CHECK:       omp.par.pre_finalize:
2981; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2982; CHECK:       omp_region.body:
2983; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2984; CHECK:       seq.par.merged:
2985; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[F_ADDR]], align 4
2986; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000
2987; CHECK-NEXT:    store float [[ADD]], float* [[P]], align 4
2988; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2989; CHECK:       omp.par.merged.split:
2990; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2991; CHECK:       omp_region.body.split:
2992; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2993; CHECK-NEXT:    br label [[OMP_REGION_END]]
2994; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10
2995; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
2996; CHECK-NEXT:  entry:
2997; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
2998; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
2999; CHECK-NEXT:    call void @use(i32 [[CONV]])
3000; CHECK-NEXT:    ret void
3001; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11
3002; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
3003; CHECK-NEXT:  entry:
3004; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
3005; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
3006; CHECK-NEXT:    call void @use(i32 [[CONV]])
3007; CHECK-NEXT:    ret void
3008; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate
3009; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3010; CHECK-NEXT:  entry:
3011; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
3012; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3013; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3014; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3015; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3016; CHECK:       omp_parallel:
3017; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64*)* @merge_seq_firstprivate..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]])
3018; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3019; CHECK:       omp.par.outlined.exit:
3020; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3021; CHECK:       omp.par.exit.split:
3022; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3023; CHECK:       entry.split.split:
3024; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
3025; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3026; CHECK-NEXT:    ret void
3027; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
3028; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
3029; CHECK-NEXT:  omp.par.entry:
3030; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3031; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3032; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3033; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3034; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3035; CHECK:       omp.par.outlined.exit.exitStub:
3036; CHECK-NEXT:    ret void
3037; CHECK:       omp.par.region:
3038; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3039; CHECK:       omp.par.merged:
3040; CHECK-NEXT:    call void @.omp_outlined..12(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3041; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3042; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3043; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3044; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3045; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3046; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3047; CHECK:       omp_region.end:
3048; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3049; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3050; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3051; CHECK:       omp.par.merged.split.split:
3052; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
3053; CHECK-NEXT:    call void @.omp_outlined..13(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
3054; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3055; CHECK:       entry.split:
3056; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3057; CHECK:       omp.par.region.split:
3058; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3059; CHECK:       omp.par.pre_finalize:
3060; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3061; CHECK:       omp_region.body:
3062; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3063; CHECK:       seq.par.merged:
3064; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
3065; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
3066; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
3067; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
3068; CHECK-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
3069; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3070; CHECK:       omp.par.merged.split:
3071; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3072; CHECK:       omp_region.body.split:
3073; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3074; CHECK-NEXT:    br label [[OMP_REGION_END]]
3075; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12
3076; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3077; CHECK-NEXT:  entry:
3078; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3079; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3080; CHECK-NEXT:    ret void
3081; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13
3082; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
3083; CHECK-NEXT:  entry:
3084; CHECK-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
3085; CHECK-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
3086; CHECK-NEXT:    ret void
3087; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt
3088; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3089; CHECK-NEXT:  entry:
3090; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3091; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3092; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3093; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3094; CHECK:       omp_parallel:
3095; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq_sink_lt..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
3096; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3097; CHECK:       omp.par.outlined.exit:
3098; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3099; CHECK:       omp.par.exit.split:
3100; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3101; CHECK:       entry.split.split:
3102; CHECK-NEXT:    ret void
3103; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
3104; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
3105; CHECK-NEXT:  omp.par.entry:
3106; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
3107; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3108; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3109; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3110; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3111; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3112; CHECK:       omp.par.outlined.exit.exitStub:
3113; CHECK-NEXT:    ret void
3114; CHECK:       omp.par.region:
3115; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3116; CHECK:       omp.par.merged:
3117; CHECK-NEXT:    call void @.omp_outlined..14(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3118; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3119; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3120; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3121; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3122; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3123; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3124; CHECK:       omp_region.end:
3125; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3126; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3127; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3128; CHECK:       omp.par.merged.split.split:
3129; CHECK-NEXT:    call void @.omp_outlined..15(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3130; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3131; CHECK:       entry.split:
3132; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3133; CHECK:       omp.par.region.split:
3134; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3135; CHECK:       omp.par.pre_finalize:
3136; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3137; CHECK:       omp_region.body:
3138; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3139; CHECK:       seq.par.merged:
3140; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
3141; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
3142; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[B]] to i64
3143; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
3144; CHECK-NEXT:    store i32 [[TMP5]], i32* [[B]], align 4
3145; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
3146; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3147; CHECK:       omp.par.merged.split:
3148; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3149; CHECK:       omp_region.body.split:
3150; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3151; CHECK-NEXT:    br label [[OMP_REGION_END]]
3152; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14
3153; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3154; CHECK-NEXT:  entry:
3155; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3156; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3157; CHECK-NEXT:    ret void
3158; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15
3159; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3160; CHECK-NEXT:  entry:
3161; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3162; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3163; CHECK-NEXT:    ret void
3164; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use
3165; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3166; CHECK-NEXT:  entry:
3167; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3168; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
3169; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3170; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3171; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3172; CHECK:       omp_parallel:
3173; CHECK-NEXT:    [[LT_CAST3:%.*]] = bitcast i32* [[B]] to i8*
3174; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]])
3175; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_seq_par_use..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[B]])
3176; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3177; CHECK:       omp.par.outlined.exit:
3178; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3179; CHECK:       omp.par.exit.split:
3180; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3181; CHECK:       entry.split.split:
3182; CHECK-NEXT:    [[LT_CAST:%.*]] = bitcast i32* [[B]] to i8*
3183; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[LT_CAST]])
3184; CHECK-NEXT:    ret void
3185; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
3186; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[B:%.*]]) #[[ATTR0]] {
3187; CHECK-NEXT:  omp.par.entry:
3188; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3189; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3190; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3191; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3192; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3193; CHECK:       omp.par.outlined.exit.exitStub:
3194; CHECK-NEXT:    ret void
3195; CHECK:       omp.par.region:
3196; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3197; CHECK:       omp.par.merged:
3198; CHECK-NEXT:    call void @.omp_outlined..16(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3199; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3200; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3201; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3202; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3203; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3204; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3205; CHECK:       omp_region.end:
3206; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3207; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3208; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3209; CHECK:       omp.par.merged.split.split:
3210; CHECK-NEXT:    call void @.omp_outlined..17(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B]])
3211; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3212; CHECK:       entry.split:
3213; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3214; CHECK:       omp.par.region.split:
3215; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3216; CHECK:       omp.par.pre_finalize:
3217; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3218; CHECK:       omp_region.body:
3219; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3220; CHECK:       seq.par.merged:
3221; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
3222; CHECK-NEXT:    [[TMP4:%.*]] = load i32, i32* [[A_ADDR]], align 4
3223; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
3224; CHECK-NEXT:    store i32 [[ADD]], i32* [[B]], align 4
3225; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3226; CHECK:       omp.par.merged.split:
3227; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3228; CHECK:       omp_region.body.split:
3229; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3230; CHECK-NEXT:    br label [[OMP_REGION_END]]
3231; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16
3232; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3233; CHECK-NEXT:  entry:
3234; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3235; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3236; CHECK-NEXT:    ret void
3237; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17
3238; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
3239; CHECK-NEXT:  entry:
3240; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3241; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3242; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4
3243; CHECK-NEXT:    call void @use(i32 [[TMP1]])
3244; CHECK-NEXT:    ret void
3245; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions
3246; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
3247; CHECK-NEXT:  entry:
3248; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
3249; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
3250; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
3251; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
3252; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3253; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3254; CHECK:       omp_parallel:
3255; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
3256; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3257; CHECK:       omp.par.outlined.exit:
3258; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3259; CHECK:       omp.par.exit.split:
3260; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3261; CHECK:       entry.split.split:
3262; CHECK-NEXT:    ret void
3263; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
3264; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
3265; CHECK-NEXT:  omp.par.entry:
3266; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3267; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3268; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3269; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3270; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3271; CHECK:       omp.par.outlined.exit.exitStub:
3272; CHECK-NEXT:    ret void
3273; CHECK:       omp.par.region:
3274; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3275; CHECK:       omp.par.merged:
3276; CHECK-NEXT:    call void @.omp_outlined..18(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
3277; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3278; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3279; CHECK-NEXT:    call void @.omp_outlined..19(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
3280; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3281; CHECK:       entry.split:
3282; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3283; CHECK:       omp.par.region.split:
3284; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3285; CHECK:       omp.par.pre_finalize:
3286; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3287; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18
3288; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
3289; CHECK-NEXT:  entry:
3290; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
3291; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
3292; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
3293; CHECK:       if.then:
3294; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
3295; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
3296; CHECK-NEXT:    ret void
3297; CHECK:       if.end:
3298; CHECK-NEXT:    ret void
3299; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19
3300; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
3301; CHECK-NEXT:  entry:
3302; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
3303; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
3304; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
3305; CHECK:       if.then:
3306; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
3307; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
3308; CHECK-NEXT:    ret void
3309; CHECK:       if.end:
3310; CHECK-NEXT:    ret void
3311; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
3312; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
3313; CHECK-NEXT:  entry:
3314; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
3315; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
3316; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
3317; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
3318; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3319; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3320; CHECK:       omp_parallel:
3321; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions_seq..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
3322; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3323; CHECK:       omp.par.outlined.exit:
3324; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3325; CHECK:       omp.par.exit.split:
3326; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3327; CHECK:       entry.split.split:
3328; CHECK-NEXT:    ret void
3329; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
3330; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
3331; CHECK-NEXT:  omp.par.entry:
3332; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3333; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3334; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3335; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3336; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3337; CHECK:       omp.par.outlined.exit.exitStub:
3338; CHECK-NEXT:    ret void
3339; CHECK:       omp.par.region:
3340; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3341; CHECK:       omp.par.merged:
3342; CHECK-NEXT:    call void @.omp_outlined..20(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
3343; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3344; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3345; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3346; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3347; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3348; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3349; CHECK:       omp_region.end:
3350; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3351; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3352; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3353; CHECK:       omp.par.merged.split.split:
3354; CHECK-NEXT:    call void @.omp_outlined..21(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
3355; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3356; CHECK:       entry.split:
3357; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3358; CHECK:       omp.par.region.split:
3359; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3360; CHECK:       omp.par.pre_finalize:
3361; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3362; CHECK:       omp_region.body:
3363; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3364; CHECK:       seq.par.merged:
3365; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[CANCEL1_ADDR]], align 4
3366; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
3367; CHECK-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
3368; CHECK-NEXT:    store i32 [[LNOT_EXT]], i32* [[CANCEL2_ADDR]], align 4
3369; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3370; CHECK:       omp.par.merged.split:
3371; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3372; CHECK:       omp_region.body.split:
3373; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3374; CHECK-NEXT:    br label [[OMP_REGION_END]]
3375; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20
3376; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
3377; CHECK-NEXT:  entry:
3378; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
3379; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
3380; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
3381; CHECK:       if.then:
3382; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
3383; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
3384; CHECK-NEXT:    ret void
3385; CHECK:       if.end:
3386; CHECK-NEXT:    ret void
3387; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21
3388; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
3389; CHECK-NEXT:  entry:
3390; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
3391; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
3392; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
3393; CHECK:       if.then:
3394; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
3395; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
3396; CHECK-NEXT:    ret void
3397; CHECK:       if.end:
3398; CHECK-NEXT:    ret void
3399; CHECK-LABEL: define {{[^@]+}}@merge_3
3400; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3401; CHECK-NEXT:  entry:
3402; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3403; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3404; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3405; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3406; CHECK:       omp_parallel:
3407; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_3..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
3408; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3409; CHECK:       omp.par.outlined.exit:
3410; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3411; CHECK:       omp.par.exit.split:
3412; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3413; CHECK:       entry.split.split:
3414; CHECK-NEXT:    ret void
3415; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par
3416; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
3417; CHECK-NEXT:  omp.par.entry:
3418; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3419; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3420; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3421; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3422; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3423; CHECK:       omp.par.outlined.exit.exitStub:
3424; CHECK-NEXT:    ret void
3425; CHECK:       omp.par.region:
3426; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3427; CHECK:       omp.par.merged:
3428; CHECK-NEXT:    call void @.omp_outlined..22(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3429; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3430; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3431; CHECK-NEXT:    call void @.omp_outlined..23(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3432; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3433; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3434; CHECK-NEXT:    call void @.omp_outlined..24(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3435; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3436; CHECK:       entry.split:
3437; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3438; CHECK:       omp.par.region.split:
3439; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3440; CHECK:       omp.par.pre_finalize:
3441; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3442; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22
3443; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3444; CHECK-NEXT:  entry:
3445; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3446; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3447; CHECK-NEXT:    ret void
3448; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23
3449; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3450; CHECK-NEXT:  entry:
3451; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3452; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3453; CHECK-NEXT:    ret void
3454; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24
3455; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3456; CHECK-NEXT:  entry:
3457; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3458; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3459; CHECK-NEXT:    ret void
3460; CHECK-LABEL: define {{[^@]+}}@merge_3_seq
3461; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
3462; CHECK-NEXT:  entry:
3463; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
3464; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
3465; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3466; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3467; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3468; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3469; CHECK:       omp_parallel:
3470; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32*)* @merge_3_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]])
3471; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3472; CHECK:       omp.par.outlined.exit:
3473; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3474; CHECK:       omp.par.exit.split:
3475; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3476; CHECK:       entry.split.split:
3477; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
3478; CHECK-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
3479; CHECK-NEXT:    ret void
3480; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
3481; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[ADD_SEQ_OUTPUT_ALLOC:%.*]], i32* [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
3482; CHECK-NEXT:  omp.par.entry:
3483; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3484; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3485; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3486; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3487; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3488; CHECK:       omp.par.outlined.exit.exitStub:
3489; CHECK-NEXT:    ret void
3490; CHECK:       omp.par.region:
3491; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3492; CHECK:       omp.par.merged:
3493; CHECK-NEXT:    call void @.omp_outlined..25(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3494; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3495; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3496; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3497; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3498; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3499; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3500; CHECK:       omp_region.end:
3501; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3502; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3503; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3504; CHECK:       omp.par.merged.split.split:
3505; CHECK-NEXT:    call void @.omp_outlined..26(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3506; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3507; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
3508; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3509; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
3510; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
3511; CHECK-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
3512; CHECK:       omp_region.end4:
3513; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3514; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
3515; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
3516; CHECK:       omp.par.merged.split.split.split.split:
3517; CHECK-NEXT:    call void @.omp_outlined..27(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3518; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3519; CHECK:       entry.split:
3520; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3521; CHECK:       omp.par.region.split:
3522; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3523; CHECK:       omp.par.pre_finalize:
3524; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3525; CHECK:       omp_region.body5:
3526; CHECK-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
3527; CHECK:       seq.par.merged2:
3528; CHECK-NEXT:    [[TMP5:%.*]] = load i32, i32* [[A_ADDR]], align 4
3529; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
3530; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]]
3531; CHECK-NEXT:    store i32 [[ADD1]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
3532; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
3533; CHECK:       omp.par.merged.split.split.split:
3534; CHECK-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
3535; CHECK:       omp_region.body5.split:
3536; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
3537; CHECK-NEXT:    br label [[OMP_REGION_END4]]
3538; CHECK:       omp_region.body:
3539; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3540; CHECK:       seq.par.merged:
3541; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[A_ADDR]], align 4
3542; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], 1
3543; CHECK-NEXT:    store i32 [[ADD]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
3544; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3545; CHECK:       omp.par.merged.split:
3546; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3547; CHECK:       omp_region.body.split:
3548; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3549; CHECK-NEXT:    br label [[OMP_REGION_END]]
3550; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25
3551; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3552; CHECK-NEXT:  entry:
3553; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3554; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3555; CHECK-NEXT:    ret void
3556; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26
3557; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3558; CHECK-NEXT:  entry:
3559; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3560; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3561; CHECK-NEXT:    ret void
3562; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27
3563; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3564; CHECK-NEXT:  entry:
3565; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3566; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3567; CHECK-NEXT:    ret void
3568; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call
3569; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3570; CHECK-NEXT:  entry:
3571; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3572; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3573; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3574; CHECK-NEXT:    call void (...) @foo()
3575; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3576; CHECK-NEXT:    call void (...) @foo()
3577; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3578; CHECK-NEXT:    ret void
3579; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28
3580; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3581; CHECK-NEXT:  entry:
3582; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3583; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3584; CHECK-NEXT:    ret void
3585; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29
3586; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3587; CHECK-NEXT:  entry:
3588; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3589; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3590; CHECK-NEXT:    ret void
3591; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30
3592; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3593; CHECK-NEXT:  entry:
3594; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3595; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3596; CHECK-NEXT:    ret void
3597; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
3598; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3599; CHECK-NEXT:  entry:
3600; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3601; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
3602; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3603; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3604; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
3605; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3606; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3607; CHECK-NEXT:    ret void
3608; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31
3609; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3610; CHECK-NEXT:  entry:
3611; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3612; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3613; CHECK-NEXT:    ret void
3614; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32
3615; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3616; CHECK-NEXT:  entry:
3617; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3618; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3619; CHECK-NEXT:    ret void
3620; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33
3621; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3622; CHECK-NEXT:  entry:
3623; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3624; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3625; CHECK-NEXT:    ret void
3626; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads
3627; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3628; CHECK-NEXT:  entry:
3629; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3630; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
3631; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3632; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3633; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
3634; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]])
3635; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3636; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3637; CHECK-NEXT:    ret void
3638; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34
3639; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3640; CHECK-NEXT:  entry:
3641; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3642; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3643; CHECK-NEXT:    ret void
3644; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35
3645; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3646; CHECK-NEXT:  entry:
3647; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3648; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3649; CHECK-NEXT:    ret void
3650; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36
3651; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3652; CHECK-NEXT:  entry:
3653; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3654; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3655; CHECK-NEXT:    ret void
3656; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1
3657; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3658; CHECK-NEXT:  entry:
3659; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3660; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3661; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3662; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3663; CHECK:       omp_parallel:
3664; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_2_unmergable_1..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
3665; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3666; CHECK:       omp.par.outlined.exit:
3667; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3668; CHECK:       omp.par.exit.split:
3669; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3670; CHECK:       entry.split.split:
3671; CHECK-NEXT:    call void (...) @foo()
3672; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3673; CHECK-NEXT:    ret void
3674; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
3675; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
3676; CHECK-NEXT:  omp.par.entry:
3677; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3678; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3679; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3680; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3681; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3682; CHECK:       omp.par.outlined.exit.exitStub:
3683; CHECK-NEXT:    ret void
3684; CHECK:       omp.par.region:
3685; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3686; CHECK:       omp.par.merged:
3687; CHECK-NEXT:    call void @.omp_outlined..37(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3688; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3689; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3690; CHECK-NEXT:    call void @.omp_outlined..38(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3691; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3692; CHECK:       entry.split:
3693; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3694; CHECK:       omp.par.region.split:
3695; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3696; CHECK:       omp.par.pre_finalize:
3697; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3698; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37
3699; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3700; CHECK-NEXT:  entry:
3701; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3702; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3703; CHECK-NEXT:    ret void
3704; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38
3705; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3706; CHECK-NEXT:  entry:
3707; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3708; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3709; CHECK-NEXT:    ret void
3710; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39
3711; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3712; CHECK-NEXT:  entry:
3713; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3714; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3715; CHECK-NEXT:    ret void
3716; CHECK-LABEL: define {{[^@]+}}@merge
3717; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3718; CHECK-NEXT:  entry:
3719; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3720; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3721; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3722; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3723; CHECK:       omp_parallel:
3724; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
3725; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3726; CHECK:       omp.par.outlined.exit:
3727; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3728; CHECK:       omp.par.exit.split:
3729; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3730; CHECK:       entry.split.split:
3731; CHECK-NEXT:    ret void
3732; CHECK-LABEL: define {{[^@]+}}@merge..omp_par
3733; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
3734; CHECK-NEXT:  omp.par.entry:
3735; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3736; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3737; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3738; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3739; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3740; CHECK:       omp.par.outlined.exit.exitStub:
3741; CHECK-NEXT:    ret void
3742; CHECK:       omp.par.region:
3743; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3744; CHECK:       omp.par.merged:
3745; CHECK-NEXT:    call void @.omp_outlined.(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3746; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3747; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3748; CHECK-NEXT:    call void @.omp_outlined..1(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3749; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3750; CHECK:       entry.split:
3751; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3752; CHECK:       omp.par.region.split:
3753; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3754; CHECK:       omp.par.pre_finalize:
3755; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3756; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
3757; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3758; CHECK-NEXT:  entry:
3759; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3760; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3761; CHECK-NEXT:    ret void
3762; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
3763; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3764; CHECK-NEXT:  entry:
3765; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3766; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3767; CHECK-NEXT:    ret void
3768; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind
3769; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3770; CHECK-NEXT:  entry:
3771; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3772; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
3773; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3774; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
3775; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3776; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3777; CHECK-NEXT:    ret void
3778; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
3779; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3780; CHECK-NEXT:  entry:
3781; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3782; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3783; CHECK-NEXT:    ret void
3784; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3
3785; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3786; CHECK-NEXT:  entry:
3787; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3788; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3789; CHECK-NEXT:    ret void
3790; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads
3791; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3792; CHECK-NEXT:  entry:
3793; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3794; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
3795; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3796; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
3797; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3798; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3799; CHECK-NEXT:    ret void
3800; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4
3801; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3802; CHECK-NEXT:  entry:
3803; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3804; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3805; CHECK-NEXT:    ret void
3806; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5
3807; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3808; CHECK-NEXT:  entry:
3809; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3810; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3811; CHECK-NEXT:    ret void
3812; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call
3813; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3814; CHECK-NEXT:  entry:
3815; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3816; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3817; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3818; CHECK-NEXT:    call void (...) @foo()
3819; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3820; CHECK-NEXT:    ret void
3821; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6
3822; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3823; CHECK-NEXT:  entry:
3824; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3825; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3826; CHECK-NEXT:    ret void
3827; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7
3828; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3829; CHECK-NEXT:  entry:
3830; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3831; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3832; CHECK-NEXT:    ret void
3833; CHECK-LABEL: define {{[^@]+}}@merge_seq
3834; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3835; CHECK-NEXT:  entry:
3836; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3837; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3838; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3839; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3840; CHECK:       omp_parallel:
3841; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
3842; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3843; CHECK:       omp.par.outlined.exit:
3844; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3845; CHECK:       omp.par.exit.split:
3846; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3847; CHECK:       entry.split.split:
3848; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
3849; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3850; CHECK-NEXT:    ret void
3851; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par
3852; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
3853; CHECK-NEXT:  omp.par.entry:
3854; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3855; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3856; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3857; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3858; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3859; CHECK:       omp.par.outlined.exit.exitStub:
3860; CHECK-NEXT:    ret void
3861; CHECK:       omp.par.region:
3862; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3863; CHECK:       omp.par.merged:
3864; CHECK-NEXT:    call void @.omp_outlined..8(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3865; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3866; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3867; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3868; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3869; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3870; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3871; CHECK:       omp_region.end:
3872; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3873; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3874; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3875; CHECK:       omp.par.merged.split.split:
3876; CHECK-NEXT:    call void @.omp_outlined..9(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3877; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3878; CHECK:       entry.split:
3879; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3880; CHECK:       omp.par.region.split:
3881; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3882; CHECK:       omp.par.pre_finalize:
3883; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3884; CHECK:       omp_region.body:
3885; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3886; CHECK:       seq.par.merged:
3887; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
3888; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
3889; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
3890; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3891; CHECK:       omp.par.merged.split:
3892; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3893; CHECK:       omp_region.body.split:
3894; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3895; CHECK-NEXT:    br label [[OMP_REGION_END]]
3896; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8
3897; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3898; CHECK-NEXT:  entry:
3899; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3900; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3901; CHECK-NEXT:    ret void
3902; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9
3903; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3904; CHECK-NEXT:  entry:
3905; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
3906; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3907; CHECK-NEXT:    ret void
3908; CHECK-LABEL: define {{[^@]+}}@merge_seq_float
3909; CHECK-SAME: (float [[F:%.*]], float* nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
3910; CHECK-NEXT:  entry:
3911; CHECK-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
3912; CHECK-NEXT:    store float [[F]], float* [[F_ADDR]], align 4
3913; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3914; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3915; CHECK:       omp_parallel:
3916; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*, float*)* @merge_seq_float..omp_par to void (i32*, i32*, ...)*), float* [[F_ADDR]], float* [[P]])
3917; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3918; CHECK:       omp.par.outlined.exit:
3919; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3920; CHECK:       omp.par.exit.split:
3921; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3922; CHECK:       entry.split.split:
3923; CHECK-NEXT:    ret void
3924; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
3925; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], float* [[F_ADDR:%.*]], float* [[P:%.*]]) #[[ATTR0]] {
3926; CHECK-NEXT:  omp.par.entry:
3927; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3928; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
3929; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
3930; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
3931; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3932; CHECK:       omp.par.outlined.exit.exitStub:
3933; CHECK-NEXT:    ret void
3934; CHECK:       omp.par.region:
3935; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3936; CHECK:       omp.par.merged:
3937; CHECK-NEXT:    call void @.omp_outlined..10(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
3938; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3939; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3940; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3941; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3942; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3943; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3944; CHECK:       omp_region.end:
3945; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3946; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3947; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3948; CHECK:       omp.par.merged.split.split:
3949; CHECK-NEXT:    call void @.omp_outlined..11(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
3950; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3951; CHECK:       entry.split:
3952; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3953; CHECK:       omp.par.region.split:
3954; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3955; CHECK:       omp.par.pre_finalize:
3956; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3957; CHECK:       omp_region.body:
3958; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3959; CHECK:       seq.par.merged:
3960; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[F_ADDR]], align 4
3961; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000
3962; CHECK-NEXT:    store float [[ADD]], float* [[P]], align 4
3963; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3964; CHECK:       omp.par.merged.split:
3965; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3966; CHECK:       omp_region.body.split:
3967; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3968; CHECK-NEXT:    br label [[OMP_REGION_END]]
3969; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10
3970; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
3971; CHECK-NEXT:  entry:
3972; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
3973; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
3974; CHECK-NEXT:    call void @use(i32 [[CONV]])
3975; CHECK-NEXT:    ret void
3976; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11
3977; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
3978; CHECK-NEXT:  entry:
3979; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
3980; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
3981; CHECK-NEXT:    call void @use(i32 [[CONV]])
3982; CHECK-NEXT:    ret void
3983; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate
3984; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3985; CHECK-NEXT:  entry:
3986; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
3987; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3988; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
3989; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3990; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3991; CHECK:       omp_parallel:
3992; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64*)* @merge_seq_firstprivate..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]])
3993; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3994; CHECK:       omp.par.outlined.exit:
3995; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3996; CHECK:       omp.par.exit.split:
3997; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3998; CHECK:       entry.split.split:
3999; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
4000; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4001; CHECK-NEXT:    ret void
4002; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
4003; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
4004; CHECK-NEXT:  omp.par.entry:
4005; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4006; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4007; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4008; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4009; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4010; CHECK:       omp.par.outlined.exit.exitStub:
4011; CHECK-NEXT:    ret void
4012; CHECK:       omp.par.region:
4013; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4014; CHECK:       omp.par.merged:
4015; CHECK-NEXT:    call void @.omp_outlined..12(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4016; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4017; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4018; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4019; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4020; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4021; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4022; CHECK:       omp_region.end:
4023; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4024; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4025; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4026; CHECK:       omp.par.merged.split.split:
4027; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
4028; CHECK-NEXT:    call void @.omp_outlined..13(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
4029; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4030; CHECK:       entry.split:
4031; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4032; CHECK:       omp.par.region.split:
4033; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4034; CHECK:       omp.par.pre_finalize:
4035; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4036; CHECK:       omp_region.body:
4037; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4038; CHECK:       seq.par.merged:
4039; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
4040; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
4041; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
4042; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
4043; CHECK-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
4044; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4045; CHECK:       omp.par.merged.split:
4046; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4047; CHECK:       omp_region.body.split:
4048; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4049; CHECK-NEXT:    br label [[OMP_REGION_END]]
4050; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12
4051; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4052; CHECK-NEXT:  entry:
4053; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4054; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4055; CHECK-NEXT:    ret void
4056; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13
4057; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
4058; CHECK-NEXT:  entry:
4059; CHECK-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
4060; CHECK-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
4061; CHECK-NEXT:    ret void
4062; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt
4063; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4064; CHECK-NEXT:  entry:
4065; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4066; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4067; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4068; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4069; CHECK:       omp_parallel:
4070; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq_sink_lt..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
4071; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4072; CHECK:       omp.par.outlined.exit:
4073; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4074; CHECK:       omp.par.exit.split:
4075; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4076; CHECK:       entry.split.split:
4077; CHECK-NEXT:    ret void
4078; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
4079; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
4080; CHECK-NEXT:  omp.par.entry:
4081; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
4082; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4083; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4084; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4085; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4086; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4087; CHECK:       omp.par.outlined.exit.exitStub:
4088; CHECK-NEXT:    ret void
4089; CHECK:       omp.par.region:
4090; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4091; CHECK:       omp.par.merged:
4092; CHECK-NEXT:    call void @.omp_outlined..14(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4093; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4094; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4095; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4096; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4097; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4098; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4099; CHECK:       omp_region.end:
4100; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4101; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4102; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4103; CHECK:       omp.par.merged.split.split:
4104; CHECK-NEXT:    call void @.omp_outlined..15(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4105; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4106; CHECK:       entry.split:
4107; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4108; CHECK:       omp.par.region.split:
4109; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4110; CHECK:       omp.par.pre_finalize:
4111; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4112; CHECK:       omp_region.body:
4113; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4114; CHECK:       seq.par.merged:
4115; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
4116; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
4117; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[B]] to i64
4118; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
4119; CHECK-NEXT:    store i32 [[TMP5]], i32* [[B]], align 4
4120; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
4121; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4122; CHECK:       omp.par.merged.split:
4123; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4124; CHECK:       omp_region.body.split:
4125; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4126; CHECK-NEXT:    br label [[OMP_REGION_END]]
4127; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14
4128; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4129; CHECK-NEXT:  entry:
4130; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4131; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4132; CHECK-NEXT:    ret void
4133; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15
4134; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4135; CHECK-NEXT:  entry:
4136; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4137; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4138; CHECK-NEXT:    ret void
4139; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use
4140; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4141; CHECK-NEXT:  entry:
4142; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4143; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
4144; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4145; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4146; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4147; CHECK:       omp_parallel:
4148; CHECK-NEXT:    [[LT_CAST3:%.*]] = bitcast i32* [[B]] to i8*
4149; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]])
4150; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_seq_par_use..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[B]])
4151; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4152; CHECK:       omp.par.outlined.exit:
4153; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4154; CHECK:       omp.par.exit.split:
4155; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4156; CHECK:       entry.split.split:
4157; CHECK-NEXT:    [[LT_CAST:%.*]] = bitcast i32* [[B]] to i8*
4158; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[LT_CAST]])
4159; CHECK-NEXT:    ret void
4160; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
4161; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[B:%.*]]) #[[ATTR0]] {
4162; CHECK-NEXT:  omp.par.entry:
4163; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4164; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4165; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4166; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4167; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4168; CHECK:       omp.par.outlined.exit.exitStub:
4169; CHECK-NEXT:    ret void
4170; CHECK:       omp.par.region:
4171; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4172; CHECK:       omp.par.merged:
4173; CHECK-NEXT:    call void @.omp_outlined..16(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4174; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4175; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4176; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4177; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4178; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4179; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4180; CHECK:       omp_region.end:
4181; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4182; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4183; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4184; CHECK:       omp.par.merged.split.split:
4185; CHECK-NEXT:    call void @.omp_outlined..17(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B]])
4186; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4187; CHECK:       entry.split:
4188; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4189; CHECK:       omp.par.region.split:
4190; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4191; CHECK:       omp.par.pre_finalize:
4192; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4193; CHECK:       omp_region.body:
4194; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4195; CHECK:       seq.par.merged:
4196; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
4197; CHECK-NEXT:    [[TMP4:%.*]] = load i32, i32* [[A_ADDR]], align 4
4198; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
4199; CHECK-NEXT:    store i32 [[ADD]], i32* [[B]], align 4
4200; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4201; CHECK:       omp.par.merged.split:
4202; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4203; CHECK:       omp_region.body.split:
4204; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4205; CHECK-NEXT:    br label [[OMP_REGION_END]]
4206; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16
4207; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4208; CHECK-NEXT:  entry:
4209; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4210; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4211; CHECK-NEXT:    ret void
4212; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17
4213; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
4214; CHECK-NEXT:  entry:
4215; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4216; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4217; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4
4218; CHECK-NEXT:    call void @use(i32 [[TMP1]])
4219; CHECK-NEXT:    ret void
4220; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions
4221; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
4222; CHECK-NEXT:  entry:
4223; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
4224; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
4225; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
4226; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
4227; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4228; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4229; CHECK:       omp_parallel:
4230; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
4231; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4232; CHECK:       omp.par.outlined.exit:
4233; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4234; CHECK:       omp.par.exit.split:
4235; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4236; CHECK:       entry.split.split:
4237; CHECK-NEXT:    ret void
4238; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
4239; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
4240; CHECK-NEXT:  omp.par.entry:
4241; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4242; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4243; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4244; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4245; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4246; CHECK:       omp.par.outlined.exit.exitStub:
4247; CHECK-NEXT:    ret void
4248; CHECK:       omp.par.region:
4249; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4250; CHECK:       omp.par.merged:
4251; CHECK-NEXT:    call void @.omp_outlined..18(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
4252; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4253; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4254; CHECK-NEXT:    call void @.omp_outlined..19(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
4255; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4256; CHECK:       entry.split:
4257; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4258; CHECK:       omp.par.region.split:
4259; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4260; CHECK:       omp.par.pre_finalize:
4261; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4262; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18
4263; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
4264; CHECK-NEXT:  entry:
4265; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
4266; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
4267; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
4268; CHECK:       if.then:
4269; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
4270; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
4271; CHECK-NEXT:    ret void
4272; CHECK:       if.end:
4273; CHECK-NEXT:    ret void
4274; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19
4275; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
4276; CHECK-NEXT:  entry:
4277; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
4278; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
4279; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
4280; CHECK:       if.then:
4281; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
4282; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
4283; CHECK-NEXT:    ret void
4284; CHECK:       if.end:
4285; CHECK-NEXT:    ret void
4286; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
4287; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
4288; CHECK-NEXT:  entry:
4289; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
4290; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
4291; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
4292; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
4293; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4294; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4295; CHECK:       omp_parallel:
4296; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions_seq..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
4297; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4298; CHECK:       omp.par.outlined.exit:
4299; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4300; CHECK:       omp.par.exit.split:
4301; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4302; CHECK:       entry.split.split:
4303; CHECK-NEXT:    ret void
4304; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
4305; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
4306; CHECK-NEXT:  omp.par.entry:
4307; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4308; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4309; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4310; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4311; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4312; CHECK:       omp.par.outlined.exit.exitStub:
4313; CHECK-NEXT:    ret void
4314; CHECK:       omp.par.region:
4315; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4316; CHECK:       omp.par.merged:
4317; CHECK-NEXT:    call void @.omp_outlined..20(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
4318; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4319; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4320; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4321; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4322; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4323; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4324; CHECK:       omp_region.end:
4325; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4326; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4327; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4328; CHECK:       omp.par.merged.split.split:
4329; CHECK-NEXT:    call void @.omp_outlined..21(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
4330; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4331; CHECK:       entry.split:
4332; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4333; CHECK:       omp.par.region.split:
4334; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4335; CHECK:       omp.par.pre_finalize:
4336; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4337; CHECK:       omp_region.body:
4338; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4339; CHECK:       seq.par.merged:
4340; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[CANCEL1_ADDR]], align 4
4341; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
4342; CHECK-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
4343; CHECK-NEXT:    store i32 [[LNOT_EXT]], i32* [[CANCEL2_ADDR]], align 4
4344; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4345; CHECK:       omp.par.merged.split:
4346; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4347; CHECK:       omp_region.body.split:
4348; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4349; CHECK-NEXT:    br label [[OMP_REGION_END]]
4350; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20
4351; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
4352; CHECK-NEXT:  entry:
4353; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
4354; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
4355; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
4356; CHECK:       if.then:
4357; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
4358; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
4359; CHECK-NEXT:    ret void
4360; CHECK:       if.end:
4361; CHECK-NEXT:    ret void
4362; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21
4363; CHECK-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
4364; CHECK-NEXT:  entry:
4365; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
4366; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
4367; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
4368; CHECK:       if.then:
4369; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
4370; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
4371; CHECK-NEXT:    ret void
4372; CHECK:       if.end:
4373; CHECK-NEXT:    ret void
4374; CHECK-LABEL: define {{[^@]+}}@merge_3
4375; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4376; CHECK-NEXT:  entry:
4377; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4378; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4379; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4380; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4381; CHECK:       omp_parallel:
4382; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_3..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
4383; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4384; CHECK:       omp.par.outlined.exit:
4385; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4386; CHECK:       omp.par.exit.split:
4387; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4388; CHECK:       entry.split.split:
4389; CHECK-NEXT:    ret void
4390; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par
4391; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
4392; CHECK-NEXT:  omp.par.entry:
4393; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4394; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4395; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4396; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4397; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4398; CHECK:       omp.par.outlined.exit.exitStub:
4399; CHECK-NEXT:    ret void
4400; CHECK:       omp.par.region:
4401; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4402; CHECK:       omp.par.merged:
4403; CHECK-NEXT:    call void @.omp_outlined..22(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4404; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4405; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4406; CHECK-NEXT:    call void @.omp_outlined..23(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4407; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4408; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4409; CHECK-NEXT:    call void @.omp_outlined..24(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4410; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4411; CHECK:       entry.split:
4412; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4413; CHECK:       omp.par.region.split:
4414; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4415; CHECK:       omp.par.pre_finalize:
4416; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4417; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22
4418; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4419; CHECK-NEXT:  entry:
4420; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4421; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4422; CHECK-NEXT:    ret void
4423; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23
4424; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4425; CHECK-NEXT:  entry:
4426; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4427; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4428; CHECK-NEXT:    ret void
4429; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24
4430; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4431; CHECK-NEXT:  entry:
4432; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4433; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4434; CHECK-NEXT:    ret void
4435; CHECK-LABEL: define {{[^@]+}}@merge_3_seq
4436; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
4437; CHECK-NEXT:  entry:
4438; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
4439; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
4440; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4441; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4442; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4443; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4444; CHECK:       omp_parallel:
4445; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32*)* @merge_3_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]])
4446; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4447; CHECK:       omp.par.outlined.exit:
4448; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4449; CHECK:       omp.par.exit.split:
4450; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4451; CHECK:       entry.split.split:
4452; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
4453; CHECK-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
4454; CHECK-NEXT:    ret void
4455; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
4456; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[ADD_SEQ_OUTPUT_ALLOC:%.*]], i32* [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
4457; CHECK-NEXT:  omp.par.entry:
4458; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4459; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4460; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4461; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4462; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4463; CHECK:       omp.par.outlined.exit.exitStub:
4464; CHECK-NEXT:    ret void
4465; CHECK:       omp.par.region:
4466; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4467; CHECK:       omp.par.merged:
4468; CHECK-NEXT:    call void @.omp_outlined..25(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4469; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4470; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4471; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4472; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4473; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4474; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4475; CHECK:       omp_region.end:
4476; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4477; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4478; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4479; CHECK:       omp.par.merged.split.split:
4480; CHECK-NEXT:    call void @.omp_outlined..26(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4481; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4482; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
4483; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4484; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
4485; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
4486; CHECK-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
4487; CHECK:       omp_region.end4:
4488; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4489; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
4490; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
4491; CHECK:       omp.par.merged.split.split.split.split:
4492; CHECK-NEXT:    call void @.omp_outlined..27(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4493; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4494; CHECK:       entry.split:
4495; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4496; CHECK:       omp.par.region.split:
4497; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4498; CHECK:       omp.par.pre_finalize:
4499; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4500; CHECK:       omp_region.body5:
4501; CHECK-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
4502; CHECK:       seq.par.merged2:
4503; CHECK-NEXT:    [[TMP5:%.*]] = load i32, i32* [[A_ADDR]], align 4
4504; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
4505; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]]
4506; CHECK-NEXT:    store i32 [[ADD1]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
4507; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
4508; CHECK:       omp.par.merged.split.split.split:
4509; CHECK-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
4510; CHECK:       omp_region.body5.split:
4511; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
4512; CHECK-NEXT:    br label [[OMP_REGION_END4]]
4513; CHECK:       omp_region.body:
4514; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4515; CHECK:       seq.par.merged:
4516; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[A_ADDR]], align 4
4517; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], 1
4518; CHECK-NEXT:    store i32 [[ADD]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
4519; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4520; CHECK:       omp.par.merged.split:
4521; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4522; CHECK:       omp_region.body.split:
4523; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4524; CHECK-NEXT:    br label [[OMP_REGION_END]]
4525; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25
4526; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4527; CHECK-NEXT:  entry:
4528; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4529; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4530; CHECK-NEXT:    ret void
4531; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26
4532; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4533; CHECK-NEXT:  entry:
4534; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4535; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4536; CHECK-NEXT:    ret void
4537; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27
4538; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4539; CHECK-NEXT:  entry:
4540; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4541; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4542; CHECK-NEXT:    ret void
4543; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call
4544; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4545; CHECK-NEXT:  entry:
4546; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4547; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4548; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4549; CHECK-NEXT:    call void (...) @foo()
4550; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4551; CHECK-NEXT:    call void (...) @foo()
4552; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4553; CHECK-NEXT:    ret void
4554; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28
4555; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4556; CHECK-NEXT:  entry:
4557; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4558; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4559; CHECK-NEXT:    ret void
4560; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29
4561; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4562; CHECK-NEXT:  entry:
4563; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4564; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4565; CHECK-NEXT:    ret void
4566; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30
4567; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4568; CHECK-NEXT:  entry:
4569; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4570; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4571; CHECK-NEXT:    ret void
4572; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
4573; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4574; CHECK-NEXT:  entry:
4575; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4576; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
4577; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4578; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4579; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
4580; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4581; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4582; CHECK-NEXT:    ret void
4583; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31
4584; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4585; CHECK-NEXT:  entry:
4586; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4587; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4588; CHECK-NEXT:    ret void
4589; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32
4590; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4591; CHECK-NEXT:  entry:
4592; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4593; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4594; CHECK-NEXT:    ret void
4595; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33
4596; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4597; CHECK-NEXT:  entry:
4598; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4599; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4600; CHECK-NEXT:    ret void
4601; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads
4602; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4603; CHECK-NEXT:  entry:
4604; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4605; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
4606; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4607; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4608; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
4609; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]])
4610; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4611; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4612; CHECK-NEXT:    ret void
4613; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34
4614; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4615; CHECK-NEXT:  entry:
4616; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4617; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4618; CHECK-NEXT:    ret void
4619; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35
4620; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4621; CHECK-NEXT:  entry:
4622; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4623; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4624; CHECK-NEXT:    ret void
4625; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36
4626; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4627; CHECK-NEXT:  entry:
4628; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4629; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4630; CHECK-NEXT:    ret void
4631; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1
4632; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4633; CHECK-NEXT:  entry:
4634; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4635; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4636; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4637; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4638; CHECK:       omp_parallel:
4639; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_2_unmergable_1..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
4640; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4641; CHECK:       omp.par.outlined.exit:
4642; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4643; CHECK:       omp.par.exit.split:
4644; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4645; CHECK:       entry.split.split:
4646; CHECK-NEXT:    call void (...) @foo()
4647; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4648; CHECK-NEXT:    ret void
4649; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
4650; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) #[[ATTR0]] {
4651; CHECK-NEXT:  omp.par.entry:
4652; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4653; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4654; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4655; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4656; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4657; CHECK:       omp.par.outlined.exit.exitStub:
4658; CHECK-NEXT:    ret void
4659; CHECK:       omp.par.region:
4660; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4661; CHECK:       omp.par.merged:
4662; CHECK-NEXT:    call void @.omp_outlined..37(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4663; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4664; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4665; CHECK-NEXT:    call void @.omp_outlined..38(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4666; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4667; CHECK:       entry.split:
4668; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4669; CHECK:       omp.par.region.split:
4670; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4671; CHECK:       omp.par.pre_finalize:
4672; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4673; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37
4674; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4675; CHECK-NEXT:  entry:
4676; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4677; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4678; CHECK-NEXT:    ret void
4679; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38
4680; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4681; CHECK-NEXT:  entry:
4682; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4683; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4684; CHECK-NEXT:    ret void
4685; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39
4686; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4687; CHECK-NEXT:  entry:
4688; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4689; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4690; CHECK-NEXT:    ret void
4691
4692; CHECK1-LABEL: define {{[^@]+}}@merge
4693; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4694; CHECK1-NEXT:  entry:
4695; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
4696; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4697; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4698; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]])
4699; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
4700; CHECK1:       omp_parallel:
4701; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
4702; CHECK1-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
4703; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
4704; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4705; CHECK1:       omp.par.outlined.exit:
4706; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4707; CHECK1:       omp.par.exit.split:
4708; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4709; CHECK1:       entry.split.split:
4710; CHECK1-NEXT:    ret void
4711;
4712;
4713; CHECK1-LABEL: define {{[^@]+}}@merge..omp_par
4714; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
4715; CHECK1-NEXT:  omp.par.entry:
4716; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
4717; CHECK1-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
4718; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4719; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4720; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
4721; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4722; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4723; CHECK1:       omp.par.region:
4724; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4725; CHECK1:       omp.par.merged:
4726; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
4727; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
4728; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4729; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
4730; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4731; CHECK1:       entry.split:
4732; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4733; CHECK1:       omp.par.region.split:
4734; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4735; CHECK1:       omp.par.pre_finalize:
4736; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4737; CHECK1:       omp.par.outlined.exit.exitStub:
4738; CHECK1-NEXT:    ret void
4739;
4740;
4741; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
4742; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4743; CHECK1-NEXT:  entry:
4744; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4745; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4746; CHECK1-NEXT:    ret void
4747;
4748;
4749; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..1
4750; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4751; CHECK1-NEXT:  entry:
4752; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4753; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4754; CHECK1-NEXT:    ret void
4755;
4756;
4757; CHECK1-LABEL: define {{[^@]+}}@unmergable_proc_bind
4758; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4759; CHECK1-NEXT:  entry:
4760; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4761; CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1:[0-9]+]])
4762; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4763; CHECK1-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
4764; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4765; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4766; CHECK1-NEXT:    ret void
4767;
4768;
4769; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..2
4770; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4771; CHECK1-NEXT:  entry:
4772; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4773; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4774; CHECK1-NEXT:    ret void
4775;
4776;
4777; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..3
4778; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4779; CHECK1-NEXT:  entry:
4780; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4781; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4782; CHECK1-NEXT:    ret void
4783;
4784;
4785; CHECK1-LABEL: define {{[^@]+}}@unmergable_num_threads
4786; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4787; CHECK1-NEXT:  entry:
4788; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4789; CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
4790; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4791; CHECK1-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
4792; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4793; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4794; CHECK1-NEXT:    ret void
4795;
4796;
4797; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..4
4798; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4799; CHECK1-NEXT:  entry:
4800; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4801; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4802; CHECK1-NEXT:    ret void
4803;
4804;
4805; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..5
4806; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4807; CHECK1-NEXT:  entry:
4808; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4809; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4810; CHECK1-NEXT:    ret void
4811;
4812;
4813; CHECK1-LABEL: define {{[^@]+}}@unmergable_seq_call
4814; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4815; CHECK1-NEXT:  entry:
4816; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4817; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4818; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4819; CHECK1-NEXT:    call void (...) @foo()
4820; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4821; CHECK1-NEXT:    ret void
4822;
4823;
4824; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..6
4825; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4826; CHECK1-NEXT:  entry:
4827; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4828; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4829; CHECK1-NEXT:    ret void
4830;
4831;
4832; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..7
4833; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4834; CHECK1-NEXT:  entry:
4835; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4836; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4837; CHECK1-NEXT:    ret void
4838;
4839;
4840; CHECK1-LABEL: define {{[^@]+}}@merge_seq
4841; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4842; CHECK1-NEXT:  entry:
4843; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
4844; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4845; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
4846; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
4847; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
4848; CHECK1:       omp_parallel:
4849; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
4850; CHECK1-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
4851; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge_seq..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
4852; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4853; CHECK1:       omp.par.outlined.exit:
4854; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4855; CHECK1:       omp.par.exit.split:
4856; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4857; CHECK1:       entry.split.split:
4858; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
4859; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4860; CHECK1-NEXT:    ret void
4861;
4862;
4863; CHECK1-LABEL: define {{[^@]+}}@merge_seq..omp_par
4864; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
4865; CHECK1-NEXT:  omp.par.entry:
4866; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
4867; CHECK1-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
4868; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4869; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4870; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
4871; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4872; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4873; CHECK1:       omp.par.region:
4874; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4875; CHECK1:       omp.par.merged:
4876; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..8 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
4877; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
4878; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4879; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
4880; CHECK1-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4881; CHECK1-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
4882; CHECK1-NEXT:    br i1 [[TMP3]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4883; CHECK1:       omp_region.end:
4884; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
4885; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4886; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4887; CHECK1:       omp.par.merged.split.split:
4888; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..9 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
4889; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4890; CHECK1:       entry.split:
4891; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4892; CHECK1:       omp.par.region.split:
4893; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4894; CHECK1:       omp.par.pre_finalize:
4895; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4896; CHECK1:       omp_region.body:
4897; CHECK1-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4898; CHECK1:       seq.par.merged:
4899; CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[LOADGEP_A_ADDR]], align 4
4900; CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
4901; CHECK1-NEXT:    store i32 [[ADD]], i32* [[LOADGEP_A_ADDR]], align 4
4902; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4903; CHECK1:       omp.par.merged.split:
4904; CHECK1-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4905; CHECK1:       omp_region.body.split:
4906; CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4907; CHECK1-NEXT:    br label [[OMP_REGION_END]]
4908; CHECK1:       omp.par.outlined.exit.exitStub:
4909; CHECK1-NEXT:    ret void
4910;
4911;
4912; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..8
4913; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4914; CHECK1-NEXT:  entry:
4915; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4916; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4917; CHECK1-NEXT:    ret void
4918;
4919;
4920; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..9
4921; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4922; CHECK1-NEXT:  entry:
4923; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
4924; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
4925; CHECK1-NEXT:    ret void
4926;
4927;
4928; CHECK1-LABEL: define {{[^@]+}}@merge_seq_float
4929; CHECK1-SAME: (float [[F:%.*]], float* nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
4930; CHECK1-NEXT:  entry:
4931; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { float*, float*, float* }, align 8
4932; CHECK1-NEXT:    [[F_RELOADED:%.*]] = alloca float, align 4
4933; CHECK1-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
4934; CHECK1-NEXT:    store float [[F]], float* [[F_ADDR]], align 4
4935; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
4936; CHECK1-NEXT:    store float [[F]], float* [[F_RELOADED]], align 4
4937; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
4938; CHECK1:       omp_parallel:
4939; CHECK1-NEXT:    [[GEP_F_RELOADED:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[STRUCTARG]], i32 0, i32 0
4940; CHECK1-NEXT:    store float* [[F_RELOADED]], float** [[GEP_F_RELOADED]], align 8
4941; CHECK1-NEXT:    [[GEP_F_ADDR:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[STRUCTARG]], i32 0, i32 1
4942; CHECK1-NEXT:    store float* [[F_ADDR]], float** [[GEP_F_ADDR]], align 8
4943; CHECK1-NEXT:    [[GEP_P:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[STRUCTARG]], i32 0, i32 2
4944; CHECK1-NEXT:    store float* [[P]], float** [[GEP_P]], align 8
4945; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { float*, float*, float* }*)* @merge_seq_float..omp_par to void (i32*, i32*, ...)*), { float*, float*, float* }* [[STRUCTARG]])
4946; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4947; CHECK1:       omp.par.outlined.exit:
4948; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4949; CHECK1:       omp.par.exit.split:
4950; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4951; CHECK1:       entry.split.split:
4952; CHECK1-NEXT:    ret void
4953;
4954;
4955; CHECK1-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
4956; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { float*, float*, float* }* [[TMP0:%.*]]) #[[ATTR0]] {
4957; CHECK1-NEXT:  omp.par.entry:
4958; CHECK1-NEXT:    [[GEP_F_RELOADED:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[TMP0]], i32 0, i32 0
4959; CHECK1-NEXT:    [[LOADGEP_F_RELOADED:%.*]] = load float*, float** [[GEP_F_RELOADED]], align 8
4960; CHECK1-NEXT:    [[GEP_F_ADDR:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[TMP0]], i32 0, i32 1
4961; CHECK1-NEXT:    [[LOADGEP_F_ADDR:%.*]] = load float*, float** [[GEP_F_ADDR]], align 8
4962; CHECK1-NEXT:    [[GEP_P:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[TMP0]], i32 0, i32 2
4963; CHECK1-NEXT:    [[LOADGEP_P:%.*]] = load float*, float** [[GEP_P]], align 8
4964; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4965; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4966; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
4967; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4968; CHECK1-NEXT:    [[TMP2:%.*]] = load float, float* [[LOADGEP_F_RELOADED]], align 4
4969; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4970; CHECK1:       omp.par.region:
4971; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4972; CHECK1:       omp.par.merged:
4973; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, float*)* @.omp_outlined..10 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_F_ADDR]])
4974; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
4975; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4976; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
4977; CHECK1-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4978; CHECK1-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
4979; CHECK1-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4980; CHECK1:       omp_region.end:
4981; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
4982; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4983; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4984; CHECK1:       omp.par.merged.split.split:
4985; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, float*)* @.omp_outlined..11 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_F_ADDR]])
4986; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4987; CHECK1:       entry.split:
4988; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4989; CHECK1:       omp.par.region.split:
4990; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4991; CHECK1:       omp.par.pre_finalize:
4992; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4993; CHECK1:       omp_region.body:
4994; CHECK1-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4995; CHECK1:       seq.par.merged:
4996; CHECK1-NEXT:    [[ADD:%.*]] = fadd float [[TMP2]], 0x40091EB860000000
4997; CHECK1-NEXT:    store float [[ADD]], float* [[LOADGEP_P]], align 4
4998; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4999; CHECK1:       omp.par.merged.split:
5000; CHECK1-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5001; CHECK1:       omp_region.body.split:
5002; CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5003; CHECK1-NEXT:    br label [[OMP_REGION_END]]
5004; CHECK1:       omp.par.outlined.exit.exitStub:
5005; CHECK1-NEXT:    ret void
5006;
5007;
5008; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..10
5009; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
5010; CHECK1-NEXT:  entry:
5011; CHECK1-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
5012; CHECK1-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
5013; CHECK1-NEXT:    call void @use(i32 [[CONV]])
5014; CHECK1-NEXT:    ret void
5015;
5016;
5017; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..11
5018; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
5019; CHECK1-NEXT:  entry:
5020; CHECK1-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
5021; CHECK1-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
5022; CHECK1-NEXT:    call void @use(i32 [[CONV]])
5023; CHECK1-NEXT:    ret void
5024;
5025;
5026; CHECK1-LABEL: define {{[^@]+}}@merge_seq_firstprivate
5027; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5028; CHECK1-NEXT:  entry:
5029; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i64* }, align 8
5030; CHECK1-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
5031; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5032; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5033; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5034; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
5035; CHECK1:       omp_parallel:
5036; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i64* }, { i32*, i64* }* [[STRUCTARG]], i32 0, i32 0
5037; CHECK1-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
5038; CHECK1-NEXT:    [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i64* }, { i32*, i64* }* [[STRUCTARG]], i32 0, i32 1
5039; CHECK1-NEXT:    store i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], i64** [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
5040; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i64* }*)* @merge_seq_firstprivate..omp_par to void (i32*, i32*, ...)*), { i32*, i64* }* [[STRUCTARG]])
5041; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5042; CHECK1:       omp.par.outlined.exit:
5043; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5044; CHECK1:       omp.par.exit.split:
5045; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5046; CHECK1:       entry.split.split:
5047; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
5048; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5049; CHECK1-NEXT:    ret void
5050;
5051;
5052; CHECK1-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
5053; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i64* }* [[TMP0:%.*]]) #[[ATTR0]] {
5054; CHECK1-NEXT:  omp.par.entry:
5055; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i64* }, { i32*, i64* }* [[TMP0]], i32 0, i32 0
5056; CHECK1-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
5057; CHECK1-NEXT:    [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i64* }, { i32*, i64* }* [[TMP0]], i32 0, i32 1
5058; CHECK1-NEXT:    [[LOADGEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = load i64*, i64** [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
5059; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5060; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
5061; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
5062; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
5063; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5064; CHECK1:       omp.par.region:
5065; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5066; CHECK1:       omp.par.merged:
5067; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..12 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5068; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5069; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5070; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5071; CHECK1-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5072; CHECK1-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
5073; CHECK1-NEXT:    br i1 [[TMP3]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5074; CHECK1:       omp_region.end:
5075; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5076; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5077; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5078; CHECK1:       omp.par.merged.split.split:
5079; CHECK1-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, i64* [[LOADGEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
5080; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i64)* @.omp_outlined..13 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
5081; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5082; CHECK1:       entry.split:
5083; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5084; CHECK1:       omp.par.region.split:
5085; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5086; CHECK1:       omp.par.pre_finalize:
5087; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5088; CHECK1:       omp_region.body:
5089; CHECK1-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5090; CHECK1:       seq.par.merged:
5091; CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[LOADGEP_A_ADDR]], align 4
5092; CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
5093; CHECK1-NEXT:    store i32 [[ADD]], i32* [[LOADGEP_A_ADDR]], align 4
5094; CHECK1-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
5095; CHECK1-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], i64* [[LOADGEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
5096; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5097; CHECK1:       omp.par.merged.split:
5098; CHECK1-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5099; CHECK1:       omp_region.body.split:
5100; CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5101; CHECK1-NEXT:    br label [[OMP_REGION_END]]
5102; CHECK1:       omp.par.outlined.exit.exitStub:
5103; CHECK1-NEXT:    ret void
5104;
5105;
5106; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..12
5107; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5108; CHECK1-NEXT:  entry:
5109; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5110; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5111; CHECK1-NEXT:    ret void
5112;
5113;
5114; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..13
5115; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
5116; CHECK1-NEXT:  entry:
5117; CHECK1-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
5118; CHECK1-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
5119; CHECK1-NEXT:    ret void
5120;
5121;
5122; CHECK1-LABEL: define {{[^@]+}}@merge_seq_sink_lt
5123; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5124; CHECK1-NEXT:  entry:
5125; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
5126; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5127; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5128; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5129; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
5130; CHECK1:       omp_parallel:
5131; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
5132; CHECK1-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
5133; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge_seq_sink_lt..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
5134; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5135; CHECK1:       omp.par.outlined.exit:
5136; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5137; CHECK1:       omp.par.exit.split:
5138; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5139; CHECK1:       entry.split.split:
5140; CHECK1-NEXT:    ret void
5141;
5142;
5143; CHECK1-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
5144; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
5145; CHECK1-NEXT:  omp.par.entry:
5146; CHECK1-NEXT:    [[B:%.*]] = alloca i32, align 4
5147; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
5148; CHECK1-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
5149; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5150; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
5151; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
5152; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
5153; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5154; CHECK1:       omp.par.region:
5155; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5156; CHECK1:       omp.par.merged:
5157; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..14 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5158; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5159; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5160; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5161; CHECK1-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5162; CHECK1-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
5163; CHECK1-NEXT:    br i1 [[TMP3]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5164; CHECK1:       omp_region.end:
5165; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5166; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5167; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5168; CHECK1:       omp.par.merged.split.split:
5169; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..15 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5170; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5171; CHECK1:       entry.split:
5172; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5173; CHECK1:       omp.par.region.split:
5174; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5175; CHECK1:       omp.par.pre_finalize:
5176; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5177; CHECK1:       omp_region.body:
5178; CHECK1-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5179; CHECK1:       seq.par.merged:
5180; CHECK1-NEXT:    [[TMP4:%.*]] = bitcast i32* [[B]] to i8*
5181; CHECK1-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP4]])
5182; CHECK1-NEXT:    [[TMP5:%.*]] = ptrtoint i32* [[B]] to i64
5183; CHECK1-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i32
5184; CHECK1-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP4]])
5185; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5186; CHECK1:       omp.par.merged.split:
5187; CHECK1-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5188; CHECK1:       omp_region.body.split:
5189; CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5190; CHECK1-NEXT:    br label [[OMP_REGION_END]]
5191; CHECK1:       omp.par.outlined.exit.exitStub:
5192; CHECK1-NEXT:    ret void
5193;
5194;
5195; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..14
5196; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5197; CHECK1-NEXT:  entry:
5198; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5199; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5200; CHECK1-NEXT:    ret void
5201;
5202;
5203; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..15
5204; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5205; CHECK1-NEXT:  entry:
5206; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5207; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5208; CHECK1-NEXT:    ret void
5209;
5210;
5211; CHECK1-LABEL: define {{[^@]+}}@merge_seq_par_use
5212; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5213; CHECK1-NEXT:  entry:
5214; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i32*, i32* }, align 8
5215; CHECK1-NEXT:    [[A_RELOADED:%.*]] = alloca i32, align 4
5216; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5217; CHECK1-NEXT:    [[B:%.*]] = alloca i32, align 4
5218; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5219; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5220; CHECK1-NEXT:    store i32 [[A]], i32* [[A_RELOADED]], align 4
5221; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
5222; CHECK1:       omp_parallel:
5223; CHECK1-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 0
5224; CHECK1-NEXT:    store i32* [[A_RELOADED]], i32** [[GEP_A_RELOADED]], align 8
5225; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 1
5226; CHECK1-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
5227; CHECK1-NEXT:    [[GEP_B:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 2
5228; CHECK1-NEXT:    store i32* [[B]], i32** [[GEP_B]], align 8
5229; CHECK1-NEXT:    [[LT_CAST3:%.*]] = bitcast i32* [[B]] to i8*
5230; CHECK1-NEXT:    call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]])
5231; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i32*, i32* }*)* @merge_seq_par_use..omp_par to void (i32*, i32*, ...)*), { i32*, i32*, i32* }* [[STRUCTARG]])
5232; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5233; CHECK1:       omp.par.outlined.exit:
5234; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5235; CHECK1:       omp.par.exit.split:
5236; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5237; CHECK1:       entry.split.split:
5238; CHECK1-NEXT:    [[LT_CAST:%.*]] = bitcast i32* [[B]] to i8*
5239; CHECK1-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[LT_CAST]])
5240; CHECK1-NEXT:    ret void
5241;
5242;
5243; CHECK1-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
5244; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i32*, i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
5245; CHECK1-NEXT:  omp.par.entry:
5246; CHECK1-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 0
5247; CHECK1-NEXT:    [[LOADGEP_A_RELOADED:%.*]] = load i32*, i32** [[GEP_A_RELOADED]], align 8
5248; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 1
5249; CHECK1-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
5250; CHECK1-NEXT:    [[GEP_B:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 2
5251; CHECK1-NEXT:    [[LOADGEP_B:%.*]] = load i32*, i32** [[GEP_B]], align 8
5252; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5253; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
5254; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
5255; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
5256; CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[LOADGEP_A_RELOADED]], align 4
5257; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5258; CHECK1:       omp.par.region:
5259; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5260; CHECK1:       omp.par.merged:
5261; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..16 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5262; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5263; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5264; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5265; CHECK1-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5266; CHECK1-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
5267; CHECK1-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5268; CHECK1:       omp_region.end:
5269; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5270; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5271; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5272; CHECK1:       omp.par.merged.split.split:
5273; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..17 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_B]])
5274; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5275; CHECK1:       entry.split:
5276; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5277; CHECK1:       omp.par.region.split:
5278; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5279; CHECK1:       omp.par.pre_finalize:
5280; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5281; CHECK1:       omp_region.body:
5282; CHECK1-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5283; CHECK1:       seq.par.merged:
5284; CHECK1-NEXT:    [[TMP5:%.*]] = bitcast i32* [[LOADGEP_B]] to i8*
5285; CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
5286; CHECK1-NEXT:    store i32 [[ADD]], i32* [[LOADGEP_B]], align 4
5287; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5288; CHECK1:       omp.par.merged.split:
5289; CHECK1-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5290; CHECK1:       omp_region.body.split:
5291; CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5292; CHECK1-NEXT:    br label [[OMP_REGION_END]]
5293; CHECK1:       omp.par.outlined.exit.exitStub:
5294; CHECK1-NEXT:    ret void
5295;
5296;
5297; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..16
5298; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5299; CHECK1-NEXT:  entry:
5300; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5301; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5302; CHECK1-NEXT:    ret void
5303;
5304;
5305; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..17
5306; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
5307; CHECK1-NEXT:  entry:
5308; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5309; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5310; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4
5311; CHECK1-NEXT:    call void @use(i32 [[TMP1]])
5312; CHECK1-NEXT:    ret void
5313;
5314;
5315; CHECK1-LABEL: define {{[^@]+}}@merge_cancellable_regions
5316; CHECK1-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
5317; CHECK1-NEXT:  entry:
5318; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i32* }, align 8
5319; CHECK1-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
5320; CHECK1-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
5321; CHECK1-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
5322; CHECK1-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
5323; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5324; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
5325; CHECK1:       omp_parallel:
5326; CHECK1-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { i32*, i32* }, { i32*, i32* }* [[STRUCTARG]], i32 0, i32 0
5327; CHECK1-NEXT:    store i32* [[CANCEL1_ADDR]], i32** [[GEP_CANCEL1_ADDR]], align 8
5328; CHECK1-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { i32*, i32* }, { i32*, i32* }* [[STRUCTARG]], i32 0, i32 1
5329; CHECK1-NEXT:    store i32* [[CANCEL2_ADDR]], i32** [[GEP_CANCEL2_ADDR]], align 8
5330; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i32* }*)* @merge_cancellable_regions..omp_par to void (i32*, i32*, ...)*), { i32*, i32* }* [[STRUCTARG]])
5331; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5332; CHECK1:       omp.par.outlined.exit:
5333; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5334; CHECK1:       omp.par.exit.split:
5335; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5336; CHECK1:       entry.split.split:
5337; CHECK1-NEXT:    ret void
5338;
5339;
5340; CHECK1-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
5341; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
5342; CHECK1-NEXT:  omp.par.entry:
5343; CHECK1-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { i32*, i32* }, { i32*, i32* }* [[TMP0]], i32 0, i32 0
5344; CHECK1-NEXT:    [[LOADGEP_CANCEL1_ADDR:%.*]] = load i32*, i32** [[GEP_CANCEL1_ADDR]], align 8
5345; CHECK1-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { i32*, i32* }, { i32*, i32* }* [[TMP0]], i32 0, i32 1
5346; CHECK1-NEXT:    [[LOADGEP_CANCEL2_ADDR:%.*]] = load i32*, i32** [[GEP_CANCEL2_ADDR]], align 8
5347; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5348; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
5349; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
5350; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
5351; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5352; CHECK1:       omp.par.region:
5353; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5354; CHECK1:       omp.par.merged:
5355; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..18 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_CANCEL1_ADDR]])
5356; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5357; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5358; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..19 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_CANCEL2_ADDR]])
5359; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5360; CHECK1:       entry.split:
5361; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5362; CHECK1:       omp.par.region.split:
5363; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5364; CHECK1:       omp.par.pre_finalize:
5365; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5366; CHECK1:       omp.par.outlined.exit.exitStub:
5367; CHECK1-NEXT:    ret void
5368;
5369;
5370; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..18
5371; CHECK1-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
5372; CHECK1-NEXT:  entry:
5373; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
5374; CHECK1-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
5375; CHECK1-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
5376; CHECK1:       if.then:
5377; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
5378; CHECK1-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
5379; CHECK1-NEXT:    ret void
5380; CHECK1:       if.end:
5381; CHECK1-NEXT:    ret void
5382;
5383;
5384; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..19
5385; CHECK1-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
5386; CHECK1-NEXT:  entry:
5387; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
5388; CHECK1-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
5389; CHECK1-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
5390; CHECK1:       if.then:
5391; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
5392; CHECK1-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
5393; CHECK1-NEXT:    ret void
5394; CHECK1:       if.end:
5395; CHECK1-NEXT:    ret void
5396;
5397;
5398; CHECK1-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
5399; CHECK1-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
5400; CHECK1-NEXT:  entry:
5401; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i32*, i32* }, align 8
5402; CHECK1-NEXT:    [[CANCEL1_RELOADED:%.*]] = alloca i32, align 4
5403; CHECK1-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
5404; CHECK1-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
5405; CHECK1-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
5406; CHECK1-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
5407; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5408; CHECK1-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_RELOADED]], align 4
5409; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
5410; CHECK1:       omp_parallel:
5411; CHECK1-NEXT:    [[GEP_CANCEL1_RELOADED:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 0
5412; CHECK1-NEXT:    store i32* [[CANCEL1_RELOADED]], i32** [[GEP_CANCEL1_RELOADED]], align 8
5413; CHECK1-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 1
5414; CHECK1-NEXT:    store i32* [[CANCEL1_ADDR]], i32** [[GEP_CANCEL1_ADDR]], align 8
5415; CHECK1-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 2
5416; CHECK1-NEXT:    store i32* [[CANCEL2_ADDR]], i32** [[GEP_CANCEL2_ADDR]], align 8
5417; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i32*, i32* }*)* @merge_cancellable_regions_seq..omp_par to void (i32*, i32*, ...)*), { i32*, i32*, i32* }* [[STRUCTARG]])
5418; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5419; CHECK1:       omp.par.outlined.exit:
5420; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5421; CHECK1:       omp.par.exit.split:
5422; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5423; CHECK1:       entry.split.split:
5424; CHECK1-NEXT:    ret void
5425;
5426;
5427; CHECK1-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
5428; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i32*, i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
5429; CHECK1-NEXT:  omp.par.entry:
5430; CHECK1-NEXT:    [[GEP_CANCEL1_RELOADED:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 0
5431; CHECK1-NEXT:    [[LOADGEP_CANCEL1_RELOADED:%.*]] = load i32*, i32** [[GEP_CANCEL1_RELOADED]], align 8
5432; CHECK1-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 1
5433; CHECK1-NEXT:    [[LOADGEP_CANCEL1_ADDR:%.*]] = load i32*, i32** [[GEP_CANCEL1_ADDR]], align 8
5434; CHECK1-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 2
5435; CHECK1-NEXT:    [[LOADGEP_CANCEL2_ADDR:%.*]] = load i32*, i32** [[GEP_CANCEL2_ADDR]], align 8
5436; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5437; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
5438; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
5439; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
5440; CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[LOADGEP_CANCEL1_RELOADED]], align 4
5441; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5442; CHECK1:       omp.par.region:
5443; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5444; CHECK1:       omp.par.merged:
5445; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..20 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_CANCEL1_ADDR]])
5446; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5447; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5448; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5449; CHECK1-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5450; CHECK1-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
5451; CHECK1-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5452; CHECK1:       omp_region.end:
5453; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5454; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5455; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5456; CHECK1:       omp.par.merged.split.split:
5457; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..21 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_CANCEL2_ADDR]])
5458; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5459; CHECK1:       entry.split:
5460; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5461; CHECK1:       omp.par.region.split:
5462; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5463; CHECK1:       omp.par.pre_finalize:
5464; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5465; CHECK1:       omp_region.body:
5466; CHECK1-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5467; CHECK1:       seq.par.merged:
5468; CHECK1-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP2]], 0
5469; CHECK1-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
5470; CHECK1-NEXT:    store i32 [[LNOT_EXT]], i32* [[LOADGEP_CANCEL2_ADDR]], align 4
5471; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5472; CHECK1:       omp.par.merged.split:
5473; CHECK1-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5474; CHECK1:       omp_region.body.split:
5475; CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5476; CHECK1-NEXT:    br label [[OMP_REGION_END]]
5477; CHECK1:       omp.par.outlined.exit.exitStub:
5478; CHECK1-NEXT:    ret void
5479;
5480;
5481; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..20
5482; CHECK1-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
5483; CHECK1-NEXT:  entry:
5484; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
5485; CHECK1-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
5486; CHECK1-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
5487; CHECK1:       if.then:
5488; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
5489; CHECK1-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
5490; CHECK1-NEXT:    ret void
5491; CHECK1:       if.end:
5492; CHECK1-NEXT:    ret void
5493;
5494;
5495; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..21
5496; CHECK1-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
5497; CHECK1-NEXT:  entry:
5498; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
5499; CHECK1-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
5500; CHECK1-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
5501; CHECK1:       if.then:
5502; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
5503; CHECK1-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
5504; CHECK1-NEXT:    ret void
5505; CHECK1:       if.end:
5506; CHECK1-NEXT:    ret void
5507;
5508;
5509; CHECK1-LABEL: define {{[^@]+}}@merge_3
5510; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5511; CHECK1-NEXT:  entry:
5512; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
5513; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5514; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5515; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5516; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
5517; CHECK1:       omp_parallel:
5518; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
5519; CHECK1-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
5520; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge_3..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
5521; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5522; CHECK1:       omp.par.outlined.exit:
5523; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5524; CHECK1:       omp.par.exit.split:
5525; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5526; CHECK1:       entry.split.split:
5527; CHECK1-NEXT:    ret void
5528;
5529;
5530; CHECK1-LABEL: define {{[^@]+}}@merge_3..omp_par
5531; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
5532; CHECK1-NEXT:  omp.par.entry:
5533; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
5534; CHECK1-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
5535; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5536; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
5537; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
5538; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
5539; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5540; CHECK1:       omp.par.region:
5541; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5542; CHECK1:       omp.par.merged:
5543; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..22 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5544; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5545; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5546; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..23 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5547; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5548; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5549; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..24 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5550; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5551; CHECK1:       entry.split:
5552; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5553; CHECK1:       omp.par.region.split:
5554; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5555; CHECK1:       omp.par.pre_finalize:
5556; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5557; CHECK1:       omp.par.outlined.exit.exitStub:
5558; CHECK1-NEXT:    ret void
5559;
5560;
5561; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..22
5562; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5563; CHECK1-NEXT:  entry:
5564; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5565; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5566; CHECK1-NEXT:    ret void
5567;
5568;
5569; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..23
5570; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5571; CHECK1-NEXT:  entry:
5572; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5573; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5574; CHECK1-NEXT:    ret void
5575;
5576;
5577; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..24
5578; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5579; CHECK1-NEXT:  entry:
5580; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5581; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5582; CHECK1-NEXT:    ret void
5583;
5584;
5585; CHECK1-LABEL: define {{[^@]+}}@merge_3_seq
5586; CHECK1-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
5587; CHECK1-NEXT:  entry:
5588; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i32*, i32*, i32* }, align 8
5589; CHECK1-NEXT:    [[A_RELOADED:%.*]] = alloca i32, align 4
5590; CHECK1-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
5591; CHECK1-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
5592; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5593; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5594; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5595; CHECK1-NEXT:    store i32 [[A]], i32* [[A_RELOADED]], align 4
5596; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
5597; CHECK1:       omp_parallel:
5598; CHECK1-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 0
5599; CHECK1-NEXT:    store i32* [[A_RELOADED]], i32** [[GEP_A_RELOADED]], align 8
5600; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 1
5601; CHECK1-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
5602; CHECK1-NEXT:    [[GEP_ADD_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 2
5603; CHECK1-NEXT:    store i32* [[ADD_SEQ_OUTPUT_ALLOC]], i32** [[GEP_ADD_SEQ_OUTPUT_ALLOC]], align 8
5604; CHECK1-NEXT:    [[GEP_ADD1_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 3
5605; CHECK1-NEXT:    store i32* [[ADD1_SEQ_OUTPUT_ALLOC]], i32** [[GEP_ADD1_SEQ_OUTPUT_ALLOC]], align 8
5606; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i32*, i32*, i32* }*)* @merge_3_seq..omp_par to void (i32*, i32*, ...)*), { i32*, i32*, i32*, i32* }* [[STRUCTARG]])
5607; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5608; CHECK1:       omp.par.outlined.exit:
5609; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5610; CHECK1:       omp.par.exit.split:
5611; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5612; CHECK1:       entry.split.split:
5613; CHECK1-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
5614; CHECK1-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
5615; CHECK1-NEXT:    ret void
5616;
5617;
5618; CHECK1-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
5619; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i32*, i32*, i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
5620; CHECK1-NEXT:  omp.par.entry:
5621; CHECK1-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[TMP0]], i32 0, i32 0
5622; CHECK1-NEXT:    [[LOADGEP_A_RELOADED:%.*]] = load i32*, i32** [[GEP_A_RELOADED]], align 8
5623; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[TMP0]], i32 0, i32 1
5624; CHECK1-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
5625; CHECK1-NEXT:    [[GEP_ADD_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[TMP0]], i32 0, i32 2
5626; CHECK1-NEXT:    [[LOADGEP_ADD_SEQ_OUTPUT_ALLOC:%.*]] = load i32*, i32** [[GEP_ADD_SEQ_OUTPUT_ALLOC]], align 8
5627; CHECK1-NEXT:    [[GEP_ADD1_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[TMP0]], i32 0, i32 3
5628; CHECK1-NEXT:    [[LOADGEP_ADD1_SEQ_OUTPUT_ALLOC:%.*]] = load i32*, i32** [[GEP_ADD1_SEQ_OUTPUT_ALLOC]], align 8
5629; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5630; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
5631; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
5632; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
5633; CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[LOADGEP_A_RELOADED]], align 4
5634; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5635; CHECK1:       omp.par.region:
5636; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5637; CHECK1:       omp.par.merged:
5638; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..25 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5639; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5640; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5641; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5642; CHECK1-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5643; CHECK1-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
5644; CHECK1-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5645; CHECK1:       omp_region.end:
5646; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5647; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5648; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5649; CHECK1:       omp.par.merged.split.split:
5650; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..26 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5651; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5652; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
5653; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5654; CHECK1-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
5655; CHECK1-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
5656; CHECK1-NEXT:    br i1 [[TMP6]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
5657; CHECK1:       omp_region.end4:
5658; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5659; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
5660; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
5661; CHECK1:       omp.par.merged.split.split.split.split:
5662; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..27 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5663; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5664; CHECK1:       entry.split:
5665; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5666; CHECK1:       omp.par.region.split:
5667; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5668; CHECK1:       omp.par.pre_finalize:
5669; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5670; CHECK1:       omp_region.body5:
5671; CHECK1-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
5672; CHECK1:       seq.par.merged2:
5673; CHECK1-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[LOADGEP_ADD_SEQ_OUTPUT_ALLOC]], align 4
5674; CHECK1-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP2]]
5675; CHECK1-NEXT:    store i32 [[ADD1]], i32* [[LOADGEP_ADD1_SEQ_OUTPUT_ALLOC]], align 4
5676; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
5677; CHECK1:       omp.par.merged.split.split.split:
5678; CHECK1-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
5679; CHECK1:       omp_region.body5.split:
5680; CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
5681; CHECK1-NEXT:    br label [[OMP_REGION_END4]]
5682; CHECK1:       omp_region.body:
5683; CHECK1-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5684; CHECK1:       seq.par.merged:
5685; CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
5686; CHECK1-NEXT:    store i32 [[ADD]], i32* [[LOADGEP_ADD_SEQ_OUTPUT_ALLOC]], align 4
5687; CHECK1-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5688; CHECK1:       omp.par.merged.split:
5689; CHECK1-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5690; CHECK1:       omp_region.body.split:
5691; CHECK1-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5692; CHECK1-NEXT:    br label [[OMP_REGION_END]]
5693; CHECK1:       omp.par.outlined.exit.exitStub:
5694; CHECK1-NEXT:    ret void
5695;
5696;
5697; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..25
5698; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5699; CHECK1-NEXT:  entry:
5700; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5701; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5702; CHECK1-NEXT:    ret void
5703;
5704;
5705; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..26
5706; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5707; CHECK1-NEXT:  entry:
5708; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5709; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5710; CHECK1-NEXT:    ret void
5711;
5712;
5713; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..27
5714; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5715; CHECK1-NEXT:  entry:
5716; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5717; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5718; CHECK1-NEXT:    ret void
5719;
5720;
5721; CHECK1-LABEL: define {{[^@]+}}@unmergable_3_seq_call
5722; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5723; CHECK1-NEXT:  entry:
5724; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5725; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5726; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5727; CHECK1-NEXT:    call void (...) @foo()
5728; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5729; CHECK1-NEXT:    call void (...) @foo()
5730; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5731; CHECK1-NEXT:    ret void
5732;
5733;
5734; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..28
5735; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5736; CHECK1-NEXT:  entry:
5737; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5738; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5739; CHECK1-NEXT:    ret void
5740;
5741;
5742; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..29
5743; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5744; CHECK1-NEXT:  entry:
5745; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5746; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5747; CHECK1-NEXT:    ret void
5748;
5749;
5750; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..30
5751; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5752; CHECK1-NEXT:  entry:
5753; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5754; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5755; CHECK1-NEXT:    ret void
5756;
5757;
5758; CHECK1-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
5759; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5760; CHECK1-NEXT:  entry:
5761; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5762; CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
5763; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5764; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5765; CHECK1-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
5766; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5767; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5768; CHECK1-NEXT:    ret void
5769;
5770;
5771; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..31
5772; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5773; CHECK1-NEXT:  entry:
5774; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5775; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5776; CHECK1-NEXT:    ret void
5777;
5778;
5779; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..32
5780; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5781; CHECK1-NEXT:  entry:
5782; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5783; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5784; CHECK1-NEXT:    ret void
5785;
5786;
5787; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..33
5788; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5789; CHECK1-NEXT:  entry:
5790; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5791; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5792; CHECK1-NEXT:    ret void
5793;
5794;
5795; CHECK1-LABEL: define {{[^@]+}}@unmergable_3_num_threads
5796; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5797; CHECK1-NEXT:  entry:
5798; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5799; CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
5800; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5801; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5802; CHECK1-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
5803; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5804; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5805; CHECK1-NEXT:    ret void
5806;
5807;
5808; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..34
5809; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5810; CHECK1-NEXT:  entry:
5811; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5812; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5813; CHECK1-NEXT:    ret void
5814;
5815;
5816; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..35
5817; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5818; CHECK1-NEXT:  entry:
5819; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5820; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5821; CHECK1-NEXT:    ret void
5822;
5823;
5824; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..36
5825; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5826; CHECK1-NEXT:  entry:
5827; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5828; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5829; CHECK1-NEXT:    ret void
5830;
5831;
5832; CHECK1-LABEL: define {{[^@]+}}@merge_2_unmergable_1
5833; CHECK1-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5834; CHECK1-NEXT:  entry:
5835; CHECK1-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
5836; CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5837; CHECK1-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5838; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5839; CHECK1-NEXT:    br label [[OMP_PARALLEL:%.*]]
5840; CHECK1:       omp_parallel:
5841; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
5842; CHECK1-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
5843; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge_2_unmergable_1..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
5844; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5845; CHECK1:       omp.par.outlined.exit:
5846; CHECK1-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5847; CHECK1:       omp.par.exit.split:
5848; CHECK1-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5849; CHECK1:       entry.split.split:
5850; CHECK1-NEXT:    call void (...) @foo()
5851; CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5852; CHECK1-NEXT:    ret void
5853;
5854;
5855; CHECK1-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
5856; CHECK1-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
5857; CHECK1-NEXT:  omp.par.entry:
5858; CHECK1-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
5859; CHECK1-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
5860; CHECK1-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5861; CHECK1-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
5862; CHECK1-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
5863; CHECK1-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
5864; CHECK1-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5865; CHECK1:       omp.par.region:
5866; CHECK1-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5867; CHECK1:       omp.par.merged:
5868; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..37 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5869; CHECK1-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5870; CHECK1-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5871; CHECK1-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..38 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5872; CHECK1-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5873; CHECK1:       entry.split:
5874; CHECK1-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5875; CHECK1:       omp.par.region.split:
5876; CHECK1-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5877; CHECK1:       omp.par.pre_finalize:
5878; CHECK1-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5879; CHECK1:       omp.par.outlined.exit.exitStub:
5880; CHECK1-NEXT:    ret void
5881;
5882;
5883; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..37
5884; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5885; CHECK1-NEXT:  entry:
5886; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5887; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5888; CHECK1-NEXT:    ret void
5889;
5890;
5891; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..38
5892; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5893; CHECK1-NEXT:  entry:
5894; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5895; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5896; CHECK1-NEXT:    ret void
5897;
5898;
5899; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..39
5900; CHECK1-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5901; CHECK1-NEXT:  entry:
5902; CHECK1-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5903; CHECK1-NEXT:    call void @use(i32 [[TMP0]])
5904; CHECK1-NEXT:    ret void
5905;
5906;
5907; CHECK2-LABEL: define {{[^@]+}}@merge
5908; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5909; CHECK2-NEXT:  entry:
5910; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
5911; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5912; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5913; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]])
5914; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
5915; CHECK2:       omp_parallel:
5916; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
5917; CHECK2-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
5918; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
5919; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5920; CHECK2:       omp.par.outlined.exit:
5921; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5922; CHECK2:       omp.par.exit.split:
5923; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5924; CHECK2:       entry.split.split:
5925; CHECK2-NEXT:    ret void
5926;
5927;
5928; CHECK2-LABEL: define {{[^@]+}}@merge..omp_par
5929; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
5930; CHECK2-NEXT:  omp.par.entry:
5931; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
5932; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
5933; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5934; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
5935; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
5936; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
5937; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5938; CHECK2:       omp.par.region:
5939; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5940; CHECK2:       omp.par.merged:
5941; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5942; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
5943; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5944; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
5945; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5946; CHECK2:       entry.split:
5947; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5948; CHECK2:       omp.par.region.split:
5949; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5950; CHECK2:       omp.par.pre_finalize:
5951; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5952; CHECK2:       omp.par.outlined.exit.exitStub:
5953; CHECK2-NEXT:    ret void
5954;
5955;
5956; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
5957; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5958; CHECK2-NEXT:  entry:
5959; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5960; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5961; CHECK2-NEXT:    ret void
5962;
5963;
5964; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..1
5965; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5966; CHECK2-NEXT:  entry:
5967; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5968; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5969; CHECK2-NEXT:    ret void
5970;
5971;
5972; CHECK2-LABEL: define {{[^@]+}}@unmergable_proc_bind
5973; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5974; CHECK2-NEXT:  entry:
5975; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5976; CHECK2-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1:[0-9]+]])
5977; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
5978; CHECK2-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
5979; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5980; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
5981; CHECK2-NEXT:    ret void
5982;
5983;
5984; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..2
5985; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5986; CHECK2-NEXT:  entry:
5987; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5988; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5989; CHECK2-NEXT:    ret void
5990;
5991;
5992; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..3
5993; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
5994; CHECK2-NEXT:  entry:
5995; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
5996; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5997; CHECK2-NEXT:    ret void
5998;
5999;
6000; CHECK2-LABEL: define {{[^@]+}}@unmergable_num_threads
6001; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
6002; CHECK2-NEXT:  entry:
6003; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6004; CHECK2-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
6005; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6006; CHECK2-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
6007; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6008; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6009; CHECK2-NEXT:    ret void
6010;
6011;
6012; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..4
6013; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6014; CHECK2-NEXT:  entry:
6015; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6016; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6017; CHECK2-NEXT:    ret void
6018;
6019;
6020; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..5
6021; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6022; CHECK2-NEXT:  entry:
6023; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6024; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6025; CHECK2-NEXT:    ret void
6026;
6027;
6028; CHECK2-LABEL: define {{[^@]+}}@unmergable_seq_call
6029; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
6030; CHECK2-NEXT:  entry:
6031; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6032; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6033; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6034; CHECK2-NEXT:    call void (...) @foo()
6035; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6036; CHECK2-NEXT:    ret void
6037;
6038;
6039; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..6
6040; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6041; CHECK2-NEXT:  entry:
6042; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6043; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6044; CHECK2-NEXT:    ret void
6045;
6046;
6047; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..7
6048; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6049; CHECK2-NEXT:  entry:
6050; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6051; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6052; CHECK2-NEXT:    ret void
6053;
6054;
6055; CHECK2-LABEL: define {{[^@]+}}@merge_seq
6056; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
6057; CHECK2-NEXT:  entry:
6058; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
6059; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6060; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6061; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6062; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
6063; CHECK2:       omp_parallel:
6064; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
6065; CHECK2-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
6066; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge_seq..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
6067; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
6068; CHECK2:       omp.par.outlined.exit:
6069; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
6070; CHECK2:       omp.par.exit.split:
6071; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
6072; CHECK2:       entry.split.split:
6073; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
6074; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6075; CHECK2-NEXT:    ret void
6076;
6077;
6078; CHECK2-LABEL: define {{[^@]+}}@merge_seq..omp_par
6079; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
6080; CHECK2-NEXT:  omp.par.entry:
6081; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
6082; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
6083; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
6084; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
6085; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
6086; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
6087; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
6088; CHECK2:       omp.par.region:
6089; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
6090; CHECK2:       omp.par.merged:
6091; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..8 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6092; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6093; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
6094; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6095; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6096; CHECK2-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
6097; CHECK2-NEXT:    br i1 [[TMP3]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
6098; CHECK2:       omp_region.end:
6099; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6100; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
6101; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
6102; CHECK2:       omp.par.merged.split.split:
6103; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..9 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6104; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
6105; CHECK2:       entry.split:
6106; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
6107; CHECK2:       omp.par.region.split:
6108; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
6109; CHECK2:       omp.par.pre_finalize:
6110; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
6111; CHECK2:       omp_region.body:
6112; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
6113; CHECK2:       seq.par.merged:
6114; CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[LOADGEP_A_ADDR]], align 4
6115; CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
6116; CHECK2-NEXT:    store i32 [[ADD]], i32* [[LOADGEP_A_ADDR]], align 4
6117; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
6118; CHECK2:       omp.par.merged.split:
6119; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
6120; CHECK2:       omp_region.body.split:
6121; CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6122; CHECK2-NEXT:    br label [[OMP_REGION_END]]
6123; CHECK2:       omp.par.outlined.exit.exitStub:
6124; CHECK2-NEXT:    ret void
6125;
6126;
6127; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..8
6128; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6129; CHECK2-NEXT:  entry:
6130; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6131; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6132; CHECK2-NEXT:    ret void
6133;
6134;
6135; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..9
6136; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6137; CHECK2-NEXT:  entry:
6138; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6139; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6140; CHECK2-NEXT:    ret void
6141;
6142;
6143; CHECK2-LABEL: define {{[^@]+}}@merge_seq_float
6144; CHECK2-SAME: (float [[F:%.*]], float* nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
6145; CHECK2-NEXT:  entry:
6146; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { float*, float*, float* }, align 8
6147; CHECK2-NEXT:    [[F_RELOADED:%.*]] = alloca float, align 4
6148; CHECK2-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
6149; CHECK2-NEXT:    store float [[F]], float* [[F_ADDR]], align 4
6150; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6151; CHECK2-NEXT:    store float [[F]], float* [[F_RELOADED]], align 4
6152; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
6153; CHECK2:       omp_parallel:
6154; CHECK2-NEXT:    [[GEP_F_RELOADED:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[STRUCTARG]], i32 0, i32 0
6155; CHECK2-NEXT:    store float* [[F_RELOADED]], float** [[GEP_F_RELOADED]], align 8
6156; CHECK2-NEXT:    [[GEP_F_ADDR:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[STRUCTARG]], i32 0, i32 1
6157; CHECK2-NEXT:    store float* [[F_ADDR]], float** [[GEP_F_ADDR]], align 8
6158; CHECK2-NEXT:    [[GEP_P:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[STRUCTARG]], i32 0, i32 2
6159; CHECK2-NEXT:    store float* [[P]], float** [[GEP_P]], align 8
6160; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { float*, float*, float* }*)* @merge_seq_float..omp_par to void (i32*, i32*, ...)*), { float*, float*, float* }* [[STRUCTARG]])
6161; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
6162; CHECK2:       omp.par.outlined.exit:
6163; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
6164; CHECK2:       omp.par.exit.split:
6165; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
6166; CHECK2:       entry.split.split:
6167; CHECK2-NEXT:    ret void
6168;
6169;
6170; CHECK2-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
6171; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { float*, float*, float* }* [[TMP0:%.*]]) #[[ATTR0]] {
6172; CHECK2-NEXT:  omp.par.entry:
6173; CHECK2-NEXT:    [[GEP_F_RELOADED:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[TMP0]], i32 0, i32 0
6174; CHECK2-NEXT:    [[LOADGEP_F_RELOADED:%.*]] = load float*, float** [[GEP_F_RELOADED]], align 8
6175; CHECK2-NEXT:    [[GEP_F_ADDR:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[TMP0]], i32 0, i32 1
6176; CHECK2-NEXT:    [[LOADGEP_F_ADDR:%.*]] = load float*, float** [[GEP_F_ADDR]], align 8
6177; CHECK2-NEXT:    [[GEP_P:%.*]] = getelementptr { float*, float*, float* }, { float*, float*, float* }* [[TMP0]], i32 0, i32 2
6178; CHECK2-NEXT:    [[LOADGEP_P:%.*]] = load float*, float** [[GEP_P]], align 8
6179; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
6180; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
6181; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
6182; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
6183; CHECK2-NEXT:    [[TMP2:%.*]] = load float, float* [[LOADGEP_F_RELOADED]], align 4
6184; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
6185; CHECK2:       omp.par.region:
6186; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
6187; CHECK2:       omp.par.merged:
6188; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, float*)* @.omp_outlined..10 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_F_ADDR]])
6189; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6190; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
6191; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6192; CHECK2-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6193; CHECK2-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
6194; CHECK2-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
6195; CHECK2:       omp_region.end:
6196; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6197; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
6198; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
6199; CHECK2:       omp.par.merged.split.split:
6200; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, float*)* @.omp_outlined..11 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_F_ADDR]])
6201; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
6202; CHECK2:       entry.split:
6203; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
6204; CHECK2:       omp.par.region.split:
6205; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
6206; CHECK2:       omp.par.pre_finalize:
6207; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
6208; CHECK2:       omp_region.body:
6209; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
6210; CHECK2:       seq.par.merged:
6211; CHECK2-NEXT:    [[ADD:%.*]] = fadd float [[TMP2]], 0x40091EB860000000
6212; CHECK2-NEXT:    store float [[ADD]], float* [[LOADGEP_P]], align 4
6213; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
6214; CHECK2:       omp.par.merged.split:
6215; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
6216; CHECK2:       omp_region.body.split:
6217; CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6218; CHECK2-NEXT:    br label [[OMP_REGION_END]]
6219; CHECK2:       omp.par.outlined.exit.exitStub:
6220; CHECK2-NEXT:    ret void
6221;
6222;
6223; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..10
6224; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
6225; CHECK2-NEXT:  entry:
6226; CHECK2-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
6227; CHECK2-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
6228; CHECK2-NEXT:    call void @use(i32 [[CONV]])
6229; CHECK2-NEXT:    ret void
6230;
6231;
6232; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..11
6233; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
6234; CHECK2-NEXT:  entry:
6235; CHECK2-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
6236; CHECK2-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
6237; CHECK2-NEXT:    call void @use(i32 [[CONV]])
6238; CHECK2-NEXT:    ret void
6239;
6240;
6241; CHECK2-LABEL: define {{[^@]+}}@merge_seq_firstprivate
6242; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
6243; CHECK2-NEXT:  entry:
6244; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i64* }, align 8
6245; CHECK2-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
6246; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6247; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6248; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6249; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
6250; CHECK2:       omp_parallel:
6251; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i64* }, { i32*, i64* }* [[STRUCTARG]], i32 0, i32 0
6252; CHECK2-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
6253; CHECK2-NEXT:    [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i64* }, { i32*, i64* }* [[STRUCTARG]], i32 0, i32 1
6254; CHECK2-NEXT:    store i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], i64** [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
6255; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i64* }*)* @merge_seq_firstprivate..omp_par to void (i32*, i32*, ...)*), { i32*, i64* }* [[STRUCTARG]])
6256; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
6257; CHECK2:       omp.par.outlined.exit:
6258; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
6259; CHECK2:       omp.par.exit.split:
6260; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
6261; CHECK2:       entry.split.split:
6262; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
6263; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6264; CHECK2-NEXT:    ret void
6265;
6266;
6267; CHECK2-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
6268; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i64* }* [[TMP0:%.*]]) #[[ATTR0]] {
6269; CHECK2-NEXT:  omp.par.entry:
6270; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i64* }, { i32*, i64* }* [[TMP0]], i32 0, i32 0
6271; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
6272; CHECK2-NEXT:    [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i64* }, { i32*, i64* }* [[TMP0]], i32 0, i32 1
6273; CHECK2-NEXT:    [[LOADGEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = load i64*, i64** [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
6274; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
6275; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
6276; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
6277; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
6278; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
6279; CHECK2:       omp.par.region:
6280; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
6281; CHECK2:       omp.par.merged:
6282; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..12 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6283; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6284; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
6285; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6286; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6287; CHECK2-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
6288; CHECK2-NEXT:    br i1 [[TMP3]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
6289; CHECK2:       omp_region.end:
6290; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6291; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
6292; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
6293; CHECK2:       omp.par.merged.split.split:
6294; CHECK2-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, i64* [[LOADGEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
6295; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i64)* @.omp_outlined..13 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
6296; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
6297; CHECK2:       entry.split:
6298; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
6299; CHECK2:       omp.par.region.split:
6300; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
6301; CHECK2:       omp.par.pre_finalize:
6302; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
6303; CHECK2:       omp_region.body:
6304; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
6305; CHECK2:       seq.par.merged:
6306; CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[LOADGEP_A_ADDR]], align 4
6307; CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
6308; CHECK2-NEXT:    store i32 [[ADD]], i32* [[LOADGEP_A_ADDR]], align 4
6309; CHECK2-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
6310; CHECK2-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], i64* [[LOADGEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
6311; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
6312; CHECK2:       omp.par.merged.split:
6313; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
6314; CHECK2:       omp_region.body.split:
6315; CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6316; CHECK2-NEXT:    br label [[OMP_REGION_END]]
6317; CHECK2:       omp.par.outlined.exit.exitStub:
6318; CHECK2-NEXT:    ret void
6319;
6320;
6321; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..12
6322; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6323; CHECK2-NEXT:  entry:
6324; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6325; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6326; CHECK2-NEXT:    ret void
6327;
6328;
6329; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..13
6330; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
6331; CHECK2-NEXT:  entry:
6332; CHECK2-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
6333; CHECK2-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
6334; CHECK2-NEXT:    ret void
6335;
6336;
6337; CHECK2-LABEL: define {{[^@]+}}@merge_seq_sink_lt
6338; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
6339; CHECK2-NEXT:  entry:
6340; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
6341; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6342; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6343; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6344; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
6345; CHECK2:       omp_parallel:
6346; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
6347; CHECK2-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
6348; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge_seq_sink_lt..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
6349; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
6350; CHECK2:       omp.par.outlined.exit:
6351; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
6352; CHECK2:       omp.par.exit.split:
6353; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
6354; CHECK2:       entry.split.split:
6355; CHECK2-NEXT:    ret void
6356;
6357;
6358; CHECK2-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
6359; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
6360; CHECK2-NEXT:  omp.par.entry:
6361; CHECK2-NEXT:    [[B:%.*]] = alloca i32, align 4
6362; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
6363; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
6364; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
6365; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
6366; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
6367; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
6368; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
6369; CHECK2:       omp.par.region:
6370; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
6371; CHECK2:       omp.par.merged:
6372; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..14 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6373; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6374; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
6375; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6376; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6377; CHECK2-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
6378; CHECK2-NEXT:    br i1 [[TMP3]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
6379; CHECK2:       omp_region.end:
6380; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6381; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
6382; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
6383; CHECK2:       omp.par.merged.split.split:
6384; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..15 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6385; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
6386; CHECK2:       entry.split:
6387; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
6388; CHECK2:       omp.par.region.split:
6389; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
6390; CHECK2:       omp.par.pre_finalize:
6391; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
6392; CHECK2:       omp_region.body:
6393; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
6394; CHECK2:       seq.par.merged:
6395; CHECK2-NEXT:    [[TMP4:%.*]] = bitcast i32* [[B]] to i8*
6396; CHECK2-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP4]])
6397; CHECK2-NEXT:    [[TMP5:%.*]] = ptrtoint i32* [[B]] to i64
6398; CHECK2-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i32
6399; CHECK2-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP4]])
6400; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
6401; CHECK2:       omp.par.merged.split:
6402; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
6403; CHECK2:       omp_region.body.split:
6404; CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6405; CHECK2-NEXT:    br label [[OMP_REGION_END]]
6406; CHECK2:       omp.par.outlined.exit.exitStub:
6407; CHECK2-NEXT:    ret void
6408;
6409;
6410; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..14
6411; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6412; CHECK2-NEXT:  entry:
6413; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6414; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6415; CHECK2-NEXT:    ret void
6416;
6417;
6418; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..15
6419; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6420; CHECK2-NEXT:  entry:
6421; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6422; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6423; CHECK2-NEXT:    ret void
6424;
6425;
6426; CHECK2-LABEL: define {{[^@]+}}@merge_seq_par_use
6427; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
6428; CHECK2-NEXT:  entry:
6429; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i32*, i32* }, align 8
6430; CHECK2-NEXT:    [[A_RELOADED:%.*]] = alloca i32, align 4
6431; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6432; CHECK2-NEXT:    [[B:%.*]] = alloca i32, align 4
6433; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6434; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6435; CHECK2-NEXT:    store i32 [[A]], i32* [[A_RELOADED]], align 4
6436; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
6437; CHECK2:       omp_parallel:
6438; CHECK2-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 0
6439; CHECK2-NEXT:    store i32* [[A_RELOADED]], i32** [[GEP_A_RELOADED]], align 8
6440; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 1
6441; CHECK2-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
6442; CHECK2-NEXT:    [[GEP_B:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 2
6443; CHECK2-NEXT:    store i32* [[B]], i32** [[GEP_B]], align 8
6444; CHECK2-NEXT:    [[LT_CAST3:%.*]] = bitcast i32* [[B]] to i8*
6445; CHECK2-NEXT:    call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]])
6446; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i32*, i32* }*)* @merge_seq_par_use..omp_par to void (i32*, i32*, ...)*), { i32*, i32*, i32* }* [[STRUCTARG]])
6447; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
6448; CHECK2:       omp.par.outlined.exit:
6449; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
6450; CHECK2:       omp.par.exit.split:
6451; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
6452; CHECK2:       entry.split.split:
6453; CHECK2-NEXT:    [[LT_CAST:%.*]] = bitcast i32* [[B]] to i8*
6454; CHECK2-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[LT_CAST]])
6455; CHECK2-NEXT:    ret void
6456;
6457;
6458; CHECK2-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
6459; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i32*, i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
6460; CHECK2-NEXT:  omp.par.entry:
6461; CHECK2-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 0
6462; CHECK2-NEXT:    [[LOADGEP_A_RELOADED:%.*]] = load i32*, i32** [[GEP_A_RELOADED]], align 8
6463; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 1
6464; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
6465; CHECK2-NEXT:    [[GEP_B:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 2
6466; CHECK2-NEXT:    [[LOADGEP_B:%.*]] = load i32*, i32** [[GEP_B]], align 8
6467; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
6468; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
6469; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
6470; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
6471; CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[LOADGEP_A_RELOADED]], align 4
6472; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
6473; CHECK2:       omp.par.region:
6474; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
6475; CHECK2:       omp.par.merged:
6476; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..16 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6477; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6478; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
6479; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6480; CHECK2-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6481; CHECK2-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
6482; CHECK2-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
6483; CHECK2:       omp_region.end:
6484; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6485; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
6486; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
6487; CHECK2:       omp.par.merged.split.split:
6488; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..17 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_B]])
6489; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
6490; CHECK2:       entry.split:
6491; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
6492; CHECK2:       omp.par.region.split:
6493; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
6494; CHECK2:       omp.par.pre_finalize:
6495; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
6496; CHECK2:       omp_region.body:
6497; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
6498; CHECK2:       seq.par.merged:
6499; CHECK2-NEXT:    [[TMP5:%.*]] = bitcast i32* [[LOADGEP_B]] to i8*
6500; CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
6501; CHECK2-NEXT:    store i32 [[ADD]], i32* [[LOADGEP_B]], align 4
6502; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
6503; CHECK2:       omp.par.merged.split:
6504; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
6505; CHECK2:       omp_region.body.split:
6506; CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6507; CHECK2-NEXT:    br label [[OMP_REGION_END]]
6508; CHECK2:       omp.par.outlined.exit.exitStub:
6509; CHECK2-NEXT:    ret void
6510;
6511;
6512; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..16
6513; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6514; CHECK2-NEXT:  entry:
6515; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6516; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6517; CHECK2-NEXT:    ret void
6518;
6519;
6520; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..17
6521; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
6522; CHECK2-NEXT:  entry:
6523; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6524; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6525; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4
6526; CHECK2-NEXT:    call void @use(i32 [[TMP1]])
6527; CHECK2-NEXT:    ret void
6528;
6529;
6530; CHECK2-LABEL: define {{[^@]+}}@merge_cancellable_regions
6531; CHECK2-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
6532; CHECK2-NEXT:  entry:
6533; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i32* }, align 8
6534; CHECK2-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
6535; CHECK2-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
6536; CHECK2-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
6537; CHECK2-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
6538; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6539; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
6540; CHECK2:       omp_parallel:
6541; CHECK2-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { i32*, i32* }, { i32*, i32* }* [[STRUCTARG]], i32 0, i32 0
6542; CHECK2-NEXT:    store i32* [[CANCEL1_ADDR]], i32** [[GEP_CANCEL1_ADDR]], align 8
6543; CHECK2-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { i32*, i32* }, { i32*, i32* }* [[STRUCTARG]], i32 0, i32 1
6544; CHECK2-NEXT:    store i32* [[CANCEL2_ADDR]], i32** [[GEP_CANCEL2_ADDR]], align 8
6545; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i32* }*)* @merge_cancellable_regions..omp_par to void (i32*, i32*, ...)*), { i32*, i32* }* [[STRUCTARG]])
6546; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
6547; CHECK2:       omp.par.outlined.exit:
6548; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
6549; CHECK2:       omp.par.exit.split:
6550; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
6551; CHECK2:       entry.split.split:
6552; CHECK2-NEXT:    ret void
6553;
6554;
6555; CHECK2-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
6556; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
6557; CHECK2-NEXT:  omp.par.entry:
6558; CHECK2-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { i32*, i32* }, { i32*, i32* }* [[TMP0]], i32 0, i32 0
6559; CHECK2-NEXT:    [[LOADGEP_CANCEL1_ADDR:%.*]] = load i32*, i32** [[GEP_CANCEL1_ADDR]], align 8
6560; CHECK2-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { i32*, i32* }, { i32*, i32* }* [[TMP0]], i32 0, i32 1
6561; CHECK2-NEXT:    [[LOADGEP_CANCEL2_ADDR:%.*]] = load i32*, i32** [[GEP_CANCEL2_ADDR]], align 8
6562; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
6563; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
6564; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
6565; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
6566; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
6567; CHECK2:       omp.par.region:
6568; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
6569; CHECK2:       omp.par.merged:
6570; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..18 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_CANCEL1_ADDR]])
6571; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6572; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6573; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..19 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_CANCEL2_ADDR]])
6574; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
6575; CHECK2:       entry.split:
6576; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
6577; CHECK2:       omp.par.region.split:
6578; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
6579; CHECK2:       omp.par.pre_finalize:
6580; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
6581; CHECK2:       omp.par.outlined.exit.exitStub:
6582; CHECK2-NEXT:    ret void
6583;
6584;
6585; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..18
6586; CHECK2-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
6587; CHECK2-NEXT:  entry:
6588; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
6589; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
6590; CHECK2-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
6591; CHECK2:       if.then:
6592; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
6593; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
6594; CHECK2-NEXT:    ret void
6595; CHECK2:       if.end:
6596; CHECK2-NEXT:    ret void
6597;
6598;
6599; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..19
6600; CHECK2-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
6601; CHECK2-NEXT:  entry:
6602; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
6603; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
6604; CHECK2-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
6605; CHECK2:       if.then:
6606; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
6607; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
6608; CHECK2-NEXT:    ret void
6609; CHECK2:       if.end:
6610; CHECK2-NEXT:    ret void
6611;
6612;
6613; CHECK2-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
6614; CHECK2-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
6615; CHECK2-NEXT:  entry:
6616; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i32*, i32* }, align 8
6617; CHECK2-NEXT:    [[CANCEL1_RELOADED:%.*]] = alloca i32, align 4
6618; CHECK2-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
6619; CHECK2-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
6620; CHECK2-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
6621; CHECK2-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
6622; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6623; CHECK2-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_RELOADED]], align 4
6624; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
6625; CHECK2:       omp_parallel:
6626; CHECK2-NEXT:    [[GEP_CANCEL1_RELOADED:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 0
6627; CHECK2-NEXT:    store i32* [[CANCEL1_RELOADED]], i32** [[GEP_CANCEL1_RELOADED]], align 8
6628; CHECK2-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 1
6629; CHECK2-NEXT:    store i32* [[CANCEL1_ADDR]], i32** [[GEP_CANCEL1_ADDR]], align 8
6630; CHECK2-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 2
6631; CHECK2-NEXT:    store i32* [[CANCEL2_ADDR]], i32** [[GEP_CANCEL2_ADDR]], align 8
6632; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i32*, i32* }*)* @merge_cancellable_regions_seq..omp_par to void (i32*, i32*, ...)*), { i32*, i32*, i32* }* [[STRUCTARG]])
6633; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
6634; CHECK2:       omp.par.outlined.exit:
6635; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
6636; CHECK2:       omp.par.exit.split:
6637; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
6638; CHECK2:       entry.split.split:
6639; CHECK2-NEXT:    ret void
6640;
6641;
6642; CHECK2-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
6643; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i32*, i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
6644; CHECK2-NEXT:  omp.par.entry:
6645; CHECK2-NEXT:    [[GEP_CANCEL1_RELOADED:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 0
6646; CHECK2-NEXT:    [[LOADGEP_CANCEL1_RELOADED:%.*]] = load i32*, i32** [[GEP_CANCEL1_RELOADED]], align 8
6647; CHECK2-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 1
6648; CHECK2-NEXT:    [[LOADGEP_CANCEL1_ADDR:%.*]] = load i32*, i32** [[GEP_CANCEL1_ADDR]], align 8
6649; CHECK2-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { i32*, i32*, i32* }, { i32*, i32*, i32* }* [[TMP0]], i32 0, i32 2
6650; CHECK2-NEXT:    [[LOADGEP_CANCEL2_ADDR:%.*]] = load i32*, i32** [[GEP_CANCEL2_ADDR]], align 8
6651; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
6652; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
6653; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
6654; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
6655; CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[LOADGEP_CANCEL1_RELOADED]], align 4
6656; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
6657; CHECK2:       omp.par.region:
6658; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
6659; CHECK2:       omp.par.merged:
6660; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..20 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_CANCEL1_ADDR]])
6661; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6662; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
6663; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6664; CHECK2-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6665; CHECK2-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
6666; CHECK2-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
6667; CHECK2:       omp_region.end:
6668; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6669; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
6670; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
6671; CHECK2:       omp.par.merged.split.split:
6672; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..21 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_CANCEL2_ADDR]])
6673; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
6674; CHECK2:       entry.split:
6675; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
6676; CHECK2:       omp.par.region.split:
6677; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
6678; CHECK2:       omp.par.pre_finalize:
6679; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
6680; CHECK2:       omp_region.body:
6681; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
6682; CHECK2:       seq.par.merged:
6683; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP2]], 0
6684; CHECK2-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
6685; CHECK2-NEXT:    store i32 [[LNOT_EXT]], i32* [[LOADGEP_CANCEL2_ADDR]], align 4
6686; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
6687; CHECK2:       omp.par.merged.split:
6688; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
6689; CHECK2:       omp_region.body.split:
6690; CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6691; CHECK2-NEXT:    br label [[OMP_REGION_END]]
6692; CHECK2:       omp.par.outlined.exit.exitStub:
6693; CHECK2-NEXT:    ret void
6694;
6695;
6696; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..20
6697; CHECK2-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
6698; CHECK2-NEXT:  entry:
6699; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
6700; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
6701; CHECK2-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
6702; CHECK2:       if.then:
6703; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
6704; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
6705; CHECK2-NEXT:    ret void
6706; CHECK2:       if.end:
6707; CHECK2-NEXT:    ret void
6708;
6709;
6710; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..21
6711; CHECK2-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
6712; CHECK2-NEXT:  entry:
6713; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
6714; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
6715; CHECK2-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
6716; CHECK2:       if.then:
6717; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
6718; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
6719; CHECK2-NEXT:    ret void
6720; CHECK2:       if.end:
6721; CHECK2-NEXT:    ret void
6722;
6723;
6724; CHECK2-LABEL: define {{[^@]+}}@merge_3
6725; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
6726; CHECK2-NEXT:  entry:
6727; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
6728; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6729; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6730; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6731; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
6732; CHECK2:       omp_parallel:
6733; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
6734; CHECK2-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
6735; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge_3..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
6736; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
6737; CHECK2:       omp.par.outlined.exit:
6738; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
6739; CHECK2:       omp.par.exit.split:
6740; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
6741; CHECK2:       entry.split.split:
6742; CHECK2-NEXT:    ret void
6743;
6744;
6745; CHECK2-LABEL: define {{[^@]+}}@merge_3..omp_par
6746; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
6747; CHECK2-NEXT:  omp.par.entry:
6748; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
6749; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
6750; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
6751; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
6752; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
6753; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
6754; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
6755; CHECK2:       omp.par.region:
6756; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
6757; CHECK2:       omp.par.merged:
6758; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..22 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6759; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6760; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6761; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..23 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6762; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6763; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
6764; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..24 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6765; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
6766; CHECK2:       entry.split:
6767; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
6768; CHECK2:       omp.par.region.split:
6769; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
6770; CHECK2:       omp.par.pre_finalize:
6771; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
6772; CHECK2:       omp.par.outlined.exit.exitStub:
6773; CHECK2-NEXT:    ret void
6774;
6775;
6776; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..22
6777; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6778; CHECK2-NEXT:  entry:
6779; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6780; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6781; CHECK2-NEXT:    ret void
6782;
6783;
6784; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..23
6785; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6786; CHECK2-NEXT:  entry:
6787; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6788; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6789; CHECK2-NEXT:    ret void
6790;
6791;
6792; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..24
6793; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6794; CHECK2-NEXT:  entry:
6795; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6796; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6797; CHECK2-NEXT:    ret void
6798;
6799;
6800; CHECK2-LABEL: define {{[^@]+}}@merge_3_seq
6801; CHECK2-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
6802; CHECK2-NEXT:  entry:
6803; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32*, i32*, i32*, i32* }, align 8
6804; CHECK2-NEXT:    [[A_RELOADED:%.*]] = alloca i32, align 4
6805; CHECK2-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
6806; CHECK2-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
6807; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6808; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6809; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6810; CHECK2-NEXT:    store i32 [[A]], i32* [[A_RELOADED]], align 4
6811; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
6812; CHECK2:       omp_parallel:
6813; CHECK2-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 0
6814; CHECK2-NEXT:    store i32* [[A_RELOADED]], i32** [[GEP_A_RELOADED]], align 8
6815; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 1
6816; CHECK2-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
6817; CHECK2-NEXT:    [[GEP_ADD_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 2
6818; CHECK2-NEXT:    store i32* [[ADD_SEQ_OUTPUT_ALLOC]], i32** [[GEP_ADD_SEQ_OUTPUT_ALLOC]], align 8
6819; CHECK2-NEXT:    [[GEP_ADD1_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[STRUCTARG]], i32 0, i32 3
6820; CHECK2-NEXT:    store i32* [[ADD1_SEQ_OUTPUT_ALLOC]], i32** [[GEP_ADD1_SEQ_OUTPUT_ALLOC]], align 8
6821; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32*, i32*, i32*, i32* }*)* @merge_3_seq..omp_par to void (i32*, i32*, ...)*), { i32*, i32*, i32*, i32* }* [[STRUCTARG]])
6822; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
6823; CHECK2:       omp.par.outlined.exit:
6824; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
6825; CHECK2:       omp.par.exit.split:
6826; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
6827; CHECK2:       entry.split.split:
6828; CHECK2-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
6829; CHECK2-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
6830; CHECK2-NEXT:    ret void
6831;
6832;
6833; CHECK2-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
6834; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32*, i32*, i32*, i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
6835; CHECK2-NEXT:  omp.par.entry:
6836; CHECK2-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[TMP0]], i32 0, i32 0
6837; CHECK2-NEXT:    [[LOADGEP_A_RELOADED:%.*]] = load i32*, i32** [[GEP_A_RELOADED]], align 8
6838; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[TMP0]], i32 0, i32 1
6839; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
6840; CHECK2-NEXT:    [[GEP_ADD_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[TMP0]], i32 0, i32 2
6841; CHECK2-NEXT:    [[LOADGEP_ADD_SEQ_OUTPUT_ALLOC:%.*]] = load i32*, i32** [[GEP_ADD_SEQ_OUTPUT_ALLOC]], align 8
6842; CHECK2-NEXT:    [[GEP_ADD1_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { i32*, i32*, i32*, i32* }, { i32*, i32*, i32*, i32* }* [[TMP0]], i32 0, i32 3
6843; CHECK2-NEXT:    [[LOADGEP_ADD1_SEQ_OUTPUT_ALLOC:%.*]] = load i32*, i32** [[GEP_ADD1_SEQ_OUTPUT_ALLOC]], align 8
6844; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
6845; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
6846; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
6847; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
6848; CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[LOADGEP_A_RELOADED]], align 4
6849; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
6850; CHECK2:       omp.par.region:
6851; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
6852; CHECK2:       omp.par.merged:
6853; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..25 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6854; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6855; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
6856; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6857; CHECK2-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6858; CHECK2-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
6859; CHECK2-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
6860; CHECK2:       omp_region.end:
6861; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6862; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
6863; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
6864; CHECK2:       omp.par.merged.split.split:
6865; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..26 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6866; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6867; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
6868; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6869; CHECK2-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
6870; CHECK2-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
6871; CHECK2-NEXT:    br i1 [[TMP6]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
6872; CHECK2:       omp_region.end4:
6873; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
6874; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
6875; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
6876; CHECK2:       omp.par.merged.split.split.split.split:
6877; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..27 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
6878; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
6879; CHECK2:       entry.split:
6880; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
6881; CHECK2:       omp.par.region.split:
6882; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
6883; CHECK2:       omp.par.pre_finalize:
6884; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
6885; CHECK2:       omp_region.body5:
6886; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
6887; CHECK2:       seq.par.merged2:
6888; CHECK2-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[LOADGEP_ADD_SEQ_OUTPUT_ALLOC]], align 4
6889; CHECK2-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP2]]
6890; CHECK2-NEXT:    store i32 [[ADD1]], i32* [[LOADGEP_ADD1_SEQ_OUTPUT_ALLOC]], align 4
6891; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
6892; CHECK2:       omp.par.merged.split.split.split:
6893; CHECK2-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
6894; CHECK2:       omp_region.body5.split:
6895; CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
6896; CHECK2-NEXT:    br label [[OMP_REGION_END4]]
6897; CHECK2:       omp_region.body:
6898; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
6899; CHECK2:       seq.par.merged:
6900; CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
6901; CHECK2-NEXT:    store i32 [[ADD]], i32* [[LOADGEP_ADD_SEQ_OUTPUT_ALLOC]], align 4
6902; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
6903; CHECK2:       omp.par.merged.split:
6904; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
6905; CHECK2:       omp_region.body.split:
6906; CHECK2-NEXT:    call void @__kmpc_end_master(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
6907; CHECK2-NEXT:    br label [[OMP_REGION_END]]
6908; CHECK2:       omp.par.outlined.exit.exitStub:
6909; CHECK2-NEXT:    ret void
6910;
6911;
6912; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..25
6913; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6914; CHECK2-NEXT:  entry:
6915; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6916; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6917; CHECK2-NEXT:    ret void
6918;
6919;
6920; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..26
6921; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6922; CHECK2-NEXT:  entry:
6923; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6924; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6925; CHECK2-NEXT:    ret void
6926;
6927;
6928; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..27
6929; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6930; CHECK2-NEXT:  entry:
6931; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6932; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6933; CHECK2-NEXT:    ret void
6934;
6935;
6936; CHECK2-LABEL: define {{[^@]+}}@unmergable_3_seq_call
6937; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
6938; CHECK2-NEXT:  entry:
6939; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6940; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6941; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6942; CHECK2-NEXT:    call void (...) @foo()
6943; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6944; CHECK2-NEXT:    call void (...) @foo()
6945; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6946; CHECK2-NEXT:    ret void
6947;
6948;
6949; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..28
6950; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6951; CHECK2-NEXT:  entry:
6952; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6953; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6954; CHECK2-NEXT:    ret void
6955;
6956;
6957; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..29
6958; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6959; CHECK2-NEXT:  entry:
6960; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6961; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6962; CHECK2-NEXT:    ret void
6963;
6964;
6965; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..30
6966; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6967; CHECK2-NEXT:  entry:
6968; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6969; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6970; CHECK2-NEXT:    ret void
6971;
6972;
6973; CHECK2-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
6974; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
6975; CHECK2-NEXT:  entry:
6976; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
6977; CHECK2-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
6978; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
6979; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6980; CHECK2-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
6981; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6982; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
6983; CHECK2-NEXT:    ret void
6984;
6985;
6986; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..31
6987; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6988; CHECK2-NEXT:  entry:
6989; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6990; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6991; CHECK2-NEXT:    ret void
6992;
6993;
6994; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..32
6995; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
6996; CHECK2-NEXT:  entry:
6997; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
6998; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
6999; CHECK2-NEXT:    ret void
7000;
7001;
7002; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..33
7003; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
7004; CHECK2-NEXT:  entry:
7005; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
7006; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
7007; CHECK2-NEXT:    ret void
7008;
7009;
7010; CHECK2-LABEL: define {{[^@]+}}@unmergable_3_num_threads
7011; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
7012; CHECK2-NEXT:  entry:
7013; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
7014; CHECK2-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
7015; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
7016; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
7017; CHECK2-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
7018; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
7019; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
7020; CHECK2-NEXT:    ret void
7021;
7022;
7023; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..34
7024; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
7025; CHECK2-NEXT:  entry:
7026; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
7027; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
7028; CHECK2-NEXT:    ret void
7029;
7030;
7031; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..35
7032; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
7033; CHECK2-NEXT:  entry:
7034; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
7035; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
7036; CHECK2-NEXT:    ret void
7037;
7038;
7039; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..36
7040; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
7041; CHECK2-NEXT:  entry:
7042; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
7043; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
7044; CHECK2-NEXT:    ret void
7045;
7046;
7047; CHECK2-LABEL: define {{[^@]+}}@merge_2_unmergable_1
7048; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
7049; CHECK2-NEXT:  entry:
7050; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { i32* }, align 8
7051; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
7052; CHECK2-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
7053; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
7054; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
7055; CHECK2:       omp_parallel:
7056; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[STRUCTARG]], i32 0, i32 0
7057; CHECK2-NEXT:    store i32* [[A_ADDR]], i32** [[GEP_A_ADDR]], align 8
7058; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, { i32* }*)* @merge_2_unmergable_1..omp_par to void (i32*, i32*, ...)*), { i32* }* [[STRUCTARG]])
7059; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
7060; CHECK2:       omp.par.outlined.exit:
7061; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
7062; CHECK2:       omp.par.exit.split:
7063; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
7064; CHECK2:       entry.split.split:
7065; CHECK2-NEXT:    call void (...) @foo()
7066; CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
7067; CHECK2-NEXT:    ret void
7068;
7069;
7070; CHECK2-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
7071; CHECK2-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], { i32* }* [[TMP0:%.*]]) #[[ATTR0]] {
7072; CHECK2-NEXT:  omp.par.entry:
7073; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { i32* }, { i32* }* [[TMP0]], i32 0, i32 0
7074; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load i32*, i32** [[GEP_A_ADDR]], align 8
7075; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
7076; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TID_ADDR]], align 4
7077; CHECK2-NEXT:    store i32 [[TMP1]], i32* [[TID_ADDR_LOCAL]], align 4
7078; CHECK2-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
7079; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
7080; CHECK2:       omp.par.region:
7081; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
7082; CHECK2:       omp.par.merged:
7083; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..37 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
7084; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]])
7085; CHECK2-NEXT:    call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]])
7086; CHECK2-NEXT:    call void (i32*, i32*, ...) bitcast (void (i32*, i32*, i32*)* @.omp_outlined..38 to void (i32*, i32*, ...)*)(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOADGEP_A_ADDR]])
7087; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
7088; CHECK2:       entry.split:
7089; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
7090; CHECK2:       omp.par.region.split:
7091; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
7092; CHECK2:       omp.par.pre_finalize:
7093; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
7094; CHECK2:       omp.par.outlined.exit.exitStub:
7095; CHECK2-NEXT:    ret void
7096;
7097;
7098; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..37
7099; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
7100; CHECK2-NEXT:  entry:
7101; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
7102; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
7103; CHECK2-NEXT:    ret void
7104;
7105;
7106; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..38
7107; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
7108; CHECK2-NEXT:  entry:
7109; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
7110; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
7111; CHECK2-NEXT:    ret void
7112;
7113;
7114; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..39
7115; CHECK2-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
7116; CHECK2-NEXT:  entry:
7117; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
7118; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
7119; CHECK2-NEXT:    ret void
7120;
7121