1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs
2; RUN: opt -S -attributor -openmp-opt-cgscc -openmp-opt-enable-merging -enable-new-pm=0 < %s | FileCheck %s
3; RUN: opt -S -aa-pipeline= -passes='attributor,cgscc(openmp-opt-cgscc)' -openmp-opt-enable-merging  < %s | FileCheck %s
4; #include <omp.h>
5; void foo();
6; void use(int);
7; void usef(float);
8; void merge(int a) {
9; #pragma omp parallel
10;     {
11;         use(a);
12;     }
13; #pragma omp parallel
14;     {
15;         use(a);
16;     }
17; }
18; void unmergable_proc_bind(int a) {
19; #pragma omp parallel proc_bind(close)
20;     {
21;         use(a);
22;     }
23; #pragma omp parallel
24;     {
25;         use(a);
26;     }
27; }
28; void unmergable_num_threads(int a) {
29; #pragma omp parallel num_threads(a)
30;     {
31;         use(a);
32;     }
33; #pragma omp parallel
34;     {
35;         use(a);
36;     }
37; }
38; void unmergable_seq_call(int a) {
39; #pragma omp parallel
40;     {
41;         use(a);
42;     }
43;     foo();
44; #pragma omp parallel
45;     {
46;         use(a);
47;     }
48; }
49; void merge_seq(int a) {
50; #pragma omp parallel
51;     {
52;         use(a);
53;     }
54;     a = a + 1;
55; #pragma omp parallel
56;     {
57;         use(a);
58;     }
59;     use(a);
60; }
61; void merge_seq_float(float f, float *p) {
62; #pragma omp parallel
63;     {
64;         use(f);
65;     }
66;     *p = f + 3.14f;
67; #pragma omp parallel
68;     {
69;         use(f);
70;     }
71; }
72; void merge_seq_firstprivate(int a) {
73; #pragma omp parallel
74;     {
75;         use(a);
76;     }
77;     a = a + 1;
78; #pragma omp parallel firstprivate(a)
79;     {
80;         use(a);
81;     }
82;     use(a);
83; }
84; void merge_seq_sink_lt(int a) {
85; #pragma omp parallel
86;     {
87;         use(a);
88;     }
89;     {
90;         int b = (int)&b;
91;     }
92; #pragma omp parallel
93;     {
94;         use(a);
95;     }
96; }
97; void merge_seq_par_use(int a) {
98; #pragma omp parallel
99;     {
100;         use(a);
101;     }
102;     int b = a + 1;
103; #pragma omp parallel
104;     {
105;         use(a);
106;         use(b);
107;     }
108; }
109; void merge_cancellable_regions(int cancel1, int cancel2)
110; {
111; #pragma omp parallel
112;     {
113;         if(cancel1) {
114; #pragma omp cancel parallel
115;         }
116;     }
117; #pragma omp parallel
118;     {
119;         if (cancel2) {
120; #pragma omp cancel parallel
121;         }
122;     }
123; }
124; void merge_cancellable_regions_seq(int cancel1, int cancel2)
125; {
126; #pragma omp parallel
127;     {
128;         if(cancel1) {
129; #pragma omp cancel parallel
130;         }
131;     }
132;     cancel2 = !cancel1;
133; #pragma omp parallel
134;     {
135;         if (cancel2) {
136; #pragma omp cancel parallel
137;         }
138;     }
139; }
140; void merge_3(int a) {
141; #pragma omp parallel
142;     {
143;         use(a);
144;     }
145; #pragma omp parallel
146;     {
147;         use(a);
148;     }
149; #pragma omp parallel
150;     {
151;         use(a);
152;     }
153; }
154; void merge_3_seq(int a, int b) {
155; #pragma omp parallel
156;     {
157;         use(a);
158;     }
159;     b = a + 1;
160; #pragma omp parallel
161;     {
162;         use(a);
163;     }
164;     b = b + a;
165; #pragma omp parallel
166;     {
167;         use(a);
168;     }
169;     use(b);
170; }
171; void unmergable_3_seq_call(int a) {
172; #pragma omp parallel
173;     {
174;         use(a);
175;     }
176;     foo();
177; #pragma omp parallel
178;     {
179;         use(a);
180;     }
181;     foo();
182; #pragma omp parallel
183;     {
184;         use(a);
185;     }
186; }
187; void unmergable_3_proc_bind(int a) {
188; #pragma omp parallel
189;     {
190;         use(a);
191;     }
192; #pragma omp parallel proc_bind(close)
193;     {
194;         use(a);
195;     }
196; #pragma omp parallel
197;     {
198;         use(a);
199;     }
200; }
201; void unmergable_3_num_threads(int a) {
202; #pragma omp parallel
203;     {
204;         use(a);
205;     }
206; #pragma omp parallel num_threads(a)
207;     {
208;         use(a);
209;     }
210; #pragma omp parallel
211;     {
212;         use(a);
213;     }
214; }
215; void merge_2_unmergable_1(int a) {
216; #pragma omp parallel
217;     {
218;         use(a);
219;     }
220; #pragma omp parallel
221;     {
222;         use(a);
223;     }
224;     foo();
225; #pragma omp parallel
226;     {
227;         use(a);
228;     }
229; }
230target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
231
232%struct.ident_t = type { i32, i32, i32, i32, i8* }
233
234@0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
235@1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @0, i32 0, i32 0) }, align 8
236
237define dso_local void @merge(i32 %a) local_unnamed_addr  {
238entry:
239  %a.addr = alloca i32, align 4
240  store i32 %a, i32* %a.addr, align 4
241  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
242  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
243  ret void
244}
245
246define internal void @.omp_outlined.(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
247entry:
248  %0 = load i32, i32* %a, align 4
249  call void @use(i32 %0)
250  ret void
251}
252
253declare dso_local void @use(i32) local_unnamed_addr
254
255declare !callback !1 void @__kmpc_fork_call(%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) local_unnamed_addr
256
257define internal void @.omp_outlined..1(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
258entry:
259  %0 = load i32, i32* %a, align 4
260  call void @use(i32 %0)
261  ret void
262}
263
264define dso_local void @unmergable_proc_bind(i32 %a) local_unnamed_addr  {
265entry:
266  %a.addr = alloca i32, align 4
267  %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1)
268  store i32 %a, i32* %a.addr, align 4
269  call void @__kmpc_push_proc_bind(%struct.ident_t* nonnull @1, i32 %0, i32 3)
270  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
271  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
272  ret void
273}
274
275define internal void @.omp_outlined..2(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
276entry:
277  %0 = load i32, i32* %a, align 4
278  call void @use(i32 %0)
279  ret void
280}
281
282declare i32 @__kmpc_global_thread_num(%struct.ident_t*) local_unnamed_addr
283
284declare void @__kmpc_push_proc_bind(%struct.ident_t*, i32, i32) local_unnamed_addr
285
286define internal void @.omp_outlined..3(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
287entry:
288  %0 = load i32, i32* %a, align 4
289  call void @use(i32 %0)
290  ret void
291}
292
293define dso_local void @unmergable_num_threads(i32 %a) local_unnamed_addr  {
294entry:
295  %a.addr = alloca i32, align 4
296  %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1)
297  store i32 %a, i32* %a.addr, align 4
298  call void @__kmpc_push_num_threads(%struct.ident_t* nonnull @1, i32 %0, i32 %a)
299  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
300  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
301  ret void
302}
303
304define internal void @.omp_outlined..4(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
305entry:
306  %0 = load i32, i32* %a, align 4
307  call void @use(i32 %0)
308  ret void
309}
310
311declare void @__kmpc_push_num_threads(%struct.ident_t*, i32, i32) local_unnamed_addr
312
313define internal void @.omp_outlined..5(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
314entry:
315  %0 = load i32, i32* %a, align 4
316  call void @use(i32 %0)
317  ret void
318}
319
320define dso_local void @unmergable_seq_call(i32 %a) local_unnamed_addr  {
321entry:
322  %a.addr = alloca i32, align 4
323  store i32 %a, i32* %a.addr, align 4
324  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
325  call void (...) @foo()
326  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
327  ret void
328}
329
330define internal void @.omp_outlined..6(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
331entry:
332  %0 = load i32, i32* %a, align 4
333  call void @use(i32 %0)
334  ret void
335}
336
337declare dso_local void @foo(...) local_unnamed_addr
338
339define internal void @.omp_outlined..7(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
340entry:
341  %0 = load i32, i32* %a, align 4
342  call void @use(i32 %0)
343  ret void
344}
345
346define dso_local void @merge_seq(i32 %a) local_unnamed_addr  {
347entry:
348  %a.addr = alloca i32, align 4
349  store i32 %a, i32* %a.addr, align 4
350  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..8 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
351  %0 = load i32, i32* %a.addr, align 4
352  %add = add nsw i32 %0, 1
353  store i32 %add, i32* %a.addr, align 4
354  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..9 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
355  %1 = load i32, i32* %a.addr, align 4
356  call void @use(i32 %1)
357  ret void
358}
359
360define internal void @.omp_outlined..8(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
361entry:
362  %0 = load i32, i32* %a, align 4
363  call void @use(i32 %0)
364  ret void
365}
366
367define internal void @.omp_outlined..9(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
368entry:
369  %0 = load i32, i32* %a, align 4
370  call void @use(i32 %0)
371  ret void
372}
373
374define dso_local void @merge_seq_float(float %f, float* nocapture %p) local_unnamed_addr  {
375entry:
376  %f.addr = alloca float, align 4
377  store float %f, float* %f.addr, align 4
378  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), float* nonnull %f.addr)
379  %0 = load float, float* %f.addr, align 4
380  %add = fadd float %0, 0x40091EB860000000
381  store float %add, float* %p, align 4
382  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), float* nonnull %f.addr)
383  ret void
384}
385
386define internal void @.omp_outlined..10(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., float* nocapture nonnull readonly align 4 dereferenceable(4) %f)  {
387entry:
388  %0 = load float, float* %f, align 4
389  %conv = fptosi float %0 to i32
390  call void @use(i32 %conv)
391  ret void
392}
393
394define internal void @.omp_outlined..11(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., float* nocapture nonnull readonly align 4 dereferenceable(4) %f)  {
395entry:
396  %0 = load float, float* %f, align 4
397  %conv = fptosi float %0 to i32
398  call void @use(i32 %conv)
399  ret void
400}
401
402define dso_local void @merge_seq_firstprivate(i32 %a) local_unnamed_addr  {
403entry:
404  %a.addr = alloca i32, align 4
405  store i32 %a, i32* %a.addr, align 4
406  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..12 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
407  %0 = load i32, i32* %a.addr, align 4
408  %add = add nsw i32 %0, 1
409  store i32 %add, i32* %a.addr, align 4
410  %a.casted.sroa.0.0.insert.ext = zext i32 %add to i64
411  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* @.omp_outlined..13 to void (i32*, i32*, ...)*), i64 %a.casted.sroa.0.0.insert.ext)
412  %1 = load i32, i32* %a.addr, align 4
413  call void @use(i32 %1)
414  ret void
415}
416
417define internal void @.omp_outlined..12(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
418entry:
419  %0 = load i32, i32* %a, align 4
420  call void @use(i32 %0)
421  ret void
422}
423
424define internal void @.omp_outlined..13(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i64 %a)  {
425entry:
426  %a.addr.sroa.0.0.extract.trunc = trunc i64 %a to i32
427  call void @use(i32 %a.addr.sroa.0.0.extract.trunc)
428  ret void
429}
430
431define dso_local void @merge_seq_sink_lt(i32 %a) local_unnamed_addr  {
432entry:
433  %a.addr = alloca i32, align 4
434  %b = alloca i32, align 4
435  store i32 %a, i32* %a.addr, align 4
436  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..14 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
437  %0 = bitcast i32* %b to i8*
438  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0)
439  %1 = ptrtoint i32* %b to i64
440  %2 = trunc i64 %1 to i32
441  store i32 %2, i32* %b, align 4
442  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0)
443  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
444  ret void
445}
446
447define internal void @.omp_outlined..14(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
448entry:
449  %0 = load i32, i32* %a, align 4
450  call void @use(i32 %0)
451  ret void
452}
453
454declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture)
455
456declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture)
457
458define internal void @.omp_outlined..15(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
459entry:
460  %0 = load i32, i32* %a, align 4
461  call void @use(i32 %0)
462  ret void
463}
464
465define dso_local void @merge_seq_par_use(i32 %a) local_unnamed_addr  {
466entry:
467  %a.addr = alloca i32, align 4
468  %b = alloca i32, align 4
469  store i32 %a, i32* %a.addr, align 4
470  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..16 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
471  %0 = bitcast i32* %b to i8*
472  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0)
473  %1 = load i32, i32* %a.addr, align 4
474  %add = add nsw i32 %1, 1
475  store i32 %add, i32* %b, align 4
476  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..17 to void (i32*, i32*, ...)*), i32* nonnull %a.addr, i32* nonnull %b)
477  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0)
478  ret void
479}
480
481define internal void @.omp_outlined..16(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
482entry:
483  %0 = load i32, i32* %a, align 4
484  call void @use(i32 %0)
485  ret void
486}
487
488define internal void @.omp_outlined..17(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a, i32* nocapture nonnull readonly align 4 dereferenceable(4) %b)  {
489entry:
490  %0 = load i32, i32* %a, align 4
491  call void @use(i32 %0)
492  %1 = load i32, i32* %b, align 4
493  call void @use(i32 %1)
494  ret void
495}
496
497define dso_local void @merge_cancellable_regions(i32 %cancel1, i32 %cancel2) local_unnamed_addr  {
498entry:
499  %cancel1.addr = alloca i32, align 4
500  %cancel2.addr = alloca i32, align 4
501  store i32 %cancel1, i32* %cancel1.addr, align 4
502  store i32 %cancel2, i32* %cancel2.addr, align 4
503  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..18 to void (i32*, i32*, ...)*), i32* nonnull %cancel1.addr)
504  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i32* nonnull %cancel2.addr)
505  ret void
506}
507
508define internal void @.omp_outlined..18(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel1)  {
509entry:
510  %0 = load i32, i32* %cancel1, align 4
511  %tobool.not = icmp eq i32 %0, 0
512  br i1 %tobool.not, label %if.end, label %if.then
513
514if.then:                                          ; preds = %entry
515  %1 = load i32, i32* %.global_tid., align 4
516  %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1)
517  ret void
518
519if.end:                                           ; preds = %entry
520  ret void
521}
522
523declare i32 @__kmpc_cancel(%struct.ident_t*, i32, i32) local_unnamed_addr
524
525define internal void @.omp_outlined..19(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel2)  {
526entry:
527  %0 = load i32, i32* %cancel2, align 4
528  %tobool.not = icmp eq i32 %0, 0
529  br i1 %tobool.not, label %if.end, label %if.then
530
531if.then:                                          ; preds = %entry
532  %1 = load i32, i32* %.global_tid., align 4
533  %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1)
534  ret void
535
536if.end:                                           ; preds = %entry
537  ret void
538}
539
540define dso_local void @merge_cancellable_regions_seq(i32 %cancel1, i32 %cancel2) local_unnamed_addr  {
541entry:
542  %cancel1.addr = alloca i32, align 4
543  %cancel2.addr = alloca i32, align 4
544  store i32 %cancel1, i32* %cancel1.addr, align 4
545  store i32 %cancel2, i32* %cancel2.addr, align 4
546  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..20 to void (i32*, i32*, ...)*), i32* nonnull %cancel1.addr)
547  %0 = load i32, i32* %cancel1.addr, align 4
548  %tobool.not = icmp eq i32 %0, 0
549  %lnot.ext = zext i1 %tobool.not to i32
550  store i32 %lnot.ext, i32* %cancel2.addr, align 4
551  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..21 to void (i32*, i32*, ...)*), i32* nonnull %cancel2.addr)
552  ret void
553}
554
555define internal void @.omp_outlined..20(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel1)  {
556entry:
557  %0 = load i32, i32* %cancel1, align 4
558  %tobool.not = icmp eq i32 %0, 0
559  br i1 %tobool.not, label %if.end, label %if.then
560
561if.then:                                          ; preds = %entry
562  %1 = load i32, i32* %.global_tid., align 4
563  %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1)
564  ret void
565
566if.end:                                           ; preds = %entry
567  ret void
568}
569
570define internal void @.omp_outlined..21(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel2)  {
571entry:
572  %0 = load i32, i32* %cancel2, align 4
573  %tobool.not = icmp eq i32 %0, 0
574  br i1 %tobool.not, label %if.end, label %if.then
575
576if.then:                                          ; preds = %entry
577  %1 = load i32, i32* %.global_tid., align 4
578  %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1)
579  ret void
580
581if.end:                                           ; preds = %entry
582  ret void
583}
584
585define dso_local void @merge_3(i32 %a) local_unnamed_addr  {
586entry:
587  %a.addr = alloca i32, align 4
588  store i32 %a, i32* %a.addr, align 4
589  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..22 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
590  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
591  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..24 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
592  ret void
593}
594
595define internal void @.omp_outlined..22(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
596entry:
597  %0 = load i32, i32* %a, align 4
598  call void @use(i32 %0)
599  ret void
600}
601
602define internal void @.omp_outlined..23(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
603entry:
604  %0 = load i32, i32* %a, align 4
605  call void @use(i32 %0)
606  ret void
607}
608
609define internal void @.omp_outlined..24(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
610entry:
611  %0 = load i32, i32* %a, align 4
612  call void @use(i32 %0)
613  ret void
614}
615
616define dso_local void @merge_3_seq(i32 %a, i32 %b) local_unnamed_addr  {
617entry:
618  %a.addr = alloca i32, align 4
619  store i32 %a, i32* %a.addr, align 4
620  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..25 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
621  %0 = load i32, i32* %a.addr, align 4
622  %add = add nsw i32 %0, 1
623  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..26 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
624  %1 = load i32, i32* %a.addr, align 4
625  %add1 = add nsw i32 %add, %1
626  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..27 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
627  call void @use(i32 %add1)
628  ret void
629}
630
631define internal void @.omp_outlined..25(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
632entry:
633  %0 = load i32, i32* %a, align 4
634  call void @use(i32 %0)
635  ret void
636}
637
638define internal void @.omp_outlined..26(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
639entry:
640  %0 = load i32, i32* %a, align 4
641  call void @use(i32 %0)
642  ret void
643}
644
645define internal void @.omp_outlined..27(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
646entry:
647  %0 = load i32, i32* %a, align 4
648  call void @use(i32 %0)
649  ret void
650}
651
652define dso_local void @unmergable_3_seq_call(i32 %a) local_unnamed_addr  {
653entry:
654  %a.addr = alloca i32, align 4
655  store i32 %a, i32* %a.addr, align 4
656  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
657  call void (...) @foo()
658  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
659  call void (...) @foo()
660  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
661  ret void
662}
663
664define internal void @.omp_outlined..28(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
665entry:
666  %0 = load i32, i32* %a, align 4
667  call void @use(i32 %0)
668  ret void
669}
670
671define internal void @.omp_outlined..29(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
672entry:
673  %0 = load i32, i32* %a, align 4
674  call void @use(i32 %0)
675  ret void
676}
677
678define internal void @.omp_outlined..30(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
679entry:
680  %0 = load i32, i32* %a, align 4
681  call void @use(i32 %0)
682  ret void
683}
684
685define dso_local void @unmergable_3_proc_bind(i32 %a) local_unnamed_addr  {
686entry:
687  %a.addr = alloca i32, align 4
688  %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1)
689  store i32 %a, i32* %a.addr, align 4
690  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
691  call void @__kmpc_push_proc_bind(%struct.ident_t* nonnull @1, i32 %0, i32 3)
692  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
693  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
694  ret void
695}
696
697define internal void @.omp_outlined..31(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
698entry:
699  %0 = load i32, i32* %a, align 4
700  call void @use(i32 %0)
701  ret void
702}
703
704define internal void @.omp_outlined..32(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
705entry:
706  %0 = load i32, i32* %a, align 4
707  call void @use(i32 %0)
708  ret void
709}
710
711define internal void @.omp_outlined..33(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
712entry:
713  %0 = load i32, i32* %a, align 4
714  call void @use(i32 %0)
715  ret void
716}
717
718define dso_local void @unmergable_3_num_threads(i32 %a) local_unnamed_addr  {
719entry:
720  %a.addr = alloca i32, align 4
721  %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1)
722  store i32 %a, i32* %a.addr, align 4
723  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
724  %1 = load i32, i32* %a.addr, align 4
725  call void @__kmpc_push_num_threads(%struct.ident_t* nonnull @1, i32 %0, i32 %1)
726  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
727  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
728  ret void
729}
730
731define internal void @.omp_outlined..34(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
732entry:
733  %0 = load i32, i32* %a, align 4
734  call void @use(i32 %0)
735  ret void
736}
737
738define internal void @.omp_outlined..35(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
739entry:
740  %0 = load i32, i32* %a, align 4
741  call void @use(i32 %0)
742  ret void
743}
744
745define internal void @.omp_outlined..36(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
746entry:
747  %0 = load i32, i32* %a, align 4
748  call void @use(i32 %0)
749  ret void
750}
751
752define dso_local void @merge_2_unmergable_1(i32 %a) local_unnamed_addr  {
753entry:
754  %a.addr = alloca i32, align 4
755  store i32 %a, i32* %a.addr, align 4
756  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..37 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
757  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..38 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
758  call void (...) @foo()
759  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nonnull %a.addr)
760  ret void
761}
762
763define internal void @.omp_outlined..37(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
764entry:
765  %0 = load i32, i32* %a, align 4
766  call void @use(i32 %0)
767  ret void
768}
769
770define internal void @.omp_outlined..38(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
771entry:
772  %0 = load i32, i32* %a, align 4
773  call void @use(i32 %0)
774  ret void
775}
776
777define internal void @.omp_outlined..39(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a)  {
778entry:
779  %0 = load i32, i32* %a, align 4
780  call void @use(i32 %0)
781  ret void
782}
783
784
785!llvm.module.flags = !{!0}
786
787!0 = !{i32 1, !"wchar_size", i32 4}
788!1 = !{!2}
789!2 = !{i64 2, i64 -1, i64 -1, i1 true}
790; CHECK-LABEL: define {{[^@]+}}@merge
791; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
792; CHECK-NEXT:  entry:
793; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
794; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
795; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1:@.*]])
796; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
797; CHECK:       omp_parallel:
798; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
799; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
800; CHECK:       omp.par.outlined.exit:
801; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
802; CHECK:       omp.par.exit.split:
803; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
804; CHECK:       entry.split.split:
805; CHECK-NEXT:    ret void
806;
807;
808; CHECK-LABEL: define {{[^@]+}}@merge..omp_par
809; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0:#.*]] {
810; CHECK-NEXT:  omp.par.entry:
811; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
812; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
813; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
814; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
815; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
816; CHECK:       omp.par.outlined.exit.exitStub:
817; CHECK-NEXT:    ret void
818; CHECK:       omp.par.region:
819; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
820; CHECK:       omp.par.merged:
821; CHECK-NEXT:    call void @.omp_outlined.(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
822; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
823; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2:@.*]], i32 [[OMP_GLOBAL_THREAD_NUM]])
824; CHECK-NEXT:    call void @.omp_outlined..1(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
825; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
826; CHECK:       entry.split:
827; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
828; CHECK:       omp.par.region.split:
829; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
830; CHECK:       omp.par.pre_finalize:
831; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
832;
833;
834; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
835; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
836; CHECK-NEXT:  entry:
837; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
838; CHECK-NEXT:    call void @use(i32 [[TMP0]])
839; CHECK-NEXT:    ret void
840;
841;
842; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
843; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
844; CHECK-NEXT:  entry:
845; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
846; CHECK-NEXT:    call void @use(i32 [[TMP0]])
847; CHECK-NEXT:    ret void
848;
849;
850; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind
851; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
852; CHECK-NEXT:  entry:
853; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
854; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]])
855; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
856; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 [[TMP0]], i32 noundef 3)
857; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
858; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
859; CHECK-NEXT:    ret void
860;
861;
862; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
863; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
864; CHECK-NEXT:  entry:
865; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
866; CHECK-NEXT:    call void @use(i32 [[TMP0]])
867; CHECK-NEXT:    ret void
868;
869;
870; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3
871; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
872; CHECK-NEXT:  entry:
873; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
874; CHECK-NEXT:    call void @use(i32 [[TMP0]])
875; CHECK-NEXT:    ret void
876;
877;
878; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads
879; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
880; CHECK-NEXT:  entry:
881; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
882; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]])
883; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
884; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 [[TMP0]], i32 [[A]])
885; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
886; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
887; CHECK-NEXT:    ret void
888;
889;
890; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4
891; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
892; CHECK-NEXT:  entry:
893; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
894; CHECK-NEXT:    call void @use(i32 [[TMP0]])
895; CHECK-NEXT:    ret void
896;
897;
898; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5
899; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
900; CHECK-NEXT:  entry:
901; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
902; CHECK-NEXT:    call void @use(i32 [[TMP0]])
903; CHECK-NEXT:    ret void
904;
905;
906; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call
907; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
908; CHECK-NEXT:  entry:
909; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
910; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
911; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
912; CHECK-NEXT:    call void (...) @foo()
913; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
914; CHECK-NEXT:    ret void
915;
916;
917; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6
918; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
919; CHECK-NEXT:  entry:
920; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
921; CHECK-NEXT:    call void @use(i32 [[TMP0]])
922; CHECK-NEXT:    ret void
923;
924;
925; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7
926; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
927; CHECK-NEXT:  entry:
928; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
929; CHECK-NEXT:    call void @use(i32 [[TMP0]])
930; CHECK-NEXT:    ret void
931;
932;
933; CHECK-LABEL: define {{[^@]+}}@merge_seq
934; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
935; CHECK-NEXT:  entry:
936; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
937; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
938; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
939; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
940; CHECK:       omp_parallel:
941; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
942; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
943; CHECK:       omp.par.outlined.exit:
944; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
945; CHECK:       omp.par.exit.split:
946; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
947; CHECK:       entry.split.split:
948; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
949; CHECK-NEXT:    call void @use(i32 [[TMP0]])
950; CHECK-NEXT:    ret void
951;
952;
953; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par
954; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0]] {
955; CHECK-NEXT:  omp.par.entry:
956; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
957; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
958; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
959; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
960; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
961; CHECK:       omp.par.outlined.exit.exitStub:
962; CHECK-NEXT:    ret void
963; CHECK:       omp.par.region:
964; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
965; CHECK:       omp.par.merged:
966; CHECK-NEXT:    call void @.omp_outlined..8(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
967; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
968; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
969; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
970; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
971; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
972; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
973; CHECK:       omp_region.end:
974; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
975; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
976; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
977; CHECK:       omp.par.merged.split.split:
978; CHECK-NEXT:    call void @.omp_outlined..9(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
979; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
980; CHECK:       entry.split:
981; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
982; CHECK:       omp.par.region.split:
983; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
984; CHECK:       omp.par.pre_finalize:
985; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
986; CHECK:       omp_region.body:
987; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
988; CHECK:       seq.par.merged:
989; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
990; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
991; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
992; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
993; CHECK:       omp.par.merged.split:
994; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
995; CHECK:       omp_region.body.split:
996; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
997; CHECK-NEXT:    br label [[OMP_REGION_END]]
998;
999;
1000; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8
1001; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1002; CHECK-NEXT:  entry:
1003; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1004; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1005; CHECK-NEXT:    ret void
1006;
1007;
1008; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9
1009; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1010; CHECK-NEXT:  entry:
1011; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1012; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1013; CHECK-NEXT:    ret void
1014;
1015;
1016; CHECK-LABEL: define {{[^@]+}}@merge_seq_float
1017; CHECK-SAME: (float [[F:%.*]], float* nocapture writeonly [[P:%.*]]) local_unnamed_addr {
1018; CHECK-NEXT:  entry:
1019; CHECK-NEXT:    [[F_ADDR:%.*]] = alloca float, align 4
1020; CHECK-NEXT:    store float [[F]], float* [[F_ADDR]], align 4
1021; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1022; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1023; CHECK:       omp_parallel:
1024; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*, float*)* @merge_seq_float..omp_par to void (i32*, i32*, ...)*), float* [[F_ADDR]], float* [[P]])
1025; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1026; CHECK:       omp.par.outlined.exit:
1027; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1028; CHECK:       omp.par.exit.split:
1029; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1030; CHECK:       entry.split.split:
1031; CHECK-NEXT:    ret void
1032;
1033;
1034; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par
1035; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], float* [[F_ADDR:%.*]], float* [[P:%.*]]) [[ATTR0]] {
1036; CHECK-NEXT:  omp.par.entry:
1037; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1038; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1039; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1040; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1041; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1042; CHECK:       omp.par.outlined.exit.exitStub:
1043; CHECK-NEXT:    ret void
1044; CHECK:       omp.par.region:
1045; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1046; CHECK:       omp.par.merged:
1047; CHECK-NEXT:    call void @.omp_outlined..10(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
1048; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1049; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1050; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1051; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1052; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1053; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1054; CHECK:       omp_region.end:
1055; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1056; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1057; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1058; CHECK:       omp.par.merged.split.split:
1059; CHECK-NEXT:    call void @.omp_outlined..11(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]])
1060; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1061; CHECK:       entry.split:
1062; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1063; CHECK:       omp.par.region.split:
1064; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1065; CHECK:       omp.par.pre_finalize:
1066; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1067; CHECK:       omp_region.body:
1068; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1069; CHECK:       seq.par.merged:
1070; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[F_ADDR]], align 4
1071; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000
1072; CHECK-NEXT:    store float [[ADD]], float* [[P]], align 4
1073; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1074; CHECK:       omp.par.merged.split:
1075; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1076; CHECK:       omp_region.body.split:
1077; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1078; CHECK-NEXT:    br label [[OMP_REGION_END]]
1079;
1080;
1081; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10
1082; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
1083; CHECK-NEXT:  entry:
1084; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
1085; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
1086; CHECK-NEXT:    call void @use(i32 [[CONV]])
1087; CHECK-NEXT:    ret void
1088;
1089;
1090; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11
1091; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) {
1092; CHECK-NEXT:  entry:
1093; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[F]], align 4
1094; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[TMP0]] to i32
1095; CHECK-NEXT:    call void @use(i32 [[CONV]])
1096; CHECK-NEXT:    ret void
1097;
1098;
1099; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate
1100; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1101; CHECK-NEXT:  entry:
1102; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8
1103; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1104; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1105; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1106; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1107; CHECK:       omp_parallel:
1108; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64*)* @merge_seq_firstprivate..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]])
1109; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1110; CHECK:       omp.par.outlined.exit:
1111; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1112; CHECK:       omp.par.exit.split:
1113; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1114; CHECK:       entry.split.split:
1115; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4
1116; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1117; CHECK-NEXT:    ret void
1118;
1119;
1120; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par
1121; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) [[ATTR0]] {
1122; CHECK-NEXT:  omp.par.entry:
1123; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1124; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1125; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1126; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1127; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1128; CHECK:       omp.par.outlined.exit.exitStub:
1129; CHECK-NEXT:    ret void
1130; CHECK:       omp.par.region:
1131; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1132; CHECK:       omp.par.merged:
1133; CHECK-NEXT:    call void @.omp_outlined..12(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1134; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1135; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1136; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1137; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1138; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1139; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1140; CHECK:       omp_region.end:
1141; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1142; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1143; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1144; CHECK:       omp.par.merged.split.split:
1145; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
1146; CHECK-NEXT:    call void @.omp_outlined..13(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]])
1147; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1148; CHECK:       entry.split:
1149; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1150; CHECK:       omp.par.region.split:
1151; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1152; CHECK:       omp.par.pre_finalize:
1153; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1154; CHECK:       omp_region.body:
1155; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1156; CHECK:       seq.par.merged:
1157; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4
1158; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], 1
1159; CHECK-NEXT:    store i32 [[ADD]], i32* [[A_ADDR]], align 4
1160; CHECK-NEXT:    [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64
1161; CHECK-NEXT:    store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8
1162; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1163; CHECK:       omp.par.merged.split:
1164; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1165; CHECK:       omp_region.body.split:
1166; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1167; CHECK-NEXT:    br label [[OMP_REGION_END]]
1168;
1169;
1170; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12
1171; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1172; CHECK-NEXT:  entry:
1173; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1174; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1175; CHECK-NEXT:    ret void
1176;
1177;
1178; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13
1179; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) {
1180; CHECK-NEXT:  entry:
1181; CHECK-NEXT:    [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32
1182; CHECK-NEXT:    call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]])
1183; CHECK-NEXT:    ret void
1184;
1185;
1186; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt
1187; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1188; CHECK-NEXT:  entry:
1189; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1190; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1191; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1192; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1193; CHECK:       omp_parallel:
1194; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq_sink_lt..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
1195; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1196; CHECK:       omp.par.outlined.exit:
1197; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1198; CHECK:       omp.par.exit.split:
1199; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1200; CHECK:       entry.split.split:
1201; CHECK-NEXT:    ret void
1202;
1203;
1204; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par
1205; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0]] {
1206; CHECK-NEXT:  omp.par.entry:
1207; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
1208; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1209; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1210; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1211; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1212; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1213; CHECK:       omp.par.outlined.exit.exitStub:
1214; CHECK-NEXT:    ret void
1215; CHECK:       omp.par.region:
1216; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1217; CHECK:       omp.par.merged:
1218; CHECK-NEXT:    call void @.omp_outlined..14(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1219; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1220; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1221; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1222; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1223; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1224; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1225; CHECK:       omp_region.end:
1226; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1227; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1228; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1229; CHECK:       omp.par.merged.split.split:
1230; CHECK-NEXT:    call void @.omp_outlined..15(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1231; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1232; CHECK:       entry.split:
1233; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1234; CHECK:       omp.par.region.split:
1235; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1236; CHECK:       omp.par.pre_finalize:
1237; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1238; CHECK:       omp_region.body:
1239; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1240; CHECK:       seq.par.merged:
1241; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
1242; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
1243; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint i32* [[B]] to i64
1244; CHECK-NEXT:    [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32
1245; CHECK-NEXT:    store i32 [[TMP5]], i32* [[B]], align 4
1246; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]])
1247; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1248; CHECK:       omp.par.merged.split:
1249; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1250; CHECK:       omp_region.body.split:
1251; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1252; CHECK-NEXT:    br label [[OMP_REGION_END]]
1253;
1254;
1255; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14
1256; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1257; CHECK-NEXT:  entry:
1258; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1259; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1260; CHECK-NEXT:    ret void
1261;
1262;
1263; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15
1264; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1265; CHECK-NEXT:  entry:
1266; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1267; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1268; CHECK-NEXT:    ret void
1269;
1270;
1271; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use
1272; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1273; CHECK-NEXT:  entry:
1274; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1275; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
1276; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1277; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1278; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1279; CHECK:       omp_parallel:
1280; CHECK-NEXT:    [[LT_CAST3:%.*]] = bitcast i32* [[B]] to i8*
1281; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]])
1282; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_seq_par_use..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[B]])
1283; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1284; CHECK:       omp.par.outlined.exit:
1285; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1286; CHECK:       omp.par.exit.split:
1287; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1288; CHECK:       entry.split.split:
1289; CHECK-NEXT:    [[LT_CAST:%.*]] = bitcast i32* [[B]] to i8*
1290; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[LT_CAST]])
1291; CHECK-NEXT:    ret void
1292;
1293;
1294; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par
1295; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[B:%.*]]) [[ATTR0]] {
1296; CHECK-NEXT:  omp.par.entry:
1297; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1298; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1299; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1300; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1301; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1302; CHECK:       omp.par.outlined.exit.exitStub:
1303; CHECK-NEXT:    ret void
1304; CHECK:       omp.par.region:
1305; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1306; CHECK:       omp.par.merged:
1307; CHECK-NEXT:    call void @.omp_outlined..16(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1308; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1309; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1310; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1311; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1312; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1313; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1314; CHECK:       omp_region.end:
1315; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1316; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1317; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1318; CHECK:       omp.par.merged.split.split:
1319; CHECK-NEXT:    call void @.omp_outlined..17(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[B]])
1320; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1321; CHECK:       entry.split:
1322; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1323; CHECK:       omp.par.region.split:
1324; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1325; CHECK:       omp.par.pre_finalize:
1326; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1327; CHECK:       omp_region.body:
1328; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1329; CHECK:       seq.par.merged:
1330; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32* [[B]] to i8*
1331; CHECK-NEXT:    [[TMP4:%.*]] = load i32, i32* [[A_ADDR]], align 4
1332; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP4]], 1
1333; CHECK-NEXT:    store i32 [[ADD]], i32* [[B]], align 4
1334; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1335; CHECK:       omp.par.merged.split:
1336; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1337; CHECK:       omp_region.body.split:
1338; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1339; CHECK-NEXT:    br label [[OMP_REGION_END]]
1340;
1341;
1342; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16
1343; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1344; CHECK-NEXT:  entry:
1345; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1346; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1347; CHECK-NEXT:    ret void
1348;
1349;
1350; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17
1351; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) {
1352; CHECK-NEXT:  entry:
1353; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1354; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1355; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4
1356; CHECK-NEXT:    call void @use(i32 [[TMP1]])
1357; CHECK-NEXT:    ret void
1358;
1359;
1360; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions
1361; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
1362; CHECK-NEXT:  entry:
1363; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
1364; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
1365; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
1366; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
1367; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1368; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1369; CHECK:       omp_parallel:
1370; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
1371; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1372; CHECK:       omp.par.outlined.exit:
1373; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1374; CHECK:       omp.par.exit.split:
1375; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1376; CHECK:       entry.split.split:
1377; CHECK-NEXT:    ret void
1378;
1379;
1380; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par
1381; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) [[ATTR0]] {
1382; CHECK-NEXT:  omp.par.entry:
1383; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1384; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1385; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1386; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1387; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1388; CHECK:       omp.par.outlined.exit.exitStub:
1389; CHECK-NEXT:    ret void
1390; CHECK:       omp.par.region:
1391; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1392; CHECK:       omp.par.merged:
1393; CHECK-NEXT:    call void @.omp_outlined..18(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
1394; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1395; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1396; CHECK-NEXT:    call void @.omp_outlined..19(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
1397; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1398; CHECK:       entry.split:
1399; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1400; CHECK:       omp.par.region.split:
1401; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1402; CHECK:       omp.par.pre_finalize:
1403; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1404;
1405;
1406; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18
1407; CHECK-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
1408; CHECK-NEXT:  entry:
1409; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
1410; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1411; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1412; CHECK:       if.then:
1413; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
1414; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull [[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1415; CHECK-NEXT:    ret void
1416; CHECK:       if.end:
1417; CHECK-NEXT:    ret void
1418;
1419;
1420; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19
1421; CHECK-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
1422; CHECK-NEXT:  entry:
1423; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
1424; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1425; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1426; CHECK:       if.then:
1427; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
1428; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull [[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1429; CHECK-NEXT:    ret void
1430; CHECK:       if.end:
1431; CHECK-NEXT:    ret void
1432;
1433;
1434; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq
1435; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr {
1436; CHECK-NEXT:  entry:
1437; CHECK-NEXT:    [[CANCEL1_ADDR:%.*]] = alloca i32, align 4
1438; CHECK-NEXT:    [[CANCEL2_ADDR:%.*]] = alloca i32, align 4
1439; CHECK-NEXT:    store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4
1440; CHECK-NEXT:    store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4
1441; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1442; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1443; CHECK:       omp_parallel:
1444; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions_seq..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]])
1445; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1446; CHECK:       omp.par.outlined.exit:
1447; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1448; CHECK:       omp.par.exit.split:
1449; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1450; CHECK:       entry.split.split:
1451; CHECK-NEXT:    ret void
1452;
1453;
1454; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par
1455; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) [[ATTR0]] {
1456; CHECK-NEXT:  omp.par.entry:
1457; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1458; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1459; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1460; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1461; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1462; CHECK:       omp.par.outlined.exit.exitStub:
1463; CHECK-NEXT:    ret void
1464; CHECK:       omp.par.region:
1465; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1466; CHECK:       omp.par.merged:
1467; CHECK-NEXT:    call void @.omp_outlined..20(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]])
1468; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1469; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1470; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1471; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1472; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1473; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1474; CHECK:       omp_region.end:
1475; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1476; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1477; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1478; CHECK:       omp.par.merged.split.split:
1479; CHECK-NEXT:    call void @.omp_outlined..21(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]])
1480; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1481; CHECK:       entry.split:
1482; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1483; CHECK:       omp.par.region.split:
1484; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1485; CHECK:       omp.par.pre_finalize:
1486; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1487; CHECK:       omp_region.body:
1488; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1489; CHECK:       seq.par.merged:
1490; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[CANCEL1_ADDR]], align 4
1491; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
1492; CHECK-NEXT:    [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32
1493; CHECK-NEXT:    store i32 [[LNOT_EXT]], i32* [[CANCEL2_ADDR]], align 4
1494; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1495; CHECK:       omp.par.merged.split:
1496; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1497; CHECK:       omp_region.body.split:
1498; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1499; CHECK-NEXT:    br label [[OMP_REGION_END]]
1500;
1501;
1502; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20
1503; CHECK-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) {
1504; CHECK-NEXT:  entry:
1505; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4
1506; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1507; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1508; CHECK:       if.then:
1509; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
1510; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull [[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1511; CHECK-NEXT:    ret void
1512; CHECK:       if.end:
1513; CHECK-NEXT:    ret void
1514;
1515;
1516; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21
1517; CHECK-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) {
1518; CHECK-NEXT:  entry:
1519; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4
1520; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
1521; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1522; CHECK:       if.then:
1523; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
1524; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull [[GLOB1]], i32 [[TMP1]], i32 noundef 1)
1525; CHECK-NEXT:    ret void
1526; CHECK:       if.end:
1527; CHECK-NEXT:    ret void
1528;
1529;
1530; CHECK-LABEL: define {{[^@]+}}@merge_3
1531; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1532; CHECK-NEXT:  entry:
1533; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1534; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1535; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1536; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1537; CHECK:       omp_parallel:
1538; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_3..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
1539; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1540; CHECK:       omp.par.outlined.exit:
1541; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1542; CHECK:       omp.par.exit.split:
1543; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1544; CHECK:       entry.split.split:
1545; CHECK-NEXT:    ret void
1546;
1547;
1548; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par
1549; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0]] {
1550; CHECK-NEXT:  omp.par.entry:
1551; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1552; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1553; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1554; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1555; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1556; CHECK:       omp.par.outlined.exit.exitStub:
1557; CHECK-NEXT:    ret void
1558; CHECK:       omp.par.region:
1559; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1560; CHECK:       omp.par.merged:
1561; CHECK-NEXT:    call void @.omp_outlined..22(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1562; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1563; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1564; CHECK-NEXT:    call void @.omp_outlined..23(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1565; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1566; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1567; CHECK-NEXT:    call void @.omp_outlined..24(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1568; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1569; CHECK:       entry.split:
1570; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1571; CHECK:       omp.par.region.split:
1572; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1573; CHECK:       omp.par.pre_finalize:
1574; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1575;
1576;
1577; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22
1578; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1579; CHECK-NEXT:  entry:
1580; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1581; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1582; CHECK-NEXT:    ret void
1583;
1584;
1585; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23
1586; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1587; CHECK-NEXT:  entry:
1588; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1589; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1590; CHECK-NEXT:    ret void
1591;
1592;
1593; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24
1594; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1595; CHECK-NEXT:  entry:
1596; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1597; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1598; CHECK-NEXT:    ret void
1599;
1600;
1601; CHECK-LABEL: define {{[^@]+}}@merge_3_seq
1602; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr {
1603; CHECK-NEXT:  entry:
1604; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
1605; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4
1606; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1607; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1608; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1609; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1610; CHECK:       omp_parallel:
1611; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32*)* @merge_3_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]])
1612; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1613; CHECK:       omp.par.outlined.exit:
1614; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1615; CHECK:       omp.par.exit.split:
1616; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1617; CHECK:       entry.split.split:
1618; CHECK-NEXT:    [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
1619; CHECK-NEXT:    call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]])
1620; CHECK-NEXT:    ret void
1621;
1622;
1623; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par
1624; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[ADD_SEQ_OUTPUT_ALLOC:%.*]], i32* [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) [[ATTR0]] {
1625; CHECK-NEXT:  omp.par.entry:
1626; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1627; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1628; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1629; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1630; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1631; CHECK:       omp.par.outlined.exit.exitStub:
1632; CHECK-NEXT:    ret void
1633; CHECK:       omp.par.region:
1634; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1635; CHECK:       omp.par.merged:
1636; CHECK-NEXT:    call void @.omp_outlined..25(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1637; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1638; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1639; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1640; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1641; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
1642; CHECK-NEXT:    br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]]
1643; CHECK:       omp_region.end:
1644; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1645; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]])
1646; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]]
1647; CHECK:       omp.par.merged.split.split:
1648; CHECK-NEXT:    call void @.omp_outlined..26(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1649; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1650; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
1651; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1652; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
1653; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0
1654; CHECK-NEXT:    br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]]
1655; CHECK:       omp_region.end4:
1656; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1657; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]])
1658; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]]
1659; CHECK:       omp.par.merged.split.split.split.split:
1660; CHECK-NEXT:    call void @.omp_outlined..27(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1661; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1662; CHECK:       entry.split:
1663; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1664; CHECK:       omp.par.region.split:
1665; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1666; CHECK:       omp.par.pre_finalize:
1667; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1668; CHECK:       omp_region.body5:
1669; CHECK-NEXT:    br label [[SEQ_PAR_MERGED2:%.*]]
1670; CHECK:       seq.par.merged2:
1671; CHECK-NEXT:    [[TMP5:%.*]] = load i32, i32* [[A_ADDR]], align 4
1672; CHECK-NEXT:    [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
1673; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]]
1674; CHECK-NEXT:    store i32 [[ADD1]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4
1675; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]]
1676; CHECK:       omp.par.merged.split.split.split:
1677; CHECK-NEXT:    br label [[OMP_REGION_BODY5_SPLIT:%.*]]
1678; CHECK:       omp_region.body5.split:
1679; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
1680; CHECK-NEXT:    br label [[OMP_REGION_END4]]
1681; CHECK:       omp_region.body:
1682; CHECK-NEXT:    br label [[SEQ_PAR_MERGED:%.*]]
1683; CHECK:       seq.par.merged:
1684; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[A_ADDR]], align 4
1685; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP6]], 1
1686; CHECK-NEXT:    store i32 [[ADD]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4
1687; CHECK-NEXT:    br label [[OMP_PAR_MERGED_SPLIT:%.*]]
1688; CHECK:       omp.par.merged.split:
1689; CHECK-NEXT:    br label [[OMP_REGION_BODY_SPLIT:%.*]]
1690; CHECK:       omp_region.body.split:
1691; CHECK-NEXT:    call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1692; CHECK-NEXT:    br label [[OMP_REGION_END]]
1693;
1694;
1695; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25
1696; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1697; CHECK-NEXT:  entry:
1698; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1699; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1700; CHECK-NEXT:    ret void
1701;
1702;
1703; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26
1704; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1705; CHECK-NEXT:  entry:
1706; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1707; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1708; CHECK-NEXT:    ret void
1709;
1710;
1711; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27
1712; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1713; CHECK-NEXT:  entry:
1714; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1715; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1716; CHECK-NEXT:    ret void
1717;
1718;
1719; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call
1720; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1721; CHECK-NEXT:  entry:
1722; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1723; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1724; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1725; CHECK-NEXT:    call void (...) @foo()
1726; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1727; CHECK-NEXT:    call void (...) @foo()
1728; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1729; CHECK-NEXT:    ret void
1730;
1731;
1732; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28
1733; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1734; CHECK-NEXT:  entry:
1735; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1736; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1737; CHECK-NEXT:    ret void
1738;
1739;
1740; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29
1741; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1742; CHECK-NEXT:  entry:
1743; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1744; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1745; CHECK-NEXT:    ret void
1746;
1747;
1748; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30
1749; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1750; CHECK-NEXT:  entry:
1751; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1752; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1753; CHECK-NEXT:    ret void
1754;
1755;
1756; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind
1757; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1758; CHECK-NEXT:  entry:
1759; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1760; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]])
1761; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1762; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1763; CHECK-NEXT:    call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 [[TMP0]], i32 noundef 3)
1764; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1765; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1766; CHECK-NEXT:    ret void
1767;
1768;
1769; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31
1770; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1771; CHECK-NEXT:  entry:
1772; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1773; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1774; CHECK-NEXT:    ret void
1775;
1776;
1777; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32
1778; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1779; CHECK-NEXT:  entry:
1780; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1781; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1782; CHECK-NEXT:    ret void
1783;
1784;
1785; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33
1786; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1787; CHECK-NEXT:  entry:
1788; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1789; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1790; CHECK-NEXT:    ret void
1791;
1792;
1793; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads
1794; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1795; CHECK-NEXT:  entry:
1796; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1797; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]])
1798; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1799; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1800; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4
1801; CHECK-NEXT:    call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 [[TMP0]], i32 [[TMP1]])
1802; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1803; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1804; CHECK-NEXT:    ret void
1805;
1806;
1807; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34
1808; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1809; CHECK-NEXT:  entry:
1810; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1811; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1812; CHECK-NEXT:    ret void
1813;
1814;
1815; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35
1816; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1817; CHECK-NEXT:  entry:
1818; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1819; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1820; CHECK-NEXT:    ret void
1821;
1822;
1823; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36
1824; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1825; CHECK-NEXT:  entry:
1826; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1827; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1828; CHECK-NEXT:    ret void
1829;
1830;
1831; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1
1832; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr {
1833; CHECK-NEXT:  entry:
1834; CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
1835; CHECK-NEXT:    store i32 [[A]], i32* [[A_ADDR]], align 4
1836; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1837; CHECK-NEXT:    br label [[OMP_PARALLEL:%.*]]
1838; CHECK:       omp_parallel:
1839; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_2_unmergable_1..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]])
1840; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1841; CHECK:       omp.par.outlined.exit:
1842; CHECK-NEXT:    br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1843; CHECK:       omp.par.exit.split:
1844; CHECK-NEXT:    br label [[ENTRY_SPLIT_SPLIT:%.*]]
1845; CHECK:       entry.split.split:
1846; CHECK-NEXT:    call void (...) @foo()
1847; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1848; CHECK-NEXT:    ret void
1849;
1850;
1851; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par
1852; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0]] {
1853; CHECK-NEXT:  omp.par.entry:
1854; CHECK-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1855; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1856; CHECK-NEXT:    store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1857; CHECK-NEXT:    [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1858; CHECK-NEXT:    br label [[OMP_PAR_REGION:%.*]]
1859; CHECK:       omp.par.outlined.exit.exitStub:
1860; CHECK-NEXT:    ret void
1861; CHECK:       omp.par.region:
1862; CHECK-NEXT:    br label [[OMP_PAR_MERGED:%.*]]
1863; CHECK:       omp.par.merged:
1864; CHECK-NEXT:    call void @.omp_outlined..37(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1865; CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]])
1866; CHECK-NEXT:    call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]])
1867; CHECK-NEXT:    call void @.omp_outlined..38(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]])
1868; CHECK-NEXT:    br label [[ENTRY_SPLIT:%.*]]
1869; CHECK:       entry.split:
1870; CHECK-NEXT:    br label [[OMP_PAR_REGION_SPLIT:%.*]]
1871; CHECK:       omp.par.region.split:
1872; CHECK-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1873; CHECK:       omp.par.pre_finalize:
1874; CHECK-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1875;
1876;
1877; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37
1878; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1879; CHECK-NEXT:  entry:
1880; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1881; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1882; CHECK-NEXT:    ret void
1883;
1884;
1885; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38
1886; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1887; CHECK-NEXT:  entry:
1888; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1889; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1890; CHECK-NEXT:    ret void
1891;
1892;
1893; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39
1894; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) {
1895; CHECK-NEXT:  entry:
1896; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4
1897; CHECK-NEXT:    call void @use(i32 [[TMP0]])
1898; CHECK-NEXT:    ret void
1899;
1900