1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
2 // Test host code gen
3 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -verify -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1
4 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
5 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK1
6 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -verify -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK3
7 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
8 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK3
9 
10 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -verify -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
11 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
12 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
13 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -verify -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
14 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
15 // RUN: %clang_cc1 -no-opaque-pointers -DLAMBDA -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
16 
17 // RUN: %clang_cc1 -no-opaque-pointers  -verify -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK9
18 // RUN: %clang_cc1 -no-opaque-pointers  -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
19 // RUN: %clang_cc1 -no-opaque-pointers  -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK9
20 // RUN: %clang_cc1 -no-opaque-pointers  -verify -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK11
21 // RUN: %clang_cc1 -no-opaque-pointers  -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
22 // RUN: %clang_cc1 -no-opaque-pointers  -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK11
23 
24 // RUN: %clang_cc1 -no-opaque-pointers  -verify -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
25 // RUN: %clang_cc1 -no-opaque-pointers  -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
26 // RUN: %clang_cc1 -no-opaque-pointers  -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
27 // RUN: %clang_cc1 -no-opaque-pointers  -verify -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
28 // RUN: %clang_cc1 -no-opaque-pointers  -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
29 // RUN: %clang_cc1 -no-opaque-pointers  -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
30 // expected-no-diagnostics
31 #ifndef HEADER
32 #define HEADER
33 
34 
35 template <typename T>
tmain()36 T tmain() {
37   T *a, *b, *c;
38   int n = 10000;
39   int ch = 100;
40 
41   // no schedule clauses
42   #pragma omp target
43   #pragma omp teams
44   #pragma omp distribute parallel for
45   for (int i = 0; i < n; ++i) {
46     #pragma omp cancel for
47     a[i] = b[i] + c[i];
48   }
49 
50   // dist_schedule: static no chunk
51   #pragma omp target
52   #pragma omp teams
53   #pragma omp distribute parallel for dist_schedule(static)
54   for (int i = 0; i < n; ++i) {
55     a[i] = b[i] + c[i];
56   }
57 
58   // dist_schedule: static chunk
59   #pragma omp target
60   #pragma omp teams
61   #pragma omp distribute parallel for dist_schedule(static, ch)
62   for (int i = 0; i < n; ++i) {
63     a[i] = b[i] + c[i];
64   }
65 
66   // schedule: static no chunk
67   #pragma omp target
68   #pragma omp teams
69   #pragma omp distribute parallel for schedule(static)
70   for (int i = 0; i < n; ++i) {
71     a[i] = b[i] + c[i];
72   }
73 
74   // schedule: static chunk
75   #pragma omp target
76   #pragma omp teams
77   #pragma omp distribute parallel for schedule(static, ch)
78   for (int i = 0; i < n; ++i) {
79     a[i] = b[i] + c[i];
80   }
81 
82   // schedule: dynamic no chunk
83   #pragma omp target
84   #pragma omp teams
85   #pragma omp distribute parallel for schedule(dynamic)
86   for (int i = 0; i < n; ++i) {
87     a[i] = b[i] + c[i];
88   }
89 
90   // schedule: dynamic chunk
91   #pragma omp target
92   #pragma omp teams
93   #pragma omp distribute parallel for schedule(dynamic, ch)
94   for (int i = 0; i < n; ++i) {
95     a[i] = b[i] + c[i];
96   }
97 
98   return T();
99 }
100 
main()101 int main() {
102   double *a, *b, *c;
103   int n = 10000;
104   int ch = 100;
105 
106 #ifdef LAMBDA
107   [&]() {
108 
109 
110 
111 
112 
113 
114 
115 
116     // no schedule clauses
117     #pragma omp target
118     #pragma omp teams
119 
120     #pragma omp distribute parallel for
121     for (int i = 0; i < n; ++i) {
122       a[i] = b[i] + c[i];
123 
124 
125       // check EUB for distribute
126 
127       // initialize omp.iv
128 
129       // check exit condition
130 
131       // check that PrevLB and PrevUB are passed to the 'for'
132       // check that distlb and distub are properly passed to fork_call
133 
134       // increment by stride (distInc - 'parallel for' executes the whole chunk) and latch
135 
136 
137       // implementation of 'parallel for'
138 
139 
140       // initialize lb and ub to PrevLB and PrevUB
141 
142       // PrevEUB is only used when 'for' has a chunked schedule, otherwise EUB is used
143       // In this case we use EUB
144 
145       // initialize omp.iv
146 
147       // check exit condition
148 
149       // check that PrevLB and PrevUB are passed to the 'for'
150 
151       // check stride 1 for 'for' in 'distribute parallel for'
152 
153 
154       [&]() {
155 	a[i] = b[i] + c[i];
156       }();
157     }
158 
159     // dist_schedule: static no chunk (same sa default - no dist_schedule)
160     #pragma omp target
161     #pragma omp teams
162 
163     #pragma omp distribute parallel for dist_schedule(static)
164     for (int i = 0; i < n; ++i) {
165       a[i] = b[i] + c[i];
166 
167 
168       // check EUB for distribute
169 
170       // initialize omp.iv
171 
172       // check exit condition
173 
174       // check that PrevLB and PrevUB are passed to the 'for'
175       // check that distlb and distub are properly passed to fork_call
176 
177       // increment by stride (distInc - 'parallel for' executes the whole chunk) and latch
178 
179 
180       // implementation of 'parallel for'
181 
182 
183       // initialize lb and ub to PrevLB and PrevUB
184 
185       // PrevEUB is only used when 'for' has a chunked schedule, otherwise EUB is used
186       // In this case we use EUB
187 
188       // initialize omp.iv
189 
190       // check exit condition
191 
192       // check that PrevLB and PrevUB are passed to the 'for'
193 
194       // check stride 1 for 'for' in 'distribute parallel for'
195 
196       [&]() {
197 	a[i] = b[i] + c[i];
198       }();
199     }
200 
201     // dist_schedule: static chunk
202     #pragma omp target
203     #pragma omp teams
204 
205     #pragma omp distribute parallel for dist_schedule(static, ch)
206     for (int i = 0; i < n; ++i) {
207       a[i] = b[i] + c[i];
208 
209 
210       // check EUB for distribute
211 
212       // initialize omp.iv
213 
214       // check exit condition
215 
216       // check that PrevLB and PrevUB are passed to the 'for'
217       // check that distlb and distub are properly passed to fork_call
218 
219       // check DistInc
220 
221       // Update UB
222 
223       // Store LB in IV
224 
225 
226       // loop exit
227 
228       // skip implementation of 'parallel for': using default scheduling and was tested above
229       [&]() {
230 	a[i] = b[i] + c[i];
231       }();
232     }
233 
234     // schedule: static no chunk
235     #pragma omp target
236     #pragma omp teams
237 
238     #pragma omp distribute parallel for schedule(static)
239     for (int i = 0; i < n; ++i) {
240       a[i] = b[i] + c[i];
241 
242       // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
243 
244       // 'parallel for' implementation is the same as the case without schedule clase (static no chunk is the default)
245 
246 
247       // initialize lb and ub to PrevLB and PrevUB
248 
249       // PrevEUB is only used when 'for' has a chunked schedule, otherwise EUB is used
250       // In this case we use EUB
251 
252       // initialize omp.iv
253 
254       // check exit condition
255 
256       // check that PrevLB and PrevUB are passed to the 'for'
257 
258       // check stride 1 for 'for' in 'distribute parallel for'
259 
260 
261       [&]() {
262 	a[i] = b[i] + c[i];
263       }();
264     }
265 
266     // schedule: static chunk
267     #pragma omp target
268     #pragma omp teams
269 
270     #pragma omp distribute parallel for schedule(static, ch)
271     for (int i = 0; i < n; ++i) {
272       a[i] = b[i] + c[i];
273       // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
274 
275       // 'parallel for' implementation using outer and inner loops and PrevEUB
276 
277       // initialize lb and ub to PrevLB and PrevUB
278 
279       // check PrevEUB (using PrevUB instead of NumIt as upper bound)
280 
281       // initialize omp.iv (IV = LB)
282 
283       // outer loop: while (IV < UB) {
284 
285 
286 
287       // skip body branch
288 
289       // IV = IV + 1 and inner loop latch
290 
291       // check NextLB and NextUB
292 
293 
294       [&]() {
295 	a[i] = b[i] + c[i];
296       }();
297     }
298 
299     // schedule: dynamic no chunk
300     #pragma omp target
301     #pragma omp teams
302 
303     #pragma omp distribute parallel for schedule(dynamic)
304     for (int i = 0; i < n; ++i) {
305       a[i] = b[i] + c[i];
306       // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
307 
308       // 'parallel for' implementation using outer and inner loops and PrevEUB
309 
310       // initialize lb and ub to PrevLB and PrevUB
311 
312 
313       // initialize omp.iv (IV = LB)
314 
315 
316       // skip body branch
317 
318       // IV = IV + 1 and inner loop latch
319 
320       // check NextLB and NextUB
321 
322 
323       [&]() {
324 	a[i] = b[i] + c[i];
325       }();
326     }
327 
328     // schedule: dynamic chunk
329     #pragma omp target
330     #pragma omp teams
331 
332     #pragma omp distribute parallel for schedule(dynamic, ch)
333     for (int i = 0; i < n; ++i) {
334       a[i] = b[i] + c[i];
335       // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
336 
337       // 'parallel for' implementation using outer and inner loops and PrevEUB
338 
339       // initialize lb and ub to PrevLB and PrevUB
340 
341 
342       // initialize omp.iv (IV = LB)
343 
344 
345       // skip body branch
346 
347       // IV = IV + 1 and inner loop latch
348 
349       // check NextLB and NextUB
350 
351 
352       [&]() {
353 	a[i] = b[i] + c[i];
354       }();
355     }
356   }();
357   return 0;
358 #else
359 
360 
361 
362 
363 
364 
365 
366 
367 
368   // no schedule clauses
369   #pragma omp target
370   #pragma omp teams
371 
372   #pragma omp distribute parallel for
373   for (int i = 0; i < n; ++i) {
374     a[i] = b[i] + c[i];
375 
376 
377     // check EUB for distribute
378 
379     // initialize omp.iv
380 
381     // check exit condition
382 
383     // check that PrevLB and PrevUB are passed to the 'for'
384     // check that distlb and distub are properly passed to fork_call
385 
386     // increment by stride (distInc - 'parallel for' executes the whole chunk) and latch
387 
388 
389     // implementation of 'parallel for'
390 
391 
392     // initialize lb and ub to PrevLB and PrevUB
393 
394     // PrevEUB is only used when 'for' has a chunked schedule, otherwise EUB is used
395     // In this case we use EUB
396 
397     // initialize omp.iv
398 
399     // check exit condition
400 
401     // check that PrevLB and PrevUB are passed to the 'for'
402 
403     // check stride 1 for 'for' in 'distribute parallel for'
404 
405   }
406 
407   // dist_schedule: static no chunk
408   #pragma omp target
409   #pragma omp teams
410 
411   #pragma omp distribute parallel for dist_schedule(static)
412   for (int i = 0; i < n; ++i) {
413     a[i] = b[i] + c[i];
414 
415 
416     // check EUB for distribute
417 
418     // initialize omp.iv
419 
420     // check exit condition
421 
422     // check that PrevLB and PrevUB are passed to the 'for'
423     // check that distlb and distub are properly passed to fork_call
424 
425     // increment by stride (distInc - 'parallel for' executes the whole chunk) and latch
426 
427 
428     // implementation of 'parallel for'
429 
430 
431     // initialize lb and ub to PrevLB and PrevUB
432 
433     // PrevEUB is only used when 'for' has a chunked schedule, otherwise EUB is used
434     // In this case we use EUB
435 
436     // initialize omp.iv
437 
438     // check exit condition
439 
440     // check that PrevLB and PrevUB are passed to the 'for'
441 
442     // check stride 1 for 'for' in 'distribute parallel for'
443 
444   }
445 
446   // dist_schedule: static chunk
447   #pragma omp target
448   #pragma omp teams
449 
450   #pragma omp distribute parallel for dist_schedule(static, ch)
451   for (int i = 0; i < n; ++i) {
452     a[i] = b[i] + c[i];
453 
454     // unlike the previous tests, in this one we have a outer and inner loop for 'distribute'
455 
456     // check EUB for distribute
457 
458     // initialize omp.iv
459 
460     // check exit condition
461 
462     // check that PrevLB and PrevUB are passed to the 'for'
463     // check that distlb and distub are properly passed to fork_call
464 
465     // check DistInc
466 
467     // Update UB
468 
469     // Store LB in IV
470 
471 
472     // loop exit
473 
474     // skip implementation of 'parallel for': using default scheduling and was tested above
475   }
476 
477   // schedule: static no chunk
478   #pragma omp target
479   #pragma omp teams
480 
481   #pragma omp distribute parallel for schedule(static)
482   for (int i = 0; i < n; ++i) {
483     a[i] = b[i] + c[i];
484 
485     // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
486 
487     // 'parallel for' implementation is the same as the case without schedule clase (static no chunk is the default)
488 
489 
490     // initialize lb and ub to PrevLB and PrevUB
491 
492     // PrevEUB is only used when 'for' has a chunked schedule, otherwise EUB is used
493     // In this case we use EUB
494 
495     // initialize omp.iv
496 
497     // check exit condition
498 
499     // check that PrevLB and PrevUB are passed to the 'for'
500 
501     // check stride 1 for 'for' in 'distribute parallel for'
502 
503   }
504 
505   // schedule: static chunk
506   #pragma omp target
507   #pragma omp teams
508 
509   #pragma omp distribute parallel for schedule(static, ch)
510   for (int i = 0; i < n; ++i) {
511     a[i] = b[i] + c[i];
512     // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
513 
514     // 'parallel for' implementation using outer and inner loops and PrevEUB
515 
516     // initialize lb and ub to PrevLB and PrevUB
517 
518     // check PrevEUB (using PrevUB instead of NumIt as upper bound)
519 
520     // initialize omp.iv (IV = LB)
521 
522     // outer loop: while (IV < UB) {
523 
524 
525 
526     // skip body branch
527 
528     // IV = IV + 1 and inner loop latch
529 
530     // check NextLB and NextUB
531 
532 
533   }
534 
535   // schedule: dynamic no chunk
536   #pragma omp target
537   #pragma omp teams
538 
539   #pragma omp distribute parallel for schedule(dynamic)
540   for (int i = 0; i < n; ++i) {
541     a[i] = b[i] + c[i];
542     // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
543 
544     // 'parallel for' implementation using outer and inner loops and PrevEUB
545 
546     // initialize lb and ub to PrevLB and PrevUB
547 
548 
549     // initialize omp.iv (IV = LB)
550 
551 
552     // skip body branch
553 
554     // IV = IV + 1 and inner loop latch
555 
556     // check NextLB and NextUB
557 
558 
559   }
560 
561   // schedule: dynamic chunk
562   #pragma omp target
563   #pragma omp teams
564 
565   #pragma omp distribute parallel for schedule(dynamic, ch)
566   for (int i = 0; i < n; ++i) {
567     a[i] = b[i] + c[i];
568     // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
569 
570     // 'parallel for' implementation using outer and inner loops and PrevEUB
571 
572     // initialize lb and ub to PrevLB and PrevUB
573 
574 
575     // initialize omp.iv (IV = LB)
576 
577 
578     // skip body branch
579 
580     // IV = IV + 1 and inner loop latch
581 
582     // check NextLB and NextUB
583 
584 
585   }
586 
587   return tmain<int>();
588 #endif
589 }
590 
591 // check code
592 
593 
594 
595 
596 
597 
598 
599 
600 
601 
602 
603 // check EUB for distribute
604 
605 // initialize omp.iv
606 
607 // check exit condition
608 
609 // check that PrevLB and PrevUB are passed to the 'for'
610 // check that distlb and distub are properly passed to fork_call
611 
612 // increment by stride (distInc - 'parallel for' executes the whole chunk) and latch
613 
614 
615 // implementation of 'parallel for'
616 
617 
618 // initialize lb and ub to PrevLB and PrevUB
619 
620 // PrevEUB is only used when 'for' has a chunked schedule, otherwise EUB is used
621 // In this case we use EUB
622 
623 // initialize omp.iv
624 
625 // check exit condition
626 
627 // check that PrevLB and PrevUB are passed to the 'for'
628 
629 // check stride 1 for 'for' in 'distribute parallel for'
630 
631 
632 
633 
634 
635 // check EUB for distribute
636 
637 // initialize omp.iv
638 
639 // check exit condition
640 
641 // check that PrevLB and PrevUB are passed to the 'for'
642 // check that distlb and distub are properly passed to fork_call
643 
644 // increment by stride (distInc - 'parallel for' executes the whole chunk) and latch
645 
646 
647 // implementation of 'parallel for'
648 
649 
650 // initialize lb and ub to PrevLB and PrevUB
651 
652 // PrevEUB is only used when 'for' has a chunked schedule, otherwise EUB is used
653 // In this case we use EUB
654 
655 // initialize omp.iv
656 
657 // check exit condition
658 
659 // check that PrevLB and PrevUB are passed to the 'for'
660 
661 // check stride 1 for 'for' in 'distribute parallel for'
662 
663 
664 
665 
666 // unlike the previous tests, in this one we have a outer and inner loop for 'distribute'
667 
668 // check EUB for distribute
669 
670 // initialize omp.iv
671 
672 // check exit condition
673 
674 // check that PrevLB and PrevUB are passed to the 'for'
675 // check that distlb and distub are properly passed to fork_call
676 
677 // check DistInc
678 
679 // Update UB
680 
681 // Store LB in IV
682 
683 
684 // loop exit
685 
686 // skip implementation of 'parallel for': using default scheduling and was tested above
687 
688 
689 
690 // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
691 
692 // 'parallel for' implementation is the same as the case without schedule clase (static no chunk is the default)
693 
694 
695 // initialize lb and ub to PrevLB and PrevUB
696 
697 // PrevEUB is only used when 'for' has a chunked schedule, otherwise EUB is used
698 // In this case we use EUB
699 
700 // initialize omp.iv
701 
702 // check exit condition
703 
704 // check that PrevLB and PrevUB are passed to the 'for'
705 
706 // check stride 1 for 'for' in 'distribute parallel for'
707 
708 
709 
710 // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
711 
712 // 'parallel for' implementation using outer and inner loops and PrevEUB
713 
714 // initialize lb and ub to PrevLB and PrevUB
715 
716 // check PrevEUB (using PrevUB instead of NumIt as upper bound)
717 
718 // initialize omp.iv (IV = LB)
719 
720 // outer loop: while (IV < UB) {
721 
722 
723 
724 // skip body branch
725 
726 // IV = IV + 1 and inner loop latch
727 
728 // check NextLB and NextUB
729 
730 
731 
732 
733 // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
734 
735 // 'parallel for' implementation using outer and inner loops and PrevEUB
736 
737 // initialize lb and ub to PrevLB and PrevUB
738 
739 
740 // initialize omp.iv (IV = LB)
741 
742 
743 // skip body branch
744 
745 // IV = IV + 1 and inner loop latch
746 
747 // check NextLB and NextUB
748 
749 
750 
751 
752 // skip rest of implementation of 'distribute' as it is tested above for default dist_schedule case
753 
754 // 'parallel for' implementation using outer and inner loops and PrevEUB
755 
756 // initialize lb and ub to PrevLB and PrevUB
757 
758 
759 // initialize omp.iv (IV = LB)
760 
761 
762 // skip body branch
763 
764 // IV = IV + 1 and inner loop latch
765 
766 // check NextLB and NextUB
767 
768 
769 #endif
770 // CHECK1-LABEL: define {{[^@]+}}@main
771 // CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
772 // CHECK1-NEXT:  entry:
773 // CHECK1-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
774 // CHECK1-NEXT:    [[A:%.*]] = alloca double*, align 8
775 // CHECK1-NEXT:    [[B:%.*]] = alloca double*, align 8
776 // CHECK1-NEXT:    [[C:%.*]] = alloca double*, align 8
777 // CHECK1-NEXT:    [[N:%.*]] = alloca i32, align 4
778 // CHECK1-NEXT:    [[CH:%.*]] = alloca i32, align 4
779 // CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 8
780 // CHECK1-NEXT:    store i32 0, i32* [[RETVAL]], align 4
781 // CHECK1-NEXT:    store i32 10000, i32* [[N]], align 4
782 // CHECK1-NEXT:    store i32 100, i32* [[CH]], align 4
783 // CHECK1-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 0
784 // CHECK1-NEXT:    store i32* [[N]], i32** [[TMP0]], align 8
785 // CHECK1-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 1
786 // CHECK1-NEXT:    store double** [[A]], double*** [[TMP1]], align 8
787 // CHECK1-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 2
788 // CHECK1-NEXT:    store double** [[B]], double*** [[TMP2]], align 8
789 // CHECK1-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 3
790 // CHECK1-NEXT:    store double** [[C]], double*** [[TMP3]], align 8
791 // CHECK1-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 4
792 // CHECK1-NEXT:    store i32* [[CH]], i32** [[TMP4]], align 8
793 // CHECK1-NEXT:    call void @"_ZZ4mainENK3$_0clEv"(%class.anon* noundef nonnull align 8 dereferenceable(40) [[REF_TMP]])
794 // CHECK1-NEXT:    ret i32 0
795 //
796 //
797 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l117
798 // CHECK1-SAME: (i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2:[0-9]+]] {
799 // CHECK1-NEXT:  entry:
800 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
801 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
802 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
803 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
804 // CHECK1-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
805 // CHECK1-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
806 // CHECK1-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
807 // CHECK1-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
808 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
809 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[CONV]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
810 // CHECK1-NEXT:    ret void
811 //
812 //
813 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
814 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
815 // CHECK1-NEXT:  entry:
816 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
817 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
818 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
819 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
820 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
821 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
822 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
823 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
824 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
825 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
826 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
827 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
828 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
829 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
830 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
831 // CHECK1-NEXT:    [[I3:%.*]] = alloca i32, align 4
832 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
833 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
834 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
835 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
836 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
837 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
838 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
839 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
840 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
841 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
842 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
843 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
844 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
845 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
846 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
847 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
848 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
849 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
850 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
851 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
852 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
853 // CHECK1:       omp.precond.then:
854 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
855 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
856 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
857 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
858 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
859 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
860 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
861 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
862 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
863 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
864 // CHECK1-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
865 // CHECK1-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
866 // CHECK1:       cond.true:
867 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
868 // CHECK1-NEXT:    br label [[COND_END:%.*]]
869 // CHECK1:       cond.false:
870 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
871 // CHECK1-NEXT:    br label [[COND_END]]
872 // CHECK1:       cond.end:
873 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
874 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
875 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
876 // CHECK1-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
877 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
878 // CHECK1:       omp.inner.for.cond:
879 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
880 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
881 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
882 // CHECK1-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
883 // CHECK1:       omp.inner.for.body:
884 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
885 // CHECK1-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
886 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
887 // CHECK1-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
888 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
889 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
890 // CHECK1:       omp.inner.for.inc:
891 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
892 // CHECK1-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
893 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
894 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
895 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
896 // CHECK1:       omp.inner.for.end:
897 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
898 // CHECK1:       omp.loop.exit:
899 // CHECK1-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
900 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
901 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
902 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
903 // CHECK1:       omp.precond.end:
904 // CHECK1-NEXT:    ret void
905 //
906 //
907 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..1
908 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
909 // CHECK1-NEXT:  entry:
910 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
911 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
912 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
913 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
914 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
915 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
916 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
917 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
918 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
919 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
920 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
921 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
922 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
923 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
924 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
925 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
926 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
927 // CHECK1-NEXT:    [[I4:%.*]] = alloca i32, align 4
928 // CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8
929 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
930 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
931 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
932 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
933 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
934 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
935 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
936 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
937 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
938 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
939 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
940 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
941 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
942 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
943 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
944 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
945 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
946 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
947 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
948 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
949 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
950 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
951 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
952 // CHECK1:       omp.precond.then:
953 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
954 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
955 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
956 // CHECK1-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
957 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
958 // CHECK1-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
959 // CHECK1-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
960 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
961 // CHECK1-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
962 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
963 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
964 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
965 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
966 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
967 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
968 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
969 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
970 // CHECK1-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
971 // CHECK1:       cond.true:
972 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
973 // CHECK1-NEXT:    br label [[COND_END:%.*]]
974 // CHECK1:       cond.false:
975 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
976 // CHECK1-NEXT:    br label [[COND_END]]
977 // CHECK1:       cond.end:
978 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
979 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
980 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
981 // CHECK1-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
982 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
983 // CHECK1:       omp.inner.for.cond:
984 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
985 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
986 // CHECK1-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
987 // CHECK1-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
988 // CHECK1:       omp.inner.for.body:
989 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
990 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
991 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
992 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
993 // CHECK1-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 8
994 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
995 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
996 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i64 [[IDXPROM]]
997 // CHECK1-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 8
998 // CHECK1-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 8
999 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
1000 // CHECK1-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
1001 // CHECK1-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM7]]
1002 // CHECK1-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX8]], align 8
1003 // CHECK1-NEXT:    [[ADD9:%.*]] = fadd double [[TMP22]], [[TMP25]]
1004 // CHECK1-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 8
1005 // CHECK1-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
1006 // CHECK1-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
1007 // CHECK1-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM10]]
1008 // CHECK1-NEXT:    store double [[ADD9]], double* [[ARRAYIDX11]], align 8
1009 // CHECK1-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], %class.anon.0* [[REF_TMP]], i32 0, i32 0
1010 // CHECK1-NEXT:    store double** [[TMP1]], double*** [[TMP28]], align 8
1011 // CHECK1-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], %class.anon.0* [[REF_TMP]], i32 0, i32 1
1012 // CHECK1-NEXT:    store i32* [[I4]], i32** [[TMP29]], align 8
1013 // CHECK1-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], %class.anon.0* [[REF_TMP]], i32 0, i32 2
1014 // CHECK1-NEXT:    store double** [[TMP2]], double*** [[TMP30]], align 8
1015 // CHECK1-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], %class.anon.0* [[REF_TMP]], i32 0, i32 3
1016 // CHECK1-NEXT:    store double** [[TMP3]], double*** [[TMP31]], align 8
1017 // CHECK1-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE_clEv"(%class.anon.0* noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])
1018 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1019 // CHECK1:       omp.body.continue:
1020 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1021 // CHECK1:       omp.inner.for.inc:
1022 // CHECK1-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1023 // CHECK1-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP32]], 1
1024 // CHECK1-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
1025 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
1026 // CHECK1:       omp.inner.for.end:
1027 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1028 // CHECK1:       omp.loop.exit:
1029 // CHECK1-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1030 // CHECK1-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
1031 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
1032 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
1033 // CHECK1:       omp.precond.end:
1034 // CHECK1-NEXT:    ret void
1035 //
1036 //
1037 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l160
1038 // CHECK1-SAME: (i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
1039 // CHECK1-NEXT:  entry:
1040 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
1041 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
1042 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
1043 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
1044 // CHECK1-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
1045 // CHECK1-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
1046 // CHECK1-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
1047 // CHECK1-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
1048 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
1049 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* [[CONV]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
1050 // CHECK1-NEXT:    ret void
1051 //
1052 //
1053 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..2
1054 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
1055 // CHECK1-NEXT:  entry:
1056 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1057 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1058 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
1059 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
1060 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
1061 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
1062 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1063 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1064 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1065 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1066 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1067 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1068 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1069 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1070 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1071 // CHECK1-NEXT:    [[I3:%.*]] = alloca i32, align 4
1072 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1073 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1074 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
1075 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
1076 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
1077 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
1078 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
1079 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
1080 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
1081 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
1082 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
1083 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
1084 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1085 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
1086 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1087 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
1088 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1089 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
1090 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1091 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
1092 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1093 // CHECK1:       omp.precond.then:
1094 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1095 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1096 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
1097 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1098 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1099 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1100 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
1101 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1102 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1103 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1104 // CHECK1-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
1105 // CHECK1-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1106 // CHECK1:       cond.true:
1107 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1108 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1109 // CHECK1:       cond.false:
1110 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1111 // CHECK1-NEXT:    br label [[COND_END]]
1112 // CHECK1:       cond.end:
1113 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
1114 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1115 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1116 // CHECK1-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
1117 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1118 // CHECK1:       omp.inner.for.cond:
1119 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1120 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1121 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
1122 // CHECK1-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1123 // CHECK1:       omp.inner.for.body:
1124 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1125 // CHECK1-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
1126 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1127 // CHECK1-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
1128 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
1129 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1130 // CHECK1:       omp.inner.for.inc:
1131 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1132 // CHECK1-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1133 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
1134 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
1135 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
1136 // CHECK1:       omp.inner.for.end:
1137 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1138 // CHECK1:       omp.loop.exit:
1139 // CHECK1-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1140 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
1141 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
1142 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
1143 // CHECK1:       omp.precond.end:
1144 // CHECK1-NEXT:    ret void
1145 //
1146 //
1147 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..3
1148 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
1149 // CHECK1-NEXT:  entry:
1150 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1151 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1152 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1153 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1154 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
1155 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
1156 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
1157 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
1158 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1159 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1160 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1161 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1162 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1163 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1164 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1165 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1166 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1167 // CHECK1-NEXT:    [[I4:%.*]] = alloca i32, align 4
1168 // CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 8
1169 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1170 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1171 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1172 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1173 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
1174 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
1175 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
1176 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
1177 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
1178 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
1179 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
1180 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
1181 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
1182 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
1183 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1184 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
1185 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1186 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
1187 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1188 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
1189 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1190 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
1191 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1192 // CHECK1:       omp.precond.then:
1193 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1194 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1195 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
1196 // CHECK1-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1197 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
1198 // CHECK1-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1199 // CHECK1-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
1200 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1201 // CHECK1-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
1202 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1203 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1204 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1205 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
1206 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1207 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1208 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1209 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
1210 // CHECK1-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1211 // CHECK1:       cond.true:
1212 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1213 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1214 // CHECK1:       cond.false:
1215 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1216 // CHECK1-NEXT:    br label [[COND_END]]
1217 // CHECK1:       cond.end:
1218 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
1219 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1220 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1221 // CHECK1-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
1222 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1223 // CHECK1:       omp.inner.for.cond:
1224 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1225 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1226 // CHECK1-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
1227 // CHECK1-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1228 // CHECK1:       omp.inner.for.body:
1229 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1230 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
1231 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1232 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
1233 // CHECK1-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 8
1234 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
1235 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
1236 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i64 [[IDXPROM]]
1237 // CHECK1-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 8
1238 // CHECK1-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 8
1239 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
1240 // CHECK1-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
1241 // CHECK1-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM7]]
1242 // CHECK1-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX8]], align 8
1243 // CHECK1-NEXT:    [[ADD9:%.*]] = fadd double [[TMP22]], [[TMP25]]
1244 // CHECK1-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 8
1245 // CHECK1-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
1246 // CHECK1-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
1247 // CHECK1-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM10]]
1248 // CHECK1-NEXT:    store double [[ADD9]], double* [[ARRAYIDX11]], align 8
1249 // CHECK1-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], %class.anon.1* [[REF_TMP]], i32 0, i32 0
1250 // CHECK1-NEXT:    store double** [[TMP1]], double*** [[TMP28]], align 8
1251 // CHECK1-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], %class.anon.1* [[REF_TMP]], i32 0, i32 1
1252 // CHECK1-NEXT:    store i32* [[I4]], i32** [[TMP29]], align 8
1253 // CHECK1-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], %class.anon.1* [[REF_TMP]], i32 0, i32 2
1254 // CHECK1-NEXT:    store double** [[TMP2]], double*** [[TMP30]], align 8
1255 // CHECK1-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], %class.anon.1* [[REF_TMP]], i32 0, i32 3
1256 // CHECK1-NEXT:    store double** [[TMP3]], double*** [[TMP31]], align 8
1257 // CHECK1-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE0_clEv"(%class.anon.1* noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])
1258 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1259 // CHECK1:       omp.body.continue:
1260 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1261 // CHECK1:       omp.inner.for.inc:
1262 // CHECK1-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1263 // CHECK1-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP32]], 1
1264 // CHECK1-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
1265 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
1266 // CHECK1:       omp.inner.for.end:
1267 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1268 // CHECK1:       omp.loop.exit:
1269 // CHECK1-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1270 // CHECK1-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
1271 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
1272 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
1273 // CHECK1:       omp.precond.end:
1274 // CHECK1-NEXT:    ret void
1275 //
1276 //
1277 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l202
1278 // CHECK1-SAME: (i64 noundef [[CH:%.*]], i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
1279 // CHECK1-NEXT:  entry:
1280 // CHECK1-NEXT:    [[CH_ADDR:%.*]] = alloca i64, align 8
1281 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
1282 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
1283 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
1284 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
1285 // CHECK1-NEXT:    store i64 [[CH]], i64* [[CH_ADDR]], align 8
1286 // CHECK1-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
1287 // CHECK1-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
1288 // CHECK1-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
1289 // CHECK1-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
1290 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[CH_ADDR]] to i32*
1291 // CHECK1-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
1292 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* [[CONV]], i32* [[CONV1]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
1293 // CHECK1-NEXT:    ret void
1294 //
1295 //
1296 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..6
1297 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
1298 // CHECK1-NEXT:  entry:
1299 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1300 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1301 // CHECK1-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 8
1302 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
1303 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
1304 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
1305 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
1306 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1307 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1308 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1309 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1310 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1311 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1312 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1313 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1314 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1315 // CHECK1-NEXT:    [[I3:%.*]] = alloca i32, align 4
1316 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1317 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1318 // CHECK1-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 8
1319 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
1320 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
1321 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
1322 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
1323 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 8
1324 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 8
1325 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 8
1326 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 8
1327 // CHECK1-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 8
1328 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP1]], align 4
1329 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
1330 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1331 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP6]], 0
1332 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1333 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
1334 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1335 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
1336 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1337 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP7]]
1338 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1339 // CHECK1:       omp.precond.then:
1340 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1341 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1342 // CHECK1-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_COMB_UB]], align 4
1343 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1344 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1345 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP0]], align 4
1346 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1347 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
1348 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP9]])
1349 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1350 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1351 // CHECK1-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
1352 // CHECK1-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1353 // CHECK1:       cond.true:
1354 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1355 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1356 // CHECK1:       cond.false:
1357 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1358 // CHECK1-NEXT:    br label [[COND_END]]
1359 // CHECK1:       cond.end:
1360 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
1361 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1362 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1363 // CHECK1-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
1364 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1365 // CHECK1:       omp.inner.for.cond:
1366 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1367 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1368 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], 1
1369 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp slt i32 [[TMP17]], [[ADD]]
1370 // CHECK1-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1371 // CHECK1:       omp.inner.for.body:
1372 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1373 // CHECK1-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
1374 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1375 // CHECK1-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i64
1376 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i64 [[TMP20]], i64 [[TMP22]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]])
1377 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1378 // CHECK1:       omp.inner.for.inc:
1379 // CHECK1-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1380 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1381 // CHECK1-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
1382 // CHECK1-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
1383 // CHECK1-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1384 // CHECK1-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1385 // CHECK1-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
1386 // CHECK1-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_COMB_LB]], align 4
1387 // CHECK1-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1388 // CHECK1-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1389 // CHECK1-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP27]], [[TMP28]]
1390 // CHECK1-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_UB]], align 4
1391 // CHECK1-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1392 // CHECK1-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1393 // CHECK1-NEXT:    [[CMP9:%.*]] = icmp sgt i32 [[TMP29]], [[TMP30]]
1394 // CHECK1-NEXT:    br i1 [[CMP9]], label [[COND_TRUE10:%.*]], label [[COND_FALSE11:%.*]]
1395 // CHECK1:       cond.true10:
1396 // CHECK1-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1397 // CHECK1-NEXT:    br label [[COND_END12:%.*]]
1398 // CHECK1:       cond.false11:
1399 // CHECK1-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1400 // CHECK1-NEXT:    br label [[COND_END12]]
1401 // CHECK1:       cond.end12:
1402 // CHECK1-NEXT:    [[COND13:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE10]] ], [ [[TMP32]], [[COND_FALSE11]] ]
1403 // CHECK1-NEXT:    store i32 [[COND13]], i32* [[DOTOMP_COMB_UB]], align 4
1404 // CHECK1-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1405 // CHECK1-NEXT:    store i32 [[TMP33]], i32* [[DOTOMP_IV]], align 4
1406 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
1407 // CHECK1:       omp.inner.for.end:
1408 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1409 // CHECK1:       omp.loop.exit:
1410 // CHECK1-NEXT:    [[TMP34:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1411 // CHECK1-NEXT:    [[TMP35:%.*]] = load i32, i32* [[TMP34]], align 4
1412 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP35]])
1413 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
1414 // CHECK1:       omp.precond.end:
1415 // CHECK1-NEXT:    ret void
1416 //
1417 //
1418 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..7
1419 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
1420 // CHECK1-NEXT:  entry:
1421 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1422 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1423 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1424 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1425 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
1426 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
1427 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
1428 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
1429 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1430 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1431 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1432 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1433 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1434 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1435 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1436 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1437 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1438 // CHECK1-NEXT:    [[I4:%.*]] = alloca i32, align 4
1439 // CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_2:%.*]], align 8
1440 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1441 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1442 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1443 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1444 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
1445 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
1446 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
1447 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
1448 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
1449 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
1450 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
1451 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
1452 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
1453 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
1454 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1455 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
1456 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1457 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
1458 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1459 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
1460 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1461 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
1462 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1463 // CHECK1:       omp.precond.then:
1464 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1465 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1466 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
1467 // CHECK1-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1468 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
1469 // CHECK1-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1470 // CHECK1-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
1471 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1472 // CHECK1-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
1473 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1474 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1475 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1476 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
1477 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1478 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1479 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1480 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
1481 // CHECK1-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1482 // CHECK1:       cond.true:
1483 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1484 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1485 // CHECK1:       cond.false:
1486 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1487 // CHECK1-NEXT:    br label [[COND_END]]
1488 // CHECK1:       cond.end:
1489 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
1490 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1491 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1492 // CHECK1-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
1493 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1494 // CHECK1:       omp.inner.for.cond:
1495 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1496 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1497 // CHECK1-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
1498 // CHECK1-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1499 // CHECK1:       omp.inner.for.body:
1500 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1501 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
1502 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1503 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
1504 // CHECK1-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 8
1505 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
1506 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
1507 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i64 [[IDXPROM]]
1508 // CHECK1-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 8
1509 // CHECK1-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 8
1510 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
1511 // CHECK1-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
1512 // CHECK1-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM7]]
1513 // CHECK1-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX8]], align 8
1514 // CHECK1-NEXT:    [[ADD9:%.*]] = fadd double [[TMP22]], [[TMP25]]
1515 // CHECK1-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 8
1516 // CHECK1-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
1517 // CHECK1-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
1518 // CHECK1-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM10]]
1519 // CHECK1-NEXT:    store double [[ADD9]], double* [[ARRAYIDX11]], align 8
1520 // CHECK1-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[CLASS_ANON_2]], %class.anon.2* [[REF_TMP]], i32 0, i32 0
1521 // CHECK1-NEXT:    store double** [[TMP1]], double*** [[TMP28]], align 8
1522 // CHECK1-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_2]], %class.anon.2* [[REF_TMP]], i32 0, i32 1
1523 // CHECK1-NEXT:    store i32* [[I4]], i32** [[TMP29]], align 8
1524 // CHECK1-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_2]], %class.anon.2* [[REF_TMP]], i32 0, i32 2
1525 // CHECK1-NEXT:    store double** [[TMP2]], double*** [[TMP30]], align 8
1526 // CHECK1-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_2]], %class.anon.2* [[REF_TMP]], i32 0, i32 3
1527 // CHECK1-NEXT:    store double** [[TMP3]], double*** [[TMP31]], align 8
1528 // CHECK1-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE1_clEv"(%class.anon.2* noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])
1529 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1530 // CHECK1:       omp.body.continue:
1531 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1532 // CHECK1:       omp.inner.for.inc:
1533 // CHECK1-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1534 // CHECK1-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP32]], 1
1535 // CHECK1-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
1536 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
1537 // CHECK1:       omp.inner.for.end:
1538 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1539 // CHECK1:       omp.loop.exit:
1540 // CHECK1-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1541 // CHECK1-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
1542 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
1543 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
1544 // CHECK1:       omp.precond.end:
1545 // CHECK1-NEXT:    ret void
1546 //
1547 //
1548 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l235
1549 // CHECK1-SAME: (i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
1550 // CHECK1-NEXT:  entry:
1551 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
1552 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
1553 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
1554 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
1555 // CHECK1-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
1556 // CHECK1-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
1557 // CHECK1-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
1558 // CHECK1-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
1559 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
1560 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..10 to void (i32*, i32*, ...)*), i32* [[CONV]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
1561 // CHECK1-NEXT:    ret void
1562 //
1563 //
1564 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..10
1565 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
1566 // CHECK1-NEXT:  entry:
1567 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1568 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1569 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
1570 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
1571 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
1572 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
1573 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1574 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1575 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1576 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1577 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1578 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1579 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1580 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1581 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1582 // CHECK1-NEXT:    [[I3:%.*]] = alloca i32, align 4
1583 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1584 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1585 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
1586 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
1587 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
1588 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
1589 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
1590 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
1591 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
1592 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
1593 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
1594 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
1595 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1596 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
1597 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1598 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
1599 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1600 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
1601 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1602 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
1603 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1604 // CHECK1:       omp.precond.then:
1605 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1606 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1607 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
1608 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1609 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1610 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1611 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
1612 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1613 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1614 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1615 // CHECK1-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
1616 // CHECK1-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1617 // CHECK1:       cond.true:
1618 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1619 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1620 // CHECK1:       cond.false:
1621 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1622 // CHECK1-NEXT:    br label [[COND_END]]
1623 // CHECK1:       cond.end:
1624 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
1625 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1626 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1627 // CHECK1-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
1628 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1629 // CHECK1:       omp.inner.for.cond:
1630 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1631 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1632 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
1633 // CHECK1-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1634 // CHECK1:       omp.inner.for.body:
1635 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1636 // CHECK1-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
1637 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1638 // CHECK1-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
1639 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
1640 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1641 // CHECK1:       omp.inner.for.inc:
1642 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1643 // CHECK1-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1644 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
1645 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
1646 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
1647 // CHECK1:       omp.inner.for.end:
1648 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1649 // CHECK1:       omp.loop.exit:
1650 // CHECK1-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1651 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
1652 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
1653 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
1654 // CHECK1:       omp.precond.end:
1655 // CHECK1-NEXT:    ret void
1656 //
1657 //
1658 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..11
1659 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
1660 // CHECK1-NEXT:  entry:
1661 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1662 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1663 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1664 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1665 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
1666 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
1667 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
1668 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
1669 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1670 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1671 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1672 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1673 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1674 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1675 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1676 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1677 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1678 // CHECK1-NEXT:    [[I4:%.*]] = alloca i32, align 4
1679 // CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_3:%.*]], align 8
1680 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1681 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1682 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1683 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1684 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
1685 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
1686 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
1687 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
1688 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
1689 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
1690 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
1691 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
1692 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
1693 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
1694 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1695 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
1696 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1697 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
1698 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1699 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
1700 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1701 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
1702 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1703 // CHECK1:       omp.precond.then:
1704 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1705 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1706 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
1707 // CHECK1-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1708 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
1709 // CHECK1-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1710 // CHECK1-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
1711 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1712 // CHECK1-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
1713 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1714 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1715 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1716 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
1717 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1718 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1719 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1720 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
1721 // CHECK1-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1722 // CHECK1:       cond.true:
1723 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1724 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1725 // CHECK1:       cond.false:
1726 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1727 // CHECK1-NEXT:    br label [[COND_END]]
1728 // CHECK1:       cond.end:
1729 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
1730 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1731 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1732 // CHECK1-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
1733 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1734 // CHECK1:       omp.inner.for.cond:
1735 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1736 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1737 // CHECK1-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
1738 // CHECK1-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1739 // CHECK1:       omp.inner.for.body:
1740 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1741 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
1742 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1743 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
1744 // CHECK1-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 8
1745 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
1746 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
1747 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i64 [[IDXPROM]]
1748 // CHECK1-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 8
1749 // CHECK1-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 8
1750 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
1751 // CHECK1-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
1752 // CHECK1-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM7]]
1753 // CHECK1-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX8]], align 8
1754 // CHECK1-NEXT:    [[ADD9:%.*]] = fadd double [[TMP22]], [[TMP25]]
1755 // CHECK1-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 8
1756 // CHECK1-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
1757 // CHECK1-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
1758 // CHECK1-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM10]]
1759 // CHECK1-NEXT:    store double [[ADD9]], double* [[ARRAYIDX11]], align 8
1760 // CHECK1-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[CLASS_ANON_3]], %class.anon.3* [[REF_TMP]], i32 0, i32 0
1761 // CHECK1-NEXT:    store double** [[TMP1]], double*** [[TMP28]], align 8
1762 // CHECK1-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_3]], %class.anon.3* [[REF_TMP]], i32 0, i32 1
1763 // CHECK1-NEXT:    store i32* [[I4]], i32** [[TMP29]], align 8
1764 // CHECK1-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_3]], %class.anon.3* [[REF_TMP]], i32 0, i32 2
1765 // CHECK1-NEXT:    store double** [[TMP2]], double*** [[TMP30]], align 8
1766 // CHECK1-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_3]], %class.anon.3* [[REF_TMP]], i32 0, i32 3
1767 // CHECK1-NEXT:    store double** [[TMP3]], double*** [[TMP31]], align 8
1768 // CHECK1-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE2_clEv"(%class.anon.3* noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])
1769 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1770 // CHECK1:       omp.body.continue:
1771 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1772 // CHECK1:       omp.inner.for.inc:
1773 // CHECK1-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1774 // CHECK1-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP32]], 1
1775 // CHECK1-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
1776 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
1777 // CHECK1:       omp.inner.for.end:
1778 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1779 // CHECK1:       omp.loop.exit:
1780 // CHECK1-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1781 // CHECK1-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
1782 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
1783 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
1784 // CHECK1:       omp.precond.end:
1785 // CHECK1-NEXT:    ret void
1786 //
1787 //
1788 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l267
1789 // CHECK1-SAME: (i64 noundef [[CH:%.*]], i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
1790 // CHECK1-NEXT:  entry:
1791 // CHECK1-NEXT:    [[CH_ADDR:%.*]] = alloca i64, align 8
1792 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
1793 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
1794 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
1795 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
1796 // CHECK1-NEXT:    store i64 [[CH]], i64* [[CH_ADDR]], align 8
1797 // CHECK1-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
1798 // CHECK1-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
1799 // CHECK1-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
1800 // CHECK1-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
1801 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[CH_ADDR]] to i32*
1802 // CHECK1-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
1803 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..14 to void (i32*, i32*, ...)*), i32* [[CONV]], i32* [[CONV1]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
1804 // CHECK1-NEXT:    ret void
1805 //
1806 //
1807 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..14
1808 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
1809 // CHECK1-NEXT:  entry:
1810 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1811 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1812 // CHECK1-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 8
1813 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
1814 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
1815 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
1816 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
1817 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1818 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1819 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1820 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1821 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
1822 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1823 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1824 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1825 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1826 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1827 // CHECK1-NEXT:    [[I4:%.*]] = alloca i32, align 4
1828 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
1829 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1830 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1831 // CHECK1-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 8
1832 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
1833 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
1834 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
1835 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
1836 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 8
1837 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 8
1838 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 8
1839 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 8
1840 // CHECK1-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 8
1841 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
1842 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
1843 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
1844 // CHECK1-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1845 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1846 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
1847 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1848 // CHECK1-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
1849 // CHECK1-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
1850 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
1851 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1852 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
1853 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1854 // CHECK1:       omp.precond.then:
1855 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1856 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
1857 // CHECK1-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
1858 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1859 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1860 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1861 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
1862 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1863 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1864 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
1865 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
1866 // CHECK1-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1867 // CHECK1:       cond.true:
1868 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
1869 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1870 // CHECK1:       cond.false:
1871 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1872 // CHECK1-NEXT:    br label [[COND_END]]
1873 // CHECK1:       cond.end:
1874 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
1875 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1876 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1877 // CHECK1-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
1878 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1879 // CHECK1:       omp.inner.for.cond:
1880 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1881 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1882 // CHECK1-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
1883 // CHECK1-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1884 // CHECK1:       omp.inner.for.body:
1885 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1886 // CHECK1-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
1887 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1888 // CHECK1-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i64
1889 // CHECK1-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1890 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
1891 // CHECK1-NEXT:    store i32 [[TMP23]], i32* [[CONV]], align 4
1892 // CHECK1-NEXT:    [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
1893 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**, i64)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i64 [[TMP20]], i64 [[TMP22]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]], i64 [[TMP24]])
1894 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1895 // CHECK1:       omp.inner.for.inc:
1896 // CHECK1-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1897 // CHECK1-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1898 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
1899 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
1900 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
1901 // CHECK1:       omp.inner.for.end:
1902 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1903 // CHECK1:       omp.loop.exit:
1904 // CHECK1-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1905 // CHECK1-NEXT:    [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
1906 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]])
1907 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
1908 // CHECK1:       omp.precond.end:
1909 // CHECK1-NEXT:    ret void
1910 //
1911 //
1912 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..15
1913 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
1914 // CHECK1-NEXT:  entry:
1915 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1916 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1917 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1918 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1919 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
1920 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
1921 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
1922 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
1923 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
1924 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1925 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1926 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1927 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
1928 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1929 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1930 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1931 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1932 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1933 // CHECK1-NEXT:    [[I6:%.*]] = alloca i32, align 4
1934 // CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_4:%.*]], align 8
1935 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1936 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1937 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1938 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1939 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
1940 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
1941 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
1942 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
1943 // CHECK1-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
1944 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
1945 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
1946 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
1947 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
1948 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
1949 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
1950 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1951 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1952 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
1953 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1954 // CHECK1-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
1955 // CHECK1-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
1956 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
1957 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1958 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
1959 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1960 // CHECK1:       omp.precond.then:
1961 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1962 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
1963 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
1964 // CHECK1-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1965 // CHECK1-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP8]] to i32
1966 // CHECK1-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1967 // CHECK1-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP9]] to i32
1968 // CHECK1-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
1969 // CHECK1-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
1970 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1971 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1972 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[CONV]], align 4
1973 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1974 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
1975 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP12]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP10]])
1976 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
1977 // CHECK1:       omp.dispatch.cond:
1978 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1979 // CHECK1-NEXT:    [[TMP14:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1980 // CHECK1-NEXT:    [[CONV7:%.*]] = trunc i64 [[TMP14]] to i32
1981 // CHECK1-NEXT:    [[CMP8:%.*]] = icmp sgt i32 [[TMP13]], [[CONV7]]
1982 // CHECK1-NEXT:    br i1 [[CMP8]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1983 // CHECK1:       cond.true:
1984 // CHECK1-NEXT:    [[TMP15:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1985 // CHECK1-NEXT:    [[CONV9:%.*]] = trunc i64 [[TMP15]] to i32
1986 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1987 // CHECK1:       cond.false:
1988 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1989 // CHECK1-NEXT:    br label [[COND_END]]
1990 // CHECK1:       cond.end:
1991 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[CONV9]], [[COND_TRUE]] ], [ [[TMP16]], [[COND_FALSE]] ]
1992 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1993 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1994 // CHECK1-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
1995 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1996 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1997 // CHECK1-NEXT:    [[CMP10:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
1998 // CHECK1-NEXT:    br i1 [[CMP10]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
1999 // CHECK1:       omp.dispatch.body:
2000 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2001 // CHECK1:       omp.inner.for.cond:
2002 // CHECK1-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2003 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2004 // CHECK1-NEXT:    [[CMP11:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]
2005 // CHECK1-NEXT:    br i1 [[CMP11]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2006 // CHECK1:       omp.inner.for.body:
2007 // CHECK1-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2008 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP22]], 1
2009 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2010 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4
2011 // CHECK1-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP2]], align 8
2012 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I6]], align 4
2013 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP24]] to i64
2014 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM]]
2015 // CHECK1-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX]], align 8
2016 // CHECK1-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP3]], align 8
2017 // CHECK1-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I6]], align 4
2018 // CHECK1-NEXT:    [[IDXPROM12:%.*]] = sext i32 [[TMP27]] to i64
2019 // CHECK1-NEXT:    [[ARRAYIDX13:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM12]]
2020 // CHECK1-NEXT:    [[TMP28:%.*]] = load double, double* [[ARRAYIDX13]], align 8
2021 // CHECK1-NEXT:    [[ADD14:%.*]] = fadd double [[TMP25]], [[TMP28]]
2022 // CHECK1-NEXT:    [[TMP29:%.*]] = load double*, double** [[TMP1]], align 8
2023 // CHECK1-NEXT:    [[TMP30:%.*]] = load i32, i32* [[I6]], align 4
2024 // CHECK1-NEXT:    [[IDXPROM15:%.*]] = sext i32 [[TMP30]] to i64
2025 // CHECK1-NEXT:    [[ARRAYIDX16:%.*]] = getelementptr inbounds double, double* [[TMP29]], i64 [[IDXPROM15]]
2026 // CHECK1-NEXT:    store double [[ADD14]], double* [[ARRAYIDX16]], align 8
2027 // CHECK1-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_4]], %class.anon.4* [[REF_TMP]], i32 0, i32 0
2028 // CHECK1-NEXT:    store double** [[TMP1]], double*** [[TMP31]], align 8
2029 // CHECK1-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[CLASS_ANON_4]], %class.anon.4* [[REF_TMP]], i32 0, i32 1
2030 // CHECK1-NEXT:    store i32* [[I6]], i32** [[TMP32]], align 8
2031 // CHECK1-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[CLASS_ANON_4]], %class.anon.4* [[REF_TMP]], i32 0, i32 2
2032 // CHECK1-NEXT:    store double** [[TMP2]], double*** [[TMP33]], align 8
2033 // CHECK1-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[CLASS_ANON_4]], %class.anon.4* [[REF_TMP]], i32 0, i32 3
2034 // CHECK1-NEXT:    store double** [[TMP3]], double*** [[TMP34]], align 8
2035 // CHECK1-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE3_clEv"(%class.anon.4* noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])
2036 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2037 // CHECK1:       omp.body.continue:
2038 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2039 // CHECK1:       omp.inner.for.inc:
2040 // CHECK1-NEXT:    [[TMP35:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2041 // CHECK1-NEXT:    [[ADD17:%.*]] = add nsw i32 [[TMP35]], 1
2042 // CHECK1-NEXT:    store i32 [[ADD17]], i32* [[DOTOMP_IV]], align 4
2043 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
2044 // CHECK1:       omp.inner.for.end:
2045 // CHECK1-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
2046 // CHECK1:       omp.dispatch.inc:
2047 // CHECK1-NEXT:    [[TMP36:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2048 // CHECK1-NEXT:    [[TMP37:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2049 // CHECK1-NEXT:    [[ADD18:%.*]] = add nsw i32 [[TMP36]], [[TMP37]]
2050 // CHECK1-NEXT:    store i32 [[ADD18]], i32* [[DOTOMP_LB]], align 4
2051 // CHECK1-NEXT:    [[TMP38:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2052 // CHECK1-NEXT:    [[TMP39:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2053 // CHECK1-NEXT:    [[ADD19:%.*]] = add nsw i32 [[TMP38]], [[TMP39]]
2054 // CHECK1-NEXT:    store i32 [[ADD19]], i32* [[DOTOMP_UB]], align 4
2055 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND]]
2056 // CHECK1:       omp.dispatch.end:
2057 // CHECK1-NEXT:    [[TMP40:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2058 // CHECK1-NEXT:    [[TMP41:%.*]] = load i32, i32* [[TMP40]], align 4
2059 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP41]])
2060 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
2061 // CHECK1:       omp.precond.end:
2062 // CHECK1-NEXT:    ret void
2063 //
2064 //
2065 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l300
2066 // CHECK1-SAME: (i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
2067 // CHECK1-NEXT:  entry:
2068 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
2069 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
2070 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
2071 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
2072 // CHECK1-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
2073 // CHECK1-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
2074 // CHECK1-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
2075 // CHECK1-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
2076 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
2077 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..18 to void (i32*, i32*, ...)*), i32* [[CONV]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
2078 // CHECK1-NEXT:    ret void
2079 //
2080 //
2081 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..18
2082 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
2083 // CHECK1-NEXT:  entry:
2084 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2085 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2086 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
2087 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
2088 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
2089 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
2090 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2091 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2092 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2093 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2094 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
2095 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2096 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2097 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2098 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2099 // CHECK1-NEXT:    [[I3:%.*]] = alloca i32, align 4
2100 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2101 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2102 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
2103 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
2104 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
2105 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
2106 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
2107 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
2108 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
2109 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
2110 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
2111 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
2112 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2113 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
2114 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2115 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2116 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2117 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
2118 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2119 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
2120 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2121 // CHECK1:       omp.precond.then:
2122 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2123 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2124 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
2125 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2126 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2127 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2128 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
2129 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2130 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2131 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2132 // CHECK1-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
2133 // CHECK1-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2134 // CHECK1:       cond.true:
2135 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2136 // CHECK1-NEXT:    br label [[COND_END:%.*]]
2137 // CHECK1:       cond.false:
2138 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2139 // CHECK1-NEXT:    br label [[COND_END]]
2140 // CHECK1:       cond.end:
2141 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
2142 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2143 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2144 // CHECK1-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
2145 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2146 // CHECK1:       omp.inner.for.cond:
2147 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2148 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2149 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
2150 // CHECK1-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2151 // CHECK1:       omp.inner.for.body:
2152 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2153 // CHECK1-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
2154 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2155 // CHECK1-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
2156 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
2157 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2158 // CHECK1:       omp.inner.for.inc:
2159 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2160 // CHECK1-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2161 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
2162 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
2163 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
2164 // CHECK1:       omp.inner.for.end:
2165 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2166 // CHECK1:       omp.loop.exit:
2167 // CHECK1-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2168 // CHECK1-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
2169 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
2170 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
2171 // CHECK1:       omp.precond.end:
2172 // CHECK1-NEXT:    ret void
2173 //
2174 //
2175 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..19
2176 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
2177 // CHECK1-NEXT:  entry:
2178 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2179 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2180 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
2181 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
2182 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
2183 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
2184 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
2185 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
2186 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2187 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2188 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2189 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2190 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
2191 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2192 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2193 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2194 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2195 // CHECK1-NEXT:    [[I4:%.*]] = alloca i32, align 4
2196 // CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_5:%.*]], align 8
2197 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2198 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2199 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2200 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2201 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
2202 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
2203 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
2204 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
2205 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
2206 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
2207 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
2208 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
2209 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
2210 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
2211 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2212 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
2213 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2214 // CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2215 // CHECK1-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2216 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
2217 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2218 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
2219 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2220 // CHECK1:       omp.precond.then:
2221 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2222 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2223 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
2224 // CHECK1-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2225 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
2226 // CHECK1-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2227 // CHECK1-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
2228 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
2229 // CHECK1-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
2230 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2231 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2232 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2233 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2234 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2235 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
2236 // CHECK1-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 35, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 1)
2237 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
2238 // CHECK1:       omp.dispatch.cond:
2239 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2240 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
2241 // CHECK1-NEXT:    [[TMP16:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP15]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
2242 // CHECK1-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
2243 // CHECK1-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
2244 // CHECK1:       omp.dispatch.body:
2245 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2246 // CHECK1-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
2247 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2248 // CHECK1:       omp.inner.for.cond:
2249 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
2250 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !12
2251 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
2252 // CHECK1-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2253 // CHECK1:       omp.inner.for.body:
2254 // CHECK1-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
2255 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
2256 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2257 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !12
2258 // CHECK1-NEXT:    [[TMP21:%.*]] = load double*, double** [[TMP2]], align 8, !llvm.access.group !12
2259 // CHECK1-NEXT:    [[TMP22:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !12
2260 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP22]] to i64
2261 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP21]], i64 [[IDXPROM]]
2262 // CHECK1-NEXT:    [[TMP23:%.*]] = load double, double* [[ARRAYIDX]], align 8, !llvm.access.group !12
2263 // CHECK1-NEXT:    [[TMP24:%.*]] = load double*, double** [[TMP3]], align 8, !llvm.access.group !12
2264 // CHECK1-NEXT:    [[TMP25:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !12
2265 // CHECK1-NEXT:    [[IDXPROM6:%.*]] = sext i32 [[TMP25]] to i64
2266 // CHECK1-NEXT:    [[ARRAYIDX7:%.*]] = getelementptr inbounds double, double* [[TMP24]], i64 [[IDXPROM6]]
2267 // CHECK1-NEXT:    [[TMP26:%.*]] = load double, double* [[ARRAYIDX7]], align 8, !llvm.access.group !12
2268 // CHECK1-NEXT:    [[ADD8:%.*]] = fadd double [[TMP23]], [[TMP26]]
2269 // CHECK1-NEXT:    [[TMP27:%.*]] = load double*, double** [[TMP1]], align 8, !llvm.access.group !12
2270 // CHECK1-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !12
2271 // CHECK1-NEXT:    [[IDXPROM9:%.*]] = sext i32 [[TMP28]] to i64
2272 // CHECK1-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds double, double* [[TMP27]], i64 [[IDXPROM9]]
2273 // CHECK1-NEXT:    store double [[ADD8]], double* [[ARRAYIDX10]], align 8, !llvm.access.group !12
2274 // CHECK1-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_5]], %class.anon.5* [[REF_TMP]], i32 0, i32 0
2275 // CHECK1-NEXT:    store double** [[TMP1]], double*** [[TMP29]], align 8, !llvm.access.group !12
2276 // CHECK1-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_5]], %class.anon.5* [[REF_TMP]], i32 0, i32 1
2277 // CHECK1-NEXT:    store i32* [[I4]], i32** [[TMP30]], align 8, !llvm.access.group !12
2278 // CHECK1-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_5]], %class.anon.5* [[REF_TMP]], i32 0, i32 2
2279 // CHECK1-NEXT:    store double** [[TMP2]], double*** [[TMP31]], align 8, !llvm.access.group !12
2280 // CHECK1-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[CLASS_ANON_5]], %class.anon.5* [[REF_TMP]], i32 0, i32 3
2281 // CHECK1-NEXT:    store double** [[TMP3]], double*** [[TMP32]], align 8, !llvm.access.group !12
2282 // CHECK1-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE4_clEv"(%class.anon.5* noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]), !llvm.access.group !12
2283 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2284 // CHECK1:       omp.body.continue:
2285 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2286 // CHECK1:       omp.inner.for.inc:
2287 // CHECK1-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
2288 // CHECK1-NEXT:    [[ADD11:%.*]] = add nsw i32 [[TMP33]], 1
2289 // CHECK1-NEXT:    store i32 [[ADD11]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
2290 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]
2291 // CHECK1:       omp.inner.for.end:
2292 // CHECK1-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
2293 // CHECK1:       omp.dispatch.inc:
2294 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND]]
2295 // CHECK1:       omp.dispatch.end:
2296 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
2297 // CHECK1:       omp.precond.end:
2298 // CHECK1-NEXT:    ret void
2299 //
2300 //
2301 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l329
2302 // CHECK1-SAME: (i64 noundef [[CH:%.*]], i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
2303 // CHECK1-NEXT:  entry:
2304 // CHECK1-NEXT:    [[CH_ADDR:%.*]] = alloca i64, align 8
2305 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
2306 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
2307 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
2308 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
2309 // CHECK1-NEXT:    store i64 [[CH]], i64* [[CH_ADDR]], align 8
2310 // CHECK1-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
2311 // CHECK1-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
2312 // CHECK1-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
2313 // CHECK1-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
2314 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[CH_ADDR]] to i32*
2315 // CHECK1-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
2316 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..22 to void (i32*, i32*, ...)*), i32* [[CONV]], i32* [[CONV1]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
2317 // CHECK1-NEXT:    ret void
2318 //
2319 //
2320 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..22
2321 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR2]] {
2322 // CHECK1-NEXT:  entry:
2323 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2324 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2325 // CHECK1-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 8
2326 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
2327 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
2328 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
2329 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
2330 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2331 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2332 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2333 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2334 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
2335 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
2336 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2337 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2338 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2339 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2340 // CHECK1-NEXT:    [[I4:%.*]] = alloca i32, align 4
2341 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
2342 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2343 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2344 // CHECK1-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 8
2345 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
2346 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
2347 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
2348 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
2349 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 8
2350 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 8
2351 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 8
2352 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 8
2353 // CHECK1-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 8
2354 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
2355 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
2356 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
2357 // CHECK1-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2358 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2359 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
2360 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2361 // CHECK1-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
2362 // CHECK1-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
2363 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
2364 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2365 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
2366 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2367 // CHECK1:       omp.precond.then:
2368 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2369 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
2370 // CHECK1-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
2371 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2372 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2373 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2374 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
2375 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2376 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2377 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
2378 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
2379 // CHECK1-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2380 // CHECK1:       cond.true:
2381 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
2382 // CHECK1-NEXT:    br label [[COND_END:%.*]]
2383 // CHECK1:       cond.false:
2384 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2385 // CHECK1-NEXT:    br label [[COND_END]]
2386 // CHECK1:       cond.end:
2387 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
2388 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2389 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2390 // CHECK1-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
2391 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2392 // CHECK1:       omp.inner.for.cond:
2393 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2394 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2395 // CHECK1-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
2396 // CHECK1-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2397 // CHECK1:       omp.inner.for.body:
2398 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2399 // CHECK1-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
2400 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2401 // CHECK1-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i64
2402 // CHECK1-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2403 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
2404 // CHECK1-NEXT:    store i32 [[TMP23]], i32* [[CONV]], align 4
2405 // CHECK1-NEXT:    [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
2406 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**, i64)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i64 [[TMP20]], i64 [[TMP22]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]], i64 [[TMP24]])
2407 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2408 // CHECK1:       omp.inner.for.inc:
2409 // CHECK1-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2410 // CHECK1-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2411 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
2412 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
2413 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
2414 // CHECK1:       omp.inner.for.end:
2415 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2416 // CHECK1:       omp.loop.exit:
2417 // CHECK1-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2418 // CHECK1-NEXT:    [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
2419 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]])
2420 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
2421 // CHECK1:       omp.precond.end:
2422 // CHECK1-NEXT:    ret void
2423 //
2424 //
2425 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..23
2426 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
2427 // CHECK1-NEXT:  entry:
2428 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2429 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2430 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
2431 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
2432 // CHECK1-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
2433 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
2434 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
2435 // CHECK1-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
2436 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
2437 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2438 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2439 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2440 // CHECK1-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
2441 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
2442 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2443 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2444 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2445 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2446 // CHECK1-NEXT:    [[I6:%.*]] = alloca i32, align 4
2447 // CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_6:%.*]], align 8
2448 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2449 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2450 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2451 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2452 // CHECK1-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
2453 // CHECK1-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
2454 // CHECK1-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
2455 // CHECK1-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
2456 // CHECK1-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
2457 // CHECK1-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
2458 // CHECK1-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
2459 // CHECK1-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
2460 // CHECK1-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
2461 // CHECK1-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
2462 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
2463 // CHECK1-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2464 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2465 // CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
2466 // CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2467 // CHECK1-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
2468 // CHECK1-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
2469 // CHECK1-NEXT:    store i32 0, i32* [[I]], align 4
2470 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2471 // CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
2472 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2473 // CHECK1:       omp.precond.then:
2474 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2475 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
2476 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
2477 // CHECK1-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2478 // CHECK1-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP8]] to i32
2479 // CHECK1-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2480 // CHECK1-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP9]] to i32
2481 // CHECK1-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
2482 // CHECK1-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
2483 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2484 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2485 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[CONV]], align 4
2486 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2487 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2488 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2489 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
2490 // CHECK1-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32 35, i32 [[TMP11]], i32 [[TMP12]], i32 1, i32 [[TMP10]])
2491 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
2492 // CHECK1:       omp.dispatch.cond:
2493 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2494 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
2495 // CHECK1-NEXT:    [[TMP17:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP16]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
2496 // CHECK1-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP17]], 0
2497 // CHECK1-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
2498 // CHECK1:       omp.dispatch.body:
2499 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2500 // CHECK1-NEXT:    store i32 [[TMP18]], i32* [[DOTOMP_IV]], align 4
2501 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2502 // CHECK1:       omp.inner.for.cond:
2503 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !15
2504 // CHECK1-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !15
2505 // CHECK1-NEXT:    [[CMP7:%.*]] = icmp sle i32 [[TMP19]], [[TMP20]]
2506 // CHECK1-NEXT:    br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2507 // CHECK1:       omp.inner.for.body:
2508 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !15
2509 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP21]], 1
2510 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2511 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4, !llvm.access.group !15
2512 // CHECK1-NEXT:    [[TMP22:%.*]] = load double*, double** [[TMP2]], align 8, !llvm.access.group !15
2513 // CHECK1-NEXT:    [[TMP23:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !15
2514 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP23]] to i64
2515 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP22]], i64 [[IDXPROM]]
2516 // CHECK1-NEXT:    [[TMP24:%.*]] = load double, double* [[ARRAYIDX]], align 8, !llvm.access.group !15
2517 // CHECK1-NEXT:    [[TMP25:%.*]] = load double*, double** [[TMP3]], align 8, !llvm.access.group !15
2518 // CHECK1-NEXT:    [[TMP26:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !15
2519 // CHECK1-NEXT:    [[IDXPROM8:%.*]] = sext i32 [[TMP26]] to i64
2520 // CHECK1-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds double, double* [[TMP25]], i64 [[IDXPROM8]]
2521 // CHECK1-NEXT:    [[TMP27:%.*]] = load double, double* [[ARRAYIDX9]], align 8, !llvm.access.group !15
2522 // CHECK1-NEXT:    [[ADD10:%.*]] = fadd double [[TMP24]], [[TMP27]]
2523 // CHECK1-NEXT:    [[TMP28:%.*]] = load double*, double** [[TMP1]], align 8, !llvm.access.group !15
2524 // CHECK1-NEXT:    [[TMP29:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !15
2525 // CHECK1-NEXT:    [[IDXPROM11:%.*]] = sext i32 [[TMP29]] to i64
2526 // CHECK1-NEXT:    [[ARRAYIDX12:%.*]] = getelementptr inbounds double, double* [[TMP28]], i64 [[IDXPROM11]]
2527 // CHECK1-NEXT:    store double [[ADD10]], double* [[ARRAYIDX12]], align 8, !llvm.access.group !15
2528 // CHECK1-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_6]], %class.anon.6* [[REF_TMP]], i32 0, i32 0
2529 // CHECK1-NEXT:    store double** [[TMP1]], double*** [[TMP30]], align 8, !llvm.access.group !15
2530 // CHECK1-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_6]], %class.anon.6* [[REF_TMP]], i32 0, i32 1
2531 // CHECK1-NEXT:    store i32* [[I6]], i32** [[TMP31]], align 8, !llvm.access.group !15
2532 // CHECK1-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[CLASS_ANON_6]], %class.anon.6* [[REF_TMP]], i32 0, i32 2
2533 // CHECK1-NEXT:    store double** [[TMP2]], double*** [[TMP32]], align 8, !llvm.access.group !15
2534 // CHECK1-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[CLASS_ANON_6]], %class.anon.6* [[REF_TMP]], i32 0, i32 3
2535 // CHECK1-NEXT:    store double** [[TMP3]], double*** [[TMP33]], align 8, !llvm.access.group !15
2536 // CHECK1-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE5_clEv"(%class.anon.6* noundef nonnull align 8 dereferenceable(32) [[REF_TMP]]), !llvm.access.group !15
2537 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2538 // CHECK1:       omp.body.continue:
2539 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2540 // CHECK1:       omp.inner.for.inc:
2541 // CHECK1-NEXT:    [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !15
2542 // CHECK1-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP34]], 1
2543 // CHECK1-NEXT:    store i32 [[ADD13]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !15
2544 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP16:![0-9]+]]
2545 // CHECK1:       omp.inner.for.end:
2546 // CHECK1-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
2547 // CHECK1:       omp.dispatch.inc:
2548 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND]]
2549 // CHECK1:       omp.dispatch.end:
2550 // CHECK1-NEXT:    br label [[OMP_PRECOND_END]]
2551 // CHECK1:       omp.precond.end:
2552 // CHECK1-NEXT:    ret void
2553 //
2554 //
2555 // CHECK1-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
2556 // CHECK1-SAME: () #[[ATTR4:[0-9]+]] {
2557 // CHECK1-NEXT:  entry:
2558 // CHECK1-NEXT:    call void @__tgt_register_requires(i64 1)
2559 // CHECK1-NEXT:    ret void
2560 //
2561 //
2562 // CHECK3-LABEL: define {{[^@]+}}@main
2563 // CHECK3-SAME: () #[[ATTR0:[0-9]+]] {
2564 // CHECK3-NEXT:  entry:
2565 // CHECK3-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
2566 // CHECK3-NEXT:    [[A:%.*]] = alloca double*, align 4
2567 // CHECK3-NEXT:    [[B:%.*]] = alloca double*, align 4
2568 // CHECK3-NEXT:    [[C:%.*]] = alloca double*, align 4
2569 // CHECK3-NEXT:    [[N:%.*]] = alloca i32, align 4
2570 // CHECK3-NEXT:    [[CH:%.*]] = alloca i32, align 4
2571 // CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 4
2572 // CHECK3-NEXT:    store i32 0, i32* [[RETVAL]], align 4
2573 // CHECK3-NEXT:    store i32 10000, i32* [[N]], align 4
2574 // CHECK3-NEXT:    store i32 100, i32* [[CH]], align 4
2575 // CHECK3-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 0
2576 // CHECK3-NEXT:    store i32* [[N]], i32** [[TMP0]], align 4
2577 // CHECK3-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 1
2578 // CHECK3-NEXT:    store double** [[A]], double*** [[TMP1]], align 4
2579 // CHECK3-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 2
2580 // CHECK3-NEXT:    store double** [[B]], double*** [[TMP2]], align 4
2581 // CHECK3-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 3
2582 // CHECK3-NEXT:    store double** [[C]], double*** [[TMP3]], align 4
2583 // CHECK3-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 4
2584 // CHECK3-NEXT:    store i32* [[CH]], i32** [[TMP4]], align 4
2585 // CHECK3-NEXT:    call void @"_ZZ4mainENK3$_0clEv"(%class.anon* noundef nonnull align 4 dereferenceable(20) [[REF_TMP]])
2586 // CHECK3-NEXT:    ret i32 0
2587 //
2588 //
2589 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l117
2590 // CHECK3-SAME: (i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2:[0-9]+]] {
2591 // CHECK3-NEXT:  entry:
2592 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
2593 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
2594 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
2595 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
2596 // CHECK3-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
2597 // CHECK3-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
2598 // CHECK3-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
2599 // CHECK3-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
2600 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
2601 // CHECK3-NEXT:    ret void
2602 //
2603 //
2604 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined.
2605 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
2606 // CHECK3-NEXT:  entry:
2607 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2608 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2609 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
2610 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
2611 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
2612 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
2613 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2614 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2615 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2616 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2617 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
2618 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2619 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2620 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2621 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2622 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
2623 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2624 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2625 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
2626 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
2627 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
2628 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
2629 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
2630 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
2631 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
2632 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
2633 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
2634 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
2635 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2636 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
2637 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2638 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2639 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2640 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
2641 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2642 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
2643 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2644 // CHECK3:       omp.precond.then:
2645 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2646 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2647 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
2648 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2649 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2650 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2651 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
2652 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2653 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2654 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2655 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
2656 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2657 // CHECK3:       cond.true:
2658 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2659 // CHECK3-NEXT:    br label [[COND_END:%.*]]
2660 // CHECK3:       cond.false:
2661 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2662 // CHECK3-NEXT:    br label [[COND_END]]
2663 // CHECK3:       cond.end:
2664 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
2665 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2666 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2667 // CHECK3-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
2668 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2669 // CHECK3:       omp.inner.for.cond:
2670 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2671 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2672 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
2673 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2674 // CHECK3:       omp.inner.for.body:
2675 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2676 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2677 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
2678 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2679 // CHECK3:       omp.inner.for.inc:
2680 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2681 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2682 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
2683 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
2684 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
2685 // CHECK3:       omp.inner.for.end:
2686 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2687 // CHECK3:       omp.loop.exit:
2688 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2689 // CHECK3-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
2690 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
2691 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
2692 // CHECK3:       omp.precond.end:
2693 // CHECK3-NEXT:    ret void
2694 //
2695 //
2696 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..1
2697 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
2698 // CHECK3-NEXT:  entry:
2699 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2700 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2701 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
2702 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
2703 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
2704 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
2705 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
2706 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
2707 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2708 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2709 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2710 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2711 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
2712 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2713 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2714 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2715 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2716 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
2717 // CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 4
2718 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2719 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2720 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2721 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2722 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
2723 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
2724 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
2725 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
2726 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
2727 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
2728 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
2729 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
2730 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
2731 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
2732 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2733 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
2734 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2735 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2736 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2737 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
2738 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2739 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
2740 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2741 // CHECK3:       omp.precond.then:
2742 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2743 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2744 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
2745 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2746 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2747 // CHECK3-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
2748 // CHECK3-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
2749 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2750 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2751 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2752 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
2753 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2754 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2755 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2756 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
2757 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2758 // CHECK3:       cond.true:
2759 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2760 // CHECK3-NEXT:    br label [[COND_END:%.*]]
2761 // CHECK3:       cond.false:
2762 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2763 // CHECK3-NEXT:    br label [[COND_END]]
2764 // CHECK3:       cond.end:
2765 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
2766 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
2767 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2768 // CHECK3-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
2769 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2770 // CHECK3:       omp.inner.for.cond:
2771 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2772 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2773 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
2774 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2775 // CHECK3:       omp.inner.for.body:
2776 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2777 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
2778 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2779 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
2780 // CHECK3-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 4
2781 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
2782 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i32 [[TMP21]]
2783 // CHECK3-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 4
2784 // CHECK3-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 4
2785 // CHECK3-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
2786 // CHECK3-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
2787 // CHECK3-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX6]], align 4
2788 // CHECK3-NEXT:    [[ADD7:%.*]] = fadd double [[TMP22]], [[TMP25]]
2789 // CHECK3-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 4
2790 // CHECK3-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
2791 // CHECK3-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
2792 // CHECK3-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4
2793 // CHECK3-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], %class.anon.0* [[REF_TMP]], i32 0, i32 0
2794 // CHECK3-NEXT:    store double** [[TMP1]], double*** [[TMP28]], align 4
2795 // CHECK3-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], %class.anon.0* [[REF_TMP]], i32 0, i32 1
2796 // CHECK3-NEXT:    store i32* [[I3]], i32** [[TMP29]], align 4
2797 // CHECK3-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], %class.anon.0* [[REF_TMP]], i32 0, i32 2
2798 // CHECK3-NEXT:    store double** [[TMP2]], double*** [[TMP30]], align 4
2799 // CHECK3-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_0]], %class.anon.0* [[REF_TMP]], i32 0, i32 3
2800 // CHECK3-NEXT:    store double** [[TMP3]], double*** [[TMP31]], align 4
2801 // CHECK3-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE_clEv"(%class.anon.0* noundef nonnull align 4 dereferenceable(16) [[REF_TMP]])
2802 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2803 // CHECK3:       omp.body.continue:
2804 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2805 // CHECK3:       omp.inner.for.inc:
2806 // CHECK3-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2807 // CHECK3-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP32]], 1
2808 // CHECK3-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
2809 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
2810 // CHECK3:       omp.inner.for.end:
2811 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2812 // CHECK3:       omp.loop.exit:
2813 // CHECK3-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2814 // CHECK3-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
2815 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
2816 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
2817 // CHECK3:       omp.precond.end:
2818 // CHECK3-NEXT:    ret void
2819 //
2820 //
2821 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l160
2822 // CHECK3-SAME: (i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
2823 // CHECK3-NEXT:  entry:
2824 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
2825 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
2826 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
2827 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
2828 // CHECK3-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
2829 // CHECK3-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
2830 // CHECK3-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
2831 // CHECK3-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
2832 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
2833 // CHECK3-NEXT:    ret void
2834 //
2835 //
2836 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..2
2837 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
2838 // CHECK3-NEXT:  entry:
2839 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2840 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2841 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
2842 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
2843 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
2844 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
2845 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2846 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2847 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2848 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2849 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
2850 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2851 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2852 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2853 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2854 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
2855 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2856 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2857 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
2858 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
2859 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
2860 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
2861 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
2862 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
2863 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
2864 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
2865 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
2866 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
2867 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2868 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
2869 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2870 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2871 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2872 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
2873 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2874 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
2875 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2876 // CHECK3:       omp.precond.then:
2877 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2878 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2879 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
2880 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2881 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2882 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2883 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
2884 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2885 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2886 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2887 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
2888 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2889 // CHECK3:       cond.true:
2890 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2891 // CHECK3-NEXT:    br label [[COND_END:%.*]]
2892 // CHECK3:       cond.false:
2893 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2894 // CHECK3-NEXT:    br label [[COND_END]]
2895 // CHECK3:       cond.end:
2896 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
2897 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2898 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2899 // CHECK3-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
2900 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2901 // CHECK3:       omp.inner.for.cond:
2902 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2903 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2904 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
2905 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2906 // CHECK3:       omp.inner.for.body:
2907 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2908 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2909 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
2910 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2911 // CHECK3:       omp.inner.for.inc:
2912 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2913 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2914 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
2915 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
2916 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
2917 // CHECK3:       omp.inner.for.end:
2918 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2919 // CHECK3:       omp.loop.exit:
2920 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2921 // CHECK3-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
2922 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
2923 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
2924 // CHECK3:       omp.precond.end:
2925 // CHECK3-NEXT:    ret void
2926 //
2927 //
2928 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..3
2929 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
2930 // CHECK3-NEXT:  entry:
2931 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2932 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2933 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
2934 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
2935 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
2936 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
2937 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
2938 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
2939 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2940 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2941 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2942 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2943 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
2944 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2945 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2946 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2947 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2948 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
2949 // CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_1:%.*]], align 4
2950 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2951 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2952 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2953 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2954 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
2955 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
2956 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
2957 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
2958 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
2959 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
2960 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
2961 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
2962 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
2963 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
2964 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2965 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
2966 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2967 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2968 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2969 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
2970 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2971 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
2972 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2973 // CHECK3:       omp.precond.then:
2974 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2975 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2976 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
2977 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2978 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2979 // CHECK3-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
2980 // CHECK3-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
2981 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2982 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2983 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2984 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
2985 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2986 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2987 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2988 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
2989 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2990 // CHECK3:       cond.true:
2991 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2992 // CHECK3-NEXT:    br label [[COND_END:%.*]]
2993 // CHECK3:       cond.false:
2994 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2995 // CHECK3-NEXT:    br label [[COND_END]]
2996 // CHECK3:       cond.end:
2997 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
2998 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
2999 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3000 // CHECK3-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
3001 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3002 // CHECK3:       omp.inner.for.cond:
3003 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3004 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3005 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
3006 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3007 // CHECK3:       omp.inner.for.body:
3008 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3009 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
3010 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3011 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
3012 // CHECK3-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 4
3013 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
3014 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i32 [[TMP21]]
3015 // CHECK3-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 4
3016 // CHECK3-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 4
3017 // CHECK3-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
3018 // CHECK3-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
3019 // CHECK3-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX6]], align 4
3020 // CHECK3-NEXT:    [[ADD7:%.*]] = fadd double [[TMP22]], [[TMP25]]
3021 // CHECK3-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 4
3022 // CHECK3-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
3023 // CHECK3-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
3024 // CHECK3-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4
3025 // CHECK3-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], %class.anon.1* [[REF_TMP]], i32 0, i32 0
3026 // CHECK3-NEXT:    store double** [[TMP1]], double*** [[TMP28]], align 4
3027 // CHECK3-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], %class.anon.1* [[REF_TMP]], i32 0, i32 1
3028 // CHECK3-NEXT:    store i32* [[I3]], i32** [[TMP29]], align 4
3029 // CHECK3-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], %class.anon.1* [[REF_TMP]], i32 0, i32 2
3030 // CHECK3-NEXT:    store double** [[TMP2]], double*** [[TMP30]], align 4
3031 // CHECK3-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_1]], %class.anon.1* [[REF_TMP]], i32 0, i32 3
3032 // CHECK3-NEXT:    store double** [[TMP3]], double*** [[TMP31]], align 4
3033 // CHECK3-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE0_clEv"(%class.anon.1* noundef nonnull align 4 dereferenceable(16) [[REF_TMP]])
3034 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3035 // CHECK3:       omp.body.continue:
3036 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3037 // CHECK3:       omp.inner.for.inc:
3038 // CHECK3-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3039 // CHECK3-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP32]], 1
3040 // CHECK3-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
3041 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
3042 // CHECK3:       omp.inner.for.end:
3043 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3044 // CHECK3:       omp.loop.exit:
3045 // CHECK3-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3046 // CHECK3-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
3047 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
3048 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
3049 // CHECK3:       omp.precond.end:
3050 // CHECK3-NEXT:    ret void
3051 //
3052 //
3053 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l202
3054 // CHECK3-SAME: (i32 noundef [[CH:%.*]], i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
3055 // CHECK3-NEXT:  entry:
3056 // CHECK3-NEXT:    [[CH_ADDR:%.*]] = alloca i32, align 4
3057 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
3058 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
3059 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
3060 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
3061 // CHECK3-NEXT:    store i32 [[CH]], i32* [[CH_ADDR]], align 4
3062 // CHECK3-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
3063 // CHECK3-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
3064 // CHECK3-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
3065 // CHECK3-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
3066 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* [[CH_ADDR]], i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
3067 // CHECK3-NEXT:    ret void
3068 //
3069 //
3070 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..6
3071 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
3072 // CHECK3-NEXT:  entry:
3073 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3074 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3075 // CHECK3-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 4
3076 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
3077 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
3078 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
3079 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
3080 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3081 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3082 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3083 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3084 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
3085 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3086 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3087 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3088 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3089 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
3090 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3091 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3092 // CHECK3-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 4
3093 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
3094 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
3095 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
3096 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
3097 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 4
3098 // CHECK3-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 4
3099 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 4
3100 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 4
3101 // CHECK3-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 4
3102 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP1]], align 4
3103 // CHECK3-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
3104 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3105 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP6]], 0
3106 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3107 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
3108 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3109 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
3110 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3111 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP7]]
3112 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3113 // CHECK3:       omp.precond.then:
3114 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3115 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3116 // CHECK3-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_COMB_UB]], align 4
3117 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3118 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3119 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP0]], align 4
3120 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3121 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
3122 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP9]])
3123 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3124 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3125 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
3126 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3127 // CHECK3:       cond.true:
3128 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3129 // CHECK3-NEXT:    br label [[COND_END:%.*]]
3130 // CHECK3:       cond.false:
3131 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3132 // CHECK3-NEXT:    br label [[COND_END]]
3133 // CHECK3:       cond.end:
3134 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
3135 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3136 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3137 // CHECK3-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
3138 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3139 // CHECK3:       omp.inner.for.cond:
3140 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3141 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3142 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], 1
3143 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp slt i32 [[TMP17]], [[ADD]]
3144 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3145 // CHECK3:       omp.inner.for.body:
3146 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3147 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3148 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32 [[TMP19]], i32 [[TMP20]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]])
3149 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3150 // CHECK3:       omp.inner.for.inc:
3151 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3152 // CHECK3-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3153 // CHECK3-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
3154 // CHECK3-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
3155 // CHECK3-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3156 // CHECK3-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3157 // CHECK3-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
3158 // CHECK3-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_COMB_LB]], align 4
3159 // CHECK3-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3160 // CHECK3-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3161 // CHECK3-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
3162 // CHECK3-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_UB]], align 4
3163 // CHECK3-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3164 // CHECK3-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3165 // CHECK3-NEXT:    [[CMP9:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
3166 // CHECK3-NEXT:    br i1 [[CMP9]], label [[COND_TRUE10:%.*]], label [[COND_FALSE11:%.*]]
3167 // CHECK3:       cond.true10:
3168 // CHECK3-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3169 // CHECK3-NEXT:    br label [[COND_END12:%.*]]
3170 // CHECK3:       cond.false11:
3171 // CHECK3-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3172 // CHECK3-NEXT:    br label [[COND_END12]]
3173 // CHECK3:       cond.end12:
3174 // CHECK3-NEXT:    [[COND13:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE10]] ], [ [[TMP30]], [[COND_FALSE11]] ]
3175 // CHECK3-NEXT:    store i32 [[COND13]], i32* [[DOTOMP_COMB_UB]], align 4
3176 // CHECK3-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3177 // CHECK3-NEXT:    store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4
3178 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
3179 // CHECK3:       omp.inner.for.end:
3180 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3181 // CHECK3:       omp.loop.exit:
3182 // CHECK3-NEXT:    [[TMP32:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3183 // CHECK3-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
3184 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]])
3185 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
3186 // CHECK3:       omp.precond.end:
3187 // CHECK3-NEXT:    ret void
3188 //
3189 //
3190 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..7
3191 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
3192 // CHECK3-NEXT:  entry:
3193 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3194 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3195 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
3196 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
3197 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
3198 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
3199 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
3200 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
3201 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3202 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3203 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3204 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3205 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
3206 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3207 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3208 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3209 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3210 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
3211 // CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_2:%.*]], align 4
3212 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3213 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3214 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3215 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3216 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
3217 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
3218 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
3219 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
3220 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
3221 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
3222 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
3223 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
3224 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
3225 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
3226 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3227 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
3228 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3229 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
3230 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3231 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
3232 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3233 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
3234 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3235 // CHECK3:       omp.precond.then:
3236 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3237 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3238 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
3239 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3240 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3241 // CHECK3-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
3242 // CHECK3-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
3243 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3244 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3245 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3246 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
3247 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3248 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3249 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3250 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
3251 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3252 // CHECK3:       cond.true:
3253 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3254 // CHECK3-NEXT:    br label [[COND_END:%.*]]
3255 // CHECK3:       cond.false:
3256 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3257 // CHECK3-NEXT:    br label [[COND_END]]
3258 // CHECK3:       cond.end:
3259 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
3260 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3261 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3262 // CHECK3-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
3263 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3264 // CHECK3:       omp.inner.for.cond:
3265 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3266 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3267 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
3268 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3269 // CHECK3:       omp.inner.for.body:
3270 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3271 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
3272 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3273 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
3274 // CHECK3-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 4
3275 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
3276 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i32 [[TMP21]]
3277 // CHECK3-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 4
3278 // CHECK3-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 4
3279 // CHECK3-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
3280 // CHECK3-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
3281 // CHECK3-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX6]], align 4
3282 // CHECK3-NEXT:    [[ADD7:%.*]] = fadd double [[TMP22]], [[TMP25]]
3283 // CHECK3-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 4
3284 // CHECK3-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
3285 // CHECK3-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
3286 // CHECK3-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4
3287 // CHECK3-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[CLASS_ANON_2]], %class.anon.2* [[REF_TMP]], i32 0, i32 0
3288 // CHECK3-NEXT:    store double** [[TMP1]], double*** [[TMP28]], align 4
3289 // CHECK3-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_2]], %class.anon.2* [[REF_TMP]], i32 0, i32 1
3290 // CHECK3-NEXT:    store i32* [[I3]], i32** [[TMP29]], align 4
3291 // CHECK3-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_2]], %class.anon.2* [[REF_TMP]], i32 0, i32 2
3292 // CHECK3-NEXT:    store double** [[TMP2]], double*** [[TMP30]], align 4
3293 // CHECK3-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_2]], %class.anon.2* [[REF_TMP]], i32 0, i32 3
3294 // CHECK3-NEXT:    store double** [[TMP3]], double*** [[TMP31]], align 4
3295 // CHECK3-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE1_clEv"(%class.anon.2* noundef nonnull align 4 dereferenceable(16) [[REF_TMP]])
3296 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3297 // CHECK3:       omp.body.continue:
3298 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3299 // CHECK3:       omp.inner.for.inc:
3300 // CHECK3-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3301 // CHECK3-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP32]], 1
3302 // CHECK3-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
3303 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
3304 // CHECK3:       omp.inner.for.end:
3305 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3306 // CHECK3:       omp.loop.exit:
3307 // CHECK3-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3308 // CHECK3-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
3309 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
3310 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
3311 // CHECK3:       omp.precond.end:
3312 // CHECK3-NEXT:    ret void
3313 //
3314 //
3315 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l235
3316 // CHECK3-SAME: (i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
3317 // CHECK3-NEXT:  entry:
3318 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
3319 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
3320 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
3321 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
3322 // CHECK3-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
3323 // CHECK3-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
3324 // CHECK3-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
3325 // CHECK3-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
3326 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..10 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
3327 // CHECK3-NEXT:    ret void
3328 //
3329 //
3330 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..10
3331 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
3332 // CHECK3-NEXT:  entry:
3333 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3334 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3335 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
3336 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
3337 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
3338 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
3339 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3340 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3341 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3342 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3343 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
3344 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3345 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3346 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3347 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3348 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
3349 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3350 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3351 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
3352 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
3353 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
3354 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
3355 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
3356 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
3357 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
3358 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
3359 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
3360 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
3361 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3362 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
3363 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3364 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
3365 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3366 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
3367 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3368 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
3369 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3370 // CHECK3:       omp.precond.then:
3371 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3372 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3373 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
3374 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3375 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3376 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3377 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
3378 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3379 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3380 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3381 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
3382 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3383 // CHECK3:       cond.true:
3384 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3385 // CHECK3-NEXT:    br label [[COND_END:%.*]]
3386 // CHECK3:       cond.false:
3387 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3388 // CHECK3-NEXT:    br label [[COND_END]]
3389 // CHECK3:       cond.end:
3390 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
3391 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3392 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3393 // CHECK3-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
3394 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3395 // CHECK3:       omp.inner.for.cond:
3396 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3397 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3398 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
3399 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3400 // CHECK3:       omp.inner.for.body:
3401 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3402 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3403 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
3404 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3405 // CHECK3:       omp.inner.for.inc:
3406 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3407 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3408 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
3409 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
3410 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
3411 // CHECK3:       omp.inner.for.end:
3412 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3413 // CHECK3:       omp.loop.exit:
3414 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3415 // CHECK3-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
3416 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
3417 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
3418 // CHECK3:       omp.precond.end:
3419 // CHECK3-NEXT:    ret void
3420 //
3421 //
3422 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..11
3423 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
3424 // CHECK3-NEXT:  entry:
3425 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3426 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3427 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
3428 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
3429 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
3430 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
3431 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
3432 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
3433 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3434 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3435 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3436 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3437 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
3438 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3439 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3440 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3441 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3442 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
3443 // CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_3:%.*]], align 4
3444 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3445 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3446 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3447 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3448 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
3449 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
3450 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
3451 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
3452 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
3453 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
3454 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
3455 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
3456 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
3457 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
3458 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3459 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
3460 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3461 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
3462 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3463 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
3464 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3465 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
3466 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3467 // CHECK3:       omp.precond.then:
3468 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3469 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3470 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
3471 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3472 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3473 // CHECK3-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
3474 // CHECK3-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
3475 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3476 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3477 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3478 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
3479 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3480 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3481 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3482 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
3483 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3484 // CHECK3:       cond.true:
3485 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3486 // CHECK3-NEXT:    br label [[COND_END:%.*]]
3487 // CHECK3:       cond.false:
3488 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3489 // CHECK3-NEXT:    br label [[COND_END]]
3490 // CHECK3:       cond.end:
3491 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
3492 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3493 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3494 // CHECK3-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
3495 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3496 // CHECK3:       omp.inner.for.cond:
3497 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3498 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3499 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
3500 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3501 // CHECK3:       omp.inner.for.body:
3502 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3503 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
3504 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3505 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
3506 // CHECK3-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 4
3507 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
3508 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i32 [[TMP21]]
3509 // CHECK3-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 4
3510 // CHECK3-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 4
3511 // CHECK3-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
3512 // CHECK3-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
3513 // CHECK3-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX6]], align 4
3514 // CHECK3-NEXT:    [[ADD7:%.*]] = fadd double [[TMP22]], [[TMP25]]
3515 // CHECK3-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 4
3516 // CHECK3-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
3517 // CHECK3-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
3518 // CHECK3-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4
3519 // CHECK3-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[CLASS_ANON_3]], %class.anon.3* [[REF_TMP]], i32 0, i32 0
3520 // CHECK3-NEXT:    store double** [[TMP1]], double*** [[TMP28]], align 4
3521 // CHECK3-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_3]], %class.anon.3* [[REF_TMP]], i32 0, i32 1
3522 // CHECK3-NEXT:    store i32* [[I3]], i32** [[TMP29]], align 4
3523 // CHECK3-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_3]], %class.anon.3* [[REF_TMP]], i32 0, i32 2
3524 // CHECK3-NEXT:    store double** [[TMP2]], double*** [[TMP30]], align 4
3525 // CHECK3-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_3]], %class.anon.3* [[REF_TMP]], i32 0, i32 3
3526 // CHECK3-NEXT:    store double** [[TMP3]], double*** [[TMP31]], align 4
3527 // CHECK3-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE2_clEv"(%class.anon.3* noundef nonnull align 4 dereferenceable(16) [[REF_TMP]])
3528 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3529 // CHECK3:       omp.body.continue:
3530 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3531 // CHECK3:       omp.inner.for.inc:
3532 // CHECK3-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3533 // CHECK3-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP32]], 1
3534 // CHECK3-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
3535 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
3536 // CHECK3:       omp.inner.for.end:
3537 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3538 // CHECK3:       omp.loop.exit:
3539 // CHECK3-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3540 // CHECK3-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
3541 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
3542 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
3543 // CHECK3:       omp.precond.end:
3544 // CHECK3-NEXT:    ret void
3545 //
3546 //
3547 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l267
3548 // CHECK3-SAME: (i32 noundef [[CH:%.*]], i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
3549 // CHECK3-NEXT:  entry:
3550 // CHECK3-NEXT:    [[CH_ADDR:%.*]] = alloca i32, align 4
3551 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
3552 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
3553 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
3554 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
3555 // CHECK3-NEXT:    store i32 [[CH]], i32* [[CH_ADDR]], align 4
3556 // CHECK3-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
3557 // CHECK3-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
3558 // CHECK3-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
3559 // CHECK3-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
3560 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..14 to void (i32*, i32*, ...)*), i32* [[CH_ADDR]], i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
3561 // CHECK3-NEXT:    ret void
3562 //
3563 //
3564 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..14
3565 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
3566 // CHECK3-NEXT:  entry:
3567 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3568 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3569 // CHECK3-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 4
3570 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
3571 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
3572 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
3573 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
3574 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3575 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3576 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3577 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3578 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
3579 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
3580 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3581 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3582 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3583 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3584 // CHECK3-NEXT:    [[I4:%.*]] = alloca i32, align 4
3585 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
3586 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3587 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3588 // CHECK3-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 4
3589 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
3590 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
3591 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
3592 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
3593 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 4
3594 // CHECK3-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 4
3595 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 4
3596 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 4
3597 // CHECK3-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 4
3598 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
3599 // CHECK3-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
3600 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
3601 // CHECK3-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3602 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3603 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
3604 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3605 // CHECK3-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
3606 // CHECK3-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
3607 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
3608 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3609 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
3610 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3611 // CHECK3:       omp.precond.then:
3612 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3613 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3614 // CHECK3-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
3615 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3616 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3617 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3618 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
3619 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3620 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3621 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3622 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
3623 // CHECK3-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3624 // CHECK3:       cond.true:
3625 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3626 // CHECK3-NEXT:    br label [[COND_END:%.*]]
3627 // CHECK3:       cond.false:
3628 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3629 // CHECK3-NEXT:    br label [[COND_END]]
3630 // CHECK3:       cond.end:
3631 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
3632 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3633 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3634 // CHECK3-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
3635 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3636 // CHECK3:       omp.inner.for.cond:
3637 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3638 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3639 // CHECK3-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
3640 // CHECK3-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3641 // CHECK3:       omp.inner.for.body:
3642 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3643 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3644 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3645 // CHECK3-NEXT:    store i32 [[TMP21]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
3646 // CHECK3-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
3647 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**, i32)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i32 [[TMP19]], i32 [[TMP20]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]], i32 [[TMP22]])
3648 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3649 // CHECK3:       omp.inner.for.inc:
3650 // CHECK3-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3651 // CHECK3-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3652 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
3653 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
3654 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
3655 // CHECK3:       omp.inner.for.end:
3656 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3657 // CHECK3:       omp.loop.exit:
3658 // CHECK3-NEXT:    [[TMP25:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3659 // CHECK3-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
3660 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP26]])
3661 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
3662 // CHECK3:       omp.precond.end:
3663 // CHECK3-NEXT:    ret void
3664 //
3665 //
3666 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..15
3667 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
3668 // CHECK3-NEXT:  entry:
3669 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3670 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3671 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
3672 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
3673 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
3674 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
3675 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
3676 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
3677 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
3678 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3679 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3680 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3681 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
3682 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
3683 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3684 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3685 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3686 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3687 // CHECK3-NEXT:    [[I4:%.*]] = alloca i32, align 4
3688 // CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_4:%.*]], align 4
3689 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3690 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3691 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3692 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3693 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
3694 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
3695 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
3696 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
3697 // CHECK3-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
3698 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
3699 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
3700 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
3701 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
3702 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
3703 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3704 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3705 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
3706 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3707 // CHECK3-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
3708 // CHECK3-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
3709 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
3710 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3711 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
3712 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3713 // CHECK3:       omp.precond.then:
3714 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3715 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3716 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
3717 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3718 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3719 // CHECK3-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
3720 // CHECK3-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
3721 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3722 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3723 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
3724 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3725 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
3726 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP12]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP10]])
3727 // CHECK3-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
3728 // CHECK3:       omp.dispatch.cond:
3729 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3730 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3731 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP13]], [[TMP14]]
3732 // CHECK3-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3733 // CHECK3:       cond.true:
3734 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3735 // CHECK3-NEXT:    br label [[COND_END:%.*]]
3736 // CHECK3:       cond.false:
3737 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3738 // CHECK3-NEXT:    br label [[COND_END]]
3739 // CHECK3:       cond.end:
3740 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP15]], [[COND_TRUE]] ], [ [[TMP16]], [[COND_FALSE]] ]
3741 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3742 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3743 // CHECK3-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
3744 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3745 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3746 // CHECK3-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
3747 // CHECK3-NEXT:    br i1 [[CMP6]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
3748 // CHECK3:       omp.dispatch.body:
3749 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3750 // CHECK3:       omp.inner.for.cond:
3751 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3752 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3753 // CHECK3-NEXT:    [[CMP7:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]
3754 // CHECK3-NEXT:    br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3755 // CHECK3:       omp.inner.for.body:
3756 // CHECK3-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3757 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP22]], 1
3758 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3759 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
3760 // CHECK3-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP2]], align 4
3761 // CHECK3-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
3762 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
3763 // CHECK3-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX]], align 4
3764 // CHECK3-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP3]], align 4
3765 // CHECK3-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
3766 // CHECK3-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
3767 // CHECK3-NEXT:    [[TMP28:%.*]] = load double, double* [[ARRAYIDX8]], align 4
3768 // CHECK3-NEXT:    [[ADD9:%.*]] = fadd double [[TMP25]], [[TMP28]]
3769 // CHECK3-NEXT:    [[TMP29:%.*]] = load double*, double** [[TMP1]], align 4
3770 // CHECK3-NEXT:    [[TMP30:%.*]] = load i32, i32* [[I4]], align 4
3771 // CHECK3-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds double, double* [[TMP29]], i32 [[TMP30]]
3772 // CHECK3-NEXT:    store double [[ADD9]], double* [[ARRAYIDX10]], align 4
3773 // CHECK3-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_4]], %class.anon.4* [[REF_TMP]], i32 0, i32 0
3774 // CHECK3-NEXT:    store double** [[TMP1]], double*** [[TMP31]], align 4
3775 // CHECK3-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[CLASS_ANON_4]], %class.anon.4* [[REF_TMP]], i32 0, i32 1
3776 // CHECK3-NEXT:    store i32* [[I4]], i32** [[TMP32]], align 4
3777 // CHECK3-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[CLASS_ANON_4]], %class.anon.4* [[REF_TMP]], i32 0, i32 2
3778 // CHECK3-NEXT:    store double** [[TMP2]], double*** [[TMP33]], align 4
3779 // CHECK3-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[CLASS_ANON_4]], %class.anon.4* [[REF_TMP]], i32 0, i32 3
3780 // CHECK3-NEXT:    store double** [[TMP3]], double*** [[TMP34]], align 4
3781 // CHECK3-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE3_clEv"(%class.anon.4* noundef nonnull align 4 dereferenceable(16) [[REF_TMP]])
3782 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3783 // CHECK3:       omp.body.continue:
3784 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3785 // CHECK3:       omp.inner.for.inc:
3786 // CHECK3-NEXT:    [[TMP35:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3787 // CHECK3-NEXT:    [[ADD11:%.*]] = add nsw i32 [[TMP35]], 1
3788 // CHECK3-NEXT:    store i32 [[ADD11]], i32* [[DOTOMP_IV]], align 4
3789 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
3790 // CHECK3:       omp.inner.for.end:
3791 // CHECK3-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
3792 // CHECK3:       omp.dispatch.inc:
3793 // CHECK3-NEXT:    [[TMP36:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3794 // CHECK3-NEXT:    [[TMP37:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3795 // CHECK3-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP36]], [[TMP37]]
3796 // CHECK3-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_LB]], align 4
3797 // CHECK3-NEXT:    [[TMP38:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3798 // CHECK3-NEXT:    [[TMP39:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3799 // CHECK3-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP38]], [[TMP39]]
3800 // CHECK3-NEXT:    store i32 [[ADD13]], i32* [[DOTOMP_UB]], align 4
3801 // CHECK3-NEXT:    br label [[OMP_DISPATCH_COND]]
3802 // CHECK3:       omp.dispatch.end:
3803 // CHECK3-NEXT:    [[TMP40:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3804 // CHECK3-NEXT:    [[TMP41:%.*]] = load i32, i32* [[TMP40]], align 4
3805 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP41]])
3806 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
3807 // CHECK3:       omp.precond.end:
3808 // CHECK3-NEXT:    ret void
3809 //
3810 //
3811 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l300
3812 // CHECK3-SAME: (i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
3813 // CHECK3-NEXT:  entry:
3814 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
3815 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
3816 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
3817 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
3818 // CHECK3-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
3819 // CHECK3-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
3820 // CHECK3-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
3821 // CHECK3-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
3822 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..18 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
3823 // CHECK3-NEXT:    ret void
3824 //
3825 //
3826 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..18
3827 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
3828 // CHECK3-NEXT:  entry:
3829 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3830 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3831 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
3832 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
3833 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
3834 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
3835 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3836 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3837 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3838 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3839 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
3840 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3841 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3842 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3843 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3844 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
3845 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3846 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3847 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
3848 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
3849 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
3850 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
3851 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
3852 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
3853 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
3854 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
3855 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
3856 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
3857 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3858 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
3859 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3860 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
3861 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3862 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
3863 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3864 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
3865 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3866 // CHECK3:       omp.precond.then:
3867 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3868 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3869 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
3870 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3871 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3872 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3873 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
3874 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3875 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3876 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3877 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
3878 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3879 // CHECK3:       cond.true:
3880 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3881 // CHECK3-NEXT:    br label [[COND_END:%.*]]
3882 // CHECK3:       cond.false:
3883 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3884 // CHECK3-NEXT:    br label [[COND_END]]
3885 // CHECK3:       cond.end:
3886 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
3887 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3888 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3889 // CHECK3-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
3890 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3891 // CHECK3:       omp.inner.for.cond:
3892 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3893 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3894 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
3895 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3896 // CHECK3:       omp.inner.for.body:
3897 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3898 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3899 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
3900 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3901 // CHECK3:       omp.inner.for.inc:
3902 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3903 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3904 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
3905 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
3906 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
3907 // CHECK3:       omp.inner.for.end:
3908 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3909 // CHECK3:       omp.loop.exit:
3910 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3911 // CHECK3-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
3912 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
3913 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
3914 // CHECK3:       omp.precond.end:
3915 // CHECK3-NEXT:    ret void
3916 //
3917 //
3918 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..19
3919 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
3920 // CHECK3-NEXT:  entry:
3921 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3922 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3923 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
3924 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
3925 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
3926 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
3927 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
3928 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
3929 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3930 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3931 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3932 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3933 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
3934 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3935 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3936 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3937 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3938 // CHECK3-NEXT:    [[I3:%.*]] = alloca i32, align 4
3939 // CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_5:%.*]], align 4
3940 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3941 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3942 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3943 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3944 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
3945 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
3946 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
3947 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
3948 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
3949 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
3950 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
3951 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
3952 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
3953 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
3954 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3955 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
3956 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3957 // CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
3958 // CHECK3-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3959 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
3960 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3961 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
3962 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3963 // CHECK3:       omp.precond.then:
3964 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3965 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3966 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
3967 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3968 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3969 // CHECK3-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
3970 // CHECK3-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
3971 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3972 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3973 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3974 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3975 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3976 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
3977 // CHECK3-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 35, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 1)
3978 // CHECK3-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
3979 // CHECK3:       omp.dispatch.cond:
3980 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3981 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
3982 // CHECK3-NEXT:    [[TMP16:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP15]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
3983 // CHECK3-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
3984 // CHECK3-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
3985 // CHECK3:       omp.dispatch.body:
3986 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3987 // CHECK3-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
3988 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3989 // CHECK3:       omp.inner.for.cond:
3990 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
3991 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !13
3992 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
3993 // CHECK3-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3994 // CHECK3:       omp.inner.for.body:
3995 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
3996 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
3997 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3998 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !13
3999 // CHECK3-NEXT:    [[TMP21:%.*]] = load double*, double** [[TMP2]], align 4, !llvm.access.group !13
4000 // CHECK3-NEXT:    [[TMP22:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !13
4001 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP21]], i32 [[TMP22]]
4002 // CHECK3-NEXT:    [[TMP23:%.*]] = load double, double* [[ARRAYIDX]], align 4, !llvm.access.group !13
4003 // CHECK3-NEXT:    [[TMP24:%.*]] = load double*, double** [[TMP3]], align 4, !llvm.access.group !13
4004 // CHECK3-NEXT:    [[TMP25:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !13
4005 // CHECK3-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr inbounds double, double* [[TMP24]], i32 [[TMP25]]
4006 // CHECK3-NEXT:    [[TMP26:%.*]] = load double, double* [[ARRAYIDX5]], align 4, !llvm.access.group !13
4007 // CHECK3-NEXT:    [[ADD6:%.*]] = fadd double [[TMP23]], [[TMP26]]
4008 // CHECK3-NEXT:    [[TMP27:%.*]] = load double*, double** [[TMP1]], align 4, !llvm.access.group !13
4009 // CHECK3-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !13
4010 // CHECK3-NEXT:    [[ARRAYIDX7:%.*]] = getelementptr inbounds double, double* [[TMP27]], i32 [[TMP28]]
4011 // CHECK3-NEXT:    store double [[ADD6]], double* [[ARRAYIDX7]], align 4, !llvm.access.group !13
4012 // CHECK3-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[CLASS_ANON_5]], %class.anon.5* [[REF_TMP]], i32 0, i32 0
4013 // CHECK3-NEXT:    store double** [[TMP1]], double*** [[TMP29]], align 4, !llvm.access.group !13
4014 // CHECK3-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_5]], %class.anon.5* [[REF_TMP]], i32 0, i32 1
4015 // CHECK3-NEXT:    store i32* [[I3]], i32** [[TMP30]], align 4, !llvm.access.group !13
4016 // CHECK3-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_5]], %class.anon.5* [[REF_TMP]], i32 0, i32 2
4017 // CHECK3-NEXT:    store double** [[TMP2]], double*** [[TMP31]], align 4, !llvm.access.group !13
4018 // CHECK3-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[CLASS_ANON_5]], %class.anon.5* [[REF_TMP]], i32 0, i32 3
4019 // CHECK3-NEXT:    store double** [[TMP3]], double*** [[TMP32]], align 4, !llvm.access.group !13
4020 // CHECK3-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE4_clEv"(%class.anon.5* noundef nonnull align 4 dereferenceable(16) [[REF_TMP]]), !llvm.access.group !13
4021 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4022 // CHECK3:       omp.body.continue:
4023 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4024 // CHECK3:       omp.inner.for.inc:
4025 // CHECK3-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
4026 // CHECK3-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP33]], 1
4027 // CHECK3-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
4028 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP14:![0-9]+]]
4029 // CHECK3:       omp.inner.for.end:
4030 // CHECK3-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
4031 // CHECK3:       omp.dispatch.inc:
4032 // CHECK3-NEXT:    br label [[OMP_DISPATCH_COND]]
4033 // CHECK3:       omp.dispatch.end:
4034 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
4035 // CHECK3:       omp.precond.end:
4036 // CHECK3-NEXT:    ret void
4037 //
4038 //
4039 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l329
4040 // CHECK3-SAME: (i32 noundef [[CH:%.*]], i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR2]] {
4041 // CHECK3-NEXT:  entry:
4042 // CHECK3-NEXT:    [[CH_ADDR:%.*]] = alloca i32, align 4
4043 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
4044 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
4045 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
4046 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
4047 // CHECK3-NEXT:    store i32 [[CH]], i32* [[CH_ADDR]], align 4
4048 // CHECK3-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
4049 // CHECK3-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
4050 // CHECK3-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
4051 // CHECK3-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
4052 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..22 to void (i32*, i32*, ...)*), i32* [[CH_ADDR]], i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
4053 // CHECK3-NEXT:    ret void
4054 //
4055 //
4056 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..22
4057 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR2]] {
4058 // CHECK3-NEXT:  entry:
4059 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4060 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4061 // CHECK3-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 4
4062 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
4063 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
4064 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
4065 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
4066 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4067 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4068 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4069 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4070 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
4071 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
4072 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
4073 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
4074 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4075 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4076 // CHECK3-NEXT:    [[I4:%.*]] = alloca i32, align 4
4077 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
4078 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4079 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4080 // CHECK3-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 4
4081 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
4082 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
4083 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
4084 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
4085 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 4
4086 // CHECK3-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 4
4087 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 4
4088 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 4
4089 // CHECK3-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 4
4090 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
4091 // CHECK3-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
4092 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
4093 // CHECK3-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4094 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4095 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
4096 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4097 // CHECK3-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
4098 // CHECK3-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
4099 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
4100 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4101 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
4102 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4103 // CHECK3:       omp.precond.then:
4104 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
4105 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4106 // CHECK3-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
4107 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4108 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4109 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
4110 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
4111 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
4112 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4113 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4114 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
4115 // CHECK3-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4116 // CHECK3:       cond.true:
4117 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4118 // CHECK3-NEXT:    br label [[COND_END:%.*]]
4119 // CHECK3:       cond.false:
4120 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4121 // CHECK3-NEXT:    br label [[COND_END]]
4122 // CHECK3:       cond.end:
4123 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
4124 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
4125 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4126 // CHECK3-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
4127 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4128 // CHECK3:       omp.inner.for.cond:
4129 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4130 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4131 // CHECK3-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
4132 // CHECK3-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4133 // CHECK3:       omp.inner.for.body:
4134 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4135 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4136 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4137 // CHECK3-NEXT:    store i32 [[TMP21]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
4138 // CHECK3-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
4139 // CHECK3-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**, i32)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i32 [[TMP19]], i32 [[TMP20]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]], i32 [[TMP22]])
4140 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4141 // CHECK3:       omp.inner.for.inc:
4142 // CHECK3-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4143 // CHECK3-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
4144 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
4145 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
4146 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
4147 // CHECK3:       omp.inner.for.end:
4148 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4149 // CHECK3:       omp.loop.exit:
4150 // CHECK3-NEXT:    [[TMP25:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
4151 // CHECK3-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
4152 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP26]])
4153 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
4154 // CHECK3:       omp.precond.end:
4155 // CHECK3-NEXT:    ret void
4156 //
4157 //
4158 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..23
4159 // CHECK3-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
4160 // CHECK3-NEXT:  entry:
4161 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4162 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4163 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
4164 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
4165 // CHECK3-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
4166 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
4167 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
4168 // CHECK3-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
4169 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
4170 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4171 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4172 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4173 // CHECK3-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
4174 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
4175 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4176 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4177 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4178 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4179 // CHECK3-NEXT:    [[I4:%.*]] = alloca i32, align 4
4180 // CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_6:%.*]], align 4
4181 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4182 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4183 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
4184 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4185 // CHECK3-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
4186 // CHECK3-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
4187 // CHECK3-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
4188 // CHECK3-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
4189 // CHECK3-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4190 // CHECK3-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
4191 // CHECK3-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
4192 // CHECK3-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
4193 // CHECK3-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
4194 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
4195 // CHECK3-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4196 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4197 // CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
4198 // CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4199 // CHECK3-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
4200 // CHECK3-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
4201 // CHECK3-NEXT:    store i32 0, i32* [[I]], align 4
4202 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4203 // CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
4204 // CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4205 // CHECK3:       omp.precond.then:
4206 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
4207 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4208 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
4209 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
4210 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4211 // CHECK3-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
4212 // CHECK3-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
4213 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4214 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4215 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
4216 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4217 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4218 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
4219 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
4220 // CHECK3-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32 35, i32 [[TMP11]], i32 [[TMP12]], i32 1, i32 [[TMP10]])
4221 // CHECK3-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
4222 // CHECK3:       omp.dispatch.cond:
4223 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
4224 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
4225 // CHECK3-NEXT:    [[TMP17:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP16]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
4226 // CHECK3-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP17]], 0
4227 // CHECK3-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
4228 // CHECK3:       omp.dispatch.body:
4229 // CHECK3-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4230 // CHECK3-NEXT:    store i32 [[TMP18]], i32* [[DOTOMP_IV]], align 4
4231 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4232 // CHECK3:       omp.inner.for.cond:
4233 // CHECK3-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !16
4234 // CHECK3-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !16
4235 // CHECK3-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP19]], [[TMP20]]
4236 // CHECK3-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4237 // CHECK3:       omp.inner.for.body:
4238 // CHECK3-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !16
4239 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP21]], 1
4240 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4241 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !16
4242 // CHECK3-NEXT:    [[TMP22:%.*]] = load double*, double** [[TMP2]], align 4, !llvm.access.group !16
4243 // CHECK3-NEXT:    [[TMP23:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !16
4244 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP22]], i32 [[TMP23]]
4245 // CHECK3-NEXT:    [[TMP24:%.*]] = load double, double* [[ARRAYIDX]], align 4, !llvm.access.group !16
4246 // CHECK3-NEXT:    [[TMP25:%.*]] = load double*, double** [[TMP3]], align 4, !llvm.access.group !16
4247 // CHECK3-NEXT:    [[TMP26:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !16
4248 // CHECK3-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP25]], i32 [[TMP26]]
4249 // CHECK3-NEXT:    [[TMP27:%.*]] = load double, double* [[ARRAYIDX6]], align 4, !llvm.access.group !16
4250 // CHECK3-NEXT:    [[ADD7:%.*]] = fadd double [[TMP24]], [[TMP27]]
4251 // CHECK3-NEXT:    [[TMP28:%.*]] = load double*, double** [[TMP1]], align 4, !llvm.access.group !16
4252 // CHECK3-NEXT:    [[TMP29:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !16
4253 // CHECK3-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP28]], i32 [[TMP29]]
4254 // CHECK3-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4, !llvm.access.group !16
4255 // CHECK3-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[CLASS_ANON_6]], %class.anon.6* [[REF_TMP]], i32 0, i32 0
4256 // CHECK3-NEXT:    store double** [[TMP1]], double*** [[TMP30]], align 4, !llvm.access.group !16
4257 // CHECK3-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[CLASS_ANON_6]], %class.anon.6* [[REF_TMP]], i32 0, i32 1
4258 // CHECK3-NEXT:    store i32* [[I4]], i32** [[TMP31]], align 4, !llvm.access.group !16
4259 // CHECK3-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[CLASS_ANON_6]], %class.anon.6* [[REF_TMP]], i32 0, i32 2
4260 // CHECK3-NEXT:    store double** [[TMP2]], double*** [[TMP32]], align 4, !llvm.access.group !16
4261 // CHECK3-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[CLASS_ANON_6]], %class.anon.6* [[REF_TMP]], i32 0, i32 3
4262 // CHECK3-NEXT:    store double** [[TMP3]], double*** [[TMP33]], align 4, !llvm.access.group !16
4263 // CHECK3-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE5_clEv"(%class.anon.6* noundef nonnull align 4 dereferenceable(16) [[REF_TMP]]), !llvm.access.group !16
4264 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4265 // CHECK3:       omp.body.continue:
4266 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4267 // CHECK3:       omp.inner.for.inc:
4268 // CHECK3-NEXT:    [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !16
4269 // CHECK3-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP34]], 1
4270 // CHECK3-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !16
4271 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP17:![0-9]+]]
4272 // CHECK3:       omp.inner.for.end:
4273 // CHECK3-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
4274 // CHECK3:       omp.dispatch.inc:
4275 // CHECK3-NEXT:    br label [[OMP_DISPATCH_COND]]
4276 // CHECK3:       omp.dispatch.end:
4277 // CHECK3-NEXT:    br label [[OMP_PRECOND_END]]
4278 // CHECK3:       omp.precond.end:
4279 // CHECK3-NEXT:    ret void
4280 //
4281 //
4282 // CHECK3-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
4283 // CHECK3-SAME: () #[[ATTR4:[0-9]+]] {
4284 // CHECK3-NEXT:  entry:
4285 // CHECK3-NEXT:    call void @__tgt_register_requires(i64 1)
4286 // CHECK3-NEXT:    ret void
4287 //
4288 //
4289 // CHECK9-LABEL: define {{[^@]+}}@main
4290 // CHECK9-SAME: () #[[ATTR0:[0-9]+]] {
4291 // CHECK9-NEXT:  entry:
4292 // CHECK9-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
4293 // CHECK9-NEXT:    [[A:%.*]] = alloca double*, align 8
4294 // CHECK9-NEXT:    [[B:%.*]] = alloca double*, align 8
4295 // CHECK9-NEXT:    [[C:%.*]] = alloca double*, align 8
4296 // CHECK9-NEXT:    [[N:%.*]] = alloca i32, align 4
4297 // CHECK9-NEXT:    [[CH:%.*]] = alloca i32, align 4
4298 // CHECK9-NEXT:    [[N_CASTED:%.*]] = alloca i64, align 8
4299 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x i8*], align 8
4300 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x i8*], align 8
4301 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x i8*], align 8
4302 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4303 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4304 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4305 // CHECK9-NEXT:    [[N_CASTED3:%.*]] = alloca i64, align 8
4306 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [4 x i8*], align 8
4307 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS6:%.*]] = alloca [4 x i8*], align 8
4308 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [4 x i8*], align 8
4309 // CHECK9-NEXT:    [[_TMP8:%.*]] = alloca i32, align 4
4310 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4
4311 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
4312 // CHECK9-NEXT:    [[CH_CASTED:%.*]] = alloca i64, align 8
4313 // CHECK9-NEXT:    [[N_CASTED19:%.*]] = alloca i64, align 8
4314 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS21:%.*]] = alloca [5 x i8*], align 8
4315 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS22:%.*]] = alloca [5 x i8*], align 8
4316 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS23:%.*]] = alloca [5 x i8*], align 8
4317 // CHECK9-NEXT:    [[_TMP24:%.*]] = alloca i32, align 4
4318 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_25:%.*]] = alloca i32, align 4
4319 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_26:%.*]] = alloca i32, align 4
4320 // CHECK9-NEXT:    [[N_CASTED34:%.*]] = alloca i64, align 8
4321 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS36:%.*]] = alloca [4 x i8*], align 8
4322 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS37:%.*]] = alloca [4 x i8*], align 8
4323 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS38:%.*]] = alloca [4 x i8*], align 8
4324 // CHECK9-NEXT:    [[_TMP39:%.*]] = alloca i32, align 4
4325 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_40:%.*]] = alloca i32, align 4
4326 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_41:%.*]] = alloca i32, align 4
4327 // CHECK9-NEXT:    [[CH_CASTED49:%.*]] = alloca i64, align 8
4328 // CHECK9-NEXT:    [[N_CASTED51:%.*]] = alloca i64, align 8
4329 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS53:%.*]] = alloca [5 x i8*], align 8
4330 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS54:%.*]] = alloca [5 x i8*], align 8
4331 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS55:%.*]] = alloca [5 x i8*], align 8
4332 // CHECK9-NEXT:    [[_TMP56:%.*]] = alloca i32, align 4
4333 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_57:%.*]] = alloca i32, align 4
4334 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_58:%.*]] = alloca i32, align 4
4335 // CHECK9-NEXT:    [[N_CASTED66:%.*]] = alloca i64, align 8
4336 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS68:%.*]] = alloca [4 x i8*], align 8
4337 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS69:%.*]] = alloca [4 x i8*], align 8
4338 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS70:%.*]] = alloca [4 x i8*], align 8
4339 // CHECK9-NEXT:    [[_TMP71:%.*]] = alloca i32, align 4
4340 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_72:%.*]] = alloca i32, align 4
4341 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_73:%.*]] = alloca i32, align 4
4342 // CHECK9-NEXT:    [[CH_CASTED81:%.*]] = alloca i64, align 8
4343 // CHECK9-NEXT:    [[N_CASTED83:%.*]] = alloca i64, align 8
4344 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS85:%.*]] = alloca [5 x i8*], align 8
4345 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS86:%.*]] = alloca [5 x i8*], align 8
4346 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS87:%.*]] = alloca [5 x i8*], align 8
4347 // CHECK9-NEXT:    [[_TMP88:%.*]] = alloca i32, align 4
4348 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_89:%.*]] = alloca i32, align 4
4349 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_90:%.*]] = alloca i32, align 4
4350 // CHECK9-NEXT:    store i32 0, i32* [[RETVAL]], align 4
4351 // CHECK9-NEXT:    store i32 10000, i32* [[N]], align 4
4352 // CHECK9-NEXT:    store i32 100, i32* [[CH]], align 4
4353 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
4354 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_CASTED]] to i32*
4355 // CHECK9-NEXT:    store i32 [[TMP0]], i32* [[CONV]], align 4
4356 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[N_CASTED]], align 8
4357 // CHECK9-NEXT:    [[TMP2:%.*]] = load double*, double** [[A]], align 8
4358 // CHECK9-NEXT:    [[TMP3:%.*]] = load double*, double** [[B]], align 8
4359 // CHECK9-NEXT:    [[TMP4:%.*]] = load double*, double** [[C]], align 8
4360 // CHECK9-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4361 // CHECK9-NEXT:    [[TMP6:%.*]] = bitcast i8** [[TMP5]] to i64*
4362 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP6]], align 8
4363 // CHECK9-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4364 // CHECK9-NEXT:    [[TMP8:%.*]] = bitcast i8** [[TMP7]] to i64*
4365 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP8]], align 8
4366 // CHECK9-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
4367 // CHECK9-NEXT:    store i8* null, i8** [[TMP9]], align 8
4368 // CHECK9-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
4369 // CHECK9-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to double**
4370 // CHECK9-NEXT:    store double* [[TMP2]], double** [[TMP11]], align 8
4371 // CHECK9-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
4372 // CHECK9-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to double**
4373 // CHECK9-NEXT:    store double* [[TMP2]], double** [[TMP13]], align 8
4374 // CHECK9-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
4375 // CHECK9-NEXT:    store i8* null, i8** [[TMP14]], align 8
4376 // CHECK9-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
4377 // CHECK9-NEXT:    [[TMP16:%.*]] = bitcast i8** [[TMP15]] to double**
4378 // CHECK9-NEXT:    store double* [[TMP3]], double** [[TMP16]], align 8
4379 // CHECK9-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
4380 // CHECK9-NEXT:    [[TMP18:%.*]] = bitcast i8** [[TMP17]] to double**
4381 // CHECK9-NEXT:    store double* [[TMP3]], double** [[TMP18]], align 8
4382 // CHECK9-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
4383 // CHECK9-NEXT:    store i8* null, i8** [[TMP19]], align 8
4384 // CHECK9-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
4385 // CHECK9-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to double**
4386 // CHECK9-NEXT:    store double* [[TMP4]], double** [[TMP21]], align 8
4387 // CHECK9-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
4388 // CHECK9-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to double**
4389 // CHECK9-NEXT:    store double* [[TMP4]], double** [[TMP23]], align 8
4390 // CHECK9-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3
4391 // CHECK9-NEXT:    store i8* null, i8** [[TMP24]], align 8
4392 // CHECK9-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4393 // CHECK9-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4394 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[N]], align 4
4395 // CHECK9-NEXT:    store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4
4396 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4397 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0
4398 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4399 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
4400 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4401 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4402 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP29]], 1
4403 // CHECK9-NEXT:    [[TMP30:%.*]] = zext i32 [[ADD]] to i64
4404 // CHECK9-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
4405 // CHECK9-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
4406 // CHECK9-NEXT:    store i32 1, i32* [[TMP31]], align 4
4407 // CHECK9-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
4408 // CHECK9-NEXT:    store i32 4, i32* [[TMP32]], align 4
4409 // CHECK9-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
4410 // CHECK9-NEXT:    store i8** [[TMP25]], i8*** [[TMP33]], align 8
4411 // CHECK9-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
4412 // CHECK9-NEXT:    store i8** [[TMP26]], i8*** [[TMP34]], align 8
4413 // CHECK9-NEXT:    [[TMP35:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
4414 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes, i32 0, i32 0), i64** [[TMP35]], align 8
4415 // CHECK9-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
4416 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP36]], align 8
4417 // CHECK9-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
4418 // CHECK9-NEXT:    store i8** null, i8*** [[TMP37]], align 8
4419 // CHECK9-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
4420 // CHECK9-NEXT:    store i8** null, i8*** [[TMP38]], align 8
4421 // CHECK9-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
4422 // CHECK9-NEXT:    store i64 [[TMP30]], i64* [[TMP39]], align 8
4423 // CHECK9-NEXT:    [[TMP40:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l369.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
4424 // CHECK9-NEXT:    [[TMP41:%.*]] = icmp ne i32 [[TMP40]], 0
4425 // CHECK9-NEXT:    br i1 [[TMP41]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4426 // CHECK9:       omp_offload.failed:
4427 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l369(i64 [[TMP1]], double* [[TMP2]], double* [[TMP3]], double* [[TMP4]]) #[[ATTR2:[0-9]+]]
4428 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT]]
4429 // CHECK9:       omp_offload.cont:
4430 // CHECK9-NEXT:    [[TMP42:%.*]] = load i32, i32* [[N]], align 4
4431 // CHECK9-NEXT:    [[CONV4:%.*]] = bitcast i64* [[N_CASTED3]] to i32*
4432 // CHECK9-NEXT:    store i32 [[TMP42]], i32* [[CONV4]], align 4
4433 // CHECK9-NEXT:    [[TMP43:%.*]] = load i64, i64* [[N_CASTED3]], align 8
4434 // CHECK9-NEXT:    [[TMP44:%.*]] = load double*, double** [[A]], align 8
4435 // CHECK9-NEXT:    [[TMP45:%.*]] = load double*, double** [[B]], align 8
4436 // CHECK9-NEXT:    [[TMP46:%.*]] = load double*, double** [[C]], align 8
4437 // CHECK9-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
4438 // CHECK9-NEXT:    [[TMP48:%.*]] = bitcast i8** [[TMP47]] to i64*
4439 // CHECK9-NEXT:    store i64 [[TMP43]], i64* [[TMP48]], align 8
4440 // CHECK9-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
4441 // CHECK9-NEXT:    [[TMP50:%.*]] = bitcast i8** [[TMP49]] to i64*
4442 // CHECK9-NEXT:    store i64 [[TMP43]], i64* [[TMP50]], align 8
4443 // CHECK9-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 0
4444 // CHECK9-NEXT:    store i8* null, i8** [[TMP51]], align 8
4445 // CHECK9-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 1
4446 // CHECK9-NEXT:    [[TMP53:%.*]] = bitcast i8** [[TMP52]] to double**
4447 // CHECK9-NEXT:    store double* [[TMP44]], double** [[TMP53]], align 8
4448 // CHECK9-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 1
4449 // CHECK9-NEXT:    [[TMP55:%.*]] = bitcast i8** [[TMP54]] to double**
4450 // CHECK9-NEXT:    store double* [[TMP44]], double** [[TMP55]], align 8
4451 // CHECK9-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 1
4452 // CHECK9-NEXT:    store i8* null, i8** [[TMP56]], align 8
4453 // CHECK9-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 2
4454 // CHECK9-NEXT:    [[TMP58:%.*]] = bitcast i8** [[TMP57]] to double**
4455 // CHECK9-NEXT:    store double* [[TMP45]], double** [[TMP58]], align 8
4456 // CHECK9-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 2
4457 // CHECK9-NEXT:    [[TMP60:%.*]] = bitcast i8** [[TMP59]] to double**
4458 // CHECK9-NEXT:    store double* [[TMP45]], double** [[TMP60]], align 8
4459 // CHECK9-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 2
4460 // CHECK9-NEXT:    store i8* null, i8** [[TMP61]], align 8
4461 // CHECK9-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 3
4462 // CHECK9-NEXT:    [[TMP63:%.*]] = bitcast i8** [[TMP62]] to double**
4463 // CHECK9-NEXT:    store double* [[TMP46]], double** [[TMP63]], align 8
4464 // CHECK9-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 3
4465 // CHECK9-NEXT:    [[TMP65:%.*]] = bitcast i8** [[TMP64]] to double**
4466 // CHECK9-NEXT:    store double* [[TMP46]], double** [[TMP65]], align 8
4467 // CHECK9-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 3
4468 // CHECK9-NEXT:    store i8* null, i8** [[TMP66]], align 8
4469 // CHECK9-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
4470 // CHECK9-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
4471 // CHECK9-NEXT:    [[TMP69:%.*]] = load i32, i32* [[N]], align 4
4472 // CHECK9-NEXT:    store i32 [[TMP69]], i32* [[DOTCAPTURE_EXPR_9]], align 4
4473 // CHECK9-NEXT:    [[TMP70:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_9]], align 4
4474 // CHECK9-NEXT:    [[SUB11:%.*]] = sub nsw i32 [[TMP70]], 0
4475 // CHECK9-NEXT:    [[DIV12:%.*]] = sdiv i32 [[SUB11]], 1
4476 // CHECK9-NEXT:    [[SUB13:%.*]] = sub nsw i32 [[DIV12]], 1
4477 // CHECK9-NEXT:    store i32 [[SUB13]], i32* [[DOTCAPTURE_EXPR_10]], align 4
4478 // CHECK9-NEXT:    [[TMP71:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
4479 // CHECK9-NEXT:    [[ADD14:%.*]] = add nsw i32 [[TMP71]], 1
4480 // CHECK9-NEXT:    [[TMP72:%.*]] = zext i32 [[ADD14]] to i64
4481 // CHECK9-NEXT:    [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
4482 // CHECK9-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 0
4483 // CHECK9-NEXT:    store i32 1, i32* [[TMP73]], align 4
4484 // CHECK9-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 1
4485 // CHECK9-NEXT:    store i32 4, i32* [[TMP74]], align 4
4486 // CHECK9-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 2
4487 // CHECK9-NEXT:    store i8** [[TMP67]], i8*** [[TMP75]], align 8
4488 // CHECK9-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 3
4489 // CHECK9-NEXT:    store i8** [[TMP68]], i8*** [[TMP76]], align 8
4490 // CHECK9-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 4
4491 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.4, i32 0, i32 0), i64** [[TMP77]], align 8
4492 // CHECK9-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 5
4493 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP78]], align 8
4494 // CHECK9-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 6
4495 // CHECK9-NEXT:    store i8** null, i8*** [[TMP79]], align 8
4496 // CHECK9-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 7
4497 // CHECK9-NEXT:    store i8** null, i8*** [[TMP80]], align 8
4498 // CHECK9-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 8
4499 // CHECK9-NEXT:    store i64 [[TMP72]], i64* [[TMP81]], align 8
4500 // CHECK9-NEXT:    [[TMP82:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l408.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]])
4501 // CHECK9-NEXT:    [[TMP83:%.*]] = icmp ne i32 [[TMP82]], 0
4502 // CHECK9-NEXT:    br i1 [[TMP83]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
4503 // CHECK9:       omp_offload.failed16:
4504 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l408(i64 [[TMP43]], double* [[TMP44]], double* [[TMP45]], double* [[TMP46]]) #[[ATTR2]]
4505 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
4506 // CHECK9:       omp_offload.cont17:
4507 // CHECK9-NEXT:    [[TMP84:%.*]] = load i32, i32* [[CH]], align 4
4508 // CHECK9-NEXT:    [[CONV18:%.*]] = bitcast i64* [[CH_CASTED]] to i32*
4509 // CHECK9-NEXT:    store i32 [[TMP84]], i32* [[CONV18]], align 4
4510 // CHECK9-NEXT:    [[TMP85:%.*]] = load i64, i64* [[CH_CASTED]], align 8
4511 // CHECK9-NEXT:    [[TMP86:%.*]] = load i32, i32* [[N]], align 4
4512 // CHECK9-NEXT:    [[CONV20:%.*]] = bitcast i64* [[N_CASTED19]] to i32*
4513 // CHECK9-NEXT:    store i32 [[TMP86]], i32* [[CONV20]], align 4
4514 // CHECK9-NEXT:    [[TMP87:%.*]] = load i64, i64* [[N_CASTED19]], align 8
4515 // CHECK9-NEXT:    [[TMP88:%.*]] = load double*, double** [[A]], align 8
4516 // CHECK9-NEXT:    [[TMP89:%.*]] = load double*, double** [[B]], align 8
4517 // CHECK9-NEXT:    [[TMP90:%.*]] = load double*, double** [[C]], align 8
4518 // CHECK9-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 0
4519 // CHECK9-NEXT:    [[TMP92:%.*]] = bitcast i8** [[TMP91]] to i64*
4520 // CHECK9-NEXT:    store i64 [[TMP85]], i64* [[TMP92]], align 8
4521 // CHECK9-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 0
4522 // CHECK9-NEXT:    [[TMP94:%.*]] = bitcast i8** [[TMP93]] to i64*
4523 // CHECK9-NEXT:    store i64 [[TMP85]], i64* [[TMP94]], align 8
4524 // CHECK9-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 0
4525 // CHECK9-NEXT:    store i8* null, i8** [[TMP95]], align 8
4526 // CHECK9-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 1
4527 // CHECK9-NEXT:    [[TMP97:%.*]] = bitcast i8** [[TMP96]] to i64*
4528 // CHECK9-NEXT:    store i64 [[TMP87]], i64* [[TMP97]], align 8
4529 // CHECK9-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 1
4530 // CHECK9-NEXT:    [[TMP99:%.*]] = bitcast i8** [[TMP98]] to i64*
4531 // CHECK9-NEXT:    store i64 [[TMP87]], i64* [[TMP99]], align 8
4532 // CHECK9-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 1
4533 // CHECK9-NEXT:    store i8* null, i8** [[TMP100]], align 8
4534 // CHECK9-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 2
4535 // CHECK9-NEXT:    [[TMP102:%.*]] = bitcast i8** [[TMP101]] to double**
4536 // CHECK9-NEXT:    store double* [[TMP88]], double** [[TMP102]], align 8
4537 // CHECK9-NEXT:    [[TMP103:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 2
4538 // CHECK9-NEXT:    [[TMP104:%.*]] = bitcast i8** [[TMP103]] to double**
4539 // CHECK9-NEXT:    store double* [[TMP88]], double** [[TMP104]], align 8
4540 // CHECK9-NEXT:    [[TMP105:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 2
4541 // CHECK9-NEXT:    store i8* null, i8** [[TMP105]], align 8
4542 // CHECK9-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 3
4543 // CHECK9-NEXT:    [[TMP107:%.*]] = bitcast i8** [[TMP106]] to double**
4544 // CHECK9-NEXT:    store double* [[TMP89]], double** [[TMP107]], align 8
4545 // CHECK9-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 3
4546 // CHECK9-NEXT:    [[TMP109:%.*]] = bitcast i8** [[TMP108]] to double**
4547 // CHECK9-NEXT:    store double* [[TMP89]], double** [[TMP109]], align 8
4548 // CHECK9-NEXT:    [[TMP110:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 3
4549 // CHECK9-NEXT:    store i8* null, i8** [[TMP110]], align 8
4550 // CHECK9-NEXT:    [[TMP111:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 4
4551 // CHECK9-NEXT:    [[TMP112:%.*]] = bitcast i8** [[TMP111]] to double**
4552 // CHECK9-NEXT:    store double* [[TMP90]], double** [[TMP112]], align 8
4553 // CHECK9-NEXT:    [[TMP113:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 4
4554 // CHECK9-NEXT:    [[TMP114:%.*]] = bitcast i8** [[TMP113]] to double**
4555 // CHECK9-NEXT:    store double* [[TMP90]], double** [[TMP114]], align 8
4556 // CHECK9-NEXT:    [[TMP115:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 4
4557 // CHECK9-NEXT:    store i8* null, i8** [[TMP115]], align 8
4558 // CHECK9-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 0
4559 // CHECK9-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 0
4560 // CHECK9-NEXT:    [[TMP118:%.*]] = load i32, i32* [[N]], align 4
4561 // CHECK9-NEXT:    store i32 [[TMP118]], i32* [[DOTCAPTURE_EXPR_25]], align 4
4562 // CHECK9-NEXT:    [[TMP119:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4
4563 // CHECK9-NEXT:    [[SUB27:%.*]] = sub nsw i32 [[TMP119]], 0
4564 // CHECK9-NEXT:    [[DIV28:%.*]] = sdiv i32 [[SUB27]], 1
4565 // CHECK9-NEXT:    [[SUB29:%.*]] = sub nsw i32 [[DIV28]], 1
4566 // CHECK9-NEXT:    store i32 [[SUB29]], i32* [[DOTCAPTURE_EXPR_26]], align 4
4567 // CHECK9-NEXT:    [[TMP120:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_26]], align 4
4568 // CHECK9-NEXT:    [[ADD30:%.*]] = add nsw i32 [[TMP120]], 1
4569 // CHECK9-NEXT:    [[TMP121:%.*]] = zext i32 [[ADD30]] to i64
4570 // CHECK9-NEXT:    [[KERNEL_ARGS31:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
4571 // CHECK9-NEXT:    [[TMP122:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 0
4572 // CHECK9-NEXT:    store i32 1, i32* [[TMP122]], align 4
4573 // CHECK9-NEXT:    [[TMP123:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 1
4574 // CHECK9-NEXT:    store i32 5, i32* [[TMP123]], align 4
4575 // CHECK9-NEXT:    [[TMP124:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 2
4576 // CHECK9-NEXT:    store i8** [[TMP116]], i8*** [[TMP124]], align 8
4577 // CHECK9-NEXT:    [[TMP125:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 3
4578 // CHECK9-NEXT:    store i8** [[TMP117]], i8*** [[TMP125]], align 8
4579 // CHECK9-NEXT:    [[TMP126:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 4
4580 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.8, i32 0, i32 0), i64** [[TMP126]], align 8
4581 // CHECK9-NEXT:    [[TMP127:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 5
4582 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP127]], align 8
4583 // CHECK9-NEXT:    [[TMP128:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 6
4584 // CHECK9-NEXT:    store i8** null, i8*** [[TMP128]], align 8
4585 // CHECK9-NEXT:    [[TMP129:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 7
4586 // CHECK9-NEXT:    store i8** null, i8*** [[TMP129]], align 8
4587 // CHECK9-NEXT:    [[TMP130:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 8
4588 // CHECK9-NEXT:    store i64 [[TMP121]], i64* [[TMP130]], align 8
4589 // CHECK9-NEXT:    [[TMP131:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l447.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]])
4590 // CHECK9-NEXT:    [[TMP132:%.*]] = icmp ne i32 [[TMP131]], 0
4591 // CHECK9-NEXT:    br i1 [[TMP132]], label [[OMP_OFFLOAD_FAILED32:%.*]], label [[OMP_OFFLOAD_CONT33:%.*]]
4592 // CHECK9:       omp_offload.failed32:
4593 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l447(i64 [[TMP85]], i64 [[TMP87]], double* [[TMP88]], double* [[TMP89]], double* [[TMP90]]) #[[ATTR2]]
4594 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT33]]
4595 // CHECK9:       omp_offload.cont33:
4596 // CHECK9-NEXT:    [[TMP133:%.*]] = load i32, i32* [[N]], align 4
4597 // CHECK9-NEXT:    [[CONV35:%.*]] = bitcast i64* [[N_CASTED34]] to i32*
4598 // CHECK9-NEXT:    store i32 [[TMP133]], i32* [[CONV35]], align 4
4599 // CHECK9-NEXT:    [[TMP134:%.*]] = load i64, i64* [[N_CASTED34]], align 8
4600 // CHECK9-NEXT:    [[TMP135:%.*]] = load double*, double** [[A]], align 8
4601 // CHECK9-NEXT:    [[TMP136:%.*]] = load double*, double** [[B]], align 8
4602 // CHECK9-NEXT:    [[TMP137:%.*]] = load double*, double** [[C]], align 8
4603 // CHECK9-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 0
4604 // CHECK9-NEXT:    [[TMP139:%.*]] = bitcast i8** [[TMP138]] to i64*
4605 // CHECK9-NEXT:    store i64 [[TMP134]], i64* [[TMP139]], align 8
4606 // CHECK9-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 0
4607 // CHECK9-NEXT:    [[TMP141:%.*]] = bitcast i8** [[TMP140]] to i64*
4608 // CHECK9-NEXT:    store i64 [[TMP134]], i64* [[TMP141]], align 8
4609 // CHECK9-NEXT:    [[TMP142:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS38]], i64 0, i64 0
4610 // CHECK9-NEXT:    store i8* null, i8** [[TMP142]], align 8
4611 // CHECK9-NEXT:    [[TMP143:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 1
4612 // CHECK9-NEXT:    [[TMP144:%.*]] = bitcast i8** [[TMP143]] to double**
4613 // CHECK9-NEXT:    store double* [[TMP135]], double** [[TMP144]], align 8
4614 // CHECK9-NEXT:    [[TMP145:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 1
4615 // CHECK9-NEXT:    [[TMP146:%.*]] = bitcast i8** [[TMP145]] to double**
4616 // CHECK9-NEXT:    store double* [[TMP135]], double** [[TMP146]], align 8
4617 // CHECK9-NEXT:    [[TMP147:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS38]], i64 0, i64 1
4618 // CHECK9-NEXT:    store i8* null, i8** [[TMP147]], align 8
4619 // CHECK9-NEXT:    [[TMP148:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 2
4620 // CHECK9-NEXT:    [[TMP149:%.*]] = bitcast i8** [[TMP148]] to double**
4621 // CHECK9-NEXT:    store double* [[TMP136]], double** [[TMP149]], align 8
4622 // CHECK9-NEXT:    [[TMP150:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 2
4623 // CHECK9-NEXT:    [[TMP151:%.*]] = bitcast i8** [[TMP150]] to double**
4624 // CHECK9-NEXT:    store double* [[TMP136]], double** [[TMP151]], align 8
4625 // CHECK9-NEXT:    [[TMP152:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS38]], i64 0, i64 2
4626 // CHECK9-NEXT:    store i8* null, i8** [[TMP152]], align 8
4627 // CHECK9-NEXT:    [[TMP153:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 3
4628 // CHECK9-NEXT:    [[TMP154:%.*]] = bitcast i8** [[TMP153]] to double**
4629 // CHECK9-NEXT:    store double* [[TMP137]], double** [[TMP154]], align 8
4630 // CHECK9-NEXT:    [[TMP155:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 3
4631 // CHECK9-NEXT:    [[TMP156:%.*]] = bitcast i8** [[TMP155]] to double**
4632 // CHECK9-NEXT:    store double* [[TMP137]], double** [[TMP156]], align 8
4633 // CHECK9-NEXT:    [[TMP157:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS38]], i64 0, i64 3
4634 // CHECK9-NEXT:    store i8* null, i8** [[TMP157]], align 8
4635 // CHECK9-NEXT:    [[TMP158:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 0
4636 // CHECK9-NEXT:    [[TMP159:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 0
4637 // CHECK9-NEXT:    [[TMP160:%.*]] = load i32, i32* [[N]], align 4
4638 // CHECK9-NEXT:    store i32 [[TMP160]], i32* [[DOTCAPTURE_EXPR_40]], align 4
4639 // CHECK9-NEXT:    [[TMP161:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_40]], align 4
4640 // CHECK9-NEXT:    [[SUB42:%.*]] = sub nsw i32 [[TMP161]], 0
4641 // CHECK9-NEXT:    [[DIV43:%.*]] = sdiv i32 [[SUB42]], 1
4642 // CHECK9-NEXT:    [[SUB44:%.*]] = sub nsw i32 [[DIV43]], 1
4643 // CHECK9-NEXT:    store i32 [[SUB44]], i32* [[DOTCAPTURE_EXPR_41]], align 4
4644 // CHECK9-NEXT:    [[TMP162:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_41]], align 4
4645 // CHECK9-NEXT:    [[ADD45:%.*]] = add nsw i32 [[TMP162]], 1
4646 // CHECK9-NEXT:    [[TMP163:%.*]] = zext i32 [[ADD45]] to i64
4647 // CHECK9-NEXT:    [[KERNEL_ARGS46:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
4648 // CHECK9-NEXT:    [[TMP164:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 0
4649 // CHECK9-NEXT:    store i32 1, i32* [[TMP164]], align 4
4650 // CHECK9-NEXT:    [[TMP165:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 1
4651 // CHECK9-NEXT:    store i32 4, i32* [[TMP165]], align 4
4652 // CHECK9-NEXT:    [[TMP166:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 2
4653 // CHECK9-NEXT:    store i8** [[TMP158]], i8*** [[TMP166]], align 8
4654 // CHECK9-NEXT:    [[TMP167:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 3
4655 // CHECK9-NEXT:    store i8** [[TMP159]], i8*** [[TMP167]], align 8
4656 // CHECK9-NEXT:    [[TMP168:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 4
4657 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.12, i32 0, i32 0), i64** [[TMP168]], align 8
4658 // CHECK9-NEXT:    [[TMP169:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 5
4659 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP169]], align 8
4660 // CHECK9-NEXT:    [[TMP170:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 6
4661 // CHECK9-NEXT:    store i8** null, i8*** [[TMP170]], align 8
4662 // CHECK9-NEXT:    [[TMP171:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 7
4663 // CHECK9-NEXT:    store i8** null, i8*** [[TMP171]], align 8
4664 // CHECK9-NEXT:    [[TMP172:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 8
4665 // CHECK9-NEXT:    store i64 [[TMP163]], i64* [[TMP172]], align 8
4666 // CHECK9-NEXT:    [[TMP173:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l478.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]])
4667 // CHECK9-NEXT:    [[TMP174:%.*]] = icmp ne i32 [[TMP173]], 0
4668 // CHECK9-NEXT:    br i1 [[TMP174]], label [[OMP_OFFLOAD_FAILED47:%.*]], label [[OMP_OFFLOAD_CONT48:%.*]]
4669 // CHECK9:       omp_offload.failed47:
4670 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l478(i64 [[TMP134]], double* [[TMP135]], double* [[TMP136]], double* [[TMP137]]) #[[ATTR2]]
4671 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT48]]
4672 // CHECK9:       omp_offload.cont48:
4673 // CHECK9-NEXT:    [[TMP175:%.*]] = load i32, i32* [[CH]], align 4
4674 // CHECK9-NEXT:    [[CONV50:%.*]] = bitcast i64* [[CH_CASTED49]] to i32*
4675 // CHECK9-NEXT:    store i32 [[TMP175]], i32* [[CONV50]], align 4
4676 // CHECK9-NEXT:    [[TMP176:%.*]] = load i64, i64* [[CH_CASTED49]], align 8
4677 // CHECK9-NEXT:    [[TMP177:%.*]] = load i32, i32* [[N]], align 4
4678 // CHECK9-NEXT:    [[CONV52:%.*]] = bitcast i64* [[N_CASTED51]] to i32*
4679 // CHECK9-NEXT:    store i32 [[TMP177]], i32* [[CONV52]], align 4
4680 // CHECK9-NEXT:    [[TMP178:%.*]] = load i64, i64* [[N_CASTED51]], align 8
4681 // CHECK9-NEXT:    [[TMP179:%.*]] = load double*, double** [[A]], align 8
4682 // CHECK9-NEXT:    [[TMP180:%.*]] = load double*, double** [[B]], align 8
4683 // CHECK9-NEXT:    [[TMP181:%.*]] = load double*, double** [[C]], align 8
4684 // CHECK9-NEXT:    [[TMP182:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 0
4685 // CHECK9-NEXT:    [[TMP183:%.*]] = bitcast i8** [[TMP182]] to i64*
4686 // CHECK9-NEXT:    store i64 [[TMP176]], i64* [[TMP183]], align 8
4687 // CHECK9-NEXT:    [[TMP184:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 0
4688 // CHECK9-NEXT:    [[TMP185:%.*]] = bitcast i8** [[TMP184]] to i64*
4689 // CHECK9-NEXT:    store i64 [[TMP176]], i64* [[TMP185]], align 8
4690 // CHECK9-NEXT:    [[TMP186:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 0
4691 // CHECK9-NEXT:    store i8* null, i8** [[TMP186]], align 8
4692 // CHECK9-NEXT:    [[TMP187:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 1
4693 // CHECK9-NEXT:    [[TMP188:%.*]] = bitcast i8** [[TMP187]] to i64*
4694 // CHECK9-NEXT:    store i64 [[TMP178]], i64* [[TMP188]], align 8
4695 // CHECK9-NEXT:    [[TMP189:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 1
4696 // CHECK9-NEXT:    [[TMP190:%.*]] = bitcast i8** [[TMP189]] to i64*
4697 // CHECK9-NEXT:    store i64 [[TMP178]], i64* [[TMP190]], align 8
4698 // CHECK9-NEXT:    [[TMP191:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 1
4699 // CHECK9-NEXT:    store i8* null, i8** [[TMP191]], align 8
4700 // CHECK9-NEXT:    [[TMP192:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 2
4701 // CHECK9-NEXT:    [[TMP193:%.*]] = bitcast i8** [[TMP192]] to double**
4702 // CHECK9-NEXT:    store double* [[TMP179]], double** [[TMP193]], align 8
4703 // CHECK9-NEXT:    [[TMP194:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 2
4704 // CHECK9-NEXT:    [[TMP195:%.*]] = bitcast i8** [[TMP194]] to double**
4705 // CHECK9-NEXT:    store double* [[TMP179]], double** [[TMP195]], align 8
4706 // CHECK9-NEXT:    [[TMP196:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 2
4707 // CHECK9-NEXT:    store i8* null, i8** [[TMP196]], align 8
4708 // CHECK9-NEXT:    [[TMP197:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 3
4709 // CHECK9-NEXT:    [[TMP198:%.*]] = bitcast i8** [[TMP197]] to double**
4710 // CHECK9-NEXT:    store double* [[TMP180]], double** [[TMP198]], align 8
4711 // CHECK9-NEXT:    [[TMP199:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 3
4712 // CHECK9-NEXT:    [[TMP200:%.*]] = bitcast i8** [[TMP199]] to double**
4713 // CHECK9-NEXT:    store double* [[TMP180]], double** [[TMP200]], align 8
4714 // CHECK9-NEXT:    [[TMP201:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 3
4715 // CHECK9-NEXT:    store i8* null, i8** [[TMP201]], align 8
4716 // CHECK9-NEXT:    [[TMP202:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 4
4717 // CHECK9-NEXT:    [[TMP203:%.*]] = bitcast i8** [[TMP202]] to double**
4718 // CHECK9-NEXT:    store double* [[TMP181]], double** [[TMP203]], align 8
4719 // CHECK9-NEXT:    [[TMP204:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 4
4720 // CHECK9-NEXT:    [[TMP205:%.*]] = bitcast i8** [[TMP204]] to double**
4721 // CHECK9-NEXT:    store double* [[TMP181]], double** [[TMP205]], align 8
4722 // CHECK9-NEXT:    [[TMP206:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 4
4723 // CHECK9-NEXT:    store i8* null, i8** [[TMP206]], align 8
4724 // CHECK9-NEXT:    [[TMP207:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 0
4725 // CHECK9-NEXT:    [[TMP208:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 0
4726 // CHECK9-NEXT:    [[TMP209:%.*]] = load i32, i32* [[N]], align 4
4727 // CHECK9-NEXT:    store i32 [[TMP209]], i32* [[DOTCAPTURE_EXPR_57]], align 4
4728 // CHECK9-NEXT:    [[TMP210:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_57]], align 4
4729 // CHECK9-NEXT:    [[SUB59:%.*]] = sub nsw i32 [[TMP210]], 0
4730 // CHECK9-NEXT:    [[DIV60:%.*]] = sdiv i32 [[SUB59]], 1
4731 // CHECK9-NEXT:    [[SUB61:%.*]] = sub nsw i32 [[DIV60]], 1
4732 // CHECK9-NEXT:    store i32 [[SUB61]], i32* [[DOTCAPTURE_EXPR_58]], align 4
4733 // CHECK9-NEXT:    [[TMP211:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_58]], align 4
4734 // CHECK9-NEXT:    [[ADD62:%.*]] = add nsw i32 [[TMP211]], 1
4735 // CHECK9-NEXT:    [[TMP212:%.*]] = zext i32 [[ADD62]] to i64
4736 // CHECK9-NEXT:    [[KERNEL_ARGS63:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
4737 // CHECK9-NEXT:    [[TMP213:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 0
4738 // CHECK9-NEXT:    store i32 1, i32* [[TMP213]], align 4
4739 // CHECK9-NEXT:    [[TMP214:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 1
4740 // CHECK9-NEXT:    store i32 5, i32* [[TMP214]], align 4
4741 // CHECK9-NEXT:    [[TMP215:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 2
4742 // CHECK9-NEXT:    store i8** [[TMP207]], i8*** [[TMP215]], align 8
4743 // CHECK9-NEXT:    [[TMP216:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 3
4744 // CHECK9-NEXT:    store i8** [[TMP208]], i8*** [[TMP216]], align 8
4745 // CHECK9-NEXT:    [[TMP217:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 4
4746 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.16, i32 0, i32 0), i64** [[TMP217]], align 8
4747 // CHECK9-NEXT:    [[TMP218:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 5
4748 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP218]], align 8
4749 // CHECK9-NEXT:    [[TMP219:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 6
4750 // CHECK9-NEXT:    store i8** null, i8*** [[TMP219]], align 8
4751 // CHECK9-NEXT:    [[TMP220:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 7
4752 // CHECK9-NEXT:    store i8** null, i8*** [[TMP220]], align 8
4753 // CHECK9-NEXT:    [[TMP221:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 8
4754 // CHECK9-NEXT:    store i64 [[TMP212]], i64* [[TMP221]], align 8
4755 // CHECK9-NEXT:    [[TMP222:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l506.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]])
4756 // CHECK9-NEXT:    [[TMP223:%.*]] = icmp ne i32 [[TMP222]], 0
4757 // CHECK9-NEXT:    br i1 [[TMP223]], label [[OMP_OFFLOAD_FAILED64:%.*]], label [[OMP_OFFLOAD_CONT65:%.*]]
4758 // CHECK9:       omp_offload.failed64:
4759 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l506(i64 [[TMP176]], i64 [[TMP178]], double* [[TMP179]], double* [[TMP180]], double* [[TMP181]]) #[[ATTR2]]
4760 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT65]]
4761 // CHECK9:       omp_offload.cont65:
4762 // CHECK9-NEXT:    [[TMP224:%.*]] = load i32, i32* [[N]], align 4
4763 // CHECK9-NEXT:    [[CONV67:%.*]] = bitcast i64* [[N_CASTED66]] to i32*
4764 // CHECK9-NEXT:    store i32 [[TMP224]], i32* [[CONV67]], align 4
4765 // CHECK9-NEXT:    [[TMP225:%.*]] = load i64, i64* [[N_CASTED66]], align 8
4766 // CHECK9-NEXT:    [[TMP226:%.*]] = load double*, double** [[A]], align 8
4767 // CHECK9-NEXT:    [[TMP227:%.*]] = load double*, double** [[B]], align 8
4768 // CHECK9-NEXT:    [[TMP228:%.*]] = load double*, double** [[C]], align 8
4769 // CHECK9-NEXT:    [[TMP229:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 0
4770 // CHECK9-NEXT:    [[TMP230:%.*]] = bitcast i8** [[TMP229]] to i64*
4771 // CHECK9-NEXT:    store i64 [[TMP225]], i64* [[TMP230]], align 8
4772 // CHECK9-NEXT:    [[TMP231:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 0
4773 // CHECK9-NEXT:    [[TMP232:%.*]] = bitcast i8** [[TMP231]] to i64*
4774 // CHECK9-NEXT:    store i64 [[TMP225]], i64* [[TMP232]], align 8
4775 // CHECK9-NEXT:    [[TMP233:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS70]], i64 0, i64 0
4776 // CHECK9-NEXT:    store i8* null, i8** [[TMP233]], align 8
4777 // CHECK9-NEXT:    [[TMP234:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 1
4778 // CHECK9-NEXT:    [[TMP235:%.*]] = bitcast i8** [[TMP234]] to double**
4779 // CHECK9-NEXT:    store double* [[TMP226]], double** [[TMP235]], align 8
4780 // CHECK9-NEXT:    [[TMP236:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 1
4781 // CHECK9-NEXT:    [[TMP237:%.*]] = bitcast i8** [[TMP236]] to double**
4782 // CHECK9-NEXT:    store double* [[TMP226]], double** [[TMP237]], align 8
4783 // CHECK9-NEXT:    [[TMP238:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS70]], i64 0, i64 1
4784 // CHECK9-NEXT:    store i8* null, i8** [[TMP238]], align 8
4785 // CHECK9-NEXT:    [[TMP239:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 2
4786 // CHECK9-NEXT:    [[TMP240:%.*]] = bitcast i8** [[TMP239]] to double**
4787 // CHECK9-NEXT:    store double* [[TMP227]], double** [[TMP240]], align 8
4788 // CHECK9-NEXT:    [[TMP241:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 2
4789 // CHECK9-NEXT:    [[TMP242:%.*]] = bitcast i8** [[TMP241]] to double**
4790 // CHECK9-NEXT:    store double* [[TMP227]], double** [[TMP242]], align 8
4791 // CHECK9-NEXT:    [[TMP243:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS70]], i64 0, i64 2
4792 // CHECK9-NEXT:    store i8* null, i8** [[TMP243]], align 8
4793 // CHECK9-NEXT:    [[TMP244:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 3
4794 // CHECK9-NEXT:    [[TMP245:%.*]] = bitcast i8** [[TMP244]] to double**
4795 // CHECK9-NEXT:    store double* [[TMP228]], double** [[TMP245]], align 8
4796 // CHECK9-NEXT:    [[TMP246:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 3
4797 // CHECK9-NEXT:    [[TMP247:%.*]] = bitcast i8** [[TMP246]] to double**
4798 // CHECK9-NEXT:    store double* [[TMP228]], double** [[TMP247]], align 8
4799 // CHECK9-NEXT:    [[TMP248:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS70]], i64 0, i64 3
4800 // CHECK9-NEXT:    store i8* null, i8** [[TMP248]], align 8
4801 // CHECK9-NEXT:    [[TMP249:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 0
4802 // CHECK9-NEXT:    [[TMP250:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 0
4803 // CHECK9-NEXT:    [[TMP251:%.*]] = load i32, i32* [[N]], align 4
4804 // CHECK9-NEXT:    store i32 [[TMP251]], i32* [[DOTCAPTURE_EXPR_72]], align 4
4805 // CHECK9-NEXT:    [[TMP252:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_72]], align 4
4806 // CHECK9-NEXT:    [[SUB74:%.*]] = sub nsw i32 [[TMP252]], 0
4807 // CHECK9-NEXT:    [[DIV75:%.*]] = sdiv i32 [[SUB74]], 1
4808 // CHECK9-NEXT:    [[SUB76:%.*]] = sub nsw i32 [[DIV75]], 1
4809 // CHECK9-NEXT:    store i32 [[SUB76]], i32* [[DOTCAPTURE_EXPR_73]], align 4
4810 // CHECK9-NEXT:    [[TMP253:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_73]], align 4
4811 // CHECK9-NEXT:    [[ADD77:%.*]] = add nsw i32 [[TMP253]], 1
4812 // CHECK9-NEXT:    [[TMP254:%.*]] = zext i32 [[ADD77]] to i64
4813 // CHECK9-NEXT:    [[KERNEL_ARGS78:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
4814 // CHECK9-NEXT:    [[TMP255:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 0
4815 // CHECK9-NEXT:    store i32 1, i32* [[TMP255]], align 4
4816 // CHECK9-NEXT:    [[TMP256:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 1
4817 // CHECK9-NEXT:    store i32 4, i32* [[TMP256]], align 4
4818 // CHECK9-NEXT:    [[TMP257:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 2
4819 // CHECK9-NEXT:    store i8** [[TMP249]], i8*** [[TMP257]], align 8
4820 // CHECK9-NEXT:    [[TMP258:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 3
4821 // CHECK9-NEXT:    store i8** [[TMP250]], i8*** [[TMP258]], align 8
4822 // CHECK9-NEXT:    [[TMP259:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 4
4823 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.20, i32 0, i32 0), i64** [[TMP259]], align 8
4824 // CHECK9-NEXT:    [[TMP260:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 5
4825 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.21, i32 0, i32 0), i64** [[TMP260]], align 8
4826 // CHECK9-NEXT:    [[TMP261:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 6
4827 // CHECK9-NEXT:    store i8** null, i8*** [[TMP261]], align 8
4828 // CHECK9-NEXT:    [[TMP262:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 7
4829 // CHECK9-NEXT:    store i8** null, i8*** [[TMP262]], align 8
4830 // CHECK9-NEXT:    [[TMP263:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 8
4831 // CHECK9-NEXT:    store i64 [[TMP254]], i64* [[TMP263]], align 8
4832 // CHECK9-NEXT:    [[TMP264:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l536.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]])
4833 // CHECK9-NEXT:    [[TMP265:%.*]] = icmp ne i32 [[TMP264]], 0
4834 // CHECK9-NEXT:    br i1 [[TMP265]], label [[OMP_OFFLOAD_FAILED79:%.*]], label [[OMP_OFFLOAD_CONT80:%.*]]
4835 // CHECK9:       omp_offload.failed79:
4836 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l536(i64 [[TMP225]], double* [[TMP226]], double* [[TMP227]], double* [[TMP228]]) #[[ATTR2]]
4837 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT80]]
4838 // CHECK9:       omp_offload.cont80:
4839 // CHECK9-NEXT:    [[TMP266:%.*]] = load i32, i32* [[CH]], align 4
4840 // CHECK9-NEXT:    [[CONV82:%.*]] = bitcast i64* [[CH_CASTED81]] to i32*
4841 // CHECK9-NEXT:    store i32 [[TMP266]], i32* [[CONV82]], align 4
4842 // CHECK9-NEXT:    [[TMP267:%.*]] = load i64, i64* [[CH_CASTED81]], align 8
4843 // CHECK9-NEXT:    [[TMP268:%.*]] = load i32, i32* [[N]], align 4
4844 // CHECK9-NEXT:    [[CONV84:%.*]] = bitcast i64* [[N_CASTED83]] to i32*
4845 // CHECK9-NEXT:    store i32 [[TMP268]], i32* [[CONV84]], align 4
4846 // CHECK9-NEXT:    [[TMP269:%.*]] = load i64, i64* [[N_CASTED83]], align 8
4847 // CHECK9-NEXT:    [[TMP270:%.*]] = load double*, double** [[A]], align 8
4848 // CHECK9-NEXT:    [[TMP271:%.*]] = load double*, double** [[B]], align 8
4849 // CHECK9-NEXT:    [[TMP272:%.*]] = load double*, double** [[C]], align 8
4850 // CHECK9-NEXT:    [[TMP273:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 0
4851 // CHECK9-NEXT:    [[TMP274:%.*]] = bitcast i8** [[TMP273]] to i64*
4852 // CHECK9-NEXT:    store i64 [[TMP267]], i64* [[TMP274]], align 8
4853 // CHECK9-NEXT:    [[TMP275:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 0
4854 // CHECK9-NEXT:    [[TMP276:%.*]] = bitcast i8** [[TMP275]] to i64*
4855 // CHECK9-NEXT:    store i64 [[TMP267]], i64* [[TMP276]], align 8
4856 // CHECK9-NEXT:    [[TMP277:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 0
4857 // CHECK9-NEXT:    store i8* null, i8** [[TMP277]], align 8
4858 // CHECK9-NEXT:    [[TMP278:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 1
4859 // CHECK9-NEXT:    [[TMP279:%.*]] = bitcast i8** [[TMP278]] to i64*
4860 // CHECK9-NEXT:    store i64 [[TMP269]], i64* [[TMP279]], align 8
4861 // CHECK9-NEXT:    [[TMP280:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 1
4862 // CHECK9-NEXT:    [[TMP281:%.*]] = bitcast i8** [[TMP280]] to i64*
4863 // CHECK9-NEXT:    store i64 [[TMP269]], i64* [[TMP281]], align 8
4864 // CHECK9-NEXT:    [[TMP282:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 1
4865 // CHECK9-NEXT:    store i8* null, i8** [[TMP282]], align 8
4866 // CHECK9-NEXT:    [[TMP283:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 2
4867 // CHECK9-NEXT:    [[TMP284:%.*]] = bitcast i8** [[TMP283]] to double**
4868 // CHECK9-NEXT:    store double* [[TMP270]], double** [[TMP284]], align 8
4869 // CHECK9-NEXT:    [[TMP285:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 2
4870 // CHECK9-NEXT:    [[TMP286:%.*]] = bitcast i8** [[TMP285]] to double**
4871 // CHECK9-NEXT:    store double* [[TMP270]], double** [[TMP286]], align 8
4872 // CHECK9-NEXT:    [[TMP287:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 2
4873 // CHECK9-NEXT:    store i8* null, i8** [[TMP287]], align 8
4874 // CHECK9-NEXT:    [[TMP288:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 3
4875 // CHECK9-NEXT:    [[TMP289:%.*]] = bitcast i8** [[TMP288]] to double**
4876 // CHECK9-NEXT:    store double* [[TMP271]], double** [[TMP289]], align 8
4877 // CHECK9-NEXT:    [[TMP290:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 3
4878 // CHECK9-NEXT:    [[TMP291:%.*]] = bitcast i8** [[TMP290]] to double**
4879 // CHECK9-NEXT:    store double* [[TMP271]], double** [[TMP291]], align 8
4880 // CHECK9-NEXT:    [[TMP292:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 3
4881 // CHECK9-NEXT:    store i8* null, i8** [[TMP292]], align 8
4882 // CHECK9-NEXT:    [[TMP293:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 4
4883 // CHECK9-NEXT:    [[TMP294:%.*]] = bitcast i8** [[TMP293]] to double**
4884 // CHECK9-NEXT:    store double* [[TMP272]], double** [[TMP294]], align 8
4885 // CHECK9-NEXT:    [[TMP295:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 4
4886 // CHECK9-NEXT:    [[TMP296:%.*]] = bitcast i8** [[TMP295]] to double**
4887 // CHECK9-NEXT:    store double* [[TMP272]], double** [[TMP296]], align 8
4888 // CHECK9-NEXT:    [[TMP297:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 4
4889 // CHECK9-NEXT:    store i8* null, i8** [[TMP297]], align 8
4890 // CHECK9-NEXT:    [[TMP298:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 0
4891 // CHECK9-NEXT:    [[TMP299:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 0
4892 // CHECK9-NEXT:    [[TMP300:%.*]] = load i32, i32* [[N]], align 4
4893 // CHECK9-NEXT:    store i32 [[TMP300]], i32* [[DOTCAPTURE_EXPR_89]], align 4
4894 // CHECK9-NEXT:    [[TMP301:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_89]], align 4
4895 // CHECK9-NEXT:    [[SUB91:%.*]] = sub nsw i32 [[TMP301]], 0
4896 // CHECK9-NEXT:    [[DIV92:%.*]] = sdiv i32 [[SUB91]], 1
4897 // CHECK9-NEXT:    [[SUB93:%.*]] = sub nsw i32 [[DIV92]], 1
4898 // CHECK9-NEXT:    store i32 [[SUB93]], i32* [[DOTCAPTURE_EXPR_90]], align 4
4899 // CHECK9-NEXT:    [[TMP302:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_90]], align 4
4900 // CHECK9-NEXT:    [[ADD94:%.*]] = add nsw i32 [[TMP302]], 1
4901 // CHECK9-NEXT:    [[TMP303:%.*]] = zext i32 [[ADD94]] to i64
4902 // CHECK9-NEXT:    [[KERNEL_ARGS95:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
4903 // CHECK9-NEXT:    [[TMP304:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 0
4904 // CHECK9-NEXT:    store i32 1, i32* [[TMP304]], align 4
4905 // CHECK9-NEXT:    [[TMP305:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 1
4906 // CHECK9-NEXT:    store i32 5, i32* [[TMP305]], align 4
4907 // CHECK9-NEXT:    [[TMP306:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 2
4908 // CHECK9-NEXT:    store i8** [[TMP298]], i8*** [[TMP306]], align 8
4909 // CHECK9-NEXT:    [[TMP307:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 3
4910 // CHECK9-NEXT:    store i8** [[TMP299]], i8*** [[TMP307]], align 8
4911 // CHECK9-NEXT:    [[TMP308:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 4
4912 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.24, i32 0, i32 0), i64** [[TMP308]], align 8
4913 // CHECK9-NEXT:    [[TMP309:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 5
4914 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.25, i32 0, i32 0), i64** [[TMP309]], align 8
4915 // CHECK9-NEXT:    [[TMP310:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 6
4916 // CHECK9-NEXT:    store i8** null, i8*** [[TMP310]], align 8
4917 // CHECK9-NEXT:    [[TMP311:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 7
4918 // CHECK9-NEXT:    store i8** null, i8*** [[TMP311]], align 8
4919 // CHECK9-NEXT:    [[TMP312:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 8
4920 // CHECK9-NEXT:    store i64 [[TMP303]], i64* [[TMP312]], align 8
4921 // CHECK9-NEXT:    [[TMP313:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l562.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]])
4922 // CHECK9-NEXT:    [[TMP314:%.*]] = icmp ne i32 [[TMP313]], 0
4923 // CHECK9-NEXT:    br i1 [[TMP314]], label [[OMP_OFFLOAD_FAILED96:%.*]], label [[OMP_OFFLOAD_CONT97:%.*]]
4924 // CHECK9:       omp_offload.failed96:
4925 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l562(i64 [[TMP267]], i64 [[TMP269]], double* [[TMP270]], double* [[TMP271]], double* [[TMP272]]) #[[ATTR2]]
4926 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT97]]
4927 // CHECK9:       omp_offload.cont97:
4928 // CHECK9-NEXT:    [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiET_v()
4929 // CHECK9-NEXT:    ret i32 [[CALL]]
4930 //
4931 //
4932 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l369
4933 // CHECK9-SAME: (i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1:[0-9]+]] {
4934 // CHECK9-NEXT:  entry:
4935 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
4936 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
4937 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
4938 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
4939 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
4940 // CHECK9-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
4941 // CHECK9-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
4942 // CHECK9-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
4943 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
4944 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[CONV]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
4945 // CHECK9-NEXT:    ret void
4946 //
4947 //
4948 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined.
4949 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
4950 // CHECK9-NEXT:  entry:
4951 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4952 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4953 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
4954 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
4955 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
4956 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
4957 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4958 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4959 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4960 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4961 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
4962 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
4963 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
4964 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4965 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4966 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
4967 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4968 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4969 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
4970 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
4971 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
4972 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
4973 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
4974 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
4975 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
4976 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
4977 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
4978 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
4979 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4980 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
4981 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4982 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
4983 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4984 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
4985 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4986 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
4987 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4988 // CHECK9:       omp.precond.then:
4989 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
4990 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4991 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
4992 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4993 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4994 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4995 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
4996 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
4997 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4998 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4999 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
5000 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5001 // CHECK9:       cond.true:
5002 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5003 // CHECK9-NEXT:    br label [[COND_END:%.*]]
5004 // CHECK9:       cond.false:
5005 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5006 // CHECK9-NEXT:    br label [[COND_END]]
5007 // CHECK9:       cond.end:
5008 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
5009 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5010 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5011 // CHECK9-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
5012 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5013 // CHECK9:       omp.inner.for.cond:
5014 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5015 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5016 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
5017 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5018 // CHECK9:       omp.inner.for.body:
5019 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5020 // CHECK9-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
5021 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5022 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
5023 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
5024 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5025 // CHECK9:       omp.inner.for.inc:
5026 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5027 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5028 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
5029 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
5030 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
5031 // CHECK9:       omp.inner.for.end:
5032 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5033 // CHECK9:       omp.loop.exit:
5034 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5035 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
5036 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
5037 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
5038 // CHECK9:       omp.precond.end:
5039 // CHECK9-NEXT:    ret void
5040 //
5041 //
5042 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..1
5043 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
5044 // CHECK9-NEXT:  entry:
5045 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5046 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5047 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
5048 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
5049 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5050 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
5051 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
5052 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
5053 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5054 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5055 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5056 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5057 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
5058 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5059 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5060 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5061 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5062 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
5063 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5064 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5065 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5066 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5067 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5068 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
5069 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
5070 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
5071 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5072 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
5073 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
5074 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
5075 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
5076 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
5077 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5078 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
5079 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5080 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5081 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5082 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
5083 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5084 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
5085 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5086 // CHECK9:       omp.precond.then:
5087 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5088 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5089 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
5090 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5091 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
5092 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5093 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
5094 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
5095 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
5096 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5097 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5098 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5099 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
5100 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5101 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5102 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5103 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
5104 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5105 // CHECK9:       cond.true:
5106 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5107 // CHECK9-NEXT:    br label [[COND_END:%.*]]
5108 // CHECK9:       cond.false:
5109 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5110 // CHECK9-NEXT:    br label [[COND_END]]
5111 // CHECK9:       cond.end:
5112 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
5113 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5114 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5115 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
5116 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5117 // CHECK9:       omp.inner.for.cond:
5118 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5119 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5120 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
5121 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5122 // CHECK9:       omp.inner.for.body:
5123 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5124 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
5125 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5126 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
5127 // CHECK9-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 8
5128 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
5129 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
5130 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i64 [[IDXPROM]]
5131 // CHECK9-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 8
5132 // CHECK9-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 8
5133 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
5134 // CHECK9-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
5135 // CHECK9-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM7]]
5136 // CHECK9-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX8]], align 8
5137 // CHECK9-NEXT:    [[ADD9:%.*]] = fadd double [[TMP22]], [[TMP25]]
5138 // CHECK9-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 8
5139 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
5140 // CHECK9-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
5141 // CHECK9-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM10]]
5142 // CHECK9-NEXT:    store double [[ADD9]], double* [[ARRAYIDX11]], align 8
5143 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5144 // CHECK9:       omp.body.continue:
5145 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5146 // CHECK9:       omp.inner.for.inc:
5147 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5148 // CHECK9-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP28]], 1
5149 // CHECK9-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
5150 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
5151 // CHECK9:       omp.inner.for.end:
5152 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5153 // CHECK9:       omp.loop.exit:
5154 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5155 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
5156 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
5157 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
5158 // CHECK9:       omp.precond.end:
5159 // CHECK9-NEXT:    ret void
5160 //
5161 //
5162 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l408
5163 // CHECK9-SAME: (i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
5164 // CHECK9-NEXT:  entry:
5165 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
5166 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
5167 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
5168 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
5169 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
5170 // CHECK9-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
5171 // CHECK9-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
5172 // CHECK9-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
5173 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
5174 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* [[CONV]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
5175 // CHECK9-NEXT:    ret void
5176 //
5177 //
5178 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..2
5179 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
5180 // CHECK9-NEXT:  entry:
5181 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5182 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5183 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5184 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
5185 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
5186 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
5187 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5188 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5189 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5190 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5191 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
5192 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5193 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5194 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5195 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5196 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
5197 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5198 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5199 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5200 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
5201 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
5202 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
5203 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5204 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
5205 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
5206 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
5207 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
5208 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
5209 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5210 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
5211 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5212 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5213 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5214 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
5215 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5216 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
5217 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5218 // CHECK9:       omp.precond.then:
5219 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5220 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5221 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
5222 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5223 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5224 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5225 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
5226 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5227 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5228 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5229 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
5230 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5231 // CHECK9:       cond.true:
5232 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5233 // CHECK9-NEXT:    br label [[COND_END:%.*]]
5234 // CHECK9:       cond.false:
5235 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5236 // CHECK9-NEXT:    br label [[COND_END]]
5237 // CHECK9:       cond.end:
5238 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
5239 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5240 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5241 // CHECK9-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
5242 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5243 // CHECK9:       omp.inner.for.cond:
5244 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5245 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5246 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
5247 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5248 // CHECK9:       omp.inner.for.body:
5249 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5250 // CHECK9-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
5251 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5252 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
5253 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
5254 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5255 // CHECK9:       omp.inner.for.inc:
5256 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5257 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5258 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
5259 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
5260 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
5261 // CHECK9:       omp.inner.for.end:
5262 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5263 // CHECK9:       omp.loop.exit:
5264 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5265 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
5266 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
5267 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
5268 // CHECK9:       omp.precond.end:
5269 // CHECK9-NEXT:    ret void
5270 //
5271 //
5272 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..3
5273 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
5274 // CHECK9-NEXT:  entry:
5275 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5276 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5277 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
5278 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
5279 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5280 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
5281 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
5282 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
5283 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5284 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5285 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5286 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5287 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
5288 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5289 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5290 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5291 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5292 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
5293 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5294 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5295 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5296 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5297 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5298 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
5299 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
5300 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
5301 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5302 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
5303 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
5304 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
5305 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
5306 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
5307 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5308 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
5309 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5310 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5311 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5312 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
5313 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5314 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
5315 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5316 // CHECK9:       omp.precond.then:
5317 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5318 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5319 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
5320 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5321 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
5322 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5323 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
5324 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
5325 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
5326 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5327 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5328 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5329 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
5330 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5331 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5332 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5333 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
5334 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5335 // CHECK9:       cond.true:
5336 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5337 // CHECK9-NEXT:    br label [[COND_END:%.*]]
5338 // CHECK9:       cond.false:
5339 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5340 // CHECK9-NEXT:    br label [[COND_END]]
5341 // CHECK9:       cond.end:
5342 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
5343 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5344 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5345 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
5346 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5347 // CHECK9:       omp.inner.for.cond:
5348 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5349 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5350 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
5351 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5352 // CHECK9:       omp.inner.for.body:
5353 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5354 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
5355 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5356 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
5357 // CHECK9-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 8
5358 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
5359 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
5360 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i64 [[IDXPROM]]
5361 // CHECK9-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 8
5362 // CHECK9-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 8
5363 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
5364 // CHECK9-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
5365 // CHECK9-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM7]]
5366 // CHECK9-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX8]], align 8
5367 // CHECK9-NEXT:    [[ADD9:%.*]] = fadd double [[TMP22]], [[TMP25]]
5368 // CHECK9-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 8
5369 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
5370 // CHECK9-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
5371 // CHECK9-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM10]]
5372 // CHECK9-NEXT:    store double [[ADD9]], double* [[ARRAYIDX11]], align 8
5373 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5374 // CHECK9:       omp.body.continue:
5375 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5376 // CHECK9:       omp.inner.for.inc:
5377 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5378 // CHECK9-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP28]], 1
5379 // CHECK9-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
5380 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
5381 // CHECK9:       omp.inner.for.end:
5382 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5383 // CHECK9:       omp.loop.exit:
5384 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5385 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
5386 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
5387 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
5388 // CHECK9:       omp.precond.end:
5389 // CHECK9-NEXT:    ret void
5390 //
5391 //
5392 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l447
5393 // CHECK9-SAME: (i64 noundef [[CH:%.*]], i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
5394 // CHECK9-NEXT:  entry:
5395 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i64, align 8
5396 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
5397 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
5398 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
5399 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
5400 // CHECK9-NEXT:    store i64 [[CH]], i64* [[CH_ADDR]], align 8
5401 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
5402 // CHECK9-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
5403 // CHECK9-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
5404 // CHECK9-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
5405 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[CH_ADDR]] to i32*
5406 // CHECK9-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
5407 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* [[CONV]], i32* [[CONV1]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
5408 // CHECK9-NEXT:    ret void
5409 //
5410 //
5411 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..6
5412 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
5413 // CHECK9-NEXT:  entry:
5414 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5415 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5416 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 8
5417 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5418 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
5419 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
5420 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
5421 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5422 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5423 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5424 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5425 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
5426 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5427 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5428 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5429 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5430 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
5431 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5432 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5433 // CHECK9-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 8
5434 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5435 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
5436 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
5437 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
5438 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 8
5439 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5440 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 8
5441 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 8
5442 // CHECK9-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 8
5443 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP1]], align 4
5444 // CHECK9-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
5445 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5446 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP6]], 0
5447 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5448 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5449 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5450 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
5451 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5452 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP7]]
5453 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5454 // CHECK9:       omp.precond.then:
5455 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5456 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5457 // CHECK9-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_COMB_UB]], align 4
5458 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5459 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5460 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP0]], align 4
5461 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5462 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
5463 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP9]])
5464 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5465 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5466 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
5467 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5468 // CHECK9:       cond.true:
5469 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5470 // CHECK9-NEXT:    br label [[COND_END:%.*]]
5471 // CHECK9:       cond.false:
5472 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5473 // CHECK9-NEXT:    br label [[COND_END]]
5474 // CHECK9:       cond.end:
5475 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
5476 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5477 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5478 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
5479 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5480 // CHECK9:       omp.inner.for.cond:
5481 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5482 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5483 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], 1
5484 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp slt i32 [[TMP17]], [[ADD]]
5485 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5486 // CHECK9:       omp.inner.for.body:
5487 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5488 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
5489 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5490 // CHECK9-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i64
5491 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i64 [[TMP20]], i64 [[TMP22]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]])
5492 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5493 // CHECK9:       omp.inner.for.inc:
5494 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5495 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5496 // CHECK9-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
5497 // CHECK9-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
5498 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5499 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5500 // CHECK9-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
5501 // CHECK9-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_COMB_LB]], align 4
5502 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5503 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5504 // CHECK9-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP27]], [[TMP28]]
5505 // CHECK9-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_UB]], align 4
5506 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5507 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5508 // CHECK9-NEXT:    [[CMP9:%.*]] = icmp sgt i32 [[TMP29]], [[TMP30]]
5509 // CHECK9-NEXT:    br i1 [[CMP9]], label [[COND_TRUE10:%.*]], label [[COND_FALSE11:%.*]]
5510 // CHECK9:       cond.true10:
5511 // CHECK9-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5512 // CHECK9-NEXT:    br label [[COND_END12:%.*]]
5513 // CHECK9:       cond.false11:
5514 // CHECK9-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5515 // CHECK9-NEXT:    br label [[COND_END12]]
5516 // CHECK9:       cond.end12:
5517 // CHECK9-NEXT:    [[COND13:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE10]] ], [ [[TMP32]], [[COND_FALSE11]] ]
5518 // CHECK9-NEXT:    store i32 [[COND13]], i32* [[DOTOMP_COMB_UB]], align 4
5519 // CHECK9-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5520 // CHECK9-NEXT:    store i32 [[TMP33]], i32* [[DOTOMP_IV]], align 4
5521 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
5522 // CHECK9:       omp.inner.for.end:
5523 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5524 // CHECK9:       omp.loop.exit:
5525 // CHECK9-NEXT:    [[TMP34:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5526 // CHECK9-NEXT:    [[TMP35:%.*]] = load i32, i32* [[TMP34]], align 4
5527 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP35]])
5528 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
5529 // CHECK9:       omp.precond.end:
5530 // CHECK9-NEXT:    ret void
5531 //
5532 //
5533 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..7
5534 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
5535 // CHECK9-NEXT:  entry:
5536 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5537 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5538 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
5539 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
5540 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5541 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
5542 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
5543 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
5544 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5545 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5546 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5547 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5548 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
5549 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5550 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5551 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5552 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5553 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
5554 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5555 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5556 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5557 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5558 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5559 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
5560 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
5561 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
5562 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5563 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
5564 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
5565 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
5566 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
5567 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
5568 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5569 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
5570 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5571 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5572 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5573 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
5574 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5575 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
5576 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5577 // CHECK9:       omp.precond.then:
5578 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5579 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5580 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
5581 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5582 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
5583 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5584 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
5585 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
5586 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
5587 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5588 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5589 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5590 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
5591 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5592 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5593 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5594 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
5595 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5596 // CHECK9:       cond.true:
5597 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5598 // CHECK9-NEXT:    br label [[COND_END:%.*]]
5599 // CHECK9:       cond.false:
5600 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5601 // CHECK9-NEXT:    br label [[COND_END]]
5602 // CHECK9:       cond.end:
5603 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
5604 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5605 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5606 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
5607 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5608 // CHECK9:       omp.inner.for.cond:
5609 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5610 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5611 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
5612 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5613 // CHECK9:       omp.inner.for.body:
5614 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5615 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
5616 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5617 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
5618 // CHECK9-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 8
5619 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
5620 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
5621 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i64 [[IDXPROM]]
5622 // CHECK9-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 8
5623 // CHECK9-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 8
5624 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
5625 // CHECK9-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
5626 // CHECK9-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM7]]
5627 // CHECK9-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX8]], align 8
5628 // CHECK9-NEXT:    [[ADD9:%.*]] = fadd double [[TMP22]], [[TMP25]]
5629 // CHECK9-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 8
5630 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
5631 // CHECK9-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
5632 // CHECK9-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM10]]
5633 // CHECK9-NEXT:    store double [[ADD9]], double* [[ARRAYIDX11]], align 8
5634 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5635 // CHECK9:       omp.body.continue:
5636 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5637 // CHECK9:       omp.inner.for.inc:
5638 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5639 // CHECK9-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP28]], 1
5640 // CHECK9-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
5641 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
5642 // CHECK9:       omp.inner.for.end:
5643 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5644 // CHECK9:       omp.loop.exit:
5645 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5646 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
5647 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
5648 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
5649 // CHECK9:       omp.precond.end:
5650 // CHECK9-NEXT:    ret void
5651 //
5652 //
5653 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l478
5654 // CHECK9-SAME: (i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
5655 // CHECK9-NEXT:  entry:
5656 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
5657 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
5658 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
5659 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
5660 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
5661 // CHECK9-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
5662 // CHECK9-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
5663 // CHECK9-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
5664 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
5665 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..10 to void (i32*, i32*, ...)*), i32* [[CONV]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
5666 // CHECK9-NEXT:    ret void
5667 //
5668 //
5669 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..10
5670 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
5671 // CHECK9-NEXT:  entry:
5672 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5673 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5674 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5675 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
5676 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
5677 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
5678 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5679 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5680 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5681 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5682 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
5683 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5684 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5685 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5686 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5687 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
5688 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5689 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5690 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5691 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
5692 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
5693 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
5694 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5695 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
5696 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
5697 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
5698 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
5699 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
5700 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5701 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
5702 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5703 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5704 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5705 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
5706 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5707 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
5708 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5709 // CHECK9:       omp.precond.then:
5710 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5711 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5712 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
5713 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5714 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5715 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5716 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
5717 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5718 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5719 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5720 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
5721 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5722 // CHECK9:       cond.true:
5723 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5724 // CHECK9-NEXT:    br label [[COND_END:%.*]]
5725 // CHECK9:       cond.false:
5726 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5727 // CHECK9-NEXT:    br label [[COND_END]]
5728 // CHECK9:       cond.end:
5729 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
5730 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5731 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5732 // CHECK9-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
5733 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5734 // CHECK9:       omp.inner.for.cond:
5735 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5736 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5737 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
5738 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5739 // CHECK9:       omp.inner.for.body:
5740 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5741 // CHECK9-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
5742 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5743 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
5744 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
5745 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5746 // CHECK9:       omp.inner.for.inc:
5747 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5748 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5749 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
5750 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
5751 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
5752 // CHECK9:       omp.inner.for.end:
5753 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5754 // CHECK9:       omp.loop.exit:
5755 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5756 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
5757 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
5758 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
5759 // CHECK9:       omp.precond.end:
5760 // CHECK9-NEXT:    ret void
5761 //
5762 //
5763 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..11
5764 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
5765 // CHECK9-NEXT:  entry:
5766 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5767 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5768 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
5769 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
5770 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5771 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
5772 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
5773 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
5774 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5775 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5776 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5777 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5778 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
5779 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5780 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5781 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5782 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5783 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
5784 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5785 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5786 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5787 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5788 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5789 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
5790 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
5791 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
5792 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5793 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
5794 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
5795 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
5796 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
5797 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
5798 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5799 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
5800 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5801 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5802 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5803 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
5804 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5805 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
5806 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5807 // CHECK9:       omp.precond.then:
5808 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5809 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5810 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
5811 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5812 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
5813 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5814 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
5815 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
5816 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
5817 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5818 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5819 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5820 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
5821 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5822 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5823 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5824 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
5825 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5826 // CHECK9:       cond.true:
5827 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5828 // CHECK9-NEXT:    br label [[COND_END:%.*]]
5829 // CHECK9:       cond.false:
5830 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5831 // CHECK9-NEXT:    br label [[COND_END]]
5832 // CHECK9:       cond.end:
5833 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
5834 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5835 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5836 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
5837 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5838 // CHECK9:       omp.inner.for.cond:
5839 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5840 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5841 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
5842 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5843 // CHECK9:       omp.inner.for.body:
5844 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5845 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
5846 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5847 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
5848 // CHECK9-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 8
5849 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
5850 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
5851 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i64 [[IDXPROM]]
5852 // CHECK9-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 8
5853 // CHECK9-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 8
5854 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
5855 // CHECK9-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
5856 // CHECK9-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM7]]
5857 // CHECK9-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX8]], align 8
5858 // CHECK9-NEXT:    [[ADD9:%.*]] = fadd double [[TMP22]], [[TMP25]]
5859 // CHECK9-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 8
5860 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
5861 // CHECK9-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
5862 // CHECK9-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM10]]
5863 // CHECK9-NEXT:    store double [[ADD9]], double* [[ARRAYIDX11]], align 8
5864 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5865 // CHECK9:       omp.body.continue:
5866 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5867 // CHECK9:       omp.inner.for.inc:
5868 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5869 // CHECK9-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP28]], 1
5870 // CHECK9-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
5871 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
5872 // CHECK9:       omp.inner.for.end:
5873 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5874 // CHECK9:       omp.loop.exit:
5875 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5876 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
5877 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
5878 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
5879 // CHECK9:       omp.precond.end:
5880 // CHECK9-NEXT:    ret void
5881 //
5882 //
5883 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l506
5884 // CHECK9-SAME: (i64 noundef [[CH:%.*]], i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
5885 // CHECK9-NEXT:  entry:
5886 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i64, align 8
5887 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
5888 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
5889 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
5890 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
5891 // CHECK9-NEXT:    store i64 [[CH]], i64* [[CH_ADDR]], align 8
5892 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
5893 // CHECK9-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
5894 // CHECK9-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
5895 // CHECK9-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
5896 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[CH_ADDR]] to i32*
5897 // CHECK9-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
5898 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..14 to void (i32*, i32*, ...)*), i32* [[CONV]], i32* [[CONV1]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
5899 // CHECK9-NEXT:    ret void
5900 //
5901 //
5902 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..14
5903 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
5904 // CHECK9-NEXT:  entry:
5905 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5906 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5907 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 8
5908 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5909 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
5910 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
5911 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
5912 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5913 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5914 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5915 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5916 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
5917 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
5918 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5919 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5920 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5921 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5922 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
5923 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
5924 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5925 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5926 // CHECK9-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 8
5927 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5928 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
5929 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
5930 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
5931 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 8
5932 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5933 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 8
5934 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 8
5935 // CHECK9-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 8
5936 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
5937 // CHECK9-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
5938 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
5939 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5940 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5941 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
5942 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5943 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
5944 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
5945 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
5946 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5947 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
5948 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5949 // CHECK9:       omp.precond.then:
5950 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5951 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
5952 // CHECK9-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
5953 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5954 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5955 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5956 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
5957 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5958 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5959 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
5960 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
5961 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5962 // CHECK9:       cond.true:
5963 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
5964 // CHECK9-NEXT:    br label [[COND_END:%.*]]
5965 // CHECK9:       cond.false:
5966 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5967 // CHECK9-NEXT:    br label [[COND_END]]
5968 // CHECK9:       cond.end:
5969 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
5970 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5971 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5972 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
5973 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5974 // CHECK9:       omp.inner.for.cond:
5975 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5976 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5977 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
5978 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5979 // CHECK9:       omp.inner.for.body:
5980 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5981 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
5982 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5983 // CHECK9-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i64
5984 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5985 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
5986 // CHECK9-NEXT:    store i32 [[TMP23]], i32* [[CONV]], align 4
5987 // CHECK9-NEXT:    [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
5988 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**, i64)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i64 [[TMP20]], i64 [[TMP22]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]], i64 [[TMP24]])
5989 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5990 // CHECK9:       omp.inner.for.inc:
5991 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5992 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5993 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
5994 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
5995 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
5996 // CHECK9:       omp.inner.for.end:
5997 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5998 // CHECK9:       omp.loop.exit:
5999 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6000 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
6001 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]])
6002 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
6003 // CHECK9:       omp.precond.end:
6004 // CHECK9-NEXT:    ret void
6005 //
6006 //
6007 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..15
6008 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
6009 // CHECK9-NEXT:  entry:
6010 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6011 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6012 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
6013 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
6014 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
6015 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
6016 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
6017 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
6018 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
6019 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6020 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6021 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6022 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
6023 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
6024 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6025 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6026 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6027 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6028 // CHECK9-NEXT:    [[I6:%.*]] = alloca i32, align 4
6029 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6030 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6031 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6032 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6033 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
6034 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
6035 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
6036 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
6037 // CHECK9-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
6038 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
6039 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
6040 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
6041 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
6042 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
6043 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
6044 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6045 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6046 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
6047 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6048 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
6049 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
6050 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
6051 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6052 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
6053 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6054 // CHECK9:       omp.precond.then:
6055 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6056 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6057 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
6058 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6059 // CHECK9-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP8]] to i32
6060 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6061 // CHECK9-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP9]] to i32
6062 // CHECK9-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
6063 // CHECK9-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
6064 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6065 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6066 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[CONV]], align 4
6067 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6068 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
6069 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP12]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP10]])
6070 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
6071 // CHECK9:       omp.dispatch.cond:
6072 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6073 // CHECK9-NEXT:    [[TMP14:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6074 // CHECK9-NEXT:    [[CONV7:%.*]] = trunc i64 [[TMP14]] to i32
6075 // CHECK9-NEXT:    [[CMP8:%.*]] = icmp sgt i32 [[TMP13]], [[CONV7]]
6076 // CHECK9-NEXT:    br i1 [[CMP8]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6077 // CHECK9:       cond.true:
6078 // CHECK9-NEXT:    [[TMP15:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6079 // CHECK9-NEXT:    [[CONV9:%.*]] = trunc i64 [[TMP15]] to i32
6080 // CHECK9-NEXT:    br label [[COND_END:%.*]]
6081 // CHECK9:       cond.false:
6082 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6083 // CHECK9-NEXT:    br label [[COND_END]]
6084 // CHECK9:       cond.end:
6085 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[CONV9]], [[COND_TRUE]] ], [ [[TMP16]], [[COND_FALSE]] ]
6086 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
6087 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6088 // CHECK9-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
6089 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6090 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6091 // CHECK9-NEXT:    [[CMP10:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
6092 // CHECK9-NEXT:    br i1 [[CMP10]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
6093 // CHECK9:       omp.dispatch.body:
6094 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6095 // CHECK9:       omp.inner.for.cond:
6096 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6097 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6098 // CHECK9-NEXT:    [[CMP11:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]
6099 // CHECK9-NEXT:    br i1 [[CMP11]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6100 // CHECK9:       omp.inner.for.body:
6101 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6102 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP22]], 1
6103 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6104 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4
6105 // CHECK9-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP2]], align 8
6106 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I6]], align 4
6107 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP24]] to i64
6108 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP23]], i64 [[IDXPROM]]
6109 // CHECK9-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX]], align 8
6110 // CHECK9-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP3]], align 8
6111 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I6]], align 4
6112 // CHECK9-NEXT:    [[IDXPROM12:%.*]] = sext i32 [[TMP27]] to i64
6113 // CHECK9-NEXT:    [[ARRAYIDX13:%.*]] = getelementptr inbounds double, double* [[TMP26]], i64 [[IDXPROM12]]
6114 // CHECK9-NEXT:    [[TMP28:%.*]] = load double, double* [[ARRAYIDX13]], align 8
6115 // CHECK9-NEXT:    [[ADD14:%.*]] = fadd double [[TMP25]], [[TMP28]]
6116 // CHECK9-NEXT:    [[TMP29:%.*]] = load double*, double** [[TMP1]], align 8
6117 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[I6]], align 4
6118 // CHECK9-NEXT:    [[IDXPROM15:%.*]] = sext i32 [[TMP30]] to i64
6119 // CHECK9-NEXT:    [[ARRAYIDX16:%.*]] = getelementptr inbounds double, double* [[TMP29]], i64 [[IDXPROM15]]
6120 // CHECK9-NEXT:    store double [[ADD14]], double* [[ARRAYIDX16]], align 8
6121 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6122 // CHECK9:       omp.body.continue:
6123 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6124 // CHECK9:       omp.inner.for.inc:
6125 // CHECK9-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6126 // CHECK9-NEXT:    [[ADD17:%.*]] = add nsw i32 [[TMP31]], 1
6127 // CHECK9-NEXT:    store i32 [[ADD17]], i32* [[DOTOMP_IV]], align 4
6128 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
6129 // CHECK9:       omp.inner.for.end:
6130 // CHECK9-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
6131 // CHECK9:       omp.dispatch.inc:
6132 // CHECK9-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6133 // CHECK9-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6134 // CHECK9-NEXT:    [[ADD18:%.*]] = add nsw i32 [[TMP32]], [[TMP33]]
6135 // CHECK9-NEXT:    store i32 [[ADD18]], i32* [[DOTOMP_LB]], align 4
6136 // CHECK9-NEXT:    [[TMP34:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6137 // CHECK9-NEXT:    [[TMP35:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6138 // CHECK9-NEXT:    [[ADD19:%.*]] = add nsw i32 [[TMP34]], [[TMP35]]
6139 // CHECK9-NEXT:    store i32 [[ADD19]], i32* [[DOTOMP_UB]], align 4
6140 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND]]
6141 // CHECK9:       omp.dispatch.end:
6142 // CHECK9-NEXT:    [[TMP36:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6143 // CHECK9-NEXT:    [[TMP37:%.*]] = load i32, i32* [[TMP36]], align 4
6144 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP37]])
6145 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
6146 // CHECK9:       omp.precond.end:
6147 // CHECK9-NEXT:    ret void
6148 //
6149 //
6150 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l536
6151 // CHECK9-SAME: (i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
6152 // CHECK9-NEXT:  entry:
6153 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
6154 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
6155 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
6156 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
6157 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
6158 // CHECK9-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
6159 // CHECK9-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
6160 // CHECK9-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
6161 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
6162 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..18 to void (i32*, i32*, ...)*), i32* [[CONV]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
6163 // CHECK9-NEXT:    ret void
6164 //
6165 //
6166 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..18
6167 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
6168 // CHECK9-NEXT:  entry:
6169 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6170 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6171 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
6172 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
6173 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
6174 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
6175 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6176 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6177 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6178 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6179 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
6180 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6181 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6182 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6183 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6184 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
6185 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6186 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6187 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
6188 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
6189 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
6190 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
6191 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
6192 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
6193 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
6194 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
6195 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
6196 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
6197 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6198 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
6199 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6200 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
6201 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6202 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
6203 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6204 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
6205 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6206 // CHECK9:       omp.precond.then:
6207 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6208 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6209 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
6210 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6211 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6212 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6213 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
6214 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
6215 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6216 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6217 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
6218 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6219 // CHECK9:       cond.true:
6220 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6221 // CHECK9-NEXT:    br label [[COND_END:%.*]]
6222 // CHECK9:       cond.false:
6223 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6224 // CHECK9-NEXT:    br label [[COND_END]]
6225 // CHECK9:       cond.end:
6226 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
6227 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6228 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6229 // CHECK9-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
6230 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6231 // CHECK9:       omp.inner.for.cond:
6232 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6233 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6234 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
6235 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6236 // CHECK9:       omp.inner.for.body:
6237 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6238 // CHECK9-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
6239 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6240 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
6241 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
6242 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6243 // CHECK9:       omp.inner.for.inc:
6244 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6245 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6246 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
6247 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
6248 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
6249 // CHECK9:       omp.inner.for.end:
6250 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6251 // CHECK9:       omp.loop.exit:
6252 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6253 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
6254 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
6255 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
6256 // CHECK9:       omp.precond.end:
6257 // CHECK9-NEXT:    ret void
6258 //
6259 //
6260 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..19
6261 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
6262 // CHECK9-NEXT:  entry:
6263 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6264 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6265 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
6266 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
6267 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
6268 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
6269 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
6270 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
6271 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6272 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6273 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6274 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6275 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
6276 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6277 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6278 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6279 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6280 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
6281 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6282 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6283 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6284 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6285 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
6286 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
6287 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
6288 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
6289 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
6290 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
6291 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
6292 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
6293 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
6294 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
6295 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6296 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
6297 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6298 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
6299 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6300 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
6301 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6302 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
6303 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6304 // CHECK9:       omp.precond.then:
6305 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6306 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6307 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
6308 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6309 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
6310 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6311 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
6312 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
6313 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
6314 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6315 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6316 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6317 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6318 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6319 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
6320 // CHECK9-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 35, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 1)
6321 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
6322 // CHECK9:       omp.dispatch.cond:
6323 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6324 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
6325 // CHECK9-NEXT:    [[TMP16:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP15]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
6326 // CHECK9-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
6327 // CHECK9-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
6328 // CHECK9:       omp.dispatch.body:
6329 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6330 // CHECK9-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
6331 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6332 // CHECK9:       omp.inner.for.cond:
6333 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !19
6334 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !19
6335 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
6336 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6337 // CHECK9:       omp.inner.for.body:
6338 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !19
6339 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
6340 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6341 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !19
6342 // CHECK9-NEXT:    [[TMP21:%.*]] = load double*, double** [[TMP2]], align 8, !llvm.access.group !19
6343 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !19
6344 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP22]] to i64
6345 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP21]], i64 [[IDXPROM]]
6346 // CHECK9-NEXT:    [[TMP23:%.*]] = load double, double* [[ARRAYIDX]], align 8, !llvm.access.group !19
6347 // CHECK9-NEXT:    [[TMP24:%.*]] = load double*, double** [[TMP3]], align 8, !llvm.access.group !19
6348 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !19
6349 // CHECK9-NEXT:    [[IDXPROM6:%.*]] = sext i32 [[TMP25]] to i64
6350 // CHECK9-NEXT:    [[ARRAYIDX7:%.*]] = getelementptr inbounds double, double* [[TMP24]], i64 [[IDXPROM6]]
6351 // CHECK9-NEXT:    [[TMP26:%.*]] = load double, double* [[ARRAYIDX7]], align 8, !llvm.access.group !19
6352 // CHECK9-NEXT:    [[ADD8:%.*]] = fadd double [[TMP23]], [[TMP26]]
6353 // CHECK9-NEXT:    [[TMP27:%.*]] = load double*, double** [[TMP1]], align 8, !llvm.access.group !19
6354 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !19
6355 // CHECK9-NEXT:    [[IDXPROM9:%.*]] = sext i32 [[TMP28]] to i64
6356 // CHECK9-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds double, double* [[TMP27]], i64 [[IDXPROM9]]
6357 // CHECK9-NEXT:    store double [[ADD8]], double* [[ARRAYIDX10]], align 8, !llvm.access.group !19
6358 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6359 // CHECK9:       omp.body.continue:
6360 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6361 // CHECK9:       omp.inner.for.inc:
6362 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !19
6363 // CHECK9-NEXT:    [[ADD11:%.*]] = add nsw i32 [[TMP29]], 1
6364 // CHECK9-NEXT:    store i32 [[ADD11]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !19
6365 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP20:![0-9]+]]
6366 // CHECK9:       omp.inner.for.end:
6367 // CHECK9-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
6368 // CHECK9:       omp.dispatch.inc:
6369 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND]]
6370 // CHECK9:       omp.dispatch.end:
6371 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
6372 // CHECK9:       omp.precond.end:
6373 // CHECK9-NEXT:    ret void
6374 //
6375 //
6376 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l562
6377 // CHECK9-SAME: (i64 noundef [[CH:%.*]], i64 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
6378 // CHECK9-NEXT:  entry:
6379 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i64, align 8
6380 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
6381 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 8
6382 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 8
6383 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 8
6384 // CHECK9-NEXT:    store i64 [[CH]], i64* [[CH_ADDR]], align 8
6385 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
6386 // CHECK9-NEXT:    store double* [[A]], double** [[A_ADDR]], align 8
6387 // CHECK9-NEXT:    store double* [[B]], double** [[B_ADDR]], align 8
6388 // CHECK9-NEXT:    store double* [[C]], double** [[C_ADDR]], align 8
6389 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[CH_ADDR]] to i32*
6390 // CHECK9-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
6391 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..22 to void (i32*, i32*, ...)*), i32* [[CONV]], i32* [[CONV1]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
6392 // CHECK9-NEXT:    ret void
6393 //
6394 //
6395 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..22
6396 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
6397 // CHECK9-NEXT:  entry:
6398 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6399 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6400 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 8
6401 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
6402 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
6403 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
6404 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
6405 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6406 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6407 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6408 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6409 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
6410 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
6411 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6412 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6413 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6414 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6415 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
6416 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
6417 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6418 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6419 // CHECK9-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 8
6420 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
6421 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
6422 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
6423 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
6424 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 8
6425 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 8
6426 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 8
6427 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 8
6428 // CHECK9-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 8
6429 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
6430 // CHECK9-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
6431 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
6432 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6433 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6434 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
6435 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6436 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
6437 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
6438 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
6439 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6440 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
6441 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6442 // CHECK9:       omp.precond.then:
6443 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6444 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6445 // CHECK9-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
6446 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6447 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6448 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6449 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
6450 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
6451 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6452 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6453 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
6454 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6455 // CHECK9:       cond.true:
6456 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6457 // CHECK9-NEXT:    br label [[COND_END:%.*]]
6458 // CHECK9:       cond.false:
6459 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6460 // CHECK9-NEXT:    br label [[COND_END]]
6461 // CHECK9:       cond.end:
6462 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
6463 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6464 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6465 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
6466 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6467 // CHECK9:       omp.inner.for.cond:
6468 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6469 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6470 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
6471 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6472 // CHECK9:       omp.inner.for.body:
6473 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6474 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
6475 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6476 // CHECK9-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i64
6477 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6478 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
6479 // CHECK9-NEXT:    store i32 [[TMP23]], i32* [[CONV]], align 4
6480 // CHECK9-NEXT:    [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
6481 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, double**, double**, double**, i64)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i64 [[TMP20]], i64 [[TMP22]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]], i64 [[TMP24]])
6482 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6483 // CHECK9:       omp.inner.for.inc:
6484 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6485 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6486 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
6487 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
6488 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
6489 // CHECK9:       omp.inner.for.end:
6490 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6491 // CHECK9:       omp.loop.exit:
6492 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6493 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
6494 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]])
6495 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
6496 // CHECK9:       omp.precond.end:
6497 // CHECK9-NEXT:    ret void
6498 //
6499 //
6500 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..23
6501 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], double** noundef nonnull align 8 dereferenceable(8) [[C:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
6502 // CHECK9-NEXT:  entry:
6503 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6504 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6505 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
6506 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
6507 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
6508 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 8
6509 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 8
6510 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 8
6511 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
6512 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6513 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6514 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6515 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
6516 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
6517 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6518 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6519 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6520 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6521 // CHECK9-NEXT:    [[I6:%.*]] = alloca i32, align 4
6522 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6523 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6524 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6525 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6526 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
6527 // CHECK9-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 8
6528 // CHECK9-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 8
6529 // CHECK9-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 8
6530 // CHECK9-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
6531 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
6532 // CHECK9-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 8
6533 // CHECK9-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 8
6534 // CHECK9-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 8
6535 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
6536 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
6537 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6538 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6539 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
6540 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6541 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
6542 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
6543 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
6544 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6545 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
6546 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6547 // CHECK9:       omp.precond.then:
6548 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6549 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6550 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
6551 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6552 // CHECK9-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP8]] to i32
6553 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6554 // CHECK9-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP9]] to i32
6555 // CHECK9-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
6556 // CHECK9-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
6557 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6558 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6559 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[CONV]], align 4
6560 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6561 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6562 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6563 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
6564 // CHECK9-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32 35, i32 [[TMP11]], i32 [[TMP12]], i32 1, i32 [[TMP10]])
6565 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
6566 // CHECK9:       omp.dispatch.cond:
6567 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6568 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
6569 // CHECK9-NEXT:    [[TMP17:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP16]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
6570 // CHECK9-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP17]], 0
6571 // CHECK9-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
6572 // CHECK9:       omp.dispatch.body:
6573 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6574 // CHECK9-NEXT:    store i32 [[TMP18]], i32* [[DOTOMP_IV]], align 4
6575 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6576 // CHECK9:       omp.inner.for.cond:
6577 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
6578 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !22
6579 // CHECK9-NEXT:    [[CMP7:%.*]] = icmp sle i32 [[TMP19]], [[TMP20]]
6580 // CHECK9-NEXT:    br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6581 // CHECK9:       omp.inner.for.body:
6582 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
6583 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP21]], 1
6584 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6585 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4, !llvm.access.group !22
6586 // CHECK9-NEXT:    [[TMP22:%.*]] = load double*, double** [[TMP2]], align 8, !llvm.access.group !22
6587 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !22
6588 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP23]] to i64
6589 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP22]], i64 [[IDXPROM]]
6590 // CHECK9-NEXT:    [[TMP24:%.*]] = load double, double* [[ARRAYIDX]], align 8, !llvm.access.group !22
6591 // CHECK9-NEXT:    [[TMP25:%.*]] = load double*, double** [[TMP3]], align 8, !llvm.access.group !22
6592 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !22
6593 // CHECK9-NEXT:    [[IDXPROM8:%.*]] = sext i32 [[TMP26]] to i64
6594 // CHECK9-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds double, double* [[TMP25]], i64 [[IDXPROM8]]
6595 // CHECK9-NEXT:    [[TMP27:%.*]] = load double, double* [[ARRAYIDX9]], align 8, !llvm.access.group !22
6596 // CHECK9-NEXT:    [[ADD10:%.*]] = fadd double [[TMP24]], [[TMP27]]
6597 // CHECK9-NEXT:    [[TMP28:%.*]] = load double*, double** [[TMP1]], align 8, !llvm.access.group !22
6598 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !22
6599 // CHECK9-NEXT:    [[IDXPROM11:%.*]] = sext i32 [[TMP29]] to i64
6600 // CHECK9-NEXT:    [[ARRAYIDX12:%.*]] = getelementptr inbounds double, double* [[TMP28]], i64 [[IDXPROM11]]
6601 // CHECK9-NEXT:    store double [[ADD10]], double* [[ARRAYIDX12]], align 8, !llvm.access.group !22
6602 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6603 // CHECK9:       omp.body.continue:
6604 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6605 // CHECK9:       omp.inner.for.inc:
6606 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
6607 // CHECK9-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP30]], 1
6608 // CHECK9-NEXT:    store i32 [[ADD13]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
6609 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP23:![0-9]+]]
6610 // CHECK9:       omp.inner.for.end:
6611 // CHECK9-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
6612 // CHECK9:       omp.dispatch.inc:
6613 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND]]
6614 // CHECK9:       omp.dispatch.end:
6615 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
6616 // CHECK9:       omp.precond.end:
6617 // CHECK9-NEXT:    ret void
6618 //
6619 //
6620 // CHECK9-LABEL: define {{[^@]+}}@_Z5tmainIiET_v
6621 // CHECK9-SAME: () #[[ATTR3:[0-9]+]] comdat {
6622 // CHECK9-NEXT:  entry:
6623 // CHECK9-NEXT:    [[A:%.*]] = alloca i32*, align 8
6624 // CHECK9-NEXT:    [[B:%.*]] = alloca i32*, align 8
6625 // CHECK9-NEXT:    [[C:%.*]] = alloca i32*, align 8
6626 // CHECK9-NEXT:    [[N:%.*]] = alloca i32, align 4
6627 // CHECK9-NEXT:    [[CH:%.*]] = alloca i32, align 4
6628 // CHECK9-NEXT:    [[N_CASTED:%.*]] = alloca i64, align 8
6629 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x i8*], align 8
6630 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x i8*], align 8
6631 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x i8*], align 8
6632 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6633 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6634 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6635 // CHECK9-NEXT:    [[N_CASTED3:%.*]] = alloca i64, align 8
6636 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [4 x i8*], align 8
6637 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS6:%.*]] = alloca [4 x i8*], align 8
6638 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [4 x i8*], align 8
6639 // CHECK9-NEXT:    [[_TMP8:%.*]] = alloca i32, align 4
6640 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4
6641 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
6642 // CHECK9-NEXT:    [[CH_CASTED:%.*]] = alloca i64, align 8
6643 // CHECK9-NEXT:    [[N_CASTED19:%.*]] = alloca i64, align 8
6644 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS21:%.*]] = alloca [5 x i8*], align 8
6645 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS22:%.*]] = alloca [5 x i8*], align 8
6646 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS23:%.*]] = alloca [5 x i8*], align 8
6647 // CHECK9-NEXT:    [[_TMP24:%.*]] = alloca i32, align 4
6648 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_25:%.*]] = alloca i32, align 4
6649 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_26:%.*]] = alloca i32, align 4
6650 // CHECK9-NEXT:    [[N_CASTED34:%.*]] = alloca i64, align 8
6651 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS36:%.*]] = alloca [4 x i8*], align 8
6652 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS37:%.*]] = alloca [4 x i8*], align 8
6653 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS38:%.*]] = alloca [4 x i8*], align 8
6654 // CHECK9-NEXT:    [[_TMP39:%.*]] = alloca i32, align 4
6655 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_40:%.*]] = alloca i32, align 4
6656 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_41:%.*]] = alloca i32, align 4
6657 // CHECK9-NEXT:    [[CH_CASTED49:%.*]] = alloca i64, align 8
6658 // CHECK9-NEXT:    [[N_CASTED51:%.*]] = alloca i64, align 8
6659 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS53:%.*]] = alloca [5 x i8*], align 8
6660 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS54:%.*]] = alloca [5 x i8*], align 8
6661 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS55:%.*]] = alloca [5 x i8*], align 8
6662 // CHECK9-NEXT:    [[_TMP56:%.*]] = alloca i32, align 4
6663 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_57:%.*]] = alloca i32, align 4
6664 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_58:%.*]] = alloca i32, align 4
6665 // CHECK9-NEXT:    [[N_CASTED66:%.*]] = alloca i64, align 8
6666 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS68:%.*]] = alloca [4 x i8*], align 8
6667 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS69:%.*]] = alloca [4 x i8*], align 8
6668 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS70:%.*]] = alloca [4 x i8*], align 8
6669 // CHECK9-NEXT:    [[_TMP71:%.*]] = alloca i32, align 4
6670 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_72:%.*]] = alloca i32, align 4
6671 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_73:%.*]] = alloca i32, align 4
6672 // CHECK9-NEXT:    [[CH_CASTED81:%.*]] = alloca i64, align 8
6673 // CHECK9-NEXT:    [[N_CASTED83:%.*]] = alloca i64, align 8
6674 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS85:%.*]] = alloca [5 x i8*], align 8
6675 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS86:%.*]] = alloca [5 x i8*], align 8
6676 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS87:%.*]] = alloca [5 x i8*], align 8
6677 // CHECK9-NEXT:    [[_TMP88:%.*]] = alloca i32, align 4
6678 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_89:%.*]] = alloca i32, align 4
6679 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_90:%.*]] = alloca i32, align 4
6680 // CHECK9-NEXT:    store i32 10000, i32* [[N]], align 4
6681 // CHECK9-NEXT:    store i32 100, i32* [[CH]], align 4
6682 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
6683 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_CASTED]] to i32*
6684 // CHECK9-NEXT:    store i32 [[TMP0]], i32* [[CONV]], align 4
6685 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[N_CASTED]], align 8
6686 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A]], align 8
6687 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[B]], align 8
6688 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32*, i32** [[C]], align 8
6689 // CHECK9-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
6690 // CHECK9-NEXT:    [[TMP6:%.*]] = bitcast i8** [[TMP5]] to i64*
6691 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP6]], align 8
6692 // CHECK9-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
6693 // CHECK9-NEXT:    [[TMP8:%.*]] = bitcast i8** [[TMP7]] to i64*
6694 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP8]], align 8
6695 // CHECK9-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
6696 // CHECK9-NEXT:    store i8* null, i8** [[TMP9]], align 8
6697 // CHECK9-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
6698 // CHECK9-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
6699 // CHECK9-NEXT:    store i32* [[TMP2]], i32** [[TMP11]], align 8
6700 // CHECK9-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
6701 // CHECK9-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i32**
6702 // CHECK9-NEXT:    store i32* [[TMP2]], i32** [[TMP13]], align 8
6703 // CHECK9-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
6704 // CHECK9-NEXT:    store i8* null, i8** [[TMP14]], align 8
6705 // CHECK9-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
6706 // CHECK9-NEXT:    [[TMP16:%.*]] = bitcast i8** [[TMP15]] to i32**
6707 // CHECK9-NEXT:    store i32* [[TMP3]], i32** [[TMP16]], align 8
6708 // CHECK9-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
6709 // CHECK9-NEXT:    [[TMP18:%.*]] = bitcast i8** [[TMP17]] to i32**
6710 // CHECK9-NEXT:    store i32* [[TMP3]], i32** [[TMP18]], align 8
6711 // CHECK9-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
6712 // CHECK9-NEXT:    store i8* null, i8** [[TMP19]], align 8
6713 // CHECK9-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
6714 // CHECK9-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32**
6715 // CHECK9-NEXT:    store i32* [[TMP4]], i32** [[TMP21]], align 8
6716 // CHECK9-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
6717 // CHECK9-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to i32**
6718 // CHECK9-NEXT:    store i32* [[TMP4]], i32** [[TMP23]], align 8
6719 // CHECK9-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3
6720 // CHECK9-NEXT:    store i8* null, i8** [[TMP24]], align 8
6721 // CHECK9-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
6722 // CHECK9-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
6723 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[N]], align 4
6724 // CHECK9-NEXT:    store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4
6725 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6726 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0
6727 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6728 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
6729 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6730 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6731 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP29]], 1
6732 // CHECK9-NEXT:    [[TMP30:%.*]] = zext i32 [[ADD]] to i64
6733 // CHECK9-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
6734 // CHECK9-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
6735 // CHECK9-NEXT:    store i32 1, i32* [[TMP31]], align 4
6736 // CHECK9-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
6737 // CHECK9-NEXT:    store i32 4, i32* [[TMP32]], align 4
6738 // CHECK9-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
6739 // CHECK9-NEXT:    store i8** [[TMP25]], i8*** [[TMP33]], align 8
6740 // CHECK9-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
6741 // CHECK9-NEXT:    store i8** [[TMP26]], i8*** [[TMP34]], align 8
6742 // CHECK9-NEXT:    [[TMP35:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
6743 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.28, i32 0, i32 0), i64** [[TMP35]], align 8
6744 // CHECK9-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
6745 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.29, i32 0, i32 0), i64** [[TMP36]], align 8
6746 // CHECK9-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
6747 // CHECK9-NEXT:    store i8** null, i8*** [[TMP37]], align 8
6748 // CHECK9-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
6749 // CHECK9-NEXT:    store i8** null, i8*** [[TMP38]], align 8
6750 // CHECK9-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
6751 // CHECK9-NEXT:    store i64 [[TMP30]], i64* [[TMP39]], align 8
6752 // CHECK9-NEXT:    [[TMP40:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l42.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
6753 // CHECK9-NEXT:    [[TMP41:%.*]] = icmp ne i32 [[TMP40]], 0
6754 // CHECK9-NEXT:    br i1 [[TMP41]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
6755 // CHECK9:       omp_offload.failed:
6756 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l42(i64 [[TMP1]], i32* [[TMP2]], i32* [[TMP3]], i32* [[TMP4]]) #[[ATTR2]]
6757 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT]]
6758 // CHECK9:       omp_offload.cont:
6759 // CHECK9-NEXT:    [[TMP42:%.*]] = load i32, i32* [[N]], align 4
6760 // CHECK9-NEXT:    [[CONV4:%.*]] = bitcast i64* [[N_CASTED3]] to i32*
6761 // CHECK9-NEXT:    store i32 [[TMP42]], i32* [[CONV4]], align 4
6762 // CHECK9-NEXT:    [[TMP43:%.*]] = load i64, i64* [[N_CASTED3]], align 8
6763 // CHECK9-NEXT:    [[TMP44:%.*]] = load i32*, i32** [[A]], align 8
6764 // CHECK9-NEXT:    [[TMP45:%.*]] = load i32*, i32** [[B]], align 8
6765 // CHECK9-NEXT:    [[TMP46:%.*]] = load i32*, i32** [[C]], align 8
6766 // CHECK9-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
6767 // CHECK9-NEXT:    [[TMP48:%.*]] = bitcast i8** [[TMP47]] to i64*
6768 // CHECK9-NEXT:    store i64 [[TMP43]], i64* [[TMP48]], align 8
6769 // CHECK9-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
6770 // CHECK9-NEXT:    [[TMP50:%.*]] = bitcast i8** [[TMP49]] to i64*
6771 // CHECK9-NEXT:    store i64 [[TMP43]], i64* [[TMP50]], align 8
6772 // CHECK9-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 0
6773 // CHECK9-NEXT:    store i8* null, i8** [[TMP51]], align 8
6774 // CHECK9-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 1
6775 // CHECK9-NEXT:    [[TMP53:%.*]] = bitcast i8** [[TMP52]] to i32**
6776 // CHECK9-NEXT:    store i32* [[TMP44]], i32** [[TMP53]], align 8
6777 // CHECK9-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 1
6778 // CHECK9-NEXT:    [[TMP55:%.*]] = bitcast i8** [[TMP54]] to i32**
6779 // CHECK9-NEXT:    store i32* [[TMP44]], i32** [[TMP55]], align 8
6780 // CHECK9-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 1
6781 // CHECK9-NEXT:    store i8* null, i8** [[TMP56]], align 8
6782 // CHECK9-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 2
6783 // CHECK9-NEXT:    [[TMP58:%.*]] = bitcast i8** [[TMP57]] to i32**
6784 // CHECK9-NEXT:    store i32* [[TMP45]], i32** [[TMP58]], align 8
6785 // CHECK9-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 2
6786 // CHECK9-NEXT:    [[TMP60:%.*]] = bitcast i8** [[TMP59]] to i32**
6787 // CHECK9-NEXT:    store i32* [[TMP45]], i32** [[TMP60]], align 8
6788 // CHECK9-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 2
6789 // CHECK9-NEXT:    store i8* null, i8** [[TMP61]], align 8
6790 // CHECK9-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 3
6791 // CHECK9-NEXT:    [[TMP63:%.*]] = bitcast i8** [[TMP62]] to i32**
6792 // CHECK9-NEXT:    store i32* [[TMP46]], i32** [[TMP63]], align 8
6793 // CHECK9-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 3
6794 // CHECK9-NEXT:    [[TMP65:%.*]] = bitcast i8** [[TMP64]] to i32**
6795 // CHECK9-NEXT:    store i32* [[TMP46]], i32** [[TMP65]], align 8
6796 // CHECK9-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 3
6797 // CHECK9-NEXT:    store i8* null, i8** [[TMP66]], align 8
6798 // CHECK9-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
6799 // CHECK9-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
6800 // CHECK9-NEXT:    [[TMP69:%.*]] = load i32, i32* [[N]], align 4
6801 // CHECK9-NEXT:    store i32 [[TMP69]], i32* [[DOTCAPTURE_EXPR_9]], align 4
6802 // CHECK9-NEXT:    [[TMP70:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_9]], align 4
6803 // CHECK9-NEXT:    [[SUB11:%.*]] = sub nsw i32 [[TMP70]], 0
6804 // CHECK9-NEXT:    [[DIV12:%.*]] = sdiv i32 [[SUB11]], 1
6805 // CHECK9-NEXT:    [[SUB13:%.*]] = sub nsw i32 [[DIV12]], 1
6806 // CHECK9-NEXT:    store i32 [[SUB13]], i32* [[DOTCAPTURE_EXPR_10]], align 4
6807 // CHECK9-NEXT:    [[TMP71:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
6808 // CHECK9-NEXT:    [[ADD14:%.*]] = add nsw i32 [[TMP71]], 1
6809 // CHECK9-NEXT:    [[TMP72:%.*]] = zext i32 [[ADD14]] to i64
6810 // CHECK9-NEXT:    [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
6811 // CHECK9-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 0
6812 // CHECK9-NEXT:    store i32 1, i32* [[TMP73]], align 4
6813 // CHECK9-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 1
6814 // CHECK9-NEXT:    store i32 4, i32* [[TMP74]], align 4
6815 // CHECK9-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 2
6816 // CHECK9-NEXT:    store i8** [[TMP67]], i8*** [[TMP75]], align 8
6817 // CHECK9-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 3
6818 // CHECK9-NEXT:    store i8** [[TMP68]], i8*** [[TMP76]], align 8
6819 // CHECK9-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 4
6820 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.32, i32 0, i32 0), i64** [[TMP77]], align 8
6821 // CHECK9-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 5
6822 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.33, i32 0, i32 0), i64** [[TMP78]], align 8
6823 // CHECK9-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 6
6824 // CHECK9-NEXT:    store i8** null, i8*** [[TMP79]], align 8
6825 // CHECK9-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 7
6826 // CHECK9-NEXT:    store i8** null, i8*** [[TMP80]], align 8
6827 // CHECK9-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 8
6828 // CHECK9-NEXT:    store i64 [[TMP72]], i64* [[TMP81]], align 8
6829 // CHECK9-NEXT:    [[TMP82:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l51.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]])
6830 // CHECK9-NEXT:    [[TMP83:%.*]] = icmp ne i32 [[TMP82]], 0
6831 // CHECK9-NEXT:    br i1 [[TMP83]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
6832 // CHECK9:       omp_offload.failed16:
6833 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l51(i64 [[TMP43]], i32* [[TMP44]], i32* [[TMP45]], i32* [[TMP46]]) #[[ATTR2]]
6834 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
6835 // CHECK9:       omp_offload.cont17:
6836 // CHECK9-NEXT:    [[TMP84:%.*]] = load i32, i32* [[CH]], align 4
6837 // CHECK9-NEXT:    [[CONV18:%.*]] = bitcast i64* [[CH_CASTED]] to i32*
6838 // CHECK9-NEXT:    store i32 [[TMP84]], i32* [[CONV18]], align 4
6839 // CHECK9-NEXT:    [[TMP85:%.*]] = load i64, i64* [[CH_CASTED]], align 8
6840 // CHECK9-NEXT:    [[TMP86:%.*]] = load i32, i32* [[N]], align 4
6841 // CHECK9-NEXT:    [[CONV20:%.*]] = bitcast i64* [[N_CASTED19]] to i32*
6842 // CHECK9-NEXT:    store i32 [[TMP86]], i32* [[CONV20]], align 4
6843 // CHECK9-NEXT:    [[TMP87:%.*]] = load i64, i64* [[N_CASTED19]], align 8
6844 // CHECK9-NEXT:    [[TMP88:%.*]] = load i32*, i32** [[A]], align 8
6845 // CHECK9-NEXT:    [[TMP89:%.*]] = load i32*, i32** [[B]], align 8
6846 // CHECK9-NEXT:    [[TMP90:%.*]] = load i32*, i32** [[C]], align 8
6847 // CHECK9-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 0
6848 // CHECK9-NEXT:    [[TMP92:%.*]] = bitcast i8** [[TMP91]] to i64*
6849 // CHECK9-NEXT:    store i64 [[TMP85]], i64* [[TMP92]], align 8
6850 // CHECK9-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 0
6851 // CHECK9-NEXT:    [[TMP94:%.*]] = bitcast i8** [[TMP93]] to i64*
6852 // CHECK9-NEXT:    store i64 [[TMP85]], i64* [[TMP94]], align 8
6853 // CHECK9-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 0
6854 // CHECK9-NEXT:    store i8* null, i8** [[TMP95]], align 8
6855 // CHECK9-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 1
6856 // CHECK9-NEXT:    [[TMP97:%.*]] = bitcast i8** [[TMP96]] to i64*
6857 // CHECK9-NEXT:    store i64 [[TMP87]], i64* [[TMP97]], align 8
6858 // CHECK9-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 1
6859 // CHECK9-NEXT:    [[TMP99:%.*]] = bitcast i8** [[TMP98]] to i64*
6860 // CHECK9-NEXT:    store i64 [[TMP87]], i64* [[TMP99]], align 8
6861 // CHECK9-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 1
6862 // CHECK9-NEXT:    store i8* null, i8** [[TMP100]], align 8
6863 // CHECK9-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 2
6864 // CHECK9-NEXT:    [[TMP102:%.*]] = bitcast i8** [[TMP101]] to i32**
6865 // CHECK9-NEXT:    store i32* [[TMP88]], i32** [[TMP102]], align 8
6866 // CHECK9-NEXT:    [[TMP103:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 2
6867 // CHECK9-NEXT:    [[TMP104:%.*]] = bitcast i8** [[TMP103]] to i32**
6868 // CHECK9-NEXT:    store i32* [[TMP88]], i32** [[TMP104]], align 8
6869 // CHECK9-NEXT:    [[TMP105:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 2
6870 // CHECK9-NEXT:    store i8* null, i8** [[TMP105]], align 8
6871 // CHECK9-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 3
6872 // CHECK9-NEXT:    [[TMP107:%.*]] = bitcast i8** [[TMP106]] to i32**
6873 // CHECK9-NEXT:    store i32* [[TMP89]], i32** [[TMP107]], align 8
6874 // CHECK9-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 3
6875 // CHECK9-NEXT:    [[TMP109:%.*]] = bitcast i8** [[TMP108]] to i32**
6876 // CHECK9-NEXT:    store i32* [[TMP89]], i32** [[TMP109]], align 8
6877 // CHECK9-NEXT:    [[TMP110:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 3
6878 // CHECK9-NEXT:    store i8* null, i8** [[TMP110]], align 8
6879 // CHECK9-NEXT:    [[TMP111:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 4
6880 // CHECK9-NEXT:    [[TMP112:%.*]] = bitcast i8** [[TMP111]] to i32**
6881 // CHECK9-NEXT:    store i32* [[TMP90]], i32** [[TMP112]], align 8
6882 // CHECK9-NEXT:    [[TMP113:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 4
6883 // CHECK9-NEXT:    [[TMP114:%.*]] = bitcast i8** [[TMP113]] to i32**
6884 // CHECK9-NEXT:    store i32* [[TMP90]], i32** [[TMP114]], align 8
6885 // CHECK9-NEXT:    [[TMP115:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 4
6886 // CHECK9-NEXT:    store i8* null, i8** [[TMP115]], align 8
6887 // CHECK9-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 0
6888 // CHECK9-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 0
6889 // CHECK9-NEXT:    [[TMP118:%.*]] = load i32, i32* [[N]], align 4
6890 // CHECK9-NEXT:    store i32 [[TMP118]], i32* [[DOTCAPTURE_EXPR_25]], align 4
6891 // CHECK9-NEXT:    [[TMP119:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4
6892 // CHECK9-NEXT:    [[SUB27:%.*]] = sub nsw i32 [[TMP119]], 0
6893 // CHECK9-NEXT:    [[DIV28:%.*]] = sdiv i32 [[SUB27]], 1
6894 // CHECK9-NEXT:    [[SUB29:%.*]] = sub nsw i32 [[DIV28]], 1
6895 // CHECK9-NEXT:    store i32 [[SUB29]], i32* [[DOTCAPTURE_EXPR_26]], align 4
6896 // CHECK9-NEXT:    [[TMP120:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_26]], align 4
6897 // CHECK9-NEXT:    [[ADD30:%.*]] = add nsw i32 [[TMP120]], 1
6898 // CHECK9-NEXT:    [[TMP121:%.*]] = zext i32 [[ADD30]] to i64
6899 // CHECK9-NEXT:    [[KERNEL_ARGS31:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
6900 // CHECK9-NEXT:    [[TMP122:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 0
6901 // CHECK9-NEXT:    store i32 1, i32* [[TMP122]], align 4
6902 // CHECK9-NEXT:    [[TMP123:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 1
6903 // CHECK9-NEXT:    store i32 5, i32* [[TMP123]], align 4
6904 // CHECK9-NEXT:    [[TMP124:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 2
6905 // CHECK9-NEXT:    store i8** [[TMP116]], i8*** [[TMP124]], align 8
6906 // CHECK9-NEXT:    [[TMP125:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 3
6907 // CHECK9-NEXT:    store i8** [[TMP117]], i8*** [[TMP125]], align 8
6908 // CHECK9-NEXT:    [[TMP126:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 4
6909 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.36, i32 0, i32 0), i64** [[TMP126]], align 8
6910 // CHECK9-NEXT:    [[TMP127:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 5
6911 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.37, i32 0, i32 0), i64** [[TMP127]], align 8
6912 // CHECK9-NEXT:    [[TMP128:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 6
6913 // CHECK9-NEXT:    store i8** null, i8*** [[TMP128]], align 8
6914 // CHECK9-NEXT:    [[TMP129:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 7
6915 // CHECK9-NEXT:    store i8** null, i8*** [[TMP129]], align 8
6916 // CHECK9-NEXT:    [[TMP130:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 8
6917 // CHECK9-NEXT:    store i64 [[TMP121]], i64* [[TMP130]], align 8
6918 // CHECK9-NEXT:    [[TMP131:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l59.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]])
6919 // CHECK9-NEXT:    [[TMP132:%.*]] = icmp ne i32 [[TMP131]], 0
6920 // CHECK9-NEXT:    br i1 [[TMP132]], label [[OMP_OFFLOAD_FAILED32:%.*]], label [[OMP_OFFLOAD_CONT33:%.*]]
6921 // CHECK9:       omp_offload.failed32:
6922 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l59(i64 [[TMP85]], i64 [[TMP87]], i32* [[TMP88]], i32* [[TMP89]], i32* [[TMP90]]) #[[ATTR2]]
6923 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT33]]
6924 // CHECK9:       omp_offload.cont33:
6925 // CHECK9-NEXT:    [[TMP133:%.*]] = load i32, i32* [[N]], align 4
6926 // CHECK9-NEXT:    [[CONV35:%.*]] = bitcast i64* [[N_CASTED34]] to i32*
6927 // CHECK9-NEXT:    store i32 [[TMP133]], i32* [[CONV35]], align 4
6928 // CHECK9-NEXT:    [[TMP134:%.*]] = load i64, i64* [[N_CASTED34]], align 8
6929 // CHECK9-NEXT:    [[TMP135:%.*]] = load i32*, i32** [[A]], align 8
6930 // CHECK9-NEXT:    [[TMP136:%.*]] = load i32*, i32** [[B]], align 8
6931 // CHECK9-NEXT:    [[TMP137:%.*]] = load i32*, i32** [[C]], align 8
6932 // CHECK9-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 0
6933 // CHECK9-NEXT:    [[TMP139:%.*]] = bitcast i8** [[TMP138]] to i64*
6934 // CHECK9-NEXT:    store i64 [[TMP134]], i64* [[TMP139]], align 8
6935 // CHECK9-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 0
6936 // CHECK9-NEXT:    [[TMP141:%.*]] = bitcast i8** [[TMP140]] to i64*
6937 // CHECK9-NEXT:    store i64 [[TMP134]], i64* [[TMP141]], align 8
6938 // CHECK9-NEXT:    [[TMP142:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS38]], i64 0, i64 0
6939 // CHECK9-NEXT:    store i8* null, i8** [[TMP142]], align 8
6940 // CHECK9-NEXT:    [[TMP143:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 1
6941 // CHECK9-NEXT:    [[TMP144:%.*]] = bitcast i8** [[TMP143]] to i32**
6942 // CHECK9-NEXT:    store i32* [[TMP135]], i32** [[TMP144]], align 8
6943 // CHECK9-NEXT:    [[TMP145:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 1
6944 // CHECK9-NEXT:    [[TMP146:%.*]] = bitcast i8** [[TMP145]] to i32**
6945 // CHECK9-NEXT:    store i32* [[TMP135]], i32** [[TMP146]], align 8
6946 // CHECK9-NEXT:    [[TMP147:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS38]], i64 0, i64 1
6947 // CHECK9-NEXT:    store i8* null, i8** [[TMP147]], align 8
6948 // CHECK9-NEXT:    [[TMP148:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 2
6949 // CHECK9-NEXT:    [[TMP149:%.*]] = bitcast i8** [[TMP148]] to i32**
6950 // CHECK9-NEXT:    store i32* [[TMP136]], i32** [[TMP149]], align 8
6951 // CHECK9-NEXT:    [[TMP150:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 2
6952 // CHECK9-NEXT:    [[TMP151:%.*]] = bitcast i8** [[TMP150]] to i32**
6953 // CHECK9-NEXT:    store i32* [[TMP136]], i32** [[TMP151]], align 8
6954 // CHECK9-NEXT:    [[TMP152:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS38]], i64 0, i64 2
6955 // CHECK9-NEXT:    store i8* null, i8** [[TMP152]], align 8
6956 // CHECK9-NEXT:    [[TMP153:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 3
6957 // CHECK9-NEXT:    [[TMP154:%.*]] = bitcast i8** [[TMP153]] to i32**
6958 // CHECK9-NEXT:    store i32* [[TMP137]], i32** [[TMP154]], align 8
6959 // CHECK9-NEXT:    [[TMP155:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 3
6960 // CHECK9-NEXT:    [[TMP156:%.*]] = bitcast i8** [[TMP155]] to i32**
6961 // CHECK9-NEXT:    store i32* [[TMP137]], i32** [[TMP156]], align 8
6962 // CHECK9-NEXT:    [[TMP157:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS38]], i64 0, i64 3
6963 // CHECK9-NEXT:    store i8* null, i8** [[TMP157]], align 8
6964 // CHECK9-NEXT:    [[TMP158:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS36]], i32 0, i32 0
6965 // CHECK9-NEXT:    [[TMP159:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS37]], i32 0, i32 0
6966 // CHECK9-NEXT:    [[TMP160:%.*]] = load i32, i32* [[N]], align 4
6967 // CHECK9-NEXT:    store i32 [[TMP160]], i32* [[DOTCAPTURE_EXPR_40]], align 4
6968 // CHECK9-NEXT:    [[TMP161:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_40]], align 4
6969 // CHECK9-NEXT:    [[SUB42:%.*]] = sub nsw i32 [[TMP161]], 0
6970 // CHECK9-NEXT:    [[DIV43:%.*]] = sdiv i32 [[SUB42]], 1
6971 // CHECK9-NEXT:    [[SUB44:%.*]] = sub nsw i32 [[DIV43]], 1
6972 // CHECK9-NEXT:    store i32 [[SUB44]], i32* [[DOTCAPTURE_EXPR_41]], align 4
6973 // CHECK9-NEXT:    [[TMP162:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_41]], align 4
6974 // CHECK9-NEXT:    [[ADD45:%.*]] = add nsw i32 [[TMP162]], 1
6975 // CHECK9-NEXT:    [[TMP163:%.*]] = zext i32 [[ADD45]] to i64
6976 // CHECK9-NEXT:    [[KERNEL_ARGS46:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
6977 // CHECK9-NEXT:    [[TMP164:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 0
6978 // CHECK9-NEXT:    store i32 1, i32* [[TMP164]], align 4
6979 // CHECK9-NEXT:    [[TMP165:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 1
6980 // CHECK9-NEXT:    store i32 4, i32* [[TMP165]], align 4
6981 // CHECK9-NEXT:    [[TMP166:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 2
6982 // CHECK9-NEXT:    store i8** [[TMP158]], i8*** [[TMP166]], align 8
6983 // CHECK9-NEXT:    [[TMP167:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 3
6984 // CHECK9-NEXT:    store i8** [[TMP159]], i8*** [[TMP167]], align 8
6985 // CHECK9-NEXT:    [[TMP168:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 4
6986 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.40, i32 0, i32 0), i64** [[TMP168]], align 8
6987 // CHECK9-NEXT:    [[TMP169:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 5
6988 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.41, i32 0, i32 0), i64** [[TMP169]], align 8
6989 // CHECK9-NEXT:    [[TMP170:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 6
6990 // CHECK9-NEXT:    store i8** null, i8*** [[TMP170]], align 8
6991 // CHECK9-NEXT:    [[TMP171:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 7
6992 // CHECK9-NEXT:    store i8** null, i8*** [[TMP171]], align 8
6993 // CHECK9-NEXT:    [[TMP172:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]], i32 0, i32 8
6994 // CHECK9-NEXT:    store i64 [[TMP163]], i64* [[TMP172]], align 8
6995 // CHECK9-NEXT:    [[TMP173:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l67.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS46]])
6996 // CHECK9-NEXT:    [[TMP174:%.*]] = icmp ne i32 [[TMP173]], 0
6997 // CHECK9-NEXT:    br i1 [[TMP174]], label [[OMP_OFFLOAD_FAILED47:%.*]], label [[OMP_OFFLOAD_CONT48:%.*]]
6998 // CHECK9:       omp_offload.failed47:
6999 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l67(i64 [[TMP134]], i32* [[TMP135]], i32* [[TMP136]], i32* [[TMP137]]) #[[ATTR2]]
7000 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT48]]
7001 // CHECK9:       omp_offload.cont48:
7002 // CHECK9-NEXT:    [[TMP175:%.*]] = load i32, i32* [[CH]], align 4
7003 // CHECK9-NEXT:    [[CONV50:%.*]] = bitcast i64* [[CH_CASTED49]] to i32*
7004 // CHECK9-NEXT:    store i32 [[TMP175]], i32* [[CONV50]], align 4
7005 // CHECK9-NEXT:    [[TMP176:%.*]] = load i64, i64* [[CH_CASTED49]], align 8
7006 // CHECK9-NEXT:    [[TMP177:%.*]] = load i32, i32* [[N]], align 4
7007 // CHECK9-NEXT:    [[CONV52:%.*]] = bitcast i64* [[N_CASTED51]] to i32*
7008 // CHECK9-NEXT:    store i32 [[TMP177]], i32* [[CONV52]], align 4
7009 // CHECK9-NEXT:    [[TMP178:%.*]] = load i64, i64* [[N_CASTED51]], align 8
7010 // CHECK9-NEXT:    [[TMP179:%.*]] = load i32*, i32** [[A]], align 8
7011 // CHECK9-NEXT:    [[TMP180:%.*]] = load i32*, i32** [[B]], align 8
7012 // CHECK9-NEXT:    [[TMP181:%.*]] = load i32*, i32** [[C]], align 8
7013 // CHECK9-NEXT:    [[TMP182:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 0
7014 // CHECK9-NEXT:    [[TMP183:%.*]] = bitcast i8** [[TMP182]] to i64*
7015 // CHECK9-NEXT:    store i64 [[TMP176]], i64* [[TMP183]], align 8
7016 // CHECK9-NEXT:    [[TMP184:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 0
7017 // CHECK9-NEXT:    [[TMP185:%.*]] = bitcast i8** [[TMP184]] to i64*
7018 // CHECK9-NEXT:    store i64 [[TMP176]], i64* [[TMP185]], align 8
7019 // CHECK9-NEXT:    [[TMP186:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 0
7020 // CHECK9-NEXT:    store i8* null, i8** [[TMP186]], align 8
7021 // CHECK9-NEXT:    [[TMP187:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 1
7022 // CHECK9-NEXT:    [[TMP188:%.*]] = bitcast i8** [[TMP187]] to i64*
7023 // CHECK9-NEXT:    store i64 [[TMP178]], i64* [[TMP188]], align 8
7024 // CHECK9-NEXT:    [[TMP189:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 1
7025 // CHECK9-NEXT:    [[TMP190:%.*]] = bitcast i8** [[TMP189]] to i64*
7026 // CHECK9-NEXT:    store i64 [[TMP178]], i64* [[TMP190]], align 8
7027 // CHECK9-NEXT:    [[TMP191:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 1
7028 // CHECK9-NEXT:    store i8* null, i8** [[TMP191]], align 8
7029 // CHECK9-NEXT:    [[TMP192:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 2
7030 // CHECK9-NEXT:    [[TMP193:%.*]] = bitcast i8** [[TMP192]] to i32**
7031 // CHECK9-NEXT:    store i32* [[TMP179]], i32** [[TMP193]], align 8
7032 // CHECK9-NEXT:    [[TMP194:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 2
7033 // CHECK9-NEXT:    [[TMP195:%.*]] = bitcast i8** [[TMP194]] to i32**
7034 // CHECK9-NEXT:    store i32* [[TMP179]], i32** [[TMP195]], align 8
7035 // CHECK9-NEXT:    [[TMP196:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 2
7036 // CHECK9-NEXT:    store i8* null, i8** [[TMP196]], align 8
7037 // CHECK9-NEXT:    [[TMP197:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 3
7038 // CHECK9-NEXT:    [[TMP198:%.*]] = bitcast i8** [[TMP197]] to i32**
7039 // CHECK9-NEXT:    store i32* [[TMP180]], i32** [[TMP198]], align 8
7040 // CHECK9-NEXT:    [[TMP199:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 3
7041 // CHECK9-NEXT:    [[TMP200:%.*]] = bitcast i8** [[TMP199]] to i32**
7042 // CHECK9-NEXT:    store i32* [[TMP180]], i32** [[TMP200]], align 8
7043 // CHECK9-NEXT:    [[TMP201:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 3
7044 // CHECK9-NEXT:    store i8* null, i8** [[TMP201]], align 8
7045 // CHECK9-NEXT:    [[TMP202:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 4
7046 // CHECK9-NEXT:    [[TMP203:%.*]] = bitcast i8** [[TMP202]] to i32**
7047 // CHECK9-NEXT:    store i32* [[TMP181]], i32** [[TMP203]], align 8
7048 // CHECK9-NEXT:    [[TMP204:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 4
7049 // CHECK9-NEXT:    [[TMP205:%.*]] = bitcast i8** [[TMP204]] to i32**
7050 // CHECK9-NEXT:    store i32* [[TMP181]], i32** [[TMP205]], align 8
7051 // CHECK9-NEXT:    [[TMP206:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS55]], i64 0, i64 4
7052 // CHECK9-NEXT:    store i8* null, i8** [[TMP206]], align 8
7053 // CHECK9-NEXT:    [[TMP207:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS53]], i32 0, i32 0
7054 // CHECK9-NEXT:    [[TMP208:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS54]], i32 0, i32 0
7055 // CHECK9-NEXT:    [[TMP209:%.*]] = load i32, i32* [[N]], align 4
7056 // CHECK9-NEXT:    store i32 [[TMP209]], i32* [[DOTCAPTURE_EXPR_57]], align 4
7057 // CHECK9-NEXT:    [[TMP210:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_57]], align 4
7058 // CHECK9-NEXT:    [[SUB59:%.*]] = sub nsw i32 [[TMP210]], 0
7059 // CHECK9-NEXT:    [[DIV60:%.*]] = sdiv i32 [[SUB59]], 1
7060 // CHECK9-NEXT:    [[SUB61:%.*]] = sub nsw i32 [[DIV60]], 1
7061 // CHECK9-NEXT:    store i32 [[SUB61]], i32* [[DOTCAPTURE_EXPR_58]], align 4
7062 // CHECK9-NEXT:    [[TMP211:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_58]], align 4
7063 // CHECK9-NEXT:    [[ADD62:%.*]] = add nsw i32 [[TMP211]], 1
7064 // CHECK9-NEXT:    [[TMP212:%.*]] = zext i32 [[ADD62]] to i64
7065 // CHECK9-NEXT:    [[KERNEL_ARGS63:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
7066 // CHECK9-NEXT:    [[TMP213:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 0
7067 // CHECK9-NEXT:    store i32 1, i32* [[TMP213]], align 4
7068 // CHECK9-NEXT:    [[TMP214:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 1
7069 // CHECK9-NEXT:    store i32 5, i32* [[TMP214]], align 4
7070 // CHECK9-NEXT:    [[TMP215:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 2
7071 // CHECK9-NEXT:    store i8** [[TMP207]], i8*** [[TMP215]], align 8
7072 // CHECK9-NEXT:    [[TMP216:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 3
7073 // CHECK9-NEXT:    store i8** [[TMP208]], i8*** [[TMP216]], align 8
7074 // CHECK9-NEXT:    [[TMP217:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 4
7075 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.44, i32 0, i32 0), i64** [[TMP217]], align 8
7076 // CHECK9-NEXT:    [[TMP218:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 5
7077 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.45, i32 0, i32 0), i64** [[TMP218]], align 8
7078 // CHECK9-NEXT:    [[TMP219:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 6
7079 // CHECK9-NEXT:    store i8** null, i8*** [[TMP219]], align 8
7080 // CHECK9-NEXT:    [[TMP220:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 7
7081 // CHECK9-NEXT:    store i8** null, i8*** [[TMP220]], align 8
7082 // CHECK9-NEXT:    [[TMP221:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]], i32 0, i32 8
7083 // CHECK9-NEXT:    store i64 [[TMP212]], i64* [[TMP221]], align 8
7084 // CHECK9-NEXT:    [[TMP222:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l75.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS63]])
7085 // CHECK9-NEXT:    [[TMP223:%.*]] = icmp ne i32 [[TMP222]], 0
7086 // CHECK9-NEXT:    br i1 [[TMP223]], label [[OMP_OFFLOAD_FAILED64:%.*]], label [[OMP_OFFLOAD_CONT65:%.*]]
7087 // CHECK9:       omp_offload.failed64:
7088 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l75(i64 [[TMP176]], i64 [[TMP178]], i32* [[TMP179]], i32* [[TMP180]], i32* [[TMP181]]) #[[ATTR2]]
7089 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT65]]
7090 // CHECK9:       omp_offload.cont65:
7091 // CHECK9-NEXT:    [[TMP224:%.*]] = load i32, i32* [[N]], align 4
7092 // CHECK9-NEXT:    [[CONV67:%.*]] = bitcast i64* [[N_CASTED66]] to i32*
7093 // CHECK9-NEXT:    store i32 [[TMP224]], i32* [[CONV67]], align 4
7094 // CHECK9-NEXT:    [[TMP225:%.*]] = load i64, i64* [[N_CASTED66]], align 8
7095 // CHECK9-NEXT:    [[TMP226:%.*]] = load i32*, i32** [[A]], align 8
7096 // CHECK9-NEXT:    [[TMP227:%.*]] = load i32*, i32** [[B]], align 8
7097 // CHECK9-NEXT:    [[TMP228:%.*]] = load i32*, i32** [[C]], align 8
7098 // CHECK9-NEXT:    [[TMP229:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 0
7099 // CHECK9-NEXT:    [[TMP230:%.*]] = bitcast i8** [[TMP229]] to i64*
7100 // CHECK9-NEXT:    store i64 [[TMP225]], i64* [[TMP230]], align 8
7101 // CHECK9-NEXT:    [[TMP231:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 0
7102 // CHECK9-NEXT:    [[TMP232:%.*]] = bitcast i8** [[TMP231]] to i64*
7103 // CHECK9-NEXT:    store i64 [[TMP225]], i64* [[TMP232]], align 8
7104 // CHECK9-NEXT:    [[TMP233:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS70]], i64 0, i64 0
7105 // CHECK9-NEXT:    store i8* null, i8** [[TMP233]], align 8
7106 // CHECK9-NEXT:    [[TMP234:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 1
7107 // CHECK9-NEXT:    [[TMP235:%.*]] = bitcast i8** [[TMP234]] to i32**
7108 // CHECK9-NEXT:    store i32* [[TMP226]], i32** [[TMP235]], align 8
7109 // CHECK9-NEXT:    [[TMP236:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 1
7110 // CHECK9-NEXT:    [[TMP237:%.*]] = bitcast i8** [[TMP236]] to i32**
7111 // CHECK9-NEXT:    store i32* [[TMP226]], i32** [[TMP237]], align 8
7112 // CHECK9-NEXT:    [[TMP238:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS70]], i64 0, i64 1
7113 // CHECK9-NEXT:    store i8* null, i8** [[TMP238]], align 8
7114 // CHECK9-NEXT:    [[TMP239:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 2
7115 // CHECK9-NEXT:    [[TMP240:%.*]] = bitcast i8** [[TMP239]] to i32**
7116 // CHECK9-NEXT:    store i32* [[TMP227]], i32** [[TMP240]], align 8
7117 // CHECK9-NEXT:    [[TMP241:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 2
7118 // CHECK9-NEXT:    [[TMP242:%.*]] = bitcast i8** [[TMP241]] to i32**
7119 // CHECK9-NEXT:    store i32* [[TMP227]], i32** [[TMP242]], align 8
7120 // CHECK9-NEXT:    [[TMP243:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS70]], i64 0, i64 2
7121 // CHECK9-NEXT:    store i8* null, i8** [[TMP243]], align 8
7122 // CHECK9-NEXT:    [[TMP244:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 3
7123 // CHECK9-NEXT:    [[TMP245:%.*]] = bitcast i8** [[TMP244]] to i32**
7124 // CHECK9-NEXT:    store i32* [[TMP228]], i32** [[TMP245]], align 8
7125 // CHECK9-NEXT:    [[TMP246:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 3
7126 // CHECK9-NEXT:    [[TMP247:%.*]] = bitcast i8** [[TMP246]] to i32**
7127 // CHECK9-NEXT:    store i32* [[TMP228]], i32** [[TMP247]], align 8
7128 // CHECK9-NEXT:    [[TMP248:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS70]], i64 0, i64 3
7129 // CHECK9-NEXT:    store i8* null, i8** [[TMP248]], align 8
7130 // CHECK9-NEXT:    [[TMP249:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS68]], i32 0, i32 0
7131 // CHECK9-NEXT:    [[TMP250:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS69]], i32 0, i32 0
7132 // CHECK9-NEXT:    [[TMP251:%.*]] = load i32, i32* [[N]], align 4
7133 // CHECK9-NEXT:    store i32 [[TMP251]], i32* [[DOTCAPTURE_EXPR_72]], align 4
7134 // CHECK9-NEXT:    [[TMP252:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_72]], align 4
7135 // CHECK9-NEXT:    [[SUB74:%.*]] = sub nsw i32 [[TMP252]], 0
7136 // CHECK9-NEXT:    [[DIV75:%.*]] = sdiv i32 [[SUB74]], 1
7137 // CHECK9-NEXT:    [[SUB76:%.*]] = sub nsw i32 [[DIV75]], 1
7138 // CHECK9-NEXT:    store i32 [[SUB76]], i32* [[DOTCAPTURE_EXPR_73]], align 4
7139 // CHECK9-NEXT:    [[TMP253:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_73]], align 4
7140 // CHECK9-NEXT:    [[ADD77:%.*]] = add nsw i32 [[TMP253]], 1
7141 // CHECK9-NEXT:    [[TMP254:%.*]] = zext i32 [[ADD77]] to i64
7142 // CHECK9-NEXT:    [[KERNEL_ARGS78:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
7143 // CHECK9-NEXT:    [[TMP255:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 0
7144 // CHECK9-NEXT:    store i32 1, i32* [[TMP255]], align 4
7145 // CHECK9-NEXT:    [[TMP256:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 1
7146 // CHECK9-NEXT:    store i32 4, i32* [[TMP256]], align 4
7147 // CHECK9-NEXT:    [[TMP257:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 2
7148 // CHECK9-NEXT:    store i8** [[TMP249]], i8*** [[TMP257]], align 8
7149 // CHECK9-NEXT:    [[TMP258:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 3
7150 // CHECK9-NEXT:    store i8** [[TMP250]], i8*** [[TMP258]], align 8
7151 // CHECK9-NEXT:    [[TMP259:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 4
7152 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.48, i32 0, i32 0), i64** [[TMP259]], align 8
7153 // CHECK9-NEXT:    [[TMP260:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 5
7154 // CHECK9-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.49, i32 0, i32 0), i64** [[TMP260]], align 8
7155 // CHECK9-NEXT:    [[TMP261:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 6
7156 // CHECK9-NEXT:    store i8** null, i8*** [[TMP261]], align 8
7157 // CHECK9-NEXT:    [[TMP262:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 7
7158 // CHECK9-NEXT:    store i8** null, i8*** [[TMP262]], align 8
7159 // CHECK9-NEXT:    [[TMP263:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]], i32 0, i32 8
7160 // CHECK9-NEXT:    store i64 [[TMP254]], i64* [[TMP263]], align 8
7161 // CHECK9-NEXT:    [[TMP264:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l83.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS78]])
7162 // CHECK9-NEXT:    [[TMP265:%.*]] = icmp ne i32 [[TMP264]], 0
7163 // CHECK9-NEXT:    br i1 [[TMP265]], label [[OMP_OFFLOAD_FAILED79:%.*]], label [[OMP_OFFLOAD_CONT80:%.*]]
7164 // CHECK9:       omp_offload.failed79:
7165 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l83(i64 [[TMP225]], i32* [[TMP226]], i32* [[TMP227]], i32* [[TMP228]]) #[[ATTR2]]
7166 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT80]]
7167 // CHECK9:       omp_offload.cont80:
7168 // CHECK9-NEXT:    [[TMP266:%.*]] = load i32, i32* [[CH]], align 4
7169 // CHECK9-NEXT:    [[CONV82:%.*]] = bitcast i64* [[CH_CASTED81]] to i32*
7170 // CHECK9-NEXT:    store i32 [[TMP266]], i32* [[CONV82]], align 4
7171 // CHECK9-NEXT:    [[TMP267:%.*]] = load i64, i64* [[CH_CASTED81]], align 8
7172 // CHECK9-NEXT:    [[TMP268:%.*]] = load i32, i32* [[N]], align 4
7173 // CHECK9-NEXT:    [[CONV84:%.*]] = bitcast i64* [[N_CASTED83]] to i32*
7174 // CHECK9-NEXT:    store i32 [[TMP268]], i32* [[CONV84]], align 4
7175 // CHECK9-NEXT:    [[TMP269:%.*]] = load i64, i64* [[N_CASTED83]], align 8
7176 // CHECK9-NEXT:    [[TMP270:%.*]] = load i32*, i32** [[A]], align 8
7177 // CHECK9-NEXT:    [[TMP271:%.*]] = load i32*, i32** [[B]], align 8
7178 // CHECK9-NEXT:    [[TMP272:%.*]] = load i32*, i32** [[C]], align 8
7179 // CHECK9-NEXT:    [[TMP273:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 0
7180 // CHECK9-NEXT:    [[TMP274:%.*]] = bitcast i8** [[TMP273]] to i64*
7181 // CHECK9-NEXT:    store i64 [[TMP267]], i64* [[TMP274]], align 8
7182 // CHECK9-NEXT:    [[TMP275:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 0
7183 // CHECK9-NEXT:    [[TMP276:%.*]] = bitcast i8** [[TMP275]] to i64*
7184 // CHECK9-NEXT:    store i64 [[TMP267]], i64* [[TMP276]], align 8
7185 // CHECK9-NEXT:    [[TMP277:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 0
7186 // CHECK9-NEXT:    store i8* null, i8** [[TMP277]], align 8
7187 // CHECK9-NEXT:    [[TMP278:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 1
7188 // CHECK9-NEXT:    [[TMP279:%.*]] = bitcast i8** [[TMP278]] to i64*
7189 // CHECK9-NEXT:    store i64 [[TMP269]], i64* [[TMP279]], align 8
7190 // CHECK9-NEXT:    [[TMP280:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 1
7191 // CHECK9-NEXT:    [[TMP281:%.*]] = bitcast i8** [[TMP280]] to i64*
7192 // CHECK9-NEXT:    store i64 [[TMP269]], i64* [[TMP281]], align 8
7193 // CHECK9-NEXT:    [[TMP282:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 1
7194 // CHECK9-NEXT:    store i8* null, i8** [[TMP282]], align 8
7195 // CHECK9-NEXT:    [[TMP283:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 2
7196 // CHECK9-NEXT:    [[TMP284:%.*]] = bitcast i8** [[TMP283]] to i32**
7197 // CHECK9-NEXT:    store i32* [[TMP270]], i32** [[TMP284]], align 8
7198 // CHECK9-NEXT:    [[TMP285:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 2
7199 // CHECK9-NEXT:    [[TMP286:%.*]] = bitcast i8** [[TMP285]] to i32**
7200 // CHECK9-NEXT:    store i32* [[TMP270]], i32** [[TMP286]], align 8
7201 // CHECK9-NEXT:    [[TMP287:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 2
7202 // CHECK9-NEXT:    store i8* null, i8** [[TMP287]], align 8
7203 // CHECK9-NEXT:    [[TMP288:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 3
7204 // CHECK9-NEXT:    [[TMP289:%.*]] = bitcast i8** [[TMP288]] to i32**
7205 // CHECK9-NEXT:    store i32* [[TMP271]], i32** [[TMP289]], align 8
7206 // CHECK9-NEXT:    [[TMP290:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 3
7207 // CHECK9-NEXT:    [[TMP291:%.*]] = bitcast i8** [[TMP290]] to i32**
7208 // CHECK9-NEXT:    store i32* [[TMP271]], i32** [[TMP291]], align 8
7209 // CHECK9-NEXT:    [[TMP292:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 3
7210 // CHECK9-NEXT:    store i8* null, i8** [[TMP292]], align 8
7211 // CHECK9-NEXT:    [[TMP293:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 4
7212 // CHECK9-NEXT:    [[TMP294:%.*]] = bitcast i8** [[TMP293]] to i32**
7213 // CHECK9-NEXT:    store i32* [[TMP272]], i32** [[TMP294]], align 8
7214 // CHECK9-NEXT:    [[TMP295:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 4
7215 // CHECK9-NEXT:    [[TMP296:%.*]] = bitcast i8** [[TMP295]] to i32**
7216 // CHECK9-NEXT:    store i32* [[TMP272]], i32** [[TMP296]], align 8
7217 // CHECK9-NEXT:    [[TMP297:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS87]], i64 0, i64 4
7218 // CHECK9-NEXT:    store i8* null, i8** [[TMP297]], align 8
7219 // CHECK9-NEXT:    [[TMP298:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS85]], i32 0, i32 0
7220 // CHECK9-NEXT:    [[TMP299:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS86]], i32 0, i32 0
7221 // CHECK9-NEXT:    [[TMP300:%.*]] = load i32, i32* [[N]], align 4
7222 // CHECK9-NEXT:    store i32 [[TMP300]], i32* [[DOTCAPTURE_EXPR_89]], align 4
7223 // CHECK9-NEXT:    [[TMP301:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_89]], align 4
7224 // CHECK9-NEXT:    [[SUB91:%.*]] = sub nsw i32 [[TMP301]], 0
7225 // CHECK9-NEXT:    [[DIV92:%.*]] = sdiv i32 [[SUB91]], 1
7226 // CHECK9-NEXT:    [[SUB93:%.*]] = sub nsw i32 [[DIV92]], 1
7227 // CHECK9-NEXT:    store i32 [[SUB93]], i32* [[DOTCAPTURE_EXPR_90]], align 4
7228 // CHECK9-NEXT:    [[TMP302:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_90]], align 4
7229 // CHECK9-NEXT:    [[ADD94:%.*]] = add nsw i32 [[TMP302]], 1
7230 // CHECK9-NEXT:    [[TMP303:%.*]] = zext i32 [[ADD94]] to i64
7231 // CHECK9-NEXT:    [[KERNEL_ARGS95:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
7232 // CHECK9-NEXT:    [[TMP304:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 0
7233 // CHECK9-NEXT:    store i32 1, i32* [[TMP304]], align 4
7234 // CHECK9-NEXT:    [[TMP305:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 1
7235 // CHECK9-NEXT:    store i32 5, i32* [[TMP305]], align 4
7236 // CHECK9-NEXT:    [[TMP306:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 2
7237 // CHECK9-NEXT:    store i8** [[TMP298]], i8*** [[TMP306]], align 8
7238 // CHECK9-NEXT:    [[TMP307:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 3
7239 // CHECK9-NEXT:    store i8** [[TMP299]], i8*** [[TMP307]], align 8
7240 // CHECK9-NEXT:    [[TMP308:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 4
7241 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.52, i32 0, i32 0), i64** [[TMP308]], align 8
7242 // CHECK9-NEXT:    [[TMP309:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 5
7243 // CHECK9-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.53, i32 0, i32 0), i64** [[TMP309]], align 8
7244 // CHECK9-NEXT:    [[TMP310:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 6
7245 // CHECK9-NEXT:    store i8** null, i8*** [[TMP310]], align 8
7246 // CHECK9-NEXT:    [[TMP311:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 7
7247 // CHECK9-NEXT:    store i8** null, i8*** [[TMP311]], align 8
7248 // CHECK9-NEXT:    [[TMP312:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]], i32 0, i32 8
7249 // CHECK9-NEXT:    store i64 [[TMP303]], i64* [[TMP312]], align 8
7250 // CHECK9-NEXT:    [[TMP313:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l91.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS95]])
7251 // CHECK9-NEXT:    [[TMP314:%.*]] = icmp ne i32 [[TMP313]], 0
7252 // CHECK9-NEXT:    br i1 [[TMP314]], label [[OMP_OFFLOAD_FAILED96:%.*]], label [[OMP_OFFLOAD_CONT97:%.*]]
7253 // CHECK9:       omp_offload.failed96:
7254 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l91(i64 [[TMP267]], i64 [[TMP269]], i32* [[TMP270]], i32* [[TMP271]], i32* [[TMP272]]) #[[ATTR2]]
7255 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT97]]
7256 // CHECK9:       omp_offload.cont97:
7257 // CHECK9-NEXT:    ret i32 0
7258 //
7259 //
7260 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l42
7261 // CHECK9-SAME: (i64 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
7262 // CHECK9-NEXT:  entry:
7263 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
7264 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
7265 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 8
7266 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 8
7267 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
7268 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
7269 // CHECK9-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 8
7270 // CHECK9-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 8
7271 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
7272 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..26 to void (i32*, i32*, ...)*), i32* [[CONV]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
7273 // CHECK9-NEXT:    ret void
7274 //
7275 //
7276 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..26
7277 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
7278 // CHECK9-NEXT:  entry:
7279 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7280 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7281 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
7282 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
7283 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
7284 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
7285 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7286 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7287 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7288 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7289 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
7290 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7291 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7292 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7293 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7294 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
7295 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7296 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7297 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
7298 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
7299 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
7300 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
7301 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
7302 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
7303 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
7304 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
7305 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
7306 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
7307 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7308 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
7309 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7310 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7311 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7312 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
7313 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7314 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
7315 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7316 // CHECK9:       omp.precond.then:
7317 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7318 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7319 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
7320 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7321 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7322 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7323 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
7324 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
7325 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7326 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7327 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
7328 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7329 // CHECK9:       cond.true:
7330 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7331 // CHECK9-NEXT:    br label [[COND_END:%.*]]
7332 // CHECK9:       cond.false:
7333 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7334 // CHECK9-NEXT:    br label [[COND_END]]
7335 // CHECK9:       cond.end:
7336 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
7337 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7338 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7339 // CHECK9-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
7340 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7341 // CHECK9:       omp.inner.for.cond:
7342 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7343 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7344 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
7345 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7346 // CHECK9:       omp.inner.for.body:
7347 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7348 // CHECK9-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
7349 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7350 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
7351 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i32**, i32**, i32**)* @.omp_outlined..27 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], i32** [[TMP1]], i32** [[TMP2]], i32** [[TMP3]])
7352 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7353 // CHECK9:       omp.inner.for.inc:
7354 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7355 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7356 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
7357 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
7358 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
7359 // CHECK9:       omp.inner.for.end:
7360 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7361 // CHECK9:       omp.loop.exit:
7362 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7363 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
7364 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
7365 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
7366 // CHECK9:       omp.precond.end:
7367 // CHECK9-NEXT:    ret void
7368 //
7369 //
7370 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..27
7371 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
7372 // CHECK9-NEXT:  entry:
7373 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7374 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7375 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
7376 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
7377 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
7378 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
7379 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
7380 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
7381 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7382 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7383 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7384 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7385 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
7386 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7387 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7388 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7389 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7390 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
7391 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7392 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7393 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7394 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7395 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
7396 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
7397 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
7398 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
7399 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
7400 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
7401 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
7402 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
7403 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
7404 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
7405 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7406 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
7407 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7408 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7409 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7410 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
7411 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7412 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
7413 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7414 // CHECK9:       omp.precond.then:
7415 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7416 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7417 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
7418 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7419 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
7420 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7421 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
7422 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
7423 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
7424 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7425 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7426 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7427 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
7428 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
7429 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7430 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7431 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
7432 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7433 // CHECK9:       cond.true:
7434 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7435 // CHECK9-NEXT:    br label [[COND_END:%.*]]
7436 // CHECK9:       cond.false:
7437 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7438 // CHECK9-NEXT:    br label [[COND_END]]
7439 // CHECK9:       cond.end:
7440 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
7441 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
7442 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7443 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
7444 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7445 // CHECK9:       omp.inner.for.cond:
7446 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7447 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7448 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
7449 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7450 // CHECK9:       omp.inner.for.body:
7451 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7452 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
7453 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7454 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
7455 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7456 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
7457 // CHECK9-NEXT:    [[TMP22:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB3]], i32 [[TMP21]], i32 2)
7458 // CHECK9-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
7459 // CHECK9-NEXT:    br i1 [[TMP23]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
7460 // CHECK9:       .cancel.exit:
7461 // CHECK9-NEXT:    br label [[CANCEL_EXIT:%.*]]
7462 // CHECK9:       .cancel.continue:
7463 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32*, i32** [[TMP2]], align 8
7464 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[I4]], align 4
7465 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP25]] to i64
7466 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP24]], i64 [[IDXPROM]]
7467 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
7468 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[TMP3]], align 8
7469 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I4]], align 4
7470 // CHECK9-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP28]] to i64
7471 // CHECK9-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP27]], i64 [[IDXPROM7]]
7472 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[ARRAYIDX8]], align 4
7473 // CHECK9-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP26]], [[TMP29]]
7474 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32*, i32** [[TMP1]], align 8
7475 // CHECK9-NEXT:    [[TMP31:%.*]] = load i32, i32* [[I4]], align 4
7476 // CHECK9-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP31]] to i64
7477 // CHECK9-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds i32, i32* [[TMP30]], i64 [[IDXPROM10]]
7478 // CHECK9-NEXT:    store i32 [[ADD9]], i32* [[ARRAYIDX11]], align 4
7479 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7480 // CHECK9:       omp.body.continue:
7481 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7482 // CHECK9:       omp.inner.for.inc:
7483 // CHECK9-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7484 // CHECK9-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP32]], 1
7485 // CHECK9-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
7486 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
7487 // CHECK9:       omp.inner.for.end:
7488 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7489 // CHECK9:       omp.loop.exit:
7490 // CHECK9-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7491 // CHECK9-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
7492 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
7493 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
7494 // CHECK9:       cancel.exit:
7495 // CHECK9-NEXT:    [[TMP35:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7496 // CHECK9-NEXT:    [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4
7497 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP36]])
7498 // CHECK9-NEXT:    br label [[CANCEL_CONT:%.*]]
7499 // CHECK9:       omp.precond.end:
7500 // CHECK9-NEXT:    br label [[CANCEL_CONT]]
7501 // CHECK9:       cancel.cont:
7502 // CHECK9-NEXT:    ret void
7503 //
7504 //
7505 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l51
7506 // CHECK9-SAME: (i64 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
7507 // CHECK9-NEXT:  entry:
7508 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
7509 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
7510 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 8
7511 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 8
7512 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
7513 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
7514 // CHECK9-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 8
7515 // CHECK9-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 8
7516 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
7517 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* [[CONV]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
7518 // CHECK9-NEXT:    ret void
7519 //
7520 //
7521 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..30
7522 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
7523 // CHECK9-NEXT:  entry:
7524 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7525 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7526 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
7527 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
7528 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
7529 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
7530 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7531 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7532 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7533 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7534 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
7535 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7536 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7537 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7538 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7539 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
7540 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7541 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7542 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
7543 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
7544 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
7545 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
7546 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
7547 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
7548 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
7549 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
7550 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
7551 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
7552 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7553 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
7554 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7555 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7556 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7557 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
7558 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7559 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
7560 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7561 // CHECK9:       omp.precond.then:
7562 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7563 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7564 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
7565 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7566 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7567 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7568 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
7569 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
7570 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7571 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7572 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
7573 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7574 // CHECK9:       cond.true:
7575 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7576 // CHECK9-NEXT:    br label [[COND_END:%.*]]
7577 // CHECK9:       cond.false:
7578 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7579 // CHECK9-NEXT:    br label [[COND_END]]
7580 // CHECK9:       cond.end:
7581 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
7582 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7583 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7584 // CHECK9-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
7585 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7586 // CHECK9:       omp.inner.for.cond:
7587 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7588 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7589 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
7590 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7591 // CHECK9:       omp.inner.for.body:
7592 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7593 // CHECK9-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
7594 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7595 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
7596 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i32**, i32**, i32**)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], i32** [[TMP1]], i32** [[TMP2]], i32** [[TMP3]])
7597 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7598 // CHECK9:       omp.inner.for.inc:
7599 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7600 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7601 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
7602 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
7603 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
7604 // CHECK9:       omp.inner.for.end:
7605 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7606 // CHECK9:       omp.loop.exit:
7607 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7608 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
7609 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
7610 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
7611 // CHECK9:       omp.precond.end:
7612 // CHECK9-NEXT:    ret void
7613 //
7614 //
7615 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..31
7616 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
7617 // CHECK9-NEXT:  entry:
7618 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7619 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7620 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
7621 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
7622 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
7623 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
7624 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
7625 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
7626 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7627 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7628 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7629 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7630 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
7631 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7632 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7633 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7634 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7635 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
7636 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7637 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7638 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7639 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7640 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
7641 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
7642 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
7643 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
7644 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
7645 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
7646 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
7647 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
7648 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
7649 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
7650 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7651 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
7652 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7653 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7654 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7655 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
7656 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7657 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
7658 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7659 // CHECK9:       omp.precond.then:
7660 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7661 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7662 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
7663 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7664 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
7665 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7666 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
7667 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
7668 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
7669 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7670 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7671 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7672 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
7673 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
7674 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7675 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7676 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
7677 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7678 // CHECK9:       cond.true:
7679 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7680 // CHECK9-NEXT:    br label [[COND_END:%.*]]
7681 // CHECK9:       cond.false:
7682 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7683 // CHECK9-NEXT:    br label [[COND_END]]
7684 // CHECK9:       cond.end:
7685 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
7686 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
7687 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7688 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
7689 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7690 // CHECK9:       omp.inner.for.cond:
7691 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7692 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7693 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
7694 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7695 // CHECK9:       omp.inner.for.body:
7696 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7697 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
7698 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7699 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
7700 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[TMP2]], align 8
7701 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
7702 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
7703 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP20]], i64 [[IDXPROM]]
7704 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
7705 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[TMP3]], align 8
7706 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
7707 // CHECK9-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
7708 // CHECK9-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP23]], i64 [[IDXPROM7]]
7709 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[ARRAYIDX8]], align 4
7710 // CHECK9-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP22]], [[TMP25]]
7711 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32*, i32** [[TMP1]], align 8
7712 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
7713 // CHECK9-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
7714 // CHECK9-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i64 [[IDXPROM10]]
7715 // CHECK9-NEXT:    store i32 [[ADD9]], i32* [[ARRAYIDX11]], align 4
7716 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7717 // CHECK9:       omp.body.continue:
7718 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7719 // CHECK9:       omp.inner.for.inc:
7720 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7721 // CHECK9-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP28]], 1
7722 // CHECK9-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
7723 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
7724 // CHECK9:       omp.inner.for.end:
7725 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7726 // CHECK9:       omp.loop.exit:
7727 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7728 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
7729 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
7730 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
7731 // CHECK9:       omp.precond.end:
7732 // CHECK9-NEXT:    ret void
7733 //
7734 //
7735 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l59
7736 // CHECK9-SAME: (i64 noundef [[CH:%.*]], i64 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
7737 // CHECK9-NEXT:  entry:
7738 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i64, align 8
7739 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
7740 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
7741 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 8
7742 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 8
7743 // CHECK9-NEXT:    store i64 [[CH]], i64* [[CH_ADDR]], align 8
7744 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
7745 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
7746 // CHECK9-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 8
7747 // CHECK9-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 8
7748 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[CH_ADDR]] to i32*
7749 // CHECK9-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
7750 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* [[CONV]], i32* [[CONV1]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
7751 // CHECK9-NEXT:    ret void
7752 //
7753 //
7754 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..34
7755 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
7756 // CHECK9-NEXT:  entry:
7757 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7758 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7759 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 8
7760 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
7761 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
7762 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
7763 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
7764 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7765 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7766 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7767 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7768 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
7769 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7770 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7771 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7772 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7773 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
7774 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7775 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7776 // CHECK9-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 8
7777 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
7778 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
7779 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
7780 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
7781 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 8
7782 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 8
7783 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
7784 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
7785 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
7786 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP1]], align 4
7787 // CHECK9-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
7788 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7789 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP6]], 0
7790 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7791 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7792 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7793 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
7794 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7795 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP7]]
7796 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7797 // CHECK9:       omp.precond.then:
7798 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7799 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7800 // CHECK9-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_COMB_UB]], align 4
7801 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7802 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7803 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP0]], align 4
7804 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7805 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
7806 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP9]])
7807 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7808 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7809 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
7810 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7811 // CHECK9:       cond.true:
7812 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7813 // CHECK9-NEXT:    br label [[COND_END:%.*]]
7814 // CHECK9:       cond.false:
7815 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7816 // CHECK9-NEXT:    br label [[COND_END]]
7817 // CHECK9:       cond.end:
7818 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
7819 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7820 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7821 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
7822 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7823 // CHECK9:       omp.inner.for.cond:
7824 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7825 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7826 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], 1
7827 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp slt i32 [[TMP17]], [[ADD]]
7828 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7829 // CHECK9:       omp.inner.for.body:
7830 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7831 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
7832 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7833 // CHECK9-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i64
7834 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i32**, i32**, i32**)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i64 [[TMP20]], i64 [[TMP22]], i32* [[TMP1]], i32** [[TMP2]], i32** [[TMP3]], i32** [[TMP4]])
7835 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7836 // CHECK9:       omp.inner.for.inc:
7837 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7838 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7839 // CHECK9-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
7840 // CHECK9-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
7841 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7842 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7843 // CHECK9-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
7844 // CHECK9-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_COMB_LB]], align 4
7845 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7846 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7847 // CHECK9-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP27]], [[TMP28]]
7848 // CHECK9-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_UB]], align 4
7849 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7850 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7851 // CHECK9-NEXT:    [[CMP9:%.*]] = icmp sgt i32 [[TMP29]], [[TMP30]]
7852 // CHECK9-NEXT:    br i1 [[CMP9]], label [[COND_TRUE10:%.*]], label [[COND_FALSE11:%.*]]
7853 // CHECK9:       cond.true10:
7854 // CHECK9-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7855 // CHECK9-NEXT:    br label [[COND_END12:%.*]]
7856 // CHECK9:       cond.false11:
7857 // CHECK9-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7858 // CHECK9-NEXT:    br label [[COND_END12]]
7859 // CHECK9:       cond.end12:
7860 // CHECK9-NEXT:    [[COND13:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE10]] ], [ [[TMP32]], [[COND_FALSE11]] ]
7861 // CHECK9-NEXT:    store i32 [[COND13]], i32* [[DOTOMP_COMB_UB]], align 4
7862 // CHECK9-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7863 // CHECK9-NEXT:    store i32 [[TMP33]], i32* [[DOTOMP_IV]], align 4
7864 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
7865 // CHECK9:       omp.inner.for.end:
7866 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7867 // CHECK9:       omp.loop.exit:
7868 // CHECK9-NEXT:    [[TMP34:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7869 // CHECK9-NEXT:    [[TMP35:%.*]] = load i32, i32* [[TMP34]], align 4
7870 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP35]])
7871 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
7872 // CHECK9:       omp.precond.end:
7873 // CHECK9-NEXT:    ret void
7874 //
7875 //
7876 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..35
7877 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
7878 // CHECK9-NEXT:  entry:
7879 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7880 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7881 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
7882 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
7883 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
7884 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
7885 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
7886 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
7887 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7888 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7889 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7890 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7891 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
7892 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7893 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7894 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7895 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7896 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
7897 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7898 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7899 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7900 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7901 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
7902 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
7903 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
7904 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
7905 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
7906 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
7907 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
7908 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
7909 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
7910 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
7911 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7912 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
7913 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7914 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7915 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7916 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
7917 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7918 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
7919 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7920 // CHECK9:       omp.precond.then:
7921 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7922 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7923 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
7924 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7925 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
7926 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7927 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
7928 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
7929 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
7930 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7931 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7932 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7933 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
7934 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
7935 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7936 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7937 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
7938 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7939 // CHECK9:       cond.true:
7940 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7941 // CHECK9-NEXT:    br label [[COND_END:%.*]]
7942 // CHECK9:       cond.false:
7943 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7944 // CHECK9-NEXT:    br label [[COND_END]]
7945 // CHECK9:       cond.end:
7946 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
7947 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
7948 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7949 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
7950 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7951 // CHECK9:       omp.inner.for.cond:
7952 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7953 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7954 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
7955 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7956 // CHECK9:       omp.inner.for.body:
7957 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7958 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
7959 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7960 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
7961 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[TMP2]], align 8
7962 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
7963 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
7964 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP20]], i64 [[IDXPROM]]
7965 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
7966 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[TMP3]], align 8
7967 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
7968 // CHECK9-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
7969 // CHECK9-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP23]], i64 [[IDXPROM7]]
7970 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[ARRAYIDX8]], align 4
7971 // CHECK9-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP22]], [[TMP25]]
7972 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32*, i32** [[TMP1]], align 8
7973 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
7974 // CHECK9-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
7975 // CHECK9-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i64 [[IDXPROM10]]
7976 // CHECK9-NEXT:    store i32 [[ADD9]], i32* [[ARRAYIDX11]], align 4
7977 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7978 // CHECK9:       omp.body.continue:
7979 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7980 // CHECK9:       omp.inner.for.inc:
7981 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7982 // CHECK9-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP28]], 1
7983 // CHECK9-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
7984 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
7985 // CHECK9:       omp.inner.for.end:
7986 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7987 // CHECK9:       omp.loop.exit:
7988 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7989 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
7990 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
7991 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
7992 // CHECK9:       omp.precond.end:
7993 // CHECK9-NEXT:    ret void
7994 //
7995 //
7996 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l67
7997 // CHECK9-SAME: (i64 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
7998 // CHECK9-NEXT:  entry:
7999 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
8000 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8001 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 8
8002 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 8
8003 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
8004 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8005 // CHECK9-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 8
8006 // CHECK9-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 8
8007 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
8008 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..38 to void (i32*, i32*, ...)*), i32* [[CONV]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
8009 // CHECK9-NEXT:    ret void
8010 //
8011 //
8012 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..38
8013 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
8014 // CHECK9-NEXT:  entry:
8015 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8016 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8017 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8018 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
8019 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
8020 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
8021 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8022 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8023 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8024 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8025 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
8026 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8027 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8028 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8029 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8030 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
8031 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8032 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8033 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8034 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
8035 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
8036 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
8037 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8038 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
8039 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
8040 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
8041 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
8042 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
8043 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8044 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
8045 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8046 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
8047 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8048 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
8049 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8050 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
8051 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8052 // CHECK9:       omp.precond.then:
8053 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8054 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8055 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
8056 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8057 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8058 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8059 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
8060 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8061 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8062 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8063 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
8064 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8065 // CHECK9:       cond.true:
8066 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8067 // CHECK9-NEXT:    br label [[COND_END:%.*]]
8068 // CHECK9:       cond.false:
8069 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8070 // CHECK9-NEXT:    br label [[COND_END]]
8071 // CHECK9:       cond.end:
8072 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
8073 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8074 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8075 // CHECK9-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
8076 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8077 // CHECK9:       omp.inner.for.cond:
8078 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8079 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8080 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
8081 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8082 // CHECK9:       omp.inner.for.body:
8083 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8084 // CHECK9-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
8085 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8086 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
8087 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i32**, i32**, i32**)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], i32** [[TMP1]], i32** [[TMP2]], i32** [[TMP3]])
8088 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8089 // CHECK9:       omp.inner.for.inc:
8090 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8091 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8092 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
8093 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
8094 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
8095 // CHECK9:       omp.inner.for.end:
8096 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8097 // CHECK9:       omp.loop.exit:
8098 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8099 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
8100 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
8101 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
8102 // CHECK9:       omp.precond.end:
8103 // CHECK9-NEXT:    ret void
8104 //
8105 //
8106 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..39
8107 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
8108 // CHECK9-NEXT:  entry:
8109 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8110 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8111 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
8112 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
8113 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8114 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
8115 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
8116 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
8117 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8118 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8119 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8120 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8121 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
8122 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
8123 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
8124 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8125 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8126 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
8127 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8128 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8129 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8130 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8131 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8132 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
8133 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
8134 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
8135 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8136 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
8137 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
8138 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
8139 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
8140 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
8141 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8142 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
8143 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8144 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
8145 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8146 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
8147 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8148 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
8149 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8150 // CHECK9:       omp.precond.then:
8151 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
8152 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8153 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
8154 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8155 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
8156 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8157 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
8158 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
8159 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
8160 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8161 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8162 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8163 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
8164 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8165 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8166 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8167 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
8168 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8169 // CHECK9:       cond.true:
8170 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8171 // CHECK9-NEXT:    br label [[COND_END:%.*]]
8172 // CHECK9:       cond.false:
8173 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8174 // CHECK9-NEXT:    br label [[COND_END]]
8175 // CHECK9:       cond.end:
8176 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
8177 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
8178 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8179 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
8180 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8181 // CHECK9:       omp.inner.for.cond:
8182 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8183 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8184 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
8185 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8186 // CHECK9:       omp.inner.for.body:
8187 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8188 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
8189 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8190 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
8191 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[TMP2]], align 8
8192 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4
8193 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
8194 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP20]], i64 [[IDXPROM]]
8195 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
8196 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[TMP3]], align 8
8197 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
8198 // CHECK9-NEXT:    [[IDXPROM7:%.*]] = sext i32 [[TMP24]] to i64
8199 // CHECK9-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP23]], i64 [[IDXPROM7]]
8200 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[ARRAYIDX8]], align 4
8201 // CHECK9-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP22]], [[TMP25]]
8202 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32*, i32** [[TMP1]], align 8
8203 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
8204 // CHECK9-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP27]] to i64
8205 // CHECK9-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i64 [[IDXPROM10]]
8206 // CHECK9-NEXT:    store i32 [[ADD9]], i32* [[ARRAYIDX11]], align 4
8207 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
8208 // CHECK9:       omp.body.continue:
8209 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8210 // CHECK9:       omp.inner.for.inc:
8211 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8212 // CHECK9-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP28]], 1
8213 // CHECK9-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4
8214 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
8215 // CHECK9:       omp.inner.for.end:
8216 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8217 // CHECK9:       omp.loop.exit:
8218 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8219 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
8220 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
8221 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
8222 // CHECK9:       omp.precond.end:
8223 // CHECK9-NEXT:    ret void
8224 //
8225 //
8226 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l75
8227 // CHECK9-SAME: (i64 noundef [[CH:%.*]], i64 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
8228 // CHECK9-NEXT:  entry:
8229 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i64, align 8
8230 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
8231 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8232 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 8
8233 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 8
8234 // CHECK9-NEXT:    store i64 [[CH]], i64* [[CH_ADDR]], align 8
8235 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
8236 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8237 // CHECK9-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 8
8238 // CHECK9-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 8
8239 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[CH_ADDR]] to i32*
8240 // CHECK9-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
8241 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..42 to void (i32*, i32*, ...)*), i32* [[CONV]], i32* [[CONV1]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
8242 // CHECK9-NEXT:    ret void
8243 //
8244 //
8245 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..42
8246 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
8247 // CHECK9-NEXT:  entry:
8248 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8249 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8250 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 8
8251 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8252 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
8253 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
8254 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
8255 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8256 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8257 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8258 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8259 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
8260 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
8261 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8262 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8263 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8264 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8265 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
8266 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
8267 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8268 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8269 // CHECK9-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 8
8270 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8271 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
8272 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
8273 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
8274 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 8
8275 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8276 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
8277 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
8278 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
8279 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
8280 // CHECK9-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
8281 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
8282 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8283 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8284 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
8285 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8286 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
8287 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
8288 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
8289 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8290 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
8291 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8292 // CHECK9:       omp.precond.then:
8293 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8294 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8295 // CHECK9-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
8296 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8297 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8298 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8299 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
8300 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8301 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8302 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8303 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
8304 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8305 // CHECK9:       cond.true:
8306 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8307 // CHECK9-NEXT:    br label [[COND_END:%.*]]
8308 // CHECK9:       cond.false:
8309 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8310 // CHECK9-NEXT:    br label [[COND_END]]
8311 // CHECK9:       cond.end:
8312 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
8313 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8314 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8315 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
8316 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8317 // CHECK9:       omp.inner.for.cond:
8318 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8319 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8320 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
8321 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8322 // CHECK9:       omp.inner.for.body:
8323 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8324 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
8325 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8326 // CHECK9-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i64
8327 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8328 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
8329 // CHECK9-NEXT:    store i32 [[TMP23]], i32* [[CONV]], align 4
8330 // CHECK9-NEXT:    [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
8331 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i32**, i32**, i32**, i64)* @.omp_outlined..43 to void (i32*, i32*, ...)*), i64 [[TMP20]], i64 [[TMP22]], i32* [[TMP1]], i32** [[TMP2]], i32** [[TMP3]], i32** [[TMP4]], i64 [[TMP24]])
8332 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8333 // CHECK9:       omp.inner.for.inc:
8334 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8335 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8336 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
8337 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
8338 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
8339 // CHECK9:       omp.inner.for.end:
8340 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8341 // CHECK9:       omp.loop.exit:
8342 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8343 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
8344 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]])
8345 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
8346 // CHECK9:       omp.precond.end:
8347 // CHECK9-NEXT:    ret void
8348 //
8349 //
8350 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..43
8351 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
8352 // CHECK9-NEXT:  entry:
8353 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8354 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8355 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
8356 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
8357 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8358 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
8359 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
8360 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
8361 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
8362 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8363 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8364 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8365 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
8366 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
8367 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
8368 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
8369 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8370 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8371 // CHECK9-NEXT:    [[I6:%.*]] = alloca i32, align 4
8372 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8373 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8374 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8375 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8376 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8377 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
8378 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
8379 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
8380 // CHECK9-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
8381 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8382 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
8383 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
8384 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
8385 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
8386 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
8387 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8388 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8389 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
8390 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8391 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
8392 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
8393 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
8394 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8395 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
8396 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8397 // CHECK9:       omp.precond.then:
8398 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
8399 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8400 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
8401 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8402 // CHECK9-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP8]] to i32
8403 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8404 // CHECK9-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP9]] to i32
8405 // CHECK9-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
8406 // CHECK9-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
8407 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8408 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8409 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[CONV]], align 4
8410 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8411 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
8412 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP12]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP10]])
8413 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
8414 // CHECK9:       omp.dispatch.cond:
8415 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8416 // CHECK9-NEXT:    [[TMP14:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8417 // CHECK9-NEXT:    [[CONV7:%.*]] = trunc i64 [[TMP14]] to i32
8418 // CHECK9-NEXT:    [[CMP8:%.*]] = icmp sgt i32 [[TMP13]], [[CONV7]]
8419 // CHECK9-NEXT:    br i1 [[CMP8]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8420 // CHECK9:       cond.true:
8421 // CHECK9-NEXT:    [[TMP15:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8422 // CHECK9-NEXT:    [[CONV9:%.*]] = trunc i64 [[TMP15]] to i32
8423 // CHECK9-NEXT:    br label [[COND_END:%.*]]
8424 // CHECK9:       cond.false:
8425 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8426 // CHECK9-NEXT:    br label [[COND_END]]
8427 // CHECK9:       cond.end:
8428 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[CONV9]], [[COND_TRUE]] ], [ [[TMP16]], [[COND_FALSE]] ]
8429 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
8430 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8431 // CHECK9-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
8432 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8433 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8434 // CHECK9-NEXT:    [[CMP10:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
8435 // CHECK9-NEXT:    br i1 [[CMP10]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
8436 // CHECK9:       omp.dispatch.body:
8437 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8438 // CHECK9:       omp.inner.for.cond:
8439 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8440 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8441 // CHECK9-NEXT:    [[CMP11:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]
8442 // CHECK9-NEXT:    br i1 [[CMP11]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8443 // CHECK9:       omp.inner.for.body:
8444 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8445 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP22]], 1
8446 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8447 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4
8448 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[TMP2]], align 8
8449 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I6]], align 4
8450 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP24]] to i64
8451 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP23]], i64 [[IDXPROM]]
8452 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
8453 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32*, i32** [[TMP3]], align 8
8454 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I6]], align 4
8455 // CHECK9-NEXT:    [[IDXPROM12:%.*]] = sext i32 [[TMP27]] to i64
8456 // CHECK9-NEXT:    [[ARRAYIDX13:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i64 [[IDXPROM12]]
8457 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[ARRAYIDX13]], align 4
8458 // CHECK9-NEXT:    [[ADD14:%.*]] = add nsw i32 [[TMP25]], [[TMP28]]
8459 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[TMP1]], align 8
8460 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[I6]], align 4
8461 // CHECK9-NEXT:    [[IDXPROM15:%.*]] = sext i32 [[TMP30]] to i64
8462 // CHECK9-NEXT:    [[ARRAYIDX16:%.*]] = getelementptr inbounds i32, i32* [[TMP29]], i64 [[IDXPROM15]]
8463 // CHECK9-NEXT:    store i32 [[ADD14]], i32* [[ARRAYIDX16]], align 4
8464 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
8465 // CHECK9:       omp.body.continue:
8466 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8467 // CHECK9:       omp.inner.for.inc:
8468 // CHECK9-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8469 // CHECK9-NEXT:    [[ADD17:%.*]] = add nsw i32 [[TMP31]], 1
8470 // CHECK9-NEXT:    store i32 [[ADD17]], i32* [[DOTOMP_IV]], align 4
8471 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
8472 // CHECK9:       omp.inner.for.end:
8473 // CHECK9-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
8474 // CHECK9:       omp.dispatch.inc:
8475 // CHECK9-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8476 // CHECK9-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8477 // CHECK9-NEXT:    [[ADD18:%.*]] = add nsw i32 [[TMP32]], [[TMP33]]
8478 // CHECK9-NEXT:    store i32 [[ADD18]], i32* [[DOTOMP_LB]], align 4
8479 // CHECK9-NEXT:    [[TMP34:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8480 // CHECK9-NEXT:    [[TMP35:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8481 // CHECK9-NEXT:    [[ADD19:%.*]] = add nsw i32 [[TMP34]], [[TMP35]]
8482 // CHECK9-NEXT:    store i32 [[ADD19]], i32* [[DOTOMP_UB]], align 4
8483 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND]]
8484 // CHECK9:       omp.dispatch.end:
8485 // CHECK9-NEXT:    [[TMP36:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8486 // CHECK9-NEXT:    [[TMP37:%.*]] = load i32, i32* [[TMP36]], align 4
8487 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP37]])
8488 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
8489 // CHECK9:       omp.precond.end:
8490 // CHECK9-NEXT:    ret void
8491 //
8492 //
8493 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l83
8494 // CHECK9-SAME: (i64 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
8495 // CHECK9-NEXT:  entry:
8496 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
8497 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8498 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 8
8499 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 8
8500 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
8501 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8502 // CHECK9-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 8
8503 // CHECK9-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 8
8504 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
8505 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..46 to void (i32*, i32*, ...)*), i32* [[CONV]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
8506 // CHECK9-NEXT:    ret void
8507 //
8508 //
8509 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..46
8510 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
8511 // CHECK9-NEXT:  entry:
8512 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8513 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8514 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8515 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
8516 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
8517 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
8518 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8519 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8520 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8521 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8522 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
8523 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8524 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8525 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8526 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8527 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
8528 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8529 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8530 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8531 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
8532 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
8533 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
8534 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8535 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
8536 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
8537 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
8538 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
8539 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
8540 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8541 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
8542 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8543 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
8544 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8545 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
8546 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8547 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
8548 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8549 // CHECK9:       omp.precond.then:
8550 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8551 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8552 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
8553 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8554 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8555 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8556 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
8557 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8558 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8559 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8560 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
8561 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8562 // CHECK9:       cond.true:
8563 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8564 // CHECK9-NEXT:    br label [[COND_END:%.*]]
8565 // CHECK9:       cond.false:
8566 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8567 // CHECK9-NEXT:    br label [[COND_END]]
8568 // CHECK9:       cond.end:
8569 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
8570 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8571 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8572 // CHECK9-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
8573 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8574 // CHECK9:       omp.inner.for.cond:
8575 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8576 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8577 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
8578 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8579 // CHECK9:       omp.inner.for.body:
8580 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8581 // CHECK9-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
8582 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8583 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
8584 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i32**, i32**, i32**)* @.omp_outlined..47 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], i32** [[TMP1]], i32** [[TMP2]], i32** [[TMP3]])
8585 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8586 // CHECK9:       omp.inner.for.inc:
8587 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8588 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8589 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
8590 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
8591 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
8592 // CHECK9:       omp.inner.for.end:
8593 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8594 // CHECK9:       omp.loop.exit:
8595 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8596 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
8597 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP24]])
8598 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
8599 // CHECK9:       omp.precond.end:
8600 // CHECK9-NEXT:    ret void
8601 //
8602 //
8603 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..47
8604 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
8605 // CHECK9-NEXT:  entry:
8606 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8607 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8608 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
8609 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
8610 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8611 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
8612 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
8613 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
8614 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8615 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8616 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8617 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8618 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
8619 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
8620 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
8621 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8622 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8623 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
8624 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8625 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8626 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8627 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8628 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8629 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
8630 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
8631 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
8632 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8633 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
8634 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
8635 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
8636 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
8637 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
8638 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8639 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
8640 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8641 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
8642 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8643 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
8644 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8645 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
8646 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8647 // CHECK9:       omp.precond.then:
8648 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
8649 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8650 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
8651 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8652 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP8]] to i32
8653 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8654 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP9]] to i32
8655 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
8656 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
8657 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8658 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8659 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8660 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8661 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8662 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
8663 // CHECK9-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 35, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 1)
8664 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
8665 // CHECK9:       omp.dispatch.cond:
8666 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8667 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
8668 // CHECK9-NEXT:    [[TMP16:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP15]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
8669 // CHECK9-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
8670 // CHECK9-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
8671 // CHECK9:       omp.dispatch.body:
8672 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8673 // CHECK9-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
8674 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8675 // CHECK9:       omp.inner.for.cond:
8676 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
8677 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !25
8678 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
8679 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8680 // CHECK9:       omp.inner.for.body:
8681 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
8682 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
8683 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8684 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !25
8685 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[TMP2]], align 8, !llvm.access.group !25
8686 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !25
8687 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP22]] to i64
8688 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP21]], i64 [[IDXPROM]]
8689 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[ARRAYIDX]], align 4, !llvm.access.group !25
8690 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32*, i32** [[TMP3]], align 8, !llvm.access.group !25
8691 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !25
8692 // CHECK9-NEXT:    [[IDXPROM6:%.*]] = sext i32 [[TMP25]] to i64
8693 // CHECK9-NEXT:    [[ARRAYIDX7:%.*]] = getelementptr inbounds i32, i32* [[TMP24]], i64 [[IDXPROM6]]
8694 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[ARRAYIDX7]], align 4, !llvm.access.group !25
8695 // CHECK9-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP23]], [[TMP26]]
8696 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[TMP1]], align 8, !llvm.access.group !25
8697 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !25
8698 // CHECK9-NEXT:    [[IDXPROM9:%.*]] = sext i32 [[TMP28]] to i64
8699 // CHECK9-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds i32, i32* [[TMP27]], i64 [[IDXPROM9]]
8700 // CHECK9-NEXT:    store i32 [[ADD8]], i32* [[ARRAYIDX10]], align 4, !llvm.access.group !25
8701 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
8702 // CHECK9:       omp.body.continue:
8703 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8704 // CHECK9:       omp.inner.for.inc:
8705 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
8706 // CHECK9-NEXT:    [[ADD11:%.*]] = add nsw i32 [[TMP29]], 1
8707 // CHECK9-NEXT:    store i32 [[ADD11]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
8708 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP26:![0-9]+]]
8709 // CHECK9:       omp.inner.for.end:
8710 // CHECK9-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
8711 // CHECK9:       omp.dispatch.inc:
8712 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND]]
8713 // CHECK9:       omp.dispatch.end:
8714 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
8715 // CHECK9:       omp.precond.end:
8716 // CHECK9-NEXT:    ret void
8717 //
8718 //
8719 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l91
8720 // CHECK9-SAME: (i64 noundef [[CH:%.*]], i64 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
8721 // CHECK9-NEXT:  entry:
8722 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i64, align 8
8723 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
8724 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8725 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 8
8726 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 8
8727 // CHECK9-NEXT:    store i64 [[CH]], i64* [[CH_ADDR]], align 8
8728 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
8729 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8730 // CHECK9-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 8
8731 // CHECK9-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 8
8732 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[CH_ADDR]] to i32*
8733 // CHECK9-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
8734 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..50 to void (i32*, i32*, ...)*), i32* [[CONV]], i32* [[CONV1]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
8735 // CHECK9-NEXT:    ret void
8736 //
8737 //
8738 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..50
8739 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]]) #[[ATTR1]] {
8740 // CHECK9-NEXT:  entry:
8741 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8742 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8743 // CHECK9-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 8
8744 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8745 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
8746 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
8747 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
8748 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8749 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8750 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8751 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8752 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
8753 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
8754 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8755 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8756 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8757 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8758 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
8759 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
8760 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8761 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8762 // CHECK9-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 8
8763 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8764 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
8765 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
8766 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
8767 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 8
8768 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8769 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
8770 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
8771 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
8772 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
8773 // CHECK9-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
8774 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
8775 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8776 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8777 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
8778 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8779 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
8780 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
8781 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
8782 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8783 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
8784 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8785 // CHECK9:       omp.precond.then:
8786 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8787 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8788 // CHECK9-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
8789 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8790 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8791 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8792 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
8793 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8794 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8795 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8796 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
8797 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8798 // CHECK9:       cond.true:
8799 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8800 // CHECK9-NEXT:    br label [[COND_END:%.*]]
8801 // CHECK9:       cond.false:
8802 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8803 // CHECK9-NEXT:    br label [[COND_END]]
8804 // CHECK9:       cond.end:
8805 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
8806 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8807 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8808 // CHECK9-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
8809 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8810 // CHECK9:       omp.inner.for.cond:
8811 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8812 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8813 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
8814 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8815 // CHECK9:       omp.inner.for.body:
8816 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8817 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
8818 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8819 // CHECK9-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i64
8820 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8821 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
8822 // CHECK9-NEXT:    store i32 [[TMP23]], i32* [[CONV]], align 4
8823 // CHECK9-NEXT:    [[TMP24:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
8824 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i32**, i32**, i32**, i64)* @.omp_outlined..51 to void (i32*, i32*, ...)*), i64 [[TMP20]], i64 [[TMP22]], i32* [[TMP1]], i32** [[TMP2]], i32** [[TMP3]], i32** [[TMP4]], i64 [[TMP24]])
8825 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8826 // CHECK9:       omp.inner.for.inc:
8827 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8828 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8829 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
8830 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
8831 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
8832 // CHECK9:       omp.inner.for.end:
8833 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8834 // CHECK9:       omp.loop.exit:
8835 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8836 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
8837 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP28]])
8838 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
8839 // CHECK9:       omp.precond.end:
8840 // CHECK9-NEXT:    ret void
8841 //
8842 //
8843 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..51
8844 // CHECK9-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[A:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[B:%.*]], i32** noundef nonnull align 8 dereferenceable(8) [[C:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
8845 // CHECK9-NEXT:  entry:
8846 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8847 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8848 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
8849 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
8850 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8851 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 8
8852 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 8
8853 // CHECK9-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 8
8854 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
8855 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8856 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8857 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8858 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
8859 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
8860 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
8861 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
8862 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8863 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8864 // CHECK9-NEXT:    [[I6:%.*]] = alloca i32, align 4
8865 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8866 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8867 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8868 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8869 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8870 // CHECK9-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 8
8871 // CHECK9-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 8
8872 // CHECK9-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 8
8873 // CHECK9-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
8874 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8875 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 8
8876 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 8
8877 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 8
8878 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
8879 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
8880 // CHECK9-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8881 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8882 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
8883 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8884 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
8885 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
8886 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
8887 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8888 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
8889 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8890 // CHECK9:       omp.precond.then:
8891 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
8892 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8893 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
8894 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8895 // CHECK9-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP8]] to i32
8896 // CHECK9-NEXT:    [[TMP9:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8897 // CHECK9-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP9]] to i32
8898 // CHECK9-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
8899 // CHECK9-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
8900 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8901 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8902 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[CONV]], align 4
8903 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8904 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8905 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8906 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
8907 // CHECK9-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32 35, i32 [[TMP11]], i32 [[TMP12]], i32 1, i32 [[TMP10]])
8908 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
8909 // CHECK9:       omp.dispatch.cond:
8910 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8911 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
8912 // CHECK9-NEXT:    [[TMP17:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP16]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
8913 // CHECK9-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP17]], 0
8914 // CHECK9-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
8915 // CHECK9:       omp.dispatch.body:
8916 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8917 // CHECK9-NEXT:    store i32 [[TMP18]], i32* [[DOTOMP_IV]], align 4
8918 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8919 // CHECK9:       omp.inner.for.cond:
8920 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
8921 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !28
8922 // CHECK9-NEXT:    [[CMP7:%.*]] = icmp sle i32 [[TMP19]], [[TMP20]]
8923 // CHECK9-NEXT:    br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8924 // CHECK9:       omp.inner.for.body:
8925 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
8926 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP21]], 1
8927 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8928 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4, !llvm.access.group !28
8929 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[TMP2]], align 8, !llvm.access.group !28
8930 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !28
8931 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP23]] to i64
8932 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP22]], i64 [[IDXPROM]]
8933 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[ARRAYIDX]], align 4, !llvm.access.group !28
8934 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32*, i32** [[TMP3]], align 8, !llvm.access.group !28
8935 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !28
8936 // CHECK9-NEXT:    [[IDXPROM8:%.*]] = sext i32 [[TMP26]] to i64
8937 // CHECK9-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds i32, i32* [[TMP25]], i64 [[IDXPROM8]]
8938 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[ARRAYIDX9]], align 4, !llvm.access.group !28
8939 // CHECK9-NEXT:    [[ADD10:%.*]] = add nsw i32 [[TMP24]], [[TMP27]]
8940 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32*, i32** [[TMP1]], align 8, !llvm.access.group !28
8941 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !28
8942 // CHECK9-NEXT:    [[IDXPROM11:%.*]] = sext i32 [[TMP29]] to i64
8943 // CHECK9-NEXT:    [[ARRAYIDX12:%.*]] = getelementptr inbounds i32, i32* [[TMP28]], i64 [[IDXPROM11]]
8944 // CHECK9-NEXT:    store i32 [[ADD10]], i32* [[ARRAYIDX12]], align 4, !llvm.access.group !28
8945 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
8946 // CHECK9:       omp.body.continue:
8947 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8948 // CHECK9:       omp.inner.for.inc:
8949 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
8950 // CHECK9-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP30]], 1
8951 // CHECK9-NEXT:    store i32 [[ADD13]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
8952 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP29:![0-9]+]]
8953 // CHECK9:       omp.inner.for.end:
8954 // CHECK9-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
8955 // CHECK9:       omp.dispatch.inc:
8956 // CHECK9-NEXT:    br label [[OMP_DISPATCH_COND]]
8957 // CHECK9:       omp.dispatch.end:
8958 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
8959 // CHECK9:       omp.precond.end:
8960 // CHECK9-NEXT:    ret void
8961 //
8962 //
8963 // CHECK9-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
8964 // CHECK9-SAME: () #[[ATTR4:[0-9]+]] {
8965 // CHECK9-NEXT:  entry:
8966 // CHECK9-NEXT:    call void @__tgt_register_requires(i64 1)
8967 // CHECK9-NEXT:    ret void
8968 //
8969 //
8970 // CHECK11-LABEL: define {{[^@]+}}@main
8971 // CHECK11-SAME: () #[[ATTR0:[0-9]+]] {
8972 // CHECK11-NEXT:  entry:
8973 // CHECK11-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
8974 // CHECK11-NEXT:    [[A:%.*]] = alloca double*, align 4
8975 // CHECK11-NEXT:    [[B:%.*]] = alloca double*, align 4
8976 // CHECK11-NEXT:    [[C:%.*]] = alloca double*, align 4
8977 // CHECK11-NEXT:    [[N:%.*]] = alloca i32, align 4
8978 // CHECK11-NEXT:    [[CH:%.*]] = alloca i32, align 4
8979 // CHECK11-NEXT:    [[N_CASTED:%.*]] = alloca i32, align 4
8980 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x i8*], align 4
8981 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x i8*], align 4
8982 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x i8*], align 4
8983 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8984 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8985 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8986 // CHECK11-NEXT:    [[N_CASTED3:%.*]] = alloca i32, align 4
8987 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [4 x i8*], align 4
8988 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS5:%.*]] = alloca [4 x i8*], align 4
8989 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [4 x i8*], align 4
8990 // CHECK11-NEXT:    [[_TMP7:%.*]] = alloca i32, align 4
8991 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_8:%.*]] = alloca i32, align 4
8992 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4
8993 // CHECK11-NEXT:    [[CH_CASTED:%.*]] = alloca i32, align 4
8994 // CHECK11-NEXT:    [[N_CASTED17:%.*]] = alloca i32, align 4
8995 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS18:%.*]] = alloca [5 x i8*], align 4
8996 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS19:%.*]] = alloca [5 x i8*], align 4
8997 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS20:%.*]] = alloca [5 x i8*], align 4
8998 // CHECK11-NEXT:    [[_TMP21:%.*]] = alloca i32, align 4
8999 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_22:%.*]] = alloca i32, align 4
9000 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_23:%.*]] = alloca i32, align 4
9001 // CHECK11-NEXT:    [[N_CASTED31:%.*]] = alloca i32, align 4
9002 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS32:%.*]] = alloca [4 x i8*], align 4
9003 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS33:%.*]] = alloca [4 x i8*], align 4
9004 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS34:%.*]] = alloca [4 x i8*], align 4
9005 // CHECK11-NEXT:    [[_TMP35:%.*]] = alloca i32, align 4
9006 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_36:%.*]] = alloca i32, align 4
9007 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_37:%.*]] = alloca i32, align 4
9008 // CHECK11-NEXT:    [[CH_CASTED45:%.*]] = alloca i32, align 4
9009 // CHECK11-NEXT:    [[N_CASTED46:%.*]] = alloca i32, align 4
9010 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS47:%.*]] = alloca [5 x i8*], align 4
9011 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS48:%.*]] = alloca [5 x i8*], align 4
9012 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS49:%.*]] = alloca [5 x i8*], align 4
9013 // CHECK11-NEXT:    [[_TMP50:%.*]] = alloca i32, align 4
9014 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_51:%.*]] = alloca i32, align 4
9015 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_52:%.*]] = alloca i32, align 4
9016 // CHECK11-NEXT:    [[N_CASTED60:%.*]] = alloca i32, align 4
9017 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS61:%.*]] = alloca [4 x i8*], align 4
9018 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS62:%.*]] = alloca [4 x i8*], align 4
9019 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS63:%.*]] = alloca [4 x i8*], align 4
9020 // CHECK11-NEXT:    [[_TMP64:%.*]] = alloca i32, align 4
9021 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_65:%.*]] = alloca i32, align 4
9022 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_66:%.*]] = alloca i32, align 4
9023 // CHECK11-NEXT:    [[CH_CASTED74:%.*]] = alloca i32, align 4
9024 // CHECK11-NEXT:    [[N_CASTED75:%.*]] = alloca i32, align 4
9025 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS76:%.*]] = alloca [5 x i8*], align 4
9026 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS77:%.*]] = alloca [5 x i8*], align 4
9027 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS78:%.*]] = alloca [5 x i8*], align 4
9028 // CHECK11-NEXT:    [[_TMP79:%.*]] = alloca i32, align 4
9029 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_80:%.*]] = alloca i32, align 4
9030 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_81:%.*]] = alloca i32, align 4
9031 // CHECK11-NEXT:    store i32 0, i32* [[RETVAL]], align 4
9032 // CHECK11-NEXT:    store i32 10000, i32* [[N]], align 4
9033 // CHECK11-NEXT:    store i32 100, i32* [[CH]], align 4
9034 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
9035 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[N_CASTED]], align 4
9036 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[N_CASTED]], align 4
9037 // CHECK11-NEXT:    [[TMP2:%.*]] = load double*, double** [[A]], align 4
9038 // CHECK11-NEXT:    [[TMP3:%.*]] = load double*, double** [[B]], align 4
9039 // CHECK11-NEXT:    [[TMP4:%.*]] = load double*, double** [[C]], align 4
9040 // CHECK11-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
9041 // CHECK11-NEXT:    [[TMP6:%.*]] = bitcast i8** [[TMP5]] to i32*
9042 // CHECK11-NEXT:    store i32 [[TMP1]], i32* [[TMP6]], align 4
9043 // CHECK11-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
9044 // CHECK11-NEXT:    [[TMP8:%.*]] = bitcast i8** [[TMP7]] to i32*
9045 // CHECK11-NEXT:    store i32 [[TMP1]], i32* [[TMP8]], align 4
9046 // CHECK11-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
9047 // CHECK11-NEXT:    store i8* null, i8** [[TMP9]], align 4
9048 // CHECK11-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
9049 // CHECK11-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to double**
9050 // CHECK11-NEXT:    store double* [[TMP2]], double** [[TMP11]], align 4
9051 // CHECK11-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
9052 // CHECK11-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to double**
9053 // CHECK11-NEXT:    store double* [[TMP2]], double** [[TMP13]], align 4
9054 // CHECK11-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
9055 // CHECK11-NEXT:    store i8* null, i8** [[TMP14]], align 4
9056 // CHECK11-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
9057 // CHECK11-NEXT:    [[TMP16:%.*]] = bitcast i8** [[TMP15]] to double**
9058 // CHECK11-NEXT:    store double* [[TMP3]], double** [[TMP16]], align 4
9059 // CHECK11-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
9060 // CHECK11-NEXT:    [[TMP18:%.*]] = bitcast i8** [[TMP17]] to double**
9061 // CHECK11-NEXT:    store double* [[TMP3]], double** [[TMP18]], align 4
9062 // CHECK11-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
9063 // CHECK11-NEXT:    store i8* null, i8** [[TMP19]], align 4
9064 // CHECK11-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
9065 // CHECK11-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to double**
9066 // CHECK11-NEXT:    store double* [[TMP4]], double** [[TMP21]], align 4
9067 // CHECK11-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
9068 // CHECK11-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to double**
9069 // CHECK11-NEXT:    store double* [[TMP4]], double** [[TMP23]], align 4
9070 // CHECK11-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 3
9071 // CHECK11-NEXT:    store i8* null, i8** [[TMP24]], align 4
9072 // CHECK11-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
9073 // CHECK11-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
9074 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[N]], align 4
9075 // CHECK11-NEXT:    store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4
9076 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9077 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0
9078 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
9079 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
9080 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
9081 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9082 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP29]], 1
9083 // CHECK11-NEXT:    [[TMP30:%.*]] = zext i32 [[ADD]] to i64
9084 // CHECK11-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
9085 // CHECK11-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
9086 // CHECK11-NEXT:    store i32 1, i32* [[TMP31]], align 4
9087 // CHECK11-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
9088 // CHECK11-NEXT:    store i32 4, i32* [[TMP32]], align 4
9089 // CHECK11-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
9090 // CHECK11-NEXT:    store i8** [[TMP25]], i8*** [[TMP33]], align 4
9091 // CHECK11-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
9092 // CHECK11-NEXT:    store i8** [[TMP26]], i8*** [[TMP34]], align 4
9093 // CHECK11-NEXT:    [[TMP35:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
9094 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes, i32 0, i32 0), i64** [[TMP35]], align 4
9095 // CHECK11-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
9096 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP36]], align 4
9097 // CHECK11-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
9098 // CHECK11-NEXT:    store i8** null, i8*** [[TMP37]], align 4
9099 // CHECK11-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
9100 // CHECK11-NEXT:    store i8** null, i8*** [[TMP38]], align 4
9101 // CHECK11-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
9102 // CHECK11-NEXT:    store i64 [[TMP30]], i64* [[TMP39]], align 8
9103 // CHECK11-NEXT:    [[TMP40:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l369.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
9104 // CHECK11-NEXT:    [[TMP41:%.*]] = icmp ne i32 [[TMP40]], 0
9105 // CHECK11-NEXT:    br i1 [[TMP41]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
9106 // CHECK11:       omp_offload.failed:
9107 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l369(i32 [[TMP1]], double* [[TMP2]], double* [[TMP3]], double* [[TMP4]]) #[[ATTR2:[0-9]+]]
9108 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT]]
9109 // CHECK11:       omp_offload.cont:
9110 // CHECK11-NEXT:    [[TMP42:%.*]] = load i32, i32* [[N]], align 4
9111 // CHECK11-NEXT:    store i32 [[TMP42]], i32* [[N_CASTED3]], align 4
9112 // CHECK11-NEXT:    [[TMP43:%.*]] = load i32, i32* [[N_CASTED3]], align 4
9113 // CHECK11-NEXT:    [[TMP44:%.*]] = load double*, double** [[A]], align 4
9114 // CHECK11-NEXT:    [[TMP45:%.*]] = load double*, double** [[B]], align 4
9115 // CHECK11-NEXT:    [[TMP46:%.*]] = load double*, double** [[C]], align 4
9116 // CHECK11-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
9117 // CHECK11-NEXT:    [[TMP48:%.*]] = bitcast i8** [[TMP47]] to i32*
9118 // CHECK11-NEXT:    store i32 [[TMP43]], i32* [[TMP48]], align 4
9119 // CHECK11-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
9120 // CHECK11-NEXT:    [[TMP50:%.*]] = bitcast i8** [[TMP49]] to i32*
9121 // CHECK11-NEXT:    store i32 [[TMP43]], i32* [[TMP50]], align 4
9122 // CHECK11-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 0
9123 // CHECK11-NEXT:    store i8* null, i8** [[TMP51]], align 4
9124 // CHECK11-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 1
9125 // CHECK11-NEXT:    [[TMP53:%.*]] = bitcast i8** [[TMP52]] to double**
9126 // CHECK11-NEXT:    store double* [[TMP44]], double** [[TMP53]], align 4
9127 // CHECK11-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 1
9128 // CHECK11-NEXT:    [[TMP55:%.*]] = bitcast i8** [[TMP54]] to double**
9129 // CHECK11-NEXT:    store double* [[TMP44]], double** [[TMP55]], align 4
9130 // CHECK11-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 1
9131 // CHECK11-NEXT:    store i8* null, i8** [[TMP56]], align 4
9132 // CHECK11-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 2
9133 // CHECK11-NEXT:    [[TMP58:%.*]] = bitcast i8** [[TMP57]] to double**
9134 // CHECK11-NEXT:    store double* [[TMP45]], double** [[TMP58]], align 4
9135 // CHECK11-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 2
9136 // CHECK11-NEXT:    [[TMP60:%.*]] = bitcast i8** [[TMP59]] to double**
9137 // CHECK11-NEXT:    store double* [[TMP45]], double** [[TMP60]], align 4
9138 // CHECK11-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 2
9139 // CHECK11-NEXT:    store i8* null, i8** [[TMP61]], align 4
9140 // CHECK11-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 3
9141 // CHECK11-NEXT:    [[TMP63:%.*]] = bitcast i8** [[TMP62]] to double**
9142 // CHECK11-NEXT:    store double* [[TMP46]], double** [[TMP63]], align 4
9143 // CHECK11-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 3
9144 // CHECK11-NEXT:    [[TMP65:%.*]] = bitcast i8** [[TMP64]] to double**
9145 // CHECK11-NEXT:    store double* [[TMP46]], double** [[TMP65]], align 4
9146 // CHECK11-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 3
9147 // CHECK11-NEXT:    store i8* null, i8** [[TMP66]], align 4
9148 // CHECK11-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
9149 // CHECK11-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
9150 // CHECK11-NEXT:    [[TMP69:%.*]] = load i32, i32* [[N]], align 4
9151 // CHECK11-NEXT:    store i32 [[TMP69]], i32* [[DOTCAPTURE_EXPR_8]], align 4
9152 // CHECK11-NEXT:    [[TMP70:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_8]], align 4
9153 // CHECK11-NEXT:    [[SUB10:%.*]] = sub nsw i32 [[TMP70]], 0
9154 // CHECK11-NEXT:    [[DIV11:%.*]] = sdiv i32 [[SUB10]], 1
9155 // CHECK11-NEXT:    [[SUB12:%.*]] = sub nsw i32 [[DIV11]], 1
9156 // CHECK11-NEXT:    store i32 [[SUB12]], i32* [[DOTCAPTURE_EXPR_9]], align 4
9157 // CHECK11-NEXT:    [[TMP71:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_9]], align 4
9158 // CHECK11-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP71]], 1
9159 // CHECK11-NEXT:    [[TMP72:%.*]] = zext i32 [[ADD13]] to i64
9160 // CHECK11-NEXT:    [[KERNEL_ARGS14:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9161 // CHECK11-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 0
9162 // CHECK11-NEXT:    store i32 1, i32* [[TMP73]], align 4
9163 // CHECK11-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 1
9164 // CHECK11-NEXT:    store i32 4, i32* [[TMP74]], align 4
9165 // CHECK11-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 2
9166 // CHECK11-NEXT:    store i8** [[TMP67]], i8*** [[TMP75]], align 4
9167 // CHECK11-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 3
9168 // CHECK11-NEXT:    store i8** [[TMP68]], i8*** [[TMP76]], align 4
9169 // CHECK11-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 4
9170 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.4, i32 0, i32 0), i64** [[TMP77]], align 4
9171 // CHECK11-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 5
9172 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP78]], align 4
9173 // CHECK11-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 6
9174 // CHECK11-NEXT:    store i8** null, i8*** [[TMP79]], align 4
9175 // CHECK11-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 7
9176 // CHECK11-NEXT:    store i8** null, i8*** [[TMP80]], align 4
9177 // CHECK11-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 8
9178 // CHECK11-NEXT:    store i64 [[TMP72]], i64* [[TMP81]], align 8
9179 // CHECK11-NEXT:    [[TMP82:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l408.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]])
9180 // CHECK11-NEXT:    [[TMP83:%.*]] = icmp ne i32 [[TMP82]], 0
9181 // CHECK11-NEXT:    br i1 [[TMP83]], label [[OMP_OFFLOAD_FAILED15:%.*]], label [[OMP_OFFLOAD_CONT16:%.*]]
9182 // CHECK11:       omp_offload.failed15:
9183 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l408(i32 [[TMP43]], double* [[TMP44]], double* [[TMP45]], double* [[TMP46]]) #[[ATTR2]]
9184 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT16]]
9185 // CHECK11:       omp_offload.cont16:
9186 // CHECK11-NEXT:    [[TMP84:%.*]] = load i32, i32* [[CH]], align 4
9187 // CHECK11-NEXT:    store i32 [[TMP84]], i32* [[CH_CASTED]], align 4
9188 // CHECK11-NEXT:    [[TMP85:%.*]] = load i32, i32* [[CH_CASTED]], align 4
9189 // CHECK11-NEXT:    [[TMP86:%.*]] = load i32, i32* [[N]], align 4
9190 // CHECK11-NEXT:    store i32 [[TMP86]], i32* [[N_CASTED17]], align 4
9191 // CHECK11-NEXT:    [[TMP87:%.*]] = load i32, i32* [[N_CASTED17]], align 4
9192 // CHECK11-NEXT:    [[TMP88:%.*]] = load double*, double** [[A]], align 4
9193 // CHECK11-NEXT:    [[TMP89:%.*]] = load double*, double** [[B]], align 4
9194 // CHECK11-NEXT:    [[TMP90:%.*]] = load double*, double** [[C]], align 4
9195 // CHECK11-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0
9196 // CHECK11-NEXT:    [[TMP92:%.*]] = bitcast i8** [[TMP91]] to i32*
9197 // CHECK11-NEXT:    store i32 [[TMP85]], i32* [[TMP92]], align 4
9198 // CHECK11-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 0
9199 // CHECK11-NEXT:    [[TMP94:%.*]] = bitcast i8** [[TMP93]] to i32*
9200 // CHECK11-NEXT:    store i32 [[TMP85]], i32* [[TMP94]], align 4
9201 // CHECK11-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 0
9202 // CHECK11-NEXT:    store i8* null, i8** [[TMP95]], align 4
9203 // CHECK11-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 1
9204 // CHECK11-NEXT:    [[TMP97:%.*]] = bitcast i8** [[TMP96]] to i32*
9205 // CHECK11-NEXT:    store i32 [[TMP87]], i32* [[TMP97]], align 4
9206 // CHECK11-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 1
9207 // CHECK11-NEXT:    [[TMP99:%.*]] = bitcast i8** [[TMP98]] to i32*
9208 // CHECK11-NEXT:    store i32 [[TMP87]], i32* [[TMP99]], align 4
9209 // CHECK11-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 1
9210 // CHECK11-NEXT:    store i8* null, i8** [[TMP100]], align 4
9211 // CHECK11-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 2
9212 // CHECK11-NEXT:    [[TMP102:%.*]] = bitcast i8** [[TMP101]] to double**
9213 // CHECK11-NEXT:    store double* [[TMP88]], double** [[TMP102]], align 4
9214 // CHECK11-NEXT:    [[TMP103:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 2
9215 // CHECK11-NEXT:    [[TMP104:%.*]] = bitcast i8** [[TMP103]] to double**
9216 // CHECK11-NEXT:    store double* [[TMP88]], double** [[TMP104]], align 4
9217 // CHECK11-NEXT:    [[TMP105:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 2
9218 // CHECK11-NEXT:    store i8* null, i8** [[TMP105]], align 4
9219 // CHECK11-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 3
9220 // CHECK11-NEXT:    [[TMP107:%.*]] = bitcast i8** [[TMP106]] to double**
9221 // CHECK11-NEXT:    store double* [[TMP89]], double** [[TMP107]], align 4
9222 // CHECK11-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 3
9223 // CHECK11-NEXT:    [[TMP109:%.*]] = bitcast i8** [[TMP108]] to double**
9224 // CHECK11-NEXT:    store double* [[TMP89]], double** [[TMP109]], align 4
9225 // CHECK11-NEXT:    [[TMP110:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 3
9226 // CHECK11-NEXT:    store i8* null, i8** [[TMP110]], align 4
9227 // CHECK11-NEXT:    [[TMP111:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 4
9228 // CHECK11-NEXT:    [[TMP112:%.*]] = bitcast i8** [[TMP111]] to double**
9229 // CHECK11-NEXT:    store double* [[TMP90]], double** [[TMP112]], align 4
9230 // CHECK11-NEXT:    [[TMP113:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 4
9231 // CHECK11-NEXT:    [[TMP114:%.*]] = bitcast i8** [[TMP113]] to double**
9232 // CHECK11-NEXT:    store double* [[TMP90]], double** [[TMP114]], align 4
9233 // CHECK11-NEXT:    [[TMP115:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 4
9234 // CHECK11-NEXT:    store i8* null, i8** [[TMP115]], align 4
9235 // CHECK11-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0
9236 // CHECK11-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 0
9237 // CHECK11-NEXT:    [[TMP118:%.*]] = load i32, i32* [[N]], align 4
9238 // CHECK11-NEXT:    store i32 [[TMP118]], i32* [[DOTCAPTURE_EXPR_22]], align 4
9239 // CHECK11-NEXT:    [[TMP119:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_22]], align 4
9240 // CHECK11-NEXT:    [[SUB24:%.*]] = sub nsw i32 [[TMP119]], 0
9241 // CHECK11-NEXT:    [[DIV25:%.*]] = sdiv i32 [[SUB24]], 1
9242 // CHECK11-NEXT:    [[SUB26:%.*]] = sub nsw i32 [[DIV25]], 1
9243 // CHECK11-NEXT:    store i32 [[SUB26]], i32* [[DOTCAPTURE_EXPR_23]], align 4
9244 // CHECK11-NEXT:    [[TMP120:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_23]], align 4
9245 // CHECK11-NEXT:    [[ADD27:%.*]] = add nsw i32 [[TMP120]], 1
9246 // CHECK11-NEXT:    [[TMP121:%.*]] = zext i32 [[ADD27]] to i64
9247 // CHECK11-NEXT:    [[KERNEL_ARGS28:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9248 // CHECK11-NEXT:    [[TMP122:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 0
9249 // CHECK11-NEXT:    store i32 1, i32* [[TMP122]], align 4
9250 // CHECK11-NEXT:    [[TMP123:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 1
9251 // CHECK11-NEXT:    store i32 5, i32* [[TMP123]], align 4
9252 // CHECK11-NEXT:    [[TMP124:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 2
9253 // CHECK11-NEXT:    store i8** [[TMP116]], i8*** [[TMP124]], align 4
9254 // CHECK11-NEXT:    [[TMP125:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 3
9255 // CHECK11-NEXT:    store i8** [[TMP117]], i8*** [[TMP125]], align 4
9256 // CHECK11-NEXT:    [[TMP126:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 4
9257 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.8, i32 0, i32 0), i64** [[TMP126]], align 4
9258 // CHECK11-NEXT:    [[TMP127:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 5
9259 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP127]], align 4
9260 // CHECK11-NEXT:    [[TMP128:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 6
9261 // CHECK11-NEXT:    store i8** null, i8*** [[TMP128]], align 4
9262 // CHECK11-NEXT:    [[TMP129:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 7
9263 // CHECK11-NEXT:    store i8** null, i8*** [[TMP129]], align 4
9264 // CHECK11-NEXT:    [[TMP130:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 8
9265 // CHECK11-NEXT:    store i64 [[TMP121]], i64* [[TMP130]], align 8
9266 // CHECK11-NEXT:    [[TMP131:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l447.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]])
9267 // CHECK11-NEXT:    [[TMP132:%.*]] = icmp ne i32 [[TMP131]], 0
9268 // CHECK11-NEXT:    br i1 [[TMP132]], label [[OMP_OFFLOAD_FAILED29:%.*]], label [[OMP_OFFLOAD_CONT30:%.*]]
9269 // CHECK11:       omp_offload.failed29:
9270 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l447(i32 [[TMP85]], i32 [[TMP87]], double* [[TMP88]], double* [[TMP89]], double* [[TMP90]]) #[[ATTR2]]
9271 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT30]]
9272 // CHECK11:       omp_offload.cont30:
9273 // CHECK11-NEXT:    [[TMP133:%.*]] = load i32, i32* [[N]], align 4
9274 // CHECK11-NEXT:    store i32 [[TMP133]], i32* [[N_CASTED31]], align 4
9275 // CHECK11-NEXT:    [[TMP134:%.*]] = load i32, i32* [[N_CASTED31]], align 4
9276 // CHECK11-NEXT:    [[TMP135:%.*]] = load double*, double** [[A]], align 4
9277 // CHECK11-NEXT:    [[TMP136:%.*]] = load double*, double** [[B]], align 4
9278 // CHECK11-NEXT:    [[TMP137:%.*]] = load double*, double** [[C]], align 4
9279 // CHECK11-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 0
9280 // CHECK11-NEXT:    [[TMP139:%.*]] = bitcast i8** [[TMP138]] to i32*
9281 // CHECK11-NEXT:    store i32 [[TMP134]], i32* [[TMP139]], align 4
9282 // CHECK11-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 0
9283 // CHECK11-NEXT:    [[TMP141:%.*]] = bitcast i8** [[TMP140]] to i32*
9284 // CHECK11-NEXT:    store i32 [[TMP134]], i32* [[TMP141]], align 4
9285 // CHECK11-NEXT:    [[TMP142:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS34]], i32 0, i32 0
9286 // CHECK11-NEXT:    store i8* null, i8** [[TMP142]], align 4
9287 // CHECK11-NEXT:    [[TMP143:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 1
9288 // CHECK11-NEXT:    [[TMP144:%.*]] = bitcast i8** [[TMP143]] to double**
9289 // CHECK11-NEXT:    store double* [[TMP135]], double** [[TMP144]], align 4
9290 // CHECK11-NEXT:    [[TMP145:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 1
9291 // CHECK11-NEXT:    [[TMP146:%.*]] = bitcast i8** [[TMP145]] to double**
9292 // CHECK11-NEXT:    store double* [[TMP135]], double** [[TMP146]], align 4
9293 // CHECK11-NEXT:    [[TMP147:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS34]], i32 0, i32 1
9294 // CHECK11-NEXT:    store i8* null, i8** [[TMP147]], align 4
9295 // CHECK11-NEXT:    [[TMP148:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 2
9296 // CHECK11-NEXT:    [[TMP149:%.*]] = bitcast i8** [[TMP148]] to double**
9297 // CHECK11-NEXT:    store double* [[TMP136]], double** [[TMP149]], align 4
9298 // CHECK11-NEXT:    [[TMP150:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 2
9299 // CHECK11-NEXT:    [[TMP151:%.*]] = bitcast i8** [[TMP150]] to double**
9300 // CHECK11-NEXT:    store double* [[TMP136]], double** [[TMP151]], align 4
9301 // CHECK11-NEXT:    [[TMP152:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS34]], i32 0, i32 2
9302 // CHECK11-NEXT:    store i8* null, i8** [[TMP152]], align 4
9303 // CHECK11-NEXT:    [[TMP153:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 3
9304 // CHECK11-NEXT:    [[TMP154:%.*]] = bitcast i8** [[TMP153]] to double**
9305 // CHECK11-NEXT:    store double* [[TMP137]], double** [[TMP154]], align 4
9306 // CHECK11-NEXT:    [[TMP155:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 3
9307 // CHECK11-NEXT:    [[TMP156:%.*]] = bitcast i8** [[TMP155]] to double**
9308 // CHECK11-NEXT:    store double* [[TMP137]], double** [[TMP156]], align 4
9309 // CHECK11-NEXT:    [[TMP157:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS34]], i32 0, i32 3
9310 // CHECK11-NEXT:    store i8* null, i8** [[TMP157]], align 4
9311 // CHECK11-NEXT:    [[TMP158:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 0
9312 // CHECK11-NEXT:    [[TMP159:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 0
9313 // CHECK11-NEXT:    [[TMP160:%.*]] = load i32, i32* [[N]], align 4
9314 // CHECK11-NEXT:    store i32 [[TMP160]], i32* [[DOTCAPTURE_EXPR_36]], align 4
9315 // CHECK11-NEXT:    [[TMP161:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_36]], align 4
9316 // CHECK11-NEXT:    [[SUB38:%.*]] = sub nsw i32 [[TMP161]], 0
9317 // CHECK11-NEXT:    [[DIV39:%.*]] = sdiv i32 [[SUB38]], 1
9318 // CHECK11-NEXT:    [[SUB40:%.*]] = sub nsw i32 [[DIV39]], 1
9319 // CHECK11-NEXT:    store i32 [[SUB40]], i32* [[DOTCAPTURE_EXPR_37]], align 4
9320 // CHECK11-NEXT:    [[TMP162:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_37]], align 4
9321 // CHECK11-NEXT:    [[ADD41:%.*]] = add nsw i32 [[TMP162]], 1
9322 // CHECK11-NEXT:    [[TMP163:%.*]] = zext i32 [[ADD41]] to i64
9323 // CHECK11-NEXT:    [[KERNEL_ARGS42:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9324 // CHECK11-NEXT:    [[TMP164:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 0
9325 // CHECK11-NEXT:    store i32 1, i32* [[TMP164]], align 4
9326 // CHECK11-NEXT:    [[TMP165:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 1
9327 // CHECK11-NEXT:    store i32 4, i32* [[TMP165]], align 4
9328 // CHECK11-NEXT:    [[TMP166:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 2
9329 // CHECK11-NEXT:    store i8** [[TMP158]], i8*** [[TMP166]], align 4
9330 // CHECK11-NEXT:    [[TMP167:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 3
9331 // CHECK11-NEXT:    store i8** [[TMP159]], i8*** [[TMP167]], align 4
9332 // CHECK11-NEXT:    [[TMP168:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 4
9333 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.12, i32 0, i32 0), i64** [[TMP168]], align 4
9334 // CHECK11-NEXT:    [[TMP169:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 5
9335 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP169]], align 4
9336 // CHECK11-NEXT:    [[TMP170:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 6
9337 // CHECK11-NEXT:    store i8** null, i8*** [[TMP170]], align 4
9338 // CHECK11-NEXT:    [[TMP171:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 7
9339 // CHECK11-NEXT:    store i8** null, i8*** [[TMP171]], align 4
9340 // CHECK11-NEXT:    [[TMP172:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 8
9341 // CHECK11-NEXT:    store i64 [[TMP163]], i64* [[TMP172]], align 8
9342 // CHECK11-NEXT:    [[TMP173:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l478.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]])
9343 // CHECK11-NEXT:    [[TMP174:%.*]] = icmp ne i32 [[TMP173]], 0
9344 // CHECK11-NEXT:    br i1 [[TMP174]], label [[OMP_OFFLOAD_FAILED43:%.*]], label [[OMP_OFFLOAD_CONT44:%.*]]
9345 // CHECK11:       omp_offload.failed43:
9346 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l478(i32 [[TMP134]], double* [[TMP135]], double* [[TMP136]], double* [[TMP137]]) #[[ATTR2]]
9347 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT44]]
9348 // CHECK11:       omp_offload.cont44:
9349 // CHECK11-NEXT:    [[TMP175:%.*]] = load i32, i32* [[CH]], align 4
9350 // CHECK11-NEXT:    store i32 [[TMP175]], i32* [[CH_CASTED45]], align 4
9351 // CHECK11-NEXT:    [[TMP176:%.*]] = load i32, i32* [[CH_CASTED45]], align 4
9352 // CHECK11-NEXT:    [[TMP177:%.*]] = load i32, i32* [[N]], align 4
9353 // CHECK11-NEXT:    store i32 [[TMP177]], i32* [[N_CASTED46]], align 4
9354 // CHECK11-NEXT:    [[TMP178:%.*]] = load i32, i32* [[N_CASTED46]], align 4
9355 // CHECK11-NEXT:    [[TMP179:%.*]] = load double*, double** [[A]], align 4
9356 // CHECK11-NEXT:    [[TMP180:%.*]] = load double*, double** [[B]], align 4
9357 // CHECK11-NEXT:    [[TMP181:%.*]] = load double*, double** [[C]], align 4
9358 // CHECK11-NEXT:    [[TMP182:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 0
9359 // CHECK11-NEXT:    [[TMP183:%.*]] = bitcast i8** [[TMP182]] to i32*
9360 // CHECK11-NEXT:    store i32 [[TMP176]], i32* [[TMP183]], align 4
9361 // CHECK11-NEXT:    [[TMP184:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 0
9362 // CHECK11-NEXT:    [[TMP185:%.*]] = bitcast i8** [[TMP184]] to i32*
9363 // CHECK11-NEXT:    store i32 [[TMP176]], i32* [[TMP185]], align 4
9364 // CHECK11-NEXT:    [[TMP186:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 0
9365 // CHECK11-NEXT:    store i8* null, i8** [[TMP186]], align 4
9366 // CHECK11-NEXT:    [[TMP187:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 1
9367 // CHECK11-NEXT:    [[TMP188:%.*]] = bitcast i8** [[TMP187]] to i32*
9368 // CHECK11-NEXT:    store i32 [[TMP178]], i32* [[TMP188]], align 4
9369 // CHECK11-NEXT:    [[TMP189:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 1
9370 // CHECK11-NEXT:    [[TMP190:%.*]] = bitcast i8** [[TMP189]] to i32*
9371 // CHECK11-NEXT:    store i32 [[TMP178]], i32* [[TMP190]], align 4
9372 // CHECK11-NEXT:    [[TMP191:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 1
9373 // CHECK11-NEXT:    store i8* null, i8** [[TMP191]], align 4
9374 // CHECK11-NEXT:    [[TMP192:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 2
9375 // CHECK11-NEXT:    [[TMP193:%.*]] = bitcast i8** [[TMP192]] to double**
9376 // CHECK11-NEXT:    store double* [[TMP179]], double** [[TMP193]], align 4
9377 // CHECK11-NEXT:    [[TMP194:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 2
9378 // CHECK11-NEXT:    [[TMP195:%.*]] = bitcast i8** [[TMP194]] to double**
9379 // CHECK11-NEXT:    store double* [[TMP179]], double** [[TMP195]], align 4
9380 // CHECK11-NEXT:    [[TMP196:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 2
9381 // CHECK11-NEXT:    store i8* null, i8** [[TMP196]], align 4
9382 // CHECK11-NEXT:    [[TMP197:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 3
9383 // CHECK11-NEXT:    [[TMP198:%.*]] = bitcast i8** [[TMP197]] to double**
9384 // CHECK11-NEXT:    store double* [[TMP180]], double** [[TMP198]], align 4
9385 // CHECK11-NEXT:    [[TMP199:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 3
9386 // CHECK11-NEXT:    [[TMP200:%.*]] = bitcast i8** [[TMP199]] to double**
9387 // CHECK11-NEXT:    store double* [[TMP180]], double** [[TMP200]], align 4
9388 // CHECK11-NEXT:    [[TMP201:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 3
9389 // CHECK11-NEXT:    store i8* null, i8** [[TMP201]], align 4
9390 // CHECK11-NEXT:    [[TMP202:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 4
9391 // CHECK11-NEXT:    [[TMP203:%.*]] = bitcast i8** [[TMP202]] to double**
9392 // CHECK11-NEXT:    store double* [[TMP181]], double** [[TMP203]], align 4
9393 // CHECK11-NEXT:    [[TMP204:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 4
9394 // CHECK11-NEXT:    [[TMP205:%.*]] = bitcast i8** [[TMP204]] to double**
9395 // CHECK11-NEXT:    store double* [[TMP181]], double** [[TMP205]], align 4
9396 // CHECK11-NEXT:    [[TMP206:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 4
9397 // CHECK11-NEXT:    store i8* null, i8** [[TMP206]], align 4
9398 // CHECK11-NEXT:    [[TMP207:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 0
9399 // CHECK11-NEXT:    [[TMP208:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 0
9400 // CHECK11-NEXT:    [[TMP209:%.*]] = load i32, i32* [[N]], align 4
9401 // CHECK11-NEXT:    store i32 [[TMP209]], i32* [[DOTCAPTURE_EXPR_51]], align 4
9402 // CHECK11-NEXT:    [[TMP210:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_51]], align 4
9403 // CHECK11-NEXT:    [[SUB53:%.*]] = sub nsw i32 [[TMP210]], 0
9404 // CHECK11-NEXT:    [[DIV54:%.*]] = sdiv i32 [[SUB53]], 1
9405 // CHECK11-NEXT:    [[SUB55:%.*]] = sub nsw i32 [[DIV54]], 1
9406 // CHECK11-NEXT:    store i32 [[SUB55]], i32* [[DOTCAPTURE_EXPR_52]], align 4
9407 // CHECK11-NEXT:    [[TMP211:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_52]], align 4
9408 // CHECK11-NEXT:    [[ADD56:%.*]] = add nsw i32 [[TMP211]], 1
9409 // CHECK11-NEXT:    [[TMP212:%.*]] = zext i32 [[ADD56]] to i64
9410 // CHECK11-NEXT:    [[KERNEL_ARGS57:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9411 // CHECK11-NEXT:    [[TMP213:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 0
9412 // CHECK11-NEXT:    store i32 1, i32* [[TMP213]], align 4
9413 // CHECK11-NEXT:    [[TMP214:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 1
9414 // CHECK11-NEXT:    store i32 5, i32* [[TMP214]], align 4
9415 // CHECK11-NEXT:    [[TMP215:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 2
9416 // CHECK11-NEXT:    store i8** [[TMP207]], i8*** [[TMP215]], align 4
9417 // CHECK11-NEXT:    [[TMP216:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 3
9418 // CHECK11-NEXT:    store i8** [[TMP208]], i8*** [[TMP216]], align 4
9419 // CHECK11-NEXT:    [[TMP217:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 4
9420 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.16, i32 0, i32 0), i64** [[TMP217]], align 4
9421 // CHECK11-NEXT:    [[TMP218:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 5
9422 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP218]], align 4
9423 // CHECK11-NEXT:    [[TMP219:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 6
9424 // CHECK11-NEXT:    store i8** null, i8*** [[TMP219]], align 4
9425 // CHECK11-NEXT:    [[TMP220:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 7
9426 // CHECK11-NEXT:    store i8** null, i8*** [[TMP220]], align 4
9427 // CHECK11-NEXT:    [[TMP221:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 8
9428 // CHECK11-NEXT:    store i64 [[TMP212]], i64* [[TMP221]], align 8
9429 // CHECK11-NEXT:    [[TMP222:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l506.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]])
9430 // CHECK11-NEXT:    [[TMP223:%.*]] = icmp ne i32 [[TMP222]], 0
9431 // CHECK11-NEXT:    br i1 [[TMP223]], label [[OMP_OFFLOAD_FAILED58:%.*]], label [[OMP_OFFLOAD_CONT59:%.*]]
9432 // CHECK11:       omp_offload.failed58:
9433 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l506(i32 [[TMP176]], i32 [[TMP178]], double* [[TMP179]], double* [[TMP180]], double* [[TMP181]]) #[[ATTR2]]
9434 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT59]]
9435 // CHECK11:       omp_offload.cont59:
9436 // CHECK11-NEXT:    [[TMP224:%.*]] = load i32, i32* [[N]], align 4
9437 // CHECK11-NEXT:    store i32 [[TMP224]], i32* [[N_CASTED60]], align 4
9438 // CHECK11-NEXT:    [[TMP225:%.*]] = load i32, i32* [[N_CASTED60]], align 4
9439 // CHECK11-NEXT:    [[TMP226:%.*]] = load double*, double** [[A]], align 4
9440 // CHECK11-NEXT:    [[TMP227:%.*]] = load double*, double** [[B]], align 4
9441 // CHECK11-NEXT:    [[TMP228:%.*]] = load double*, double** [[C]], align 4
9442 // CHECK11-NEXT:    [[TMP229:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 0
9443 // CHECK11-NEXT:    [[TMP230:%.*]] = bitcast i8** [[TMP229]] to i32*
9444 // CHECK11-NEXT:    store i32 [[TMP225]], i32* [[TMP230]], align 4
9445 // CHECK11-NEXT:    [[TMP231:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 0
9446 // CHECK11-NEXT:    [[TMP232:%.*]] = bitcast i8** [[TMP231]] to i32*
9447 // CHECK11-NEXT:    store i32 [[TMP225]], i32* [[TMP232]], align 4
9448 // CHECK11-NEXT:    [[TMP233:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS63]], i32 0, i32 0
9449 // CHECK11-NEXT:    store i8* null, i8** [[TMP233]], align 4
9450 // CHECK11-NEXT:    [[TMP234:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 1
9451 // CHECK11-NEXT:    [[TMP235:%.*]] = bitcast i8** [[TMP234]] to double**
9452 // CHECK11-NEXT:    store double* [[TMP226]], double** [[TMP235]], align 4
9453 // CHECK11-NEXT:    [[TMP236:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 1
9454 // CHECK11-NEXT:    [[TMP237:%.*]] = bitcast i8** [[TMP236]] to double**
9455 // CHECK11-NEXT:    store double* [[TMP226]], double** [[TMP237]], align 4
9456 // CHECK11-NEXT:    [[TMP238:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS63]], i32 0, i32 1
9457 // CHECK11-NEXT:    store i8* null, i8** [[TMP238]], align 4
9458 // CHECK11-NEXT:    [[TMP239:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 2
9459 // CHECK11-NEXT:    [[TMP240:%.*]] = bitcast i8** [[TMP239]] to double**
9460 // CHECK11-NEXT:    store double* [[TMP227]], double** [[TMP240]], align 4
9461 // CHECK11-NEXT:    [[TMP241:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 2
9462 // CHECK11-NEXT:    [[TMP242:%.*]] = bitcast i8** [[TMP241]] to double**
9463 // CHECK11-NEXT:    store double* [[TMP227]], double** [[TMP242]], align 4
9464 // CHECK11-NEXT:    [[TMP243:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS63]], i32 0, i32 2
9465 // CHECK11-NEXT:    store i8* null, i8** [[TMP243]], align 4
9466 // CHECK11-NEXT:    [[TMP244:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 3
9467 // CHECK11-NEXT:    [[TMP245:%.*]] = bitcast i8** [[TMP244]] to double**
9468 // CHECK11-NEXT:    store double* [[TMP228]], double** [[TMP245]], align 4
9469 // CHECK11-NEXT:    [[TMP246:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 3
9470 // CHECK11-NEXT:    [[TMP247:%.*]] = bitcast i8** [[TMP246]] to double**
9471 // CHECK11-NEXT:    store double* [[TMP228]], double** [[TMP247]], align 4
9472 // CHECK11-NEXT:    [[TMP248:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS63]], i32 0, i32 3
9473 // CHECK11-NEXT:    store i8* null, i8** [[TMP248]], align 4
9474 // CHECK11-NEXT:    [[TMP249:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 0
9475 // CHECK11-NEXT:    [[TMP250:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 0
9476 // CHECK11-NEXT:    [[TMP251:%.*]] = load i32, i32* [[N]], align 4
9477 // CHECK11-NEXT:    store i32 [[TMP251]], i32* [[DOTCAPTURE_EXPR_65]], align 4
9478 // CHECK11-NEXT:    [[TMP252:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_65]], align 4
9479 // CHECK11-NEXT:    [[SUB67:%.*]] = sub nsw i32 [[TMP252]], 0
9480 // CHECK11-NEXT:    [[DIV68:%.*]] = sdiv i32 [[SUB67]], 1
9481 // CHECK11-NEXT:    [[SUB69:%.*]] = sub nsw i32 [[DIV68]], 1
9482 // CHECK11-NEXT:    store i32 [[SUB69]], i32* [[DOTCAPTURE_EXPR_66]], align 4
9483 // CHECK11-NEXT:    [[TMP253:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_66]], align 4
9484 // CHECK11-NEXT:    [[ADD70:%.*]] = add nsw i32 [[TMP253]], 1
9485 // CHECK11-NEXT:    [[TMP254:%.*]] = zext i32 [[ADD70]] to i64
9486 // CHECK11-NEXT:    [[KERNEL_ARGS71:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9487 // CHECK11-NEXT:    [[TMP255:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 0
9488 // CHECK11-NEXT:    store i32 1, i32* [[TMP255]], align 4
9489 // CHECK11-NEXT:    [[TMP256:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 1
9490 // CHECK11-NEXT:    store i32 4, i32* [[TMP256]], align 4
9491 // CHECK11-NEXT:    [[TMP257:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 2
9492 // CHECK11-NEXT:    store i8** [[TMP249]], i8*** [[TMP257]], align 4
9493 // CHECK11-NEXT:    [[TMP258:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 3
9494 // CHECK11-NEXT:    store i8** [[TMP250]], i8*** [[TMP258]], align 4
9495 // CHECK11-NEXT:    [[TMP259:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 4
9496 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.20, i32 0, i32 0), i64** [[TMP259]], align 4
9497 // CHECK11-NEXT:    [[TMP260:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 5
9498 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.21, i32 0, i32 0), i64** [[TMP260]], align 4
9499 // CHECK11-NEXT:    [[TMP261:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 6
9500 // CHECK11-NEXT:    store i8** null, i8*** [[TMP261]], align 4
9501 // CHECK11-NEXT:    [[TMP262:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 7
9502 // CHECK11-NEXT:    store i8** null, i8*** [[TMP262]], align 4
9503 // CHECK11-NEXT:    [[TMP263:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 8
9504 // CHECK11-NEXT:    store i64 [[TMP254]], i64* [[TMP263]], align 8
9505 // CHECK11-NEXT:    [[TMP264:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l536.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]])
9506 // CHECK11-NEXT:    [[TMP265:%.*]] = icmp ne i32 [[TMP264]], 0
9507 // CHECK11-NEXT:    br i1 [[TMP265]], label [[OMP_OFFLOAD_FAILED72:%.*]], label [[OMP_OFFLOAD_CONT73:%.*]]
9508 // CHECK11:       omp_offload.failed72:
9509 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l536(i32 [[TMP225]], double* [[TMP226]], double* [[TMP227]], double* [[TMP228]]) #[[ATTR2]]
9510 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT73]]
9511 // CHECK11:       omp_offload.cont73:
9512 // CHECK11-NEXT:    [[TMP266:%.*]] = load i32, i32* [[CH]], align 4
9513 // CHECK11-NEXT:    store i32 [[TMP266]], i32* [[CH_CASTED74]], align 4
9514 // CHECK11-NEXT:    [[TMP267:%.*]] = load i32, i32* [[CH_CASTED74]], align 4
9515 // CHECK11-NEXT:    [[TMP268:%.*]] = load i32, i32* [[N]], align 4
9516 // CHECK11-NEXT:    store i32 [[TMP268]], i32* [[N_CASTED75]], align 4
9517 // CHECK11-NEXT:    [[TMP269:%.*]] = load i32, i32* [[N_CASTED75]], align 4
9518 // CHECK11-NEXT:    [[TMP270:%.*]] = load double*, double** [[A]], align 4
9519 // CHECK11-NEXT:    [[TMP271:%.*]] = load double*, double** [[B]], align 4
9520 // CHECK11-NEXT:    [[TMP272:%.*]] = load double*, double** [[C]], align 4
9521 // CHECK11-NEXT:    [[TMP273:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 0
9522 // CHECK11-NEXT:    [[TMP274:%.*]] = bitcast i8** [[TMP273]] to i32*
9523 // CHECK11-NEXT:    store i32 [[TMP267]], i32* [[TMP274]], align 4
9524 // CHECK11-NEXT:    [[TMP275:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 0
9525 // CHECK11-NEXT:    [[TMP276:%.*]] = bitcast i8** [[TMP275]] to i32*
9526 // CHECK11-NEXT:    store i32 [[TMP267]], i32* [[TMP276]], align 4
9527 // CHECK11-NEXT:    [[TMP277:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 0
9528 // CHECK11-NEXT:    store i8* null, i8** [[TMP277]], align 4
9529 // CHECK11-NEXT:    [[TMP278:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 1
9530 // CHECK11-NEXT:    [[TMP279:%.*]] = bitcast i8** [[TMP278]] to i32*
9531 // CHECK11-NEXT:    store i32 [[TMP269]], i32* [[TMP279]], align 4
9532 // CHECK11-NEXT:    [[TMP280:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 1
9533 // CHECK11-NEXT:    [[TMP281:%.*]] = bitcast i8** [[TMP280]] to i32*
9534 // CHECK11-NEXT:    store i32 [[TMP269]], i32* [[TMP281]], align 4
9535 // CHECK11-NEXT:    [[TMP282:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 1
9536 // CHECK11-NEXT:    store i8* null, i8** [[TMP282]], align 4
9537 // CHECK11-NEXT:    [[TMP283:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 2
9538 // CHECK11-NEXT:    [[TMP284:%.*]] = bitcast i8** [[TMP283]] to double**
9539 // CHECK11-NEXT:    store double* [[TMP270]], double** [[TMP284]], align 4
9540 // CHECK11-NEXT:    [[TMP285:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 2
9541 // CHECK11-NEXT:    [[TMP286:%.*]] = bitcast i8** [[TMP285]] to double**
9542 // CHECK11-NEXT:    store double* [[TMP270]], double** [[TMP286]], align 4
9543 // CHECK11-NEXT:    [[TMP287:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 2
9544 // CHECK11-NEXT:    store i8* null, i8** [[TMP287]], align 4
9545 // CHECK11-NEXT:    [[TMP288:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 3
9546 // CHECK11-NEXT:    [[TMP289:%.*]] = bitcast i8** [[TMP288]] to double**
9547 // CHECK11-NEXT:    store double* [[TMP271]], double** [[TMP289]], align 4
9548 // CHECK11-NEXT:    [[TMP290:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 3
9549 // CHECK11-NEXT:    [[TMP291:%.*]] = bitcast i8** [[TMP290]] to double**
9550 // CHECK11-NEXT:    store double* [[TMP271]], double** [[TMP291]], align 4
9551 // CHECK11-NEXT:    [[TMP292:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 3
9552 // CHECK11-NEXT:    store i8* null, i8** [[TMP292]], align 4
9553 // CHECK11-NEXT:    [[TMP293:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 4
9554 // CHECK11-NEXT:    [[TMP294:%.*]] = bitcast i8** [[TMP293]] to double**
9555 // CHECK11-NEXT:    store double* [[TMP272]], double** [[TMP294]], align 4
9556 // CHECK11-NEXT:    [[TMP295:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 4
9557 // CHECK11-NEXT:    [[TMP296:%.*]] = bitcast i8** [[TMP295]] to double**
9558 // CHECK11-NEXT:    store double* [[TMP272]], double** [[TMP296]], align 4
9559 // CHECK11-NEXT:    [[TMP297:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 4
9560 // CHECK11-NEXT:    store i8* null, i8** [[TMP297]], align 4
9561 // CHECK11-NEXT:    [[TMP298:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 0
9562 // CHECK11-NEXT:    [[TMP299:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 0
9563 // CHECK11-NEXT:    [[TMP300:%.*]] = load i32, i32* [[N]], align 4
9564 // CHECK11-NEXT:    store i32 [[TMP300]], i32* [[DOTCAPTURE_EXPR_80]], align 4
9565 // CHECK11-NEXT:    [[TMP301:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_80]], align 4
9566 // CHECK11-NEXT:    [[SUB82:%.*]] = sub nsw i32 [[TMP301]], 0
9567 // CHECK11-NEXT:    [[DIV83:%.*]] = sdiv i32 [[SUB82]], 1
9568 // CHECK11-NEXT:    [[SUB84:%.*]] = sub nsw i32 [[DIV83]], 1
9569 // CHECK11-NEXT:    store i32 [[SUB84]], i32* [[DOTCAPTURE_EXPR_81]], align 4
9570 // CHECK11-NEXT:    [[TMP302:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_81]], align 4
9571 // CHECK11-NEXT:    [[ADD85:%.*]] = add nsw i32 [[TMP302]], 1
9572 // CHECK11-NEXT:    [[TMP303:%.*]] = zext i32 [[ADD85]] to i64
9573 // CHECK11-NEXT:    [[KERNEL_ARGS86:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9574 // CHECK11-NEXT:    [[TMP304:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 0
9575 // CHECK11-NEXT:    store i32 1, i32* [[TMP304]], align 4
9576 // CHECK11-NEXT:    [[TMP305:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 1
9577 // CHECK11-NEXT:    store i32 5, i32* [[TMP305]], align 4
9578 // CHECK11-NEXT:    [[TMP306:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 2
9579 // CHECK11-NEXT:    store i8** [[TMP298]], i8*** [[TMP306]], align 4
9580 // CHECK11-NEXT:    [[TMP307:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 3
9581 // CHECK11-NEXT:    store i8** [[TMP299]], i8*** [[TMP307]], align 4
9582 // CHECK11-NEXT:    [[TMP308:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 4
9583 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.24, i32 0, i32 0), i64** [[TMP308]], align 4
9584 // CHECK11-NEXT:    [[TMP309:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 5
9585 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.25, i32 0, i32 0), i64** [[TMP309]], align 4
9586 // CHECK11-NEXT:    [[TMP310:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 6
9587 // CHECK11-NEXT:    store i8** null, i8*** [[TMP310]], align 4
9588 // CHECK11-NEXT:    [[TMP311:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 7
9589 // CHECK11-NEXT:    store i8** null, i8*** [[TMP311]], align 4
9590 // CHECK11-NEXT:    [[TMP312:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 8
9591 // CHECK11-NEXT:    store i64 [[TMP303]], i64* [[TMP312]], align 8
9592 // CHECK11-NEXT:    [[TMP313:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l562.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]])
9593 // CHECK11-NEXT:    [[TMP314:%.*]] = icmp ne i32 [[TMP313]], 0
9594 // CHECK11-NEXT:    br i1 [[TMP314]], label [[OMP_OFFLOAD_FAILED87:%.*]], label [[OMP_OFFLOAD_CONT88:%.*]]
9595 // CHECK11:       omp_offload.failed87:
9596 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l562(i32 [[TMP267]], i32 [[TMP269]], double* [[TMP270]], double* [[TMP271]], double* [[TMP272]]) #[[ATTR2]]
9597 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT88]]
9598 // CHECK11:       omp_offload.cont88:
9599 // CHECK11-NEXT:    [[CALL:%.*]] = call noundef i32 @_Z5tmainIiET_v()
9600 // CHECK11-NEXT:    ret i32 [[CALL]]
9601 //
9602 //
9603 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l369
9604 // CHECK11-SAME: (i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1:[0-9]+]] {
9605 // CHECK11-NEXT:  entry:
9606 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
9607 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
9608 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
9609 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
9610 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
9611 // CHECK11-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
9612 // CHECK11-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
9613 // CHECK11-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
9614 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
9615 // CHECK11-NEXT:    ret void
9616 //
9617 //
9618 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined.
9619 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
9620 // CHECK11-NEXT:  entry:
9621 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
9622 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
9623 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
9624 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
9625 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
9626 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
9627 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9628 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9629 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
9630 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
9631 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
9632 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
9633 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
9634 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9635 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9636 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
9637 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
9638 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
9639 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
9640 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
9641 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
9642 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
9643 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
9644 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
9645 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
9646 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
9647 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
9648 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
9649 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9650 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
9651 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
9652 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
9653 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
9654 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
9655 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9656 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
9657 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
9658 // CHECK11:       omp.precond.then:
9659 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
9660 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9661 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
9662 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9663 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9664 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
9665 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
9666 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9667 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9668 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9669 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
9670 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9671 // CHECK11:       cond.true:
9672 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9673 // CHECK11-NEXT:    br label [[COND_END:%.*]]
9674 // CHECK11:       cond.false:
9675 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9676 // CHECK11-NEXT:    br label [[COND_END]]
9677 // CHECK11:       cond.end:
9678 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
9679 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
9680 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
9681 // CHECK11-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
9682 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9683 // CHECK11:       omp.inner.for.cond:
9684 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
9685 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9686 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
9687 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9688 // CHECK11:       omp.inner.for.body:
9689 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
9690 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9691 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
9692 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9693 // CHECK11:       omp.inner.for.inc:
9694 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
9695 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
9696 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
9697 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
9698 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
9699 // CHECK11:       omp.inner.for.end:
9700 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
9701 // CHECK11:       omp.loop.exit:
9702 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
9703 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
9704 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
9705 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
9706 // CHECK11:       omp.precond.end:
9707 // CHECK11-NEXT:    ret void
9708 //
9709 //
9710 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..1
9711 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
9712 // CHECK11-NEXT:  entry:
9713 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
9714 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
9715 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
9716 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
9717 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
9718 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
9719 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
9720 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
9721 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9722 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9723 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
9724 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
9725 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
9726 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
9727 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
9728 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9729 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9730 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
9731 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
9732 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
9733 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
9734 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
9735 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
9736 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
9737 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
9738 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
9739 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
9740 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
9741 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
9742 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
9743 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
9744 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
9745 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9746 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
9747 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
9748 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
9749 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
9750 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
9751 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9752 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
9753 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
9754 // CHECK11:       omp.precond.then:
9755 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
9756 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9757 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
9758 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
9759 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
9760 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
9761 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
9762 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9763 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9764 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
9765 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
9766 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9767 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9768 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9769 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
9770 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9771 // CHECK11:       cond.true:
9772 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9773 // CHECK11-NEXT:    br label [[COND_END:%.*]]
9774 // CHECK11:       cond.false:
9775 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9776 // CHECK11-NEXT:    br label [[COND_END]]
9777 // CHECK11:       cond.end:
9778 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
9779 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
9780 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
9781 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
9782 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9783 // CHECK11:       omp.inner.for.cond:
9784 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
9785 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9786 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
9787 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9788 // CHECK11:       omp.inner.for.body:
9789 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
9790 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
9791 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
9792 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
9793 // CHECK11-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 4
9794 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
9795 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i32 [[TMP21]]
9796 // CHECK11-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 4
9797 // CHECK11-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 4
9798 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
9799 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
9800 // CHECK11-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX6]], align 4
9801 // CHECK11-NEXT:    [[ADD7:%.*]] = fadd double [[TMP22]], [[TMP25]]
9802 // CHECK11-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 4
9803 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
9804 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
9805 // CHECK11-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4
9806 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
9807 // CHECK11:       omp.body.continue:
9808 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9809 // CHECK11:       omp.inner.for.inc:
9810 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
9811 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP28]], 1
9812 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
9813 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
9814 // CHECK11:       omp.inner.for.end:
9815 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
9816 // CHECK11:       omp.loop.exit:
9817 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
9818 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
9819 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
9820 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
9821 // CHECK11:       omp.precond.end:
9822 // CHECK11-NEXT:    ret void
9823 //
9824 //
9825 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l408
9826 // CHECK11-SAME: (i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
9827 // CHECK11-NEXT:  entry:
9828 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
9829 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
9830 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
9831 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
9832 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
9833 // CHECK11-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
9834 // CHECK11-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
9835 // CHECK11-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
9836 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
9837 // CHECK11-NEXT:    ret void
9838 //
9839 //
9840 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..2
9841 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
9842 // CHECK11-NEXT:  entry:
9843 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
9844 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
9845 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
9846 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
9847 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
9848 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
9849 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9850 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9851 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
9852 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
9853 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
9854 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
9855 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
9856 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9857 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9858 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
9859 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
9860 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
9861 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
9862 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
9863 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
9864 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
9865 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
9866 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
9867 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
9868 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
9869 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
9870 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
9871 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9872 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
9873 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
9874 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
9875 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
9876 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
9877 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9878 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
9879 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
9880 // CHECK11:       omp.precond.then:
9881 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
9882 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9883 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
9884 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9885 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9886 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
9887 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
9888 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9889 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9890 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9891 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
9892 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9893 // CHECK11:       cond.true:
9894 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9895 // CHECK11-NEXT:    br label [[COND_END:%.*]]
9896 // CHECK11:       cond.false:
9897 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9898 // CHECK11-NEXT:    br label [[COND_END]]
9899 // CHECK11:       cond.end:
9900 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
9901 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
9902 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
9903 // CHECK11-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
9904 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9905 // CHECK11:       omp.inner.for.cond:
9906 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
9907 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9908 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
9909 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9910 // CHECK11:       omp.inner.for.body:
9911 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
9912 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9913 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
9914 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9915 // CHECK11:       omp.inner.for.inc:
9916 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
9917 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
9918 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
9919 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
9920 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
9921 // CHECK11:       omp.inner.for.end:
9922 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
9923 // CHECK11:       omp.loop.exit:
9924 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
9925 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
9926 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
9927 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
9928 // CHECK11:       omp.precond.end:
9929 // CHECK11-NEXT:    ret void
9930 //
9931 //
9932 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..3
9933 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
9934 // CHECK11-NEXT:  entry:
9935 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
9936 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
9937 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
9938 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
9939 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
9940 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
9941 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
9942 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
9943 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9944 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9945 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
9946 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
9947 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
9948 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
9949 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
9950 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9951 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9952 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
9953 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
9954 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
9955 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
9956 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
9957 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
9958 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
9959 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
9960 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
9961 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
9962 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
9963 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
9964 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
9965 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
9966 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
9967 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9968 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
9969 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
9970 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
9971 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
9972 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
9973 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9974 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
9975 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
9976 // CHECK11:       omp.precond.then:
9977 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
9978 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9979 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
9980 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
9981 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
9982 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
9983 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
9984 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9985 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9986 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
9987 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
9988 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9989 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9990 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9991 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
9992 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9993 // CHECK11:       cond.true:
9994 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9995 // CHECK11-NEXT:    br label [[COND_END:%.*]]
9996 // CHECK11:       cond.false:
9997 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9998 // CHECK11-NEXT:    br label [[COND_END]]
9999 // CHECK11:       cond.end:
10000 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
10001 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
10002 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10003 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
10004 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10005 // CHECK11:       omp.inner.for.cond:
10006 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10007 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10008 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
10009 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10010 // CHECK11:       omp.inner.for.body:
10011 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10012 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
10013 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
10014 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
10015 // CHECK11-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 4
10016 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
10017 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i32 [[TMP21]]
10018 // CHECK11-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 4
10019 // CHECK11-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 4
10020 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
10021 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
10022 // CHECK11-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX6]], align 4
10023 // CHECK11-NEXT:    [[ADD7:%.*]] = fadd double [[TMP22]], [[TMP25]]
10024 // CHECK11-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 4
10025 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
10026 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
10027 // CHECK11-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4
10028 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
10029 // CHECK11:       omp.body.continue:
10030 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10031 // CHECK11:       omp.inner.for.inc:
10032 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10033 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP28]], 1
10034 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
10035 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
10036 // CHECK11:       omp.inner.for.end:
10037 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10038 // CHECK11:       omp.loop.exit:
10039 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10040 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
10041 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
10042 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
10043 // CHECK11:       omp.precond.end:
10044 // CHECK11-NEXT:    ret void
10045 //
10046 //
10047 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l447
10048 // CHECK11-SAME: (i32 noundef [[CH:%.*]], i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
10049 // CHECK11-NEXT:  entry:
10050 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32, align 4
10051 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
10052 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
10053 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
10054 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
10055 // CHECK11-NEXT:    store i32 [[CH]], i32* [[CH_ADDR]], align 4
10056 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
10057 // CHECK11-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
10058 // CHECK11-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
10059 // CHECK11-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
10060 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* [[CH_ADDR]], i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
10061 // CHECK11-NEXT:    ret void
10062 //
10063 //
10064 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..6
10065 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
10066 // CHECK11-NEXT:  entry:
10067 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
10068 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
10069 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 4
10070 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
10071 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
10072 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
10073 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
10074 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10075 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10076 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10077 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10078 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
10079 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
10080 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
10081 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10082 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10083 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
10084 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
10085 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
10086 // CHECK11-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 4
10087 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
10088 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
10089 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
10090 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
10091 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 4
10092 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 4
10093 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 4
10094 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 4
10095 // CHECK11-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 4
10096 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP1]], align 4
10097 // CHECK11-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
10098 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10099 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP6]], 0
10100 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10101 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
10102 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10103 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
10104 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10105 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP7]]
10106 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
10107 // CHECK11:       omp.precond.then:
10108 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
10109 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10110 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_COMB_UB]], align 4
10111 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10112 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10113 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP0]], align 4
10114 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10115 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
10116 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP9]])
10117 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10118 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10119 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
10120 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10121 // CHECK11:       cond.true:
10122 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10123 // CHECK11-NEXT:    br label [[COND_END:%.*]]
10124 // CHECK11:       cond.false:
10125 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10126 // CHECK11-NEXT:    br label [[COND_END]]
10127 // CHECK11:       cond.end:
10128 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
10129 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
10130 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10131 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
10132 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10133 // CHECK11:       omp.inner.for.cond:
10134 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10135 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10136 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], 1
10137 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp slt i32 [[TMP17]], [[ADD]]
10138 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10139 // CHECK11:       omp.inner.for.body:
10140 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10141 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10142 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32 [[TMP19]], i32 [[TMP20]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]])
10143 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10144 // CHECK11:       omp.inner.for.inc:
10145 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10146 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10147 // CHECK11-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
10148 // CHECK11-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
10149 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10150 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10151 // CHECK11-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
10152 // CHECK11-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_COMB_LB]], align 4
10153 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10154 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10155 // CHECK11-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
10156 // CHECK11-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_UB]], align 4
10157 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10158 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10159 // CHECK11-NEXT:    [[CMP9:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
10160 // CHECK11-NEXT:    br i1 [[CMP9]], label [[COND_TRUE10:%.*]], label [[COND_FALSE11:%.*]]
10161 // CHECK11:       cond.true10:
10162 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10163 // CHECK11-NEXT:    br label [[COND_END12:%.*]]
10164 // CHECK11:       cond.false11:
10165 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10166 // CHECK11-NEXT:    br label [[COND_END12]]
10167 // CHECK11:       cond.end12:
10168 // CHECK11-NEXT:    [[COND13:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE10]] ], [ [[TMP30]], [[COND_FALSE11]] ]
10169 // CHECK11-NEXT:    store i32 [[COND13]], i32* [[DOTOMP_COMB_UB]], align 4
10170 // CHECK11-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10171 // CHECK11-NEXT:    store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4
10172 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
10173 // CHECK11:       omp.inner.for.end:
10174 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10175 // CHECK11:       omp.loop.exit:
10176 // CHECK11-NEXT:    [[TMP32:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10177 // CHECK11-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
10178 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]])
10179 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
10180 // CHECK11:       omp.precond.end:
10181 // CHECK11-NEXT:    ret void
10182 //
10183 //
10184 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..7
10185 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
10186 // CHECK11-NEXT:  entry:
10187 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
10188 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
10189 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
10190 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
10191 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
10192 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
10193 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
10194 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
10195 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10196 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10197 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10198 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10199 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
10200 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
10201 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
10202 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10203 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10204 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
10205 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
10206 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
10207 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
10208 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10209 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
10210 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
10211 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
10212 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
10213 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
10214 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
10215 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
10216 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
10217 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
10218 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
10219 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10220 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
10221 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10222 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
10223 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10224 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
10225 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10226 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
10227 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
10228 // CHECK11:       omp.precond.then:
10229 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
10230 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10231 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
10232 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
10233 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10234 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
10235 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
10236 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10237 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10238 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10239 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
10240 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
10241 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10242 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10243 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
10244 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10245 // CHECK11:       cond.true:
10246 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10247 // CHECK11-NEXT:    br label [[COND_END:%.*]]
10248 // CHECK11:       cond.false:
10249 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10250 // CHECK11-NEXT:    br label [[COND_END]]
10251 // CHECK11:       cond.end:
10252 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
10253 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
10254 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10255 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
10256 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10257 // CHECK11:       omp.inner.for.cond:
10258 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10259 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10260 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
10261 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10262 // CHECK11:       omp.inner.for.body:
10263 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10264 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
10265 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
10266 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
10267 // CHECK11-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 4
10268 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
10269 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i32 [[TMP21]]
10270 // CHECK11-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 4
10271 // CHECK11-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 4
10272 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
10273 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
10274 // CHECK11-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX6]], align 4
10275 // CHECK11-NEXT:    [[ADD7:%.*]] = fadd double [[TMP22]], [[TMP25]]
10276 // CHECK11-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 4
10277 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
10278 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
10279 // CHECK11-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4
10280 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
10281 // CHECK11:       omp.body.continue:
10282 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10283 // CHECK11:       omp.inner.for.inc:
10284 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10285 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP28]], 1
10286 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
10287 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
10288 // CHECK11:       omp.inner.for.end:
10289 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10290 // CHECK11:       omp.loop.exit:
10291 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10292 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
10293 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
10294 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
10295 // CHECK11:       omp.precond.end:
10296 // CHECK11-NEXT:    ret void
10297 //
10298 //
10299 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l478
10300 // CHECK11-SAME: (i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
10301 // CHECK11-NEXT:  entry:
10302 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
10303 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
10304 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
10305 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
10306 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
10307 // CHECK11-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
10308 // CHECK11-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
10309 // CHECK11-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
10310 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..10 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
10311 // CHECK11-NEXT:    ret void
10312 //
10313 //
10314 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..10
10315 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
10316 // CHECK11-NEXT:  entry:
10317 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
10318 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
10319 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
10320 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
10321 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
10322 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
10323 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10324 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10325 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10326 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10327 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
10328 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
10329 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
10330 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10331 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10332 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
10333 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
10334 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
10335 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
10336 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
10337 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
10338 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
10339 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
10340 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
10341 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
10342 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
10343 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
10344 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
10345 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10346 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
10347 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10348 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
10349 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10350 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
10351 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10352 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
10353 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
10354 // CHECK11:       omp.precond.then:
10355 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
10356 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10357 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
10358 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10359 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10360 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10361 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
10362 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
10363 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10364 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10365 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
10366 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10367 // CHECK11:       cond.true:
10368 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10369 // CHECK11-NEXT:    br label [[COND_END:%.*]]
10370 // CHECK11:       cond.false:
10371 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10372 // CHECK11-NEXT:    br label [[COND_END]]
10373 // CHECK11:       cond.end:
10374 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
10375 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
10376 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10377 // CHECK11-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
10378 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10379 // CHECK11:       omp.inner.for.cond:
10380 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10381 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10382 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
10383 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10384 // CHECK11:       omp.inner.for.body:
10385 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10386 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10387 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
10388 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10389 // CHECK11:       omp.inner.for.inc:
10390 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10391 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10392 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
10393 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
10394 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
10395 // CHECK11:       omp.inner.for.end:
10396 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10397 // CHECK11:       omp.loop.exit:
10398 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10399 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
10400 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
10401 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
10402 // CHECK11:       omp.precond.end:
10403 // CHECK11-NEXT:    ret void
10404 //
10405 //
10406 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..11
10407 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
10408 // CHECK11-NEXT:  entry:
10409 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
10410 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
10411 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
10412 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
10413 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
10414 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
10415 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
10416 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
10417 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10418 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10419 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10420 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10421 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
10422 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
10423 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
10424 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10425 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10426 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
10427 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
10428 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
10429 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
10430 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10431 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
10432 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
10433 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
10434 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
10435 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
10436 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
10437 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
10438 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
10439 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
10440 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
10441 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10442 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
10443 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10444 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
10445 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10446 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
10447 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10448 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
10449 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
10450 // CHECK11:       omp.precond.then:
10451 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
10452 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10453 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
10454 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
10455 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10456 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
10457 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
10458 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10459 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10460 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10461 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
10462 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
10463 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10464 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10465 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
10466 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10467 // CHECK11:       cond.true:
10468 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10469 // CHECK11-NEXT:    br label [[COND_END:%.*]]
10470 // CHECK11:       cond.false:
10471 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10472 // CHECK11-NEXT:    br label [[COND_END]]
10473 // CHECK11:       cond.end:
10474 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
10475 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
10476 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10477 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
10478 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10479 // CHECK11:       omp.inner.for.cond:
10480 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10481 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10482 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
10483 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10484 // CHECK11:       omp.inner.for.body:
10485 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10486 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
10487 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
10488 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
10489 // CHECK11-NEXT:    [[TMP20:%.*]] = load double*, double** [[TMP2]], align 4
10490 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
10491 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP20]], i32 [[TMP21]]
10492 // CHECK11-NEXT:    [[TMP22:%.*]] = load double, double* [[ARRAYIDX]], align 4
10493 // CHECK11-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP3]], align 4
10494 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
10495 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
10496 // CHECK11-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX6]], align 4
10497 // CHECK11-NEXT:    [[ADD7:%.*]] = fadd double [[TMP22]], [[TMP25]]
10498 // CHECK11-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP1]], align 4
10499 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
10500 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
10501 // CHECK11-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4
10502 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
10503 // CHECK11:       omp.body.continue:
10504 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10505 // CHECK11:       omp.inner.for.inc:
10506 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10507 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP28]], 1
10508 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
10509 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
10510 // CHECK11:       omp.inner.for.end:
10511 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10512 // CHECK11:       omp.loop.exit:
10513 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10514 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
10515 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
10516 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
10517 // CHECK11:       omp.precond.end:
10518 // CHECK11-NEXT:    ret void
10519 //
10520 //
10521 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l506
10522 // CHECK11-SAME: (i32 noundef [[CH:%.*]], i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
10523 // CHECK11-NEXT:  entry:
10524 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32, align 4
10525 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
10526 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
10527 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
10528 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
10529 // CHECK11-NEXT:    store i32 [[CH]], i32* [[CH_ADDR]], align 4
10530 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
10531 // CHECK11-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
10532 // CHECK11-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
10533 // CHECK11-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
10534 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..14 to void (i32*, i32*, ...)*), i32* [[CH_ADDR]], i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
10535 // CHECK11-NEXT:    ret void
10536 //
10537 //
10538 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..14
10539 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
10540 // CHECK11-NEXT:  entry:
10541 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
10542 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
10543 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 4
10544 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
10545 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
10546 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
10547 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
10548 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10549 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10550 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10551 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10552 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
10553 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
10554 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
10555 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
10556 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10557 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10558 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
10559 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
10560 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
10561 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
10562 // CHECK11-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 4
10563 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
10564 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
10565 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
10566 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
10567 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 4
10568 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 4
10569 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 4
10570 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 4
10571 // CHECK11-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 4
10572 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
10573 // CHECK11-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
10574 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
10575 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10576 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10577 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
10578 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10579 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
10580 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
10581 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
10582 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10583 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
10584 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
10585 // CHECK11:       omp.precond.then:
10586 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
10587 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
10588 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
10589 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10590 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10591 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10592 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
10593 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
10594 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10595 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
10596 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
10597 // CHECK11-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10598 // CHECK11:       cond.true:
10599 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
10600 // CHECK11-NEXT:    br label [[COND_END:%.*]]
10601 // CHECK11:       cond.false:
10602 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10603 // CHECK11-NEXT:    br label [[COND_END]]
10604 // CHECK11:       cond.end:
10605 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
10606 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
10607 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10608 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
10609 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10610 // CHECK11:       omp.inner.for.cond:
10611 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10612 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10613 // CHECK11-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
10614 // CHECK11-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10615 // CHECK11:       omp.inner.for.body:
10616 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10617 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10618 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10619 // CHECK11-NEXT:    store i32 [[TMP21]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
10620 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
10621 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**, i32)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i32 [[TMP19]], i32 [[TMP20]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]], i32 [[TMP22]])
10622 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10623 // CHECK11:       omp.inner.for.inc:
10624 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10625 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10626 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
10627 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
10628 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
10629 // CHECK11:       omp.inner.for.end:
10630 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10631 // CHECK11:       omp.loop.exit:
10632 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10633 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
10634 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP26]])
10635 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
10636 // CHECK11:       omp.precond.end:
10637 // CHECK11-NEXT:    ret void
10638 //
10639 //
10640 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..15
10641 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
10642 // CHECK11-NEXT:  entry:
10643 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
10644 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
10645 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
10646 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
10647 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
10648 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
10649 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
10650 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
10651 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
10652 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10653 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10654 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10655 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
10656 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
10657 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
10658 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
10659 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10660 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10661 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
10662 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
10663 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
10664 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
10665 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10666 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
10667 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
10668 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
10669 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
10670 // CHECK11-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
10671 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
10672 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
10673 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
10674 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
10675 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
10676 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10677 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10678 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
10679 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10680 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
10681 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
10682 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
10683 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10684 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
10685 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
10686 // CHECK11:       omp.precond.then:
10687 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
10688 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
10689 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
10690 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
10691 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10692 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
10693 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
10694 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10695 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10696 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
10697 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10698 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
10699 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP12]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP10]])
10700 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
10701 // CHECK11:       omp.dispatch.cond:
10702 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10703 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10704 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP13]], [[TMP14]]
10705 // CHECK11-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10706 // CHECK11:       cond.true:
10707 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10708 // CHECK11-NEXT:    br label [[COND_END:%.*]]
10709 // CHECK11:       cond.false:
10710 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10711 // CHECK11-NEXT:    br label [[COND_END]]
10712 // CHECK11:       cond.end:
10713 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP15]], [[COND_TRUE]] ], [ [[TMP16]], [[COND_FALSE]] ]
10714 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
10715 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10716 // CHECK11-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
10717 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10718 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10719 // CHECK11-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
10720 // CHECK11-NEXT:    br i1 [[CMP6]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
10721 // CHECK11:       omp.dispatch.body:
10722 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10723 // CHECK11:       omp.inner.for.cond:
10724 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10725 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10726 // CHECK11-NEXT:    [[CMP7:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]
10727 // CHECK11-NEXT:    br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10728 // CHECK11:       omp.inner.for.body:
10729 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10730 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP22]], 1
10731 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
10732 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
10733 // CHECK11-NEXT:    [[TMP23:%.*]] = load double*, double** [[TMP2]], align 4
10734 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
10735 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP23]], i32 [[TMP24]]
10736 // CHECK11-NEXT:    [[TMP25:%.*]] = load double, double* [[ARRAYIDX]], align 4
10737 // CHECK11-NEXT:    [[TMP26:%.*]] = load double*, double** [[TMP3]], align 4
10738 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
10739 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP26]], i32 [[TMP27]]
10740 // CHECK11-NEXT:    [[TMP28:%.*]] = load double, double* [[ARRAYIDX8]], align 4
10741 // CHECK11-NEXT:    [[ADD9:%.*]] = fadd double [[TMP25]], [[TMP28]]
10742 // CHECK11-NEXT:    [[TMP29:%.*]] = load double*, double** [[TMP1]], align 4
10743 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[I4]], align 4
10744 // CHECK11-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds double, double* [[TMP29]], i32 [[TMP30]]
10745 // CHECK11-NEXT:    store double [[ADD9]], double* [[ARRAYIDX10]], align 4
10746 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
10747 // CHECK11:       omp.body.continue:
10748 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10749 // CHECK11:       omp.inner.for.inc:
10750 // CHECK11-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10751 // CHECK11-NEXT:    [[ADD11:%.*]] = add nsw i32 [[TMP31]], 1
10752 // CHECK11-NEXT:    store i32 [[ADD11]], i32* [[DOTOMP_IV]], align 4
10753 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
10754 // CHECK11:       omp.inner.for.end:
10755 // CHECK11-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
10756 // CHECK11:       omp.dispatch.inc:
10757 // CHECK11-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10758 // CHECK11-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10759 // CHECK11-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP32]], [[TMP33]]
10760 // CHECK11-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_LB]], align 4
10761 // CHECK11-NEXT:    [[TMP34:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10762 // CHECK11-NEXT:    [[TMP35:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10763 // CHECK11-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP34]], [[TMP35]]
10764 // CHECK11-NEXT:    store i32 [[ADD13]], i32* [[DOTOMP_UB]], align 4
10765 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND]]
10766 // CHECK11:       omp.dispatch.end:
10767 // CHECK11-NEXT:    [[TMP36:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10768 // CHECK11-NEXT:    [[TMP37:%.*]] = load i32, i32* [[TMP36]], align 4
10769 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP37]])
10770 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
10771 // CHECK11:       omp.precond.end:
10772 // CHECK11-NEXT:    ret void
10773 //
10774 //
10775 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l536
10776 // CHECK11-SAME: (i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
10777 // CHECK11-NEXT:  entry:
10778 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
10779 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
10780 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
10781 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
10782 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
10783 // CHECK11-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
10784 // CHECK11-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
10785 // CHECK11-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
10786 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..18 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
10787 // CHECK11-NEXT:    ret void
10788 //
10789 //
10790 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..18
10791 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
10792 // CHECK11-NEXT:  entry:
10793 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
10794 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
10795 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
10796 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
10797 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
10798 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
10799 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10800 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10801 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10802 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10803 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
10804 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
10805 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
10806 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10807 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10808 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
10809 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
10810 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
10811 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
10812 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
10813 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
10814 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
10815 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
10816 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
10817 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
10818 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
10819 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
10820 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
10821 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10822 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
10823 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10824 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
10825 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10826 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
10827 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10828 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
10829 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
10830 // CHECK11:       omp.precond.then:
10831 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
10832 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10833 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
10834 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10835 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10836 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10837 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
10838 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
10839 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10840 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10841 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
10842 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10843 // CHECK11:       cond.true:
10844 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10845 // CHECK11-NEXT:    br label [[COND_END:%.*]]
10846 // CHECK11:       cond.false:
10847 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10848 // CHECK11-NEXT:    br label [[COND_END]]
10849 // CHECK11:       cond.end:
10850 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
10851 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
10852 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10853 // CHECK11-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
10854 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10855 // CHECK11:       omp.inner.for.cond:
10856 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10857 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10858 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
10859 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10860 // CHECK11:       omp.inner.for.body:
10861 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10862 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10863 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], double** [[TMP1]], double** [[TMP2]], double** [[TMP3]])
10864 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10865 // CHECK11:       omp.inner.for.inc:
10866 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10867 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10868 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
10869 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
10870 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
10871 // CHECK11:       omp.inner.for.end:
10872 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10873 // CHECK11:       omp.loop.exit:
10874 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10875 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
10876 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
10877 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
10878 // CHECK11:       omp.precond.end:
10879 // CHECK11-NEXT:    ret void
10880 //
10881 //
10882 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..19
10883 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
10884 // CHECK11-NEXT:  entry:
10885 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
10886 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
10887 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
10888 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
10889 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
10890 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
10891 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
10892 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
10893 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10894 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10895 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10896 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10897 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
10898 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
10899 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
10900 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10901 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10902 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
10903 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
10904 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
10905 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
10906 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10907 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
10908 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
10909 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
10910 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
10911 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
10912 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
10913 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
10914 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
10915 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
10916 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
10917 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10918 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
10919 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10920 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
10921 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10922 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
10923 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10924 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
10925 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
10926 // CHECK11:       omp.precond.then:
10927 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
10928 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10929 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
10930 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
10931 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
10932 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
10933 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
10934 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10935 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10936 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10937 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10938 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10939 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
10940 // CHECK11-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 35, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 1)
10941 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
10942 // CHECK11:       omp.dispatch.cond:
10943 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
10944 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
10945 // CHECK11-NEXT:    [[TMP16:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP15]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
10946 // CHECK11-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
10947 // CHECK11-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
10948 // CHECK11:       omp.dispatch.body:
10949 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10950 // CHECK11-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
10951 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10952 // CHECK11:       omp.inner.for.cond:
10953 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
10954 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !20
10955 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
10956 // CHECK11-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10957 // CHECK11:       omp.inner.for.body:
10958 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
10959 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
10960 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
10961 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !20
10962 // CHECK11-NEXT:    [[TMP21:%.*]] = load double*, double** [[TMP2]], align 4, !llvm.access.group !20
10963 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !20
10964 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP21]], i32 [[TMP22]]
10965 // CHECK11-NEXT:    [[TMP23:%.*]] = load double, double* [[ARRAYIDX]], align 4, !llvm.access.group !20
10966 // CHECK11-NEXT:    [[TMP24:%.*]] = load double*, double** [[TMP3]], align 4, !llvm.access.group !20
10967 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !20
10968 // CHECK11-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr inbounds double, double* [[TMP24]], i32 [[TMP25]]
10969 // CHECK11-NEXT:    [[TMP26:%.*]] = load double, double* [[ARRAYIDX5]], align 4, !llvm.access.group !20
10970 // CHECK11-NEXT:    [[ADD6:%.*]] = fadd double [[TMP23]], [[TMP26]]
10971 // CHECK11-NEXT:    [[TMP27:%.*]] = load double*, double** [[TMP1]], align 4, !llvm.access.group !20
10972 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !20
10973 // CHECK11-NEXT:    [[ARRAYIDX7:%.*]] = getelementptr inbounds double, double* [[TMP27]], i32 [[TMP28]]
10974 // CHECK11-NEXT:    store double [[ADD6]], double* [[ARRAYIDX7]], align 4, !llvm.access.group !20
10975 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
10976 // CHECK11:       omp.body.continue:
10977 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10978 // CHECK11:       omp.inner.for.inc:
10979 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
10980 // CHECK11-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP29]], 1
10981 // CHECK11-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
10982 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP21:![0-9]+]]
10983 // CHECK11:       omp.inner.for.end:
10984 // CHECK11-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
10985 // CHECK11:       omp.dispatch.inc:
10986 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND]]
10987 // CHECK11:       omp.dispatch.end:
10988 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
10989 // CHECK11:       omp.precond.end:
10990 // CHECK11-NEXT:    ret void
10991 //
10992 //
10993 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l562
10994 // CHECK11-SAME: (i32 noundef [[CH:%.*]], i32 noundef [[N:%.*]], double* noundef [[A:%.*]], double* noundef [[B:%.*]], double* noundef [[C:%.*]]) #[[ATTR1]] {
10995 // CHECK11-NEXT:  entry:
10996 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32, align 4
10997 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
10998 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double*, align 4
10999 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double*, align 4
11000 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double*, align 4
11001 // CHECK11-NEXT:    store i32 [[CH]], i32* [[CH_ADDR]], align 4
11002 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
11003 // CHECK11-NEXT:    store double* [[A]], double** [[A_ADDR]], align 4
11004 // CHECK11-NEXT:    store double* [[B]], double** [[B_ADDR]], align 4
11005 // CHECK11-NEXT:    store double* [[C]], double** [[C_ADDR]], align 4
11006 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, double**, double**, double**)* @.omp_outlined..22 to void (i32*, i32*, ...)*), i32* [[CH_ADDR]], i32* [[N_ADDR]], double** [[A_ADDR]], double** [[B_ADDR]], double** [[C_ADDR]])
11007 // CHECK11-NEXT:    ret void
11008 //
11009 //
11010 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..22
11011 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
11012 // CHECK11-NEXT:  entry:
11013 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11014 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11015 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 4
11016 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11017 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
11018 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
11019 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
11020 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11021 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11022 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11023 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11024 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
11025 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
11026 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
11027 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
11028 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11029 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11030 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
11031 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
11032 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11033 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11034 // CHECK11-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 4
11035 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11036 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
11037 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
11038 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
11039 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 4
11040 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11041 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[A_ADDR]], align 4
11042 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[B_ADDR]], align 4
11043 // CHECK11-NEXT:    [[TMP4:%.*]] = load double**, double*** [[C_ADDR]], align 4
11044 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
11045 // CHECK11-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
11046 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
11047 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11048 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11049 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
11050 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11051 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
11052 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
11053 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
11054 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11055 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
11056 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11057 // CHECK11:       omp.precond.then:
11058 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
11059 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11060 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
11061 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11062 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11063 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11064 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
11065 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
11066 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11067 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11068 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
11069 // CHECK11-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11070 // CHECK11:       cond.true:
11071 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11072 // CHECK11-NEXT:    br label [[COND_END:%.*]]
11073 // CHECK11:       cond.false:
11074 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11075 // CHECK11-NEXT:    br label [[COND_END]]
11076 // CHECK11:       cond.end:
11077 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
11078 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
11079 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
11080 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
11081 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11082 // CHECK11:       omp.inner.for.cond:
11083 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
11084 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11085 // CHECK11-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
11086 // CHECK11-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11087 // CHECK11:       omp.inner.for.body:
11088 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
11089 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11090 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11091 // CHECK11-NEXT:    store i32 [[TMP21]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
11092 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
11093 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, double**, double**, double**, i32)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i32 [[TMP19]], i32 [[TMP20]], i32* [[TMP1]], double** [[TMP2]], double** [[TMP3]], double** [[TMP4]], i32 [[TMP22]])
11094 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11095 // CHECK11:       omp.inner.for.inc:
11096 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
11097 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
11098 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
11099 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
11100 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
11101 // CHECK11:       omp.inner.for.end:
11102 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
11103 // CHECK11:       omp.loop.exit:
11104 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11105 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
11106 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP26]])
11107 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
11108 // CHECK11:       omp.precond.end:
11109 // CHECK11-NEXT:    ret void
11110 //
11111 //
11112 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..23
11113 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], double** noundef nonnull align 4 dereferenceable(4) [[C:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
11114 // CHECK11-NEXT:  entry:
11115 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11116 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11117 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
11118 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
11119 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11120 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca double**, align 4
11121 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca double**, align 4
11122 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca double**, align 4
11123 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
11124 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11125 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11126 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11127 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
11128 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
11129 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
11130 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
11131 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11132 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11133 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
11134 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11135 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11136 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11137 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11138 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11139 // CHECK11-NEXT:    store double** [[A]], double*** [[A_ADDR]], align 4
11140 // CHECK11-NEXT:    store double** [[B]], double*** [[B_ADDR]], align 4
11141 // CHECK11-NEXT:    store double** [[C]], double*** [[C_ADDR]], align 4
11142 // CHECK11-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
11143 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11144 // CHECK11-NEXT:    [[TMP1:%.*]] = load double**, double*** [[A_ADDR]], align 4
11145 // CHECK11-NEXT:    [[TMP2:%.*]] = load double**, double*** [[B_ADDR]], align 4
11146 // CHECK11-NEXT:    [[TMP3:%.*]] = load double**, double*** [[C_ADDR]], align 4
11147 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
11148 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11149 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11150 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
11151 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11152 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
11153 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
11154 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
11155 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11156 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
11157 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11158 // CHECK11:       omp.precond.then:
11159 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
11160 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11161 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
11162 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11163 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11164 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
11165 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
11166 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11167 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11168 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
11169 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
11170 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
11171 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11172 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
11173 // CHECK11-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32 35, i32 [[TMP11]], i32 [[TMP12]], i32 1, i32 [[TMP10]])
11174 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
11175 // CHECK11:       omp.dispatch.cond:
11176 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11177 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
11178 // CHECK11-NEXT:    [[TMP17:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP16]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
11179 // CHECK11-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP17]], 0
11180 // CHECK11-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
11181 // CHECK11:       omp.dispatch.body:
11182 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
11183 // CHECK11-NEXT:    store i32 [[TMP18]], i32* [[DOTOMP_IV]], align 4
11184 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11185 // CHECK11:       omp.inner.for.cond:
11186 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
11187 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !23
11188 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP19]], [[TMP20]]
11189 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11190 // CHECK11:       omp.inner.for.body:
11191 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
11192 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP21]], 1
11193 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
11194 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !23
11195 // CHECK11-NEXT:    [[TMP22:%.*]] = load double*, double** [[TMP2]], align 4, !llvm.access.group !23
11196 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !23
11197 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP22]], i32 [[TMP23]]
11198 // CHECK11-NEXT:    [[TMP24:%.*]] = load double, double* [[ARRAYIDX]], align 4, !llvm.access.group !23
11199 // CHECK11-NEXT:    [[TMP25:%.*]] = load double*, double** [[TMP3]], align 4, !llvm.access.group !23
11200 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !23
11201 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds double, double* [[TMP25]], i32 [[TMP26]]
11202 // CHECK11-NEXT:    [[TMP27:%.*]] = load double, double* [[ARRAYIDX6]], align 4, !llvm.access.group !23
11203 // CHECK11-NEXT:    [[ADD7:%.*]] = fadd double [[TMP24]], [[TMP27]]
11204 // CHECK11-NEXT:    [[TMP28:%.*]] = load double*, double** [[TMP1]], align 4, !llvm.access.group !23
11205 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !23
11206 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[TMP28]], i32 [[TMP29]]
11207 // CHECK11-NEXT:    store double [[ADD7]], double* [[ARRAYIDX8]], align 4, !llvm.access.group !23
11208 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
11209 // CHECK11:       omp.body.continue:
11210 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11211 // CHECK11:       omp.inner.for.inc:
11212 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
11213 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP30]], 1
11214 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
11215 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP24:![0-9]+]]
11216 // CHECK11:       omp.inner.for.end:
11217 // CHECK11-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
11218 // CHECK11:       omp.dispatch.inc:
11219 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND]]
11220 // CHECK11:       omp.dispatch.end:
11221 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
11222 // CHECK11:       omp.precond.end:
11223 // CHECK11-NEXT:    ret void
11224 //
11225 //
11226 // CHECK11-LABEL: define {{[^@]+}}@_Z5tmainIiET_v
11227 // CHECK11-SAME: () #[[ATTR3:[0-9]+]] comdat {
11228 // CHECK11-NEXT:  entry:
11229 // CHECK11-NEXT:    [[A:%.*]] = alloca i32*, align 4
11230 // CHECK11-NEXT:    [[B:%.*]] = alloca i32*, align 4
11231 // CHECK11-NEXT:    [[C:%.*]] = alloca i32*, align 4
11232 // CHECK11-NEXT:    [[N:%.*]] = alloca i32, align 4
11233 // CHECK11-NEXT:    [[CH:%.*]] = alloca i32, align 4
11234 // CHECK11-NEXT:    [[N_CASTED:%.*]] = alloca i32, align 4
11235 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x i8*], align 4
11236 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x i8*], align 4
11237 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x i8*], align 4
11238 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11239 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11240 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11241 // CHECK11-NEXT:    [[N_CASTED3:%.*]] = alloca i32, align 4
11242 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [4 x i8*], align 4
11243 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS5:%.*]] = alloca [4 x i8*], align 4
11244 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [4 x i8*], align 4
11245 // CHECK11-NEXT:    [[_TMP7:%.*]] = alloca i32, align 4
11246 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_8:%.*]] = alloca i32, align 4
11247 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4
11248 // CHECK11-NEXT:    [[CH_CASTED:%.*]] = alloca i32, align 4
11249 // CHECK11-NEXT:    [[N_CASTED17:%.*]] = alloca i32, align 4
11250 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS18:%.*]] = alloca [5 x i8*], align 4
11251 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS19:%.*]] = alloca [5 x i8*], align 4
11252 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS20:%.*]] = alloca [5 x i8*], align 4
11253 // CHECK11-NEXT:    [[_TMP21:%.*]] = alloca i32, align 4
11254 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_22:%.*]] = alloca i32, align 4
11255 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_23:%.*]] = alloca i32, align 4
11256 // CHECK11-NEXT:    [[N_CASTED31:%.*]] = alloca i32, align 4
11257 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS32:%.*]] = alloca [4 x i8*], align 4
11258 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS33:%.*]] = alloca [4 x i8*], align 4
11259 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS34:%.*]] = alloca [4 x i8*], align 4
11260 // CHECK11-NEXT:    [[_TMP35:%.*]] = alloca i32, align 4
11261 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_36:%.*]] = alloca i32, align 4
11262 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_37:%.*]] = alloca i32, align 4
11263 // CHECK11-NEXT:    [[CH_CASTED45:%.*]] = alloca i32, align 4
11264 // CHECK11-NEXT:    [[N_CASTED46:%.*]] = alloca i32, align 4
11265 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS47:%.*]] = alloca [5 x i8*], align 4
11266 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS48:%.*]] = alloca [5 x i8*], align 4
11267 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS49:%.*]] = alloca [5 x i8*], align 4
11268 // CHECK11-NEXT:    [[_TMP50:%.*]] = alloca i32, align 4
11269 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_51:%.*]] = alloca i32, align 4
11270 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_52:%.*]] = alloca i32, align 4
11271 // CHECK11-NEXT:    [[N_CASTED60:%.*]] = alloca i32, align 4
11272 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS61:%.*]] = alloca [4 x i8*], align 4
11273 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS62:%.*]] = alloca [4 x i8*], align 4
11274 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS63:%.*]] = alloca [4 x i8*], align 4
11275 // CHECK11-NEXT:    [[_TMP64:%.*]] = alloca i32, align 4
11276 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_65:%.*]] = alloca i32, align 4
11277 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_66:%.*]] = alloca i32, align 4
11278 // CHECK11-NEXT:    [[CH_CASTED74:%.*]] = alloca i32, align 4
11279 // CHECK11-NEXT:    [[N_CASTED75:%.*]] = alloca i32, align 4
11280 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS76:%.*]] = alloca [5 x i8*], align 4
11281 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS77:%.*]] = alloca [5 x i8*], align 4
11282 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS78:%.*]] = alloca [5 x i8*], align 4
11283 // CHECK11-NEXT:    [[_TMP79:%.*]] = alloca i32, align 4
11284 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_80:%.*]] = alloca i32, align 4
11285 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_81:%.*]] = alloca i32, align 4
11286 // CHECK11-NEXT:    store i32 10000, i32* [[N]], align 4
11287 // CHECK11-NEXT:    store i32 100, i32* [[CH]], align 4
11288 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
11289 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[N_CASTED]], align 4
11290 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[N_CASTED]], align 4
11291 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A]], align 4
11292 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[B]], align 4
11293 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32*, i32** [[C]], align 4
11294 // CHECK11-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
11295 // CHECK11-NEXT:    [[TMP6:%.*]] = bitcast i8** [[TMP5]] to i32*
11296 // CHECK11-NEXT:    store i32 [[TMP1]], i32* [[TMP6]], align 4
11297 // CHECK11-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
11298 // CHECK11-NEXT:    [[TMP8:%.*]] = bitcast i8** [[TMP7]] to i32*
11299 // CHECK11-NEXT:    store i32 [[TMP1]], i32* [[TMP8]], align 4
11300 // CHECK11-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
11301 // CHECK11-NEXT:    store i8* null, i8** [[TMP9]], align 4
11302 // CHECK11-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
11303 // CHECK11-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
11304 // CHECK11-NEXT:    store i32* [[TMP2]], i32** [[TMP11]], align 4
11305 // CHECK11-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
11306 // CHECK11-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i32**
11307 // CHECK11-NEXT:    store i32* [[TMP2]], i32** [[TMP13]], align 4
11308 // CHECK11-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
11309 // CHECK11-NEXT:    store i8* null, i8** [[TMP14]], align 4
11310 // CHECK11-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
11311 // CHECK11-NEXT:    [[TMP16:%.*]] = bitcast i8** [[TMP15]] to i32**
11312 // CHECK11-NEXT:    store i32* [[TMP3]], i32** [[TMP16]], align 4
11313 // CHECK11-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
11314 // CHECK11-NEXT:    [[TMP18:%.*]] = bitcast i8** [[TMP17]] to i32**
11315 // CHECK11-NEXT:    store i32* [[TMP3]], i32** [[TMP18]], align 4
11316 // CHECK11-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
11317 // CHECK11-NEXT:    store i8* null, i8** [[TMP19]], align 4
11318 // CHECK11-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
11319 // CHECK11-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32**
11320 // CHECK11-NEXT:    store i32* [[TMP4]], i32** [[TMP21]], align 4
11321 // CHECK11-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
11322 // CHECK11-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to i32**
11323 // CHECK11-NEXT:    store i32* [[TMP4]], i32** [[TMP23]], align 4
11324 // CHECK11-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 3
11325 // CHECK11-NEXT:    store i8* null, i8** [[TMP24]], align 4
11326 // CHECK11-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
11327 // CHECK11-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
11328 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[N]], align 4
11329 // CHECK11-NEXT:    store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4
11330 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11331 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0
11332 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11333 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
11334 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11335 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11336 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP29]], 1
11337 // CHECK11-NEXT:    [[TMP30:%.*]] = zext i32 [[ADD]] to i64
11338 // CHECK11-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
11339 // CHECK11-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
11340 // CHECK11-NEXT:    store i32 1, i32* [[TMP31]], align 4
11341 // CHECK11-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
11342 // CHECK11-NEXT:    store i32 4, i32* [[TMP32]], align 4
11343 // CHECK11-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
11344 // CHECK11-NEXT:    store i8** [[TMP25]], i8*** [[TMP33]], align 4
11345 // CHECK11-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
11346 // CHECK11-NEXT:    store i8** [[TMP26]], i8*** [[TMP34]], align 4
11347 // CHECK11-NEXT:    [[TMP35:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
11348 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.28, i32 0, i32 0), i64** [[TMP35]], align 4
11349 // CHECK11-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
11350 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.29, i32 0, i32 0), i64** [[TMP36]], align 4
11351 // CHECK11-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
11352 // CHECK11-NEXT:    store i8** null, i8*** [[TMP37]], align 4
11353 // CHECK11-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
11354 // CHECK11-NEXT:    store i8** null, i8*** [[TMP38]], align 4
11355 // CHECK11-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
11356 // CHECK11-NEXT:    store i64 [[TMP30]], i64* [[TMP39]], align 8
11357 // CHECK11-NEXT:    [[TMP40:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l42.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
11358 // CHECK11-NEXT:    [[TMP41:%.*]] = icmp ne i32 [[TMP40]], 0
11359 // CHECK11-NEXT:    br i1 [[TMP41]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
11360 // CHECK11:       omp_offload.failed:
11361 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l42(i32 [[TMP1]], i32* [[TMP2]], i32* [[TMP3]], i32* [[TMP4]]) #[[ATTR2]]
11362 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT]]
11363 // CHECK11:       omp_offload.cont:
11364 // CHECK11-NEXT:    [[TMP42:%.*]] = load i32, i32* [[N]], align 4
11365 // CHECK11-NEXT:    store i32 [[TMP42]], i32* [[N_CASTED3]], align 4
11366 // CHECK11-NEXT:    [[TMP43:%.*]] = load i32, i32* [[N_CASTED3]], align 4
11367 // CHECK11-NEXT:    [[TMP44:%.*]] = load i32*, i32** [[A]], align 4
11368 // CHECK11-NEXT:    [[TMP45:%.*]] = load i32*, i32** [[B]], align 4
11369 // CHECK11-NEXT:    [[TMP46:%.*]] = load i32*, i32** [[C]], align 4
11370 // CHECK11-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
11371 // CHECK11-NEXT:    [[TMP48:%.*]] = bitcast i8** [[TMP47]] to i32*
11372 // CHECK11-NEXT:    store i32 [[TMP43]], i32* [[TMP48]], align 4
11373 // CHECK11-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
11374 // CHECK11-NEXT:    [[TMP50:%.*]] = bitcast i8** [[TMP49]] to i32*
11375 // CHECK11-NEXT:    store i32 [[TMP43]], i32* [[TMP50]], align 4
11376 // CHECK11-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 0
11377 // CHECK11-NEXT:    store i8* null, i8** [[TMP51]], align 4
11378 // CHECK11-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 1
11379 // CHECK11-NEXT:    [[TMP53:%.*]] = bitcast i8** [[TMP52]] to i32**
11380 // CHECK11-NEXT:    store i32* [[TMP44]], i32** [[TMP53]], align 4
11381 // CHECK11-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 1
11382 // CHECK11-NEXT:    [[TMP55:%.*]] = bitcast i8** [[TMP54]] to i32**
11383 // CHECK11-NEXT:    store i32* [[TMP44]], i32** [[TMP55]], align 4
11384 // CHECK11-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 1
11385 // CHECK11-NEXT:    store i8* null, i8** [[TMP56]], align 4
11386 // CHECK11-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 2
11387 // CHECK11-NEXT:    [[TMP58:%.*]] = bitcast i8** [[TMP57]] to i32**
11388 // CHECK11-NEXT:    store i32* [[TMP45]], i32** [[TMP58]], align 4
11389 // CHECK11-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 2
11390 // CHECK11-NEXT:    [[TMP60:%.*]] = bitcast i8** [[TMP59]] to i32**
11391 // CHECK11-NEXT:    store i32* [[TMP45]], i32** [[TMP60]], align 4
11392 // CHECK11-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 2
11393 // CHECK11-NEXT:    store i8* null, i8** [[TMP61]], align 4
11394 // CHECK11-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 3
11395 // CHECK11-NEXT:    [[TMP63:%.*]] = bitcast i8** [[TMP62]] to i32**
11396 // CHECK11-NEXT:    store i32* [[TMP46]], i32** [[TMP63]], align 4
11397 // CHECK11-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 3
11398 // CHECK11-NEXT:    [[TMP65:%.*]] = bitcast i8** [[TMP64]] to i32**
11399 // CHECK11-NEXT:    store i32* [[TMP46]], i32** [[TMP65]], align 4
11400 // CHECK11-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 3
11401 // CHECK11-NEXT:    store i8* null, i8** [[TMP66]], align 4
11402 // CHECK11-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
11403 // CHECK11-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
11404 // CHECK11-NEXT:    [[TMP69:%.*]] = load i32, i32* [[N]], align 4
11405 // CHECK11-NEXT:    store i32 [[TMP69]], i32* [[DOTCAPTURE_EXPR_8]], align 4
11406 // CHECK11-NEXT:    [[TMP70:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_8]], align 4
11407 // CHECK11-NEXT:    [[SUB10:%.*]] = sub nsw i32 [[TMP70]], 0
11408 // CHECK11-NEXT:    [[DIV11:%.*]] = sdiv i32 [[SUB10]], 1
11409 // CHECK11-NEXT:    [[SUB12:%.*]] = sub nsw i32 [[DIV11]], 1
11410 // CHECK11-NEXT:    store i32 [[SUB12]], i32* [[DOTCAPTURE_EXPR_9]], align 4
11411 // CHECK11-NEXT:    [[TMP71:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_9]], align 4
11412 // CHECK11-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP71]], 1
11413 // CHECK11-NEXT:    [[TMP72:%.*]] = zext i32 [[ADD13]] to i64
11414 // CHECK11-NEXT:    [[KERNEL_ARGS14:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
11415 // CHECK11-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 0
11416 // CHECK11-NEXT:    store i32 1, i32* [[TMP73]], align 4
11417 // CHECK11-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 1
11418 // CHECK11-NEXT:    store i32 4, i32* [[TMP74]], align 4
11419 // CHECK11-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 2
11420 // CHECK11-NEXT:    store i8** [[TMP67]], i8*** [[TMP75]], align 4
11421 // CHECK11-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 3
11422 // CHECK11-NEXT:    store i8** [[TMP68]], i8*** [[TMP76]], align 4
11423 // CHECK11-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 4
11424 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.32, i32 0, i32 0), i64** [[TMP77]], align 4
11425 // CHECK11-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 5
11426 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.33, i32 0, i32 0), i64** [[TMP78]], align 4
11427 // CHECK11-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 6
11428 // CHECK11-NEXT:    store i8** null, i8*** [[TMP79]], align 4
11429 // CHECK11-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 7
11430 // CHECK11-NEXT:    store i8** null, i8*** [[TMP80]], align 4
11431 // CHECK11-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]], i32 0, i32 8
11432 // CHECK11-NEXT:    store i64 [[TMP72]], i64* [[TMP81]], align 8
11433 // CHECK11-NEXT:    [[TMP82:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l51.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS14]])
11434 // CHECK11-NEXT:    [[TMP83:%.*]] = icmp ne i32 [[TMP82]], 0
11435 // CHECK11-NEXT:    br i1 [[TMP83]], label [[OMP_OFFLOAD_FAILED15:%.*]], label [[OMP_OFFLOAD_CONT16:%.*]]
11436 // CHECK11:       omp_offload.failed15:
11437 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l51(i32 [[TMP43]], i32* [[TMP44]], i32* [[TMP45]], i32* [[TMP46]]) #[[ATTR2]]
11438 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT16]]
11439 // CHECK11:       omp_offload.cont16:
11440 // CHECK11-NEXT:    [[TMP84:%.*]] = load i32, i32* [[CH]], align 4
11441 // CHECK11-NEXT:    store i32 [[TMP84]], i32* [[CH_CASTED]], align 4
11442 // CHECK11-NEXT:    [[TMP85:%.*]] = load i32, i32* [[CH_CASTED]], align 4
11443 // CHECK11-NEXT:    [[TMP86:%.*]] = load i32, i32* [[N]], align 4
11444 // CHECK11-NEXT:    store i32 [[TMP86]], i32* [[N_CASTED17]], align 4
11445 // CHECK11-NEXT:    [[TMP87:%.*]] = load i32, i32* [[N_CASTED17]], align 4
11446 // CHECK11-NEXT:    [[TMP88:%.*]] = load i32*, i32** [[A]], align 4
11447 // CHECK11-NEXT:    [[TMP89:%.*]] = load i32*, i32** [[B]], align 4
11448 // CHECK11-NEXT:    [[TMP90:%.*]] = load i32*, i32** [[C]], align 4
11449 // CHECK11-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0
11450 // CHECK11-NEXT:    [[TMP92:%.*]] = bitcast i8** [[TMP91]] to i32*
11451 // CHECK11-NEXT:    store i32 [[TMP85]], i32* [[TMP92]], align 4
11452 // CHECK11-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 0
11453 // CHECK11-NEXT:    [[TMP94:%.*]] = bitcast i8** [[TMP93]] to i32*
11454 // CHECK11-NEXT:    store i32 [[TMP85]], i32* [[TMP94]], align 4
11455 // CHECK11-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 0
11456 // CHECK11-NEXT:    store i8* null, i8** [[TMP95]], align 4
11457 // CHECK11-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 1
11458 // CHECK11-NEXT:    [[TMP97:%.*]] = bitcast i8** [[TMP96]] to i32*
11459 // CHECK11-NEXT:    store i32 [[TMP87]], i32* [[TMP97]], align 4
11460 // CHECK11-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 1
11461 // CHECK11-NEXT:    [[TMP99:%.*]] = bitcast i8** [[TMP98]] to i32*
11462 // CHECK11-NEXT:    store i32 [[TMP87]], i32* [[TMP99]], align 4
11463 // CHECK11-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 1
11464 // CHECK11-NEXT:    store i8* null, i8** [[TMP100]], align 4
11465 // CHECK11-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 2
11466 // CHECK11-NEXT:    [[TMP102:%.*]] = bitcast i8** [[TMP101]] to i32**
11467 // CHECK11-NEXT:    store i32* [[TMP88]], i32** [[TMP102]], align 4
11468 // CHECK11-NEXT:    [[TMP103:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 2
11469 // CHECK11-NEXT:    [[TMP104:%.*]] = bitcast i8** [[TMP103]] to i32**
11470 // CHECK11-NEXT:    store i32* [[TMP88]], i32** [[TMP104]], align 4
11471 // CHECK11-NEXT:    [[TMP105:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 2
11472 // CHECK11-NEXT:    store i8* null, i8** [[TMP105]], align 4
11473 // CHECK11-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 3
11474 // CHECK11-NEXT:    [[TMP107:%.*]] = bitcast i8** [[TMP106]] to i32**
11475 // CHECK11-NEXT:    store i32* [[TMP89]], i32** [[TMP107]], align 4
11476 // CHECK11-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 3
11477 // CHECK11-NEXT:    [[TMP109:%.*]] = bitcast i8** [[TMP108]] to i32**
11478 // CHECK11-NEXT:    store i32* [[TMP89]], i32** [[TMP109]], align 4
11479 // CHECK11-NEXT:    [[TMP110:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 3
11480 // CHECK11-NEXT:    store i8* null, i8** [[TMP110]], align 4
11481 // CHECK11-NEXT:    [[TMP111:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 4
11482 // CHECK11-NEXT:    [[TMP112:%.*]] = bitcast i8** [[TMP111]] to i32**
11483 // CHECK11-NEXT:    store i32* [[TMP90]], i32** [[TMP112]], align 4
11484 // CHECK11-NEXT:    [[TMP113:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 4
11485 // CHECK11-NEXT:    [[TMP114:%.*]] = bitcast i8** [[TMP113]] to i32**
11486 // CHECK11-NEXT:    store i32* [[TMP90]], i32** [[TMP114]], align 4
11487 // CHECK11-NEXT:    [[TMP115:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 4
11488 // CHECK11-NEXT:    store i8* null, i8** [[TMP115]], align 4
11489 // CHECK11-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0
11490 // CHECK11-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 0
11491 // CHECK11-NEXT:    [[TMP118:%.*]] = load i32, i32* [[N]], align 4
11492 // CHECK11-NEXT:    store i32 [[TMP118]], i32* [[DOTCAPTURE_EXPR_22]], align 4
11493 // CHECK11-NEXT:    [[TMP119:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_22]], align 4
11494 // CHECK11-NEXT:    [[SUB24:%.*]] = sub nsw i32 [[TMP119]], 0
11495 // CHECK11-NEXT:    [[DIV25:%.*]] = sdiv i32 [[SUB24]], 1
11496 // CHECK11-NEXT:    [[SUB26:%.*]] = sub nsw i32 [[DIV25]], 1
11497 // CHECK11-NEXT:    store i32 [[SUB26]], i32* [[DOTCAPTURE_EXPR_23]], align 4
11498 // CHECK11-NEXT:    [[TMP120:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_23]], align 4
11499 // CHECK11-NEXT:    [[ADD27:%.*]] = add nsw i32 [[TMP120]], 1
11500 // CHECK11-NEXT:    [[TMP121:%.*]] = zext i32 [[ADD27]] to i64
11501 // CHECK11-NEXT:    [[KERNEL_ARGS28:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
11502 // CHECK11-NEXT:    [[TMP122:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 0
11503 // CHECK11-NEXT:    store i32 1, i32* [[TMP122]], align 4
11504 // CHECK11-NEXT:    [[TMP123:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 1
11505 // CHECK11-NEXT:    store i32 5, i32* [[TMP123]], align 4
11506 // CHECK11-NEXT:    [[TMP124:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 2
11507 // CHECK11-NEXT:    store i8** [[TMP116]], i8*** [[TMP124]], align 4
11508 // CHECK11-NEXT:    [[TMP125:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 3
11509 // CHECK11-NEXT:    store i8** [[TMP117]], i8*** [[TMP125]], align 4
11510 // CHECK11-NEXT:    [[TMP126:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 4
11511 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.36, i32 0, i32 0), i64** [[TMP126]], align 4
11512 // CHECK11-NEXT:    [[TMP127:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 5
11513 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.37, i32 0, i32 0), i64** [[TMP127]], align 4
11514 // CHECK11-NEXT:    [[TMP128:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 6
11515 // CHECK11-NEXT:    store i8** null, i8*** [[TMP128]], align 4
11516 // CHECK11-NEXT:    [[TMP129:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 7
11517 // CHECK11-NEXT:    store i8** null, i8*** [[TMP129]], align 4
11518 // CHECK11-NEXT:    [[TMP130:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 8
11519 // CHECK11-NEXT:    store i64 [[TMP121]], i64* [[TMP130]], align 8
11520 // CHECK11-NEXT:    [[TMP131:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l59.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]])
11521 // CHECK11-NEXT:    [[TMP132:%.*]] = icmp ne i32 [[TMP131]], 0
11522 // CHECK11-NEXT:    br i1 [[TMP132]], label [[OMP_OFFLOAD_FAILED29:%.*]], label [[OMP_OFFLOAD_CONT30:%.*]]
11523 // CHECK11:       omp_offload.failed29:
11524 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l59(i32 [[TMP85]], i32 [[TMP87]], i32* [[TMP88]], i32* [[TMP89]], i32* [[TMP90]]) #[[ATTR2]]
11525 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT30]]
11526 // CHECK11:       omp_offload.cont30:
11527 // CHECK11-NEXT:    [[TMP133:%.*]] = load i32, i32* [[N]], align 4
11528 // CHECK11-NEXT:    store i32 [[TMP133]], i32* [[N_CASTED31]], align 4
11529 // CHECK11-NEXT:    [[TMP134:%.*]] = load i32, i32* [[N_CASTED31]], align 4
11530 // CHECK11-NEXT:    [[TMP135:%.*]] = load i32*, i32** [[A]], align 4
11531 // CHECK11-NEXT:    [[TMP136:%.*]] = load i32*, i32** [[B]], align 4
11532 // CHECK11-NEXT:    [[TMP137:%.*]] = load i32*, i32** [[C]], align 4
11533 // CHECK11-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 0
11534 // CHECK11-NEXT:    [[TMP139:%.*]] = bitcast i8** [[TMP138]] to i32*
11535 // CHECK11-NEXT:    store i32 [[TMP134]], i32* [[TMP139]], align 4
11536 // CHECK11-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 0
11537 // CHECK11-NEXT:    [[TMP141:%.*]] = bitcast i8** [[TMP140]] to i32*
11538 // CHECK11-NEXT:    store i32 [[TMP134]], i32* [[TMP141]], align 4
11539 // CHECK11-NEXT:    [[TMP142:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS34]], i32 0, i32 0
11540 // CHECK11-NEXT:    store i8* null, i8** [[TMP142]], align 4
11541 // CHECK11-NEXT:    [[TMP143:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 1
11542 // CHECK11-NEXT:    [[TMP144:%.*]] = bitcast i8** [[TMP143]] to i32**
11543 // CHECK11-NEXT:    store i32* [[TMP135]], i32** [[TMP144]], align 4
11544 // CHECK11-NEXT:    [[TMP145:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 1
11545 // CHECK11-NEXT:    [[TMP146:%.*]] = bitcast i8** [[TMP145]] to i32**
11546 // CHECK11-NEXT:    store i32* [[TMP135]], i32** [[TMP146]], align 4
11547 // CHECK11-NEXT:    [[TMP147:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS34]], i32 0, i32 1
11548 // CHECK11-NEXT:    store i8* null, i8** [[TMP147]], align 4
11549 // CHECK11-NEXT:    [[TMP148:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 2
11550 // CHECK11-NEXT:    [[TMP149:%.*]] = bitcast i8** [[TMP148]] to i32**
11551 // CHECK11-NEXT:    store i32* [[TMP136]], i32** [[TMP149]], align 4
11552 // CHECK11-NEXT:    [[TMP150:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 2
11553 // CHECK11-NEXT:    [[TMP151:%.*]] = bitcast i8** [[TMP150]] to i32**
11554 // CHECK11-NEXT:    store i32* [[TMP136]], i32** [[TMP151]], align 4
11555 // CHECK11-NEXT:    [[TMP152:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS34]], i32 0, i32 2
11556 // CHECK11-NEXT:    store i8* null, i8** [[TMP152]], align 4
11557 // CHECK11-NEXT:    [[TMP153:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 3
11558 // CHECK11-NEXT:    [[TMP154:%.*]] = bitcast i8** [[TMP153]] to i32**
11559 // CHECK11-NEXT:    store i32* [[TMP137]], i32** [[TMP154]], align 4
11560 // CHECK11-NEXT:    [[TMP155:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 3
11561 // CHECK11-NEXT:    [[TMP156:%.*]] = bitcast i8** [[TMP155]] to i32**
11562 // CHECK11-NEXT:    store i32* [[TMP137]], i32** [[TMP156]], align 4
11563 // CHECK11-NEXT:    [[TMP157:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS34]], i32 0, i32 3
11564 // CHECK11-NEXT:    store i8* null, i8** [[TMP157]], align 4
11565 // CHECK11-NEXT:    [[TMP158:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS32]], i32 0, i32 0
11566 // CHECK11-NEXT:    [[TMP159:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS33]], i32 0, i32 0
11567 // CHECK11-NEXT:    [[TMP160:%.*]] = load i32, i32* [[N]], align 4
11568 // CHECK11-NEXT:    store i32 [[TMP160]], i32* [[DOTCAPTURE_EXPR_36]], align 4
11569 // CHECK11-NEXT:    [[TMP161:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_36]], align 4
11570 // CHECK11-NEXT:    [[SUB38:%.*]] = sub nsw i32 [[TMP161]], 0
11571 // CHECK11-NEXT:    [[DIV39:%.*]] = sdiv i32 [[SUB38]], 1
11572 // CHECK11-NEXT:    [[SUB40:%.*]] = sub nsw i32 [[DIV39]], 1
11573 // CHECK11-NEXT:    store i32 [[SUB40]], i32* [[DOTCAPTURE_EXPR_37]], align 4
11574 // CHECK11-NEXT:    [[TMP162:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_37]], align 4
11575 // CHECK11-NEXT:    [[ADD41:%.*]] = add nsw i32 [[TMP162]], 1
11576 // CHECK11-NEXT:    [[TMP163:%.*]] = zext i32 [[ADD41]] to i64
11577 // CHECK11-NEXT:    [[KERNEL_ARGS42:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
11578 // CHECK11-NEXT:    [[TMP164:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 0
11579 // CHECK11-NEXT:    store i32 1, i32* [[TMP164]], align 4
11580 // CHECK11-NEXT:    [[TMP165:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 1
11581 // CHECK11-NEXT:    store i32 4, i32* [[TMP165]], align 4
11582 // CHECK11-NEXT:    [[TMP166:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 2
11583 // CHECK11-NEXT:    store i8** [[TMP158]], i8*** [[TMP166]], align 4
11584 // CHECK11-NEXT:    [[TMP167:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 3
11585 // CHECK11-NEXT:    store i8** [[TMP159]], i8*** [[TMP167]], align 4
11586 // CHECK11-NEXT:    [[TMP168:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 4
11587 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.40, i32 0, i32 0), i64** [[TMP168]], align 4
11588 // CHECK11-NEXT:    [[TMP169:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 5
11589 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.41, i32 0, i32 0), i64** [[TMP169]], align 4
11590 // CHECK11-NEXT:    [[TMP170:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 6
11591 // CHECK11-NEXT:    store i8** null, i8*** [[TMP170]], align 4
11592 // CHECK11-NEXT:    [[TMP171:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 7
11593 // CHECK11-NEXT:    store i8** null, i8*** [[TMP171]], align 4
11594 // CHECK11-NEXT:    [[TMP172:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]], i32 0, i32 8
11595 // CHECK11-NEXT:    store i64 [[TMP163]], i64* [[TMP172]], align 8
11596 // CHECK11-NEXT:    [[TMP173:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l67.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS42]])
11597 // CHECK11-NEXT:    [[TMP174:%.*]] = icmp ne i32 [[TMP173]], 0
11598 // CHECK11-NEXT:    br i1 [[TMP174]], label [[OMP_OFFLOAD_FAILED43:%.*]], label [[OMP_OFFLOAD_CONT44:%.*]]
11599 // CHECK11:       omp_offload.failed43:
11600 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l67(i32 [[TMP134]], i32* [[TMP135]], i32* [[TMP136]], i32* [[TMP137]]) #[[ATTR2]]
11601 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT44]]
11602 // CHECK11:       omp_offload.cont44:
11603 // CHECK11-NEXT:    [[TMP175:%.*]] = load i32, i32* [[CH]], align 4
11604 // CHECK11-NEXT:    store i32 [[TMP175]], i32* [[CH_CASTED45]], align 4
11605 // CHECK11-NEXT:    [[TMP176:%.*]] = load i32, i32* [[CH_CASTED45]], align 4
11606 // CHECK11-NEXT:    [[TMP177:%.*]] = load i32, i32* [[N]], align 4
11607 // CHECK11-NEXT:    store i32 [[TMP177]], i32* [[N_CASTED46]], align 4
11608 // CHECK11-NEXT:    [[TMP178:%.*]] = load i32, i32* [[N_CASTED46]], align 4
11609 // CHECK11-NEXT:    [[TMP179:%.*]] = load i32*, i32** [[A]], align 4
11610 // CHECK11-NEXT:    [[TMP180:%.*]] = load i32*, i32** [[B]], align 4
11611 // CHECK11-NEXT:    [[TMP181:%.*]] = load i32*, i32** [[C]], align 4
11612 // CHECK11-NEXT:    [[TMP182:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 0
11613 // CHECK11-NEXT:    [[TMP183:%.*]] = bitcast i8** [[TMP182]] to i32*
11614 // CHECK11-NEXT:    store i32 [[TMP176]], i32* [[TMP183]], align 4
11615 // CHECK11-NEXT:    [[TMP184:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 0
11616 // CHECK11-NEXT:    [[TMP185:%.*]] = bitcast i8** [[TMP184]] to i32*
11617 // CHECK11-NEXT:    store i32 [[TMP176]], i32* [[TMP185]], align 4
11618 // CHECK11-NEXT:    [[TMP186:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 0
11619 // CHECK11-NEXT:    store i8* null, i8** [[TMP186]], align 4
11620 // CHECK11-NEXT:    [[TMP187:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 1
11621 // CHECK11-NEXT:    [[TMP188:%.*]] = bitcast i8** [[TMP187]] to i32*
11622 // CHECK11-NEXT:    store i32 [[TMP178]], i32* [[TMP188]], align 4
11623 // CHECK11-NEXT:    [[TMP189:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 1
11624 // CHECK11-NEXT:    [[TMP190:%.*]] = bitcast i8** [[TMP189]] to i32*
11625 // CHECK11-NEXT:    store i32 [[TMP178]], i32* [[TMP190]], align 4
11626 // CHECK11-NEXT:    [[TMP191:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 1
11627 // CHECK11-NEXT:    store i8* null, i8** [[TMP191]], align 4
11628 // CHECK11-NEXT:    [[TMP192:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 2
11629 // CHECK11-NEXT:    [[TMP193:%.*]] = bitcast i8** [[TMP192]] to i32**
11630 // CHECK11-NEXT:    store i32* [[TMP179]], i32** [[TMP193]], align 4
11631 // CHECK11-NEXT:    [[TMP194:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 2
11632 // CHECK11-NEXT:    [[TMP195:%.*]] = bitcast i8** [[TMP194]] to i32**
11633 // CHECK11-NEXT:    store i32* [[TMP179]], i32** [[TMP195]], align 4
11634 // CHECK11-NEXT:    [[TMP196:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 2
11635 // CHECK11-NEXT:    store i8* null, i8** [[TMP196]], align 4
11636 // CHECK11-NEXT:    [[TMP197:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 3
11637 // CHECK11-NEXT:    [[TMP198:%.*]] = bitcast i8** [[TMP197]] to i32**
11638 // CHECK11-NEXT:    store i32* [[TMP180]], i32** [[TMP198]], align 4
11639 // CHECK11-NEXT:    [[TMP199:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 3
11640 // CHECK11-NEXT:    [[TMP200:%.*]] = bitcast i8** [[TMP199]] to i32**
11641 // CHECK11-NEXT:    store i32* [[TMP180]], i32** [[TMP200]], align 4
11642 // CHECK11-NEXT:    [[TMP201:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 3
11643 // CHECK11-NEXT:    store i8* null, i8** [[TMP201]], align 4
11644 // CHECK11-NEXT:    [[TMP202:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 4
11645 // CHECK11-NEXT:    [[TMP203:%.*]] = bitcast i8** [[TMP202]] to i32**
11646 // CHECK11-NEXT:    store i32* [[TMP181]], i32** [[TMP203]], align 4
11647 // CHECK11-NEXT:    [[TMP204:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 4
11648 // CHECK11-NEXT:    [[TMP205:%.*]] = bitcast i8** [[TMP204]] to i32**
11649 // CHECK11-NEXT:    store i32* [[TMP181]], i32** [[TMP205]], align 4
11650 // CHECK11-NEXT:    [[TMP206:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS49]], i32 0, i32 4
11651 // CHECK11-NEXT:    store i8* null, i8** [[TMP206]], align 4
11652 // CHECK11-NEXT:    [[TMP207:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS47]], i32 0, i32 0
11653 // CHECK11-NEXT:    [[TMP208:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS48]], i32 0, i32 0
11654 // CHECK11-NEXT:    [[TMP209:%.*]] = load i32, i32* [[N]], align 4
11655 // CHECK11-NEXT:    store i32 [[TMP209]], i32* [[DOTCAPTURE_EXPR_51]], align 4
11656 // CHECK11-NEXT:    [[TMP210:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_51]], align 4
11657 // CHECK11-NEXT:    [[SUB53:%.*]] = sub nsw i32 [[TMP210]], 0
11658 // CHECK11-NEXT:    [[DIV54:%.*]] = sdiv i32 [[SUB53]], 1
11659 // CHECK11-NEXT:    [[SUB55:%.*]] = sub nsw i32 [[DIV54]], 1
11660 // CHECK11-NEXT:    store i32 [[SUB55]], i32* [[DOTCAPTURE_EXPR_52]], align 4
11661 // CHECK11-NEXT:    [[TMP211:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_52]], align 4
11662 // CHECK11-NEXT:    [[ADD56:%.*]] = add nsw i32 [[TMP211]], 1
11663 // CHECK11-NEXT:    [[TMP212:%.*]] = zext i32 [[ADD56]] to i64
11664 // CHECK11-NEXT:    [[KERNEL_ARGS57:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
11665 // CHECK11-NEXT:    [[TMP213:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 0
11666 // CHECK11-NEXT:    store i32 1, i32* [[TMP213]], align 4
11667 // CHECK11-NEXT:    [[TMP214:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 1
11668 // CHECK11-NEXT:    store i32 5, i32* [[TMP214]], align 4
11669 // CHECK11-NEXT:    [[TMP215:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 2
11670 // CHECK11-NEXT:    store i8** [[TMP207]], i8*** [[TMP215]], align 4
11671 // CHECK11-NEXT:    [[TMP216:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 3
11672 // CHECK11-NEXT:    store i8** [[TMP208]], i8*** [[TMP216]], align 4
11673 // CHECK11-NEXT:    [[TMP217:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 4
11674 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.44, i32 0, i32 0), i64** [[TMP217]], align 4
11675 // CHECK11-NEXT:    [[TMP218:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 5
11676 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.45, i32 0, i32 0), i64** [[TMP218]], align 4
11677 // CHECK11-NEXT:    [[TMP219:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 6
11678 // CHECK11-NEXT:    store i8** null, i8*** [[TMP219]], align 4
11679 // CHECK11-NEXT:    [[TMP220:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 7
11680 // CHECK11-NEXT:    store i8** null, i8*** [[TMP220]], align 4
11681 // CHECK11-NEXT:    [[TMP221:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]], i32 0, i32 8
11682 // CHECK11-NEXT:    store i64 [[TMP212]], i64* [[TMP221]], align 8
11683 // CHECK11-NEXT:    [[TMP222:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l75.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS57]])
11684 // CHECK11-NEXT:    [[TMP223:%.*]] = icmp ne i32 [[TMP222]], 0
11685 // CHECK11-NEXT:    br i1 [[TMP223]], label [[OMP_OFFLOAD_FAILED58:%.*]], label [[OMP_OFFLOAD_CONT59:%.*]]
11686 // CHECK11:       omp_offload.failed58:
11687 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l75(i32 [[TMP176]], i32 [[TMP178]], i32* [[TMP179]], i32* [[TMP180]], i32* [[TMP181]]) #[[ATTR2]]
11688 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT59]]
11689 // CHECK11:       omp_offload.cont59:
11690 // CHECK11-NEXT:    [[TMP224:%.*]] = load i32, i32* [[N]], align 4
11691 // CHECK11-NEXT:    store i32 [[TMP224]], i32* [[N_CASTED60]], align 4
11692 // CHECK11-NEXT:    [[TMP225:%.*]] = load i32, i32* [[N_CASTED60]], align 4
11693 // CHECK11-NEXT:    [[TMP226:%.*]] = load i32*, i32** [[A]], align 4
11694 // CHECK11-NEXT:    [[TMP227:%.*]] = load i32*, i32** [[B]], align 4
11695 // CHECK11-NEXT:    [[TMP228:%.*]] = load i32*, i32** [[C]], align 4
11696 // CHECK11-NEXT:    [[TMP229:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 0
11697 // CHECK11-NEXT:    [[TMP230:%.*]] = bitcast i8** [[TMP229]] to i32*
11698 // CHECK11-NEXT:    store i32 [[TMP225]], i32* [[TMP230]], align 4
11699 // CHECK11-NEXT:    [[TMP231:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 0
11700 // CHECK11-NEXT:    [[TMP232:%.*]] = bitcast i8** [[TMP231]] to i32*
11701 // CHECK11-NEXT:    store i32 [[TMP225]], i32* [[TMP232]], align 4
11702 // CHECK11-NEXT:    [[TMP233:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS63]], i32 0, i32 0
11703 // CHECK11-NEXT:    store i8* null, i8** [[TMP233]], align 4
11704 // CHECK11-NEXT:    [[TMP234:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 1
11705 // CHECK11-NEXT:    [[TMP235:%.*]] = bitcast i8** [[TMP234]] to i32**
11706 // CHECK11-NEXT:    store i32* [[TMP226]], i32** [[TMP235]], align 4
11707 // CHECK11-NEXT:    [[TMP236:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 1
11708 // CHECK11-NEXT:    [[TMP237:%.*]] = bitcast i8** [[TMP236]] to i32**
11709 // CHECK11-NEXT:    store i32* [[TMP226]], i32** [[TMP237]], align 4
11710 // CHECK11-NEXT:    [[TMP238:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS63]], i32 0, i32 1
11711 // CHECK11-NEXT:    store i8* null, i8** [[TMP238]], align 4
11712 // CHECK11-NEXT:    [[TMP239:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 2
11713 // CHECK11-NEXT:    [[TMP240:%.*]] = bitcast i8** [[TMP239]] to i32**
11714 // CHECK11-NEXT:    store i32* [[TMP227]], i32** [[TMP240]], align 4
11715 // CHECK11-NEXT:    [[TMP241:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 2
11716 // CHECK11-NEXT:    [[TMP242:%.*]] = bitcast i8** [[TMP241]] to i32**
11717 // CHECK11-NEXT:    store i32* [[TMP227]], i32** [[TMP242]], align 4
11718 // CHECK11-NEXT:    [[TMP243:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS63]], i32 0, i32 2
11719 // CHECK11-NEXT:    store i8* null, i8** [[TMP243]], align 4
11720 // CHECK11-NEXT:    [[TMP244:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 3
11721 // CHECK11-NEXT:    [[TMP245:%.*]] = bitcast i8** [[TMP244]] to i32**
11722 // CHECK11-NEXT:    store i32* [[TMP228]], i32** [[TMP245]], align 4
11723 // CHECK11-NEXT:    [[TMP246:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 3
11724 // CHECK11-NEXT:    [[TMP247:%.*]] = bitcast i8** [[TMP246]] to i32**
11725 // CHECK11-NEXT:    store i32* [[TMP228]], i32** [[TMP247]], align 4
11726 // CHECK11-NEXT:    [[TMP248:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS63]], i32 0, i32 3
11727 // CHECK11-NEXT:    store i8* null, i8** [[TMP248]], align 4
11728 // CHECK11-NEXT:    [[TMP249:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS61]], i32 0, i32 0
11729 // CHECK11-NEXT:    [[TMP250:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS62]], i32 0, i32 0
11730 // CHECK11-NEXT:    [[TMP251:%.*]] = load i32, i32* [[N]], align 4
11731 // CHECK11-NEXT:    store i32 [[TMP251]], i32* [[DOTCAPTURE_EXPR_65]], align 4
11732 // CHECK11-NEXT:    [[TMP252:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_65]], align 4
11733 // CHECK11-NEXT:    [[SUB67:%.*]] = sub nsw i32 [[TMP252]], 0
11734 // CHECK11-NEXT:    [[DIV68:%.*]] = sdiv i32 [[SUB67]], 1
11735 // CHECK11-NEXT:    [[SUB69:%.*]] = sub nsw i32 [[DIV68]], 1
11736 // CHECK11-NEXT:    store i32 [[SUB69]], i32* [[DOTCAPTURE_EXPR_66]], align 4
11737 // CHECK11-NEXT:    [[TMP253:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_66]], align 4
11738 // CHECK11-NEXT:    [[ADD70:%.*]] = add nsw i32 [[TMP253]], 1
11739 // CHECK11-NEXT:    [[TMP254:%.*]] = zext i32 [[ADD70]] to i64
11740 // CHECK11-NEXT:    [[KERNEL_ARGS71:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
11741 // CHECK11-NEXT:    [[TMP255:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 0
11742 // CHECK11-NEXT:    store i32 1, i32* [[TMP255]], align 4
11743 // CHECK11-NEXT:    [[TMP256:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 1
11744 // CHECK11-NEXT:    store i32 4, i32* [[TMP256]], align 4
11745 // CHECK11-NEXT:    [[TMP257:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 2
11746 // CHECK11-NEXT:    store i8** [[TMP249]], i8*** [[TMP257]], align 4
11747 // CHECK11-NEXT:    [[TMP258:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 3
11748 // CHECK11-NEXT:    store i8** [[TMP250]], i8*** [[TMP258]], align 4
11749 // CHECK11-NEXT:    [[TMP259:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 4
11750 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_sizes.48, i32 0, i32 0), i64** [[TMP259]], align 4
11751 // CHECK11-NEXT:    [[TMP260:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 5
11752 // CHECK11-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.49, i32 0, i32 0), i64** [[TMP260]], align 4
11753 // CHECK11-NEXT:    [[TMP261:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 6
11754 // CHECK11-NEXT:    store i8** null, i8*** [[TMP261]], align 4
11755 // CHECK11-NEXT:    [[TMP262:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 7
11756 // CHECK11-NEXT:    store i8** null, i8*** [[TMP262]], align 4
11757 // CHECK11-NEXT:    [[TMP263:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]], i32 0, i32 8
11758 // CHECK11-NEXT:    store i64 [[TMP254]], i64* [[TMP263]], align 8
11759 // CHECK11-NEXT:    [[TMP264:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l83.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS71]])
11760 // CHECK11-NEXT:    [[TMP265:%.*]] = icmp ne i32 [[TMP264]], 0
11761 // CHECK11-NEXT:    br i1 [[TMP265]], label [[OMP_OFFLOAD_FAILED72:%.*]], label [[OMP_OFFLOAD_CONT73:%.*]]
11762 // CHECK11:       omp_offload.failed72:
11763 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l83(i32 [[TMP225]], i32* [[TMP226]], i32* [[TMP227]], i32* [[TMP228]]) #[[ATTR2]]
11764 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT73]]
11765 // CHECK11:       omp_offload.cont73:
11766 // CHECK11-NEXT:    [[TMP266:%.*]] = load i32, i32* [[CH]], align 4
11767 // CHECK11-NEXT:    store i32 [[TMP266]], i32* [[CH_CASTED74]], align 4
11768 // CHECK11-NEXT:    [[TMP267:%.*]] = load i32, i32* [[CH_CASTED74]], align 4
11769 // CHECK11-NEXT:    [[TMP268:%.*]] = load i32, i32* [[N]], align 4
11770 // CHECK11-NEXT:    store i32 [[TMP268]], i32* [[N_CASTED75]], align 4
11771 // CHECK11-NEXT:    [[TMP269:%.*]] = load i32, i32* [[N_CASTED75]], align 4
11772 // CHECK11-NEXT:    [[TMP270:%.*]] = load i32*, i32** [[A]], align 4
11773 // CHECK11-NEXT:    [[TMP271:%.*]] = load i32*, i32** [[B]], align 4
11774 // CHECK11-NEXT:    [[TMP272:%.*]] = load i32*, i32** [[C]], align 4
11775 // CHECK11-NEXT:    [[TMP273:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 0
11776 // CHECK11-NEXT:    [[TMP274:%.*]] = bitcast i8** [[TMP273]] to i32*
11777 // CHECK11-NEXT:    store i32 [[TMP267]], i32* [[TMP274]], align 4
11778 // CHECK11-NEXT:    [[TMP275:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 0
11779 // CHECK11-NEXT:    [[TMP276:%.*]] = bitcast i8** [[TMP275]] to i32*
11780 // CHECK11-NEXT:    store i32 [[TMP267]], i32* [[TMP276]], align 4
11781 // CHECK11-NEXT:    [[TMP277:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 0
11782 // CHECK11-NEXT:    store i8* null, i8** [[TMP277]], align 4
11783 // CHECK11-NEXT:    [[TMP278:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 1
11784 // CHECK11-NEXT:    [[TMP279:%.*]] = bitcast i8** [[TMP278]] to i32*
11785 // CHECK11-NEXT:    store i32 [[TMP269]], i32* [[TMP279]], align 4
11786 // CHECK11-NEXT:    [[TMP280:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 1
11787 // CHECK11-NEXT:    [[TMP281:%.*]] = bitcast i8** [[TMP280]] to i32*
11788 // CHECK11-NEXT:    store i32 [[TMP269]], i32* [[TMP281]], align 4
11789 // CHECK11-NEXT:    [[TMP282:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 1
11790 // CHECK11-NEXT:    store i8* null, i8** [[TMP282]], align 4
11791 // CHECK11-NEXT:    [[TMP283:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 2
11792 // CHECK11-NEXT:    [[TMP284:%.*]] = bitcast i8** [[TMP283]] to i32**
11793 // CHECK11-NEXT:    store i32* [[TMP270]], i32** [[TMP284]], align 4
11794 // CHECK11-NEXT:    [[TMP285:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 2
11795 // CHECK11-NEXT:    [[TMP286:%.*]] = bitcast i8** [[TMP285]] to i32**
11796 // CHECK11-NEXT:    store i32* [[TMP270]], i32** [[TMP286]], align 4
11797 // CHECK11-NEXT:    [[TMP287:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 2
11798 // CHECK11-NEXT:    store i8* null, i8** [[TMP287]], align 4
11799 // CHECK11-NEXT:    [[TMP288:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 3
11800 // CHECK11-NEXT:    [[TMP289:%.*]] = bitcast i8** [[TMP288]] to i32**
11801 // CHECK11-NEXT:    store i32* [[TMP271]], i32** [[TMP289]], align 4
11802 // CHECK11-NEXT:    [[TMP290:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 3
11803 // CHECK11-NEXT:    [[TMP291:%.*]] = bitcast i8** [[TMP290]] to i32**
11804 // CHECK11-NEXT:    store i32* [[TMP271]], i32** [[TMP291]], align 4
11805 // CHECK11-NEXT:    [[TMP292:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 3
11806 // CHECK11-NEXT:    store i8* null, i8** [[TMP292]], align 4
11807 // CHECK11-NEXT:    [[TMP293:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 4
11808 // CHECK11-NEXT:    [[TMP294:%.*]] = bitcast i8** [[TMP293]] to i32**
11809 // CHECK11-NEXT:    store i32* [[TMP272]], i32** [[TMP294]], align 4
11810 // CHECK11-NEXT:    [[TMP295:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 4
11811 // CHECK11-NEXT:    [[TMP296:%.*]] = bitcast i8** [[TMP295]] to i32**
11812 // CHECK11-NEXT:    store i32* [[TMP272]], i32** [[TMP296]], align 4
11813 // CHECK11-NEXT:    [[TMP297:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_MAPPERS78]], i32 0, i32 4
11814 // CHECK11-NEXT:    store i8* null, i8** [[TMP297]], align 4
11815 // CHECK11-NEXT:    [[TMP298:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_BASEPTRS76]], i32 0, i32 0
11816 // CHECK11-NEXT:    [[TMP299:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[DOTOFFLOAD_PTRS77]], i32 0, i32 0
11817 // CHECK11-NEXT:    [[TMP300:%.*]] = load i32, i32* [[N]], align 4
11818 // CHECK11-NEXT:    store i32 [[TMP300]], i32* [[DOTCAPTURE_EXPR_80]], align 4
11819 // CHECK11-NEXT:    [[TMP301:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_80]], align 4
11820 // CHECK11-NEXT:    [[SUB82:%.*]] = sub nsw i32 [[TMP301]], 0
11821 // CHECK11-NEXT:    [[DIV83:%.*]] = sdiv i32 [[SUB82]], 1
11822 // CHECK11-NEXT:    [[SUB84:%.*]] = sub nsw i32 [[DIV83]], 1
11823 // CHECK11-NEXT:    store i32 [[SUB84]], i32* [[DOTCAPTURE_EXPR_81]], align 4
11824 // CHECK11-NEXT:    [[TMP302:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_81]], align 4
11825 // CHECK11-NEXT:    [[ADD85:%.*]] = add nsw i32 [[TMP302]], 1
11826 // CHECK11-NEXT:    [[TMP303:%.*]] = zext i32 [[ADD85]] to i64
11827 // CHECK11-NEXT:    [[KERNEL_ARGS86:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
11828 // CHECK11-NEXT:    [[TMP304:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 0
11829 // CHECK11-NEXT:    store i32 1, i32* [[TMP304]], align 4
11830 // CHECK11-NEXT:    [[TMP305:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 1
11831 // CHECK11-NEXT:    store i32 5, i32* [[TMP305]], align 4
11832 // CHECK11-NEXT:    [[TMP306:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 2
11833 // CHECK11-NEXT:    store i8** [[TMP298]], i8*** [[TMP306]], align 4
11834 // CHECK11-NEXT:    [[TMP307:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 3
11835 // CHECK11-NEXT:    store i8** [[TMP299]], i8*** [[TMP307]], align 4
11836 // CHECK11-NEXT:    [[TMP308:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 4
11837 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_sizes.52, i32 0, i32 0), i64** [[TMP308]], align 4
11838 // CHECK11-NEXT:    [[TMP309:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 5
11839 // CHECK11-NEXT:    store i64* getelementptr inbounds ([5 x i64], [5 x i64]* @.offload_maptypes.53, i32 0, i32 0), i64** [[TMP309]], align 4
11840 // CHECK11-NEXT:    [[TMP310:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 6
11841 // CHECK11-NEXT:    store i8** null, i8*** [[TMP310]], align 4
11842 // CHECK11-NEXT:    [[TMP311:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 7
11843 // CHECK11-NEXT:    store i8** null, i8*** [[TMP311]], align 4
11844 // CHECK11-NEXT:    [[TMP312:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]], i32 0, i32 8
11845 // CHECK11-NEXT:    store i64 [[TMP303]], i64* [[TMP312]], align 8
11846 // CHECK11-NEXT:    [[TMP313:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l91.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS86]])
11847 // CHECK11-NEXT:    [[TMP314:%.*]] = icmp ne i32 [[TMP313]], 0
11848 // CHECK11-NEXT:    br i1 [[TMP314]], label [[OMP_OFFLOAD_FAILED87:%.*]], label [[OMP_OFFLOAD_CONT88:%.*]]
11849 // CHECK11:       omp_offload.failed87:
11850 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l91(i32 [[TMP267]], i32 [[TMP269]], i32* [[TMP270]], i32* [[TMP271]], i32* [[TMP272]]) #[[ATTR2]]
11851 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT88]]
11852 // CHECK11:       omp_offload.cont88:
11853 // CHECK11-NEXT:    ret i32 0
11854 //
11855 //
11856 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l42
11857 // CHECK11-SAME: (i32 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
11858 // CHECK11-NEXT:  entry:
11859 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
11860 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11861 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 4
11862 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 4
11863 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
11864 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11865 // CHECK11-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 4
11866 // CHECK11-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 4
11867 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..26 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
11868 // CHECK11-NEXT:    ret void
11869 //
11870 //
11871 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..26
11872 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
11873 // CHECK11-NEXT:  entry:
11874 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11875 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11876 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11877 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
11878 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
11879 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
11880 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11881 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11882 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11883 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11884 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
11885 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
11886 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
11887 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11888 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11889 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
11890 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11891 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11892 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11893 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
11894 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
11895 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
11896 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11897 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
11898 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
11899 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
11900 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
11901 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
11902 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11903 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
11904 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11905 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
11906 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11907 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
11908 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11909 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
11910 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11911 // CHECK11:       omp.precond.then:
11912 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
11913 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11914 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
11915 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11916 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11917 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11918 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
11919 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
11920 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11921 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11922 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
11923 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11924 // CHECK11:       cond.true:
11925 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11926 // CHECK11-NEXT:    br label [[COND_END:%.*]]
11927 // CHECK11:       cond.false:
11928 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11929 // CHECK11-NEXT:    br label [[COND_END]]
11930 // CHECK11:       cond.end:
11931 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
11932 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
11933 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
11934 // CHECK11-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
11935 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11936 // CHECK11:       omp.inner.for.cond:
11937 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
11938 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11939 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
11940 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11941 // CHECK11:       omp.inner.for.body:
11942 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
11943 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11944 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32**, i32**, i32**)* @.omp_outlined..27 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], i32** [[TMP1]], i32** [[TMP2]], i32** [[TMP3]])
11945 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11946 // CHECK11:       omp.inner.for.inc:
11947 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
11948 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
11949 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
11950 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
11951 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
11952 // CHECK11:       omp.inner.for.end:
11953 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
11954 // CHECK11:       omp.loop.exit:
11955 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11956 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
11957 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
11958 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
11959 // CHECK11:       omp.precond.end:
11960 // CHECK11-NEXT:    ret void
11961 //
11962 //
11963 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..27
11964 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
11965 // CHECK11-NEXT:  entry:
11966 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11967 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11968 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
11969 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
11970 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11971 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
11972 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
11973 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
11974 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11975 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11976 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11977 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11978 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
11979 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
11980 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
11981 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11982 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11983 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
11984 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11985 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11986 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11987 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11988 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11989 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
11990 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
11991 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
11992 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11993 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
11994 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
11995 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
11996 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
11997 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
11998 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11999 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
12000 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12001 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
12002 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12003 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
12004 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12005 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
12006 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12007 // CHECK11:       omp.precond.then:
12008 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
12009 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12010 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
12011 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12012 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12013 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
12014 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
12015 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12016 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12017 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12018 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
12019 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12020 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12021 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12022 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
12023 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12024 // CHECK11:       cond.true:
12025 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12026 // CHECK11-NEXT:    br label [[COND_END:%.*]]
12027 // CHECK11:       cond.false:
12028 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12029 // CHECK11-NEXT:    br label [[COND_END]]
12030 // CHECK11:       cond.end:
12031 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
12032 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
12033 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12034 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
12035 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12036 // CHECK11:       omp.inner.for.cond:
12037 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12038 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12039 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
12040 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12041 // CHECK11:       omp.inner.for.body:
12042 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12043 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
12044 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
12045 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
12046 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12047 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
12048 // CHECK11-NEXT:    [[TMP22:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB3]], i32 [[TMP21]], i32 2)
12049 // CHECK11-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
12050 // CHECK11-NEXT:    br i1 [[TMP23]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
12051 // CHECK11:       .cancel.exit:
12052 // CHECK11-NEXT:    br label [[CANCEL_EXIT:%.*]]
12053 // CHECK11:       .cancel.continue:
12054 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32*, i32** [[TMP2]], align 4
12055 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[I3]], align 4
12056 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP24]], i32 [[TMP25]]
12057 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
12058 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[TMP3]], align 4
12059 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I3]], align 4
12060 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, i32* [[TMP27]], i32 [[TMP28]]
12061 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4
12062 // CHECK11-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP26]], [[TMP29]]
12063 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32*, i32** [[TMP1]], align 4
12064 // CHECK11-NEXT:    [[TMP31:%.*]] = load i32, i32* [[I3]], align 4
12065 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP30]], i32 [[TMP31]]
12066 // CHECK11-NEXT:    store i32 [[ADD7]], i32* [[ARRAYIDX8]], align 4
12067 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
12068 // CHECK11:       omp.body.continue:
12069 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12070 // CHECK11:       omp.inner.for.inc:
12071 // CHECK11-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12072 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP32]], 1
12073 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
12074 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
12075 // CHECK11:       omp.inner.for.end:
12076 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12077 // CHECK11:       omp.loop.exit:
12078 // CHECK11-NEXT:    [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12079 // CHECK11-NEXT:    [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
12080 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP34]])
12081 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
12082 // CHECK11:       cancel.exit:
12083 // CHECK11-NEXT:    [[TMP35:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12084 // CHECK11-NEXT:    [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4
12085 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP36]])
12086 // CHECK11-NEXT:    br label [[CANCEL_CONT:%.*]]
12087 // CHECK11:       omp.precond.end:
12088 // CHECK11-NEXT:    br label [[CANCEL_CONT]]
12089 // CHECK11:       cancel.cont:
12090 // CHECK11-NEXT:    ret void
12091 //
12092 //
12093 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l51
12094 // CHECK11-SAME: (i32 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
12095 // CHECK11-NEXT:  entry:
12096 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
12097 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
12098 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 4
12099 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 4
12100 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
12101 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
12102 // CHECK11-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 4
12103 // CHECK11-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 4
12104 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
12105 // CHECK11-NEXT:    ret void
12106 //
12107 //
12108 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..30
12109 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
12110 // CHECK11-NEXT:  entry:
12111 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12112 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12113 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
12114 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
12115 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
12116 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
12117 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12118 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12119 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
12120 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
12121 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
12122 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
12123 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
12124 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12125 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12126 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
12127 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12128 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12129 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
12130 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
12131 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
12132 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
12133 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
12134 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
12135 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
12136 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
12137 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
12138 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
12139 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12140 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
12141 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12142 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
12143 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12144 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
12145 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12146 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
12147 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12148 // CHECK11:       omp.precond.then:
12149 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
12150 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12151 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
12152 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12153 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12154 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12155 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
12156 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12157 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12158 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12159 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
12160 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12161 // CHECK11:       cond.true:
12162 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12163 // CHECK11-NEXT:    br label [[COND_END:%.*]]
12164 // CHECK11:       cond.false:
12165 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12166 // CHECK11-NEXT:    br label [[COND_END]]
12167 // CHECK11:       cond.end:
12168 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
12169 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
12170 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12171 // CHECK11-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
12172 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12173 // CHECK11:       omp.inner.for.cond:
12174 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12175 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12176 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
12177 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12178 // CHECK11:       omp.inner.for.body:
12179 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12180 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12181 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32**, i32**, i32**)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], i32** [[TMP1]], i32** [[TMP2]], i32** [[TMP3]])
12182 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12183 // CHECK11:       omp.inner.for.inc:
12184 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12185 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
12186 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
12187 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
12188 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
12189 // CHECK11:       omp.inner.for.end:
12190 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12191 // CHECK11:       omp.loop.exit:
12192 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12193 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
12194 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
12195 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
12196 // CHECK11:       omp.precond.end:
12197 // CHECK11-NEXT:    ret void
12198 //
12199 //
12200 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..31
12201 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
12202 // CHECK11-NEXT:  entry:
12203 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12204 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12205 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
12206 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
12207 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
12208 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
12209 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
12210 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
12211 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12212 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12213 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
12214 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
12215 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
12216 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
12217 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
12218 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12219 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12220 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
12221 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12222 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12223 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12224 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12225 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
12226 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
12227 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
12228 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
12229 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
12230 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
12231 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
12232 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
12233 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
12234 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
12235 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12236 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
12237 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12238 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
12239 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12240 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
12241 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12242 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
12243 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12244 // CHECK11:       omp.precond.then:
12245 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
12246 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12247 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
12248 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12249 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12250 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
12251 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
12252 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12253 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12254 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12255 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
12256 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12257 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12258 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12259 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
12260 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12261 // CHECK11:       cond.true:
12262 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12263 // CHECK11-NEXT:    br label [[COND_END:%.*]]
12264 // CHECK11:       cond.false:
12265 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12266 // CHECK11-NEXT:    br label [[COND_END]]
12267 // CHECK11:       cond.end:
12268 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
12269 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
12270 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12271 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
12272 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12273 // CHECK11:       omp.inner.for.cond:
12274 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12275 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12276 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
12277 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12278 // CHECK11:       omp.inner.for.body:
12279 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12280 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
12281 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
12282 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
12283 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[TMP2]], align 4
12284 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
12285 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP20]], i32 [[TMP21]]
12286 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
12287 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[TMP3]], align 4
12288 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
12289 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, i32* [[TMP23]], i32 [[TMP24]]
12290 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4
12291 // CHECK11-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP22]], [[TMP25]]
12292 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32*, i32** [[TMP1]], align 4
12293 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
12294 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i32 [[TMP27]]
12295 // CHECK11-NEXT:    store i32 [[ADD7]], i32* [[ARRAYIDX8]], align 4
12296 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
12297 // CHECK11:       omp.body.continue:
12298 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12299 // CHECK11:       omp.inner.for.inc:
12300 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12301 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP28]], 1
12302 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
12303 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
12304 // CHECK11:       omp.inner.for.end:
12305 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12306 // CHECK11:       omp.loop.exit:
12307 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12308 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
12309 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
12310 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
12311 // CHECK11:       omp.precond.end:
12312 // CHECK11-NEXT:    ret void
12313 //
12314 //
12315 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l59
12316 // CHECK11-SAME: (i32 noundef [[CH:%.*]], i32 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
12317 // CHECK11-NEXT:  entry:
12318 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32, align 4
12319 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
12320 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
12321 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 4
12322 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 4
12323 // CHECK11-NEXT:    store i32 [[CH]], i32* [[CH_ADDR]], align 4
12324 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
12325 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
12326 // CHECK11-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 4
12327 // CHECK11-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 4
12328 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* [[CH_ADDR]], i32* [[N_ADDR]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
12329 // CHECK11-NEXT:    ret void
12330 //
12331 //
12332 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..34
12333 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
12334 // CHECK11-NEXT:  entry:
12335 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12336 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12337 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 4
12338 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
12339 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
12340 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
12341 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
12342 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12343 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12344 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
12345 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
12346 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
12347 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
12348 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
12349 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12350 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12351 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
12352 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12353 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12354 // CHECK11-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 4
12355 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
12356 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
12357 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
12358 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
12359 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 4
12360 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 4
12361 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
12362 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
12363 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
12364 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP1]], align 4
12365 // CHECK11-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
12366 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12367 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP6]], 0
12368 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12369 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
12370 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12371 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
12372 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12373 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP7]]
12374 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12375 // CHECK11:       omp.precond.then:
12376 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
12377 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12378 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_COMB_UB]], align 4
12379 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12380 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12381 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP0]], align 4
12382 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12383 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
12384 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP9]])
12385 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12386 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12387 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
12388 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12389 // CHECK11:       cond.true:
12390 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12391 // CHECK11-NEXT:    br label [[COND_END:%.*]]
12392 // CHECK11:       cond.false:
12393 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12394 // CHECK11-NEXT:    br label [[COND_END]]
12395 // CHECK11:       cond.end:
12396 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
12397 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
12398 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12399 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
12400 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12401 // CHECK11:       omp.inner.for.cond:
12402 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12403 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12404 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], 1
12405 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp slt i32 [[TMP17]], [[ADD]]
12406 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12407 // CHECK11:       omp.inner.for.body:
12408 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12409 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12410 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32**, i32**, i32**)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32 [[TMP19]], i32 [[TMP20]], i32* [[TMP1]], i32** [[TMP2]], i32** [[TMP3]], i32** [[TMP4]])
12411 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12412 // CHECK11:       omp.inner.for.inc:
12413 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12414 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
12415 // CHECK11-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
12416 // CHECK11-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
12417 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12418 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
12419 // CHECK11-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
12420 // CHECK11-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_COMB_LB]], align 4
12421 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12422 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
12423 // CHECK11-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
12424 // CHECK11-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_UB]], align 4
12425 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12426 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12427 // CHECK11-NEXT:    [[CMP9:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
12428 // CHECK11-NEXT:    br i1 [[CMP9]], label [[COND_TRUE10:%.*]], label [[COND_FALSE11:%.*]]
12429 // CHECK11:       cond.true10:
12430 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12431 // CHECK11-NEXT:    br label [[COND_END12:%.*]]
12432 // CHECK11:       cond.false11:
12433 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12434 // CHECK11-NEXT:    br label [[COND_END12]]
12435 // CHECK11:       cond.end12:
12436 // CHECK11-NEXT:    [[COND13:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE10]] ], [ [[TMP30]], [[COND_FALSE11]] ]
12437 // CHECK11-NEXT:    store i32 [[COND13]], i32* [[DOTOMP_COMB_UB]], align 4
12438 // CHECK11-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12439 // CHECK11-NEXT:    store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4
12440 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
12441 // CHECK11:       omp.inner.for.end:
12442 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12443 // CHECK11:       omp.loop.exit:
12444 // CHECK11-NEXT:    [[TMP32:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12445 // CHECK11-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
12446 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]])
12447 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
12448 // CHECK11:       omp.precond.end:
12449 // CHECK11-NEXT:    ret void
12450 //
12451 //
12452 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..35
12453 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
12454 // CHECK11-NEXT:  entry:
12455 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12456 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12457 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
12458 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
12459 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
12460 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
12461 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
12462 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
12463 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12464 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12465 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
12466 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
12467 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
12468 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
12469 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
12470 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12471 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12472 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
12473 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12474 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12475 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12476 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12477 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
12478 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
12479 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
12480 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
12481 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
12482 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
12483 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
12484 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
12485 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
12486 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
12487 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12488 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
12489 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12490 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
12491 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12492 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
12493 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12494 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
12495 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12496 // CHECK11:       omp.precond.then:
12497 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
12498 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12499 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
12500 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12501 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12502 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
12503 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
12504 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12505 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12506 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12507 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
12508 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12509 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12510 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12511 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
12512 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12513 // CHECK11:       cond.true:
12514 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12515 // CHECK11-NEXT:    br label [[COND_END:%.*]]
12516 // CHECK11:       cond.false:
12517 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12518 // CHECK11-NEXT:    br label [[COND_END]]
12519 // CHECK11:       cond.end:
12520 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
12521 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
12522 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12523 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
12524 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12525 // CHECK11:       omp.inner.for.cond:
12526 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12527 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12528 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
12529 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12530 // CHECK11:       omp.inner.for.body:
12531 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12532 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
12533 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
12534 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
12535 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[TMP2]], align 4
12536 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
12537 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP20]], i32 [[TMP21]]
12538 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
12539 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[TMP3]], align 4
12540 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
12541 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, i32* [[TMP23]], i32 [[TMP24]]
12542 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4
12543 // CHECK11-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP22]], [[TMP25]]
12544 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32*, i32** [[TMP1]], align 4
12545 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
12546 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i32 [[TMP27]]
12547 // CHECK11-NEXT:    store i32 [[ADD7]], i32* [[ARRAYIDX8]], align 4
12548 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
12549 // CHECK11:       omp.body.continue:
12550 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12551 // CHECK11:       omp.inner.for.inc:
12552 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12553 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP28]], 1
12554 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
12555 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
12556 // CHECK11:       omp.inner.for.end:
12557 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12558 // CHECK11:       omp.loop.exit:
12559 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12560 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
12561 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
12562 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
12563 // CHECK11:       omp.precond.end:
12564 // CHECK11-NEXT:    ret void
12565 //
12566 //
12567 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l67
12568 // CHECK11-SAME: (i32 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
12569 // CHECK11-NEXT:  entry:
12570 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
12571 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
12572 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 4
12573 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 4
12574 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
12575 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
12576 // CHECK11-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 4
12577 // CHECK11-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 4
12578 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..38 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
12579 // CHECK11-NEXT:    ret void
12580 //
12581 //
12582 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..38
12583 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
12584 // CHECK11-NEXT:  entry:
12585 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12586 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12587 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
12588 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
12589 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
12590 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
12591 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12592 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12593 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
12594 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
12595 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
12596 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
12597 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
12598 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12599 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12600 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
12601 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12602 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12603 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
12604 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
12605 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
12606 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
12607 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
12608 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
12609 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
12610 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
12611 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
12612 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
12613 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12614 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
12615 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12616 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
12617 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12618 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
12619 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12620 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
12621 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12622 // CHECK11:       omp.precond.then:
12623 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
12624 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12625 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
12626 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12627 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12628 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12629 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
12630 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12631 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12632 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12633 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
12634 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12635 // CHECK11:       cond.true:
12636 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12637 // CHECK11-NEXT:    br label [[COND_END:%.*]]
12638 // CHECK11:       cond.false:
12639 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12640 // CHECK11-NEXT:    br label [[COND_END]]
12641 // CHECK11:       cond.end:
12642 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
12643 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
12644 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12645 // CHECK11-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
12646 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12647 // CHECK11:       omp.inner.for.cond:
12648 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12649 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12650 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
12651 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12652 // CHECK11:       omp.inner.for.body:
12653 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12654 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12655 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32**, i32**, i32**)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], i32** [[TMP1]], i32** [[TMP2]], i32** [[TMP3]])
12656 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12657 // CHECK11:       omp.inner.for.inc:
12658 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12659 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
12660 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
12661 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
12662 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
12663 // CHECK11:       omp.inner.for.end:
12664 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12665 // CHECK11:       omp.loop.exit:
12666 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12667 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
12668 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
12669 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
12670 // CHECK11:       omp.precond.end:
12671 // CHECK11-NEXT:    ret void
12672 //
12673 //
12674 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..39
12675 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
12676 // CHECK11-NEXT:  entry:
12677 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12678 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12679 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
12680 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
12681 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
12682 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
12683 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
12684 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
12685 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12686 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12687 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
12688 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
12689 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
12690 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
12691 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
12692 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12693 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12694 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
12695 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12696 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12697 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12698 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12699 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
12700 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
12701 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
12702 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
12703 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
12704 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
12705 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
12706 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
12707 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
12708 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
12709 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12710 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
12711 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12712 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
12713 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12714 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
12715 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12716 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
12717 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12718 // CHECK11:       omp.precond.then:
12719 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
12720 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12721 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
12722 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12723 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12724 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
12725 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
12726 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12727 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12728 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12729 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
12730 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP11]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12731 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12732 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12733 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
12734 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12735 // CHECK11:       cond.true:
12736 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12737 // CHECK11-NEXT:    br label [[COND_END:%.*]]
12738 // CHECK11:       cond.false:
12739 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12740 // CHECK11-NEXT:    br label [[COND_END]]
12741 // CHECK11:       cond.end:
12742 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
12743 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
12744 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12745 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
12746 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12747 // CHECK11:       omp.inner.for.cond:
12748 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12749 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12750 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
12751 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12752 // CHECK11:       omp.inner.for.body:
12753 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12754 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
12755 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
12756 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
12757 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[TMP2]], align 4
12758 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I3]], align 4
12759 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP20]], i32 [[TMP21]]
12760 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
12761 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[TMP3]], align 4
12762 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I3]], align 4
12763 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, i32* [[TMP23]], i32 [[TMP24]]
12764 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4
12765 // CHECK11-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP22]], [[TMP25]]
12766 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32*, i32** [[TMP1]], align 4
12767 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I3]], align 4
12768 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i32 [[TMP27]]
12769 // CHECK11-NEXT:    store i32 [[ADD7]], i32* [[ARRAYIDX8]], align 4
12770 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
12771 // CHECK11:       omp.body.continue:
12772 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12773 // CHECK11:       omp.inner.for.inc:
12774 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12775 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP28]], 1
12776 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
12777 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
12778 // CHECK11:       omp.inner.for.end:
12779 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12780 // CHECK11:       omp.loop.exit:
12781 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12782 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4
12783 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]])
12784 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
12785 // CHECK11:       omp.precond.end:
12786 // CHECK11-NEXT:    ret void
12787 //
12788 //
12789 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l75
12790 // CHECK11-SAME: (i32 noundef [[CH:%.*]], i32 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
12791 // CHECK11-NEXT:  entry:
12792 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32, align 4
12793 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
12794 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
12795 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 4
12796 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 4
12797 // CHECK11-NEXT:    store i32 [[CH]], i32* [[CH_ADDR]], align 4
12798 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
12799 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
12800 // CHECK11-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 4
12801 // CHECK11-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 4
12802 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..42 to void (i32*, i32*, ...)*), i32* [[CH_ADDR]], i32* [[N_ADDR]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
12803 // CHECK11-NEXT:    ret void
12804 //
12805 //
12806 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..42
12807 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
12808 // CHECK11-NEXT:  entry:
12809 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12810 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12811 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 4
12812 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
12813 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
12814 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
12815 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
12816 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
12817 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12818 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12819 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
12820 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
12821 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
12822 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
12823 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
12824 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12825 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12826 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
12827 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
12828 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12829 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12830 // CHECK11-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 4
12831 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
12832 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
12833 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
12834 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
12835 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 4
12836 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 4
12837 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
12838 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
12839 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
12840 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
12841 // CHECK11-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
12842 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
12843 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12844 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12845 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
12846 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12847 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
12848 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
12849 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
12850 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12851 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
12852 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12853 // CHECK11:       omp.precond.then:
12854 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
12855 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
12856 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
12857 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12858 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12859 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12860 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
12861 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12862 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12863 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
12864 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
12865 // CHECK11-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12866 // CHECK11:       cond.true:
12867 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
12868 // CHECK11-NEXT:    br label [[COND_END:%.*]]
12869 // CHECK11:       cond.false:
12870 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12871 // CHECK11-NEXT:    br label [[COND_END]]
12872 // CHECK11:       cond.end:
12873 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
12874 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
12875 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12876 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
12877 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12878 // CHECK11:       omp.inner.for.cond:
12879 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12880 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12881 // CHECK11-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
12882 // CHECK11-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12883 // CHECK11:       omp.inner.for.body:
12884 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12885 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12886 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12887 // CHECK11-NEXT:    store i32 [[TMP21]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
12888 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
12889 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32**, i32**, i32**, i32)* @.omp_outlined..43 to void (i32*, i32*, ...)*), i32 [[TMP19]], i32 [[TMP20]], i32* [[TMP1]], i32** [[TMP2]], i32** [[TMP3]], i32** [[TMP4]], i32 [[TMP22]])
12890 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12891 // CHECK11:       omp.inner.for.inc:
12892 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12893 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
12894 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
12895 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
12896 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
12897 // CHECK11:       omp.inner.for.end:
12898 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12899 // CHECK11:       omp.loop.exit:
12900 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12901 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
12902 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP26]])
12903 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
12904 // CHECK11:       omp.precond.end:
12905 // CHECK11-NEXT:    ret void
12906 //
12907 //
12908 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..43
12909 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
12910 // CHECK11-NEXT:  entry:
12911 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12912 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12913 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
12914 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
12915 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
12916 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
12917 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
12918 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
12919 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
12920 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12921 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12922 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
12923 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
12924 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
12925 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
12926 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
12927 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12928 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12929 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
12930 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12931 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12932 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12933 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12934 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
12935 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
12936 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
12937 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
12938 // CHECK11-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
12939 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
12940 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
12941 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
12942 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
12943 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
12944 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12945 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12946 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
12947 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12948 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
12949 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
12950 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
12951 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12952 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
12953 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12954 // CHECK11:       omp.precond.then:
12955 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
12956 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
12957 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
12958 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12959 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12960 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
12961 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
12962 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12963 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12964 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
12965 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12966 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
12967 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP12]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP10]])
12968 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
12969 // CHECK11:       omp.dispatch.cond:
12970 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12971 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12972 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP13]], [[TMP14]]
12973 // CHECK11-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12974 // CHECK11:       cond.true:
12975 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12976 // CHECK11-NEXT:    br label [[COND_END:%.*]]
12977 // CHECK11:       cond.false:
12978 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12979 // CHECK11-NEXT:    br label [[COND_END]]
12980 // CHECK11:       cond.end:
12981 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP15]], [[COND_TRUE]] ], [ [[TMP16]], [[COND_FALSE]] ]
12982 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
12983 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12984 // CHECK11-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
12985 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12986 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12987 // CHECK11-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
12988 // CHECK11-NEXT:    br i1 [[CMP6]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
12989 // CHECK11:       omp.dispatch.body:
12990 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12991 // CHECK11:       omp.inner.for.cond:
12992 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12993 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12994 // CHECK11-NEXT:    [[CMP7:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]
12995 // CHECK11-NEXT:    br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12996 // CHECK11:       omp.inner.for.body:
12997 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12998 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP22]], 1
12999 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
13000 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
13001 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32*, i32** [[TMP2]], align 4
13002 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[I4]], align 4
13003 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP23]], i32 [[TMP24]]
13004 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
13005 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32*, i32** [[TMP3]], align 4
13006 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[I4]], align 4
13007 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i32 [[TMP27]]
13008 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[ARRAYIDX8]], align 4
13009 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP25]], [[TMP28]]
13010 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32*, i32** [[TMP1]], align 4
13011 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[I4]], align 4
13012 // CHECK11-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds i32, i32* [[TMP29]], i32 [[TMP30]]
13013 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[ARRAYIDX10]], align 4
13014 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
13015 // CHECK11:       omp.body.continue:
13016 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13017 // CHECK11:       omp.inner.for.inc:
13018 // CHECK11-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
13019 // CHECK11-NEXT:    [[ADD11:%.*]] = add nsw i32 [[TMP31]], 1
13020 // CHECK11-NEXT:    store i32 [[ADD11]], i32* [[DOTOMP_IV]], align 4
13021 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
13022 // CHECK11:       omp.inner.for.end:
13023 // CHECK11-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
13024 // CHECK11:       omp.dispatch.inc:
13025 // CHECK11-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13026 // CHECK11-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
13027 // CHECK11-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP32]], [[TMP33]]
13028 // CHECK11-NEXT:    store i32 [[ADD12]], i32* [[DOTOMP_LB]], align 4
13029 // CHECK11-NEXT:    [[TMP34:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
13030 // CHECK11-NEXT:    [[TMP35:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
13031 // CHECK11-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP34]], [[TMP35]]
13032 // CHECK11-NEXT:    store i32 [[ADD13]], i32* [[DOTOMP_UB]], align 4
13033 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND]]
13034 // CHECK11:       omp.dispatch.end:
13035 // CHECK11-NEXT:    [[TMP36:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13036 // CHECK11-NEXT:    [[TMP37:%.*]] = load i32, i32* [[TMP36]], align 4
13037 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP37]])
13038 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
13039 // CHECK11:       omp.precond.end:
13040 // CHECK11-NEXT:    ret void
13041 //
13042 //
13043 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l83
13044 // CHECK11-SAME: (i32 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
13045 // CHECK11-NEXT:  entry:
13046 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
13047 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
13048 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 4
13049 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 4
13050 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
13051 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
13052 // CHECK11-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 4
13053 // CHECK11-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 4
13054 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..46 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
13055 // CHECK11-NEXT:    ret void
13056 //
13057 //
13058 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..46
13059 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
13060 // CHECK11-NEXT:  entry:
13061 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
13062 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
13063 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
13064 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
13065 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
13066 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
13067 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
13068 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13069 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
13070 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
13071 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
13072 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
13073 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
13074 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
13075 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
13076 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
13077 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
13078 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
13079 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
13080 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
13081 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
13082 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
13083 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
13084 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
13085 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
13086 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
13087 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
13088 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
13089 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13090 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
13091 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
13092 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
13093 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
13094 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
13095 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13096 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
13097 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
13098 // CHECK11:       omp.precond.then:
13099 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
13100 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13101 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_COMB_UB]], align 4
13102 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13103 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13104 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13105 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
13106 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
13107 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13108 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13109 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
13110 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
13111 // CHECK11:       cond.true:
13112 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13113 // CHECK11-NEXT:    br label [[COND_END:%.*]]
13114 // CHECK11:       cond.false:
13115 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13116 // CHECK11-NEXT:    br label [[COND_END]]
13117 // CHECK11:       cond.end:
13118 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
13119 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
13120 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
13121 // CHECK11-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
13122 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
13123 // CHECK11:       omp.inner.for.cond:
13124 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
13125 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13126 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
13127 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
13128 // CHECK11:       omp.inner.for.body:
13129 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
13130 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13131 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32**, i32**, i32**)* @.omp_outlined..47 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], i32** [[TMP1]], i32** [[TMP2]], i32** [[TMP3]])
13132 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13133 // CHECK11:       omp.inner.for.inc:
13134 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
13135 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
13136 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
13137 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
13138 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
13139 // CHECK11:       omp.inner.for.end:
13140 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
13141 // CHECK11:       omp.loop.exit:
13142 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13143 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
13144 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
13145 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
13146 // CHECK11:       omp.precond.end:
13147 // CHECK11-NEXT:    ret void
13148 //
13149 //
13150 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..47
13151 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
13152 // CHECK11-NEXT:  entry:
13153 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
13154 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
13155 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
13156 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
13157 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
13158 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
13159 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
13160 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
13161 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
13162 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13163 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
13164 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
13165 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
13166 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
13167 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
13168 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
13169 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
13170 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
13171 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
13172 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
13173 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
13174 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
13175 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
13176 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
13177 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
13178 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
13179 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
13180 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
13181 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
13182 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
13183 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
13184 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_]], align 4
13185 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13186 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
13187 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
13188 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
13189 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
13190 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
13191 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13192 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
13193 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
13194 // CHECK11:       omp.precond.then:
13195 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
13196 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13197 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
13198 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
13199 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
13200 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
13201 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
13202 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13203 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13204 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13205 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
13206 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13207 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
13208 // CHECK11-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 35, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 1)
13209 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
13210 // CHECK11:       omp.dispatch.cond:
13211 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13212 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
13213 // CHECK11-NEXT:    [[TMP16:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP15]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
13214 // CHECK11-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
13215 // CHECK11-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
13216 // CHECK11:       omp.dispatch.body:
13217 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13218 // CHECK11-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
13219 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
13220 // CHECK11:       omp.inner.for.cond:
13221 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
13222 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !26
13223 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
13224 // CHECK11-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
13225 // CHECK11:       omp.inner.for.body:
13226 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
13227 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
13228 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
13229 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !26
13230 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[TMP2]], align 4, !llvm.access.group !26
13231 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !26
13232 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP21]], i32 [[TMP22]]
13233 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[ARRAYIDX]], align 4, !llvm.access.group !26
13234 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32*, i32** [[TMP3]], align 4, !llvm.access.group !26
13235 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !26
13236 // CHECK11-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, i32* [[TMP24]], i32 [[TMP25]]
13237 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[ARRAYIDX5]], align 4, !llvm.access.group !26
13238 // CHECK11-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP23]], [[TMP26]]
13239 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32*, i32** [[TMP1]], align 4, !llvm.access.group !26
13240 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !26
13241 // CHECK11-NEXT:    [[ARRAYIDX7:%.*]] = getelementptr inbounds i32, i32* [[TMP27]], i32 [[TMP28]]
13242 // CHECK11-NEXT:    store i32 [[ADD6]], i32* [[ARRAYIDX7]], align 4, !llvm.access.group !26
13243 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
13244 // CHECK11:       omp.body.continue:
13245 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13246 // CHECK11:       omp.inner.for.inc:
13247 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
13248 // CHECK11-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP29]], 1
13249 // CHECK11-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
13250 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP27:![0-9]+]]
13251 // CHECK11:       omp.inner.for.end:
13252 // CHECK11-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
13253 // CHECK11:       omp.dispatch.inc:
13254 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND]]
13255 // CHECK11:       omp.dispatch.end:
13256 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
13257 // CHECK11:       omp.precond.end:
13258 // CHECK11-NEXT:    ret void
13259 //
13260 //
13261 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l91
13262 // CHECK11-SAME: (i32 noundef [[CH:%.*]], i32 noundef [[N:%.*]], i32* noundef [[A:%.*]], i32* noundef [[B:%.*]], i32* noundef [[C:%.*]]) #[[ATTR1]] {
13263 // CHECK11-NEXT:  entry:
13264 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32, align 4
13265 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
13266 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
13267 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32*, align 4
13268 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32*, align 4
13269 // CHECK11-NEXT:    store i32 [[CH]], i32* [[CH_ADDR]], align 4
13270 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
13271 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
13272 // CHECK11-NEXT:    store i32* [[B]], i32** [[B_ADDR]], align 4
13273 // CHECK11-NEXT:    store i32* [[C]], i32** [[C_ADDR]], align 4
13274 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32**, i32**, i32**)* @.omp_outlined..50 to void (i32*, i32*, ...)*), i32* [[CH_ADDR]], i32* [[N_ADDR]], i32** [[A_ADDR]], i32** [[B_ADDR]], i32** [[C_ADDR]])
13275 // CHECK11-NEXT:    ret void
13276 //
13277 //
13278 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..50
13279 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[CH:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]]) #[[ATTR1]] {
13280 // CHECK11-NEXT:  entry:
13281 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
13282 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
13283 // CHECK11-NEXT:    [[CH_ADDR:%.*]] = alloca i32*, align 4
13284 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
13285 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
13286 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
13287 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
13288 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
13289 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
13290 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13291 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
13292 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
13293 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
13294 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
13295 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
13296 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
13297 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
13298 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
13299 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
13300 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
13301 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
13302 // CHECK11-NEXT:    store i32* [[CH]], i32** [[CH_ADDR]], align 4
13303 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
13304 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
13305 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
13306 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
13307 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[CH_ADDR]], align 4
13308 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[N_ADDR]], align 4
13309 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
13310 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
13311 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
13312 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP0]], align 4
13313 // CHECK11-NEXT:    store i32 [[TMP5]], i32* [[DOTCAPTURE_EXPR_]], align 4
13314 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4
13315 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTCAPTURE_EXPR_1]], align 4
13316 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13317 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP7]], 0
13318 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
13319 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
13320 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
13321 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
13322 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13323 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP8]]
13324 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
13325 // CHECK11:       omp.precond.then:
13326 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
13327 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
13328 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_COMB_UB]], align 4
13329 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13330 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13331 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13332 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[TMP10]], align 4
13333 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
13334 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13335 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
13336 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP12]], [[TMP13]]
13337 // CHECK11-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
13338 // CHECK11:       cond.true:
13339 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
13340 // CHECK11-NEXT:    br label [[COND_END:%.*]]
13341 // CHECK11:       cond.false:
13342 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13343 // CHECK11-NEXT:    br label [[COND_END]]
13344 // CHECK11:       cond.end:
13345 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]
13346 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
13347 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
13348 // CHECK11-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
13349 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
13350 // CHECK11:       omp.inner.for.cond:
13351 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
13352 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13353 // CHECK11-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
13354 // CHECK11-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
13355 // CHECK11:       omp.inner.for.body:
13356 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
13357 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13358 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13359 // CHECK11-NEXT:    store i32 [[TMP21]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
13360 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
13361 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 7, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32**, i32**, i32**, i32)* @.omp_outlined..51 to void (i32*, i32*, ...)*), i32 [[TMP19]], i32 [[TMP20]], i32* [[TMP1]], i32** [[TMP2]], i32** [[TMP3]], i32** [[TMP4]], i32 [[TMP22]])
13362 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13363 // CHECK11:       omp.inner.for.inc:
13364 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
13365 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
13366 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
13367 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
13368 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
13369 // CHECK11:       omp.inner.for.end:
13370 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
13371 // CHECK11:       omp.loop.exit:
13372 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13373 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[TMP25]], align 4
13374 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP26]])
13375 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
13376 // CHECK11:       omp.precond.end:
13377 // CHECK11-NEXT:    ret void
13378 //
13379 //
13380 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..51
13381 // CHECK11-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[B:%.*]], i32** noundef nonnull align 4 dereferenceable(4) [[C:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {
13382 // CHECK11-NEXT:  entry:
13383 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
13384 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
13385 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
13386 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
13387 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
13388 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32**, align 4
13389 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca i32**, align 4
13390 // CHECK11-NEXT:    [[C_ADDR:%.*]] = alloca i32**, align 4
13391 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
13392 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
13393 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13394 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
13395 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
13396 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
13397 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
13398 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
13399 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
13400 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
13401 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
13402 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
13403 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
13404 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
13405 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
13406 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
13407 // CHECK11-NEXT:    store i32** [[A]], i32*** [[A_ADDR]], align 4
13408 // CHECK11-NEXT:    store i32** [[B]], i32*** [[B_ADDR]], align 4
13409 // CHECK11-NEXT:    store i32** [[C]], i32*** [[C_ADDR]], align 4
13410 // CHECK11-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
13411 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
13412 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32**, i32*** [[A_ADDR]], align 4
13413 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32**, i32*** [[B_ADDR]], align 4
13414 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32**, i32*** [[C_ADDR]], align 4
13415 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP0]], align 4
13416 // CHECK11-NEXT:    store i32 [[TMP4]], i32* [[DOTCAPTURE_EXPR_1]], align 4
13417 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13418 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP5]], 0
13419 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
13420 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
13421 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
13422 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
13423 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13424 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
13425 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
13426 // CHECK11:       omp.precond.then:
13427 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
13428 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
13429 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_UB]], align 4
13430 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
13431 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
13432 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_LB]], align 4
13433 // CHECK11-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_UB]], align 4
13434 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13435 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13436 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
13437 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13438 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
13439 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13440 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
13441 // CHECK11-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32 35, i32 [[TMP11]], i32 [[TMP12]], i32 1, i32 [[TMP10]])
13442 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
13443 // CHECK11:       omp.dispatch.cond:
13444 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13445 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4
13446 // CHECK11-NEXT:    [[TMP17:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP16]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
13447 // CHECK11-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP17]], 0
13448 // CHECK11-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
13449 // CHECK11:       omp.dispatch.body:
13450 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13451 // CHECK11-NEXT:    store i32 [[TMP18]], i32* [[DOTOMP_IV]], align 4
13452 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
13453 // CHECK11:       omp.inner.for.cond:
13454 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
13455 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !29
13456 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP19]], [[TMP20]]
13457 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
13458 // CHECK11:       omp.inner.for.body:
13459 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
13460 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP21]], 1
13461 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
13462 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !29
13463 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[TMP2]], align 4, !llvm.access.group !29
13464 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !29
13465 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP22]], i32 [[TMP23]]
13466 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[ARRAYIDX]], align 4, !llvm.access.group !29
13467 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32*, i32** [[TMP3]], align 4, !llvm.access.group !29
13468 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !29
13469 // CHECK11-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, i32* [[TMP25]], i32 [[TMP26]]
13470 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4, !llvm.access.group !29
13471 // CHECK11-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP24]], [[TMP27]]
13472 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32*, i32** [[TMP1]], align 4, !llvm.access.group !29
13473 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !29
13474 // CHECK11-NEXT:    [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP28]], i32 [[TMP29]]
13475 // CHECK11-NEXT:    store i32 [[ADD7]], i32* [[ARRAYIDX8]], align 4, !llvm.access.group !29
13476 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
13477 // CHECK11:       omp.body.continue:
13478 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13479 // CHECK11:       omp.inner.for.inc:
13480 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
13481 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP30]], 1
13482 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
13483 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP30:![0-9]+]]
13484 // CHECK11:       omp.inner.for.end:
13485 // CHECK11-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
13486 // CHECK11:       omp.dispatch.inc:
13487 // CHECK11-NEXT:    br label [[OMP_DISPATCH_COND]]
13488 // CHECK11:       omp.dispatch.end:
13489 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
13490 // CHECK11:       omp.precond.end:
13491 // CHECK11-NEXT:    ret void
13492 //
13493 //
13494 // CHECK11-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
13495 // CHECK11-SAME: () #[[ATTR4:[0-9]+]] {
13496 // CHECK11-NEXT:  entry:
13497 // CHECK11-NEXT:    call void @__tgt_register_requires(i64 1)
13498 // CHECK11-NEXT:    ret void
13499 //
13500