xref: /llvm-project/llvm/test/Transforms/OpenMP/parallel_region_merging.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs
2; RUN: opt -S -aa-pipeline= -passes='attributor,cgscc(openmp-opt-cgscc)' -openmp-opt-enable-merging  < %s | FileCheck %s --check-prefix=CHECK2
3; #include <omp.h>
4; void foo();
5; void use(int);
6; void usef(float);
7; void merge(int a) {
8; #pragma omp parallel
9;     {
10;         use(a);
11;     }
12; #pragma omp parallel
13;     {
14;         use(a);
15;     }
16; }
17; void unmergable_proc_bind(int a) {
18; #pragma omp parallel proc_bind(close)
19;     {
20;         use(a);
21;     }
22; #pragma omp parallel
23;     {
24;         use(a);
25;     }
26; }
27; void unmergable_num_threads(int a) {
28; #pragma omp parallel num_threads(a)
29;     {
30;         use(a);
31;     }
32; #pragma omp parallel
33;     {
34;         use(a);
35;     }
36; }
37; void unmergable_seq_call(int a) {
38; #pragma omp parallel
39;     {
40;         use(a);
41;     }
42;     foo();
43; #pragma omp parallel
44;     {
45;         use(a);
46;     }
47; }
48; void merge_seq(int a) {
49; #pragma omp parallel
50;     {
51;         use(a);
52;     }
53;     a = a + 1;
54; #pragma omp parallel
55;     {
56;         use(a);
57;     }
58;     use(a);
59; }
60; void merge_seq_float(float f, ptr p) {
61; #pragma omp parallel
62;     {
63;         use(f);
64;     }
65;     *p = f + 3.14f;
66; #pragma omp parallel
67;     {
68;         use(f);
69;     }
70; }
71; void merge_seq_firstprivate(int a) {
72; #pragma omp parallel
73;     {
74;         use(a);
75;     }
76;     a = a + 1;
77; #pragma omp parallel firstprivate(a)
78;     {
79;         use(a);
80;     }
81;     use(a);
82; }
83; void merge_seq_sink_lt(int a) {
84; #pragma omp parallel
85;     {
86;         use(a);
87;     }
88;     {
89;         int b = (int)&b;
90;     }
91; #pragma omp parallel
92;     {
93;         use(a);
94;     }
95; }
96; void merge_seq_par_use(int a) {
97; #pragma omp parallel
98;     {
99;         use(a);
100;     }
101;     int b = a + 1;
102; #pragma omp parallel
103;     {
104;         use(a);
105;         use(b);
106;     }
107; }
108; void merge_cancellable_regions(int cancel1, int cancel2)
109; {
110; #pragma omp parallel
111;     {
112;         if(cancel1) {
113; #pragma omp cancel parallel
114;         }
115;     }
116; #pragma omp parallel
117;     {
118;         if (cancel2) {
119; #pragma omp cancel parallel
120;         }
121;     }
122; }
123; void merge_cancellable_regions_seq(int cancel1, int cancel2)
124; {
125; #pragma omp parallel
126;     {
127;         if(cancel1) {
128; #pragma omp cancel parallel
129;         }
130;     }
131;     cancel2 = !cancel1;
132; #pragma omp parallel
133;     {
134;         if (cancel2) {
135; #pragma omp cancel parallel
136;         }
137;     }
138; }
139; void merge_3(int a) {
140; #pragma omp parallel
141;     {
142;         use(a);
143;     }
144; #pragma omp parallel
145;     {
146;         use(a);
147;     }
148; #pragma omp parallel
149;     {
150;         use(a);
151;     }
152; }
153; void merge_3_seq(int a, int b) {
154; #pragma omp parallel
155;     {
156;         use(a);
157;     }
158;     b = a + 1;
159; #pragma omp parallel
160;     {
161;         use(a);
162;     }
163;     b = b + a;
164; #pragma omp parallel
165;     {
166;         use(a);
167;     }
168;     use(b);
169; }
170; void unmergable_3_seq_call(int a) {
171; #pragma omp parallel
172;     {
173;         use(a);
174;     }
175;     foo();
176; #pragma omp parallel
177;     {
178;         use(a);
179;     }
180;     foo();
181; #pragma omp parallel
182;     {
183;         use(a);
184;     }
185; }
186; void unmergable_3_proc_bind(int a) {
187; #pragma omp parallel
188;     {
189;         use(a);
190;     }
191; #pragma omp parallel proc_bind(close)
192;     {
193;         use(a);
194;     }
195; #pragma omp parallel
196;     {
197;         use(a);
198;     }
199; }
200; void unmergable_3_num_threads(int a) {
201; #pragma omp parallel
202;     {
203;         use(a);
204;     }
205; #pragma omp parallel num_threads(a)
206;     {
207;         use(a);
208;     }
209; #pragma omp parallel
210;     {
211;         use(a);
212;     }
213; }
214; void merge_2_unmergable_1(int a) {
215; #pragma omp parallel
216;     {
217;         use(a);
218;     }
219; #pragma omp parallel
220;     {
221;         use(a);
222;     }
223;     foo();
224; #pragma omp parallel
225;     {
226;         use(a);
227;     }
228; }
229target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
230
231%struct.ident_t = type { i32, i32, i32, i32, ptr }
232
233@0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
234@1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, ptr @0 }, align 8
235
236define dso_local void @merge(i32 %a) local_unnamed_addr  {
237entry:
238  %a.addr = alloca i32, align 4
239  store i32 %a, ptr %a.addr, align 4
240  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined., ptr nonnull %a.addr)
241  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..1, ptr nonnull %a.addr)
242  ret void
243}
244
245define internal void @.omp_outlined.(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
246entry:
247  %0 = load i32, ptr %a, align 4
248  call void @use(i32 %0)
249  ret void
250}
251
252declare dso_local void @use(i32) local_unnamed_addr
253
254declare !callback !1 void @__kmpc_fork_call(ptr, i32, ptr, ...) local_unnamed_addr
255
256define internal void @.omp_outlined..1(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
257entry:
258  %0 = load i32, ptr %a, align 4
259  call void @use(i32 %0)
260  ret void
261}
262
263define dso_local void @unmergable_proc_bind(i32 %a) local_unnamed_addr  {
264entry:
265  %a.addr = alloca i32, align 4
266  %0 = call i32 @__kmpc_global_thread_num(ptr nonnull @1)
267  store i32 %a, ptr %a.addr, align 4
268  call void @__kmpc_push_proc_bind(ptr nonnull @1, i32 %0, i32 3)
269  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..2, ptr nonnull %a.addr)
270  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..3, ptr nonnull %a.addr)
271  ret void
272}
273
274define internal void @.omp_outlined..2(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
275entry:
276  %0 = load i32, ptr %a, align 4
277  call void @use(i32 %0)
278  ret void
279}
280
281declare i32 @__kmpc_global_thread_num(ptr) local_unnamed_addr
282
283declare void @__kmpc_push_proc_bind(ptr, i32, i32) local_unnamed_addr
284
285define internal void @.omp_outlined..3(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
286entry:
287  %0 = load i32, ptr %a, align 4
288  call void @use(i32 %0)
289  ret void
290}
291
292define dso_local void @unmergable_num_threads(i32 %a) local_unnamed_addr  {
293entry:
294  %a.addr = alloca i32, align 4
295  %0 = call i32 @__kmpc_global_thread_num(ptr nonnull @1)
296  store i32 %a, ptr %a.addr, align 4
297  call void @__kmpc_push_num_threads(ptr nonnull @1, i32 %0, i32 %a)
298  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..4, ptr nonnull %a.addr)
299  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..5, ptr nonnull %a.addr)
300  ret void
301}
302
303define internal void @.omp_outlined..4(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
304entry:
305  %0 = load i32, ptr %a, align 4
306  call void @use(i32 %0)
307  ret void
308}
309
310declare void @__kmpc_push_num_threads(ptr, i32, i32) local_unnamed_addr
311
312define internal void @.omp_outlined..5(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
313entry:
314  %0 = load i32, ptr %a, align 4
315  call void @use(i32 %0)
316  ret void
317}
318
319define dso_local void @unmergable_seq_call(i32 %a) local_unnamed_addr  {
320entry:
321  %a.addr = alloca i32, align 4
322  store i32 %a, ptr %a.addr, align 4
323  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..6, ptr nonnull %a.addr)
324  call void (...) @foo()
325  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..7, ptr nonnull %a.addr)
326  ret void
327}
328
329define internal void @.omp_outlined..6(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
330entry:
331  %0 = load i32, ptr %a, align 4
332  call void @use(i32 %0)
333  ret void
334}
335
336declare dso_local void @foo(...) local_unnamed_addr
337
338define internal void @.omp_outlined..7(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
339entry:
340  %0 = load i32, ptr %a, align 4
341  call void @use(i32 %0)
342  ret void
343}
344
345define dso_local void @merge_seq(i32 %a) local_unnamed_addr  {
346entry:
347  %a.addr = alloca i32, align 4
348  store i32 %a, ptr %a.addr, align 4
349  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..8, ptr nonnull %a.addr)
350  %0 = load i32, ptr %a.addr, align 4
351  %add = add nsw i32 %0, 1
352  store i32 %add, ptr %a.addr, align 4
353  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..9, ptr nonnull %a.addr)
354  %1 = load i32, ptr %a.addr, align 4
355  call void @use(i32 %1)
356  ret void
357}
358
359define internal void @.omp_outlined..8(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
360entry:
361  %0 = load i32, ptr %a, align 4
362  call void @use(i32 %0)
363  ret void
364}
365
366define internal void @.omp_outlined..9(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
367entry:
368  %0 = load i32, ptr %a, align 4
369  call void @use(i32 %0)
370  ret void
371}
372
373define dso_local void @merge_seq_float(float %f, ptr nocapture %p) local_unnamed_addr  {
374entry:
375  %f.addr = alloca float, align 4
376  store float %f, ptr %f.addr, align 4
377  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..10, ptr nonnull %f.addr)
378  %0 = load float, ptr %f.addr, align 4
379  %add = fadd float %0, 0x40091EB860000000
380  store float %add, ptr %p, align 4
381  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..11, ptr nonnull %f.addr)
382  ret void
383}
384
385define internal void @.omp_outlined..10(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %f)  {
386entry:
387  %0 = load float, ptr %f, align 4
388  %conv = fptosi float %0 to i32
389  call void @use(i32 %conv)
390  ret void
391}
392
393define internal void @.omp_outlined..11(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %f)  {
394entry:
395  %0 = load float, ptr %f, align 4
396  %conv = fptosi float %0 to i32
397  call void @use(i32 %conv)
398  ret void
399}
400
401define dso_local void @merge_seq_firstprivate(i32 %a) local_unnamed_addr  {
402entry:
403  %a.addr = alloca i32, align 4
404  store i32 %a, ptr %a.addr, align 4
405  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..12, ptr nonnull %a.addr)
406  %0 = load i32, ptr %a.addr, align 4
407  %add = add nsw i32 %0, 1
408  store i32 %add, ptr %a.addr, align 4
409  %a.casted.sroa.0.0.insert.ext = zext i32 %add to i64
410  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..13, i64 %a.casted.sroa.0.0.insert.ext)
411  %1 = load i32, ptr %a.addr, align 4
412  call void @use(i32 %1)
413  ret void
414}
415
416define internal void @.omp_outlined..12(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
417entry:
418  %0 = load i32, ptr %a, align 4
419  call void @use(i32 %0)
420  ret void
421}
422
423define internal void @.omp_outlined..13(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., i64 %a)  {
424entry:
425  %a.addr.sroa.0.0.extract.trunc = trunc i64 %a to i32
426  call void @use(i32 %a.addr.sroa.0.0.extract.trunc)
427  ret void
428}
429
430define dso_local void @merge_seq_sink_lt(i32 %a) local_unnamed_addr  {
431entry:
432  %a.addr = alloca i32, align 4
433  %b = alloca i32, align 4
434  store i32 %a, ptr %a.addr, align 4
435  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..14, ptr nonnull %a.addr)
436  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %b)
437  %0 = ptrtoint ptr %b to i64
438  %1 = trunc i64 %0 to i32
439  store i32 %1, ptr %b, align 4
440  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %b)
441  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..15, ptr nonnull %a.addr)
442  ret void
443}
444
445define internal void @.omp_outlined..14(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
446entry:
447  %0 = load i32, ptr %a, align 4
448  call void @use(i32 %0)
449  ret void
450}
451
452declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
453
454declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
455
456define internal void @.omp_outlined..15(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
457entry:
458  %0 = load i32, ptr %a, align 4
459  call void @use(i32 %0)
460  ret void
461}
462
463define dso_local void @merge_seq_par_use(i32 %a) local_unnamed_addr  {
464entry:
465  %a.addr = alloca i32, align 4
466  %b = alloca i32, align 4
467  store i32 %a, ptr %a.addr, align 4
468  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..16, ptr nonnull %a.addr)
469  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %b)
470  %0 = load i32, ptr %a.addr, align 4
471  %add = add nsw i32 %0, 1
472  store i32 %add, ptr %b, align 4
473  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 2, ptr @.omp_outlined..17, ptr nonnull %a.addr, ptr nonnull %b)
474  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %b)
475  ret void
476}
477
478define internal void @.omp_outlined..16(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
479entry:
480  %0 = load i32, ptr %a, align 4
481  call void @use(i32 %0)
482  ret void
483}
484
485define internal void @.omp_outlined..17(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a, ptr nocapture nonnull readonly align 4 dereferenceable(4) %b)  {
486entry:
487  %0 = load i32, ptr %a, align 4
488  call void @use(i32 %0)
489  %1 = load i32, ptr %b, align 4
490  call void @use(i32 %1)
491  ret void
492}
493
494define dso_local void @merge_cancellable_regions(i32 %cancel1, i32 %cancel2) local_unnamed_addr  {
495entry:
496  %cancel1.addr = alloca i32, align 4
497  %cancel2.addr = alloca i32, align 4
498  store i32 %cancel1, ptr %cancel1.addr, align 4
499  store i32 %cancel2, ptr %cancel2.addr, align 4
500  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..18, ptr nonnull %cancel1.addr)
501  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..19, ptr nonnull %cancel2.addr)
502  ret void
503}
504
505define internal void @.omp_outlined..18(ptr noalias nocapture readonly %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %cancel1)  {
506entry:
507  %0 = load i32, ptr %cancel1, align 4
508  %tobool.not = icmp eq i32 %0, 0
509  br i1 %tobool.not, label %if.end, label %if.then
510
511if.then:                                          ; preds = %entry
512  %1 = load i32, ptr %.global_tid., align 4
513  %2 = call i32 @__kmpc_cancel(ptr nonnull @1, i32 %1, i32 1)
514  ret void
515
516if.end:                                           ; preds = %entry
517  ret void
518}
519
520declare i32 @__kmpc_cancel(ptr, i32, i32) local_unnamed_addr
521
522define internal void @.omp_outlined..19(ptr noalias nocapture readonly %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %cancel2)  {
523entry:
524  %0 = load i32, ptr %cancel2, align 4
525  %tobool.not = icmp eq i32 %0, 0
526  br i1 %tobool.not, label %if.end, label %if.then
527
528if.then:                                          ; preds = %entry
529  %1 = load i32, ptr %.global_tid., align 4
530  %2 = call i32 @__kmpc_cancel(ptr nonnull @1, i32 %1, i32 1)
531  ret void
532
533if.end:                                           ; preds = %entry
534  ret void
535}
536
537define dso_local void @merge_cancellable_regions_seq(i32 %cancel1, i32 %cancel2) local_unnamed_addr  {
538entry:
539  %cancel1.addr = alloca i32, align 4
540  %cancel2.addr = alloca i32, align 4
541  store i32 %cancel1, ptr %cancel1.addr, align 4
542  store i32 %cancel2, ptr %cancel2.addr, align 4
543  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..20, ptr nonnull %cancel1.addr)
544  %0 = load i32, ptr %cancel1.addr, align 4
545  %tobool.not = icmp eq i32 %0, 0
546  %lnot.ext = zext i1 %tobool.not to i32
547  store i32 %lnot.ext, ptr %cancel2.addr, align 4
548  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..21, ptr nonnull %cancel2.addr)
549  ret void
550}
551
552define internal void @.omp_outlined..20(ptr noalias nocapture readonly %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %cancel1)  {
553entry:
554  %0 = load i32, ptr %cancel1, align 4
555  %tobool.not = icmp eq i32 %0, 0
556  br i1 %tobool.not, label %if.end, label %if.then
557
558if.then:                                          ; preds = %entry
559  %1 = load i32, ptr %.global_tid., align 4
560  %2 = call i32 @__kmpc_cancel(ptr nonnull @1, i32 %1, i32 1)
561  ret void
562
563if.end:                                           ; preds = %entry
564  ret void
565}
566
567define internal void @.omp_outlined..21(ptr noalias nocapture readonly %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %cancel2)  {
568entry:
569  %0 = load i32, ptr %cancel2, align 4
570  %tobool.not = icmp eq i32 %0, 0
571  br i1 %tobool.not, label %if.end, label %if.then
572
573if.then:                                          ; preds = %entry
574  %1 = load i32, ptr %.global_tid., align 4
575  %2 = call i32 @__kmpc_cancel(ptr nonnull @1, i32 %1, i32 1)
576  ret void
577
578if.end:                                           ; preds = %entry
579  ret void
580}
581
582define dso_local void @merge_3(i32 %a) local_unnamed_addr  {
583entry:
584  %a.addr = alloca i32, align 4
585  store i32 %a, ptr %a.addr, align 4
586  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..22, ptr nonnull %a.addr)
587  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..23, ptr nonnull %a.addr)
588  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..24, ptr nonnull %a.addr)
589  ret void
590}
591
592define internal void @.omp_outlined..22(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
593entry:
594  %0 = load i32, ptr %a, align 4
595  call void @use(i32 %0)
596  ret void
597}
598
599define internal void @.omp_outlined..23(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
600entry:
601  %0 = load i32, ptr %a, align 4
602  call void @use(i32 %0)
603  ret void
604}
605
606define internal void @.omp_outlined..24(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
607entry:
608  %0 = load i32, ptr %a, align 4
609  call void @use(i32 %0)
610  ret void
611}
612
613define dso_local void @merge_3_seq(i32 %a, i32 %b) local_unnamed_addr  {
614entry:
615  %a.addr = alloca i32, align 4
616  store i32 %a, ptr %a.addr, align 4
617  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..25, ptr nonnull %a.addr)
618  %0 = load i32, ptr %a.addr, align 4
619  %add = add nsw i32 %0, 1
620  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..26, ptr nonnull %a.addr)
621  %1 = load i32, ptr %a.addr, align 4
622  %add1 = add nsw i32 %add, %1
623  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..27, ptr nonnull %a.addr)
624  call void @use(i32 %add1)
625  ret void
626}
627
628define internal void @.omp_outlined..25(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
629entry:
630  %0 = load i32, ptr %a, align 4
631  call void @use(i32 %0)
632  ret void
633}
634
635define internal void @.omp_outlined..26(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
636entry:
637  %0 = load i32, ptr %a, align 4
638  call void @use(i32 %0)
639  ret void
640}
641
642define internal void @.omp_outlined..27(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
643entry:
644  %0 = load i32, ptr %a, align 4
645  call void @use(i32 %0)
646  ret void
647}
648
649define dso_local void @unmergable_3_seq_call(i32 %a) local_unnamed_addr  {
650entry:
651  %a.addr = alloca i32, align 4
652  store i32 %a, ptr %a.addr, align 4
653  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..28, ptr nonnull %a.addr)
654  call void (...) @foo()
655  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..29, ptr nonnull %a.addr)
656  call void (...) @foo()
657  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..30, ptr nonnull %a.addr)
658  ret void
659}
660
661define internal void @.omp_outlined..28(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
662entry:
663  %0 = load i32, ptr %a, align 4
664  call void @use(i32 %0)
665  ret void
666}
667
668define internal void @.omp_outlined..29(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
669entry:
670  %0 = load i32, ptr %a, align 4
671  call void @use(i32 %0)
672  ret void
673}
674
675define internal void @.omp_outlined..30(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
676entry:
677  %0 = load i32, ptr %a, align 4
678  call void @use(i32 %0)
679  ret void
680}
681
682define dso_local void @unmergable_3_proc_bind(i32 %a) local_unnamed_addr  {
683entry:
684  %a.addr = alloca i32, align 4
685  %0 = call i32 @__kmpc_global_thread_num(ptr nonnull @1)
686  store i32 %a, ptr %a.addr, align 4
687  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..31, ptr nonnull %a.addr)
688  call void @__kmpc_push_proc_bind(ptr nonnull @1, i32 %0, i32 3)
689  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..32, ptr nonnull %a.addr)
690  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..33, ptr nonnull %a.addr)
691  ret void
692}
693
694define internal void @.omp_outlined..31(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
695entry:
696  %0 = load i32, ptr %a, align 4
697  call void @use(i32 %0)
698  ret void
699}
700
701define internal void @.omp_outlined..32(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
702entry:
703  %0 = load i32, ptr %a, align 4
704  call void @use(i32 %0)
705  ret void
706}
707
708define internal void @.omp_outlined..33(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
709entry:
710  %0 = load i32, ptr %a, align 4
711  call void @use(i32 %0)
712  ret void
713}
714
715define dso_local void @unmergable_3_num_threads(i32 %a) local_unnamed_addr  {
716entry:
717  %a.addr = alloca i32, align 4
718  %0 = call i32 @__kmpc_global_thread_num(ptr nonnull @1)
719  store i32 %a, ptr %a.addr, align 4
720  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..34, ptr nonnull %a.addr)
721  %1 = load i32, ptr %a.addr, align 4
722  call void @__kmpc_push_num_threads(ptr nonnull @1, i32 %0, i32 %1)
723  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..35, ptr nonnull %a.addr)
724  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..36, ptr nonnull %a.addr)
725  ret void
726}
727
728define internal void @.omp_outlined..34(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
729entry:
730  %0 = load i32, ptr %a, align 4
731  call void @use(i32 %0)
732  ret void
733}
734
735define internal void @.omp_outlined..35(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
736entry:
737  %0 = load i32, ptr %a, align 4
738  call void @use(i32 %0)
739  ret void
740}
741
742define internal void @.omp_outlined..36(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
743entry:
744  %0 = load i32, ptr %a, align 4
745  call void @use(i32 %0)
746  ret void
747}
748
749define dso_local void @merge_2_unmergable_1(i32 %a) local_unnamed_addr  {
750entry:
751  %a.addr = alloca i32, align 4
752  store i32 %a, ptr %a.addr, align 4
753  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..37, ptr nonnull %a.addr)
754  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..38, ptr nonnull %a.addr)
755  call void (...) @foo()
756  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 1, ptr @.omp_outlined..39, ptr nonnull %a.addr)
757  ret void
758}
759
760define internal void @.omp_outlined..37(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
761entry:
762  %0 = load i32, ptr %a, align 4
763  call void @use(i32 %0)
764  ret void
765}
766
767define internal void @.omp_outlined..38(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
768entry:
769  %0 = load i32, ptr %a, align 4
770  call void @use(i32 %0)
771  ret void
772}
773
774define internal void @.omp_outlined..39(ptr noalias nocapture readnone %.global_tid., ptr noalias nocapture readnone %.bound_tid., ptr nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
775entry:
776  %0 = load i32, ptr %a, align 4
777  call void @use(i32 %0)
778  ret void
779}
780
781
782!llvm.module.flags = !{!0, !3}
783
784!0 = !{i32 1, !"wchar_size", i32 4}
785!1 = !{!2}
786!2 = !{i64 2, i64 -1, i64 -1, i1 true}
787!3 = !{i32 7, !"openmp", i32 50}
788; CHECK-LABEL: define {{[^@]+}}@merge
789; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
790; CHECK-NEXT:  entry:
791; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
792; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
793; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])
794; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
795; CHECK:       omp_parallel:
796; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge..omp_par, ptr [[A_ADDR]])
797; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
798; CHECK:       omp.par.outlined.exit:
799; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
800; CHECK:       omp.par.exit.split:
801; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
802; CHECK:       entry.split.split:
803; CHECK-NEXT:    ret void
804; CHECK-LABEL: define {{[^@]+}}@merge..omp_par
805; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0:[0-9]+]] {
806; CHECK-NEXT:  omp.par.entry:
807; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
808; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
809; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
810; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
811; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
812; CHECK:       omp.par.outlined.exit.exitStub:
813; CHECK-NEXT:    ret void
814; CHECK:       omp.par.region:
815; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
816; CHECK:       omp.par.merged:
817; CHECK-NEXT:    call void @.omp_outlined.(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
818; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
819; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]])
820; CHECK-NEXT:    call void @.omp_outlined..1(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
821; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
822; CHECK:       entry.split:
823; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
824; CHECK:       omp.par.region.split:
825; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
826; CHECK:       omp.par.pre_finalize:
827; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
828; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
829; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
830; CHECK-NEXT:  entry:
831; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
832; CHECK-NEXT:    call void @use(i32 [[TMP0]])
833; CHECK-NEXT:    ret void
834; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
835; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
836; CHECK-NEXT:  entry:
837; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
838; CHECK-NEXT:    call void @use(i32 [[TMP0]])
839; CHECK-NEXT:    ret void
840; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind
841; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
842; CHECK-NEXT:  entry:
843; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
844; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
845; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
846; CHECK-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
847; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..2, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
848; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..3, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
849; CHECK-NEXT:    ret void
850; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
851; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
852; CHECK-NEXT:  entry:
853; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
854; CHECK-NEXT:    call void @use(i32 [[TMP0]])
855; CHECK-NEXT:    ret void
856; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3
857; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
858; CHECK-NEXT:  entry:
859; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
860; CHECK-NEXT:    call void @use(i32 [[TMP0]])
861; CHECK-NEXT:    ret void
862; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads
863; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
864; CHECK-NEXT:  entry:
865; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
866; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
867; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
868; CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
869; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..4, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
870; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..5, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
871; CHECK-NEXT:    ret void
872; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4
873; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
874; CHECK-NEXT:  entry:
875; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
876; CHECK-NEXT:    call void @use(i32 [[TMP0]])
877; CHECK-NEXT:    ret void
878; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5
879; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
880; CHECK-NEXT:  entry:
881; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
882; CHECK-NEXT:    call void @use(i32 [[TMP0]])
883; CHECK-NEXT:    ret void
884; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call
885; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
886; CHECK-NEXT:  entry:
887; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
888; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
889; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..6, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
890; CHECK-NEXT:    call void (...) @foo()
891; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..7, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
892; CHECK-NEXT:    ret void
893; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6
894; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
895; CHECK-NEXT:  entry:
896; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
897; CHECK-NEXT:    call void @use(i32 [[TMP0]])
898; CHECK-NEXT:    ret void
899; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7
900; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
901; CHECK-NEXT:  entry:
902; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
903; CHECK-NEXT:    call void @use(i32 [[TMP0]])
904; CHECK-NEXT:    ret void
905; CHECK-LABEL: define {{[^@]+}}@merge_seq
906; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
907; CHECK-NEXT:  entry:
908; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
909; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
910; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
911; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
912; CHECK:       omp_parallel:
913; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_seq..omp_par, ptr [[A_ADDR]])
914; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
915; CHECK:       omp.par.outlined.exit:
916; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
917; CHECK:       omp.par.exit.split:
918; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
919; CHECK:       entry.split.split:
920; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
921; CHECK-NEXT:    call void @use(i32 [[TMP0]])
922; CHECK-NEXT:    ret void
923; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par
924; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
925; CHECK-NEXT:  omp.par.entry:
926; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
927; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
928; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
929; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
930; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
931; CHECK:       omp.par.outlined.exit.exitStub:
932; CHECK-NEXT:    ret void
933; CHECK:       omp.par.region:
934; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
935; CHECK:       omp.par.merged:
936; CHECK-NEXT:    call void @.omp_outlined..8(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
937; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
938; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
939; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
940; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
941; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
942; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
943; CHECK:       omp_region.end:
944; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
945; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
946; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
947; CHECK:       omp.par.merged.split.split:
948; CHECK-NEXT:    call void @.omp_outlined..9(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
949; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
950; CHECK:       entry.split:
951; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
952; CHECK:       omp.par.region.split:
953; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
954; CHECK:       omp.par.pre_finalize:
955; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
956; CHECK:       omp_region.body:
957; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
958; CHECK:       seq.par.merged:
959; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[A_ADDR]], align 4
960; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
961; CHECK-NEXT:    store i32 [[ADD]], ptr [[A_ADDR]], align 4
962; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
963; CHECK:       omp.par.merged.split:
964; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
965; CHECK:       omp_region.body.split:
966; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
967; CHECK-NEXT:    br label [[OMP_REGION_END]]
968; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8
969; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
970; CHECK-NEXT:  entry:
971; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
972; CHECK-NEXT:    call void @use(i32 [[TMP0]])
973; CHECK-NEXT:    ret void
974; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9
975; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
976; CHECK-NEXT:  entry:
977; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
978; CHECK-NEXT:    call void @use(i32 [[TMP0]])
979; CHECK-NEXT:    ret void
980; CHECK-LABEL: define {{[^@]+}}@merge_seq_float
981; CHECK-SAME: (float [[F:%.*]], ptr nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
982; CHECK-NEXT:  entry:
983; CHECK-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
984; CHECK-NEXT:    store float [[F]], ptr [[F_ADDR]], align 4
985; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
986; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
987; CHECK:       omp_parallel:
988; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_float..omp_par, ptr [[F_ADDR]], ptr [[P]])
989; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
990; CHECK:       omp.par.outlined.exit:
991; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
992; CHECK:       omp.par.exit.split:
993; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
994; CHECK:       entry.split.split:
995; CHECK-NEXT:    ret void
996; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
997; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[F_ADDR:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
998; CHECK-NEXT:  omp.par.entry:
999; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1000; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1001; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1002; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1003; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1004; CHECK:       omp.par.outlined.exit.exitStub:
1005; CHECK-NEXT:    ret void
1006; CHECK:       omp.par.region:
1007; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1008; CHECK:       omp.par.merged:
1009; CHECK-NEXT:    call void @.omp_outlined..10(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
1010; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1011; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1012; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1013; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1014; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1015; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1016; CHECK:       omp_region.end:
1017; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1018; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1019; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1020; CHECK:       omp.par.merged.split.split:
1021; CHECK-NEXT:    call void @.omp_outlined..11(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
1022; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1023; CHECK:       entry.split:
1024; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1025; CHECK:       omp.par.region.split:
1026; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1027; CHECK:       omp.par.pre_finalize:
1028; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1029; CHECK:       omp_region.body:
1030; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1031; CHECK:       seq.par.merged:
1032; CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F_ADDR]], align 4
1033; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000
1034; CHECK-NEXT:    store float [[ADD]], ptr [[P]], align 4
1035; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1036; CHECK:       omp.par.merged.split:
1037; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1038; CHECK:       omp_region.body.split:
1039; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1040; CHECK-NEXT:    br label [[OMP_REGION_END]]
1041; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10
1042; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
1043; CHECK-NEXT:  entry:
1044; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F]], align 4
1045; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
1046; CHECK-NEXT:    call void @use(i32 [[CONV]])
1047; CHECK-NEXT:    ret void
1048; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11
1049; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
1050; CHECK-NEXT:  entry:
1051; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F]], align 4
1052; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
1053; CHECK-NEXT:    call void @use(i32 [[CONV]])
1054; CHECK-NEXT:    ret void
1055; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate
1056; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1057; CHECK-NEXT:  entry:
1058; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
1059; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1060; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1061; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1062; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1063; CHECK:       omp_parallel:
1064; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_firstprivate..omp_par, ptr [[A_ADDR]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]])
1065; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1066; CHECK:       omp.par.outlined.exit:
1067; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1068; CHECK:       omp.par.exit.split:
1069; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1070; CHECK:       entry.split.split:
1071; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
1072; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1073; CHECK-NEXT:    ret void
1074; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
1075; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
1076; CHECK-NEXT:  omp.par.entry:
1077; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1078; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1079; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1080; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1081; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1082; CHECK:       omp.par.outlined.exit.exitStub:
1083; CHECK-NEXT:    ret void
1084; CHECK:       omp.par.region:
1085; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1086; CHECK:       omp.par.merged:
1087; CHECK-NEXT:    call void @.omp_outlined..12(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1088; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1089; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1090; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1091; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1092; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1093; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1094; CHECK:       omp_region.end:
1095; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1096; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1097; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1098; CHECK:       omp.par.merged.split.split:
1099; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
1100; CHECK-NEXT:    call void @.omp_outlined..13(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
1101; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1102; CHECK:       entry.split:
1103; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1104; CHECK:       omp.par.region.split:
1105; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1106; CHECK:       omp.par.pre_finalize:
1107; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1108; CHECK:       omp_region.body:
1109; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1110; CHECK:       seq.par.merged:
1111; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[A_ADDR]], align 4
1112; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
1113; CHECK-NEXT:    store i32 [[ADD]], ptr [[A_ADDR]], align 4
1114; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
1115; CHECK-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
1116; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1117; CHECK:       omp.par.merged.split:
1118; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1119; CHECK:       omp_region.body.split:
1120; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1121; CHECK-NEXT:    br label [[OMP_REGION_END]]
1122; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12
1123; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1124; CHECK-NEXT:  entry:
1125; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1126; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1127; CHECK-NEXT:    ret void
1128; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13
1129; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
1130; CHECK-NEXT:  entry:
1131; CHECK-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
1132; CHECK-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
1133; CHECK-NEXT:    ret void
1134; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt
1135; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1136; CHECK-NEXT:  entry:
1137; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1138; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1139; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1140; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1141; CHECK:       omp_parallel:
1142; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_seq_sink_lt..omp_par, ptr [[A_ADDR]])
1143; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1144; CHECK:       omp.par.outlined.exit:
1145; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1146; CHECK:       omp.par.exit.split:
1147; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1148; CHECK:       entry.split.split:
1149; CHECK-NEXT:    ret void
1150; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
1151; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
1152; CHECK-NEXT:  omp.par.entry:
1153; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
1154; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1155; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1156; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1157; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1158; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1159; CHECK:       omp.par.outlined.exit.exitStub:
1160; CHECK-NEXT:    ret void
1161; CHECK:       omp.par.region:
1162; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1163; CHECK:       omp.par.merged:
1164; CHECK-NEXT:    call void @.omp_outlined..14(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1165; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1166; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1167; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1168; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1169; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1170; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1171; CHECK:       omp_region.end:
1172; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1173; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1174; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1175; CHECK:       omp.par.merged.split.split:
1176; CHECK-NEXT:    call void @.omp_outlined..15(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1177; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1178; CHECK:       entry.split:
1179; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1180; CHECK:       omp.par.region.split:
1181; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1182; CHECK:       omp.par.pre_finalize:
1183; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1184; CHECK:       omp_region.body:
1185; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1186; CHECK:       seq.par.merged:
1187; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 noundef 4, ptr noundef nonnull [[B]])
1188; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[B]] to i64
1189; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
1190; CHECK-NEXT:    store i32 [[TMP5]], ptr [[B]], align 4
1191; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
1192; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1193; CHECK:       omp.par.merged.split:
1194; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1195; CHECK:       omp_region.body.split:
1196; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1197; CHECK-NEXT:    br label [[OMP_REGION_END]]
1198; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14
1199; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1200; CHECK-NEXT:  entry:
1201; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1202; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1203; CHECK-NEXT:    ret void
1204; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15
1205; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1206; CHECK-NEXT:  entry:
1207; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1208; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1209; CHECK-NEXT:    ret void
1210; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use
1211; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1212; CHECK-NEXT:  entry:
1213; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1214; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
1215; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1216; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1217; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1218; CHECK:       omp_parallel:
1219; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[B]])
1220; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_par_use..omp_par, ptr [[A_ADDR]], ptr [[B]])
1221; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1222; CHECK:       omp.par.outlined.exit:
1223; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1224; CHECK:       omp.par.exit.split:
1225; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1226; CHECK:       entry.split.split:
1227; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
1228; CHECK-NEXT:    ret void
1229; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
1230; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {
1231; CHECK-NEXT:  omp.par.entry:
1232; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1233; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1234; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1235; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1236; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1237; CHECK:       omp.par.outlined.exit.exitStub:
1238; CHECK-NEXT:    ret void
1239; CHECK:       omp.par.region:
1240; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1241; CHECK:       omp.par.merged:
1242; CHECK-NEXT:    call void @.omp_outlined..16(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1243; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1244; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1245; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1246; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1247; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1248; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1249; CHECK:       omp_region.end:
1250; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1251; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1252; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1253; CHECK:       omp.par.merged.split.split:
1254; CHECK-NEXT:    call void @.omp_outlined..17(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B]])
1255; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1256; CHECK:       entry.split:
1257; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1258; CHECK:       omp.par.region.split:
1259; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1260; CHECK:       omp.par.pre_finalize:
1261; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1262; CHECK:       omp_region.body:
1263; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1264; CHECK:       seq.par.merged:
1265; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[A_ADDR]], align 4
1266; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
1267; CHECK-NEXT:    store i32 [[ADD]], ptr [[B]], align 4
1268; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1269; CHECK:       omp.par.merged.split:
1270; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1271; CHECK:       omp_region.body.split:
1272; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1273; CHECK-NEXT:    br label [[OMP_REGION_END]]
1274; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16
1275; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1276; CHECK-NEXT:  entry:
1277; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1278; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1279; CHECK-NEXT:    ret void
1280; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17
1281; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
1282; CHECK-NEXT:  entry:
1283; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1284; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1285; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[B]], align 4
1286; CHECK-NEXT:    call void @use(i32 [[TMP1]])
1287; CHECK-NEXT:    ret void
1288; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions
1289; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
1290; CHECK-NEXT:  entry:
1291; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
1292; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
1293; CHECK-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
1294; CHECK-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
1295; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1296; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1297; CHECK:       omp_parallel:
1298; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_cancellable_regions..omp_par, ptr [[CANCEL1_ADDR]], ptr [[CANCEL2_ADDR]])
1299; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1300; CHECK:       omp.par.outlined.exit:
1301; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1302; CHECK:       omp.par.exit.split:
1303; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1304; CHECK:       entry.split.split:
1305; CHECK-NEXT:    ret void
1306; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
1307; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[CANCEL1_ADDR:%.*]], ptr [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
1308; CHECK-NEXT:  omp.par.entry:
1309; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1310; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1311; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1312; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1313; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1314; CHECK:       omp.par.outlined.exit.exitStub:
1315; CHECK-NEXT:    ret void
1316; CHECK:       omp.par.region:
1317; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1318; CHECK:       omp.par.merged:
1319; CHECK-NEXT:    call void @.omp_outlined..18(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
1320; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1321; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1322; CHECK-NEXT:    call void @.omp_outlined..19(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
1323; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1324; CHECK:       entry.split:
1325; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1326; CHECK:       omp.par.region.split:
1327; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1328; CHECK:       omp.par.pre_finalize:
1329; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1330; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18
1331; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
1332; CHECK-NEXT:  entry:
1333; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
1334; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1335; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1336; CHECK:       if.then:
1337; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
1338; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1339; CHECK-NEXT:    ret void
1340; CHECK:       if.end:
1341; CHECK-NEXT:    ret void
1342; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19
1343; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
1344; CHECK-NEXT:  entry:
1345; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
1346; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1347; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1348; CHECK:       if.then:
1349; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
1350; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1351; CHECK-NEXT:    ret void
1352; CHECK:       if.end:
1353; CHECK-NEXT:    ret void
1354; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
1355; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
1356; CHECK-NEXT:  entry:
1357; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
1358; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
1359; CHECK-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
1360; CHECK-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
1361; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1362; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1363; CHECK:       omp_parallel:
1364; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_cancellable_regions_seq..omp_par, ptr [[CANCEL1_ADDR]], ptr [[CANCEL2_ADDR]])
1365; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1366; CHECK:       omp.par.outlined.exit:
1367; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1368; CHECK:       omp.par.exit.split:
1369; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1370; CHECK:       entry.split.split:
1371; CHECK-NEXT:    ret void
1372; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
1373; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[CANCEL1_ADDR:%.*]], ptr [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
1374; CHECK-NEXT:  omp.par.entry:
1375; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1376; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1377; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1378; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1379; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1380; CHECK:       omp.par.outlined.exit.exitStub:
1381; CHECK-NEXT:    ret void
1382; CHECK:       omp.par.region:
1383; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1384; CHECK:       omp.par.merged:
1385; CHECK-NEXT:    call void @.omp_outlined..20(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
1386; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1387; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1388; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1389; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1390; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1391; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1392; CHECK:       omp_region.end:
1393; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1394; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1395; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1396; CHECK:       omp.par.merged.split.split:
1397; CHECK-NEXT:    call void @.omp_outlined..21(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
1398; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1399; CHECK:       entry.split:
1400; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1401; CHECK:       omp.par.region.split:
1402; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1403; CHECK:       omp.par.pre_finalize:
1404; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1405; CHECK:       omp_region.body:
1406; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1407; CHECK:       seq.par.merged:
1408; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[CANCEL1_ADDR]], align 4
1409; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
1410; CHECK-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
1411; CHECK-NEXT:    store i32 [[LNOT_EXT]], ptr [[CANCEL2_ADDR]], align 4
1412; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1413; CHECK:       omp.par.merged.split:
1414; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1415; CHECK:       omp_region.body.split:
1416; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1417; CHECK-NEXT:    br label [[OMP_REGION_END]]
1418; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20
1419; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
1420; CHECK-NEXT:  entry:
1421; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
1422; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1423; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1424; CHECK:       if.then:
1425; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
1426; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1427; CHECK-NEXT:    ret void
1428; CHECK:       if.end:
1429; CHECK-NEXT:    ret void
1430; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21
1431; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
1432; CHECK-NEXT:  entry:
1433; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
1434; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1435; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1436; CHECK:       if.then:
1437; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
1438; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1439; CHECK-NEXT:    ret void
1440; CHECK:       if.end:
1441; CHECK-NEXT:    ret void
1442; CHECK-LABEL: define {{[^@]+}}@merge_3
1443; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1444; CHECK-NEXT:  entry:
1445; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1446; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1447; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1448; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1449; CHECK:       omp_parallel:
1450; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_3..omp_par, ptr [[A_ADDR]])
1451; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1452; CHECK:       omp.par.outlined.exit:
1453; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1454; CHECK:       omp.par.exit.split:
1455; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1456; CHECK:       entry.split.split:
1457; CHECK-NEXT:    ret void
1458; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par
1459; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
1460; CHECK-NEXT:  omp.par.entry:
1461; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1462; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1463; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1464; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1465; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1466; CHECK:       omp.par.outlined.exit.exitStub:
1467; CHECK-NEXT:    ret void
1468; CHECK:       omp.par.region:
1469; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1470; CHECK:       omp.par.merged:
1471; CHECK-NEXT:    call void @.omp_outlined..22(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1472; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1473; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1474; CHECK-NEXT:    call void @.omp_outlined..23(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1475; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1476; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1477; CHECK-NEXT:    call void @.omp_outlined..24(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1478; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1479; CHECK:       entry.split:
1480; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1481; CHECK:       omp.par.region.split:
1482; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1483; CHECK:       omp.par.pre_finalize:
1484; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1485; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22
1486; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1487; CHECK-NEXT:  entry:
1488; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1489; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1490; CHECK-NEXT:    ret void
1491; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23
1492; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1493; CHECK-NEXT:  entry:
1494; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1495; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1496; CHECK-NEXT:    ret void
1497; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24
1498; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1499; CHECK-NEXT:  entry:
1500; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1501; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1502; CHECK-NEXT:    ret void
1503; CHECK-LABEL: define {{[^@]+}}@merge_3_seq
1504; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
1505; CHECK-NEXT:  entry:
1506; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
1507; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
1508; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1509; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1510; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1511; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1512; CHECK:       omp_parallel:
1513; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 3, ptr @merge_3_seq..omp_par, ptr [[A_ADDR]], ptr [[ADD_SEQ_OUTPUT_ALLOC]], ptr [[ADD1_SEQ_OUTPUT_ALLOC]])
1514; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1515; CHECK:       omp.par.outlined.exit:
1516; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1517; CHECK:       omp.par.exit.split:
1518; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1519; CHECK:       entry.split.split:
1520; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
1521; CHECK-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
1522; CHECK-NEXT:    ret void
1523; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
1524; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[ADD_SEQ_OUTPUT_ALLOC:%.*]], ptr [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
1525; CHECK-NEXT:  omp.par.entry:
1526; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1527; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1528; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1529; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1530; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1531; CHECK:       omp.par.outlined.exit.exitStub:
1532; CHECK-NEXT:    ret void
1533; CHECK:       omp.par.region:
1534; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1535; CHECK:       omp.par.merged:
1536; CHECK-NEXT:    call void @.omp_outlined..25(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1537; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1538; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1539; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1540; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1541; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1542; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1543; CHECK:       omp_region.end:
1544; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1545; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1546; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1547; CHECK:       omp.par.merged.split.split:
1548; CHECK-NEXT:    call void @.omp_outlined..26(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1549; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1550; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
1551; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1552; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
1553; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
1554; CHECK-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
1555; CHECK:       omp_region.end4:
1556; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1557; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
1558; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
1559; CHECK:       omp.par.merged.split.split.split.split:
1560; CHECK-NEXT:    call void @.omp_outlined..27(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1561; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1562; CHECK:       entry.split:
1563; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1564; CHECK:       omp.par.region.split:
1565; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1566; CHECK:       omp.par.pre_finalize:
1567; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1568; CHECK:       omp_region.body5:
1569; CHECK-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
1570; CHECK:       seq.par.merged2:
1571; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[A_ADDR]], align 4
1572; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[ADD_SEQ_OUTPUT_ALLOC]], align 4
1573; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]]
1574; CHECK-NEXT:    store i32 [[ADD1]], ptr [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
1575; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
1576; CHECK:       omp.par.merged.split.split.split:
1577; CHECK-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
1578; CHECK:       omp_region.body5.split:
1579; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
1580; CHECK-NEXT:    br label [[OMP_REGION_END4]]
1581; CHECK:       omp_region.body:
1582; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1583; CHECK:       seq.par.merged:
1584; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[A_ADDR]], align 4
1585; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], 1
1586; CHECK-NEXT:    store i32 [[ADD]], ptr [[ADD_SEQ_OUTPUT_ALLOC]], align 4
1587; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1588; CHECK:       omp.par.merged.split:
1589; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1590; CHECK:       omp_region.body.split:
1591; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1592; CHECK-NEXT:    br label [[OMP_REGION_END]]
1593; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25
1594; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1595; CHECK-NEXT:  entry:
1596; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1597; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1598; CHECK-NEXT:    ret void
1599; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26
1600; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1601; CHECK-NEXT:  entry:
1602; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1603; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1604; CHECK-NEXT:    ret void
1605; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27
1606; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1607; CHECK-NEXT:  entry:
1608; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1609; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1610; CHECK-NEXT:    ret void
1611; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call
1612; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1613; CHECK-NEXT:  entry:
1614; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1615; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1616; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..28, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1617; CHECK-NEXT:    call void (...) @foo()
1618; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..29, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1619; CHECK-NEXT:    call void (...) @foo()
1620; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..30, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1621; CHECK-NEXT:    ret void
1622; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28
1623; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1624; CHECK-NEXT:  entry:
1625; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1626; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1627; CHECK-NEXT:    ret void
1628; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29
1629; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1630; CHECK-NEXT:  entry:
1631; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1632; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1633; CHECK-NEXT:    ret void
1634; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30
1635; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1636; CHECK-NEXT:  entry:
1637; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1638; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1639; CHECK-NEXT:    ret void
1640; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
1641; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1642; CHECK-NEXT:  entry:
1643; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1644; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
1645; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1646; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..31, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1647; CHECK-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
1648; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..32, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1649; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..33, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1650; CHECK-NEXT:    ret void
1651; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31
1652; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1653; CHECK-NEXT:  entry:
1654; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1655; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1656; CHECK-NEXT:    ret void
1657; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32
1658; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1659; CHECK-NEXT:  entry:
1660; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1661; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1662; CHECK-NEXT:    ret void
1663; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33
1664; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1665; CHECK-NEXT:  entry:
1666; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1667; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1668; CHECK-NEXT:    ret void
1669; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads
1670; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1671; CHECK-NEXT:  entry:
1672; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1673; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
1674; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1675; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..34, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1676; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A_ADDR]], align 4
1677; CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]])
1678; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..35, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1679; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..36, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1680; CHECK-NEXT:    ret void
1681; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34
1682; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1683; CHECK-NEXT:  entry:
1684; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1685; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1686; CHECK-NEXT:    ret void
1687; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35
1688; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1689; CHECK-NEXT:  entry:
1690; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1691; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1692; CHECK-NEXT:    ret void
1693; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36
1694; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1695; CHECK-NEXT:  entry:
1696; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1697; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1698; CHECK-NEXT:    ret void
1699; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1
1700; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1701; CHECK-NEXT:  entry:
1702; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1703; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1704; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1705; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1706; CHECK:       omp_parallel:
1707; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_2_unmergable_1..omp_par, ptr [[A_ADDR]])
1708; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1709; CHECK:       omp.par.outlined.exit:
1710; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1711; CHECK:       omp.par.exit.split:
1712; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1713; CHECK:       entry.split.split:
1714; CHECK-NEXT:    call void (...) @foo()
1715; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..39, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1716; CHECK-NEXT:    ret void
1717; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
1718; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
1719; CHECK-NEXT:  omp.par.entry:
1720; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1721; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1722; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1723; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1724; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1725; CHECK:       omp.par.outlined.exit.exitStub:
1726; CHECK-NEXT:    ret void
1727; CHECK:       omp.par.region:
1728; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1729; CHECK:       omp.par.merged:
1730; CHECK-NEXT:    call void @.omp_outlined..37(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1731; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1732; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1733; CHECK-NEXT:    call void @.omp_outlined..38(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1734; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1735; CHECK:       entry.split:
1736; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1737; CHECK:       omp.par.region.split:
1738; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1739; CHECK:       omp.par.pre_finalize:
1740; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1741; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37
1742; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1743; CHECK-NEXT:  entry:
1744; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1745; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1746; CHECK-NEXT:    ret void
1747; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38
1748; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1749; CHECK-NEXT:  entry:
1750; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1751; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1752; CHECK-NEXT:    ret void
1753; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39
1754; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1755; CHECK-NEXT:  entry:
1756; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1757; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1758; CHECK-NEXT:    ret void
1759; CHECK-LABEL: define {{[^@]+}}@merge
1760; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1761; CHECK-NEXT:  entry:
1762; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1763; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1764; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1765; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1766; CHECK:       omp_parallel:
1767; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge..omp_par, ptr [[A_ADDR]])
1768; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1769; CHECK:       omp.par.outlined.exit:
1770; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1771; CHECK:       omp.par.exit.split:
1772; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1773; CHECK:       entry.split.split:
1774; CHECK-NEXT:    ret void
1775; CHECK-LABEL: define {{[^@]+}}@merge..omp_par
1776; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
1777; CHECK-NEXT:  omp.par.entry:
1778; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1779; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1780; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1781; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1782; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1783; CHECK:       omp.par.outlined.exit.exitStub:
1784; CHECK-NEXT:    ret void
1785; CHECK:       omp.par.region:
1786; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1787; CHECK:       omp.par.merged:
1788; CHECK-NEXT:    call void @.omp_outlined.(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1789; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1790; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1791; CHECK-NEXT:    call void @.omp_outlined..1(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1792; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1793; CHECK:       entry.split:
1794; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1795; CHECK:       omp.par.region.split:
1796; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1797; CHECK:       omp.par.pre_finalize:
1798; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1799; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
1800; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1801; CHECK-NEXT:  entry:
1802; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1803; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1804; CHECK-NEXT:    ret void
1805; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
1806; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1807; CHECK-NEXT:  entry:
1808; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1809; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1810; CHECK-NEXT:    ret void
1811; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind
1812; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1813; CHECK-NEXT:  entry:
1814; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1815; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
1816; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1817; CHECK-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
1818; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..2, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1819; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..3, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1820; CHECK-NEXT:    ret void
1821; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
1822; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1823; CHECK-NEXT:  entry:
1824; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1825; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1826; CHECK-NEXT:    ret void
1827; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3
1828; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1829; CHECK-NEXT:  entry:
1830; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1831; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1832; CHECK-NEXT:    ret void
1833; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads
1834; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1835; CHECK-NEXT:  entry:
1836; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1837; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
1838; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1839; CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
1840; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..4, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1841; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..5, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1842; CHECK-NEXT:    ret void
1843; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4
1844; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1845; CHECK-NEXT:  entry:
1846; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1847; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1848; CHECK-NEXT:    ret void
1849; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5
1850; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1851; CHECK-NEXT:  entry:
1852; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1853; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1854; CHECK-NEXT:    ret void
1855; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call
1856; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1857; CHECK-NEXT:  entry:
1858; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1859; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1860; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..6, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1861; CHECK-NEXT:    call void (...) @foo()
1862; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..7, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1863; CHECK-NEXT:    ret void
1864; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6
1865; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1866; CHECK-NEXT:  entry:
1867; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1868; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1869; CHECK-NEXT:    ret void
1870; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7
1871; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1872; CHECK-NEXT:  entry:
1873; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1874; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1875; CHECK-NEXT:    ret void
1876; CHECK-LABEL: define {{[^@]+}}@merge_seq
1877; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1878; CHECK-NEXT:  entry:
1879; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1880; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
1881; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1882; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1883; CHECK:       omp_parallel:
1884; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_seq..omp_par, ptr [[A_ADDR]])
1885; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1886; CHECK:       omp.par.outlined.exit:
1887; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1888; CHECK:       omp.par.exit.split:
1889; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1890; CHECK:       entry.split.split:
1891; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
1892; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1893; CHECK-NEXT:    ret void
1894; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par
1895; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
1896; CHECK-NEXT:  omp.par.entry:
1897; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1898; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1899; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1900; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1901; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1902; CHECK:       omp.par.outlined.exit.exitStub:
1903; CHECK-NEXT:    ret void
1904; CHECK:       omp.par.region:
1905; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1906; CHECK:       omp.par.merged:
1907; CHECK-NEXT:    call void @.omp_outlined..8(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1908; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1909; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1910; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1911; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1912; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1913; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1914; CHECK:       omp_region.end:
1915; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1916; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1917; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1918; CHECK:       omp.par.merged.split.split:
1919; CHECK-NEXT:    call void @.omp_outlined..9(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1920; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1921; CHECK:       entry.split:
1922; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1923; CHECK:       omp.par.region.split:
1924; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1925; CHECK:       omp.par.pre_finalize:
1926; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1927; CHECK:       omp_region.body:
1928; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1929; CHECK:       seq.par.merged:
1930; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[A_ADDR]], align 4
1931; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
1932; CHECK-NEXT:    store i32 [[ADD]], ptr [[A_ADDR]], align 4
1933; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1934; CHECK:       omp.par.merged.split:
1935; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1936; CHECK:       omp_region.body.split:
1937; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1938; CHECK-NEXT:    br label [[OMP_REGION_END]]
1939; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8
1940; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1941; CHECK-NEXT:  entry:
1942; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1943; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1944; CHECK-NEXT:    ret void
1945; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9
1946; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1947; CHECK-NEXT:  entry:
1948; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
1949; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1950; CHECK-NEXT:    ret void
1951; CHECK-LABEL: define {{[^@]+}}@merge_seq_float
1952; CHECK-SAME: (float [[F:%.*]], ptr nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
1953; CHECK-NEXT:  entry:
1954; CHECK-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
1955; CHECK-NEXT:    store float [[F]], ptr [[F_ADDR]], align 4
1956; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1957; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1958; CHECK:       omp_parallel:
1959; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_float..omp_par, ptr [[F_ADDR]], ptr [[P]])
1960; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1961; CHECK:       omp.par.outlined.exit:
1962; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1963; CHECK:       omp.par.exit.split:
1964; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1965; CHECK:       entry.split.split:
1966; CHECK-NEXT:    ret void
1967; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
1968; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[F_ADDR:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
1969; CHECK-NEXT:  omp.par.entry:
1970; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1971; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
1972; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
1973; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
1974; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1975; CHECK:       omp.par.outlined.exit.exitStub:
1976; CHECK-NEXT:    ret void
1977; CHECK:       omp.par.region:
1978; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1979; CHECK:       omp.par.merged:
1980; CHECK-NEXT:    call void @.omp_outlined..10(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
1981; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1982; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1983; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1984; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1985; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1986; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1987; CHECK:       omp_region.end:
1988; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
1989; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1990; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1991; CHECK:       omp.par.merged.split.split:
1992; CHECK-NEXT:    call void @.omp_outlined..11(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
1993; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1994; CHECK:       entry.split:
1995; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1996; CHECK:       omp.par.region.split:
1997; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1998; CHECK:       omp.par.pre_finalize:
1999; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2000; CHECK:       omp_region.body:
2001; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2002; CHECK:       seq.par.merged:
2003; CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F_ADDR]], align 4
2004; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000
2005; CHECK-NEXT:    store float [[ADD]], ptr [[P]], align 4
2006; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2007; CHECK:       omp.par.merged.split:
2008; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2009; CHECK:       omp_region.body.split:
2010; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2011; CHECK-NEXT:    br label [[OMP_REGION_END]]
2012; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10
2013; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
2014; CHECK-NEXT:  entry:
2015; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F]], align 4
2016; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
2017; CHECK-NEXT:    call void @use(i32 [[CONV]])
2018; CHECK-NEXT:    ret void
2019; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11
2020; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
2021; CHECK-NEXT:  entry:
2022; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[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 {{[^@]+}}@merge_seq_firstprivate
2027; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2028; CHECK-NEXT:  entry:
2029; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
2030; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2031; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2032; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2033; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2034; CHECK:       omp_parallel:
2035; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_firstprivate..omp_par, ptr [[A_ADDR]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]])
2036; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2037; CHECK:       omp.par.outlined.exit:
2038; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2039; CHECK:       omp.par.exit.split:
2040; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2041; CHECK:       entry.split.split:
2042; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2043; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2044; CHECK-NEXT:    ret void
2045; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
2046; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
2047; CHECK-NEXT:  omp.par.entry:
2048; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2049; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2050; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2051; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2052; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2053; CHECK:       omp.par.outlined.exit.exitStub:
2054; CHECK-NEXT:    ret void
2055; CHECK:       omp.par.region:
2056; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2057; CHECK:       omp.par.merged:
2058; CHECK-NEXT:    call void @.omp_outlined..12(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2059; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2060; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2061; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2062; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2063; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2064; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2065; CHECK:       omp_region.end:
2066; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2067; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2068; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2069; CHECK:       omp.par.merged.split.split:
2070; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
2071; CHECK-NEXT:    call void @.omp_outlined..13(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
2072; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2073; CHECK:       entry.split:
2074; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2075; CHECK:       omp.par.region.split:
2076; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2077; CHECK:       omp.par.pre_finalize:
2078; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2079; CHECK:       omp_region.body:
2080; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2081; CHECK:       seq.par.merged:
2082; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[A_ADDR]], align 4
2083; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
2084; CHECK-NEXT:    store i32 [[ADD]], ptr [[A_ADDR]], align 4
2085; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
2086; CHECK-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
2087; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2088; CHECK:       omp.par.merged.split:
2089; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2090; CHECK:       omp_region.body.split:
2091; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2092; CHECK-NEXT:    br label [[OMP_REGION_END]]
2093; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12
2094; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2095; CHECK-NEXT:  entry:
2096; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2097; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2098; CHECK-NEXT:    ret void
2099; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13
2100; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
2101; CHECK-NEXT:  entry:
2102; CHECK-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
2103; CHECK-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
2104; CHECK-NEXT:    ret void
2105; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt
2106; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2107; CHECK-NEXT:  entry:
2108; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2109; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2110; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2111; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2112; CHECK:       omp_parallel:
2113; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_seq_sink_lt..omp_par, ptr [[A_ADDR]])
2114; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2115; CHECK:       omp.par.outlined.exit:
2116; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2117; CHECK:       omp.par.exit.split:
2118; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2119; CHECK:       entry.split.split:
2120; CHECK-NEXT:    ret void
2121; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
2122; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
2123; CHECK-NEXT:  omp.par.entry:
2124; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
2125; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2126; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2127; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2128; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2129; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2130; CHECK:       omp.par.outlined.exit.exitStub:
2131; CHECK-NEXT:    ret void
2132; CHECK:       omp.par.region:
2133; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2134; CHECK:       omp.par.merged:
2135; CHECK-NEXT:    call void @.omp_outlined..14(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2136; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2137; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2138; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2139; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2140; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2141; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2142; CHECK:       omp_region.end:
2143; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2144; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2145; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2146; CHECK:       omp.par.merged.split.split:
2147; CHECK-NEXT:    call void @.omp_outlined..15(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2148; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2149; CHECK:       entry.split:
2150; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2151; CHECK:       omp.par.region.split:
2152; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2153; CHECK:       omp.par.pre_finalize:
2154; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2155; CHECK:       omp_region.body:
2156; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2157; CHECK:       seq.par.merged:
2158; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 noundef 4, ptr noundef nonnull [[B]])
2159; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[B]] to i64
2160; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
2161; CHECK-NEXT:    store i32 [[TMP5]], ptr [[B]], align 4
2162; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
2163; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2164; CHECK:       omp.par.merged.split:
2165; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2166; CHECK:       omp_region.body.split:
2167; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2168; CHECK-NEXT:    br label [[OMP_REGION_END]]
2169; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14
2170; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2171; CHECK-NEXT:  entry:
2172; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2173; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2174; CHECK-NEXT:    ret void
2175; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15
2176; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2177; CHECK-NEXT:  entry:
2178; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2179; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2180; CHECK-NEXT:    ret void
2181; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use
2182; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2183; CHECK-NEXT:  entry:
2184; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2185; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
2186; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2187; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2188; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2189; CHECK:       omp_parallel:
2190; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[B]])
2191; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_par_use..omp_par, ptr [[A_ADDR]], ptr [[B]])
2192; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2193; CHECK:       omp.par.outlined.exit:
2194; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2195; CHECK:       omp.par.exit.split:
2196; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2197; CHECK:       entry.split.split:
2198; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
2199; CHECK-NEXT:    ret void
2200; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
2201; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {
2202; CHECK-NEXT:  omp.par.entry:
2203; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2204; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2205; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2206; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2207; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2208; CHECK:       omp.par.outlined.exit.exitStub:
2209; CHECK-NEXT:    ret void
2210; CHECK:       omp.par.region:
2211; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2212; CHECK:       omp.par.merged:
2213; CHECK-NEXT:    call void @.omp_outlined..16(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2214; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2215; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2216; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2217; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2218; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2219; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2220; CHECK:       omp_region.end:
2221; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2222; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2223; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2224; CHECK:       omp.par.merged.split.split:
2225; CHECK-NEXT:    call void @.omp_outlined..17(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B]])
2226; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2227; CHECK:       entry.split:
2228; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2229; CHECK:       omp.par.region.split:
2230; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2231; CHECK:       omp.par.pre_finalize:
2232; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2233; CHECK:       omp_region.body:
2234; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2235; CHECK:       seq.par.merged:
2236; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[A_ADDR]], align 4
2237; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
2238; CHECK-NEXT:    store i32 [[ADD]], ptr [[B]], align 4
2239; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2240; CHECK:       omp.par.merged.split:
2241; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2242; CHECK:       omp_region.body.split:
2243; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2244; CHECK-NEXT:    br label [[OMP_REGION_END]]
2245; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16
2246; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2247; CHECK-NEXT:  entry:
2248; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2249; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2250; CHECK-NEXT:    ret void
2251; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17
2252; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
2253; CHECK-NEXT:  entry:
2254; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2255; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2256; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[B]], align 4
2257; CHECK-NEXT:    call void @use(i32 [[TMP1]])
2258; CHECK-NEXT:    ret void
2259; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions
2260; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
2261; CHECK-NEXT:  entry:
2262; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
2263; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
2264; CHECK-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
2265; CHECK-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
2266; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2267; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2268; CHECK:       omp_parallel:
2269; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_cancellable_regions..omp_par, ptr [[CANCEL1_ADDR]], ptr [[CANCEL2_ADDR]])
2270; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2271; CHECK:       omp.par.outlined.exit:
2272; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2273; CHECK:       omp.par.exit.split:
2274; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2275; CHECK:       entry.split.split:
2276; CHECK-NEXT:    ret void
2277; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
2278; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[CANCEL1_ADDR:%.*]], ptr [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
2279; CHECK-NEXT:  omp.par.entry:
2280; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2281; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2282; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2283; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2284; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2285; CHECK:       omp.par.outlined.exit.exitStub:
2286; CHECK-NEXT:    ret void
2287; CHECK:       omp.par.region:
2288; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2289; CHECK:       omp.par.merged:
2290; CHECK-NEXT:    call void @.omp_outlined..18(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
2291; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2292; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2293; CHECK-NEXT:    call void @.omp_outlined..19(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
2294; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2295; CHECK:       entry.split:
2296; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2297; CHECK:       omp.par.region.split:
2298; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2299; CHECK:       omp.par.pre_finalize:
2300; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2301; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18
2302; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
2303; CHECK-NEXT:  entry:
2304; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
2305; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
2306; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
2307; CHECK:       if.then:
2308; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
2309; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
2310; CHECK-NEXT:    ret void
2311; CHECK:       if.end:
2312; CHECK-NEXT:    ret void
2313; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19
2314; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
2315; CHECK-NEXT:  entry:
2316; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
2317; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
2318; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
2319; CHECK:       if.then:
2320; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
2321; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
2322; CHECK-NEXT:    ret void
2323; CHECK:       if.end:
2324; CHECK-NEXT:    ret void
2325; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
2326; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
2327; CHECK-NEXT:  entry:
2328; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
2329; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
2330; CHECK-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
2331; CHECK-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
2332; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2333; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2334; CHECK:       omp_parallel:
2335; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_cancellable_regions_seq..omp_par, ptr [[CANCEL1_ADDR]], ptr [[CANCEL2_ADDR]])
2336; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2337; CHECK:       omp.par.outlined.exit:
2338; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2339; CHECK:       omp.par.exit.split:
2340; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2341; CHECK:       entry.split.split:
2342; CHECK-NEXT:    ret void
2343; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
2344; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[CANCEL1_ADDR:%.*]], ptr [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
2345; CHECK-NEXT:  omp.par.entry:
2346; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2347; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2348; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2349; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2350; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2351; CHECK:       omp.par.outlined.exit.exitStub:
2352; CHECK-NEXT:    ret void
2353; CHECK:       omp.par.region:
2354; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2355; CHECK:       omp.par.merged:
2356; CHECK-NEXT:    call void @.omp_outlined..20(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
2357; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2358; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2359; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2360; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2361; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2362; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2363; CHECK:       omp_region.end:
2364; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2365; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2366; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2367; CHECK:       omp.par.merged.split.split:
2368; CHECK-NEXT:    call void @.omp_outlined..21(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
2369; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2370; CHECK:       entry.split:
2371; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2372; CHECK:       omp.par.region.split:
2373; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2374; CHECK:       omp.par.pre_finalize:
2375; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2376; CHECK:       omp_region.body:
2377; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2378; CHECK:       seq.par.merged:
2379; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[CANCEL1_ADDR]], align 4
2380; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
2381; CHECK-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
2382; CHECK-NEXT:    store i32 [[LNOT_EXT]], ptr [[CANCEL2_ADDR]], align 4
2383; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2384; CHECK:       omp.par.merged.split:
2385; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2386; CHECK:       omp_region.body.split:
2387; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2388; CHECK-NEXT:    br label [[OMP_REGION_END]]
2389; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20
2390; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
2391; CHECK-NEXT:  entry:
2392; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
2393; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
2394; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
2395; CHECK:       if.then:
2396; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
2397; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
2398; CHECK-NEXT:    ret void
2399; CHECK:       if.end:
2400; CHECK-NEXT:    ret void
2401; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21
2402; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
2403; CHECK-NEXT:  entry:
2404; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
2405; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
2406; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
2407; CHECK:       if.then:
2408; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
2409; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
2410; CHECK-NEXT:    ret void
2411; CHECK:       if.end:
2412; CHECK-NEXT:    ret void
2413; CHECK-LABEL: define {{[^@]+}}@merge_3
2414; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2415; CHECK-NEXT:  entry:
2416; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2417; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2418; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2419; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2420; CHECK:       omp_parallel:
2421; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_3..omp_par, ptr [[A_ADDR]])
2422; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2423; CHECK:       omp.par.outlined.exit:
2424; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2425; CHECK:       omp.par.exit.split:
2426; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2427; CHECK:       entry.split.split:
2428; CHECK-NEXT:    ret void
2429; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par
2430; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
2431; CHECK-NEXT:  omp.par.entry:
2432; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2433; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2434; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2435; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2436; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2437; CHECK:       omp.par.outlined.exit.exitStub:
2438; CHECK-NEXT:    ret void
2439; CHECK:       omp.par.region:
2440; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2441; CHECK:       omp.par.merged:
2442; CHECK-NEXT:    call void @.omp_outlined..22(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2443; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2444; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2445; CHECK-NEXT:    call void @.omp_outlined..23(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2446; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2447; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2448; CHECK-NEXT:    call void @.omp_outlined..24(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2449; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2450; CHECK:       entry.split:
2451; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2452; CHECK:       omp.par.region.split:
2453; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2454; CHECK:       omp.par.pre_finalize:
2455; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2456; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22
2457; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2458; CHECK-NEXT:  entry:
2459; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2460; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2461; CHECK-NEXT:    ret void
2462; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23
2463; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2464; CHECK-NEXT:  entry:
2465; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2466; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2467; CHECK-NEXT:    ret void
2468; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24
2469; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2470; CHECK-NEXT:  entry:
2471; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2472; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2473; CHECK-NEXT:    ret void
2474; CHECK-LABEL: define {{[^@]+}}@merge_3_seq
2475; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
2476; CHECK-NEXT:  entry:
2477; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
2478; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
2479; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2480; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2481; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2482; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2483; CHECK:       omp_parallel:
2484; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 3, ptr @merge_3_seq..omp_par, ptr [[A_ADDR]], ptr [[ADD_SEQ_OUTPUT_ALLOC]], ptr [[ADD1_SEQ_OUTPUT_ALLOC]])
2485; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2486; CHECK:       omp.par.outlined.exit:
2487; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2488; CHECK:       omp.par.exit.split:
2489; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2490; CHECK:       entry.split.split:
2491; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
2492; CHECK-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
2493; CHECK-NEXT:    ret void
2494; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
2495; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[ADD_SEQ_OUTPUT_ALLOC:%.*]], ptr [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
2496; CHECK-NEXT:  omp.par.entry:
2497; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2498; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2499; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2500; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2501; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2502; CHECK:       omp.par.outlined.exit.exitStub:
2503; CHECK-NEXT:    ret void
2504; CHECK:       omp.par.region:
2505; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2506; CHECK:       omp.par.merged:
2507; CHECK-NEXT:    call void @.omp_outlined..25(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2508; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2509; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2510; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2511; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2512; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2513; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2514; CHECK:       omp_region.end:
2515; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2516; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2517; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2518; CHECK:       omp.par.merged.split.split:
2519; CHECK-NEXT:    call void @.omp_outlined..26(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2520; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2521; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
2522; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2523; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
2524; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
2525; CHECK-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
2526; CHECK:       omp_region.end4:
2527; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2528; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
2529; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
2530; CHECK:       omp.par.merged.split.split.split.split:
2531; CHECK-NEXT:    call void @.omp_outlined..27(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2532; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2533; CHECK:       entry.split:
2534; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2535; CHECK:       omp.par.region.split:
2536; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2537; CHECK:       omp.par.pre_finalize:
2538; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2539; CHECK:       omp_region.body5:
2540; CHECK-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
2541; CHECK:       seq.par.merged2:
2542; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[A_ADDR]], align 4
2543; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[ADD_SEQ_OUTPUT_ALLOC]], align 4
2544; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]]
2545; CHECK-NEXT:    store i32 [[ADD1]], ptr [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
2546; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
2547; CHECK:       omp.par.merged.split.split.split:
2548; CHECK-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
2549; CHECK:       omp_region.body5.split:
2550; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
2551; CHECK-NEXT:    br label [[OMP_REGION_END4]]
2552; CHECK:       omp_region.body:
2553; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2554; CHECK:       seq.par.merged:
2555; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[A_ADDR]], align 4
2556; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], 1
2557; CHECK-NEXT:    store i32 [[ADD]], ptr [[ADD_SEQ_OUTPUT_ALLOC]], align 4
2558; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2559; CHECK:       omp.par.merged.split:
2560; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2561; CHECK:       omp_region.body.split:
2562; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2563; CHECK-NEXT:    br label [[OMP_REGION_END]]
2564; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25
2565; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2566; CHECK-NEXT:  entry:
2567; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2568; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2569; CHECK-NEXT:    ret void
2570; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26
2571; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2572; CHECK-NEXT:  entry:
2573; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2574; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2575; CHECK-NEXT:    ret void
2576; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27
2577; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2578; CHECK-NEXT:  entry:
2579; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2580; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2581; CHECK-NEXT:    ret void
2582; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call
2583; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2584; CHECK-NEXT:  entry:
2585; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2586; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2587; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..28, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2588; CHECK-NEXT:    call void (...) @foo()
2589; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..29, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2590; CHECK-NEXT:    call void (...) @foo()
2591; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..30, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2592; CHECK-NEXT:    ret void
2593; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28
2594; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2595; CHECK-NEXT:  entry:
2596; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2597; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2598; CHECK-NEXT:    ret void
2599; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29
2600; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2601; CHECK-NEXT:  entry:
2602; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2603; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2604; CHECK-NEXT:    ret void
2605; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30
2606; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2607; CHECK-NEXT:  entry:
2608; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2609; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2610; CHECK-NEXT:    ret void
2611; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
2612; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2613; CHECK-NEXT:  entry:
2614; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2615; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
2616; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2617; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..31, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2618; CHECK-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
2619; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..32, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2620; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..33, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2621; CHECK-NEXT:    ret void
2622; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31
2623; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2624; CHECK-NEXT:  entry:
2625; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2626; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2627; CHECK-NEXT:    ret void
2628; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32
2629; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2630; CHECK-NEXT:  entry:
2631; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2632; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2633; CHECK-NEXT:    ret void
2634; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33
2635; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2636; CHECK-NEXT:  entry:
2637; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2638; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2639; CHECK-NEXT:    ret void
2640; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads
2641; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2642; CHECK-NEXT:  entry:
2643; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2644; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
2645; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2646; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..34, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2647; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A_ADDR]], align 4
2648; CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]])
2649; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..35, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2650; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..36, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2651; CHECK-NEXT:    ret void
2652; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34
2653; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2654; CHECK-NEXT:  entry:
2655; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2656; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2657; CHECK-NEXT:    ret void
2658; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35
2659; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2660; CHECK-NEXT:  entry:
2661; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2662; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2663; CHECK-NEXT:    ret void
2664; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36
2665; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2666; CHECK-NEXT:  entry:
2667; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2668; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2669; CHECK-NEXT:    ret void
2670; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1
2671; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2672; CHECK-NEXT:  entry:
2673; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2674; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2675; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2676; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2677; CHECK:       omp_parallel:
2678; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_2_unmergable_1..omp_par, ptr [[A_ADDR]])
2679; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2680; CHECK:       omp.par.outlined.exit:
2681; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2682; CHECK:       omp.par.exit.split:
2683; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2684; CHECK:       entry.split.split:
2685; CHECK-NEXT:    call void (...) @foo()
2686; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..39, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2687; CHECK-NEXT:    ret void
2688; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
2689; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
2690; CHECK-NEXT:  omp.par.entry:
2691; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2692; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2693; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2694; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2695; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2696; CHECK:       omp.par.outlined.exit.exitStub:
2697; CHECK-NEXT:    ret void
2698; CHECK:       omp.par.region:
2699; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2700; CHECK:       omp.par.merged:
2701; CHECK-NEXT:    call void @.omp_outlined..37(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2702; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2703; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2704; CHECK-NEXT:    call void @.omp_outlined..38(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2705; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2706; CHECK:       entry.split:
2707; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2708; CHECK:       omp.par.region.split:
2709; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2710; CHECK:       omp.par.pre_finalize:
2711; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2712; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37
2713; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2714; CHECK-NEXT:  entry:
2715; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2716; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2717; CHECK-NEXT:    ret void
2718; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38
2719; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2720; CHECK-NEXT:  entry:
2721; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2722; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2723; CHECK-NEXT:    ret void
2724; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39
2725; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2726; CHECK-NEXT:  entry:
2727; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2728; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2729; CHECK-NEXT:    ret void
2730; CHECK-LABEL: define {{[^@]+}}@merge
2731; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2732; CHECK-NEXT:  entry:
2733; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2734; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2735; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2736; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2737; CHECK:       omp_parallel:
2738; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge..omp_par, ptr [[A_ADDR]])
2739; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2740; CHECK:       omp.par.outlined.exit:
2741; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2742; CHECK:       omp.par.exit.split:
2743; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2744; CHECK:       entry.split.split:
2745; CHECK-NEXT:    ret void
2746; CHECK-LABEL: define {{[^@]+}}@merge..omp_par
2747; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
2748; CHECK-NEXT:  omp.par.entry:
2749; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2750; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2751; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2752; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2753; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2754; CHECK:       omp.par.outlined.exit.exitStub:
2755; CHECK-NEXT:    ret void
2756; CHECK:       omp.par.region:
2757; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2758; CHECK:       omp.par.merged:
2759; CHECK-NEXT:    call void @.omp_outlined.(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2760; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2761; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2762; CHECK-NEXT:    call void @.omp_outlined..1(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2763; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2764; CHECK:       entry.split:
2765; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2766; CHECK:       omp.par.region.split:
2767; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2768; CHECK:       omp.par.pre_finalize:
2769; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2770; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
2771; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2772; CHECK-NEXT:  entry:
2773; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2774; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2775; CHECK-NEXT:    ret void
2776; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
2777; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2778; CHECK-NEXT:  entry:
2779; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2780; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2781; CHECK-NEXT:    ret void
2782; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind
2783; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2784; CHECK-NEXT:  entry:
2785; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2786; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
2787; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2788; CHECK-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
2789; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..2, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2790; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..3, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2791; CHECK-NEXT:    ret void
2792; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
2793; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2794; CHECK-NEXT:  entry:
2795; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2796; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2797; CHECK-NEXT:    ret void
2798; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3
2799; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2800; CHECK-NEXT:  entry:
2801; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2802; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2803; CHECK-NEXT:    ret void
2804; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads
2805; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2806; CHECK-NEXT:  entry:
2807; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2808; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
2809; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2810; CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
2811; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..4, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2812; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..5, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2813; CHECK-NEXT:    ret void
2814; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4
2815; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2816; CHECK-NEXT:  entry:
2817; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2818; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2819; CHECK-NEXT:    ret void
2820; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5
2821; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2822; CHECK-NEXT:  entry:
2823; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2824; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2825; CHECK-NEXT:    ret void
2826; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call
2827; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2828; CHECK-NEXT:  entry:
2829; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2830; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2831; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..6, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2832; CHECK-NEXT:    call void (...) @foo()
2833; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..7, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2834; CHECK-NEXT:    ret void
2835; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6
2836; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2837; CHECK-NEXT:  entry:
2838; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2839; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2840; CHECK-NEXT:    ret void
2841; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7
2842; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2843; CHECK-NEXT:  entry:
2844; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2845; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2846; CHECK-NEXT:    ret void
2847; CHECK-LABEL: define {{[^@]+}}@merge_seq
2848; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2849; CHECK-NEXT:  entry:
2850; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
2851; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
2852; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2853; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2854; CHECK:       omp_parallel:
2855; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_seq..omp_par, ptr [[A_ADDR]])
2856; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2857; CHECK:       omp.par.outlined.exit:
2858; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2859; CHECK:       omp.par.exit.split:
2860; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2861; CHECK:       entry.split.split:
2862; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2863; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2864; CHECK-NEXT:    ret void
2865; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par
2866; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
2867; CHECK-NEXT:  omp.par.entry:
2868; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2869; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2870; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2871; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2872; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2873; CHECK:       omp.par.outlined.exit.exitStub:
2874; CHECK-NEXT:    ret void
2875; CHECK:       omp.par.region:
2876; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2877; CHECK:       omp.par.merged:
2878; CHECK-NEXT:    call void @.omp_outlined..8(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2879; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2880; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2881; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2882; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2883; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2884; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2885; CHECK:       omp_region.end:
2886; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2887; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2888; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2889; CHECK:       omp.par.merged.split.split:
2890; CHECK-NEXT:    call void @.omp_outlined..9(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
2891; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2892; CHECK:       entry.split:
2893; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2894; CHECK:       omp.par.region.split:
2895; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2896; CHECK:       omp.par.pre_finalize:
2897; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2898; CHECK:       omp_region.body:
2899; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2900; CHECK:       seq.par.merged:
2901; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[A_ADDR]], align 4
2902; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
2903; CHECK-NEXT:    store i32 [[ADD]], ptr [[A_ADDR]], align 4
2904; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2905; CHECK:       omp.par.merged.split:
2906; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2907; CHECK:       omp_region.body.split:
2908; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2909; CHECK-NEXT:    br label [[OMP_REGION_END]]
2910; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8
2911; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2912; CHECK-NEXT:  entry:
2913; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2914; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2915; CHECK-NEXT:    ret void
2916; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9
2917; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
2918; CHECK-NEXT:  entry:
2919; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
2920; CHECK-NEXT:    call void @use(i32 [[TMP0]])
2921; CHECK-NEXT:    ret void
2922; CHECK-LABEL: define {{[^@]+}}@merge_seq_float
2923; CHECK-SAME: (float [[F:%.*]], ptr nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
2924; CHECK-NEXT:  entry:
2925; CHECK-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
2926; CHECK-NEXT:    store float [[F]], ptr [[F_ADDR]], align 4
2927; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2928; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
2929; CHECK:       omp_parallel:
2930; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_float..omp_par, ptr [[F_ADDR]], ptr [[P]])
2931; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
2932; CHECK:       omp.par.outlined.exit:
2933; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
2934; CHECK:       omp.par.exit.split:
2935; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
2936; CHECK:       entry.split.split:
2937; CHECK-NEXT:    ret void
2938; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
2939; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[F_ADDR:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
2940; CHECK-NEXT:  omp.par.entry:
2941; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2942; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
2943; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
2944; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
2945; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
2946; CHECK:       omp.par.outlined.exit.exitStub:
2947; CHECK-NEXT:    ret void
2948; CHECK:       omp.par.region:
2949; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
2950; CHECK:       omp.par.merged:
2951; CHECK-NEXT:    call void @.omp_outlined..10(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
2952; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2953; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2954; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2955; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2956; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
2957; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
2958; CHECK:       omp_region.end:
2959; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
2960; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
2961; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
2962; CHECK:       omp.par.merged.split.split:
2963; CHECK-NEXT:    call void @.omp_outlined..11(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
2964; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
2965; CHECK:       entry.split:
2966; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
2967; CHECK:       omp.par.region.split:
2968; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2969; CHECK:       omp.par.pre_finalize:
2970; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2971; CHECK:       omp_region.body:
2972; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
2973; CHECK:       seq.par.merged:
2974; CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F_ADDR]], align 4
2975; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000
2976; CHECK-NEXT:    store float [[ADD]], ptr [[P]], align 4
2977; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
2978; CHECK:       omp.par.merged.split:
2979; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
2980; CHECK:       omp_region.body.split:
2981; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
2982; CHECK-NEXT:    br label [[OMP_REGION_END]]
2983; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10
2984; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
2985; CHECK-NEXT:  entry:
2986; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F]], align 4
2987; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
2988; CHECK-NEXT:    call void @use(i32 [[CONV]])
2989; CHECK-NEXT:    ret void
2990; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11
2991; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
2992; CHECK-NEXT:  entry:
2993; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F]], align 4
2994; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
2995; CHECK-NEXT:    call void @use(i32 [[CONV]])
2996; CHECK-NEXT:    ret void
2997; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate
2998; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
2999; CHECK-NEXT:  entry:
3000; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
3001; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3002; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3003; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3004; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3005; CHECK:       omp_parallel:
3006; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_firstprivate..omp_par, ptr [[A_ADDR]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]])
3007; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3008; CHECK:       omp.par.outlined.exit:
3009; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3010; CHECK:       omp.par.exit.split:
3011; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3012; CHECK:       entry.split.split:
3013; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
3014; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3015; CHECK-NEXT:    ret void
3016; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
3017; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
3018; CHECK-NEXT:  omp.par.entry:
3019; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3020; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3021; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3022; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3023; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3024; CHECK:       omp.par.outlined.exit.exitStub:
3025; CHECK-NEXT:    ret void
3026; CHECK:       omp.par.region:
3027; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3028; CHECK:       omp.par.merged:
3029; CHECK-NEXT:    call void @.omp_outlined..12(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3030; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3031; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3032; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3033; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3034; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3035; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3036; CHECK:       omp_region.end:
3037; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3038; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3039; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3040; CHECK:       omp.par.merged.split.split:
3041; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
3042; CHECK-NEXT:    call void @.omp_outlined..13(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
3043; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3044; CHECK:       entry.split:
3045; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3046; CHECK:       omp.par.region.split:
3047; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3048; CHECK:       omp.par.pre_finalize:
3049; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3050; CHECK:       omp_region.body:
3051; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3052; CHECK:       seq.par.merged:
3053; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[A_ADDR]], align 4
3054; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
3055; CHECK-NEXT:    store i32 [[ADD]], ptr [[A_ADDR]], align 4
3056; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
3057; CHECK-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
3058; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3059; CHECK:       omp.par.merged.split:
3060; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3061; CHECK:       omp_region.body.split:
3062; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3063; CHECK-NEXT:    br label [[OMP_REGION_END]]
3064; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12
3065; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3066; CHECK-NEXT:  entry:
3067; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3068; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3069; CHECK-NEXT:    ret void
3070; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13
3071; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
3072; CHECK-NEXT:  entry:
3073; CHECK-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
3074; CHECK-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
3075; CHECK-NEXT:    ret void
3076; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt
3077; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3078; CHECK-NEXT:  entry:
3079; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3080; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3081; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3082; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3083; CHECK:       omp_parallel:
3084; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_seq_sink_lt..omp_par, ptr [[A_ADDR]])
3085; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3086; CHECK:       omp.par.outlined.exit:
3087; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3088; CHECK:       omp.par.exit.split:
3089; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3090; CHECK:       entry.split.split:
3091; CHECK-NEXT:    ret void
3092; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
3093; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
3094; CHECK-NEXT:  omp.par.entry:
3095; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
3096; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3097; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3098; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3099; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3100; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3101; CHECK:       omp.par.outlined.exit.exitStub:
3102; CHECK-NEXT:    ret void
3103; CHECK:       omp.par.region:
3104; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3105; CHECK:       omp.par.merged:
3106; CHECK-NEXT:    call void @.omp_outlined..14(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3107; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3108; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3109; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3110; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3111; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3112; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3113; CHECK:       omp_region.end:
3114; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3115; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3116; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3117; CHECK:       omp.par.merged.split.split:
3118; CHECK-NEXT:    call void @.omp_outlined..15(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3119; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3120; CHECK:       entry.split:
3121; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3122; CHECK:       omp.par.region.split:
3123; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3124; CHECK:       omp.par.pre_finalize:
3125; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3126; CHECK:       omp_region.body:
3127; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3128; CHECK:       seq.par.merged:
3129; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 noundef 4, ptr noundef nonnull [[B]])
3130; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[B]] to i64
3131; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
3132; CHECK-NEXT:    store i32 [[TMP5]], ptr [[B]], align 4
3133; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
3134; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3135; CHECK:       omp.par.merged.split:
3136; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3137; CHECK:       omp_region.body.split:
3138; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3139; CHECK-NEXT:    br label [[OMP_REGION_END]]
3140; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14
3141; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3142; CHECK-NEXT:  entry:
3143; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3144; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3145; CHECK-NEXT:    ret void
3146; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15
3147; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3148; CHECK-NEXT:  entry:
3149; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3150; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3151; CHECK-NEXT:    ret void
3152; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use
3153; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3154; CHECK-NEXT:  entry:
3155; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3156; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
3157; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3158; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3159; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3160; CHECK:       omp_parallel:
3161; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[B]])
3162; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_par_use..omp_par, ptr [[A_ADDR]], ptr [[B]])
3163; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3164; CHECK:       omp.par.outlined.exit:
3165; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3166; CHECK:       omp.par.exit.split:
3167; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3168; CHECK:       entry.split.split:
3169; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
3170; CHECK-NEXT:    ret void
3171; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
3172; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {
3173; CHECK-NEXT:  omp.par.entry:
3174; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3175; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3176; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3177; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3178; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3179; CHECK:       omp.par.outlined.exit.exitStub:
3180; CHECK-NEXT:    ret void
3181; CHECK:       omp.par.region:
3182; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3183; CHECK:       omp.par.merged:
3184; CHECK-NEXT:    call void @.omp_outlined..16(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3185; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3186; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3187; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3188; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3189; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3190; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3191; CHECK:       omp_region.end:
3192; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3193; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3194; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3195; CHECK:       omp.par.merged.split.split:
3196; CHECK-NEXT:    call void @.omp_outlined..17(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B]])
3197; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3198; CHECK:       entry.split:
3199; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3200; CHECK:       omp.par.region.split:
3201; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3202; CHECK:       omp.par.pre_finalize:
3203; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3204; CHECK:       omp_region.body:
3205; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3206; CHECK:       seq.par.merged:
3207; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[A_ADDR]], align 4
3208; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
3209; CHECK-NEXT:    store i32 [[ADD]], ptr [[B]], align 4
3210; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3211; CHECK:       omp.par.merged.split:
3212; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3213; CHECK:       omp_region.body.split:
3214; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3215; CHECK-NEXT:    br label [[OMP_REGION_END]]
3216; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16
3217; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3218; CHECK-NEXT:  entry:
3219; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3220; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3221; CHECK-NEXT:    ret void
3222; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17
3223; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
3224; CHECK-NEXT:  entry:
3225; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3226; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3227; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[B]], align 4
3228; CHECK-NEXT:    call void @use(i32 [[TMP1]])
3229; CHECK-NEXT:    ret void
3230; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions
3231; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
3232; CHECK-NEXT:  entry:
3233; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
3234; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
3235; CHECK-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
3236; CHECK-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
3237; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3238; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3239; CHECK:       omp_parallel:
3240; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_cancellable_regions..omp_par, ptr [[CANCEL1_ADDR]], ptr [[CANCEL2_ADDR]])
3241; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3242; CHECK:       omp.par.outlined.exit:
3243; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3244; CHECK:       omp.par.exit.split:
3245; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3246; CHECK:       entry.split.split:
3247; CHECK-NEXT:    ret void
3248; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
3249; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[CANCEL1_ADDR:%.*]], ptr [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
3250; CHECK-NEXT:  omp.par.entry:
3251; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3252; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3253; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3254; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3255; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3256; CHECK:       omp.par.outlined.exit.exitStub:
3257; CHECK-NEXT:    ret void
3258; CHECK:       omp.par.region:
3259; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3260; CHECK:       omp.par.merged:
3261; CHECK-NEXT:    call void @.omp_outlined..18(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
3262; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3263; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3264; CHECK-NEXT:    call void @.omp_outlined..19(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
3265; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3266; CHECK:       entry.split:
3267; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3268; CHECK:       omp.par.region.split:
3269; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3270; CHECK:       omp.par.pre_finalize:
3271; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3272; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18
3273; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
3274; CHECK-NEXT:  entry:
3275; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
3276; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
3277; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
3278; CHECK:       if.then:
3279; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
3280; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
3281; CHECK-NEXT:    ret void
3282; CHECK:       if.end:
3283; CHECK-NEXT:    ret void
3284; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19
3285; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
3286; CHECK-NEXT:  entry:
3287; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
3288; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
3289; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
3290; CHECK:       if.then:
3291; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
3292; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
3293; CHECK-NEXT:    ret void
3294; CHECK:       if.end:
3295; CHECK-NEXT:    ret void
3296; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
3297; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
3298; CHECK-NEXT:  entry:
3299; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
3300; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
3301; CHECK-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
3302; CHECK-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
3303; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3304; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3305; CHECK:       omp_parallel:
3306; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_cancellable_regions_seq..omp_par, ptr [[CANCEL1_ADDR]], ptr [[CANCEL2_ADDR]])
3307; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3308; CHECK:       omp.par.outlined.exit:
3309; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3310; CHECK:       omp.par.exit.split:
3311; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3312; CHECK:       entry.split.split:
3313; CHECK-NEXT:    ret void
3314; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
3315; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[CANCEL1_ADDR:%.*]], ptr [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
3316; CHECK-NEXT:  omp.par.entry:
3317; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3318; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3319; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3320; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3321; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3322; CHECK:       omp.par.outlined.exit.exitStub:
3323; CHECK-NEXT:    ret void
3324; CHECK:       omp.par.region:
3325; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3326; CHECK:       omp.par.merged:
3327; CHECK-NEXT:    call void @.omp_outlined..20(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
3328; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3329; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3330; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3331; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3332; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3333; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3334; CHECK:       omp_region.end:
3335; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3336; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3337; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3338; CHECK:       omp.par.merged.split.split:
3339; CHECK-NEXT:    call void @.omp_outlined..21(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
3340; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3341; CHECK:       entry.split:
3342; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3343; CHECK:       omp.par.region.split:
3344; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3345; CHECK:       omp.par.pre_finalize:
3346; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3347; CHECK:       omp_region.body:
3348; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3349; CHECK:       seq.par.merged:
3350; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[CANCEL1_ADDR]], align 4
3351; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
3352; CHECK-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
3353; CHECK-NEXT:    store i32 [[LNOT_EXT]], ptr [[CANCEL2_ADDR]], align 4
3354; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3355; CHECK:       omp.par.merged.split:
3356; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3357; CHECK:       omp_region.body.split:
3358; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3359; CHECK-NEXT:    br label [[OMP_REGION_END]]
3360; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20
3361; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
3362; CHECK-NEXT:  entry:
3363; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
3364; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
3365; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
3366; CHECK:       if.then:
3367; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
3368; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
3369; CHECK-NEXT:    ret void
3370; CHECK:       if.end:
3371; CHECK-NEXT:    ret void
3372; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21
3373; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
3374; CHECK-NEXT:  entry:
3375; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
3376; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
3377; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
3378; CHECK:       if.then:
3379; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
3380; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
3381; CHECK-NEXT:    ret void
3382; CHECK:       if.end:
3383; CHECK-NEXT:    ret void
3384; CHECK-LABEL: define {{[^@]+}}@merge_3
3385; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3386; CHECK-NEXT:  entry:
3387; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3388; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3389; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3390; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3391; CHECK:       omp_parallel:
3392; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_3..omp_par, ptr [[A_ADDR]])
3393; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3394; CHECK:       omp.par.outlined.exit:
3395; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3396; CHECK:       omp.par.exit.split:
3397; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3398; CHECK:       entry.split.split:
3399; CHECK-NEXT:    ret void
3400; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par
3401; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
3402; CHECK-NEXT:  omp.par.entry:
3403; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3404; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3405; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3406; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3407; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3408; CHECK:       omp.par.outlined.exit.exitStub:
3409; CHECK-NEXT:    ret void
3410; CHECK:       omp.par.region:
3411; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3412; CHECK:       omp.par.merged:
3413; CHECK-NEXT:    call void @.omp_outlined..22(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3414; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3415; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3416; CHECK-NEXT:    call void @.omp_outlined..23(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3417; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3418; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3419; CHECK-NEXT:    call void @.omp_outlined..24(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3420; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3421; CHECK:       entry.split:
3422; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3423; CHECK:       omp.par.region.split:
3424; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3425; CHECK:       omp.par.pre_finalize:
3426; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3427; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22
3428; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3429; CHECK-NEXT:  entry:
3430; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3431; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3432; CHECK-NEXT:    ret void
3433; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23
3434; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3435; CHECK-NEXT:  entry:
3436; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3437; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3438; CHECK-NEXT:    ret void
3439; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24
3440; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3441; CHECK-NEXT:  entry:
3442; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3443; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3444; CHECK-NEXT:    ret void
3445; CHECK-LABEL: define {{[^@]+}}@merge_3_seq
3446; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
3447; CHECK-NEXT:  entry:
3448; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
3449; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
3450; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3451; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3452; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3453; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3454; CHECK:       omp_parallel:
3455; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 3, ptr @merge_3_seq..omp_par, ptr [[A_ADDR]], ptr [[ADD_SEQ_OUTPUT_ALLOC]], ptr [[ADD1_SEQ_OUTPUT_ALLOC]])
3456; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3457; CHECK:       omp.par.outlined.exit:
3458; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3459; CHECK:       omp.par.exit.split:
3460; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3461; CHECK:       entry.split.split:
3462; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
3463; CHECK-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
3464; CHECK-NEXT:    ret void
3465; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
3466; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[ADD_SEQ_OUTPUT_ALLOC:%.*]], ptr [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
3467; CHECK-NEXT:  omp.par.entry:
3468; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3469; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3470; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3471; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3472; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3473; CHECK:       omp.par.outlined.exit.exitStub:
3474; CHECK-NEXT:    ret void
3475; CHECK:       omp.par.region:
3476; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3477; CHECK:       omp.par.merged:
3478; CHECK-NEXT:    call void @.omp_outlined..25(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3479; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3480; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3481; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3482; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3483; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3484; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3485; CHECK:       omp_region.end:
3486; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3487; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3488; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3489; CHECK:       omp.par.merged.split.split:
3490; CHECK-NEXT:    call void @.omp_outlined..26(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3491; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3492; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
3493; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3494; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
3495; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
3496; CHECK-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
3497; CHECK:       omp_region.end4:
3498; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3499; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
3500; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
3501; CHECK:       omp.par.merged.split.split.split.split:
3502; CHECK-NEXT:    call void @.omp_outlined..27(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3503; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3504; CHECK:       entry.split:
3505; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3506; CHECK:       omp.par.region.split:
3507; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3508; CHECK:       omp.par.pre_finalize:
3509; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3510; CHECK:       omp_region.body5:
3511; CHECK-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
3512; CHECK:       seq.par.merged2:
3513; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[A_ADDR]], align 4
3514; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[ADD_SEQ_OUTPUT_ALLOC]], align 4
3515; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]]
3516; CHECK-NEXT:    store i32 [[ADD1]], ptr [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
3517; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
3518; CHECK:       omp.par.merged.split.split.split:
3519; CHECK-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
3520; CHECK:       omp_region.body5.split:
3521; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
3522; CHECK-NEXT:    br label [[OMP_REGION_END4]]
3523; CHECK:       omp_region.body:
3524; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3525; CHECK:       seq.par.merged:
3526; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[A_ADDR]], align 4
3527; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], 1
3528; CHECK-NEXT:    store i32 [[ADD]], ptr [[ADD_SEQ_OUTPUT_ALLOC]], align 4
3529; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3530; CHECK:       omp.par.merged.split:
3531; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3532; CHECK:       omp_region.body.split:
3533; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3534; CHECK-NEXT:    br label [[OMP_REGION_END]]
3535; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25
3536; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3537; CHECK-NEXT:  entry:
3538; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3539; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3540; CHECK-NEXT:    ret void
3541; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26
3542; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3543; CHECK-NEXT:  entry:
3544; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3545; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3546; CHECK-NEXT:    ret void
3547; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27
3548; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3549; CHECK-NEXT:  entry:
3550; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3551; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3552; CHECK-NEXT:    ret void
3553; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call
3554; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3555; CHECK-NEXT:  entry:
3556; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3557; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3558; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..28, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3559; CHECK-NEXT:    call void (...) @foo()
3560; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..29, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3561; CHECK-NEXT:    call void (...) @foo()
3562; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..30, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3563; CHECK-NEXT:    ret void
3564; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28
3565; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3566; CHECK-NEXT:  entry:
3567; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3568; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3569; CHECK-NEXT:    ret void
3570; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29
3571; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3572; CHECK-NEXT:  entry:
3573; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3574; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3575; CHECK-NEXT:    ret void
3576; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30
3577; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3578; CHECK-NEXT:  entry:
3579; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3580; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3581; CHECK-NEXT:    ret void
3582; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
3583; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3584; CHECK-NEXT:  entry:
3585; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3586; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
3587; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3588; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..31, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3589; CHECK-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
3590; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..32, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3591; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..33, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3592; CHECK-NEXT:    ret void
3593; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31
3594; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3595; CHECK-NEXT:  entry:
3596; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3597; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3598; CHECK-NEXT:    ret void
3599; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32
3600; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3601; CHECK-NEXT:  entry:
3602; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3603; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3604; CHECK-NEXT:    ret void
3605; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33
3606; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3607; CHECK-NEXT:  entry:
3608; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3609; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3610; CHECK-NEXT:    ret void
3611; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads
3612; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3613; CHECK-NEXT:  entry:
3614; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3615; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
3616; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3617; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..34, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3618; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A_ADDR]], align 4
3619; CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]])
3620; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..35, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3621; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..36, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3622; CHECK-NEXT:    ret void
3623; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34
3624; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3625; CHECK-NEXT:  entry:
3626; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3627; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3628; CHECK-NEXT:    ret void
3629; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35
3630; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3631; CHECK-NEXT:  entry:
3632; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3633; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3634; CHECK-NEXT:    ret void
3635; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36
3636; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3637; CHECK-NEXT:  entry:
3638; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3639; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3640; CHECK-NEXT:    ret void
3641; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1
3642; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3643; CHECK-NEXT:  entry:
3644; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3645; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3646; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3647; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3648; CHECK:       omp_parallel:
3649; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_2_unmergable_1..omp_par, ptr [[A_ADDR]])
3650; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3651; CHECK:       omp.par.outlined.exit:
3652; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3653; CHECK:       omp.par.exit.split:
3654; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3655; CHECK:       entry.split.split:
3656; CHECK-NEXT:    call void (...) @foo()
3657; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..39, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3658; CHECK-NEXT:    ret void
3659; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
3660; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
3661; CHECK-NEXT:  omp.par.entry:
3662; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3663; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3664; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3665; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3666; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3667; CHECK:       omp.par.outlined.exit.exitStub:
3668; CHECK-NEXT:    ret void
3669; CHECK:       omp.par.region:
3670; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3671; CHECK:       omp.par.merged:
3672; CHECK-NEXT:    call void @.omp_outlined..37(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3673; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3674; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3675; CHECK-NEXT:    call void @.omp_outlined..38(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3676; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3677; CHECK:       entry.split:
3678; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3679; CHECK:       omp.par.region.split:
3680; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3681; CHECK:       omp.par.pre_finalize:
3682; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3683; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37
3684; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3685; CHECK-NEXT:  entry:
3686; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3687; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3688; CHECK-NEXT:    ret void
3689; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38
3690; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3691; CHECK-NEXT:  entry:
3692; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3693; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3694; CHECK-NEXT:    ret void
3695; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39
3696; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3697; CHECK-NEXT:  entry:
3698; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3699; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3700; CHECK-NEXT:    ret void
3701; CHECK-LABEL: define {{[^@]+}}@merge
3702; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3703; CHECK-NEXT:  entry:
3704; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3705; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3706; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3707; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3708; CHECK:       omp_parallel:
3709; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge..omp_par, ptr [[A_ADDR]])
3710; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3711; CHECK:       omp.par.outlined.exit:
3712; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3713; CHECK:       omp.par.exit.split:
3714; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3715; CHECK:       entry.split.split:
3716; CHECK-NEXT:    ret void
3717; CHECK-LABEL: define {{[^@]+}}@merge..omp_par
3718; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
3719; CHECK-NEXT:  omp.par.entry:
3720; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3721; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3722; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3723; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3724; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3725; CHECK:       omp.par.outlined.exit.exitStub:
3726; CHECK-NEXT:    ret void
3727; CHECK:       omp.par.region:
3728; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3729; CHECK:       omp.par.merged:
3730; CHECK-NEXT:    call void @.omp_outlined.(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3731; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3732; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3733; CHECK-NEXT:    call void @.omp_outlined..1(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3734; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3735; CHECK:       entry.split:
3736; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3737; CHECK:       omp.par.region.split:
3738; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3739; CHECK:       omp.par.pre_finalize:
3740; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3741; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
3742; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3743; CHECK-NEXT:  entry:
3744; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3745; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3746; CHECK-NEXT:    ret void
3747; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
3748; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3749; CHECK-NEXT:  entry:
3750; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3751; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3752; CHECK-NEXT:    ret void
3753; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind
3754; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3755; CHECK-NEXT:  entry:
3756; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3757; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
3758; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3759; CHECK-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
3760; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..2, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3761; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..3, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3762; CHECK-NEXT:    ret void
3763; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
3764; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3765; CHECK-NEXT:  entry:
3766; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3767; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3768; CHECK-NEXT:    ret void
3769; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3
3770; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3771; CHECK-NEXT:  entry:
3772; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3773; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3774; CHECK-NEXT:    ret void
3775; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads
3776; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3777; CHECK-NEXT:  entry:
3778; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3779; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
3780; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3781; CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
3782; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..4, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3783; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..5, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3784; CHECK-NEXT:    ret void
3785; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4
3786; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3787; CHECK-NEXT:  entry:
3788; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3789; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3790; CHECK-NEXT:    ret void
3791; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5
3792; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3793; CHECK-NEXT:  entry:
3794; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3795; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3796; CHECK-NEXT:    ret void
3797; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call
3798; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3799; CHECK-NEXT:  entry:
3800; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3801; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3802; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..6, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3803; CHECK-NEXT:    call void (...) @foo()
3804; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..7, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3805; CHECK-NEXT:    ret void
3806; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6
3807; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3808; CHECK-NEXT:  entry:
3809; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3810; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3811; CHECK-NEXT:    ret void
3812; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7
3813; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3814; CHECK-NEXT:  entry:
3815; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3816; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3817; CHECK-NEXT:    ret void
3818; CHECK-LABEL: define {{[^@]+}}@merge_seq
3819; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3820; CHECK-NEXT:  entry:
3821; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3822; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3823; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3824; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3825; CHECK:       omp_parallel:
3826; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_seq..omp_par, ptr [[A_ADDR]])
3827; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3828; CHECK:       omp.par.outlined.exit:
3829; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3830; CHECK:       omp.par.exit.split:
3831; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3832; CHECK:       entry.split.split:
3833; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
3834; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3835; CHECK-NEXT:    ret void
3836; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par
3837; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
3838; CHECK-NEXT:  omp.par.entry:
3839; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3840; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3841; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3842; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3843; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3844; CHECK:       omp.par.outlined.exit.exitStub:
3845; CHECK-NEXT:    ret void
3846; CHECK:       omp.par.region:
3847; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3848; CHECK:       omp.par.merged:
3849; CHECK-NEXT:    call void @.omp_outlined..8(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3850; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3851; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3852; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3853; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3854; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3855; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3856; CHECK:       omp_region.end:
3857; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3858; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3859; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3860; CHECK:       omp.par.merged.split.split:
3861; CHECK-NEXT:    call void @.omp_outlined..9(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
3862; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3863; CHECK:       entry.split:
3864; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3865; CHECK:       omp.par.region.split:
3866; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3867; CHECK:       omp.par.pre_finalize:
3868; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3869; CHECK:       omp_region.body:
3870; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3871; CHECK:       seq.par.merged:
3872; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[A_ADDR]], align 4
3873; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
3874; CHECK-NEXT:    store i32 [[ADD]], ptr [[A_ADDR]], align 4
3875; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3876; CHECK:       omp.par.merged.split:
3877; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3878; CHECK:       omp_region.body.split:
3879; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3880; CHECK-NEXT:    br label [[OMP_REGION_END]]
3881; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8
3882; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3883; CHECK-NEXT:  entry:
3884; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3885; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3886; CHECK-NEXT:    ret void
3887; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9
3888; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
3889; CHECK-NEXT:  entry:
3890; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
3891; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3892; CHECK-NEXT:    ret void
3893; CHECK-LABEL: define {{[^@]+}}@merge_seq_float
3894; CHECK-SAME: (float [[F:%.*]], ptr nocapture nofree writeonly [[P:%.*]]) local_unnamed_addr {
3895; CHECK-NEXT:  entry:
3896; CHECK-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
3897; CHECK-NEXT:    store float [[F]], ptr [[F_ADDR]], align 4
3898; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3899; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3900; CHECK:       omp_parallel:
3901; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_float..omp_par, ptr [[F_ADDR]], ptr [[P]])
3902; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3903; CHECK:       omp.par.outlined.exit:
3904; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3905; CHECK:       omp.par.exit.split:
3906; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3907; CHECK:       entry.split.split:
3908; CHECK-NEXT:    ret void
3909; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
3910; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[F_ADDR:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
3911; CHECK-NEXT:  omp.par.entry:
3912; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3913; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3914; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3915; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3916; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3917; CHECK:       omp.par.outlined.exit.exitStub:
3918; CHECK-NEXT:    ret void
3919; CHECK:       omp.par.region:
3920; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3921; CHECK:       omp.par.merged:
3922; CHECK-NEXT:    call void @.omp_outlined..10(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
3923; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3924; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
3925; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3926; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3927; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
3928; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
3929; CHECK:       omp_region.end:
3930; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3931; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
3932; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
3933; CHECK:       omp.par.merged.split.split:
3934; CHECK-NEXT:    call void @.omp_outlined..11(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
3935; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
3936; CHECK:       entry.split:
3937; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
3938; CHECK:       omp.par.region.split:
3939; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
3940; CHECK:       omp.par.pre_finalize:
3941; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
3942; CHECK:       omp_region.body:
3943; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
3944; CHECK:       seq.par.merged:
3945; CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F_ADDR]], align 4
3946; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000
3947; CHECK-NEXT:    store float [[ADD]], ptr [[P]], align 4
3948; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
3949; CHECK:       omp.par.merged.split:
3950; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
3951; CHECK:       omp_region.body.split:
3952; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
3953; CHECK-NEXT:    br label [[OMP_REGION_END]]
3954; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10
3955; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
3956; CHECK-NEXT:  entry:
3957; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F]], align 4
3958; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
3959; CHECK-NEXT:    call void @use(i32 [[CONV]])
3960; CHECK-NEXT:    ret void
3961; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11
3962; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
3963; CHECK-NEXT:  entry:
3964; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F]], align 4
3965; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
3966; CHECK-NEXT:    call void @use(i32 [[CONV]])
3967; CHECK-NEXT:    ret void
3968; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate
3969; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
3970; CHECK-NEXT:  entry:
3971; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
3972; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
3973; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
3974; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
3975; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
3976; CHECK:       omp_parallel:
3977; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_firstprivate..omp_par, ptr [[A_ADDR]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]])
3978; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3979; CHECK:       omp.par.outlined.exit:
3980; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3981; CHECK:       omp.par.exit.split:
3982; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
3983; CHECK:       entry.split.split:
3984; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
3985; CHECK-NEXT:    call void @use(i32 [[TMP0]])
3986; CHECK-NEXT:    ret void
3987; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
3988; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
3989; CHECK-NEXT:  omp.par.entry:
3990; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
3991; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
3992; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
3993; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
3994; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
3995; CHECK:       omp.par.outlined.exit.exitStub:
3996; CHECK-NEXT:    ret void
3997; CHECK:       omp.par.region:
3998; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
3999; CHECK:       omp.par.merged:
4000; CHECK-NEXT:    call void @.omp_outlined..12(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4001; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4002; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4003; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4004; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4005; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4006; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4007; CHECK:       omp_region.end:
4008; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4009; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4010; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4011; CHECK:       omp.par.merged.split.split:
4012; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
4013; CHECK-NEXT:    call void @.omp_outlined..13(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
4014; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4015; CHECK:       entry.split:
4016; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4017; CHECK:       omp.par.region.split:
4018; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4019; CHECK:       omp.par.pre_finalize:
4020; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4021; CHECK:       omp_region.body:
4022; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4023; CHECK:       seq.par.merged:
4024; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[A_ADDR]], align 4
4025; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
4026; CHECK-NEXT:    store i32 [[ADD]], ptr [[A_ADDR]], align 4
4027; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
4028; CHECK-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
4029; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4030; CHECK:       omp.par.merged.split:
4031; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4032; CHECK:       omp_region.body.split:
4033; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4034; CHECK-NEXT:    br label [[OMP_REGION_END]]
4035; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12
4036; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4037; CHECK-NEXT:  entry:
4038; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4039; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4040; CHECK-NEXT:    ret void
4041; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13
4042; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
4043; CHECK-NEXT:  entry:
4044; CHECK-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
4045; CHECK-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
4046; CHECK-NEXT:    ret void
4047; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt
4048; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4049; CHECK-NEXT:  entry:
4050; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4051; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4052; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4053; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4054; CHECK:       omp_parallel:
4055; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_seq_sink_lt..omp_par, ptr [[A_ADDR]])
4056; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4057; CHECK:       omp.par.outlined.exit:
4058; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4059; CHECK:       omp.par.exit.split:
4060; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4061; CHECK:       entry.split.split:
4062; CHECK-NEXT:    ret void
4063; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
4064; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
4065; CHECK-NEXT:  omp.par.entry:
4066; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
4067; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4068; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4069; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
4070; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4071; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4072; CHECK:       omp.par.outlined.exit.exitStub:
4073; CHECK-NEXT:    ret void
4074; CHECK:       omp.par.region:
4075; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4076; CHECK:       omp.par.merged:
4077; CHECK-NEXT:    call void @.omp_outlined..14(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4078; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4079; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4080; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4081; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4082; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4083; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4084; CHECK:       omp_region.end:
4085; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4086; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4087; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4088; CHECK:       omp.par.merged.split.split:
4089; CHECK-NEXT:    call void @.omp_outlined..15(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4090; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4091; CHECK:       entry.split:
4092; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4093; CHECK:       omp.par.region.split:
4094; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4095; CHECK:       omp.par.pre_finalize:
4096; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4097; CHECK:       omp_region.body:
4098; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4099; CHECK:       seq.par.merged:
4100; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 noundef 4, ptr noundef nonnull [[B]])
4101; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[B]] to i64
4102; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
4103; CHECK-NEXT:    store i32 [[TMP5]], ptr [[B]], align 4
4104; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
4105; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4106; CHECK:       omp.par.merged.split:
4107; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4108; CHECK:       omp_region.body.split:
4109; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4110; CHECK-NEXT:    br label [[OMP_REGION_END]]
4111; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14
4112; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4113; CHECK-NEXT:  entry:
4114; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4115; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4116; CHECK-NEXT:    ret void
4117; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15
4118; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4119; CHECK-NEXT:  entry:
4120; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4121; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4122; CHECK-NEXT:    ret void
4123; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use
4124; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4125; CHECK-NEXT:  entry:
4126; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4127; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
4128; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4129; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4130; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4131; CHECK:       omp_parallel:
4132; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[B]])
4133; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_seq_par_use..omp_par, ptr [[A_ADDR]], ptr [[B]])
4134; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4135; CHECK:       omp.par.outlined.exit:
4136; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4137; CHECK:       omp.par.exit.split:
4138; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4139; CHECK:       entry.split.split:
4140; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
4141; CHECK-NEXT:    ret void
4142; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
4143; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {
4144; CHECK-NEXT:  omp.par.entry:
4145; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4146; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4147; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
4148; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4149; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4150; CHECK:       omp.par.outlined.exit.exitStub:
4151; CHECK-NEXT:    ret void
4152; CHECK:       omp.par.region:
4153; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4154; CHECK:       omp.par.merged:
4155; CHECK-NEXT:    call void @.omp_outlined..16(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4156; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4157; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4158; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4159; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4160; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4161; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4162; CHECK:       omp_region.end:
4163; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4164; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4165; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4166; CHECK:       omp.par.merged.split.split:
4167; CHECK-NEXT:    call void @.omp_outlined..17(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B]])
4168; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4169; CHECK:       entry.split:
4170; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4171; CHECK:       omp.par.region.split:
4172; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4173; CHECK:       omp.par.pre_finalize:
4174; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4175; CHECK:       omp_region.body:
4176; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4177; CHECK:       seq.par.merged:
4178; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[A_ADDR]], align 4
4179; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
4180; CHECK-NEXT:    store i32 [[ADD]], ptr [[B]], align 4
4181; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4182; CHECK:       omp.par.merged.split:
4183; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4184; CHECK:       omp_region.body.split:
4185; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4186; CHECK-NEXT:    br label [[OMP_REGION_END]]
4187; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16
4188; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4189; CHECK-NEXT:  entry:
4190; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4191; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4192; CHECK-NEXT:    ret void
4193; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17
4194; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
4195; CHECK-NEXT:  entry:
4196; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4197; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4198; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[B]], align 4
4199; CHECK-NEXT:    call void @use(i32 [[TMP1]])
4200; CHECK-NEXT:    ret void
4201; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions
4202; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
4203; CHECK-NEXT:  entry:
4204; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
4205; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
4206; CHECK-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
4207; CHECK-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
4208; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4209; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4210; CHECK:       omp_parallel:
4211; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_cancellable_regions..omp_par, ptr [[CANCEL1_ADDR]], ptr [[CANCEL2_ADDR]])
4212; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4213; CHECK:       omp.par.outlined.exit:
4214; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4215; CHECK:       omp.par.exit.split:
4216; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4217; CHECK:       entry.split.split:
4218; CHECK-NEXT:    ret void
4219; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
4220; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[CANCEL1_ADDR:%.*]], ptr [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
4221; CHECK-NEXT:  omp.par.entry:
4222; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4223; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4224; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
4225; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4226; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4227; CHECK:       omp.par.outlined.exit.exitStub:
4228; CHECK-NEXT:    ret void
4229; CHECK:       omp.par.region:
4230; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4231; CHECK:       omp.par.merged:
4232; CHECK-NEXT:    call void @.omp_outlined..18(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
4233; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4234; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4235; CHECK-NEXT:    call void @.omp_outlined..19(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
4236; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4237; CHECK:       entry.split:
4238; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4239; CHECK:       omp.par.region.split:
4240; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4241; CHECK:       omp.par.pre_finalize:
4242; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4243; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18
4244; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
4245; CHECK-NEXT:  entry:
4246; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
4247; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
4248; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
4249; CHECK:       if.then:
4250; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
4251; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
4252; CHECK-NEXT:    ret void
4253; CHECK:       if.end:
4254; CHECK-NEXT:    ret void
4255; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19
4256; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
4257; CHECK-NEXT:  entry:
4258; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
4259; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
4260; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
4261; CHECK:       if.then:
4262; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
4263; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
4264; CHECK-NEXT:    ret void
4265; CHECK:       if.end:
4266; CHECK-NEXT:    ret void
4267; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
4268; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
4269; CHECK-NEXT:  entry:
4270; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
4271; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
4272; CHECK-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
4273; CHECK-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
4274; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4275; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4276; CHECK:       omp_parallel:
4277; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @merge_cancellable_regions_seq..omp_par, ptr [[CANCEL1_ADDR]], ptr [[CANCEL2_ADDR]])
4278; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4279; CHECK:       omp.par.outlined.exit:
4280; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4281; CHECK:       omp.par.exit.split:
4282; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4283; CHECK:       entry.split.split:
4284; CHECK-NEXT:    ret void
4285; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
4286; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[CANCEL1_ADDR:%.*]], ptr [[CANCEL2_ADDR:%.*]]) #[[ATTR0]] {
4287; CHECK-NEXT:  omp.par.entry:
4288; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4289; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4290; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
4291; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4292; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4293; CHECK:       omp.par.outlined.exit.exitStub:
4294; CHECK-NEXT:    ret void
4295; CHECK:       omp.par.region:
4296; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4297; CHECK:       omp.par.merged:
4298; CHECK-NEXT:    call void @.omp_outlined..20(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
4299; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4300; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4301; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4302; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4303; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4304; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4305; CHECK:       omp_region.end:
4306; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4307; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4308; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4309; CHECK:       omp.par.merged.split.split:
4310; CHECK-NEXT:    call void @.omp_outlined..21(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
4311; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4312; CHECK:       entry.split:
4313; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4314; CHECK:       omp.par.region.split:
4315; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4316; CHECK:       omp.par.pre_finalize:
4317; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4318; CHECK:       omp_region.body:
4319; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4320; CHECK:       seq.par.merged:
4321; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[CANCEL1_ADDR]], align 4
4322; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
4323; CHECK-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
4324; CHECK-NEXT:    store i32 [[LNOT_EXT]], ptr [[CANCEL2_ADDR]], align 4
4325; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4326; CHECK:       omp.par.merged.split:
4327; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4328; CHECK:       omp_region.body.split:
4329; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4330; CHECK-NEXT:    br label [[OMP_REGION_END]]
4331; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20
4332; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
4333; CHECK-NEXT:  entry:
4334; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
4335; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
4336; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
4337; CHECK:       if.then:
4338; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
4339; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
4340; CHECK-NEXT:    ret void
4341; CHECK:       if.end:
4342; CHECK-NEXT:    ret void
4343; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21
4344; CHECK-SAME: (ptr noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
4345; CHECK-NEXT:  entry:
4346; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
4347; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
4348; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
4349; CHECK:       if.then:
4350; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
4351; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
4352; CHECK-NEXT:    ret void
4353; CHECK:       if.end:
4354; CHECK-NEXT:    ret void
4355; CHECK-LABEL: define {{[^@]+}}@merge_3
4356; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4357; CHECK-NEXT:  entry:
4358; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4359; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4360; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4361; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4362; CHECK:       omp_parallel:
4363; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_3..omp_par, ptr [[A_ADDR]])
4364; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4365; CHECK:       omp.par.outlined.exit:
4366; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4367; CHECK:       omp.par.exit.split:
4368; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4369; CHECK:       entry.split.split:
4370; CHECK-NEXT:    ret void
4371; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par
4372; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
4373; CHECK-NEXT:  omp.par.entry:
4374; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4375; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4376; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
4377; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4378; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4379; CHECK:       omp.par.outlined.exit.exitStub:
4380; CHECK-NEXT:    ret void
4381; CHECK:       omp.par.region:
4382; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4383; CHECK:       omp.par.merged:
4384; CHECK-NEXT:    call void @.omp_outlined..22(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4385; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4386; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4387; CHECK-NEXT:    call void @.omp_outlined..23(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4388; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4389; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4390; CHECK-NEXT:    call void @.omp_outlined..24(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4391; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4392; CHECK:       entry.split:
4393; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4394; CHECK:       omp.par.region.split:
4395; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4396; CHECK:       omp.par.pre_finalize:
4397; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4398; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22
4399; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4400; CHECK-NEXT:  entry:
4401; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4402; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4403; CHECK-NEXT:    ret void
4404; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23
4405; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4406; CHECK-NEXT:  entry:
4407; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4408; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4409; CHECK-NEXT:    ret void
4410; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24
4411; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4412; CHECK-NEXT:  entry:
4413; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4414; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4415; CHECK-NEXT:    ret void
4416; CHECK-LABEL: define {{[^@]+}}@merge_3_seq
4417; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
4418; CHECK-NEXT:  entry:
4419; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
4420; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
4421; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4422; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4423; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4424; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4425; CHECK:       omp_parallel:
4426; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 3, ptr @merge_3_seq..omp_par, ptr [[A_ADDR]], ptr [[ADD_SEQ_OUTPUT_ALLOC]], ptr [[ADD1_SEQ_OUTPUT_ALLOC]])
4427; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4428; CHECK:       omp.par.outlined.exit:
4429; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4430; CHECK:       omp.par.exit.split:
4431; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4432; CHECK:       entry.split.split:
4433; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
4434; CHECK-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
4435; CHECK-NEXT:    ret void
4436; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
4437; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]], ptr [[ADD_SEQ_OUTPUT_ALLOC:%.*]], ptr [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) #[[ATTR0]] {
4438; CHECK-NEXT:  omp.par.entry:
4439; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4440; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4441; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
4442; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4443; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4444; CHECK:       omp.par.outlined.exit.exitStub:
4445; CHECK-NEXT:    ret void
4446; CHECK:       omp.par.region:
4447; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4448; CHECK:       omp.par.merged:
4449; CHECK-NEXT:    call void @.omp_outlined..25(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4450; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4451; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4452; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4453; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4454; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
4455; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4456; CHECK:       omp_region.end:
4457; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4458; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4459; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4460; CHECK:       omp.par.merged.split.split:
4461; CHECK-NEXT:    call void @.omp_outlined..26(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4462; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4463; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
4464; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4465; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
4466; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
4467; CHECK-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
4468; CHECK:       omp_region.end4:
4469; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4470; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
4471; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
4472; CHECK:       omp.par.merged.split.split.split.split:
4473; CHECK-NEXT:    call void @.omp_outlined..27(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4474; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4475; CHECK:       entry.split:
4476; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4477; CHECK:       omp.par.region.split:
4478; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4479; CHECK:       omp.par.pre_finalize:
4480; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4481; CHECK:       omp_region.body5:
4482; CHECK-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
4483; CHECK:       seq.par.merged2:
4484; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[A_ADDR]], align 4
4485; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[ADD_SEQ_OUTPUT_ALLOC]], align 4
4486; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]]
4487; CHECK-NEXT:    store i32 [[ADD1]], ptr [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
4488; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
4489; CHECK:       omp.par.merged.split.split.split:
4490; CHECK-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
4491; CHECK:       omp_region.body5.split:
4492; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
4493; CHECK-NEXT:    br label [[OMP_REGION_END4]]
4494; CHECK:       omp_region.body:
4495; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4496; CHECK:       seq.par.merged:
4497; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[A_ADDR]], align 4
4498; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], 1
4499; CHECK-NEXT:    store i32 [[ADD]], ptr [[ADD_SEQ_OUTPUT_ALLOC]], align 4
4500; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4501; CHECK:       omp.par.merged.split:
4502; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4503; CHECK:       omp_region.body.split:
4504; CHECK-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4505; CHECK-NEXT:    br label [[OMP_REGION_END]]
4506; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25
4507; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4508; CHECK-NEXT:  entry:
4509; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4510; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4511; CHECK-NEXT:    ret void
4512; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26
4513; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4514; CHECK-NEXT:  entry:
4515; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4516; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4517; CHECK-NEXT:    ret void
4518; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27
4519; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4520; CHECK-NEXT:  entry:
4521; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4522; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4523; CHECK-NEXT:    ret void
4524; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call
4525; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4526; CHECK-NEXT:  entry:
4527; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4528; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4529; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..28, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4530; CHECK-NEXT:    call void (...) @foo()
4531; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..29, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4532; CHECK-NEXT:    call void (...) @foo()
4533; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..30, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4534; CHECK-NEXT:    ret void
4535; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28
4536; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4537; CHECK-NEXT:  entry:
4538; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4539; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4540; CHECK-NEXT:    ret void
4541; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29
4542; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4543; CHECK-NEXT:  entry:
4544; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4545; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4546; CHECK-NEXT:    ret void
4547; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30
4548; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4549; CHECK-NEXT:  entry:
4550; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4551; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4552; CHECK-NEXT:    ret void
4553; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
4554; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4555; CHECK-NEXT:  entry:
4556; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4557; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
4558; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4559; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..31, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4560; CHECK-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
4561; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..32, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4562; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..33, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4563; CHECK-NEXT:    ret void
4564; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31
4565; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4566; CHECK-NEXT:  entry:
4567; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4568; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4569; CHECK-NEXT:    ret void
4570; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32
4571; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4572; CHECK-NEXT:  entry:
4573; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4574; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4575; CHECK-NEXT:    ret void
4576; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33
4577; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4578; CHECK-NEXT:  entry:
4579; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4580; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4581; CHECK-NEXT:    ret void
4582; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads
4583; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4584; CHECK-NEXT:  entry:
4585; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4586; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
4587; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4588; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..34, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4589; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A_ADDR]], align 4
4590; CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[TMP1]])
4591; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..35, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4592; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..36, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4593; CHECK-NEXT:    ret void
4594; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34
4595; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4596; CHECK-NEXT:  entry:
4597; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4598; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4599; CHECK-NEXT:    ret void
4600; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35
4601; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4602; CHECK-NEXT:  entry:
4603; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4604; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4605; CHECK-NEXT:    ret void
4606; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36
4607; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4608; CHECK-NEXT:  entry:
4609; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4610; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4611; CHECK-NEXT:    ret void
4612; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1
4613; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4614; CHECK-NEXT:  entry:
4615; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4616; CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4617; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4618; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
4619; CHECK:       omp_parallel:
4620; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @merge_2_unmergable_1..omp_par, ptr [[A_ADDR]])
4621; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4622; CHECK:       omp.par.outlined.exit:
4623; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4624; CHECK:       omp.par.exit.split:
4625; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4626; CHECK:       entry.split.split:
4627; CHECK-NEXT:    call void (...) @foo()
4628; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef @.omp_outlined..39, ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4629; CHECK-NEXT:    ret void
4630; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
4631; CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[A_ADDR:%.*]]) #[[ATTR0]] {
4632; CHECK-NEXT:  omp.par.entry:
4633; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4634; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4635; CHECK-NEXT:    store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4
4636; CHECK-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4637; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4638; CHECK:       omp.par.outlined.exit.exitStub:
4639; CHECK-NEXT:    ret void
4640; CHECK:       omp.par.region:
4641; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4642; CHECK:       omp.par.merged:
4643; CHECK-NEXT:    call void @.omp_outlined..37(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4644; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
4645; CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4646; CHECK-NEXT:    call void @.omp_outlined..38(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
4647; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4648; CHECK:       entry.split:
4649; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4650; CHECK:       omp.par.region.split:
4651; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4652; CHECK:       omp.par.pre_finalize:
4653; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4654; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37
4655; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4656; CHECK-NEXT:  entry:
4657; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4658; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4659; CHECK-NEXT:    ret void
4660; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38
4661; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4662; CHECK-NEXT:  entry:
4663; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4664; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4665; CHECK-NEXT:    ret void
4666; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39
4667; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
4668; CHECK-NEXT:  entry:
4669; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4670; CHECK-NEXT:    call void @use(i32 [[TMP0]])
4671; CHECK-NEXT:    ret void
4672
4673; CHECK2-LABEL: define {{[^@]+}}@merge
4674; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4675; CHECK2-NEXT:  entry:
4676; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr }, align 8
4677; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4678; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4679; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])
4680; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
4681; CHECK2:       omp_parallel:
4682; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[STRUCTARG]], i32 0, i32 0
4683; CHECK2-NEXT:    store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8
4684; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge..omp_par, ptr [[STRUCTARG]])
4685; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4686; CHECK2:       omp.par.outlined.exit:
4687; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4688; CHECK2:       omp.par.exit.split:
4689; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4690; CHECK2:       entry.split.split:
4691; CHECK2-NEXT:    ret void
4692;
4693;
4694; CHECK2-LABEL: define {{[^@]+}}@merge..omp_par
4695; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {
4696; CHECK2-NEXT:  omp.par.entry:
4697; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[TMP0]], i32 0, i32 0
4698; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8
4699; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4700; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4701; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
4702; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4703; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4704; CHECK2:       omp.par.region:
4705; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4706; CHECK2:       omp.par.merged:
4707; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined.(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
4708; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
4709; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4710; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..1(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
4711; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4712; CHECK2:       entry.split:
4713; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4714; CHECK2:       omp.par.region.split:
4715; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4716; CHECK2:       omp.par.pre_finalize:
4717; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4718; CHECK2:       omp.par.outlined.exit.exitStub:
4719; CHECK2-NEXT:    ret void
4720;
4721;
4722; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
4723; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4724; CHECK2-NEXT:  entry:
4725; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4726; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4727; CHECK2-NEXT:    ret void
4728;
4729;
4730; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..1
4731; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4732; CHECK2-NEXT:  entry:
4733; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4734; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4735; CHECK2-NEXT:    ret void
4736;
4737;
4738; CHECK2-LABEL: define {{[^@]+}}@unmergable_proc_bind
4739; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4740; CHECK2-NEXT:  entry:
4741; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4742; CHECK2-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1:[0-9]+]])
4743; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4744; CHECK2-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
4745; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..2, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
4746; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..3, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
4747; CHECK2-NEXT:    ret void
4748;
4749;
4750; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..2
4751; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4752; CHECK2-NEXT:  entry:
4753; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4754; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4755; CHECK2-NEXT:    ret void
4756;
4757;
4758; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..3
4759; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4760; CHECK2-NEXT:  entry:
4761; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4762; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4763; CHECK2-NEXT:    ret void
4764;
4765;
4766; CHECK2-LABEL: define {{[^@]+}}@unmergable_num_threads
4767; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4768; CHECK2-NEXT:  entry:
4769; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4770; CHECK2-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
4771; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4772; CHECK2-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
4773; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..4, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
4774; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..5, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
4775; CHECK2-NEXT:    ret void
4776;
4777;
4778; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..4
4779; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4780; CHECK2-NEXT:  entry:
4781; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4782; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4783; CHECK2-NEXT:    ret void
4784;
4785;
4786; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..5
4787; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4788; CHECK2-NEXT:  entry:
4789; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4790; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4791; CHECK2-NEXT:    ret void
4792;
4793;
4794; CHECK2-LABEL: define {{[^@]+}}@unmergable_seq_call
4795; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4796; CHECK2-NEXT:  entry:
4797; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4798; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4799; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..6, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
4800; CHECK2-NEXT:    call void (...) @foo()
4801; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..7, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
4802; CHECK2-NEXT:    ret void
4803;
4804;
4805; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..6
4806; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4807; CHECK2-NEXT:  entry:
4808; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4809; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4810; CHECK2-NEXT:    ret void
4811;
4812;
4813; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..7
4814; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4815; CHECK2-NEXT:  entry:
4816; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4817; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4818; CHECK2-NEXT:    ret void
4819;
4820;
4821; CHECK2-LABEL: define {{[^@]+}}@merge_seq
4822; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
4823; CHECK2-NEXT:  entry:
4824; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr }, align 8
4825; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
4826; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
4827; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
4828; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
4829; CHECK2:       omp_parallel:
4830; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[STRUCTARG]], i32 0, i32 0
4831; CHECK2-NEXT:    store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8
4832; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_seq..omp_par, ptr [[STRUCTARG]])
4833; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4834; CHECK2:       omp.par.outlined.exit:
4835; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4836; CHECK2:       omp.par.exit.split:
4837; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4838; CHECK2:       entry.split.split:
4839; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
4840; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4841; CHECK2-NEXT:    ret void
4842;
4843;
4844; CHECK2-LABEL: define {{[^@]+}}@merge_seq..omp_par
4845; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
4846; CHECK2-NEXT:  omp.par.entry:
4847; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[TMP0]], i32 0, i32 0
4848; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8
4849; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4850; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4851; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
4852; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4853; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4854; CHECK2:       omp.par.region:
4855; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4856; CHECK2:       omp.par.merged:
4857; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..8(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
4858; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
4859; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4860; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
4861; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4862; CHECK2-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
4863; CHECK2-NEXT:    br i1 [[TMP3]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4864; CHECK2:       omp_region.end:
4865; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
4866; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4867; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4868; CHECK2:       omp.par.merged.split.split:
4869; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..9(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
4870; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4871; CHECK2:       entry.split:
4872; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4873; CHECK2:       omp.par.region.split:
4874; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4875; CHECK2:       omp.par.pre_finalize:
4876; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4877; CHECK2:       omp_region.body:
4878; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4879; CHECK2:       seq.par.merged:
4880; CHECK2-NEXT:    [[TMP4:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4
4881; CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
4882; CHECK2-NEXT:    store i32 [[ADD]], ptr [[LOADGEP_A_ADDR]], align 4
4883; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4884; CHECK2:       omp.par.merged.split:
4885; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4886; CHECK2:       omp_region.body.split:
4887; CHECK2-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4888; CHECK2-NEXT:    br label [[OMP_REGION_END]]
4889; CHECK2:       omp.par.outlined.exit.exitStub:
4890; CHECK2-NEXT:    ret void
4891;
4892;
4893; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..8
4894; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4895; CHECK2-NEXT:  entry:
4896; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4897; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4898; CHECK2-NEXT:    ret void
4899;
4900;
4901; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..9
4902; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
4903; CHECK2-NEXT:  entry:
4904; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
4905; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
4906; CHECK2-NEXT:    ret void
4907;
4908;
4909; CHECK2-LABEL: define {{[^@]+}}@merge_seq_float
4910; CHECK2-SAME: (float [[F:%.*]], ptr nofree writeonly captures(none) [[P:%.*]]) local_unnamed_addr {
4911; CHECK2-NEXT:  entry:
4912; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8
4913; CHECK2-NEXT:    [[F_RELOADED:%.*]] = alloca float, align 4
4914; CHECK2-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
4915; CHECK2-NEXT:    store float [[F]], ptr [[F_ADDR]], align 4
4916; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
4917; CHECK2-NEXT:    store float [[F]], ptr [[F_RELOADED]], align 4
4918; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
4919; CHECK2:       omp_parallel:
4920; CHECK2-NEXT:    [[GEP_F_RELOADED:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0
4921; CHECK2-NEXT:    store ptr [[F_RELOADED]], ptr [[GEP_F_RELOADED]], align 8
4922; CHECK2-NEXT:    [[GEP_F_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1
4923; CHECK2-NEXT:    store ptr [[F_ADDR]], ptr [[GEP_F_ADDR]], align 8
4924; CHECK2-NEXT:    [[GEP_P:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2
4925; CHECK2-NEXT:    store ptr [[P]], ptr [[GEP_P]], align 8
4926; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_seq_float..omp_par, ptr [[STRUCTARG]])
4927; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4928; CHECK2:       omp.par.outlined.exit:
4929; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4930; CHECK2:       omp.par.exit.split:
4931; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
4932; CHECK2:       entry.split.split:
4933; CHECK2-NEXT:    ret void
4934;
4935;
4936; CHECK2-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
4937; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
4938; CHECK2-NEXT:  omp.par.entry:
4939; CHECK2-NEXT:    [[GEP_F_RELOADED:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0
4940; CHECK2-NEXT:    [[LOADGEP_F_RELOADED:%.*]] = load ptr, ptr [[GEP_F_RELOADED]], align 8
4941; CHECK2-NEXT:    [[GEP_F_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
4942; CHECK2-NEXT:    [[LOADGEP_F_ADDR:%.*]] = load ptr, ptr [[GEP_F_ADDR]], align 8
4943; CHECK2-NEXT:    [[GEP_P:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2
4944; CHECK2-NEXT:    [[LOADGEP_P:%.*]] = load ptr, ptr [[GEP_P]], align 8
4945; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4946; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
4947; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
4948; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
4949; CHECK2-NEXT:    [[TMP2:%.*]] = load float, ptr [[LOADGEP_F_RELOADED]], align 4
4950; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
4951; CHECK2:       omp.par.region:
4952; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
4953; CHECK2:       omp.par.merged:
4954; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..10(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_F_ADDR]])
4955; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
4956; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4957; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
4958; CHECK2-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4959; CHECK2-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
4960; CHECK2-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
4961; CHECK2:       omp_region.end:
4962; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
4963; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
4964; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
4965; CHECK2:       omp.par.merged.split.split:
4966; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..11(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_F_ADDR]])
4967; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
4968; CHECK2:       entry.split:
4969; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
4970; CHECK2:       omp.par.region.split:
4971; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4972; CHECK2:       omp.par.pre_finalize:
4973; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4974; CHECK2:       omp_region.body:
4975; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
4976; CHECK2:       seq.par.merged:
4977; CHECK2-NEXT:    [[ADD:%.*]] = fadd float [[TMP2]], 0x40091EB860000000
4978; CHECK2-NEXT:    store float [[ADD]], ptr [[LOADGEP_P]], align 4
4979; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
4980; CHECK2:       omp.par.merged.split:
4981; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
4982; CHECK2:       omp_region.body.split:
4983; CHECK2-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
4984; CHECK2-NEXT:    br label [[OMP_REGION_END]]
4985; CHECK2:       omp.par.outlined.exit.exitStub:
4986; CHECK2-NEXT:    ret void
4987;
4988;
4989; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..10
4990; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[F:%.*]]) {
4991; CHECK2-NEXT:  entry:
4992; CHECK2-NEXT:    [[TMP0:%.*]] = load float, ptr [[F]], align 4
4993; CHECK2-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
4994; CHECK2-NEXT:    call void @use(i32 [[CONV]])
4995; CHECK2-NEXT:    ret void
4996;
4997;
4998; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..11
4999; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[F:%.*]]) {
5000; CHECK2-NEXT:  entry:
5001; CHECK2-NEXT:    [[TMP0:%.*]] = load float, ptr [[F]], align 4
5002; CHECK2-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
5003; CHECK2-NEXT:    call void @use(i32 [[CONV]])
5004; CHECK2-NEXT:    ret void
5005;
5006;
5007; CHECK2-LABEL: define {{[^@]+}}@merge_seq_firstprivate
5008; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5009; CHECK2-NEXT:  entry:
5010; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr, ptr }, align 8
5011; CHECK2-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
5012; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5013; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
5014; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5015; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
5016; CHECK2:       omp_parallel:
5017; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0
5018; CHECK2-NEXT:    store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8
5019; CHECK2-NEXT:    [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1
5020; CHECK2-NEXT:    store ptr [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], ptr [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
5021; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_seq_firstprivate..omp_par, ptr [[STRUCTARG]])
5022; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5023; CHECK2:       omp.par.outlined.exit:
5024; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5025; CHECK2:       omp.par.exit.split:
5026; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5027; CHECK2:       entry.split.split:
5028; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
5029; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5030; CHECK2-NEXT:    ret void
5031;
5032;
5033; CHECK2-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
5034; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
5035; CHECK2-NEXT:  omp.par.entry:
5036; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 0
5037; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8
5038; CHECK2-NEXT:    [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
5039; CHECK2-NEXT:    [[LOADGEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = load ptr, ptr [[GEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
5040; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5041; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
5042; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
5043; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
5044; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5045; CHECK2:       omp.par.region:
5046; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5047; CHECK2:       omp.par.merged:
5048; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..12(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5049; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5050; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5051; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5052; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5053; CHECK2-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
5054; CHECK2-NEXT:    br i1 [[TMP3]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5055; CHECK2:       omp_region.end:
5056; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5057; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5058; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5059; CHECK2:       omp.par.merged.split.split:
5060; CHECK2-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, ptr [[LOADGEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
5061; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..13(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
5062; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5063; CHECK2:       entry.split:
5064; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5065; CHECK2:       omp.par.region.split:
5066; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5067; CHECK2:       omp.par.pre_finalize:
5068; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5069; CHECK2:       omp_region.body:
5070; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5071; CHECK2:       seq.par.merged:
5072; CHECK2-NEXT:    [[TMP4:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4
5073; CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
5074; CHECK2-NEXT:    store i32 [[ADD]], ptr [[LOADGEP_A_ADDR]], align 4
5075; CHECK2-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
5076; CHECK2-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], ptr [[LOADGEP_A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
5077; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5078; CHECK2:       omp.par.merged.split:
5079; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5080; CHECK2:       omp_region.body.split:
5081; CHECK2-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5082; CHECK2-NEXT:    br label [[OMP_REGION_END]]
5083; CHECK2:       omp.par.outlined.exit.exitStub:
5084; CHECK2-NEXT:    ret void
5085;
5086;
5087; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..12
5088; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5089; CHECK2-NEXT:  entry:
5090; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5091; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5092; CHECK2-NEXT:    ret void
5093;
5094;
5095; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..13
5096; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
5097; CHECK2-NEXT:  entry:
5098; CHECK2-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
5099; CHECK2-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
5100; CHECK2-NEXT:    ret void
5101;
5102;
5103; CHECK2-LABEL: define {{[^@]+}}@merge_seq_sink_lt
5104; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5105; CHECK2-NEXT:  entry:
5106; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr }, align 8
5107; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5108; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
5109; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5110; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
5111; CHECK2:       omp_parallel:
5112; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[STRUCTARG]], i32 0, i32 0
5113; CHECK2-NEXT:    store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8
5114; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_seq_sink_lt..omp_par, ptr [[STRUCTARG]])
5115; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5116; CHECK2:       omp.par.outlined.exit:
5117; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5118; CHECK2:       omp.par.exit.split:
5119; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5120; CHECK2:       entry.split.split:
5121; CHECK2-NEXT:    ret void
5122;
5123;
5124; CHECK2-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
5125; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
5126; CHECK2-NEXT:  omp.par.entry:
5127; CHECK2-NEXT:    [[B:%.*]] = alloca i32, align 4
5128; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[TMP0]], i32 0, i32 0
5129; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8
5130; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5131; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
5132; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
5133; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
5134; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5135; CHECK2:       omp.par.region:
5136; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5137; CHECK2:       omp.par.merged:
5138; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..14(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5139; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5140; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5141; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5142; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5143; CHECK2-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0
5144; CHECK2-NEXT:    br i1 [[TMP3]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5145; CHECK2:       omp_region.end:
5146; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5147; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5148; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5149; CHECK2:       omp.par.merged.split.split:
5150; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..15(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5151; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5152; CHECK2:       entry.split:
5153; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5154; CHECK2:       omp.par.region.split:
5155; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5156; CHECK2:       omp.par.pre_finalize:
5157; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5158; CHECK2:       omp_region.body:
5159; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5160; CHECK2:       seq.par.merged:
5161; CHECK2-NEXT:    call void @llvm.lifetime.start.p0(i64 noundef 4, ptr noundef nonnull [[B]])
5162; CHECK2-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[B]] to i64
5163; CHECK2-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
5164; CHECK2-NEXT:    store i32 [[TMP5]], ptr [[B]], align 4
5165; CHECK2-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
5166; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5167; CHECK2:       omp.par.merged.split:
5168; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5169; CHECK2:       omp_region.body.split:
5170; CHECK2-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5171; CHECK2-NEXT:    br label [[OMP_REGION_END]]
5172; CHECK2:       omp.par.outlined.exit.exitStub:
5173; CHECK2-NEXT:    ret void
5174;
5175;
5176; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..14
5177; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5178; CHECK2-NEXT:  entry:
5179; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5180; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5181; CHECK2-NEXT:    ret void
5182;
5183;
5184; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..15
5185; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5186; CHECK2-NEXT:  entry:
5187; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5188; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5189; CHECK2-NEXT:    ret void
5190;
5191;
5192; CHECK2-LABEL: define {{[^@]+}}@merge_seq_par_use
5193; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5194; CHECK2-NEXT:  entry:
5195; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8
5196; CHECK2-NEXT:    [[A_RELOADED:%.*]] = alloca i32, align 4
5197; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5198; CHECK2-NEXT:    [[B:%.*]] = alloca i32, align 4
5199; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
5200; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5201; CHECK2-NEXT:    store i32 [[A]], ptr [[A_RELOADED]], align 4
5202; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
5203; CHECK2:       omp_parallel:
5204; CHECK2-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0
5205; CHECK2-NEXT:    store ptr [[A_RELOADED]], ptr [[GEP_A_RELOADED]], align 8
5206; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1
5207; CHECK2-NEXT:    store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8
5208; CHECK2-NEXT:    [[GEP_B:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2
5209; CHECK2-NEXT:    store ptr [[B]], ptr [[GEP_B]], align 8
5210; CHECK2-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[B]])
5211; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_seq_par_use..omp_par, ptr [[STRUCTARG]])
5212; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5213; CHECK2:       omp.par.outlined.exit:
5214; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5215; CHECK2:       omp.par.exit.split:
5216; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5217; CHECK2:       entry.split.split:
5218; CHECK2-NEXT:    call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noundef nonnull [[B]])
5219; CHECK2-NEXT:    ret void
5220;
5221;
5222; CHECK2-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
5223; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
5224; CHECK2-NEXT:  omp.par.entry:
5225; CHECK2-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0
5226; CHECK2-NEXT:    [[LOADGEP_A_RELOADED:%.*]] = load ptr, ptr [[GEP_A_RELOADED]], align 8
5227; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
5228; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8
5229; CHECK2-NEXT:    [[GEP_B:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2
5230; CHECK2-NEXT:    [[LOADGEP_B:%.*]] = load ptr, ptr [[GEP_B]], align 8
5231; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5232; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
5233; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
5234; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
5235; CHECK2-NEXT:    [[TMP2:%.*]] = load i32, ptr [[LOADGEP_A_RELOADED]], align 4
5236; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5237; CHECK2:       omp.par.region:
5238; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5239; CHECK2:       omp.par.merged:
5240; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..16(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5241; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5242; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5243; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5244; CHECK2-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5245; CHECK2-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
5246; CHECK2-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5247; CHECK2:       omp_region.end:
5248; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5249; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5250; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5251; CHECK2:       omp.par.merged.split.split:
5252; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..17(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_B]])
5253; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5254; CHECK2:       entry.split:
5255; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5256; CHECK2:       omp.par.region.split:
5257; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5258; CHECK2:       omp.par.pre_finalize:
5259; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5260; CHECK2:       omp_region.body:
5261; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5262; CHECK2:       seq.par.merged:
5263; CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
5264; CHECK2-NEXT:    store i32 [[ADD]], ptr [[LOADGEP_B]], align 4
5265; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5266; CHECK2:       omp.par.merged.split:
5267; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5268; CHECK2:       omp_region.body.split:
5269; CHECK2-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5270; CHECK2-NEXT:    br label [[OMP_REGION_END]]
5271; CHECK2:       omp.par.outlined.exit.exitStub:
5272; CHECK2-NEXT:    ret void
5273;
5274;
5275; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..16
5276; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5277; CHECK2-NEXT:  entry:
5278; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5279; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5280; CHECK2-NEXT:    ret void
5281;
5282;
5283; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..17
5284; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[B:%.*]]) {
5285; CHECK2-NEXT:  entry:
5286; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5287; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5288; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[B]], align 4
5289; CHECK2-NEXT:    call void @use(i32 [[TMP1]])
5290; CHECK2-NEXT:    ret void
5291;
5292;
5293; CHECK2-LABEL: define {{[^@]+}}@merge_cancellable_regions
5294; CHECK2-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
5295; CHECK2-NEXT:  entry:
5296; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr, ptr }, align 8
5297; CHECK2-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
5298; CHECK2-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
5299; CHECK2-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
5300; CHECK2-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
5301; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5302; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
5303; CHECK2:       omp_parallel:
5304; CHECK2-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0
5305; CHECK2-NEXT:    store ptr [[CANCEL1_ADDR]], ptr [[GEP_CANCEL1_ADDR]], align 8
5306; CHECK2-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1
5307; CHECK2-NEXT:    store ptr [[CANCEL2_ADDR]], ptr [[GEP_CANCEL2_ADDR]], align 8
5308; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_cancellable_regions..omp_par, ptr [[STRUCTARG]])
5309; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5310; CHECK2:       omp.par.outlined.exit:
5311; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5312; CHECK2:       omp.par.exit.split:
5313; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5314; CHECK2:       entry.split.split:
5315; CHECK2-NEXT:    ret void
5316;
5317;
5318; CHECK2-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
5319; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
5320; CHECK2-NEXT:  omp.par.entry:
5321; CHECK2-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 0
5322; CHECK2-NEXT:    [[LOADGEP_CANCEL1_ADDR:%.*]] = load ptr, ptr [[GEP_CANCEL1_ADDR]], align 8
5323; CHECK2-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
5324; CHECK2-NEXT:    [[LOADGEP_CANCEL2_ADDR:%.*]] = load ptr, ptr [[GEP_CANCEL2_ADDR]], align 8
5325; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5326; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
5327; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
5328; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
5329; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5330; CHECK2:       omp.par.region:
5331; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5332; CHECK2:       omp.par.merged:
5333; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..18(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_CANCEL1_ADDR]])
5334; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5335; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5336; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..19(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_CANCEL2_ADDR]])
5337; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5338; CHECK2:       entry.split:
5339; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5340; CHECK2:       omp.par.region.split:
5341; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5342; CHECK2:       omp.par.pre_finalize:
5343; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5344; CHECK2:       omp.par.outlined.exit.exitStub:
5345; CHECK2-NEXT:    ret void
5346;
5347;
5348; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..18
5349; CHECK2-SAME: (ptr noalias nofree readonly captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[CANCEL1:%.*]]) {
5350; CHECK2-NEXT:  entry:
5351; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
5352; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
5353; CHECK2-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
5354; CHECK2:       if.then:
5355; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
5356; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
5357; CHECK2-NEXT:    ret void
5358; CHECK2:       if.end:
5359; CHECK2-NEXT:    ret void
5360;
5361;
5362; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..19
5363; CHECK2-SAME: (ptr noalias nofree readonly captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[CANCEL2:%.*]]) {
5364; CHECK2-NEXT:  entry:
5365; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
5366; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
5367; CHECK2-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
5368; CHECK2:       if.then:
5369; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
5370; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
5371; CHECK2-NEXT:    ret void
5372; CHECK2:       if.end:
5373; CHECK2-NEXT:    ret void
5374;
5375;
5376; CHECK2-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
5377; CHECK2-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
5378; CHECK2-NEXT:  entry:
5379; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8
5380; CHECK2-NEXT:    [[CANCEL1_RELOADED:%.*]] = alloca i32, align 4
5381; CHECK2-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
5382; CHECK2-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
5383; CHECK2-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_ADDR]], align 4
5384; CHECK2-NEXT:    store i32 [[CANCEL2]], ptr [[CANCEL2_ADDR]], align 4
5385; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5386; CHECK2-NEXT:    store i32 [[CANCEL1]], ptr [[CANCEL1_RELOADED]], align 4
5387; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
5388; CHECK2:       omp_parallel:
5389; CHECK2-NEXT:    [[GEP_CANCEL1_RELOADED:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0
5390; CHECK2-NEXT:    store ptr [[CANCEL1_RELOADED]], ptr [[GEP_CANCEL1_RELOADED]], align 8
5391; CHECK2-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1
5392; CHECK2-NEXT:    store ptr [[CANCEL1_ADDR]], ptr [[GEP_CANCEL1_ADDR]], align 8
5393; CHECK2-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2
5394; CHECK2-NEXT:    store ptr [[CANCEL2_ADDR]], ptr [[GEP_CANCEL2_ADDR]], align 8
5395; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_cancellable_regions_seq..omp_par, ptr [[STRUCTARG]])
5396; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5397; CHECK2:       omp.par.outlined.exit:
5398; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5399; CHECK2:       omp.par.exit.split:
5400; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5401; CHECK2:       entry.split.split:
5402; CHECK2-NEXT:    ret void
5403;
5404;
5405; CHECK2-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
5406; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
5407; CHECK2-NEXT:  omp.par.entry:
5408; CHECK2-NEXT:    [[GEP_CANCEL1_RELOADED:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0
5409; CHECK2-NEXT:    [[LOADGEP_CANCEL1_RELOADED:%.*]] = load ptr, ptr [[GEP_CANCEL1_RELOADED]], align 8
5410; CHECK2-NEXT:    [[GEP_CANCEL1_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
5411; CHECK2-NEXT:    [[LOADGEP_CANCEL1_ADDR:%.*]] = load ptr, ptr [[GEP_CANCEL1_ADDR]], align 8
5412; CHECK2-NEXT:    [[GEP_CANCEL2_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2
5413; CHECK2-NEXT:    [[LOADGEP_CANCEL2_ADDR:%.*]] = load ptr, ptr [[GEP_CANCEL2_ADDR]], align 8
5414; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5415; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
5416; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
5417; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
5418; CHECK2-NEXT:    [[TMP2:%.*]] = load i32, ptr [[LOADGEP_CANCEL1_RELOADED]], align 4
5419; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5420; CHECK2:       omp.par.region:
5421; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5422; CHECK2:       omp.par.merged:
5423; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..20(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_CANCEL1_ADDR]])
5424; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5425; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5426; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5427; CHECK2-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5428; CHECK2-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
5429; CHECK2-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5430; CHECK2:       omp_region.end:
5431; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5432; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5433; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5434; CHECK2:       omp.par.merged.split.split:
5435; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..21(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_CANCEL2_ADDR]])
5436; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5437; CHECK2:       entry.split:
5438; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5439; CHECK2:       omp.par.region.split:
5440; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5441; CHECK2:       omp.par.pre_finalize:
5442; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5443; CHECK2:       omp_region.body:
5444; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5445; CHECK2:       seq.par.merged:
5446; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP2]], 0
5447; CHECK2-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
5448; CHECK2-NEXT:    store i32 [[LNOT_EXT]], ptr [[LOADGEP_CANCEL2_ADDR]], align 4
5449; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5450; CHECK2:       omp.par.merged.split:
5451; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5452; CHECK2:       omp_region.body.split:
5453; CHECK2-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5454; CHECK2-NEXT:    br label [[OMP_REGION_END]]
5455; CHECK2:       omp.par.outlined.exit.exitStub:
5456; CHECK2-NEXT:    ret void
5457;
5458;
5459; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..20
5460; CHECK2-SAME: (ptr noalias nofree readonly captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[CANCEL1:%.*]]) {
5461; CHECK2-NEXT:  entry:
5462; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL1]], align 4
5463; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
5464; CHECK2-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
5465; CHECK2:       if.then:
5466; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
5467; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
5468; CHECK2-NEXT:    ret void
5469; CHECK2:       if.end:
5470; CHECK2-NEXT:    ret void
5471;
5472;
5473; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..21
5474; CHECK2-SAME: (ptr noalias nofree readonly captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[CANCEL2:%.*]]) {
5475; CHECK2-NEXT:  entry:
5476; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[CANCEL2]], align 4
5477; CHECK2-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
5478; CHECK2-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
5479; CHECK2:       if.then:
5480; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
5481; CHECK2-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(ptr noundef nonnull @[[GLOB1]], i32 [[TMP1]], i32 noundef 1)
5482; CHECK2-NEXT:    ret void
5483; CHECK2:       if.end:
5484; CHECK2-NEXT:    ret void
5485;
5486;
5487; CHECK2-LABEL: define {{[^@]+}}@merge_3
5488; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5489; CHECK2-NEXT:  entry:
5490; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr }, align 8
5491; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5492; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
5493; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5494; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
5495; CHECK2:       omp_parallel:
5496; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[STRUCTARG]], i32 0, i32 0
5497; CHECK2-NEXT:    store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8
5498; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_3..omp_par, ptr [[STRUCTARG]])
5499; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5500; CHECK2:       omp.par.outlined.exit:
5501; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5502; CHECK2:       omp.par.exit.split:
5503; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5504; CHECK2:       entry.split.split:
5505; CHECK2-NEXT:    ret void
5506;
5507;
5508; CHECK2-LABEL: define {{[^@]+}}@merge_3..omp_par
5509; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
5510; CHECK2-NEXT:  omp.par.entry:
5511; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[TMP0]], i32 0, i32 0
5512; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8
5513; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5514; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
5515; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
5516; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
5517; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5518; CHECK2:       omp.par.region:
5519; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5520; CHECK2:       omp.par.merged:
5521; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..22(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5522; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5523; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5524; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..23(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5525; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5526; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5527; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..24(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5528; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5529; CHECK2:       entry.split:
5530; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5531; CHECK2:       omp.par.region.split:
5532; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5533; CHECK2:       omp.par.pre_finalize:
5534; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5535; CHECK2:       omp.par.outlined.exit.exitStub:
5536; CHECK2-NEXT:    ret void
5537;
5538;
5539; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..22
5540; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5541; CHECK2-NEXT:  entry:
5542; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5543; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5544; CHECK2-NEXT:    ret void
5545;
5546;
5547; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..23
5548; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5549; CHECK2-NEXT:  entry:
5550; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5551; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5552; CHECK2-NEXT:    ret void
5553;
5554;
5555; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..24
5556; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5557; CHECK2-NEXT:  entry:
5558; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5559; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5560; CHECK2-NEXT:    ret void
5561;
5562;
5563; CHECK2-LABEL: define {{[^@]+}}@merge_3_seq
5564; CHECK2-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
5565; CHECK2-NEXT:  entry:
5566; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr, ptr }, align 8
5567; CHECK2-NEXT:    [[A_RELOADED:%.*]] = alloca i32, align 4
5568; CHECK2-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
5569; CHECK2-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
5570; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5571; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
5572; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5573; CHECK2-NEXT:    store i32 [[A]], ptr [[A_RELOADED]], align 4
5574; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
5575; CHECK2:       omp_parallel:
5576; CHECK2-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { ptr, ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0
5577; CHECK2-NEXT:    store ptr [[A_RELOADED]], ptr [[GEP_A_RELOADED]], align 8
5578; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1
5579; CHECK2-NEXT:    store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8
5580; CHECK2-NEXT:    [[GEP_ADD_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { ptr, ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2
5581; CHECK2-NEXT:    store ptr [[ADD_SEQ_OUTPUT_ALLOC]], ptr [[GEP_ADD_SEQ_OUTPUT_ALLOC]], align 8
5582; CHECK2-NEXT:    [[GEP_ADD1_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { ptr, ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 3
5583; CHECK2-NEXT:    store ptr [[ADD1_SEQ_OUTPUT_ALLOC]], ptr [[GEP_ADD1_SEQ_OUTPUT_ALLOC]], align 8
5584; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_3_seq..omp_par, ptr [[STRUCTARG]])
5585; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5586; CHECK2:       omp.par.outlined.exit:
5587; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5588; CHECK2:       omp.par.exit.split:
5589; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5590; CHECK2:       entry.split.split:
5591; CHECK2-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
5592; CHECK2-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
5593; CHECK2-NEXT:    ret void
5594;
5595;
5596; CHECK2-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
5597; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
5598; CHECK2-NEXT:  omp.par.entry:
5599; CHECK2-NEXT:    [[GEP_A_RELOADED:%.*]] = getelementptr { ptr, ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0
5600; CHECK2-NEXT:    [[LOADGEP_A_RELOADED:%.*]] = load ptr, ptr [[GEP_A_RELOADED]], align 8
5601; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
5602; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8
5603; CHECK2-NEXT:    [[GEP_ADD_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { ptr, ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2
5604; CHECK2-NEXT:    [[LOADGEP_ADD_SEQ_OUTPUT_ALLOC:%.*]] = load ptr, ptr [[GEP_ADD_SEQ_OUTPUT_ALLOC]], align 8
5605; CHECK2-NEXT:    [[GEP_ADD1_SEQ_OUTPUT_ALLOC:%.*]] = getelementptr { ptr, ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 3
5606; CHECK2-NEXT:    [[LOADGEP_ADD1_SEQ_OUTPUT_ALLOC:%.*]] = load ptr, ptr [[GEP_ADD1_SEQ_OUTPUT_ALLOC]], align 8
5607; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5608; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
5609; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
5610; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
5611; CHECK2-NEXT:    [[TMP2:%.*]] = load i32, ptr [[LOADGEP_A_RELOADED]], align 4
5612; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5613; CHECK2:       omp.par.region:
5614; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5615; CHECK2:       omp.par.merged:
5616; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..25(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5617; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5618; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
5619; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5620; CHECK2-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5621; CHECK2-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
5622; CHECK2-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
5623; CHECK2:       omp_region.end:
5624; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5625; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
5626; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
5627; CHECK2:       omp.par.merged.split.split:
5628; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..26(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5629; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5630; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
5631; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5632; CHECK2-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
5633; CHECK2-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
5634; CHECK2-NEXT:    br i1 [[TMP6]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
5635; CHECK2:       omp_region.end4:
5636; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5637; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
5638; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
5639; CHECK2:       omp.par.merged.split.split.split.split:
5640; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..27(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5641; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5642; CHECK2:       entry.split:
5643; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5644; CHECK2:       omp.par.region.split:
5645; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5646; CHECK2:       omp.par.pre_finalize:
5647; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5648; CHECK2:       omp_region.body5:
5649; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
5650; CHECK2:       seq.par.merged2:
5651; CHECK2-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, ptr [[LOADGEP_ADD_SEQ_OUTPUT_ALLOC]], align 4
5652; CHECK2-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP2]]
5653; CHECK2-NEXT:    store i32 [[ADD1]], ptr [[LOADGEP_ADD1_SEQ_OUTPUT_ALLOC]], align 4
5654; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
5655; CHECK2:       omp.par.merged.split.split.split:
5656; CHECK2-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
5657; CHECK2:       omp_region.body5.split:
5658; CHECK2-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
5659; CHECK2-NEXT:    br label [[OMP_REGION_END4]]
5660; CHECK2:       omp_region.body:
5661; CHECK2-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
5662; CHECK2:       seq.par.merged:
5663; CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
5664; CHECK2-NEXT:    store i32 [[ADD]], ptr [[LOADGEP_ADD_SEQ_OUTPUT_ALLOC]], align 4
5665; CHECK2-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
5666; CHECK2:       omp.par.merged.split:
5667; CHECK2-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
5668; CHECK2:       omp_region.body.split:
5669; CHECK2-NEXT:    call void @__kmpc_end_master(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5670; CHECK2-NEXT:    br label [[OMP_REGION_END]]
5671; CHECK2:       omp.par.outlined.exit.exitStub:
5672; CHECK2-NEXT:    ret void
5673;
5674;
5675; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..25
5676; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5677; CHECK2-NEXT:  entry:
5678; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5679; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5680; CHECK2-NEXT:    ret void
5681;
5682;
5683; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..26
5684; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5685; CHECK2-NEXT:  entry:
5686; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5687; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5688; CHECK2-NEXT:    ret void
5689;
5690;
5691; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..27
5692; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5693; CHECK2-NEXT:  entry:
5694; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5695; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5696; CHECK2-NEXT:    ret void
5697;
5698;
5699; CHECK2-LABEL: define {{[^@]+}}@unmergable_3_seq_call
5700; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5701; CHECK2-NEXT:  entry:
5702; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5703; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
5704; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..28, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5705; CHECK2-NEXT:    call void (...) @foo()
5706; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..29, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5707; CHECK2-NEXT:    call void (...) @foo()
5708; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..30, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5709; CHECK2-NEXT:    ret void
5710;
5711;
5712; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..28
5713; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5714; CHECK2-NEXT:  entry:
5715; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5716; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5717; CHECK2-NEXT:    ret void
5718;
5719;
5720; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..29
5721; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5722; CHECK2-NEXT:  entry:
5723; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5724; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5725; CHECK2-NEXT:    ret void
5726;
5727;
5728; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..30
5729; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5730; CHECK2-NEXT:  entry:
5731; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5732; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5733; CHECK2-NEXT:    ret void
5734;
5735;
5736; CHECK2-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
5737; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5738; CHECK2-NEXT:  entry:
5739; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5740; CHECK2-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
5741; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
5742; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..31, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5743; CHECK2-NEXT:    call void @__kmpc_push_proc_bind(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 noundef 3)
5744; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..32, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5745; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..33, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5746; CHECK2-NEXT:    ret void
5747;
5748;
5749; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..31
5750; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5751; CHECK2-NEXT:  entry:
5752; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5753; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5754; CHECK2-NEXT:    ret void
5755;
5756;
5757; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..32
5758; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5759; CHECK2-NEXT:  entry:
5760; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5761; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5762; CHECK2-NEXT:    ret void
5763;
5764;
5765; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..33
5766; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5767; CHECK2-NEXT:  entry:
5768; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5769; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5770; CHECK2-NEXT:    ret void
5771;
5772;
5773; CHECK2-LABEL: define {{[^@]+}}@unmergable_3_num_threads
5774; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5775; CHECK2-NEXT:  entry:
5776; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5777; CHECK2-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]])
5778; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
5779; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..34, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5780; CHECK2-NEXT:    call void @__kmpc_push_num_threads(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP0]], i32 [[A]])
5781; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..35, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5782; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..36, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5783; CHECK2-NEXT:    ret void
5784;
5785;
5786; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..34
5787; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5788; CHECK2-NEXT:  entry:
5789; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5790; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5791; CHECK2-NEXT:    ret void
5792;
5793;
5794; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..35
5795; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5796; CHECK2-NEXT:  entry:
5797; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5798; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5799; CHECK2-NEXT:    ret void
5800;
5801;
5802; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..36
5803; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5804; CHECK2-NEXT:  entry:
5805; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5806; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5807; CHECK2-NEXT:    ret void
5808;
5809;
5810; CHECK2-LABEL: define {{[^@]+}}@merge_2_unmergable_1
5811; CHECK2-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
5812; CHECK2-NEXT:  entry:
5813; CHECK2-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr }, align 8
5814; CHECK2-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
5815; CHECK2-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
5816; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5817; CHECK2-NEXT:    br label [[OMP_PARALLEL:%.*]]
5818; CHECK2:       omp_parallel:
5819; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[STRUCTARG]], i32 0, i32 0
5820; CHECK2-NEXT:    store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8
5821; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @merge_2_unmergable_1..omp_par, ptr [[STRUCTARG]])
5822; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
5823; CHECK2:       omp.par.outlined.exit:
5824; CHECK2-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
5825; CHECK2:       omp.par.exit.split:
5826; CHECK2-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
5827; CHECK2:       entry.split.split:
5828; CHECK2-NEXT:    call void (...) @foo()
5829; CHECK2-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 noundef 1, ptr noundef nonnull @.omp_outlined..39, ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_ADDR]])
5830; CHECK2-NEXT:    ret void
5831;
5832;
5833; CHECK2-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
5834; CHECK2-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR0]] {
5835; CHECK2-NEXT:  omp.par.entry:
5836; CHECK2-NEXT:    [[GEP_A_ADDR:%.*]] = getelementptr { ptr }, ptr [[TMP0]], i32 0, i32 0
5837; CHECK2-NEXT:    [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8
5838; CHECK2-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
5839; CHECK2-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
5840; CHECK2-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
5841; CHECK2-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
5842; CHECK2-NEXT:    br label [[OMP_PAR_REGION:%.*]]
5843; CHECK2:       omp.par.region:
5844; CHECK2-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
5845; CHECK2:       omp.par.merged:
5846; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..37(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5847; CHECK2-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])
5848; CHECK2-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]])
5849; CHECK2-NEXT:    call void (ptr, ptr, ...) @.omp_outlined..38(ptr [[TID_ADDR]], ptr [[ZERO_ADDR]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOADGEP_A_ADDR]])
5850; CHECK2-NEXT:    br label [[ENTRY_SPLIT:%.*]]
5851; CHECK2:       entry.split:
5852; CHECK2-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
5853; CHECK2:       omp.par.region.split:
5854; CHECK2-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
5855; CHECK2:       omp.par.pre_finalize:
5856; CHECK2-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
5857; CHECK2:       omp.par.outlined.exit.exitStub:
5858; CHECK2-NEXT:    ret void
5859;
5860;
5861; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..37
5862; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5863; CHECK2-NEXT:  entry:
5864; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5865; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5866; CHECK2-NEXT:    ret void
5867;
5868;
5869; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..38
5870; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5871; CHECK2-NEXT:  entry:
5872; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5873; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5874; CHECK2-NEXT:    ret void
5875;
5876;
5877; CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..39
5878; CHECK2-SAME: (ptr noalias nofree readnone captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias nofree readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) {
5879; CHECK2-NEXT:  entry:
5880; CHECK2-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
5881; CHECK2-NEXT:    call void @use(i32 [[TMP0]])
5882; CHECK2-NEXT:    ret void
5883;
5884