1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
2 // expected-no-diagnostics
3 #ifndef HEADER
4 #define HEADER
5 
6 // Test host codegen.
7 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1
8 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK2
9 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
10 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -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
11 
12 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
13 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -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=CHECK2
14 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK5
15 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK6
16 
17 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
18 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -fopenmp-version=45 -x c++ -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=CHECK5
19 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
20 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -x c++ -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=CHECK6
21 
22 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK9
23 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
24 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp-simd -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
25 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK11
26 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
27 // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp-simd -x c++ -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
28 #ifdef CK1
29 
30 template <typename T, int X, long long Y>
31 struct SS{
32   T a[X];
33   float b;
fooSS34   int foo(void) {
35 
36     #pragma omp target
37     #pragma omp teams distribute parallel for simd
38     for(int i = 0; i < X; i++) {
39       a[i] = (T)0;
40     }
41     #pragma omp target
42     #pragma omp teams distribute parallel for simd schedule(static)
43     for(int i = 0; i < X; i++) {
44       a[i] = (T)0;
45     }
46     #pragma omp target
47     #pragma omp teams distribute parallel for simd schedule(static, X/2)
48     for(int i = 0; i < X; i++) {
49       a[i] = (T)0;
50     }
51 
52     #pragma omp target
53     #pragma omp teams distribute parallel for simd schedule(dynamic)
54     for(int i = 0; i < X; i++) {
55       a[i] = (T)0;
56     }
57 
58     #pragma omp target
59     #pragma omp teams distribute parallel for simd schedule(dynamic, X/2)
60     for(int i = 0; i < X; i++) {
61       a[i] = (T)0;
62     }
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80     return a[0];
81   }
82 };
83 
teams_template_struct(void)84 int teams_template_struct(void) {
85   SS<int, 123, 456> V;
86   return V.foo();
87 
88 }
89 #endif // CK1
90 
91 // Test host codegen.
92 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK13
93 
94 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK14
95 
96 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
97 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -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=CHECK13
98 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
99 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp -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=CHECK14
100 
101 
102 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -verify -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK17
103 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
104 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp -fopenmp-version=45 -x c++ -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=CHECK17
105 
106 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK19
107 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
108 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp -x c++ -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=CHECK19
109 
110 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK21
111 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
112 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp-simd -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=CHECK21
113 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK23
114 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
115 // RUN: %clang_cc1 -no-opaque-pointers -DCK2 -fopenmp-simd -x c++ -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=CHECK23
116 #ifdef CK2
117 
118 template <typename T, int n>
tmain(T argc)119 int tmain(T argc) {
120   T a[n];
121   int m = 10;
122 #pragma omp target
123 #pragma omp teams distribute parallel for simd
124   for(int i = 0; i < n; i++) {
125     a[i] = (T)0;
126   }
127 #pragma omp target
128 #pragma omp teams distribute parallel for simd schedule(static)
129   for(int i = 0; i < n; i++) {
130     a[i] = (T)0;
131   }
132 #pragma omp target
133 #pragma omp teams distribute parallel for simd schedule(static, m)
134   for(int i = 0; i < n; i++) {
135     a[i] = (T)0;
136   }
137 #pragma omp target
138 #pragma omp teams distribute parallel for simd schedule(dynamic)
139   for(int i = 0; i < n; i++) {
140     a[i] = (T)0;
141   }
142 #pragma omp target
143 #pragma omp teams distribute parallel for simd schedule(dynamic, m)
144   for(int i = 0; i < n; i++) {
145     a[i] = (T)0;
146   }
147   return 0;
148 }
149 
main(int argc,char ** argv)150 int main (int argc, char **argv) {
151   int n = 100;
152   int a[n];
153   int m = 10;
154 #pragma omp target
155 #pragma omp teams distribute parallel for simd
156   for(int i = 0; i < n; i++) {
157     a[i] = 0;
158   }
159 #pragma omp target
160 #pragma omp teams distribute parallel for simd dist_schedule(static)
161   for(int i = 0; i < n; i++) {
162     a[i] = 0;
163   }
164 #pragma omp target
165 #pragma omp teams distribute parallel for simd dist_schedule(static, m)
166   for(int i = 0; i < n; i++) {
167     a[i] = 0;
168   }
169 #pragma omp target
170 #pragma omp teams distribute parallel for simd schedule(dynamic)
171   for(int i = 0; i < n; i++) {
172     a[i] = 0;
173   }
174 #pragma omp target
175 #pragma omp teams distribute parallel for simd schedule(dynamic, m)
176   for(int i = 0; i < n; i++) {
177     a[i] = 0;
178   }
179   return tmain<int, 10>(argc);
180 }
181 
182 
183 
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196 
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
207 
208 
209 
210 
211 
212 
213 
214 
215 
216 
217 
218 
219 #endif // CK2
220 #endif // #ifndef HEADER
221 // CHECK1-LABEL: define {{[^@]+}}@_Z21teams_template_structv
222 // CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
223 // CHECK1-NEXT:  entry:
224 // CHECK1-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
225 // CHECK1-NEXT:    [[CALL:%.*]] = call noundef signext i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* noundef nonnull align 4 dereferenceable(496) [[V]])
226 // CHECK1-NEXT:    ret i32 [[CALL]]
227 //
228 //
229 // CHECK1-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
230 // CHECK1-SAME: (%struct.SS* noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
231 // CHECK1-NEXT:  entry:
232 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
233 // CHECK1-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8
234 // CHECK1-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8
235 // CHECK1-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8
236 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
237 // CHECK1-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 8
238 // CHECK1-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 8
239 // CHECK1-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 8
240 // CHECK1-NEXT:    [[_TMP6:%.*]] = alloca i32, align 4
241 // CHECK1-NEXT:    [[DOTOFFLOAD_BASEPTRS11:%.*]] = alloca [1 x i8*], align 8
242 // CHECK1-NEXT:    [[DOTOFFLOAD_PTRS12:%.*]] = alloca [1 x i8*], align 8
243 // CHECK1-NEXT:    [[DOTOFFLOAD_MAPPERS13:%.*]] = alloca [1 x i8*], align 8
244 // CHECK1-NEXT:    [[_TMP14:%.*]] = alloca i32, align 4
245 // CHECK1-NEXT:    [[DOTOFFLOAD_BASEPTRS19:%.*]] = alloca [1 x i8*], align 8
246 // CHECK1-NEXT:    [[DOTOFFLOAD_PTRS20:%.*]] = alloca [1 x i8*], align 8
247 // CHECK1-NEXT:    [[DOTOFFLOAD_MAPPERS21:%.*]] = alloca [1 x i8*], align 8
248 // CHECK1-NEXT:    [[_TMP22:%.*]] = alloca i32, align 4
249 // CHECK1-NEXT:    [[DOTOFFLOAD_BASEPTRS27:%.*]] = alloca [1 x i8*], align 8
250 // CHECK1-NEXT:    [[DOTOFFLOAD_PTRS28:%.*]] = alloca [1 x i8*], align 8
251 // CHECK1-NEXT:    [[DOTOFFLOAD_MAPPERS29:%.*]] = alloca [1 x i8*], align 8
252 // CHECK1-NEXT:    [[_TMP30:%.*]] = alloca i32, align 4
253 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
254 // CHECK1-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
255 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
256 // CHECK1-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
257 // CHECK1-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to %struct.SS**
258 // CHECK1-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP1]], align 8
259 // CHECK1-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
260 // CHECK1-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [123 x i32]**
261 // CHECK1-NEXT:    store [123 x i32]* [[A]], [123 x i32]** [[TMP3]], align 8
262 // CHECK1-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
263 // CHECK1-NEXT:    store i8* null, i8** [[TMP4]], align 8
264 // CHECK1-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
265 // CHECK1-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
266 // CHECK1-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
267 // CHECK1-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
268 // CHECK1-NEXT:    store i32 1, i32* [[TMP7]], align 4
269 // CHECK1-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
270 // CHECK1-NEXT:    store i32 1, i32* [[TMP8]], align 4
271 // CHECK1-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
272 // CHECK1-NEXT:    store i8** [[TMP5]], i8*** [[TMP9]], align 8
273 // CHECK1-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
274 // CHECK1-NEXT:    store i8** [[TMP6]], i8*** [[TMP10]], align 8
275 // CHECK1-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
276 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64** [[TMP11]], align 8
277 // CHECK1-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
278 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP12]], align 8
279 // CHECK1-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
280 // CHECK1-NEXT:    store i8** null, i8*** [[TMP13]], align 8
281 // CHECK1-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
282 // CHECK1-NEXT:    store i8** null, i8*** [[TMP14]], align 8
283 // CHECK1-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
284 // CHECK1-NEXT:    store i64 123, i64* [[TMP15]], align 8
285 // CHECK1-NEXT:    [[TMP16:%.*]] = 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]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
286 // CHECK1-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
287 // CHECK1-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
288 // CHECK1:       omp_offload.failed:
289 // CHECK1-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36(%struct.SS* [[THIS1]]) #[[ATTR2:[0-9]+]]
290 // CHECK1-NEXT:    br label [[OMP_OFFLOAD_CONT]]
291 // CHECK1:       omp_offload.cont:
292 // CHECK1-NEXT:    [[A2:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
293 // CHECK1-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
294 // CHECK1-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to %struct.SS**
295 // CHECK1-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP19]], align 8
296 // CHECK1-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
297 // CHECK1-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [123 x i32]**
298 // CHECK1-NEXT:    store [123 x i32]* [[A2]], [123 x i32]** [[TMP21]], align 8
299 // CHECK1-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i64 0, i64 0
300 // CHECK1-NEXT:    store i8* null, i8** [[TMP22]], align 8
301 // CHECK1-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
302 // CHECK1-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
303 // CHECK1-NEXT:    [[KERNEL_ARGS7:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
304 // CHECK1-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 0
305 // CHECK1-NEXT:    store i32 1, i32* [[TMP25]], align 4
306 // CHECK1-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 1
307 // CHECK1-NEXT:    store i32 1, i32* [[TMP26]], align 4
308 // CHECK1-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 2
309 // CHECK1-NEXT:    store i8** [[TMP23]], i8*** [[TMP27]], align 8
310 // CHECK1-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 3
311 // CHECK1-NEXT:    store i8** [[TMP24]], i8*** [[TMP28]], align 8
312 // CHECK1-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 4
313 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.4, i32 0, i32 0), i64** [[TMP29]], align 8
314 // CHECK1-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 5
315 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP30]], align 8
316 // CHECK1-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 6
317 // CHECK1-NEXT:    store i8** null, i8*** [[TMP31]], align 8
318 // CHECK1-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 7
319 // CHECK1-NEXT:    store i8** null, i8*** [[TMP32]], align 8
320 // CHECK1-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 8
321 // CHECK1-NEXT:    store i64 123, i64* [[TMP33]], align 8
322 // CHECK1-NEXT:    [[TMP34:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]])
323 // CHECK1-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
324 // CHECK1-NEXT:    br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED8:%.*]], label [[OMP_OFFLOAD_CONT9:%.*]]
325 // CHECK1:       omp_offload.failed8:
326 // CHECK1-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41(%struct.SS* [[THIS1]]) #[[ATTR2]]
327 // CHECK1-NEXT:    br label [[OMP_OFFLOAD_CONT9]]
328 // CHECK1:       omp_offload.cont9:
329 // CHECK1-NEXT:    [[A10:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
330 // CHECK1-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS11]], i32 0, i32 0
331 // CHECK1-NEXT:    [[TMP37:%.*]] = bitcast i8** [[TMP36]] to %struct.SS**
332 // CHECK1-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP37]], align 8
333 // CHECK1-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS12]], i32 0, i32 0
334 // CHECK1-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to [123 x i32]**
335 // CHECK1-NEXT:    store [123 x i32]* [[A10]], [123 x i32]** [[TMP39]], align 8
336 // CHECK1-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS13]], i64 0, i64 0
337 // CHECK1-NEXT:    store i8* null, i8** [[TMP40]], align 8
338 // CHECK1-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS11]], i32 0, i32 0
339 // CHECK1-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS12]], i32 0, i32 0
340 // CHECK1-NEXT:    [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
341 // CHECK1-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 0
342 // CHECK1-NEXT:    store i32 1, i32* [[TMP43]], align 4
343 // CHECK1-NEXT:    [[TMP44:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 1
344 // CHECK1-NEXT:    store i32 1, i32* [[TMP44]], align 4
345 // CHECK1-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 2
346 // CHECK1-NEXT:    store i8** [[TMP41]], i8*** [[TMP45]], align 8
347 // CHECK1-NEXT:    [[TMP46:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 3
348 // CHECK1-NEXT:    store i8** [[TMP42]], i8*** [[TMP46]], align 8
349 // CHECK1-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 4
350 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64** [[TMP47]], align 8
351 // CHECK1-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 5
352 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP48]], align 8
353 // CHECK1-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 6
354 // CHECK1-NEXT:    store i8** null, i8*** [[TMP49]], align 8
355 // CHECK1-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 7
356 // CHECK1-NEXT:    store i8** null, i8*** [[TMP50]], align 8
357 // CHECK1-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 8
358 // CHECK1-NEXT:    store i64 123, i64* [[TMP51]], align 8
359 // CHECK1-NEXT:    [[TMP52:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]])
360 // CHECK1-NEXT:    [[TMP53:%.*]] = icmp ne i32 [[TMP52]], 0
361 // CHECK1-NEXT:    br i1 [[TMP53]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
362 // CHECK1:       omp_offload.failed16:
363 // CHECK1-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46(%struct.SS* [[THIS1]]) #[[ATTR2]]
364 // CHECK1-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
365 // CHECK1:       omp_offload.cont17:
366 // CHECK1-NEXT:    [[A18:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
367 // CHECK1-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
368 // CHECK1-NEXT:    [[TMP55:%.*]] = bitcast i8** [[TMP54]] to %struct.SS**
369 // CHECK1-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP55]], align 8
370 // CHECK1-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
371 // CHECK1-NEXT:    [[TMP57:%.*]] = bitcast i8** [[TMP56]] to [123 x i32]**
372 // CHECK1-NEXT:    store [123 x i32]* [[A18]], [123 x i32]** [[TMP57]], align 8
373 // CHECK1-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i64 0, i64 0
374 // CHECK1-NEXT:    store i8* null, i8** [[TMP58]], align 8
375 // CHECK1-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
376 // CHECK1-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
377 // CHECK1-NEXT:    [[KERNEL_ARGS23:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
378 // CHECK1-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 0
379 // CHECK1-NEXT:    store i32 1, i32* [[TMP61]], align 4
380 // CHECK1-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 1
381 // CHECK1-NEXT:    store i32 1, i32* [[TMP62]], align 4
382 // CHECK1-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 2
383 // CHECK1-NEXT:    store i8** [[TMP59]], i8*** [[TMP63]], align 8
384 // CHECK1-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 3
385 // CHECK1-NEXT:    store i8** [[TMP60]], i8*** [[TMP64]], align 8
386 // CHECK1-NEXT:    [[TMP65:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 4
387 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.12, i32 0, i32 0), i64** [[TMP65]], align 8
388 // CHECK1-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 5
389 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP66]], align 8
390 // CHECK1-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 6
391 // CHECK1-NEXT:    store i8** null, i8*** [[TMP67]], align 8
392 // CHECK1-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 7
393 // CHECK1-NEXT:    store i8** null, i8*** [[TMP68]], align 8
394 // CHECK1-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 8
395 // CHECK1-NEXT:    store i64 123, i64* [[TMP69]], align 8
396 // CHECK1-NEXT:    [[TMP70:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]])
397 // CHECK1-NEXT:    [[TMP71:%.*]] = icmp ne i32 [[TMP70]], 0
398 // CHECK1-NEXT:    br i1 [[TMP71]], label [[OMP_OFFLOAD_FAILED24:%.*]], label [[OMP_OFFLOAD_CONT25:%.*]]
399 // CHECK1:       omp_offload.failed24:
400 // CHECK1-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52(%struct.SS* [[THIS1]]) #[[ATTR2]]
401 // CHECK1-NEXT:    br label [[OMP_OFFLOAD_CONT25]]
402 // CHECK1:       omp_offload.cont25:
403 // CHECK1-NEXT:    [[A26:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
404 // CHECK1-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS27]], i32 0, i32 0
405 // CHECK1-NEXT:    [[TMP73:%.*]] = bitcast i8** [[TMP72]] to %struct.SS**
406 // CHECK1-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP73]], align 8
407 // CHECK1-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS28]], i32 0, i32 0
408 // CHECK1-NEXT:    [[TMP75:%.*]] = bitcast i8** [[TMP74]] to [123 x i32]**
409 // CHECK1-NEXT:    store [123 x i32]* [[A26]], [123 x i32]** [[TMP75]], align 8
410 // CHECK1-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS29]], i64 0, i64 0
411 // CHECK1-NEXT:    store i8* null, i8** [[TMP76]], align 8
412 // CHECK1-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS27]], i32 0, i32 0
413 // CHECK1-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS28]], i32 0, i32 0
414 // CHECK1-NEXT:    [[KERNEL_ARGS31:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
415 // CHECK1-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 0
416 // CHECK1-NEXT:    store i32 1, i32* [[TMP79]], align 4
417 // CHECK1-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 1
418 // CHECK1-NEXT:    store i32 1, i32* [[TMP80]], align 4
419 // CHECK1-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 2
420 // CHECK1-NEXT:    store i8** [[TMP77]], i8*** [[TMP81]], align 8
421 // CHECK1-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 3
422 // CHECK1-NEXT:    store i8** [[TMP78]], i8*** [[TMP82]], align 8
423 // CHECK1-NEXT:    [[TMP83:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 4
424 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.16, i32 0, i32 0), i64** [[TMP83]], align 8
425 // CHECK1-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 5
426 // CHECK1-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP84]], align 8
427 // CHECK1-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 6
428 // CHECK1-NEXT:    store i8** null, i8*** [[TMP85]], align 8
429 // CHECK1-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 7
430 // CHECK1-NEXT:    store i8** null, i8*** [[TMP86]], align 8
431 // CHECK1-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 8
432 // CHECK1-NEXT:    store i64 123, i64* [[TMP87]], align 8
433 // CHECK1-NEXT:    [[TMP88:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]])
434 // CHECK1-NEXT:    [[TMP89:%.*]] = icmp ne i32 [[TMP88]], 0
435 // CHECK1-NEXT:    br i1 [[TMP89]], label [[OMP_OFFLOAD_FAILED32:%.*]], label [[OMP_OFFLOAD_CONT33:%.*]]
436 // CHECK1:       omp_offload.failed32:
437 // CHECK1-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58(%struct.SS* [[THIS1]]) #[[ATTR2]]
438 // CHECK1-NEXT:    br label [[OMP_OFFLOAD_CONT33]]
439 // CHECK1:       omp_offload.cont33:
440 // CHECK1-NEXT:    [[A34:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
441 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A34]], i64 0, i64 0
442 // CHECK1-NEXT:    [[TMP90:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
443 // CHECK1-NEXT:    ret i32 [[TMP90]]
444 //
445 //
446 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36
447 // CHECK1-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {
448 // CHECK1-NEXT:  entry:
449 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
450 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
451 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
452 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
453 // CHECK1-NEXT:    ret void
454 //
455 //
456 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
457 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
458 // CHECK1-NEXT:  entry:
459 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
460 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
461 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
462 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
463 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
464 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
465 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
466 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
467 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
468 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
469 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
470 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
471 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
472 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
473 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
474 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
475 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
476 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
477 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
478 // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
479 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
480 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
481 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
482 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
483 // CHECK1:       cond.true:
484 // CHECK1-NEXT:    br label [[COND_END:%.*]]
485 // CHECK1:       cond.false:
486 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
487 // CHECK1-NEXT:    br label [[COND_END]]
488 // CHECK1:       cond.end:
489 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
490 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
491 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
492 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
493 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
494 // CHECK1:       omp.inner.for.cond:
495 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !8
496 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !8
497 // CHECK1-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
498 // CHECK1-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
499 // CHECK1:       omp.inner.for.body:
500 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !8
501 // CHECK1-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
502 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !8
503 // CHECK1-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
504 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !8
505 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
506 // CHECK1:       omp.inner.for.inc:
507 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !8
508 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !8
509 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
510 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !8
511 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP9:![0-9]+]]
512 // CHECK1:       omp.inner.for.end:
513 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
514 // CHECK1:       omp.loop.exit:
515 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
516 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
517 // CHECK1-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
518 // CHECK1-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
519 // CHECK1:       .omp.final.then:
520 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
521 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
522 // CHECK1:       .omp.final.done:
523 // CHECK1-NEXT:    ret void
524 //
525 //
526 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..1
527 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
528 // CHECK1-NEXT:  entry:
529 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
530 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
531 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
532 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
533 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
534 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
535 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
536 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
537 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
538 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
539 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
540 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
541 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
542 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
543 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
544 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
545 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
546 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
547 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
548 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
549 // CHECK1-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
550 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
551 // CHECK1-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
552 // CHECK1-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
553 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
554 // CHECK1-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
555 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
556 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
557 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
558 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
559 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
560 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
561 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
562 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
563 // CHECK1:       cond.true:
564 // CHECK1-NEXT:    br label [[COND_END:%.*]]
565 // CHECK1:       cond.false:
566 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
567 // CHECK1-NEXT:    br label [[COND_END]]
568 // CHECK1:       cond.end:
569 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
570 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
571 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
572 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
573 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
574 // CHECK1:       omp.inner.for.cond:
575 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
576 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !12
577 // CHECK1-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
578 // CHECK1-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
579 // CHECK1:       omp.inner.for.body:
580 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
581 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
582 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
583 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !12
584 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
585 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !12
586 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
587 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
588 // CHECK1-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !12
589 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
590 // CHECK1:       omp.body.continue:
591 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
592 // CHECK1:       omp.inner.for.inc:
593 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
594 // CHECK1-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
595 // CHECK1-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
596 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]
597 // CHECK1:       omp.inner.for.end:
598 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
599 // CHECK1:       omp.loop.exit:
600 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
601 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
602 // CHECK1-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
603 // CHECK1-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
604 // CHECK1:       .omp.final.then:
605 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
606 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
607 // CHECK1:       .omp.final.done:
608 // CHECK1-NEXT:    ret void
609 //
610 //
611 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41
612 // CHECK1-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
613 // CHECK1-NEXT:  entry:
614 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
615 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
616 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
617 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
618 // CHECK1-NEXT:    ret void
619 //
620 //
621 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..2
622 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
623 // CHECK1-NEXT:  entry:
624 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
625 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
626 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
627 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
628 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
629 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
630 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
631 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
632 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
633 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
634 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
635 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
636 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
637 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
638 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
639 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
640 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
641 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
642 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
643 // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
644 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
645 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
646 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
647 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
648 // CHECK1:       cond.true:
649 // CHECK1-NEXT:    br label [[COND_END:%.*]]
650 // CHECK1:       cond.false:
651 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
652 // CHECK1-NEXT:    br label [[COND_END]]
653 // CHECK1:       cond.end:
654 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
655 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
656 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
657 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
658 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
659 // CHECK1:       omp.inner.for.cond:
660 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
661 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !17
662 // CHECK1-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
663 // CHECK1-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
664 // CHECK1:       omp.inner.for.body:
665 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !17
666 // CHECK1-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
667 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !17
668 // CHECK1-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
669 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !17
670 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
671 // CHECK1:       omp.inner.for.inc:
672 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
673 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !17
674 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
675 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
676 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP18:![0-9]+]]
677 // CHECK1:       omp.inner.for.end:
678 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
679 // CHECK1:       omp.loop.exit:
680 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
681 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
682 // CHECK1-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
683 // CHECK1-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
684 // CHECK1:       .omp.final.then:
685 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
686 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
687 // CHECK1:       .omp.final.done:
688 // CHECK1-NEXT:    ret void
689 //
690 //
691 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..3
692 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
693 // CHECK1-NEXT:  entry:
694 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
695 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
696 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
697 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
698 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
699 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
700 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
701 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
702 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
703 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
704 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
705 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
706 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
707 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
708 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
709 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
710 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
711 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
712 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
713 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
714 // CHECK1-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
715 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
716 // CHECK1-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
717 // CHECK1-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
718 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
719 // CHECK1-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
720 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
721 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
722 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
723 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
724 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
725 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
726 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
727 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
728 // CHECK1:       cond.true:
729 // CHECK1-NEXT:    br label [[COND_END:%.*]]
730 // CHECK1:       cond.false:
731 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
732 // CHECK1-NEXT:    br label [[COND_END]]
733 // CHECK1:       cond.end:
734 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
735 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
736 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
737 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
738 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
739 // CHECK1:       omp.inner.for.cond:
740 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
741 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !20
742 // CHECK1-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
743 // CHECK1-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
744 // CHECK1:       omp.inner.for.body:
745 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
746 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
747 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
748 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !20
749 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
750 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !20
751 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
752 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
753 // CHECK1-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !20
754 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
755 // CHECK1:       omp.body.continue:
756 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
757 // CHECK1:       omp.inner.for.inc:
758 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
759 // CHECK1-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
760 // CHECK1-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
761 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP21:![0-9]+]]
762 // CHECK1:       omp.inner.for.end:
763 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
764 // CHECK1:       omp.loop.exit:
765 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
766 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
767 // CHECK1-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
768 // CHECK1-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
769 // CHECK1:       .omp.final.then:
770 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
771 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
772 // CHECK1:       .omp.final.done:
773 // CHECK1-NEXT:    ret void
774 //
775 //
776 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46
777 // CHECK1-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
778 // CHECK1-NEXT:  entry:
779 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
780 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
781 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
782 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
783 // CHECK1-NEXT:    ret void
784 //
785 //
786 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..6
787 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
788 // CHECK1-NEXT:  entry:
789 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
790 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
791 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
792 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
793 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
794 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
795 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
796 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
797 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
798 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
799 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
800 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
801 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
802 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
803 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
804 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
805 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
806 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
807 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
808 // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
809 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
810 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
811 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
812 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
813 // CHECK1:       cond.true:
814 // CHECK1-NEXT:    br label [[COND_END:%.*]]
815 // CHECK1:       cond.false:
816 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
817 // CHECK1-NEXT:    br label [[COND_END]]
818 // CHECK1:       cond.end:
819 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
820 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
821 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
822 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
823 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
824 // CHECK1:       omp.inner.for.cond:
825 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
826 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !23
827 // CHECK1-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
828 // CHECK1-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
829 // CHECK1:       omp.inner.for.body:
830 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !23
831 // CHECK1-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
832 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !23
833 // CHECK1-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
834 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !23
835 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
836 // CHECK1:       omp.inner.for.inc:
837 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
838 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !23
839 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
840 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
841 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP24:![0-9]+]]
842 // CHECK1:       omp.inner.for.end:
843 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
844 // CHECK1:       omp.loop.exit:
845 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
846 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
847 // CHECK1-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
848 // CHECK1-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
849 // CHECK1:       .omp.final.then:
850 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
851 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
852 // CHECK1:       .omp.final.done:
853 // CHECK1-NEXT:    ret void
854 //
855 //
856 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..7
857 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
858 // CHECK1-NEXT:  entry:
859 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
860 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
861 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
862 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
863 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
864 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
865 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
866 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
867 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
868 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
869 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
870 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
871 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
872 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
873 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
874 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
875 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
876 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
877 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
878 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
879 // CHECK1-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
880 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
881 // CHECK1-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
882 // CHECK1-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
883 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
884 // CHECK1-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
885 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
886 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
887 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
888 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
889 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 61)
890 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
891 // CHECK1:       omp.dispatch.cond:
892 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
893 // CHECK1-NEXT:    [[TMP6:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
894 // CHECK1-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP6]] to i32
895 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], [[CONV2]]
896 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
897 // CHECK1:       cond.true:
898 // CHECK1-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
899 // CHECK1-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP7]] to i32
900 // CHECK1-NEXT:    br label [[COND_END:%.*]]
901 // CHECK1:       cond.false:
902 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
903 // CHECK1-NEXT:    br label [[COND_END]]
904 // CHECK1:       cond.end:
905 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[CONV3]], [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]
906 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
907 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
908 // CHECK1-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_IV]], align 4
909 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
910 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
911 // CHECK1-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]
912 // CHECK1-NEXT:    br i1 [[CMP4]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
913 // CHECK1:       omp.dispatch.body:
914 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
915 // CHECK1:       omp.inner.for.cond:
916 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
917 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !26
918 // CHECK1-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]
919 // CHECK1-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
920 // CHECK1:       omp.inner.for.body:
921 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
922 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP14]], 1
923 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
924 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !26
925 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
926 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !26
927 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP15]] to i64
928 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
929 // CHECK1-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !26
930 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
931 // CHECK1:       omp.body.continue:
932 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
933 // CHECK1:       omp.inner.for.inc:
934 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
935 // CHECK1-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP16]], 1
936 // CHECK1-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
937 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP27:![0-9]+]]
938 // CHECK1:       omp.inner.for.end:
939 // CHECK1-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
940 // CHECK1:       omp.dispatch.inc:
941 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
942 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
943 // CHECK1-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]
944 // CHECK1-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_LB]], align 4
945 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
946 // CHECK1-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
947 // CHECK1-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
948 // CHECK1-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_UB]], align 4
949 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND]]
950 // CHECK1:       omp.dispatch.end:
951 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
952 // CHECK1-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
953 // CHECK1-NEXT:    [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0
954 // CHECK1-NEXT:    br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
955 // CHECK1:       .omp.final.then:
956 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
957 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
958 // CHECK1:       .omp.final.done:
959 // CHECK1-NEXT:    ret void
960 //
961 //
962 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52
963 // CHECK1-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
964 // CHECK1-NEXT:  entry:
965 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
966 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
967 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
968 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
969 // CHECK1-NEXT:    ret void
970 //
971 //
972 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..10
973 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
974 // CHECK1-NEXT:  entry:
975 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
976 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
977 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
978 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
979 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
980 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
981 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
982 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
983 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
984 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
985 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
986 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
987 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
988 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
989 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
990 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
991 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
992 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
993 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
994 // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
995 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
996 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
997 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
998 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
999 // CHECK1:       cond.true:
1000 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1001 // CHECK1:       cond.false:
1002 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1003 // CHECK1-NEXT:    br label [[COND_END]]
1004 // CHECK1:       cond.end:
1005 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1006 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1007 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1008 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1009 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1010 // CHECK1:       omp.inner.for.cond:
1011 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
1012 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
1013 // CHECK1-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
1014 // CHECK1-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1015 // CHECK1:       omp.inner.for.body:
1016 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
1017 // CHECK1-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
1018 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
1019 // CHECK1-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
1020 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !29
1021 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1022 // CHECK1:       omp.inner.for.inc:
1023 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
1024 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !29
1025 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
1026 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
1027 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP30:![0-9]+]]
1028 // CHECK1:       omp.inner.for.end:
1029 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1030 // CHECK1:       omp.loop.exit:
1031 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1032 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
1033 // CHECK1-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
1034 // CHECK1-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
1035 // CHECK1:       .omp.final.then:
1036 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
1037 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
1038 // CHECK1:       .omp.final.done:
1039 // CHECK1-NEXT:    ret void
1040 //
1041 //
1042 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..11
1043 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1044 // CHECK1-NEXT:  entry:
1045 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1046 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1047 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1048 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1049 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1050 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1051 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1052 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1053 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1054 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1055 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1056 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1057 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1058 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1059 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1060 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1061 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1062 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1063 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1064 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1065 // CHECK1-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1066 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
1067 // CHECK1-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1068 // CHECK1-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
1069 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1070 // CHECK1-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
1071 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1072 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1073 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1074 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1075 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1076 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
1077 // CHECK1-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 35, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 1)
1078 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
1079 // CHECK1:       omp.dispatch.cond:
1080 // CHECK1-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
1081 // CHECK1-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
1082 // CHECK1-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
1083 // CHECK1:       omp.dispatch.body:
1084 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1085 // CHECK1-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
1086 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1087 // CHECK1:       omp.inner.for.cond:
1088 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
1089 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !32
1090 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
1091 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1092 // CHECK1:       omp.inner.for.body:
1093 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
1094 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
1095 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1096 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !32
1097 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
1098 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !32
1099 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP12]] to i64
1100 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
1101 // CHECK1-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !32
1102 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1103 // CHECK1:       omp.body.continue:
1104 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1105 // CHECK1:       omp.inner.for.inc:
1106 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
1107 // CHECK1-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP13]], 1
1108 // CHECK1-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
1109 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP33:![0-9]+]]
1110 // CHECK1:       omp.inner.for.end:
1111 // CHECK1-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
1112 // CHECK1:       omp.dispatch.inc:
1113 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND]]
1114 // CHECK1:       omp.dispatch.end:
1115 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
1116 // CHECK1-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
1117 // CHECK1-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
1118 // CHECK1:       .omp.final.then:
1119 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
1120 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
1121 // CHECK1:       .omp.final.done:
1122 // CHECK1-NEXT:    ret void
1123 //
1124 //
1125 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58
1126 // CHECK1-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1127 // CHECK1-NEXT:  entry:
1128 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1129 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1130 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1131 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..14 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
1132 // CHECK1-NEXT:    ret void
1133 //
1134 //
1135 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..14
1136 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1137 // CHECK1-NEXT:  entry:
1138 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1139 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1140 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1141 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1142 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1143 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1144 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1145 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1146 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1147 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1148 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1149 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1150 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1151 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1152 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1153 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
1154 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1155 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1156 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1157 // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
1158 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1159 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1160 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
1161 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1162 // CHECK1:       cond.true:
1163 // CHECK1-NEXT:    br label [[COND_END:%.*]]
1164 // CHECK1:       cond.false:
1165 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1166 // CHECK1-NEXT:    br label [[COND_END]]
1167 // CHECK1:       cond.end:
1168 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1169 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1170 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1171 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1172 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1173 // CHECK1:       omp.inner.for.cond:
1174 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
1175 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !35
1176 // CHECK1-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
1177 // CHECK1-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1178 // CHECK1:       omp.inner.for.body:
1179 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !35
1180 // CHECK1-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
1181 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !35
1182 // CHECK1-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
1183 // CHECK1-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !35
1184 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1185 // CHECK1:       omp.inner.for.inc:
1186 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
1187 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !35
1188 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
1189 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
1190 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP36:![0-9]+]]
1191 // CHECK1:       omp.inner.for.end:
1192 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1193 // CHECK1:       omp.loop.exit:
1194 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1195 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
1196 // CHECK1-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
1197 // CHECK1-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
1198 // CHECK1:       .omp.final.then:
1199 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
1200 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
1201 // CHECK1:       .omp.final.done:
1202 // CHECK1-NEXT:    ret void
1203 //
1204 //
1205 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..15
1206 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1207 // CHECK1-NEXT:  entry:
1208 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1209 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1210 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1211 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1212 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1213 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1214 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1215 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1216 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1217 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1218 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1219 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
1220 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1221 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1222 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1223 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1224 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1225 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1226 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1227 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1228 // CHECK1-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1229 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
1230 // CHECK1-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1231 // CHECK1-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
1232 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1233 // CHECK1-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
1234 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1235 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1236 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1237 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1238 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1239 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
1240 // CHECK1-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 35, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 61)
1241 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
1242 // CHECK1:       omp.dispatch.cond:
1243 // CHECK1-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
1244 // CHECK1-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
1245 // CHECK1-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
1246 // CHECK1:       omp.dispatch.body:
1247 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1248 // CHECK1-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
1249 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1250 // CHECK1:       omp.inner.for.cond:
1251 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
1252 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !38
1253 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
1254 // CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1255 // CHECK1:       omp.inner.for.body:
1256 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
1257 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
1258 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1259 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !38
1260 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
1261 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !38
1262 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP12]] to i64
1263 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
1264 // CHECK1-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !38
1265 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1266 // CHECK1:       omp.body.continue:
1267 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1268 // CHECK1:       omp.inner.for.inc:
1269 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
1270 // CHECK1-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP13]], 1
1271 // CHECK1-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
1272 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP39:![0-9]+]]
1273 // CHECK1:       omp.inner.for.end:
1274 // CHECK1-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
1275 // CHECK1:       omp.dispatch.inc:
1276 // CHECK1-NEXT:    br label [[OMP_DISPATCH_COND]]
1277 // CHECK1:       omp.dispatch.end:
1278 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
1279 // CHECK1-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
1280 // CHECK1-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
1281 // CHECK1:       .omp.final.then:
1282 // CHECK1-NEXT:    store i32 123, i32* [[I]], align 4
1283 // CHECK1-NEXT:    br label [[DOTOMP_FINAL_DONE]]
1284 // CHECK1:       .omp.final.done:
1285 // CHECK1-NEXT:    ret void
1286 //
1287 //
1288 // CHECK1-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
1289 // CHECK1-SAME: () #[[ATTR3:[0-9]+]] {
1290 // CHECK1-NEXT:  entry:
1291 // CHECK1-NEXT:    call void @__tgt_register_requires(i64 1)
1292 // CHECK1-NEXT:    ret void
1293 //
1294 //
1295 // CHECK2-LABEL: define {{[^@]+}}@_Z21teams_template_structv
1296 // CHECK2-SAME: () #[[ATTR0:[0-9]+]] {
1297 // CHECK2-NEXT:  entry:
1298 // CHECK2-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
1299 // CHECK2-NEXT:    [[CALL:%.*]] = call noundef signext i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* noundef nonnull align 4 dereferenceable(496) [[V]])
1300 // CHECK2-NEXT:    ret i32 [[CALL]]
1301 //
1302 //
1303 // CHECK2-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
1304 // CHECK2-SAME: (%struct.SS* noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
1305 // CHECK2-NEXT:  entry:
1306 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1307 // CHECK2-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8
1308 // CHECK2-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8
1309 // CHECK2-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8
1310 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1311 // CHECK2-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 8
1312 // CHECK2-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 8
1313 // CHECK2-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 8
1314 // CHECK2-NEXT:    [[_TMP6:%.*]] = alloca i32, align 4
1315 // CHECK2-NEXT:    [[DOTOFFLOAD_BASEPTRS11:%.*]] = alloca [1 x i8*], align 8
1316 // CHECK2-NEXT:    [[DOTOFFLOAD_PTRS12:%.*]] = alloca [1 x i8*], align 8
1317 // CHECK2-NEXT:    [[DOTOFFLOAD_MAPPERS13:%.*]] = alloca [1 x i8*], align 8
1318 // CHECK2-NEXT:    [[_TMP14:%.*]] = alloca i32, align 4
1319 // CHECK2-NEXT:    [[DOTOFFLOAD_BASEPTRS19:%.*]] = alloca [1 x i8*], align 8
1320 // CHECK2-NEXT:    [[DOTOFFLOAD_PTRS20:%.*]] = alloca [1 x i8*], align 8
1321 // CHECK2-NEXT:    [[DOTOFFLOAD_MAPPERS21:%.*]] = alloca [1 x i8*], align 8
1322 // CHECK2-NEXT:    [[_TMP22:%.*]] = alloca i32, align 4
1323 // CHECK2-NEXT:    [[DOTOFFLOAD_BASEPTRS27:%.*]] = alloca [1 x i8*], align 8
1324 // CHECK2-NEXT:    [[DOTOFFLOAD_PTRS28:%.*]] = alloca [1 x i8*], align 8
1325 // CHECK2-NEXT:    [[DOTOFFLOAD_MAPPERS29:%.*]] = alloca [1 x i8*], align 8
1326 // CHECK2-NEXT:    [[_TMP30:%.*]] = alloca i32, align 4
1327 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1328 // CHECK2-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1329 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
1330 // CHECK2-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1331 // CHECK2-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to %struct.SS**
1332 // CHECK2-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP1]], align 8
1333 // CHECK2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1334 // CHECK2-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [123 x i32]**
1335 // CHECK2-NEXT:    store [123 x i32]* [[A]], [123 x i32]** [[TMP3]], align 8
1336 // CHECK2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
1337 // CHECK2-NEXT:    store i8* null, i8** [[TMP4]], align 8
1338 // CHECK2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1339 // CHECK2-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1340 // CHECK2-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
1341 // CHECK2-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
1342 // CHECK2-NEXT:    store i32 1, i32* [[TMP7]], align 4
1343 // CHECK2-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
1344 // CHECK2-NEXT:    store i32 1, i32* [[TMP8]], align 4
1345 // CHECK2-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
1346 // CHECK2-NEXT:    store i8** [[TMP5]], i8*** [[TMP9]], align 8
1347 // CHECK2-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
1348 // CHECK2-NEXT:    store i8** [[TMP6]], i8*** [[TMP10]], align 8
1349 // CHECK2-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
1350 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64** [[TMP11]], align 8
1351 // CHECK2-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
1352 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP12]], align 8
1353 // CHECK2-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
1354 // CHECK2-NEXT:    store i8** null, i8*** [[TMP13]], align 8
1355 // CHECK2-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
1356 // CHECK2-NEXT:    store i8** null, i8*** [[TMP14]], align 8
1357 // CHECK2-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
1358 // CHECK2-NEXT:    store i64 123, i64* [[TMP15]], align 8
1359 // CHECK2-NEXT:    [[TMP16:%.*]] = 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]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
1360 // CHECK2-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
1361 // CHECK2-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
1362 // CHECK2:       omp_offload.failed:
1363 // CHECK2-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36(%struct.SS* [[THIS1]]) #[[ATTR2:[0-9]+]]
1364 // CHECK2-NEXT:    br label [[OMP_OFFLOAD_CONT]]
1365 // CHECK2:       omp_offload.cont:
1366 // CHECK2-NEXT:    [[A2:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1367 // CHECK2-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1368 // CHECK2-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to %struct.SS**
1369 // CHECK2-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP19]], align 8
1370 // CHECK2-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1371 // CHECK2-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [123 x i32]**
1372 // CHECK2-NEXT:    store [123 x i32]* [[A2]], [123 x i32]** [[TMP21]], align 8
1373 // CHECK2-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i64 0, i64 0
1374 // CHECK2-NEXT:    store i8* null, i8** [[TMP22]], align 8
1375 // CHECK2-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1376 // CHECK2-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1377 // CHECK2-NEXT:    [[KERNEL_ARGS7:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
1378 // CHECK2-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 0
1379 // CHECK2-NEXT:    store i32 1, i32* [[TMP25]], align 4
1380 // CHECK2-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 1
1381 // CHECK2-NEXT:    store i32 1, i32* [[TMP26]], align 4
1382 // CHECK2-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 2
1383 // CHECK2-NEXT:    store i8** [[TMP23]], i8*** [[TMP27]], align 8
1384 // CHECK2-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 3
1385 // CHECK2-NEXT:    store i8** [[TMP24]], i8*** [[TMP28]], align 8
1386 // CHECK2-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 4
1387 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.4, i32 0, i32 0), i64** [[TMP29]], align 8
1388 // CHECK2-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 5
1389 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP30]], align 8
1390 // CHECK2-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 6
1391 // CHECK2-NEXT:    store i8** null, i8*** [[TMP31]], align 8
1392 // CHECK2-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 7
1393 // CHECK2-NEXT:    store i8** null, i8*** [[TMP32]], align 8
1394 // CHECK2-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 8
1395 // CHECK2-NEXT:    store i64 123, i64* [[TMP33]], align 8
1396 // CHECK2-NEXT:    [[TMP34:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]])
1397 // CHECK2-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
1398 // CHECK2-NEXT:    br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED8:%.*]], label [[OMP_OFFLOAD_CONT9:%.*]]
1399 // CHECK2:       omp_offload.failed8:
1400 // CHECK2-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41(%struct.SS* [[THIS1]]) #[[ATTR2]]
1401 // CHECK2-NEXT:    br label [[OMP_OFFLOAD_CONT9]]
1402 // CHECK2:       omp_offload.cont9:
1403 // CHECK2-NEXT:    [[A10:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1404 // CHECK2-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS11]], i32 0, i32 0
1405 // CHECK2-NEXT:    [[TMP37:%.*]] = bitcast i8** [[TMP36]] to %struct.SS**
1406 // CHECK2-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP37]], align 8
1407 // CHECK2-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS12]], i32 0, i32 0
1408 // CHECK2-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to [123 x i32]**
1409 // CHECK2-NEXT:    store [123 x i32]* [[A10]], [123 x i32]** [[TMP39]], align 8
1410 // CHECK2-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS13]], i64 0, i64 0
1411 // CHECK2-NEXT:    store i8* null, i8** [[TMP40]], align 8
1412 // CHECK2-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS11]], i32 0, i32 0
1413 // CHECK2-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS12]], i32 0, i32 0
1414 // CHECK2-NEXT:    [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
1415 // CHECK2-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 0
1416 // CHECK2-NEXT:    store i32 1, i32* [[TMP43]], align 4
1417 // CHECK2-NEXT:    [[TMP44:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 1
1418 // CHECK2-NEXT:    store i32 1, i32* [[TMP44]], align 4
1419 // CHECK2-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 2
1420 // CHECK2-NEXT:    store i8** [[TMP41]], i8*** [[TMP45]], align 8
1421 // CHECK2-NEXT:    [[TMP46:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 3
1422 // CHECK2-NEXT:    store i8** [[TMP42]], i8*** [[TMP46]], align 8
1423 // CHECK2-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 4
1424 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64** [[TMP47]], align 8
1425 // CHECK2-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 5
1426 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP48]], align 8
1427 // CHECK2-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 6
1428 // CHECK2-NEXT:    store i8** null, i8*** [[TMP49]], align 8
1429 // CHECK2-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 7
1430 // CHECK2-NEXT:    store i8** null, i8*** [[TMP50]], align 8
1431 // CHECK2-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 8
1432 // CHECK2-NEXT:    store i64 123, i64* [[TMP51]], align 8
1433 // CHECK2-NEXT:    [[TMP52:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]])
1434 // CHECK2-NEXT:    [[TMP53:%.*]] = icmp ne i32 [[TMP52]], 0
1435 // CHECK2-NEXT:    br i1 [[TMP53]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
1436 // CHECK2:       omp_offload.failed16:
1437 // CHECK2-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46(%struct.SS* [[THIS1]]) #[[ATTR2]]
1438 // CHECK2-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
1439 // CHECK2:       omp_offload.cont17:
1440 // CHECK2-NEXT:    [[A18:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1441 // CHECK2-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
1442 // CHECK2-NEXT:    [[TMP55:%.*]] = bitcast i8** [[TMP54]] to %struct.SS**
1443 // CHECK2-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP55]], align 8
1444 // CHECK2-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
1445 // CHECK2-NEXT:    [[TMP57:%.*]] = bitcast i8** [[TMP56]] to [123 x i32]**
1446 // CHECK2-NEXT:    store [123 x i32]* [[A18]], [123 x i32]** [[TMP57]], align 8
1447 // CHECK2-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i64 0, i64 0
1448 // CHECK2-NEXT:    store i8* null, i8** [[TMP58]], align 8
1449 // CHECK2-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
1450 // CHECK2-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
1451 // CHECK2-NEXT:    [[KERNEL_ARGS23:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
1452 // CHECK2-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 0
1453 // CHECK2-NEXT:    store i32 1, i32* [[TMP61]], align 4
1454 // CHECK2-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 1
1455 // CHECK2-NEXT:    store i32 1, i32* [[TMP62]], align 4
1456 // CHECK2-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 2
1457 // CHECK2-NEXT:    store i8** [[TMP59]], i8*** [[TMP63]], align 8
1458 // CHECK2-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 3
1459 // CHECK2-NEXT:    store i8** [[TMP60]], i8*** [[TMP64]], align 8
1460 // CHECK2-NEXT:    [[TMP65:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 4
1461 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.12, i32 0, i32 0), i64** [[TMP65]], align 8
1462 // CHECK2-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 5
1463 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP66]], align 8
1464 // CHECK2-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 6
1465 // CHECK2-NEXT:    store i8** null, i8*** [[TMP67]], align 8
1466 // CHECK2-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 7
1467 // CHECK2-NEXT:    store i8** null, i8*** [[TMP68]], align 8
1468 // CHECK2-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 8
1469 // CHECK2-NEXT:    store i64 123, i64* [[TMP69]], align 8
1470 // CHECK2-NEXT:    [[TMP70:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]])
1471 // CHECK2-NEXT:    [[TMP71:%.*]] = icmp ne i32 [[TMP70]], 0
1472 // CHECK2-NEXT:    br i1 [[TMP71]], label [[OMP_OFFLOAD_FAILED24:%.*]], label [[OMP_OFFLOAD_CONT25:%.*]]
1473 // CHECK2:       omp_offload.failed24:
1474 // CHECK2-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52(%struct.SS* [[THIS1]]) #[[ATTR2]]
1475 // CHECK2-NEXT:    br label [[OMP_OFFLOAD_CONT25]]
1476 // CHECK2:       omp_offload.cont25:
1477 // CHECK2-NEXT:    [[A26:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1478 // CHECK2-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS27]], i32 0, i32 0
1479 // CHECK2-NEXT:    [[TMP73:%.*]] = bitcast i8** [[TMP72]] to %struct.SS**
1480 // CHECK2-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP73]], align 8
1481 // CHECK2-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS28]], i32 0, i32 0
1482 // CHECK2-NEXT:    [[TMP75:%.*]] = bitcast i8** [[TMP74]] to [123 x i32]**
1483 // CHECK2-NEXT:    store [123 x i32]* [[A26]], [123 x i32]** [[TMP75]], align 8
1484 // CHECK2-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS29]], i64 0, i64 0
1485 // CHECK2-NEXT:    store i8* null, i8** [[TMP76]], align 8
1486 // CHECK2-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS27]], i32 0, i32 0
1487 // CHECK2-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS28]], i32 0, i32 0
1488 // CHECK2-NEXT:    [[KERNEL_ARGS31:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
1489 // CHECK2-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 0
1490 // CHECK2-NEXT:    store i32 1, i32* [[TMP79]], align 4
1491 // CHECK2-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 1
1492 // CHECK2-NEXT:    store i32 1, i32* [[TMP80]], align 4
1493 // CHECK2-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 2
1494 // CHECK2-NEXT:    store i8** [[TMP77]], i8*** [[TMP81]], align 8
1495 // CHECK2-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 3
1496 // CHECK2-NEXT:    store i8** [[TMP78]], i8*** [[TMP82]], align 8
1497 // CHECK2-NEXT:    [[TMP83:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 4
1498 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.16, i32 0, i32 0), i64** [[TMP83]], align 8
1499 // CHECK2-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 5
1500 // CHECK2-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP84]], align 8
1501 // CHECK2-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 6
1502 // CHECK2-NEXT:    store i8** null, i8*** [[TMP85]], align 8
1503 // CHECK2-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 7
1504 // CHECK2-NEXT:    store i8** null, i8*** [[TMP86]], align 8
1505 // CHECK2-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 8
1506 // CHECK2-NEXT:    store i64 123, i64* [[TMP87]], align 8
1507 // CHECK2-NEXT:    [[TMP88:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]])
1508 // CHECK2-NEXT:    [[TMP89:%.*]] = icmp ne i32 [[TMP88]], 0
1509 // CHECK2-NEXT:    br i1 [[TMP89]], label [[OMP_OFFLOAD_FAILED32:%.*]], label [[OMP_OFFLOAD_CONT33:%.*]]
1510 // CHECK2:       omp_offload.failed32:
1511 // CHECK2-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58(%struct.SS* [[THIS1]]) #[[ATTR2]]
1512 // CHECK2-NEXT:    br label [[OMP_OFFLOAD_CONT33]]
1513 // CHECK2:       omp_offload.cont33:
1514 // CHECK2-NEXT:    [[A34:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1515 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A34]], i64 0, i64 0
1516 // CHECK2-NEXT:    [[TMP90:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
1517 // CHECK2-NEXT:    ret i32 [[TMP90]]
1518 //
1519 //
1520 // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36
1521 // CHECK2-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {
1522 // CHECK2-NEXT:  entry:
1523 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1524 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1525 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1526 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
1527 // CHECK2-NEXT:    ret void
1528 //
1529 //
1530 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
1531 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1532 // CHECK2-NEXT:  entry:
1533 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1534 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1535 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1536 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1537 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1538 // CHECK2-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1539 // CHECK2-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1540 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1541 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1542 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
1543 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1544 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1545 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1546 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1547 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1548 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
1549 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1550 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1551 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1552 // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
1553 // CHECK2-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1554 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1555 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
1556 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1557 // CHECK2:       cond.true:
1558 // CHECK2-NEXT:    br label [[COND_END:%.*]]
1559 // CHECK2:       cond.false:
1560 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1561 // CHECK2-NEXT:    br label [[COND_END]]
1562 // CHECK2:       cond.end:
1563 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1564 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1565 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1566 // CHECK2-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1567 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1568 // CHECK2:       omp.inner.for.cond:
1569 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !8
1570 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !8
1571 // CHECK2-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
1572 // CHECK2-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1573 // CHECK2:       omp.inner.for.body:
1574 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !8
1575 // CHECK2-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
1576 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !8
1577 // CHECK2-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
1578 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !8
1579 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1580 // CHECK2:       omp.inner.for.inc:
1581 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !8
1582 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !8
1583 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
1584 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !8
1585 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP9:![0-9]+]]
1586 // CHECK2:       omp.inner.for.end:
1587 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1588 // CHECK2:       omp.loop.exit:
1589 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1590 // CHECK2-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
1591 // CHECK2-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
1592 // CHECK2-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
1593 // CHECK2:       .omp.final.then:
1594 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
1595 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
1596 // CHECK2:       .omp.final.done:
1597 // CHECK2-NEXT:    ret void
1598 //
1599 //
1600 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..1
1601 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1602 // CHECK2-NEXT:  entry:
1603 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1604 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1605 // CHECK2-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1606 // CHECK2-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1607 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1608 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1609 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1610 // CHECK2-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1611 // CHECK2-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1612 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1613 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1614 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
1615 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1616 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1617 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1618 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1619 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1620 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1621 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1622 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1623 // CHECK2-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1624 // CHECK2-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
1625 // CHECK2-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1626 // CHECK2-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
1627 // CHECK2-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1628 // CHECK2-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
1629 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1630 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1631 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1632 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
1633 // CHECK2-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1634 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1635 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
1636 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1637 // CHECK2:       cond.true:
1638 // CHECK2-NEXT:    br label [[COND_END:%.*]]
1639 // CHECK2:       cond.false:
1640 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1641 // CHECK2-NEXT:    br label [[COND_END]]
1642 // CHECK2:       cond.end:
1643 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
1644 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1645 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1646 // CHECK2-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
1647 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1648 // CHECK2:       omp.inner.for.cond:
1649 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
1650 // CHECK2-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !12
1651 // CHECK2-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
1652 // CHECK2-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1653 // CHECK2:       omp.inner.for.body:
1654 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
1655 // CHECK2-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
1656 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1657 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !12
1658 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
1659 // CHECK2-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !12
1660 // CHECK2-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
1661 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
1662 // CHECK2-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !12
1663 // CHECK2-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1664 // CHECK2:       omp.body.continue:
1665 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1666 // CHECK2:       omp.inner.for.inc:
1667 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
1668 // CHECK2-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
1669 // CHECK2-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !12
1670 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]
1671 // CHECK2:       omp.inner.for.end:
1672 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1673 // CHECK2:       omp.loop.exit:
1674 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
1675 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
1676 // CHECK2-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
1677 // CHECK2-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
1678 // CHECK2:       .omp.final.then:
1679 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
1680 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
1681 // CHECK2:       .omp.final.done:
1682 // CHECK2-NEXT:    ret void
1683 //
1684 //
1685 // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41
1686 // CHECK2-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1687 // CHECK2-NEXT:  entry:
1688 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1689 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1690 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1691 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
1692 // CHECK2-NEXT:    ret void
1693 //
1694 //
1695 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..2
1696 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1697 // CHECK2-NEXT:  entry:
1698 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1699 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1700 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1701 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1702 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1703 // CHECK2-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1704 // CHECK2-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1705 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1706 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1707 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
1708 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1709 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1710 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1711 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1712 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1713 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
1714 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1715 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1716 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1717 // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
1718 // CHECK2-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1719 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1720 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
1721 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1722 // CHECK2:       cond.true:
1723 // CHECK2-NEXT:    br label [[COND_END:%.*]]
1724 // CHECK2:       cond.false:
1725 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1726 // CHECK2-NEXT:    br label [[COND_END]]
1727 // CHECK2:       cond.end:
1728 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1729 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1730 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1731 // CHECK2-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1732 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1733 // CHECK2:       omp.inner.for.cond:
1734 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
1735 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !17
1736 // CHECK2-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
1737 // CHECK2-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1738 // CHECK2:       omp.inner.for.body:
1739 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !17
1740 // CHECK2-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
1741 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !17
1742 // CHECK2-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
1743 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !17
1744 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1745 // CHECK2:       omp.inner.for.inc:
1746 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
1747 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !17
1748 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
1749 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
1750 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP18:![0-9]+]]
1751 // CHECK2:       omp.inner.for.end:
1752 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1753 // CHECK2:       omp.loop.exit:
1754 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1755 // CHECK2-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
1756 // CHECK2-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
1757 // CHECK2-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
1758 // CHECK2:       .omp.final.then:
1759 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
1760 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
1761 // CHECK2:       .omp.final.done:
1762 // CHECK2-NEXT:    ret void
1763 //
1764 //
1765 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..3
1766 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1767 // CHECK2-NEXT:  entry:
1768 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1769 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1770 // CHECK2-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1771 // CHECK2-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1772 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1773 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1774 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1775 // CHECK2-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1776 // CHECK2-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1777 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1778 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1779 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
1780 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1781 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1782 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1783 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1784 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1785 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1786 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1787 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1788 // CHECK2-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1789 // CHECK2-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
1790 // CHECK2-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1791 // CHECK2-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
1792 // CHECK2-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1793 // CHECK2-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
1794 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1795 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1796 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1797 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
1798 // CHECK2-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1799 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1800 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
1801 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1802 // CHECK2:       cond.true:
1803 // CHECK2-NEXT:    br label [[COND_END:%.*]]
1804 // CHECK2:       cond.false:
1805 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1806 // CHECK2-NEXT:    br label [[COND_END]]
1807 // CHECK2:       cond.end:
1808 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
1809 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1810 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1811 // CHECK2-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
1812 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1813 // CHECK2:       omp.inner.for.cond:
1814 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
1815 // CHECK2-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !20
1816 // CHECK2-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
1817 // CHECK2-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1818 // CHECK2:       omp.inner.for.body:
1819 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
1820 // CHECK2-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
1821 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1822 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !20
1823 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
1824 // CHECK2-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !20
1825 // CHECK2-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
1826 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
1827 // CHECK2-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !20
1828 // CHECK2-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1829 // CHECK2:       omp.body.continue:
1830 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1831 // CHECK2:       omp.inner.for.inc:
1832 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
1833 // CHECK2-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
1834 // CHECK2-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !20
1835 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP21:![0-9]+]]
1836 // CHECK2:       omp.inner.for.end:
1837 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1838 // CHECK2:       omp.loop.exit:
1839 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
1840 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
1841 // CHECK2-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
1842 // CHECK2-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
1843 // CHECK2:       .omp.final.then:
1844 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
1845 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
1846 // CHECK2:       .omp.final.done:
1847 // CHECK2-NEXT:    ret void
1848 //
1849 //
1850 // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46
1851 // CHECK2-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1852 // CHECK2-NEXT:  entry:
1853 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1854 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1855 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1856 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
1857 // CHECK2-NEXT:    ret void
1858 //
1859 //
1860 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..6
1861 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1862 // CHECK2-NEXT:  entry:
1863 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1864 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1865 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1866 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1867 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1868 // CHECK2-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1869 // CHECK2-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1870 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1871 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1872 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
1873 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1874 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1875 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1876 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1877 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1878 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
1879 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1880 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1881 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1882 // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
1883 // CHECK2-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1884 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1885 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
1886 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1887 // CHECK2:       cond.true:
1888 // CHECK2-NEXT:    br label [[COND_END:%.*]]
1889 // CHECK2:       cond.false:
1890 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1891 // CHECK2-NEXT:    br label [[COND_END]]
1892 // CHECK2:       cond.end:
1893 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1894 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1895 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1896 // CHECK2-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1897 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1898 // CHECK2:       omp.inner.for.cond:
1899 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
1900 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !23
1901 // CHECK2-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
1902 // CHECK2-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1903 // CHECK2:       omp.inner.for.body:
1904 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !23
1905 // CHECK2-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
1906 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !23
1907 // CHECK2-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
1908 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !23
1909 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1910 // CHECK2:       omp.inner.for.inc:
1911 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
1912 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !23
1913 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
1914 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
1915 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP24:![0-9]+]]
1916 // CHECK2:       omp.inner.for.end:
1917 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1918 // CHECK2:       omp.loop.exit:
1919 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1920 // CHECK2-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
1921 // CHECK2-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
1922 // CHECK2-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
1923 // CHECK2:       .omp.final.then:
1924 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
1925 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
1926 // CHECK2:       .omp.final.done:
1927 // CHECK2-NEXT:    ret void
1928 //
1929 //
1930 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..7
1931 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
1932 // CHECK2-NEXT:  entry:
1933 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1934 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1935 // CHECK2-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1936 // CHECK2-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1937 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1938 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1939 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1940 // CHECK2-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1941 // CHECK2-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1942 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1943 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1944 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
1945 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1946 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1947 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1948 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1949 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1950 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1951 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1952 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1953 // CHECK2-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1954 // CHECK2-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
1955 // CHECK2-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1956 // CHECK2-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
1957 // CHECK2-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1958 // CHECK2-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
1959 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1960 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1961 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1962 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
1963 // CHECK2-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 61)
1964 // CHECK2-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
1965 // CHECK2:       omp.dispatch.cond:
1966 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1967 // CHECK2-NEXT:    [[TMP6:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1968 // CHECK2-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP6]] to i32
1969 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], [[CONV2]]
1970 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1971 // CHECK2:       cond.true:
1972 // CHECK2-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1973 // CHECK2-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP7]] to i32
1974 // CHECK2-NEXT:    br label [[COND_END:%.*]]
1975 // CHECK2:       cond.false:
1976 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1977 // CHECK2-NEXT:    br label [[COND_END]]
1978 // CHECK2:       cond.end:
1979 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ [[CONV3]], [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]
1980 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1981 // CHECK2-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1982 // CHECK2-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_IV]], align 4
1983 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1984 // CHECK2-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1985 // CHECK2-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]
1986 // CHECK2-NEXT:    br i1 [[CMP4]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
1987 // CHECK2:       omp.dispatch.body:
1988 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1989 // CHECK2:       omp.inner.for.cond:
1990 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
1991 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !26
1992 // CHECK2-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]
1993 // CHECK2-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1994 // CHECK2:       omp.inner.for.body:
1995 // CHECK2-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
1996 // CHECK2-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP14]], 1
1997 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1998 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !26
1999 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
2000 // CHECK2-NEXT:    [[TMP15:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !26
2001 // CHECK2-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP15]] to i64
2002 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
2003 // CHECK2-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !26
2004 // CHECK2-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2005 // CHECK2:       omp.body.continue:
2006 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2007 // CHECK2:       omp.inner.for.inc:
2008 // CHECK2-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
2009 // CHECK2-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP16]], 1
2010 // CHECK2-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
2011 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP27:![0-9]+]]
2012 // CHECK2:       omp.inner.for.end:
2013 // CHECK2-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
2014 // CHECK2:       omp.dispatch.inc:
2015 // CHECK2-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2016 // CHECK2-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2017 // CHECK2-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]
2018 // CHECK2-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_LB]], align 4
2019 // CHECK2-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2020 // CHECK2-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2021 // CHECK2-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
2022 // CHECK2-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_UB]], align 4
2023 // CHECK2-NEXT:    br label [[OMP_DISPATCH_COND]]
2024 // CHECK2:       omp.dispatch.end:
2025 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
2026 // CHECK2-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2027 // CHECK2-NEXT:    [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0
2028 // CHECK2-NEXT:    br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2029 // CHECK2:       .omp.final.then:
2030 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
2031 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2032 // CHECK2:       .omp.final.done:
2033 // CHECK2-NEXT:    ret void
2034 //
2035 //
2036 // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52
2037 // CHECK2-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2038 // CHECK2-NEXT:  entry:
2039 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
2040 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
2041 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
2042 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
2043 // CHECK2-NEXT:    ret void
2044 //
2045 //
2046 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..10
2047 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2048 // CHECK2-NEXT:  entry:
2049 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2050 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2051 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
2052 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2053 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2054 // CHECK2-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2055 // CHECK2-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2056 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2057 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2058 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
2059 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2060 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2061 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
2062 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
2063 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2064 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
2065 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2066 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2067 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2068 // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
2069 // CHECK2-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2070 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2071 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
2072 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2073 // CHECK2:       cond.true:
2074 // CHECK2-NEXT:    br label [[COND_END:%.*]]
2075 // CHECK2:       cond.false:
2076 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2077 // CHECK2-NEXT:    br label [[COND_END]]
2078 // CHECK2:       cond.end:
2079 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
2080 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2081 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2082 // CHECK2-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
2083 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2084 // CHECK2:       omp.inner.for.cond:
2085 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
2086 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
2087 // CHECK2-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
2088 // CHECK2-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2089 // CHECK2:       omp.inner.for.body:
2090 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
2091 // CHECK2-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
2092 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
2093 // CHECK2-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
2094 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !29
2095 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2096 // CHECK2:       omp.inner.for.inc:
2097 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
2098 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !29
2099 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
2100 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
2101 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP30:![0-9]+]]
2102 // CHECK2:       omp.inner.for.end:
2103 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2104 // CHECK2:       omp.loop.exit:
2105 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
2106 // CHECK2-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2107 // CHECK2-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
2108 // CHECK2-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2109 // CHECK2:       .omp.final.then:
2110 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
2111 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2112 // CHECK2:       .omp.final.done:
2113 // CHECK2-NEXT:    ret void
2114 //
2115 //
2116 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..11
2117 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2118 // CHECK2-NEXT:  entry:
2119 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2120 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2121 // CHECK2-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
2122 // CHECK2-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
2123 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
2124 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2125 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2126 // CHECK2-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2127 // CHECK2-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2128 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2129 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2130 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
2131 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2132 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2133 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2134 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2135 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
2136 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
2137 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2138 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
2139 // CHECK2-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2140 // CHECK2-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
2141 // CHECK2-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2142 // CHECK2-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
2143 // CHECK2-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
2144 // CHECK2-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
2145 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2146 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2147 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2148 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2149 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2150 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
2151 // CHECK2-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 1073741859, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 1)
2152 // CHECK2-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
2153 // CHECK2:       omp.dispatch.cond:
2154 // CHECK2-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
2155 // CHECK2-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
2156 // CHECK2-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
2157 // CHECK2:       omp.dispatch.body:
2158 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2159 // CHECK2-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
2160 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2161 // CHECK2:       omp.inner.for.cond:
2162 // CHECK2-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
2163 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !32
2164 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
2165 // CHECK2-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2166 // CHECK2:       omp.inner.for.body:
2167 // CHECK2-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
2168 // CHECK2-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
2169 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2170 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !32
2171 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
2172 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !32
2173 // CHECK2-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP12]] to i64
2174 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
2175 // CHECK2-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !32
2176 // CHECK2-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2177 // CHECK2:       omp.body.continue:
2178 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2179 // CHECK2:       omp.inner.for.inc:
2180 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
2181 // CHECK2-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP13]], 1
2182 // CHECK2-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
2183 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP33:![0-9]+]]
2184 // CHECK2:       omp.inner.for.end:
2185 // CHECK2-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
2186 // CHECK2:       omp.dispatch.inc:
2187 // CHECK2-NEXT:    br label [[OMP_DISPATCH_COND]]
2188 // CHECK2:       omp.dispatch.end:
2189 // CHECK2-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2190 // CHECK2-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
2191 // CHECK2-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2192 // CHECK2:       .omp.final.then:
2193 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
2194 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2195 // CHECK2:       .omp.final.done:
2196 // CHECK2-NEXT:    ret void
2197 //
2198 //
2199 // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58
2200 // CHECK2-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2201 // CHECK2-NEXT:  entry:
2202 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
2203 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
2204 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
2205 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..14 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
2206 // CHECK2-NEXT:    ret void
2207 //
2208 //
2209 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..14
2210 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2211 // CHECK2-NEXT:  entry:
2212 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2213 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2214 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
2215 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2216 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2217 // CHECK2-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2218 // CHECK2-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2219 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2220 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2221 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
2222 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2223 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2224 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
2225 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
2226 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2227 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
2228 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2229 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2230 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2231 // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
2232 // CHECK2-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2233 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2234 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
2235 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2236 // CHECK2:       cond.true:
2237 // CHECK2-NEXT:    br label [[COND_END:%.*]]
2238 // CHECK2:       cond.false:
2239 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2240 // CHECK2-NEXT:    br label [[COND_END]]
2241 // CHECK2:       cond.end:
2242 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
2243 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2244 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2245 // CHECK2-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
2246 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2247 // CHECK2:       omp.inner.for.cond:
2248 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
2249 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !35
2250 // CHECK2-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
2251 // CHECK2-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2252 // CHECK2:       omp.inner.for.body:
2253 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !35
2254 // CHECK2-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
2255 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !35
2256 // CHECK2-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
2257 // CHECK2-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, %struct.SS*)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], %struct.SS* [[TMP0]]), !llvm.access.group !35
2258 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2259 // CHECK2:       omp.inner.for.inc:
2260 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
2261 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !35
2262 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
2263 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
2264 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP36:![0-9]+]]
2265 // CHECK2:       omp.inner.for.end:
2266 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2267 // CHECK2:       omp.loop.exit:
2268 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
2269 // CHECK2-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2270 // CHECK2-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
2271 // CHECK2-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2272 // CHECK2:       .omp.final.then:
2273 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
2274 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2275 // CHECK2:       .omp.final.done:
2276 // CHECK2-NEXT:    ret void
2277 //
2278 //
2279 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..15
2280 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2281 // CHECK2-NEXT:  entry:
2282 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2283 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2284 // CHECK2-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
2285 // CHECK2-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
2286 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
2287 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2288 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2289 // CHECK2-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2290 // CHECK2-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2291 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2292 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2293 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
2294 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2295 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2296 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2297 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2298 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
2299 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
2300 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2301 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
2302 // CHECK2-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2303 // CHECK2-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
2304 // CHECK2-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2305 // CHECK2-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
2306 // CHECK2-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
2307 // CHECK2-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
2308 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2309 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2310 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2311 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2312 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2313 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
2314 // CHECK2-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 1073741859, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 61)
2315 // CHECK2-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
2316 // CHECK2:       omp.dispatch.cond:
2317 // CHECK2-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
2318 // CHECK2-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
2319 // CHECK2-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
2320 // CHECK2:       omp.dispatch.body:
2321 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2322 // CHECK2-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
2323 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2324 // CHECK2:       omp.inner.for.cond:
2325 // CHECK2-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
2326 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !38
2327 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
2328 // CHECK2-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2329 // CHECK2:       omp.inner.for.body:
2330 // CHECK2-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
2331 // CHECK2-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
2332 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2333 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !38
2334 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
2335 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !38
2336 // CHECK2-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP12]] to i64
2337 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
2338 // CHECK2-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !38
2339 // CHECK2-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2340 // CHECK2:       omp.body.continue:
2341 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2342 // CHECK2:       omp.inner.for.inc:
2343 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
2344 // CHECK2-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP13]], 1
2345 // CHECK2-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
2346 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP39:![0-9]+]]
2347 // CHECK2:       omp.inner.for.end:
2348 // CHECK2-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
2349 // CHECK2:       omp.dispatch.inc:
2350 // CHECK2-NEXT:    br label [[OMP_DISPATCH_COND]]
2351 // CHECK2:       omp.dispatch.end:
2352 // CHECK2-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2353 // CHECK2-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
2354 // CHECK2-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2355 // CHECK2:       .omp.final.then:
2356 // CHECK2-NEXT:    store i32 123, i32* [[I]], align 4
2357 // CHECK2-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2358 // CHECK2:       .omp.final.done:
2359 // CHECK2-NEXT:    ret void
2360 //
2361 //
2362 // CHECK2-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
2363 // CHECK2-SAME: () #[[ATTR3:[0-9]+]] {
2364 // CHECK2-NEXT:  entry:
2365 // CHECK2-NEXT:    call void @__tgt_register_requires(i64 1)
2366 // CHECK2-NEXT:    ret void
2367 //
2368 //
2369 // CHECK5-LABEL: define {{[^@]+}}@_Z21teams_template_structv
2370 // CHECK5-SAME: () #[[ATTR0:[0-9]+]] {
2371 // CHECK5-NEXT:  entry:
2372 // CHECK5-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
2373 // CHECK5-NEXT:    [[CALL:%.*]] = call noundef i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* noundef nonnull align 4 dereferenceable(496) [[V]])
2374 // CHECK5-NEXT:    ret i32 [[CALL]]
2375 //
2376 //
2377 // CHECK5-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
2378 // CHECK5-SAME: (%struct.SS* noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
2379 // CHECK5-NEXT:  entry:
2380 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2381 // CHECK5-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 4
2382 // CHECK5-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 4
2383 // CHECK5-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 4
2384 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2385 // CHECK5-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
2386 // CHECK5-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
2387 // CHECK5-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
2388 // CHECK5-NEXT:    [[_TMP6:%.*]] = alloca i32, align 4
2389 // CHECK5-NEXT:    [[DOTOFFLOAD_BASEPTRS11:%.*]] = alloca [1 x i8*], align 4
2390 // CHECK5-NEXT:    [[DOTOFFLOAD_PTRS12:%.*]] = alloca [1 x i8*], align 4
2391 // CHECK5-NEXT:    [[DOTOFFLOAD_MAPPERS13:%.*]] = alloca [1 x i8*], align 4
2392 // CHECK5-NEXT:    [[_TMP14:%.*]] = alloca i32, align 4
2393 // CHECK5-NEXT:    [[DOTOFFLOAD_BASEPTRS19:%.*]] = alloca [1 x i8*], align 4
2394 // CHECK5-NEXT:    [[DOTOFFLOAD_PTRS20:%.*]] = alloca [1 x i8*], align 4
2395 // CHECK5-NEXT:    [[DOTOFFLOAD_MAPPERS21:%.*]] = alloca [1 x i8*], align 4
2396 // CHECK5-NEXT:    [[_TMP22:%.*]] = alloca i32, align 4
2397 // CHECK5-NEXT:    [[DOTOFFLOAD_BASEPTRS27:%.*]] = alloca [1 x i8*], align 4
2398 // CHECK5-NEXT:    [[DOTOFFLOAD_PTRS28:%.*]] = alloca [1 x i8*], align 4
2399 // CHECK5-NEXT:    [[DOTOFFLOAD_MAPPERS29:%.*]] = alloca [1 x i8*], align 4
2400 // CHECK5-NEXT:    [[_TMP30:%.*]] = alloca i32, align 4
2401 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2402 // CHECK5-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2403 // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
2404 // CHECK5-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
2405 // CHECK5-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to %struct.SS**
2406 // CHECK5-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP1]], align 4
2407 // CHECK5-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
2408 // CHECK5-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [123 x i32]**
2409 // CHECK5-NEXT:    store [123 x i32]* [[A]], [123 x i32]** [[TMP3]], align 4
2410 // CHECK5-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
2411 // CHECK5-NEXT:    store i8* null, i8** [[TMP4]], align 4
2412 // CHECK5-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
2413 // CHECK5-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
2414 // CHECK5-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
2415 // CHECK5-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
2416 // CHECK5-NEXT:    store i32 1, i32* [[TMP7]], align 4
2417 // CHECK5-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
2418 // CHECK5-NEXT:    store i32 1, i32* [[TMP8]], align 4
2419 // CHECK5-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
2420 // CHECK5-NEXT:    store i8** [[TMP5]], i8*** [[TMP9]], align 4
2421 // CHECK5-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
2422 // CHECK5-NEXT:    store i8** [[TMP6]], i8*** [[TMP10]], align 4
2423 // CHECK5-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
2424 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64** [[TMP11]], align 4
2425 // CHECK5-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
2426 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP12]], align 4
2427 // CHECK5-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
2428 // CHECK5-NEXT:    store i8** null, i8*** [[TMP13]], align 4
2429 // CHECK5-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
2430 // CHECK5-NEXT:    store i8** null, i8*** [[TMP14]], align 4
2431 // CHECK5-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
2432 // CHECK5-NEXT:    store i64 123, i64* [[TMP15]], align 8
2433 // CHECK5-NEXT:    [[TMP16:%.*]] = 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]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
2434 // CHECK5-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
2435 // CHECK5-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
2436 // CHECK5:       omp_offload.failed:
2437 // CHECK5-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36(%struct.SS* [[THIS1]]) #[[ATTR2:[0-9]+]]
2438 // CHECK5-NEXT:    br label [[OMP_OFFLOAD_CONT]]
2439 // CHECK5:       omp_offload.cont:
2440 // CHECK5-NEXT:    [[A2:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
2441 // CHECK5-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
2442 // CHECK5-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to %struct.SS**
2443 // CHECK5-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP19]], align 4
2444 // CHECK5-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
2445 // CHECK5-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [123 x i32]**
2446 // CHECK5-NEXT:    store [123 x i32]* [[A2]], [123 x i32]** [[TMP21]], align 4
2447 // CHECK5-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
2448 // CHECK5-NEXT:    store i8* null, i8** [[TMP22]], align 4
2449 // CHECK5-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
2450 // CHECK5-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
2451 // CHECK5-NEXT:    [[KERNEL_ARGS7:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
2452 // CHECK5-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 0
2453 // CHECK5-NEXT:    store i32 1, i32* [[TMP25]], align 4
2454 // CHECK5-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 1
2455 // CHECK5-NEXT:    store i32 1, i32* [[TMP26]], align 4
2456 // CHECK5-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 2
2457 // CHECK5-NEXT:    store i8** [[TMP23]], i8*** [[TMP27]], align 4
2458 // CHECK5-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 3
2459 // CHECK5-NEXT:    store i8** [[TMP24]], i8*** [[TMP28]], align 4
2460 // CHECK5-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 4
2461 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.4, i32 0, i32 0), i64** [[TMP29]], align 4
2462 // CHECK5-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 5
2463 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP30]], align 4
2464 // CHECK5-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 6
2465 // CHECK5-NEXT:    store i8** null, i8*** [[TMP31]], align 4
2466 // CHECK5-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 7
2467 // CHECK5-NEXT:    store i8** null, i8*** [[TMP32]], align 4
2468 // CHECK5-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 8
2469 // CHECK5-NEXT:    store i64 123, i64* [[TMP33]], align 8
2470 // CHECK5-NEXT:    [[TMP34:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]])
2471 // CHECK5-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
2472 // CHECK5-NEXT:    br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED8:%.*]], label [[OMP_OFFLOAD_CONT9:%.*]]
2473 // CHECK5:       omp_offload.failed8:
2474 // CHECK5-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41(%struct.SS* [[THIS1]]) #[[ATTR2]]
2475 // CHECK5-NEXT:    br label [[OMP_OFFLOAD_CONT9]]
2476 // CHECK5:       omp_offload.cont9:
2477 // CHECK5-NEXT:    [[A10:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
2478 // CHECK5-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS11]], i32 0, i32 0
2479 // CHECK5-NEXT:    [[TMP37:%.*]] = bitcast i8** [[TMP36]] to %struct.SS**
2480 // CHECK5-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP37]], align 4
2481 // CHECK5-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS12]], i32 0, i32 0
2482 // CHECK5-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to [123 x i32]**
2483 // CHECK5-NEXT:    store [123 x i32]* [[A10]], [123 x i32]** [[TMP39]], align 4
2484 // CHECK5-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS13]], i32 0, i32 0
2485 // CHECK5-NEXT:    store i8* null, i8** [[TMP40]], align 4
2486 // CHECK5-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS11]], i32 0, i32 0
2487 // CHECK5-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS12]], i32 0, i32 0
2488 // CHECK5-NEXT:    [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
2489 // CHECK5-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 0
2490 // CHECK5-NEXT:    store i32 1, i32* [[TMP43]], align 4
2491 // CHECK5-NEXT:    [[TMP44:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 1
2492 // CHECK5-NEXT:    store i32 1, i32* [[TMP44]], align 4
2493 // CHECK5-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 2
2494 // CHECK5-NEXT:    store i8** [[TMP41]], i8*** [[TMP45]], align 4
2495 // CHECK5-NEXT:    [[TMP46:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 3
2496 // CHECK5-NEXT:    store i8** [[TMP42]], i8*** [[TMP46]], align 4
2497 // CHECK5-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 4
2498 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64** [[TMP47]], align 4
2499 // CHECK5-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 5
2500 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP48]], align 4
2501 // CHECK5-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 6
2502 // CHECK5-NEXT:    store i8** null, i8*** [[TMP49]], align 4
2503 // CHECK5-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 7
2504 // CHECK5-NEXT:    store i8** null, i8*** [[TMP50]], align 4
2505 // CHECK5-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 8
2506 // CHECK5-NEXT:    store i64 123, i64* [[TMP51]], align 8
2507 // CHECK5-NEXT:    [[TMP52:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]])
2508 // CHECK5-NEXT:    [[TMP53:%.*]] = icmp ne i32 [[TMP52]], 0
2509 // CHECK5-NEXT:    br i1 [[TMP53]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
2510 // CHECK5:       omp_offload.failed16:
2511 // CHECK5-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46(%struct.SS* [[THIS1]]) #[[ATTR2]]
2512 // CHECK5-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
2513 // CHECK5:       omp_offload.cont17:
2514 // CHECK5-NEXT:    [[A18:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
2515 // CHECK5-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
2516 // CHECK5-NEXT:    [[TMP55:%.*]] = bitcast i8** [[TMP54]] to %struct.SS**
2517 // CHECK5-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP55]], align 4
2518 // CHECK5-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
2519 // CHECK5-NEXT:    [[TMP57:%.*]] = bitcast i8** [[TMP56]] to [123 x i32]**
2520 // CHECK5-NEXT:    store [123 x i32]* [[A18]], [123 x i32]** [[TMP57]], align 4
2521 // CHECK5-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 0
2522 // CHECK5-NEXT:    store i8* null, i8** [[TMP58]], align 4
2523 // CHECK5-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
2524 // CHECK5-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
2525 // CHECK5-NEXT:    [[KERNEL_ARGS23:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
2526 // CHECK5-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 0
2527 // CHECK5-NEXT:    store i32 1, i32* [[TMP61]], align 4
2528 // CHECK5-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 1
2529 // CHECK5-NEXT:    store i32 1, i32* [[TMP62]], align 4
2530 // CHECK5-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 2
2531 // CHECK5-NEXT:    store i8** [[TMP59]], i8*** [[TMP63]], align 4
2532 // CHECK5-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 3
2533 // CHECK5-NEXT:    store i8** [[TMP60]], i8*** [[TMP64]], align 4
2534 // CHECK5-NEXT:    [[TMP65:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 4
2535 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.12, i32 0, i32 0), i64** [[TMP65]], align 4
2536 // CHECK5-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 5
2537 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP66]], align 4
2538 // CHECK5-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 6
2539 // CHECK5-NEXT:    store i8** null, i8*** [[TMP67]], align 4
2540 // CHECK5-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 7
2541 // CHECK5-NEXT:    store i8** null, i8*** [[TMP68]], align 4
2542 // CHECK5-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 8
2543 // CHECK5-NEXT:    store i64 123, i64* [[TMP69]], align 8
2544 // CHECK5-NEXT:    [[TMP70:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]])
2545 // CHECK5-NEXT:    [[TMP71:%.*]] = icmp ne i32 [[TMP70]], 0
2546 // CHECK5-NEXT:    br i1 [[TMP71]], label [[OMP_OFFLOAD_FAILED24:%.*]], label [[OMP_OFFLOAD_CONT25:%.*]]
2547 // CHECK5:       omp_offload.failed24:
2548 // CHECK5-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52(%struct.SS* [[THIS1]]) #[[ATTR2]]
2549 // CHECK5-NEXT:    br label [[OMP_OFFLOAD_CONT25]]
2550 // CHECK5:       omp_offload.cont25:
2551 // CHECK5-NEXT:    [[A26:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
2552 // CHECK5-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS27]], i32 0, i32 0
2553 // CHECK5-NEXT:    [[TMP73:%.*]] = bitcast i8** [[TMP72]] to %struct.SS**
2554 // CHECK5-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP73]], align 4
2555 // CHECK5-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS28]], i32 0, i32 0
2556 // CHECK5-NEXT:    [[TMP75:%.*]] = bitcast i8** [[TMP74]] to [123 x i32]**
2557 // CHECK5-NEXT:    store [123 x i32]* [[A26]], [123 x i32]** [[TMP75]], align 4
2558 // CHECK5-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS29]], i32 0, i32 0
2559 // CHECK5-NEXT:    store i8* null, i8** [[TMP76]], align 4
2560 // CHECK5-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS27]], i32 0, i32 0
2561 // CHECK5-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS28]], i32 0, i32 0
2562 // CHECK5-NEXT:    [[KERNEL_ARGS31:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
2563 // CHECK5-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 0
2564 // CHECK5-NEXT:    store i32 1, i32* [[TMP79]], align 4
2565 // CHECK5-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 1
2566 // CHECK5-NEXT:    store i32 1, i32* [[TMP80]], align 4
2567 // CHECK5-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 2
2568 // CHECK5-NEXT:    store i8** [[TMP77]], i8*** [[TMP81]], align 4
2569 // CHECK5-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 3
2570 // CHECK5-NEXT:    store i8** [[TMP78]], i8*** [[TMP82]], align 4
2571 // CHECK5-NEXT:    [[TMP83:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 4
2572 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.16, i32 0, i32 0), i64** [[TMP83]], align 4
2573 // CHECK5-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 5
2574 // CHECK5-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP84]], align 4
2575 // CHECK5-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 6
2576 // CHECK5-NEXT:    store i8** null, i8*** [[TMP85]], align 4
2577 // CHECK5-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 7
2578 // CHECK5-NEXT:    store i8** null, i8*** [[TMP86]], align 4
2579 // CHECK5-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 8
2580 // CHECK5-NEXT:    store i64 123, i64* [[TMP87]], align 8
2581 // CHECK5-NEXT:    [[TMP88:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]])
2582 // CHECK5-NEXT:    [[TMP89:%.*]] = icmp ne i32 [[TMP88]], 0
2583 // CHECK5-NEXT:    br i1 [[TMP89]], label [[OMP_OFFLOAD_FAILED32:%.*]], label [[OMP_OFFLOAD_CONT33:%.*]]
2584 // CHECK5:       omp_offload.failed32:
2585 // CHECK5-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58(%struct.SS* [[THIS1]]) #[[ATTR2]]
2586 // CHECK5-NEXT:    br label [[OMP_OFFLOAD_CONT33]]
2587 // CHECK5:       omp_offload.cont33:
2588 // CHECK5-NEXT:    [[A34:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
2589 // CHECK5-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A34]], i32 0, i32 0
2590 // CHECK5-NEXT:    [[TMP90:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
2591 // CHECK5-NEXT:    ret i32 [[TMP90]]
2592 //
2593 //
2594 // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36
2595 // CHECK5-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {
2596 // CHECK5-NEXT:  entry:
2597 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2598 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2599 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2600 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
2601 // CHECK5-NEXT:    ret void
2602 //
2603 //
2604 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined.
2605 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2606 // CHECK5-NEXT:  entry:
2607 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2608 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2609 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2610 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2611 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2612 // CHECK5-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2613 // CHECK5-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2614 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2615 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2616 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
2617 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2618 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2619 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2620 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2621 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2622 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
2623 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2624 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2625 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2626 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
2627 // CHECK5-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2628 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2629 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
2630 // CHECK5-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2631 // CHECK5:       cond.true:
2632 // CHECK5-NEXT:    br label [[COND_END:%.*]]
2633 // CHECK5:       cond.false:
2634 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2635 // CHECK5-NEXT:    br label [[COND_END]]
2636 // CHECK5:       cond.end:
2637 // CHECK5-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
2638 // CHECK5-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2639 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2640 // CHECK5-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
2641 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2642 // CHECK5:       omp.inner.for.cond:
2643 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !9
2644 // CHECK5-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !9
2645 // CHECK5-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
2646 // CHECK5-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2647 // CHECK5:       omp.inner.for.body:
2648 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !9
2649 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !9
2650 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !9
2651 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2652 // CHECK5:       omp.inner.for.inc:
2653 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !9
2654 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !9
2655 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
2656 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !9
2657 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP10:![0-9]+]]
2658 // CHECK5:       omp.inner.for.end:
2659 // CHECK5-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2660 // CHECK5:       omp.loop.exit:
2661 // CHECK5-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
2662 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2663 // CHECK5-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
2664 // CHECK5-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2665 // CHECK5:       .omp.final.then:
2666 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
2667 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2668 // CHECK5:       .omp.final.done:
2669 // CHECK5-NEXT:    ret void
2670 //
2671 //
2672 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..1
2673 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2674 // CHECK5-NEXT:  entry:
2675 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2676 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2677 // CHECK5-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
2678 // CHECK5-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
2679 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2680 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2681 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2682 // CHECK5-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2683 // CHECK5-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2684 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2685 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2686 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
2687 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2688 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2689 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2690 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2691 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2692 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2693 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2694 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
2695 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2696 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2697 // CHECK5-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
2698 // CHECK5-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
2699 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2700 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2701 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2702 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
2703 // CHECK5-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2704 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2705 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
2706 // CHECK5-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2707 // CHECK5:       cond.true:
2708 // CHECK5-NEXT:    br label [[COND_END:%.*]]
2709 // CHECK5:       cond.false:
2710 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2711 // CHECK5-NEXT:    br label [[COND_END]]
2712 // CHECK5:       cond.end:
2713 // CHECK5-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
2714 // CHECK5-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
2715 // CHECK5-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2716 // CHECK5-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
2717 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2718 // CHECK5:       omp.inner.for.cond:
2719 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
2720 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !13
2721 // CHECK5-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
2722 // CHECK5-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2723 // CHECK5:       omp.inner.for.body:
2724 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
2725 // CHECK5-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
2726 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2727 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !13
2728 // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
2729 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !13
2730 // CHECK5-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
2731 // CHECK5-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !13
2732 // CHECK5-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2733 // CHECK5:       omp.body.continue:
2734 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2735 // CHECK5:       omp.inner.for.inc:
2736 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
2737 // CHECK5-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
2738 // CHECK5-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
2739 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP14:![0-9]+]]
2740 // CHECK5:       omp.inner.for.end:
2741 // CHECK5-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2742 // CHECK5:       omp.loop.exit:
2743 // CHECK5-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
2744 // CHECK5-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2745 // CHECK5-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
2746 // CHECK5-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2747 // CHECK5:       .omp.final.then:
2748 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
2749 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2750 // CHECK5:       .omp.final.done:
2751 // CHECK5-NEXT:    ret void
2752 //
2753 //
2754 // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41
2755 // CHECK5-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2756 // CHECK5-NEXT:  entry:
2757 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2758 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2759 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2760 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
2761 // CHECK5-NEXT:    ret void
2762 //
2763 //
2764 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..2
2765 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2766 // CHECK5-NEXT:  entry:
2767 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2768 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2769 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2770 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2771 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2772 // CHECK5-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2773 // CHECK5-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2774 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2775 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2776 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
2777 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2778 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2779 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2780 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2781 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2782 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
2783 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2784 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2785 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2786 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
2787 // CHECK5-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2788 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2789 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
2790 // CHECK5-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2791 // CHECK5:       cond.true:
2792 // CHECK5-NEXT:    br label [[COND_END:%.*]]
2793 // CHECK5:       cond.false:
2794 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2795 // CHECK5-NEXT:    br label [[COND_END]]
2796 // CHECK5:       cond.end:
2797 // CHECK5-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
2798 // CHECK5-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2799 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2800 // CHECK5-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
2801 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2802 // CHECK5:       omp.inner.for.cond:
2803 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
2804 // CHECK5-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !18
2805 // CHECK5-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
2806 // CHECK5-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2807 // CHECK5:       omp.inner.for.body:
2808 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !18
2809 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !18
2810 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !18
2811 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2812 // CHECK5:       omp.inner.for.inc:
2813 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
2814 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !18
2815 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
2816 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
2817 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP19:![0-9]+]]
2818 // CHECK5:       omp.inner.for.end:
2819 // CHECK5-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2820 // CHECK5:       omp.loop.exit:
2821 // CHECK5-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
2822 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2823 // CHECK5-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
2824 // CHECK5-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2825 // CHECK5:       .omp.final.then:
2826 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
2827 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2828 // CHECK5:       .omp.final.done:
2829 // CHECK5-NEXT:    ret void
2830 //
2831 //
2832 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..3
2833 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2834 // CHECK5-NEXT:  entry:
2835 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2836 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2837 // CHECK5-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
2838 // CHECK5-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
2839 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2840 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2841 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2842 // CHECK5-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2843 // CHECK5-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2844 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2845 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2846 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
2847 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2848 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2849 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2850 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2851 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2852 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2853 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2854 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
2855 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2856 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2857 // CHECK5-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
2858 // CHECK5-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
2859 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2860 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2861 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2862 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
2863 // CHECK5-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2864 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2865 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
2866 // CHECK5-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2867 // CHECK5:       cond.true:
2868 // CHECK5-NEXT:    br label [[COND_END:%.*]]
2869 // CHECK5:       cond.false:
2870 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2871 // CHECK5-NEXT:    br label [[COND_END]]
2872 // CHECK5:       cond.end:
2873 // CHECK5-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
2874 // CHECK5-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
2875 // CHECK5-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2876 // CHECK5-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
2877 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2878 // CHECK5:       omp.inner.for.cond:
2879 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !21
2880 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !21
2881 // CHECK5-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
2882 // CHECK5-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2883 // CHECK5:       omp.inner.for.body:
2884 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !21
2885 // CHECK5-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
2886 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2887 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !21
2888 // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
2889 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !21
2890 // CHECK5-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
2891 // CHECK5-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !21
2892 // CHECK5-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2893 // CHECK5:       omp.body.continue:
2894 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2895 // CHECK5:       omp.inner.for.inc:
2896 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !21
2897 // CHECK5-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
2898 // CHECK5-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !21
2899 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP22:![0-9]+]]
2900 // CHECK5:       omp.inner.for.end:
2901 // CHECK5-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2902 // CHECK5:       omp.loop.exit:
2903 // CHECK5-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
2904 // CHECK5-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2905 // CHECK5-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
2906 // CHECK5-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2907 // CHECK5:       .omp.final.then:
2908 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
2909 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2910 // CHECK5:       .omp.final.done:
2911 // CHECK5-NEXT:    ret void
2912 //
2913 //
2914 // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46
2915 // CHECK5-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2916 // CHECK5-NEXT:  entry:
2917 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2918 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2919 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2920 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
2921 // CHECK5-NEXT:    ret void
2922 //
2923 //
2924 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..6
2925 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2926 // CHECK5-NEXT:  entry:
2927 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2928 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2929 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2930 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2931 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2932 // CHECK5-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2933 // CHECK5-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2934 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2935 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2936 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
2937 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2938 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2939 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2940 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2941 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2942 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
2943 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2944 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2945 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2946 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
2947 // CHECK5-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
2948 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2949 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
2950 // CHECK5-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2951 // CHECK5:       cond.true:
2952 // CHECK5-NEXT:    br label [[COND_END:%.*]]
2953 // CHECK5:       cond.false:
2954 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2955 // CHECK5-NEXT:    br label [[COND_END]]
2956 // CHECK5:       cond.end:
2957 // CHECK5-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
2958 // CHECK5-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2959 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2960 // CHECK5-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
2961 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2962 // CHECK5:       omp.inner.for.cond:
2963 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !24
2964 // CHECK5-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !24
2965 // CHECK5-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
2966 // CHECK5-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2967 // CHECK5:       omp.inner.for.body:
2968 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !24
2969 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !24
2970 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !24
2971 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2972 // CHECK5:       omp.inner.for.inc:
2973 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !24
2974 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !24
2975 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
2976 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !24
2977 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP25:![0-9]+]]
2978 // CHECK5:       omp.inner.for.end:
2979 // CHECK5-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2980 // CHECK5:       omp.loop.exit:
2981 // CHECK5-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
2982 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
2983 // CHECK5-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
2984 // CHECK5-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
2985 // CHECK5:       .omp.final.then:
2986 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
2987 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
2988 // CHECK5:       .omp.final.done:
2989 // CHECK5-NEXT:    ret void
2990 //
2991 //
2992 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..7
2993 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
2994 // CHECK5-NEXT:  entry:
2995 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2996 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2997 // CHECK5-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
2998 // CHECK5-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
2999 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3000 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3001 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3002 // CHECK5-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3003 // CHECK5-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3004 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3005 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3006 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
3007 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3008 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3009 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3010 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3011 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3012 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3013 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3014 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
3015 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3016 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3017 // CHECK5-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
3018 // CHECK5-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
3019 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3020 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3021 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3022 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
3023 // CHECK5-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 61)
3024 // CHECK5-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
3025 // CHECK5:       omp.dispatch.cond:
3026 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3027 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3028 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], [[TMP6]]
3029 // CHECK5-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3030 // CHECK5:       cond.true:
3031 // CHECK5-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3032 // CHECK5-NEXT:    br label [[COND_END:%.*]]
3033 // CHECK5:       cond.false:
3034 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3035 // CHECK5-NEXT:    br label [[COND_END]]
3036 // CHECK5:       cond.end:
3037 // CHECK5-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP7]], [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]
3038 // CHECK5-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3039 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3040 // CHECK5-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_IV]], align 4
3041 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3042 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3043 // CHECK5-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]
3044 // CHECK5-NEXT:    br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
3045 // CHECK5:       omp.dispatch.body:
3046 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3047 // CHECK5:       omp.inner.for.cond:
3048 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !27
3049 // CHECK5-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !27
3050 // CHECK5-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]
3051 // CHECK5-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3052 // CHECK5:       omp.inner.for.body:
3053 // CHECK5-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !27
3054 // CHECK5-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP14]], 1
3055 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3056 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !27
3057 // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
3058 // CHECK5-NEXT:    [[TMP15:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !27
3059 // CHECK5-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP15]]
3060 // CHECK5-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !27
3061 // CHECK5-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3062 // CHECK5:       omp.body.continue:
3063 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3064 // CHECK5:       omp.inner.for.inc:
3065 // CHECK5-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !27
3066 // CHECK5-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP16]], 1
3067 // CHECK5-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !27
3068 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP28:![0-9]+]]
3069 // CHECK5:       omp.inner.for.end:
3070 // CHECK5-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
3071 // CHECK5:       omp.dispatch.inc:
3072 // CHECK5-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3073 // CHECK5-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3074 // CHECK5-NEXT:    [[ADD4:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]
3075 // CHECK5-NEXT:    store i32 [[ADD4]], i32* [[DOTOMP_LB]], align 4
3076 // CHECK5-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3077 // CHECK5-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3078 // CHECK5-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
3079 // CHECK5-NEXT:    store i32 [[ADD5]], i32* [[DOTOMP_UB]], align 4
3080 // CHECK5-NEXT:    br label [[OMP_DISPATCH_COND]]
3081 // CHECK5:       omp.dispatch.end:
3082 // CHECK5-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
3083 // CHECK5-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
3084 // CHECK5-NEXT:    [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0
3085 // CHECK5-NEXT:    br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
3086 // CHECK5:       .omp.final.then:
3087 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
3088 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
3089 // CHECK5:       .omp.final.done:
3090 // CHECK5-NEXT:    ret void
3091 //
3092 //
3093 // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52
3094 // CHECK5-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3095 // CHECK5-NEXT:  entry:
3096 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3097 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3098 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3099 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
3100 // CHECK5-NEXT:    ret void
3101 //
3102 //
3103 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..10
3104 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3105 // CHECK5-NEXT:  entry:
3106 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3107 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3108 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3109 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3110 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3111 // CHECK5-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3112 // CHECK5-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3113 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3114 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3115 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
3116 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3117 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3118 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3119 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3120 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3121 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
3122 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3123 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3124 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3125 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
3126 // CHECK5-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3127 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3128 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
3129 // CHECK5-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3130 // CHECK5:       cond.true:
3131 // CHECK5-NEXT:    br label [[COND_END:%.*]]
3132 // CHECK5:       cond.false:
3133 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3134 // CHECK5-NEXT:    br label [[COND_END]]
3135 // CHECK5:       cond.end:
3136 // CHECK5-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
3137 // CHECK5-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3138 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3139 // CHECK5-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
3140 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3141 // CHECK5:       omp.inner.for.cond:
3142 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !30
3143 // CHECK5-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !30
3144 // CHECK5-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
3145 // CHECK5-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3146 // CHECK5:       omp.inner.for.body:
3147 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !30
3148 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !30
3149 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !30
3150 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3151 // CHECK5:       omp.inner.for.inc:
3152 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !30
3153 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !30
3154 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
3155 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !30
3156 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP31:![0-9]+]]
3157 // CHECK5:       omp.inner.for.end:
3158 // CHECK5-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3159 // CHECK5:       omp.loop.exit:
3160 // CHECK5-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
3161 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
3162 // CHECK5-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
3163 // CHECK5-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
3164 // CHECK5:       .omp.final.then:
3165 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
3166 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
3167 // CHECK5:       .omp.final.done:
3168 // CHECK5-NEXT:    ret void
3169 //
3170 //
3171 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..11
3172 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3173 // CHECK5-NEXT:  entry:
3174 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3175 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3176 // CHECK5-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
3177 // CHECK5-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
3178 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3179 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3180 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3181 // CHECK5-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3182 // CHECK5-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3183 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3184 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3185 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
3186 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3187 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3188 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3189 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3190 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3191 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3192 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3193 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
3194 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3195 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3196 // CHECK5-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
3197 // CHECK5-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
3198 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3199 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3200 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3201 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3202 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3203 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
3204 // CHECK5-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 35, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 1)
3205 // CHECK5-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
3206 // CHECK5:       omp.dispatch.cond:
3207 // CHECK5-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
3208 // CHECK5-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
3209 // CHECK5-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
3210 // CHECK5:       omp.dispatch.body:
3211 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3212 // CHECK5-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
3213 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3214 // CHECK5:       omp.inner.for.cond:
3215 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !33
3216 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !33
3217 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
3218 // CHECK5-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3219 // CHECK5:       omp.inner.for.body:
3220 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !33
3221 // CHECK5-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
3222 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3223 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !33
3224 // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
3225 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !33
3226 // CHECK5-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP12]]
3227 // CHECK5-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !33
3228 // CHECK5-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3229 // CHECK5:       omp.body.continue:
3230 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3231 // CHECK5:       omp.inner.for.inc:
3232 // CHECK5-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !33
3233 // CHECK5-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP13]], 1
3234 // CHECK5-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !33
3235 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP34:![0-9]+]]
3236 // CHECK5:       omp.inner.for.end:
3237 // CHECK5-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
3238 // CHECK5:       omp.dispatch.inc:
3239 // CHECK5-NEXT:    br label [[OMP_DISPATCH_COND]]
3240 // CHECK5:       omp.dispatch.end:
3241 // CHECK5-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
3242 // CHECK5-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
3243 // CHECK5-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
3244 // CHECK5:       .omp.final.then:
3245 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
3246 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
3247 // CHECK5:       .omp.final.done:
3248 // CHECK5-NEXT:    ret void
3249 //
3250 //
3251 // CHECK5-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58
3252 // CHECK5-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3253 // CHECK5-NEXT:  entry:
3254 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3255 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3256 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3257 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..14 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
3258 // CHECK5-NEXT:    ret void
3259 //
3260 //
3261 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..14
3262 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3263 // CHECK5-NEXT:  entry:
3264 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3265 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3266 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3267 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3268 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3269 // CHECK5-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3270 // CHECK5-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3271 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3272 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3273 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
3274 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3275 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3276 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3277 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3278 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3279 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
3280 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3281 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3282 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3283 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
3284 // CHECK5-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3285 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3286 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
3287 // CHECK5-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3288 // CHECK5:       cond.true:
3289 // CHECK5-NEXT:    br label [[COND_END:%.*]]
3290 // CHECK5:       cond.false:
3291 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3292 // CHECK5-NEXT:    br label [[COND_END]]
3293 // CHECK5:       cond.end:
3294 // CHECK5-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
3295 // CHECK5-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3296 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3297 // CHECK5-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
3298 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3299 // CHECK5:       omp.inner.for.cond:
3300 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !36
3301 // CHECK5-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !36
3302 // CHECK5-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
3303 // CHECK5-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3304 // CHECK5:       omp.inner.for.body:
3305 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !36
3306 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !36
3307 // CHECK5-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !36
3308 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3309 // CHECK5:       omp.inner.for.inc:
3310 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !36
3311 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !36
3312 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
3313 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !36
3314 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP37:![0-9]+]]
3315 // CHECK5:       omp.inner.for.end:
3316 // CHECK5-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3317 // CHECK5:       omp.loop.exit:
3318 // CHECK5-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
3319 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
3320 // CHECK5-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
3321 // CHECK5-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
3322 // CHECK5:       .omp.final.then:
3323 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
3324 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
3325 // CHECK5:       .omp.final.done:
3326 // CHECK5-NEXT:    ret void
3327 //
3328 //
3329 // CHECK5-LABEL: define {{[^@]+}}@.omp_outlined..15
3330 // CHECK5-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3331 // CHECK5-NEXT:  entry:
3332 // CHECK5-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3333 // CHECK5-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3334 // CHECK5-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
3335 // CHECK5-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
3336 // CHECK5-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3337 // CHECK5-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3338 // CHECK5-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3339 // CHECK5-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3340 // CHECK5-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3341 // CHECK5-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3342 // CHECK5-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3343 // CHECK5-NEXT:    [[I:%.*]] = alloca i32, align 4
3344 // CHECK5-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3345 // CHECK5-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3346 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3347 // CHECK5-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3348 // CHECK5-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3349 // CHECK5-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3350 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3351 // CHECK5-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
3352 // CHECK5-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3353 // CHECK5-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3354 // CHECK5-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
3355 // CHECK5-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
3356 // CHECK5-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3357 // CHECK5-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3358 // CHECK5-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3359 // CHECK5-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3360 // CHECK5-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3361 // CHECK5-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
3362 // CHECK5-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 35, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 61)
3363 // CHECK5-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
3364 // CHECK5:       omp.dispatch.cond:
3365 // CHECK5-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
3366 // CHECK5-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
3367 // CHECK5-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
3368 // CHECK5:       omp.dispatch.body:
3369 // CHECK5-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3370 // CHECK5-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
3371 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3372 // CHECK5:       omp.inner.for.cond:
3373 // CHECK5-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !39
3374 // CHECK5-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !39
3375 // CHECK5-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
3376 // CHECK5-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3377 // CHECK5:       omp.inner.for.body:
3378 // CHECK5-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !39
3379 // CHECK5-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
3380 // CHECK5-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3381 // CHECK5-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !39
3382 // CHECK5-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
3383 // CHECK5-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !39
3384 // CHECK5-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP12]]
3385 // CHECK5-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !39
3386 // CHECK5-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3387 // CHECK5:       omp.body.continue:
3388 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3389 // CHECK5:       omp.inner.for.inc:
3390 // CHECK5-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !39
3391 // CHECK5-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP13]], 1
3392 // CHECK5-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !39
3393 // CHECK5-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP40:![0-9]+]]
3394 // CHECK5:       omp.inner.for.end:
3395 // CHECK5-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
3396 // CHECK5:       omp.dispatch.inc:
3397 // CHECK5-NEXT:    br label [[OMP_DISPATCH_COND]]
3398 // CHECK5:       omp.dispatch.end:
3399 // CHECK5-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
3400 // CHECK5-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
3401 // CHECK5-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
3402 // CHECK5:       .omp.final.then:
3403 // CHECK5-NEXT:    store i32 123, i32* [[I]], align 4
3404 // CHECK5-NEXT:    br label [[DOTOMP_FINAL_DONE]]
3405 // CHECK5:       .omp.final.done:
3406 // CHECK5-NEXT:    ret void
3407 //
3408 //
3409 // CHECK5-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
3410 // CHECK5-SAME: () #[[ATTR3:[0-9]+]] {
3411 // CHECK5-NEXT:  entry:
3412 // CHECK5-NEXT:    call void @__tgt_register_requires(i64 1)
3413 // CHECK5-NEXT:    ret void
3414 //
3415 //
3416 // CHECK6-LABEL: define {{[^@]+}}@_Z21teams_template_structv
3417 // CHECK6-SAME: () #[[ATTR0:[0-9]+]] {
3418 // CHECK6-NEXT:  entry:
3419 // CHECK6-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
3420 // CHECK6-NEXT:    [[CALL:%.*]] = call noundef i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* noundef nonnull align 4 dereferenceable(496) [[V]])
3421 // CHECK6-NEXT:    ret i32 [[CALL]]
3422 //
3423 //
3424 // CHECK6-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
3425 // CHECK6-SAME: (%struct.SS* noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
3426 // CHECK6-NEXT:  entry:
3427 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3428 // CHECK6-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 4
3429 // CHECK6-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 4
3430 // CHECK6-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 4
3431 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3432 // CHECK6-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
3433 // CHECK6-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
3434 // CHECK6-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
3435 // CHECK6-NEXT:    [[_TMP6:%.*]] = alloca i32, align 4
3436 // CHECK6-NEXT:    [[DOTOFFLOAD_BASEPTRS11:%.*]] = alloca [1 x i8*], align 4
3437 // CHECK6-NEXT:    [[DOTOFFLOAD_PTRS12:%.*]] = alloca [1 x i8*], align 4
3438 // CHECK6-NEXT:    [[DOTOFFLOAD_MAPPERS13:%.*]] = alloca [1 x i8*], align 4
3439 // CHECK6-NEXT:    [[_TMP14:%.*]] = alloca i32, align 4
3440 // CHECK6-NEXT:    [[DOTOFFLOAD_BASEPTRS19:%.*]] = alloca [1 x i8*], align 4
3441 // CHECK6-NEXT:    [[DOTOFFLOAD_PTRS20:%.*]] = alloca [1 x i8*], align 4
3442 // CHECK6-NEXT:    [[DOTOFFLOAD_MAPPERS21:%.*]] = alloca [1 x i8*], align 4
3443 // CHECK6-NEXT:    [[_TMP22:%.*]] = alloca i32, align 4
3444 // CHECK6-NEXT:    [[DOTOFFLOAD_BASEPTRS27:%.*]] = alloca [1 x i8*], align 4
3445 // CHECK6-NEXT:    [[DOTOFFLOAD_PTRS28:%.*]] = alloca [1 x i8*], align 4
3446 // CHECK6-NEXT:    [[DOTOFFLOAD_MAPPERS29:%.*]] = alloca [1 x i8*], align 4
3447 // CHECK6-NEXT:    [[_TMP30:%.*]] = alloca i32, align 4
3448 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3449 // CHECK6-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3450 // CHECK6-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
3451 // CHECK6-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3452 // CHECK6-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to %struct.SS**
3453 // CHECK6-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP1]], align 4
3454 // CHECK6-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3455 // CHECK6-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [123 x i32]**
3456 // CHECK6-NEXT:    store [123 x i32]* [[A]], [123 x i32]** [[TMP3]], align 4
3457 // CHECK6-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
3458 // CHECK6-NEXT:    store i8* null, i8** [[TMP4]], align 4
3459 // CHECK6-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3460 // CHECK6-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3461 // CHECK6-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
3462 // CHECK6-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
3463 // CHECK6-NEXT:    store i32 1, i32* [[TMP7]], align 4
3464 // CHECK6-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
3465 // CHECK6-NEXT:    store i32 1, i32* [[TMP8]], align 4
3466 // CHECK6-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
3467 // CHECK6-NEXT:    store i8** [[TMP5]], i8*** [[TMP9]], align 4
3468 // CHECK6-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
3469 // CHECK6-NEXT:    store i8** [[TMP6]], i8*** [[TMP10]], align 4
3470 // CHECK6-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
3471 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64** [[TMP11]], align 4
3472 // CHECK6-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
3473 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP12]], align 4
3474 // CHECK6-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
3475 // CHECK6-NEXT:    store i8** null, i8*** [[TMP13]], align 4
3476 // CHECK6-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
3477 // CHECK6-NEXT:    store i8** null, i8*** [[TMP14]], align 4
3478 // CHECK6-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
3479 // CHECK6-NEXT:    store i64 123, i64* [[TMP15]], align 8
3480 // CHECK6-NEXT:    [[TMP16:%.*]] = 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]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
3481 // CHECK6-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
3482 // CHECK6-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
3483 // CHECK6:       omp_offload.failed:
3484 // CHECK6-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36(%struct.SS* [[THIS1]]) #[[ATTR2:[0-9]+]]
3485 // CHECK6-NEXT:    br label [[OMP_OFFLOAD_CONT]]
3486 // CHECK6:       omp_offload.cont:
3487 // CHECK6-NEXT:    [[A2:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
3488 // CHECK6-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
3489 // CHECK6-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to %struct.SS**
3490 // CHECK6-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP19]], align 4
3491 // CHECK6-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
3492 // CHECK6-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [123 x i32]**
3493 // CHECK6-NEXT:    store [123 x i32]* [[A2]], [123 x i32]** [[TMP21]], align 4
3494 // CHECK6-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
3495 // CHECK6-NEXT:    store i8* null, i8** [[TMP22]], align 4
3496 // CHECK6-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
3497 // CHECK6-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
3498 // CHECK6-NEXT:    [[KERNEL_ARGS7:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
3499 // CHECK6-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 0
3500 // CHECK6-NEXT:    store i32 1, i32* [[TMP25]], align 4
3501 // CHECK6-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 1
3502 // CHECK6-NEXT:    store i32 1, i32* [[TMP26]], align 4
3503 // CHECK6-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 2
3504 // CHECK6-NEXT:    store i8** [[TMP23]], i8*** [[TMP27]], align 4
3505 // CHECK6-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 3
3506 // CHECK6-NEXT:    store i8** [[TMP24]], i8*** [[TMP28]], align 4
3507 // CHECK6-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 4
3508 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.4, i32 0, i32 0), i64** [[TMP29]], align 4
3509 // CHECK6-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 5
3510 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP30]], align 4
3511 // CHECK6-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 6
3512 // CHECK6-NEXT:    store i8** null, i8*** [[TMP31]], align 4
3513 // CHECK6-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 7
3514 // CHECK6-NEXT:    store i8** null, i8*** [[TMP32]], align 4
3515 // CHECK6-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]], i32 0, i32 8
3516 // CHECK6-NEXT:    store i64 123, i64* [[TMP33]], align 8
3517 // CHECK6-NEXT:    [[TMP34:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS7]])
3518 // CHECK6-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
3519 // CHECK6-NEXT:    br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED8:%.*]], label [[OMP_OFFLOAD_CONT9:%.*]]
3520 // CHECK6:       omp_offload.failed8:
3521 // CHECK6-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41(%struct.SS* [[THIS1]]) #[[ATTR2]]
3522 // CHECK6-NEXT:    br label [[OMP_OFFLOAD_CONT9]]
3523 // CHECK6:       omp_offload.cont9:
3524 // CHECK6-NEXT:    [[A10:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
3525 // CHECK6-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS11]], i32 0, i32 0
3526 // CHECK6-NEXT:    [[TMP37:%.*]] = bitcast i8** [[TMP36]] to %struct.SS**
3527 // CHECK6-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP37]], align 4
3528 // CHECK6-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS12]], i32 0, i32 0
3529 // CHECK6-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to [123 x i32]**
3530 // CHECK6-NEXT:    store [123 x i32]* [[A10]], [123 x i32]** [[TMP39]], align 4
3531 // CHECK6-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS13]], i32 0, i32 0
3532 // CHECK6-NEXT:    store i8* null, i8** [[TMP40]], align 4
3533 // CHECK6-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS11]], i32 0, i32 0
3534 // CHECK6-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS12]], i32 0, i32 0
3535 // CHECK6-NEXT:    [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
3536 // CHECK6-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 0
3537 // CHECK6-NEXT:    store i32 1, i32* [[TMP43]], align 4
3538 // CHECK6-NEXT:    [[TMP44:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 1
3539 // CHECK6-NEXT:    store i32 1, i32* [[TMP44]], align 4
3540 // CHECK6-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 2
3541 // CHECK6-NEXT:    store i8** [[TMP41]], i8*** [[TMP45]], align 4
3542 // CHECK6-NEXT:    [[TMP46:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 3
3543 // CHECK6-NEXT:    store i8** [[TMP42]], i8*** [[TMP46]], align 4
3544 // CHECK6-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 4
3545 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64** [[TMP47]], align 4
3546 // CHECK6-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 5
3547 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP48]], align 4
3548 // CHECK6-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 6
3549 // CHECK6-NEXT:    store i8** null, i8*** [[TMP49]], align 4
3550 // CHECK6-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 7
3551 // CHECK6-NEXT:    store i8** null, i8*** [[TMP50]], align 4
3552 // CHECK6-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 8
3553 // CHECK6-NEXT:    store i64 123, i64* [[TMP51]], align 8
3554 // CHECK6-NEXT:    [[TMP52:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]])
3555 // CHECK6-NEXT:    [[TMP53:%.*]] = icmp ne i32 [[TMP52]], 0
3556 // CHECK6-NEXT:    br i1 [[TMP53]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
3557 // CHECK6:       omp_offload.failed16:
3558 // CHECK6-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46(%struct.SS* [[THIS1]]) #[[ATTR2]]
3559 // CHECK6-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
3560 // CHECK6:       omp_offload.cont17:
3561 // CHECK6-NEXT:    [[A18:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
3562 // CHECK6-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
3563 // CHECK6-NEXT:    [[TMP55:%.*]] = bitcast i8** [[TMP54]] to %struct.SS**
3564 // CHECK6-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP55]], align 4
3565 // CHECK6-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
3566 // CHECK6-NEXT:    [[TMP57:%.*]] = bitcast i8** [[TMP56]] to [123 x i32]**
3567 // CHECK6-NEXT:    store [123 x i32]* [[A18]], [123 x i32]** [[TMP57]], align 4
3568 // CHECK6-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 0
3569 // CHECK6-NEXT:    store i8* null, i8** [[TMP58]], align 4
3570 // CHECK6-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
3571 // CHECK6-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
3572 // CHECK6-NEXT:    [[KERNEL_ARGS23:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
3573 // CHECK6-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 0
3574 // CHECK6-NEXT:    store i32 1, i32* [[TMP61]], align 4
3575 // CHECK6-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 1
3576 // CHECK6-NEXT:    store i32 1, i32* [[TMP62]], align 4
3577 // CHECK6-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 2
3578 // CHECK6-NEXT:    store i8** [[TMP59]], i8*** [[TMP63]], align 4
3579 // CHECK6-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 3
3580 // CHECK6-NEXT:    store i8** [[TMP60]], i8*** [[TMP64]], align 4
3581 // CHECK6-NEXT:    [[TMP65:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 4
3582 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.12, i32 0, i32 0), i64** [[TMP65]], align 4
3583 // CHECK6-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 5
3584 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP66]], align 4
3585 // CHECK6-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 6
3586 // CHECK6-NEXT:    store i8** null, i8*** [[TMP67]], align 4
3587 // CHECK6-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 7
3588 // CHECK6-NEXT:    store i8** null, i8*** [[TMP68]], align 4
3589 // CHECK6-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]], i32 0, i32 8
3590 // CHECK6-NEXT:    store i64 123, i64* [[TMP69]], align 8
3591 // CHECK6-NEXT:    [[TMP70:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS23]])
3592 // CHECK6-NEXT:    [[TMP71:%.*]] = icmp ne i32 [[TMP70]], 0
3593 // CHECK6-NEXT:    br i1 [[TMP71]], label [[OMP_OFFLOAD_FAILED24:%.*]], label [[OMP_OFFLOAD_CONT25:%.*]]
3594 // CHECK6:       omp_offload.failed24:
3595 // CHECK6-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52(%struct.SS* [[THIS1]]) #[[ATTR2]]
3596 // CHECK6-NEXT:    br label [[OMP_OFFLOAD_CONT25]]
3597 // CHECK6:       omp_offload.cont25:
3598 // CHECK6-NEXT:    [[A26:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
3599 // CHECK6-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS27]], i32 0, i32 0
3600 // CHECK6-NEXT:    [[TMP73:%.*]] = bitcast i8** [[TMP72]] to %struct.SS**
3601 // CHECK6-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP73]], align 4
3602 // CHECK6-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS28]], i32 0, i32 0
3603 // CHECK6-NEXT:    [[TMP75:%.*]] = bitcast i8** [[TMP74]] to [123 x i32]**
3604 // CHECK6-NEXT:    store [123 x i32]* [[A26]], [123 x i32]** [[TMP75]], align 4
3605 // CHECK6-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS29]], i32 0, i32 0
3606 // CHECK6-NEXT:    store i8* null, i8** [[TMP76]], align 4
3607 // CHECK6-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS27]], i32 0, i32 0
3608 // CHECK6-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS28]], i32 0, i32 0
3609 // CHECK6-NEXT:    [[KERNEL_ARGS31:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
3610 // CHECK6-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 0
3611 // CHECK6-NEXT:    store i32 1, i32* [[TMP79]], align 4
3612 // CHECK6-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 1
3613 // CHECK6-NEXT:    store i32 1, i32* [[TMP80]], align 4
3614 // CHECK6-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 2
3615 // CHECK6-NEXT:    store i8** [[TMP77]], i8*** [[TMP81]], align 4
3616 // CHECK6-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 3
3617 // CHECK6-NEXT:    store i8** [[TMP78]], i8*** [[TMP82]], align 4
3618 // CHECK6-NEXT:    [[TMP83:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 4
3619 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.16, i32 0, i32 0), i64** [[TMP83]], align 4
3620 // CHECK6-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 5
3621 // CHECK6-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP84]], align 4
3622 // CHECK6-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 6
3623 // CHECK6-NEXT:    store i8** null, i8*** [[TMP85]], align 4
3624 // CHECK6-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 7
3625 // CHECK6-NEXT:    store i8** null, i8*** [[TMP86]], align 4
3626 // CHECK6-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]], i32 0, i32 8
3627 // CHECK6-NEXT:    store i64 123, i64* [[TMP87]], align 8
3628 // CHECK6-NEXT:    [[TMP88:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS31]])
3629 // CHECK6-NEXT:    [[TMP89:%.*]] = icmp ne i32 [[TMP88]], 0
3630 // CHECK6-NEXT:    br i1 [[TMP89]], label [[OMP_OFFLOAD_FAILED32:%.*]], label [[OMP_OFFLOAD_CONT33:%.*]]
3631 // CHECK6:       omp_offload.failed32:
3632 // CHECK6-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58(%struct.SS* [[THIS1]]) #[[ATTR2]]
3633 // CHECK6-NEXT:    br label [[OMP_OFFLOAD_CONT33]]
3634 // CHECK6:       omp_offload.cont33:
3635 // CHECK6-NEXT:    [[A34:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
3636 // CHECK6-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A34]], i32 0, i32 0
3637 // CHECK6-NEXT:    [[TMP90:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
3638 // CHECK6-NEXT:    ret i32 [[TMP90]]
3639 //
3640 //
3641 // CHECK6-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l36
3642 // CHECK6-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {
3643 // CHECK6-NEXT:  entry:
3644 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3645 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3646 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3647 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined. to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
3648 // CHECK6-NEXT:    ret void
3649 //
3650 //
3651 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined.
3652 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3653 // CHECK6-NEXT:  entry:
3654 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3655 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3656 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3657 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3658 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3659 // CHECK6-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3660 // CHECK6-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3661 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3662 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3663 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
3664 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3665 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3666 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3667 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3668 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3669 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
3670 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3671 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3672 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3673 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
3674 // CHECK6-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3675 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3676 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
3677 // CHECK6-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3678 // CHECK6:       cond.true:
3679 // CHECK6-NEXT:    br label [[COND_END:%.*]]
3680 // CHECK6:       cond.false:
3681 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3682 // CHECK6-NEXT:    br label [[COND_END]]
3683 // CHECK6:       cond.end:
3684 // CHECK6-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
3685 // CHECK6-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3686 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3687 // CHECK6-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
3688 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3689 // CHECK6:       omp.inner.for.cond:
3690 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !9
3691 // CHECK6-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !9
3692 // CHECK6-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
3693 // CHECK6-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3694 // CHECK6:       omp.inner.for.body:
3695 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !9
3696 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !9
3697 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !9
3698 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3699 // CHECK6:       omp.inner.for.inc:
3700 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !9
3701 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !9
3702 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
3703 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !9
3704 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP10:![0-9]+]]
3705 // CHECK6:       omp.inner.for.end:
3706 // CHECK6-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3707 // CHECK6:       omp.loop.exit:
3708 // CHECK6-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
3709 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
3710 // CHECK6-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
3711 // CHECK6-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
3712 // CHECK6:       .omp.final.then:
3713 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
3714 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
3715 // CHECK6:       .omp.final.done:
3716 // CHECK6-NEXT:    ret void
3717 //
3718 //
3719 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined..1
3720 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3721 // CHECK6-NEXT:  entry:
3722 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3723 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3724 // CHECK6-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
3725 // CHECK6-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
3726 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3727 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3728 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3729 // CHECK6-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3730 // CHECK6-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3731 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3732 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3733 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
3734 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3735 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3736 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3737 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3738 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3739 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3740 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3741 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
3742 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3743 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3744 // CHECK6-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
3745 // CHECK6-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
3746 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3747 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3748 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3749 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
3750 // CHECK6-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3751 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3752 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
3753 // CHECK6-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3754 // CHECK6:       cond.true:
3755 // CHECK6-NEXT:    br label [[COND_END:%.*]]
3756 // CHECK6:       cond.false:
3757 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3758 // CHECK6-NEXT:    br label [[COND_END]]
3759 // CHECK6:       cond.end:
3760 // CHECK6-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
3761 // CHECK6-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3762 // CHECK6-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3763 // CHECK6-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
3764 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3765 // CHECK6:       omp.inner.for.cond:
3766 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
3767 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !13
3768 // CHECK6-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
3769 // CHECK6-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3770 // CHECK6:       omp.inner.for.body:
3771 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
3772 // CHECK6-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
3773 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3774 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !13
3775 // CHECK6-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
3776 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !13
3777 // CHECK6-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
3778 // CHECK6-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !13
3779 // CHECK6-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3780 // CHECK6:       omp.body.continue:
3781 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3782 // CHECK6:       omp.inner.for.inc:
3783 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
3784 // CHECK6-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
3785 // CHECK6-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
3786 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP14:![0-9]+]]
3787 // CHECK6:       omp.inner.for.end:
3788 // CHECK6-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3789 // CHECK6:       omp.loop.exit:
3790 // CHECK6-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
3791 // CHECK6-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
3792 // CHECK6-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
3793 // CHECK6-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
3794 // CHECK6:       .omp.final.then:
3795 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
3796 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
3797 // CHECK6:       .omp.final.done:
3798 // CHECK6-NEXT:    ret void
3799 //
3800 //
3801 // CHECK6-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l41
3802 // CHECK6-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3803 // CHECK6-NEXT:  entry:
3804 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3805 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3806 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3807 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
3808 // CHECK6-NEXT:    ret void
3809 //
3810 //
3811 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined..2
3812 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3813 // CHECK6-NEXT:  entry:
3814 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3815 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3816 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3817 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3818 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3819 // CHECK6-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3820 // CHECK6-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3821 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3822 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3823 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
3824 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3825 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3826 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3827 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3828 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3829 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
3830 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3831 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3832 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3833 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
3834 // CHECK6-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3835 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3836 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
3837 // CHECK6-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3838 // CHECK6:       cond.true:
3839 // CHECK6-NEXT:    br label [[COND_END:%.*]]
3840 // CHECK6:       cond.false:
3841 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3842 // CHECK6-NEXT:    br label [[COND_END]]
3843 // CHECK6:       cond.end:
3844 // CHECK6-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
3845 // CHECK6-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3846 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3847 // CHECK6-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
3848 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3849 // CHECK6:       omp.inner.for.cond:
3850 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
3851 // CHECK6-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !18
3852 // CHECK6-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
3853 // CHECK6-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3854 // CHECK6:       omp.inner.for.body:
3855 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !18
3856 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !18
3857 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !18
3858 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3859 // CHECK6:       omp.inner.for.inc:
3860 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
3861 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !18
3862 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
3863 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
3864 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP19:![0-9]+]]
3865 // CHECK6:       omp.inner.for.end:
3866 // CHECK6-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3867 // CHECK6:       omp.loop.exit:
3868 // CHECK6-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
3869 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
3870 // CHECK6-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
3871 // CHECK6-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
3872 // CHECK6:       .omp.final.then:
3873 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
3874 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
3875 // CHECK6:       .omp.final.done:
3876 // CHECK6-NEXT:    ret void
3877 //
3878 //
3879 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined..3
3880 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3881 // CHECK6-NEXT:  entry:
3882 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3883 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3884 // CHECK6-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
3885 // CHECK6-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
3886 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3887 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3888 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3889 // CHECK6-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3890 // CHECK6-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3891 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3892 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3893 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
3894 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3895 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3896 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3897 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3898 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3899 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3900 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3901 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
3902 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
3903 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
3904 // CHECK6-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
3905 // CHECK6-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
3906 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3907 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3908 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3909 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
3910 // CHECK6-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3911 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3912 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
3913 // CHECK6-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3914 // CHECK6:       cond.true:
3915 // CHECK6-NEXT:    br label [[COND_END:%.*]]
3916 // CHECK6:       cond.false:
3917 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3918 // CHECK6-NEXT:    br label [[COND_END]]
3919 // CHECK6:       cond.end:
3920 // CHECK6-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
3921 // CHECK6-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3922 // CHECK6-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3923 // CHECK6-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
3924 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3925 // CHECK6:       omp.inner.for.cond:
3926 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !21
3927 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !21
3928 // CHECK6-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
3929 // CHECK6-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3930 // CHECK6:       omp.inner.for.body:
3931 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !21
3932 // CHECK6-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
3933 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3934 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !21
3935 // CHECK6-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
3936 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !21
3937 // CHECK6-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
3938 // CHECK6-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !21
3939 // CHECK6-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3940 // CHECK6:       omp.body.continue:
3941 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3942 // CHECK6:       omp.inner.for.inc:
3943 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !21
3944 // CHECK6-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
3945 // CHECK6-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !21
3946 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP22:![0-9]+]]
3947 // CHECK6:       omp.inner.for.end:
3948 // CHECK6-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3949 // CHECK6:       omp.loop.exit:
3950 // CHECK6-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
3951 // CHECK6-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
3952 // CHECK6-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
3953 // CHECK6-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
3954 // CHECK6:       .omp.final.then:
3955 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
3956 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
3957 // CHECK6:       .omp.final.done:
3958 // CHECK6-NEXT:    ret void
3959 //
3960 //
3961 // CHECK6-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l46
3962 // CHECK6-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3963 // CHECK6-NEXT:  entry:
3964 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3965 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3966 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3967 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
3968 // CHECK6-NEXT:    ret void
3969 //
3970 //
3971 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined..6
3972 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
3973 // CHECK6-NEXT:  entry:
3974 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
3975 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
3976 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
3977 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3978 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3979 // CHECK6-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3980 // CHECK6-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3981 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3982 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3983 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
3984 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
3985 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
3986 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
3987 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
3988 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3989 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
3990 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3991 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3992 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
3993 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
3994 // CHECK6-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3995 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3996 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
3997 // CHECK6-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3998 // CHECK6:       cond.true:
3999 // CHECK6-NEXT:    br label [[COND_END:%.*]]
4000 // CHECK6:       cond.false:
4001 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4002 // CHECK6-NEXT:    br label [[COND_END]]
4003 // CHECK6:       cond.end:
4004 // CHECK6-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
4005 // CHECK6-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
4006 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4007 // CHECK6-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
4008 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4009 // CHECK6:       omp.inner.for.cond:
4010 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !24
4011 // CHECK6-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !24
4012 // CHECK6-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
4013 // CHECK6-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4014 // CHECK6:       omp.inner.for.body:
4015 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !24
4016 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !24
4017 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !24
4018 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4019 // CHECK6:       omp.inner.for.inc:
4020 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !24
4021 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !24
4022 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
4023 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !24
4024 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP25:![0-9]+]]
4025 // CHECK6:       omp.inner.for.end:
4026 // CHECK6-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4027 // CHECK6:       omp.loop.exit:
4028 // CHECK6-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
4029 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
4030 // CHECK6-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
4031 // CHECK6-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
4032 // CHECK6:       .omp.final.then:
4033 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
4034 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
4035 // CHECK6:       .omp.final.done:
4036 // CHECK6-NEXT:    ret void
4037 //
4038 //
4039 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined..7
4040 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
4041 // CHECK6-NEXT:  entry:
4042 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4043 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4044 // CHECK6-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
4045 // CHECK6-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
4046 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
4047 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4048 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4049 // CHECK6-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4050 // CHECK6-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4051 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4052 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4053 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
4054 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4055 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4056 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
4057 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4058 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
4059 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
4060 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
4061 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
4062 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
4063 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4064 // CHECK6-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
4065 // CHECK6-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
4066 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4067 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4068 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
4069 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
4070 // CHECK6-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 61)
4071 // CHECK6-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
4072 // CHECK6:       omp.dispatch.cond:
4073 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4074 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4075 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], [[TMP6]]
4076 // CHECK6-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4077 // CHECK6:       cond.true:
4078 // CHECK6-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4079 // CHECK6-NEXT:    br label [[COND_END:%.*]]
4080 // CHECK6:       cond.false:
4081 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4082 // CHECK6-NEXT:    br label [[COND_END]]
4083 // CHECK6:       cond.end:
4084 // CHECK6-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP7]], [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]
4085 // CHECK6-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
4086 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4087 // CHECK6-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_IV]], align 4
4088 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4089 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4090 // CHECK6-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]
4091 // CHECK6-NEXT:    br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
4092 // CHECK6:       omp.dispatch.body:
4093 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4094 // CHECK6:       omp.inner.for.cond:
4095 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !27
4096 // CHECK6-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !27
4097 // CHECK6-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]
4098 // CHECK6-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4099 // CHECK6:       omp.inner.for.body:
4100 // CHECK6-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !27
4101 // CHECK6-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP14]], 1
4102 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4103 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !27
4104 // CHECK6-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
4105 // CHECK6-NEXT:    [[TMP15:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !27
4106 // CHECK6-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP15]]
4107 // CHECK6-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !27
4108 // CHECK6-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4109 // CHECK6:       omp.body.continue:
4110 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4111 // CHECK6:       omp.inner.for.inc:
4112 // CHECK6-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !27
4113 // CHECK6-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP16]], 1
4114 // CHECK6-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !27
4115 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP28:![0-9]+]]
4116 // CHECK6:       omp.inner.for.end:
4117 // CHECK6-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
4118 // CHECK6:       omp.dispatch.inc:
4119 // CHECK6-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4120 // CHECK6-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
4121 // CHECK6-NEXT:    [[ADD4:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]
4122 // CHECK6-NEXT:    store i32 [[ADD4]], i32* [[DOTOMP_LB]], align 4
4123 // CHECK6-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4124 // CHECK6-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
4125 // CHECK6-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]
4126 // CHECK6-NEXT:    store i32 [[ADD5]], i32* [[DOTOMP_UB]], align 4
4127 // CHECK6-NEXT:    br label [[OMP_DISPATCH_COND]]
4128 // CHECK6:       omp.dispatch.end:
4129 // CHECK6-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
4130 // CHECK6-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
4131 // CHECK6-NEXT:    [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0
4132 // CHECK6-NEXT:    br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
4133 // CHECK6:       .omp.final.then:
4134 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
4135 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
4136 // CHECK6:       .omp.final.done:
4137 // CHECK6-NEXT:    ret void
4138 //
4139 //
4140 // CHECK6-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l52
4141 // CHECK6-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
4142 // CHECK6-NEXT:  entry:
4143 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
4144 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
4145 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
4146 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
4147 // CHECK6-NEXT:    ret void
4148 //
4149 //
4150 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined..10
4151 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
4152 // CHECK6-NEXT:  entry:
4153 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4154 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4155 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
4156 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4157 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4158 // CHECK6-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
4159 // CHECK6-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
4160 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4161 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4162 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
4163 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4164 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4165 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
4166 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
4167 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
4168 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
4169 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4170 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4171 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
4172 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
4173 // CHECK6-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
4174 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4175 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
4176 // CHECK6-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4177 // CHECK6:       cond.true:
4178 // CHECK6-NEXT:    br label [[COND_END:%.*]]
4179 // CHECK6:       cond.false:
4180 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4181 // CHECK6-NEXT:    br label [[COND_END]]
4182 // CHECK6:       cond.end:
4183 // CHECK6-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
4184 // CHECK6-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
4185 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4186 // CHECK6-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
4187 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4188 // CHECK6:       omp.inner.for.cond:
4189 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !30
4190 // CHECK6-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !30
4191 // CHECK6-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
4192 // CHECK6-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4193 // CHECK6:       omp.inner.for.body:
4194 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !30
4195 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !30
4196 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !30
4197 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4198 // CHECK6:       omp.inner.for.inc:
4199 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !30
4200 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !30
4201 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
4202 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !30
4203 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP31:![0-9]+]]
4204 // CHECK6:       omp.inner.for.end:
4205 // CHECK6-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4206 // CHECK6:       omp.loop.exit:
4207 // CHECK6-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
4208 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
4209 // CHECK6-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
4210 // CHECK6-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
4211 // CHECK6:       .omp.final.then:
4212 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
4213 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
4214 // CHECK6:       .omp.final.done:
4215 // CHECK6-NEXT:    ret void
4216 //
4217 //
4218 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined..11
4219 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
4220 // CHECK6-NEXT:  entry:
4221 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4222 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4223 // CHECK6-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
4224 // CHECK6-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
4225 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
4226 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4227 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4228 // CHECK6-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4229 // CHECK6-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4230 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4231 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4232 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
4233 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4234 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4235 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
4236 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4237 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
4238 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
4239 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
4240 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
4241 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
4242 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4243 // CHECK6-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
4244 // CHECK6-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
4245 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4246 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4247 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4248 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4249 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
4250 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
4251 // CHECK6-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 1073741859, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 1)
4252 // CHECK6-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
4253 // CHECK6:       omp.dispatch.cond:
4254 // CHECK6-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
4255 // CHECK6-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
4256 // CHECK6-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
4257 // CHECK6:       omp.dispatch.body:
4258 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4259 // CHECK6-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
4260 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4261 // CHECK6:       omp.inner.for.cond:
4262 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !33
4263 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !33
4264 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
4265 // CHECK6-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4266 // CHECK6:       omp.inner.for.body:
4267 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !33
4268 // CHECK6-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
4269 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4270 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !33
4271 // CHECK6-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
4272 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !33
4273 // CHECK6-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP12]]
4274 // CHECK6-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !33
4275 // CHECK6-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4276 // CHECK6:       omp.body.continue:
4277 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4278 // CHECK6:       omp.inner.for.inc:
4279 // CHECK6-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !33
4280 // CHECK6-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP13]], 1
4281 // CHECK6-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !33
4282 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP34:![0-9]+]]
4283 // CHECK6:       omp.inner.for.end:
4284 // CHECK6-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
4285 // CHECK6:       omp.dispatch.inc:
4286 // CHECK6-NEXT:    br label [[OMP_DISPATCH_COND]]
4287 // CHECK6:       omp.dispatch.end:
4288 // CHECK6-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
4289 // CHECK6-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
4290 // CHECK6-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
4291 // CHECK6:       .omp.final.then:
4292 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
4293 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
4294 // CHECK6:       .omp.final.done:
4295 // CHECK6-NEXT:    ret void
4296 //
4297 //
4298 // CHECK6-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l58
4299 // CHECK6-SAME: (%struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
4300 // CHECK6-NEXT:  entry:
4301 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
4302 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
4303 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
4304 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, %struct.SS*)* @.omp_outlined..14 to void (i32*, i32*, ...)*), %struct.SS* [[TMP0]])
4305 // CHECK6-NEXT:    ret void
4306 //
4307 //
4308 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined..14
4309 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
4310 // CHECK6-NEXT:  entry:
4311 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4312 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4313 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
4314 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4315 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4316 // CHECK6-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
4317 // CHECK6-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
4318 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4319 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4320 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
4321 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4322 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4323 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
4324 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
4325 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
4326 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
4327 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4328 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4329 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
4330 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
4331 // CHECK6-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
4332 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4333 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
4334 // CHECK6-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4335 // CHECK6:       cond.true:
4336 // CHECK6-NEXT:    br label [[COND_END:%.*]]
4337 // CHECK6:       cond.false:
4338 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4339 // CHECK6-NEXT:    br label [[COND_END]]
4340 // CHECK6:       cond.end:
4341 // CHECK6-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
4342 // CHECK6-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
4343 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4344 // CHECK6-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
4345 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4346 // CHECK6:       omp.inner.for.cond:
4347 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !36
4348 // CHECK6-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !36
4349 // CHECK6-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
4350 // CHECK6-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4351 // CHECK6:       omp.inner.for.body:
4352 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !36
4353 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !36
4354 // CHECK6-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, %struct.SS*)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], %struct.SS* [[TMP0]]), !llvm.access.group !36
4355 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4356 // CHECK6:       omp.inner.for.inc:
4357 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !36
4358 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !36
4359 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
4360 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !36
4361 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP37:![0-9]+]]
4362 // CHECK6:       omp.inner.for.end:
4363 // CHECK6-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4364 // CHECK6:       omp.loop.exit:
4365 // CHECK6-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
4366 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
4367 // CHECK6-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
4368 // CHECK6-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
4369 // CHECK6:       .omp.final.then:
4370 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
4371 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
4372 // CHECK6:       .omp.final.done:
4373 // CHECK6-NEXT:    ret void
4374 //
4375 //
4376 // CHECK6-LABEL: define {{[^@]+}}@.omp_outlined..15
4377 // CHECK6-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], %struct.SS* noundef [[THIS:%.*]]) #[[ATTR1]] {
4378 // CHECK6-NEXT:  entry:
4379 // CHECK6-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
4380 // CHECK6-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
4381 // CHECK6-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
4382 // CHECK6-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
4383 // CHECK6-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
4384 // CHECK6-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4385 // CHECK6-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4386 // CHECK6-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4387 // CHECK6-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4388 // CHECK6-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4389 // CHECK6-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4390 // CHECK6-NEXT:    [[I:%.*]] = alloca i32, align 4
4391 // CHECK6-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
4392 // CHECK6-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
4393 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
4394 // CHECK6-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4395 // CHECK6-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
4396 // CHECK6-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
4397 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
4398 // CHECK6-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
4399 // CHECK6-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
4400 // CHECK6-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
4401 // CHECK6-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
4402 // CHECK6-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
4403 // CHECK6-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4404 // CHECK6-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4405 // CHECK6-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4406 // CHECK6-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4407 // CHECK6-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
4408 // CHECK6-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
4409 // CHECK6-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 1073741859, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 61)
4410 // CHECK6-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
4411 // CHECK6:       omp.dispatch.cond:
4412 // CHECK6-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
4413 // CHECK6-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
4414 // CHECK6-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
4415 // CHECK6:       omp.dispatch.body:
4416 // CHECK6-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4417 // CHECK6-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
4418 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4419 // CHECK6:       omp.inner.for.cond:
4420 // CHECK6-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !39
4421 // CHECK6-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !39
4422 // CHECK6-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
4423 // CHECK6-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4424 // CHECK6:       omp.inner.for.body:
4425 // CHECK6-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !39
4426 // CHECK6-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
4427 // CHECK6-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4428 // CHECK6-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !39
4429 // CHECK6-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
4430 // CHECK6-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !39
4431 // CHECK6-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP12]]
4432 // CHECK6-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !39
4433 // CHECK6-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4434 // CHECK6:       omp.body.continue:
4435 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4436 // CHECK6:       omp.inner.for.inc:
4437 // CHECK6-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !39
4438 // CHECK6-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP13]], 1
4439 // CHECK6-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !39
4440 // CHECK6-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP40:![0-9]+]]
4441 // CHECK6:       omp.inner.for.end:
4442 // CHECK6-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
4443 // CHECK6:       omp.dispatch.inc:
4444 // CHECK6-NEXT:    br label [[OMP_DISPATCH_COND]]
4445 // CHECK6:       omp.dispatch.end:
4446 // CHECK6-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
4447 // CHECK6-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
4448 // CHECK6-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
4449 // CHECK6:       .omp.final.then:
4450 // CHECK6-NEXT:    store i32 123, i32* [[I]], align 4
4451 // CHECK6-NEXT:    br label [[DOTOMP_FINAL_DONE]]
4452 // CHECK6:       .omp.final.done:
4453 // CHECK6-NEXT:    ret void
4454 //
4455 //
4456 // CHECK6-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
4457 // CHECK6-SAME: () #[[ATTR3:[0-9]+]] {
4458 // CHECK6-NEXT:  entry:
4459 // CHECK6-NEXT:    call void @__tgt_register_requires(i64 1)
4460 // CHECK6-NEXT:    ret void
4461 //
4462 //
4463 // CHECK9-LABEL: define {{[^@]+}}@_Z21teams_template_structv
4464 // CHECK9-SAME: () #[[ATTR0:[0-9]+]] {
4465 // CHECK9-NEXT:  entry:
4466 // CHECK9-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
4467 // CHECK9-NEXT:    [[CALL:%.*]] = call noundef signext i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* noundef nonnull align 4 dereferenceable(496) [[V]])
4468 // CHECK9-NEXT:    ret i32 [[CALL]]
4469 //
4470 //
4471 // CHECK9-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
4472 // CHECK9-SAME: (%struct.SS* noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
4473 // CHECK9-NEXT:  entry:
4474 // CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
4475 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4476 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4477 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4478 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4479 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
4480 // CHECK9-NEXT:    [[_TMP3:%.*]] = alloca i32, align 4
4481 // CHECK9-NEXT:    [[DOTOMP_LB4:%.*]] = alloca i32, align 4
4482 // CHECK9-NEXT:    [[DOTOMP_UB5:%.*]] = alloca i32, align 4
4483 // CHECK9-NEXT:    [[DOTOMP_IV6:%.*]] = alloca i32, align 4
4484 // CHECK9-NEXT:    [[I7:%.*]] = alloca i32, align 4
4485 // CHECK9-NEXT:    [[_TMP20:%.*]] = alloca i32, align 4
4486 // CHECK9-NEXT:    [[DOTOMP_LB21:%.*]] = alloca i32, align 4
4487 // CHECK9-NEXT:    [[DOTOMP_UB22:%.*]] = alloca i32, align 4
4488 // CHECK9-NEXT:    [[DOTOMP_IV23:%.*]] = alloca i32, align 4
4489 // CHECK9-NEXT:    [[I24:%.*]] = alloca i32, align 4
4490 // CHECK9-NEXT:    [[_TMP37:%.*]] = alloca i32, align 4
4491 // CHECK9-NEXT:    [[DOTOMP_LB38:%.*]] = alloca i32, align 4
4492 // CHECK9-NEXT:    [[DOTOMP_UB39:%.*]] = alloca i32, align 4
4493 // CHECK9-NEXT:    [[DOTOMP_IV40:%.*]] = alloca i32, align 4
4494 // CHECK9-NEXT:    [[I41:%.*]] = alloca i32, align 4
4495 // CHECK9-NEXT:    [[_TMP54:%.*]] = alloca i32, align 4
4496 // CHECK9-NEXT:    [[DOTOMP_LB55:%.*]] = alloca i32, align 4
4497 // CHECK9-NEXT:    [[DOTOMP_UB56:%.*]] = alloca i32, align 4
4498 // CHECK9-NEXT:    [[DOTOMP_IV57:%.*]] = alloca i32, align 4
4499 // CHECK9-NEXT:    [[I58:%.*]] = alloca i32, align 4
4500 // CHECK9-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
4501 // CHECK9-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
4502 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
4503 // CHECK9-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
4504 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4505 // CHECK9-NEXT:    store i32 [[TMP0]], i32* [[DOTOMP_IV]], align 4
4506 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4507 // CHECK9:       omp.inner.for.cond:
4508 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !2
4509 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !2
4510 // CHECK9-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]
4511 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4512 // CHECK9:       omp.inner.for.body:
4513 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !2
4514 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP3]], 1
4515 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4516 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !2
4517 // CHECK9-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
4518 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !2
4519 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64
4520 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
4521 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !2
4522 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4523 // CHECK9:       omp.body.continue:
4524 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4525 // CHECK9:       omp.inner.for.inc:
4526 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !2
4527 // CHECK9-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP5]], 1
4528 // CHECK9-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !2
4529 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]
4530 // CHECK9:       omp.inner.for.end:
4531 // CHECK9-NEXT:    store i32 123, i32* [[I]], align 4
4532 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB4]], align 4
4533 // CHECK9-NEXT:    store i32 122, i32* [[DOTOMP_UB5]], align 4
4534 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_LB4]], align 4
4535 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_IV6]], align 4
4536 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND8:%.*]]
4537 // CHECK9:       omp.inner.for.cond8:
4538 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_IV6]], align 4, !llvm.access.group !6
4539 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB5]], align 4, !llvm.access.group !6
4540 // CHECK9-NEXT:    [[CMP9:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]
4541 // CHECK9-NEXT:    br i1 [[CMP9]], label [[OMP_INNER_FOR_BODY10:%.*]], label [[OMP_INNER_FOR_END19:%.*]]
4542 // CHECK9:       omp.inner.for.body10:
4543 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV6]], align 4, !llvm.access.group !6
4544 // CHECK9-NEXT:    [[MUL11:%.*]] = mul nsw i32 [[TMP9]], 1
4545 // CHECK9-NEXT:    [[ADD12:%.*]] = add nsw i32 0, [[MUL11]]
4546 // CHECK9-NEXT:    store i32 [[ADD12]], i32* [[I7]], align 4, !llvm.access.group !6
4547 // CHECK9-NEXT:    [[A13:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4548 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[I7]], align 4, !llvm.access.group !6
4549 // CHECK9-NEXT:    [[IDXPROM14:%.*]] = sext i32 [[TMP10]] to i64
4550 // CHECK9-NEXT:    [[ARRAYIDX15:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A13]], i64 0, i64 [[IDXPROM14]]
4551 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX15]], align 4, !llvm.access.group !6
4552 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE16:%.*]]
4553 // CHECK9:       omp.body.continue16:
4554 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC17:%.*]]
4555 // CHECK9:       omp.inner.for.inc17:
4556 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV6]], align 4, !llvm.access.group !6
4557 // CHECK9-NEXT:    [[ADD18:%.*]] = add nsw i32 [[TMP11]], 1
4558 // CHECK9-NEXT:    store i32 [[ADD18]], i32* [[DOTOMP_IV6]], align 4, !llvm.access.group !6
4559 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND8]], !llvm.loop [[LOOP7:![0-9]+]]
4560 // CHECK9:       omp.inner.for.end19:
4561 // CHECK9-NEXT:    store i32 123, i32* [[I7]], align 4
4562 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB21]], align 4
4563 // CHECK9-NEXT:    store i32 122, i32* [[DOTOMP_UB22]], align 4
4564 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_LB21]], align 4
4565 // CHECK9-NEXT:    store i32 [[TMP12]], i32* [[DOTOMP_IV23]], align 4
4566 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND25:%.*]]
4567 // CHECK9:       omp.inner.for.cond25:
4568 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV23]], align 4, !llvm.access.group !9
4569 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB22]], align 4, !llvm.access.group !9
4570 // CHECK9-NEXT:    [[CMP26:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
4571 // CHECK9-NEXT:    br i1 [[CMP26]], label [[OMP_INNER_FOR_BODY27:%.*]], label [[OMP_INNER_FOR_END36:%.*]]
4572 // CHECK9:       omp.inner.for.body27:
4573 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV23]], align 4, !llvm.access.group !9
4574 // CHECK9-NEXT:    [[MUL28:%.*]] = mul nsw i32 [[TMP15]], 1
4575 // CHECK9-NEXT:    [[ADD29:%.*]] = add nsw i32 0, [[MUL28]]
4576 // CHECK9-NEXT:    store i32 [[ADD29]], i32* [[I24]], align 4, !llvm.access.group !9
4577 // CHECK9-NEXT:    [[A30:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4578 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[I24]], align 4, !llvm.access.group !9
4579 // CHECK9-NEXT:    [[IDXPROM31:%.*]] = sext i32 [[TMP16]] to i64
4580 // CHECK9-NEXT:    [[ARRAYIDX32:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A30]], i64 0, i64 [[IDXPROM31]]
4581 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX32]], align 4, !llvm.access.group !9
4582 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE33:%.*]]
4583 // CHECK9:       omp.body.continue33:
4584 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC34:%.*]]
4585 // CHECK9:       omp.inner.for.inc34:
4586 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV23]], align 4, !llvm.access.group !9
4587 // CHECK9-NEXT:    [[ADD35:%.*]] = add nsw i32 [[TMP17]], 1
4588 // CHECK9-NEXT:    store i32 [[ADD35]], i32* [[DOTOMP_IV23]], align 4, !llvm.access.group !9
4589 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND25]], !llvm.loop [[LOOP10:![0-9]+]]
4590 // CHECK9:       omp.inner.for.end36:
4591 // CHECK9-NEXT:    store i32 123, i32* [[I24]], align 4
4592 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB38]], align 4
4593 // CHECK9-NEXT:    store i32 122, i32* [[DOTOMP_UB39]], align 4
4594 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB38]], align 4
4595 // CHECK9-NEXT:    store i32 [[TMP18]], i32* [[DOTOMP_IV40]], align 4
4596 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND42:%.*]]
4597 // CHECK9:       omp.inner.for.cond42:
4598 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV40]], align 4, !llvm.access.group !12
4599 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB39]], align 4, !llvm.access.group !12
4600 // CHECK9-NEXT:    [[CMP43:%.*]] = icmp sle i32 [[TMP19]], [[TMP20]]
4601 // CHECK9-NEXT:    br i1 [[CMP43]], label [[OMP_INNER_FOR_BODY44:%.*]], label [[OMP_INNER_FOR_END53:%.*]]
4602 // CHECK9:       omp.inner.for.body44:
4603 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV40]], align 4, !llvm.access.group !12
4604 // CHECK9-NEXT:    [[MUL45:%.*]] = mul nsw i32 [[TMP21]], 1
4605 // CHECK9-NEXT:    [[ADD46:%.*]] = add nsw i32 0, [[MUL45]]
4606 // CHECK9-NEXT:    store i32 [[ADD46]], i32* [[I41]], align 4, !llvm.access.group !12
4607 // CHECK9-NEXT:    [[A47:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4608 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[I41]], align 4, !llvm.access.group !12
4609 // CHECK9-NEXT:    [[IDXPROM48:%.*]] = sext i32 [[TMP22]] to i64
4610 // CHECK9-NEXT:    [[ARRAYIDX49:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A47]], i64 0, i64 [[IDXPROM48]]
4611 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX49]], align 4, !llvm.access.group !12
4612 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE50:%.*]]
4613 // CHECK9:       omp.body.continue50:
4614 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC51:%.*]]
4615 // CHECK9:       omp.inner.for.inc51:
4616 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV40]], align 4, !llvm.access.group !12
4617 // CHECK9-NEXT:    [[ADD52:%.*]] = add nsw i32 [[TMP23]], 1
4618 // CHECK9-NEXT:    store i32 [[ADD52]], i32* [[DOTOMP_IV40]], align 4, !llvm.access.group !12
4619 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND42]], !llvm.loop [[LOOP13:![0-9]+]]
4620 // CHECK9:       omp.inner.for.end53:
4621 // CHECK9-NEXT:    store i32 123, i32* [[I41]], align 4
4622 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB55]], align 4
4623 // CHECK9-NEXT:    store i32 122, i32* [[DOTOMP_UB56]], align 4
4624 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_LB55]], align 4
4625 // CHECK9-NEXT:    store i32 [[TMP24]], i32* [[DOTOMP_IV57]], align 4
4626 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND59:%.*]]
4627 // CHECK9:       omp.inner.for.cond59:
4628 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV57]], align 4, !llvm.access.group !15
4629 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_UB56]], align 4, !llvm.access.group !15
4630 // CHECK9-NEXT:    [[CMP60:%.*]] = icmp sle i32 [[TMP25]], [[TMP26]]
4631 // CHECK9-NEXT:    br i1 [[CMP60]], label [[OMP_INNER_FOR_BODY61:%.*]], label [[OMP_INNER_FOR_END70:%.*]]
4632 // CHECK9:       omp.inner.for.body61:
4633 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_IV57]], align 4, !llvm.access.group !15
4634 // CHECK9-NEXT:    [[MUL62:%.*]] = mul nsw i32 [[TMP27]], 1
4635 // CHECK9-NEXT:    [[ADD63:%.*]] = add nsw i32 0, [[MUL62]]
4636 // CHECK9-NEXT:    store i32 [[ADD63]], i32* [[I58]], align 4, !llvm.access.group !15
4637 // CHECK9-NEXT:    [[A64:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4638 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I58]], align 4, !llvm.access.group !15
4639 // CHECK9-NEXT:    [[IDXPROM65:%.*]] = sext i32 [[TMP28]] to i64
4640 // CHECK9-NEXT:    [[ARRAYIDX66:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A64]], i64 0, i64 [[IDXPROM65]]
4641 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX66]], align 4, !llvm.access.group !15
4642 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE67:%.*]]
4643 // CHECK9:       omp.body.continue67:
4644 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC68:%.*]]
4645 // CHECK9:       omp.inner.for.inc68:
4646 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_IV57]], align 4, !llvm.access.group !15
4647 // CHECK9-NEXT:    [[ADD69:%.*]] = add nsw i32 [[TMP29]], 1
4648 // CHECK9-NEXT:    store i32 [[ADD69]], i32* [[DOTOMP_IV57]], align 4, !llvm.access.group !15
4649 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND59]], !llvm.loop [[LOOP16:![0-9]+]]
4650 // CHECK9:       omp.inner.for.end70:
4651 // CHECK9-NEXT:    store i32 123, i32* [[I58]], align 4
4652 // CHECK9-NEXT:    [[A71:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4653 // CHECK9-NEXT:    [[ARRAYIDX72:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A71]], i64 0, i64 0
4654 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[ARRAYIDX72]], align 4
4655 // CHECK9-NEXT:    ret i32 [[TMP30]]
4656 //
4657 //
4658 // CHECK11-LABEL: define {{[^@]+}}@_Z21teams_template_structv
4659 // CHECK11-SAME: () #[[ATTR0:[0-9]+]] {
4660 // CHECK11-NEXT:  entry:
4661 // CHECK11-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
4662 // CHECK11-NEXT:    [[CALL:%.*]] = call noundef i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* noundef nonnull align 4 dereferenceable(496) [[V]])
4663 // CHECK11-NEXT:    ret i32 [[CALL]]
4664 //
4665 //
4666 // CHECK11-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
4667 // CHECK11-SAME: (%struct.SS* noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
4668 // CHECK11-NEXT:  entry:
4669 // CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
4670 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4671 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4672 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4673 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4674 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
4675 // CHECK11-NEXT:    [[_TMP3:%.*]] = alloca i32, align 4
4676 // CHECK11-NEXT:    [[DOTOMP_LB4:%.*]] = alloca i32, align 4
4677 // CHECK11-NEXT:    [[DOTOMP_UB5:%.*]] = alloca i32, align 4
4678 // CHECK11-NEXT:    [[DOTOMP_IV6:%.*]] = alloca i32, align 4
4679 // CHECK11-NEXT:    [[I7:%.*]] = alloca i32, align 4
4680 // CHECK11-NEXT:    [[_TMP19:%.*]] = alloca i32, align 4
4681 // CHECK11-NEXT:    [[DOTOMP_LB20:%.*]] = alloca i32, align 4
4682 // CHECK11-NEXT:    [[DOTOMP_UB21:%.*]] = alloca i32, align 4
4683 // CHECK11-NEXT:    [[DOTOMP_IV22:%.*]] = alloca i32, align 4
4684 // CHECK11-NEXT:    [[I23:%.*]] = alloca i32, align 4
4685 // CHECK11-NEXT:    [[_TMP35:%.*]] = alloca i32, align 4
4686 // CHECK11-NEXT:    [[DOTOMP_LB36:%.*]] = alloca i32, align 4
4687 // CHECK11-NEXT:    [[DOTOMP_UB37:%.*]] = alloca i32, align 4
4688 // CHECK11-NEXT:    [[DOTOMP_IV38:%.*]] = alloca i32, align 4
4689 // CHECK11-NEXT:    [[I39:%.*]] = alloca i32, align 4
4690 // CHECK11-NEXT:    [[_TMP51:%.*]] = alloca i32, align 4
4691 // CHECK11-NEXT:    [[DOTOMP_LB52:%.*]] = alloca i32, align 4
4692 // CHECK11-NEXT:    [[DOTOMP_UB53:%.*]] = alloca i32, align 4
4693 // CHECK11-NEXT:    [[DOTOMP_IV54:%.*]] = alloca i32, align 4
4694 // CHECK11-NEXT:    [[I55:%.*]] = alloca i32, align 4
4695 // CHECK11-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
4696 // CHECK11-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
4697 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
4698 // CHECK11-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
4699 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4700 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[DOTOMP_IV]], align 4
4701 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4702 // CHECK11:       omp.inner.for.cond:
4703 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !3
4704 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !3
4705 // CHECK11-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]
4706 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4707 // CHECK11:       omp.inner.for.body:
4708 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !3
4709 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP3]], 1
4710 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4711 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !3
4712 // CHECK11-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
4713 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !3
4714 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP4]]
4715 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !3
4716 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4717 // CHECK11:       omp.body.continue:
4718 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4719 // CHECK11:       omp.inner.for.inc:
4720 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !3
4721 // CHECK11-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP5]], 1
4722 // CHECK11-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !3
4723 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]
4724 // CHECK11:       omp.inner.for.end:
4725 // CHECK11-NEXT:    store i32 123, i32* [[I]], align 4
4726 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB4]], align 4
4727 // CHECK11-NEXT:    store i32 122, i32* [[DOTOMP_UB5]], align 4
4728 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_LB4]], align 4
4729 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_IV6]], align 4
4730 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND8:%.*]]
4731 // CHECK11:       omp.inner.for.cond8:
4732 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_IV6]], align 4, !llvm.access.group !7
4733 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB5]], align 4, !llvm.access.group !7
4734 // CHECK11-NEXT:    [[CMP9:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]
4735 // CHECK11-NEXT:    br i1 [[CMP9]], label [[OMP_INNER_FOR_BODY10:%.*]], label [[OMP_INNER_FOR_END18:%.*]]
4736 // CHECK11:       omp.inner.for.body10:
4737 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV6]], align 4, !llvm.access.group !7
4738 // CHECK11-NEXT:    [[MUL11:%.*]] = mul nsw i32 [[TMP9]], 1
4739 // CHECK11-NEXT:    [[ADD12:%.*]] = add nsw i32 0, [[MUL11]]
4740 // CHECK11-NEXT:    store i32 [[ADD12]], i32* [[I7]], align 4, !llvm.access.group !7
4741 // CHECK11-NEXT:    [[A13:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4742 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[I7]], align 4, !llvm.access.group !7
4743 // CHECK11-NEXT:    [[ARRAYIDX14:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A13]], i32 0, i32 [[TMP10]]
4744 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX14]], align 4, !llvm.access.group !7
4745 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE15:%.*]]
4746 // CHECK11:       omp.body.continue15:
4747 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC16:%.*]]
4748 // CHECK11:       omp.inner.for.inc16:
4749 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV6]], align 4, !llvm.access.group !7
4750 // CHECK11-NEXT:    [[ADD17:%.*]] = add nsw i32 [[TMP11]], 1
4751 // CHECK11-NEXT:    store i32 [[ADD17]], i32* [[DOTOMP_IV6]], align 4, !llvm.access.group !7
4752 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND8]], !llvm.loop [[LOOP8:![0-9]+]]
4753 // CHECK11:       omp.inner.for.end18:
4754 // CHECK11-NEXT:    store i32 123, i32* [[I7]], align 4
4755 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB20]], align 4
4756 // CHECK11-NEXT:    store i32 122, i32* [[DOTOMP_UB21]], align 4
4757 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_LB20]], align 4
4758 // CHECK11-NEXT:    store i32 [[TMP12]], i32* [[DOTOMP_IV22]], align 4
4759 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND24:%.*]]
4760 // CHECK11:       omp.inner.for.cond24:
4761 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV22]], align 4, !llvm.access.group !10
4762 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB21]], align 4, !llvm.access.group !10
4763 // CHECK11-NEXT:    [[CMP25:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
4764 // CHECK11-NEXT:    br i1 [[CMP25]], label [[OMP_INNER_FOR_BODY26:%.*]], label [[OMP_INNER_FOR_END34:%.*]]
4765 // CHECK11:       omp.inner.for.body26:
4766 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV22]], align 4, !llvm.access.group !10
4767 // CHECK11-NEXT:    [[MUL27:%.*]] = mul nsw i32 [[TMP15]], 1
4768 // CHECK11-NEXT:    [[ADD28:%.*]] = add nsw i32 0, [[MUL27]]
4769 // CHECK11-NEXT:    store i32 [[ADD28]], i32* [[I23]], align 4, !llvm.access.group !10
4770 // CHECK11-NEXT:    [[A29:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4771 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[I23]], align 4, !llvm.access.group !10
4772 // CHECK11-NEXT:    [[ARRAYIDX30:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A29]], i32 0, i32 [[TMP16]]
4773 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX30]], align 4, !llvm.access.group !10
4774 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE31:%.*]]
4775 // CHECK11:       omp.body.continue31:
4776 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC32:%.*]]
4777 // CHECK11:       omp.inner.for.inc32:
4778 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV22]], align 4, !llvm.access.group !10
4779 // CHECK11-NEXT:    [[ADD33:%.*]] = add nsw i32 [[TMP17]], 1
4780 // CHECK11-NEXT:    store i32 [[ADD33]], i32* [[DOTOMP_IV22]], align 4, !llvm.access.group !10
4781 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND24]], !llvm.loop [[LOOP11:![0-9]+]]
4782 // CHECK11:       omp.inner.for.end34:
4783 // CHECK11-NEXT:    store i32 123, i32* [[I23]], align 4
4784 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB36]], align 4
4785 // CHECK11-NEXT:    store i32 122, i32* [[DOTOMP_UB37]], align 4
4786 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB36]], align 4
4787 // CHECK11-NEXT:    store i32 [[TMP18]], i32* [[DOTOMP_IV38]], align 4
4788 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND40:%.*]]
4789 // CHECK11:       omp.inner.for.cond40:
4790 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV38]], align 4, !llvm.access.group !13
4791 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB37]], align 4, !llvm.access.group !13
4792 // CHECK11-NEXT:    [[CMP41:%.*]] = icmp sle i32 [[TMP19]], [[TMP20]]
4793 // CHECK11-NEXT:    br i1 [[CMP41]], label [[OMP_INNER_FOR_BODY42:%.*]], label [[OMP_INNER_FOR_END50:%.*]]
4794 // CHECK11:       omp.inner.for.body42:
4795 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV38]], align 4, !llvm.access.group !13
4796 // CHECK11-NEXT:    [[MUL43:%.*]] = mul nsw i32 [[TMP21]], 1
4797 // CHECK11-NEXT:    [[ADD44:%.*]] = add nsw i32 0, [[MUL43]]
4798 // CHECK11-NEXT:    store i32 [[ADD44]], i32* [[I39]], align 4, !llvm.access.group !13
4799 // CHECK11-NEXT:    [[A45:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4800 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[I39]], align 4, !llvm.access.group !13
4801 // CHECK11-NEXT:    [[ARRAYIDX46:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A45]], i32 0, i32 [[TMP22]]
4802 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX46]], align 4, !llvm.access.group !13
4803 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE47:%.*]]
4804 // CHECK11:       omp.body.continue47:
4805 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC48:%.*]]
4806 // CHECK11:       omp.inner.for.inc48:
4807 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV38]], align 4, !llvm.access.group !13
4808 // CHECK11-NEXT:    [[ADD49:%.*]] = add nsw i32 [[TMP23]], 1
4809 // CHECK11-NEXT:    store i32 [[ADD49]], i32* [[DOTOMP_IV38]], align 4, !llvm.access.group !13
4810 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND40]], !llvm.loop [[LOOP14:![0-9]+]]
4811 // CHECK11:       omp.inner.for.end50:
4812 // CHECK11-NEXT:    store i32 123, i32* [[I39]], align 4
4813 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB52]], align 4
4814 // CHECK11-NEXT:    store i32 122, i32* [[DOTOMP_UB53]], align 4
4815 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_LB52]], align 4
4816 // CHECK11-NEXT:    store i32 [[TMP24]], i32* [[DOTOMP_IV54]], align 4
4817 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND56:%.*]]
4818 // CHECK11:       omp.inner.for.cond56:
4819 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV54]], align 4, !llvm.access.group !16
4820 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_UB53]], align 4, !llvm.access.group !16
4821 // CHECK11-NEXT:    [[CMP57:%.*]] = icmp sle i32 [[TMP25]], [[TMP26]]
4822 // CHECK11-NEXT:    br i1 [[CMP57]], label [[OMP_INNER_FOR_BODY58:%.*]], label [[OMP_INNER_FOR_END66:%.*]]
4823 // CHECK11:       omp.inner.for.body58:
4824 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_IV54]], align 4, !llvm.access.group !16
4825 // CHECK11-NEXT:    [[MUL59:%.*]] = mul nsw i32 [[TMP27]], 1
4826 // CHECK11-NEXT:    [[ADD60:%.*]] = add nsw i32 0, [[MUL59]]
4827 // CHECK11-NEXT:    store i32 [[ADD60]], i32* [[I55]], align 4, !llvm.access.group !16
4828 // CHECK11-NEXT:    [[A61:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4829 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[I55]], align 4, !llvm.access.group !16
4830 // CHECK11-NEXT:    [[ARRAYIDX62:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A61]], i32 0, i32 [[TMP28]]
4831 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX62]], align 4, !llvm.access.group !16
4832 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE63:%.*]]
4833 // CHECK11:       omp.body.continue63:
4834 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC64:%.*]]
4835 // CHECK11:       omp.inner.for.inc64:
4836 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_IV54]], align 4, !llvm.access.group !16
4837 // CHECK11-NEXT:    [[ADD65:%.*]] = add nsw i32 [[TMP29]], 1
4838 // CHECK11-NEXT:    store i32 [[ADD65]], i32* [[DOTOMP_IV54]], align 4, !llvm.access.group !16
4839 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND56]], !llvm.loop [[LOOP17:![0-9]+]]
4840 // CHECK11:       omp.inner.for.end66:
4841 // CHECK11-NEXT:    store i32 123, i32* [[I55]], align 4
4842 // CHECK11-NEXT:    [[A67:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
4843 // CHECK11-NEXT:    [[ARRAYIDX68:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A67]], i32 0, i32 0
4844 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[ARRAYIDX68]], align 4
4845 // CHECK11-NEXT:    ret i32 [[TMP30]]
4846 //
4847 //
4848 // CHECK13-LABEL: define {{[^@]+}}@main
4849 // CHECK13-SAME: (i32 noundef signext [[ARGC:%.*]], i8** noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
4850 // CHECK13-NEXT:  entry:
4851 // CHECK13-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
4852 // CHECK13-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
4853 // CHECK13-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 8
4854 // CHECK13-NEXT:    [[N:%.*]] = alloca i32, align 4
4855 // CHECK13-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 8
4856 // CHECK13-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i64, align 8
4857 // CHECK13-NEXT:    [[M:%.*]] = alloca i32, align 4
4858 // CHECK13-NEXT:    [[N_CASTED:%.*]] = alloca i64, align 8
4859 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
4860 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
4861 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
4862 // CHECK13-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 8
4863 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4864 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4865 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4866 // CHECK13-NEXT:    [[N_CASTED3:%.*]] = alloca i64, align 8
4867 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [3 x i8*], align 8
4868 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS6:%.*]] = alloca [3 x i8*], align 8
4869 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [3 x i8*], align 8
4870 // CHECK13-NEXT:    [[DOTOFFLOAD_SIZES8:%.*]] = alloca [3 x i64], align 8
4871 // CHECK13-NEXT:    [[_TMP9:%.*]] = alloca i32, align 4
4872 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
4873 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_11:%.*]] = alloca i32, align 4
4874 // CHECK13-NEXT:    [[M_CASTED:%.*]] = alloca i64, align 8
4875 // CHECK13-NEXT:    [[N_CASTED20:%.*]] = alloca i64, align 8
4876 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS22:%.*]] = alloca [4 x i8*], align 8
4877 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS23:%.*]] = alloca [4 x i8*], align 8
4878 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS24:%.*]] = alloca [4 x i8*], align 8
4879 // CHECK13-NEXT:    [[DOTOFFLOAD_SIZES25:%.*]] = alloca [4 x i64], align 8
4880 // CHECK13-NEXT:    [[_TMP26:%.*]] = alloca i32, align 4
4881 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_27:%.*]] = alloca i32, align 4
4882 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_28:%.*]] = alloca i32, align 4
4883 // CHECK13-NEXT:    [[N_CASTED36:%.*]] = alloca i64, align 8
4884 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS38:%.*]] = alloca [3 x i8*], align 8
4885 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS39:%.*]] = alloca [3 x i8*], align 8
4886 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS40:%.*]] = alloca [3 x i8*], align 8
4887 // CHECK13-NEXT:    [[DOTOFFLOAD_SIZES41:%.*]] = alloca [3 x i64], align 8
4888 // CHECK13-NEXT:    [[_TMP42:%.*]] = alloca i32, align 4
4889 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_43:%.*]] = alloca i32, align 4
4890 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_44:%.*]] = alloca i32, align 4
4891 // CHECK13-NEXT:    [[M_CASTED52:%.*]] = alloca i64, align 8
4892 // CHECK13-NEXT:    [[N_CASTED54:%.*]] = alloca i64, align 8
4893 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS56:%.*]] = alloca [4 x i8*], align 8
4894 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS57:%.*]] = alloca [4 x i8*], align 8
4895 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS58:%.*]] = alloca [4 x i8*], align 8
4896 // CHECK13-NEXT:    [[DOTOFFLOAD_SIZES59:%.*]] = alloca [4 x i64], align 8
4897 // CHECK13-NEXT:    [[_TMP60:%.*]] = alloca i32, align 4
4898 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_61:%.*]] = alloca i32, align 4
4899 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_62:%.*]] = alloca i32, align 4
4900 // CHECK13-NEXT:    store i32 0, i32* [[RETVAL]], align 4
4901 // CHECK13-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
4902 // CHECK13-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
4903 // CHECK13-NEXT:    store i32 100, i32* [[N]], align 4
4904 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
4905 // CHECK13-NEXT:    [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
4906 // CHECK13-NEXT:    [[TMP2:%.*]] = call i8* @llvm.stacksave()
4907 // CHECK13-NEXT:    store i8* [[TMP2]], i8** [[SAVED_STACK]], align 8
4908 // CHECK13-NEXT:    [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 4
4909 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[__VLA_EXPR0]], align 8
4910 // CHECK13-NEXT:    store i32 10, i32* [[M]], align 4
4911 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[N]], align 4
4912 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_CASTED]] to i32*
4913 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[CONV]], align 4
4914 // CHECK13-NEXT:    [[TMP4:%.*]] = load i64, i64* [[N_CASTED]], align 8
4915 // CHECK13-NEXT:    [[TMP5:%.*]] = mul nuw i64 [[TMP1]], 4
4916 // CHECK13-NEXT:    [[TMP6:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
4917 // CHECK13-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP6]], i8* align 8 bitcast ([3 x i64]* @.offload_sizes to i8*), i64 24, i1 false)
4918 // CHECK13-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4919 // CHECK13-NEXT:    [[TMP8:%.*]] = bitcast i8** [[TMP7]] to i64*
4920 // CHECK13-NEXT:    store i64 [[TMP4]], i64* [[TMP8]], align 8
4921 // CHECK13-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4922 // CHECK13-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i64*
4923 // CHECK13-NEXT:    store i64 [[TMP4]], i64* [[TMP10]], align 8
4924 // CHECK13-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
4925 // CHECK13-NEXT:    store i8* null, i8** [[TMP11]], align 8
4926 // CHECK13-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
4927 // CHECK13-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i64*
4928 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP13]], align 8
4929 // CHECK13-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
4930 // CHECK13-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i64*
4931 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP15]], align 8
4932 // CHECK13-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
4933 // CHECK13-NEXT:    store i8* null, i8** [[TMP16]], align 8
4934 // CHECK13-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
4935 // CHECK13-NEXT:    [[TMP18:%.*]] = bitcast i8** [[TMP17]] to i32**
4936 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP18]], align 8
4937 // CHECK13-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
4938 // CHECK13-NEXT:    [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i32**
4939 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP20]], align 8
4940 // CHECK13-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
4941 // CHECK13-NEXT:    store i64 [[TMP5]], i64* [[TMP21]], align 8
4942 // CHECK13-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
4943 // CHECK13-NEXT:    store i8* null, i8** [[TMP22]], align 8
4944 // CHECK13-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4945 // CHECK13-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4946 // CHECK13-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
4947 // CHECK13-NEXT:    [[TMP26:%.*]] = load i32, i32* [[N]], align 4
4948 // CHECK13-NEXT:    store i32 [[TMP26]], i32* [[DOTCAPTURE_EXPR_]], align 4
4949 // CHECK13-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4950 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP27]], 0
4951 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4952 // CHECK13-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
4953 // CHECK13-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4954 // CHECK13-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4955 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP28]], 1
4956 // CHECK13-NEXT:    [[TMP29:%.*]] = zext i32 [[ADD]] to i64
4957 // CHECK13-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
4958 // CHECK13-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
4959 // CHECK13-NEXT:    store i32 1, i32* [[TMP30]], align 4
4960 // CHECK13-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
4961 // CHECK13-NEXT:    store i32 3, i32* [[TMP31]], align 4
4962 // CHECK13-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
4963 // CHECK13-NEXT:    store i8** [[TMP23]], i8*** [[TMP32]], align 8
4964 // CHECK13-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
4965 // CHECK13-NEXT:    store i8** [[TMP24]], i8*** [[TMP33]], align 8
4966 // CHECK13-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
4967 // CHECK13-NEXT:    store i64* [[TMP25]], i64** [[TMP34]], align 8
4968 // CHECK13-NEXT:    [[TMP35:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
4969 // CHECK13-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP35]], align 8
4970 // CHECK13-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
4971 // CHECK13-NEXT:    store i8** null, i8*** [[TMP36]], align 8
4972 // CHECK13-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
4973 // CHECK13-NEXT:    store i8** null, i8*** [[TMP37]], align 8
4974 // CHECK13-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
4975 // CHECK13-NEXT:    store i64 [[TMP29]], i64* [[TMP38]], align 8
4976 // CHECK13-NEXT:    [[TMP39:%.*]] = 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_l154.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
4977 // CHECK13-NEXT:    [[TMP40:%.*]] = icmp ne i32 [[TMP39]], 0
4978 // CHECK13-NEXT:    br i1 [[TMP40]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4979 // CHECK13:       omp_offload.failed:
4980 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l154(i64 [[TMP4]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3:[0-9]+]]
4981 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT]]
4982 // CHECK13:       omp_offload.cont:
4983 // CHECK13-NEXT:    [[TMP41:%.*]] = load i32, i32* [[N]], align 4
4984 // CHECK13-NEXT:    [[CONV4:%.*]] = bitcast i64* [[N_CASTED3]] to i32*
4985 // CHECK13-NEXT:    store i32 [[TMP41]], i32* [[CONV4]], align 4
4986 // CHECK13-NEXT:    [[TMP42:%.*]] = load i64, i64* [[N_CASTED3]], align 8
4987 // CHECK13-NEXT:    [[TMP43:%.*]] = mul nuw i64 [[TMP1]], 4
4988 // CHECK13-NEXT:    [[TMP44:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES8]] to i8*
4989 // CHECK13-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP44]], i8* align 8 bitcast ([3 x i64]* @.offload_sizes.4 to i8*), i64 24, i1 false)
4990 // CHECK13-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
4991 // CHECK13-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i64*
4992 // CHECK13-NEXT:    store i64 [[TMP42]], i64* [[TMP46]], align 8
4993 // CHECK13-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
4994 // CHECK13-NEXT:    [[TMP48:%.*]] = bitcast i8** [[TMP47]] to i64*
4995 // CHECK13-NEXT:    store i64 [[TMP42]], i64* [[TMP48]], align 8
4996 // CHECK13-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 0
4997 // CHECK13-NEXT:    store i8* null, i8** [[TMP49]], align 8
4998 // CHECK13-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 1
4999 // CHECK13-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i64*
5000 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP51]], align 8
5001 // CHECK13-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 1
5002 // CHECK13-NEXT:    [[TMP53:%.*]] = bitcast i8** [[TMP52]] to i64*
5003 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP53]], align 8
5004 // CHECK13-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 1
5005 // CHECK13-NEXT:    store i8* null, i8** [[TMP54]], align 8
5006 // CHECK13-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 2
5007 // CHECK13-NEXT:    [[TMP56:%.*]] = bitcast i8** [[TMP55]] to i32**
5008 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP56]], align 8
5009 // CHECK13-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 2
5010 // CHECK13-NEXT:    [[TMP58:%.*]] = bitcast i8** [[TMP57]] to i32**
5011 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP58]], align 8
5012 // CHECK13-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 2
5013 // CHECK13-NEXT:    store i64 [[TMP43]], i64* [[TMP59]], align 8
5014 // CHECK13-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 2
5015 // CHECK13-NEXT:    store i8* null, i8** [[TMP60]], align 8
5016 // CHECK13-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
5017 // CHECK13-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
5018 // CHECK13-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 0
5019 // CHECK13-NEXT:    [[TMP64:%.*]] = load i32, i32* [[N]], align 4
5020 // CHECK13-NEXT:    store i32 [[TMP64]], i32* [[DOTCAPTURE_EXPR_10]], align 4
5021 // CHECK13-NEXT:    [[TMP65:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
5022 // CHECK13-NEXT:    [[SUB12:%.*]] = sub nsw i32 [[TMP65]], 0
5023 // CHECK13-NEXT:    [[DIV13:%.*]] = sdiv i32 [[SUB12]], 1
5024 // CHECK13-NEXT:    [[SUB14:%.*]] = sub nsw i32 [[DIV13]], 1
5025 // CHECK13-NEXT:    store i32 [[SUB14]], i32* [[DOTCAPTURE_EXPR_11]], align 4
5026 // CHECK13-NEXT:    [[TMP66:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
5027 // CHECK13-NEXT:    [[ADD15:%.*]] = add nsw i32 [[TMP66]], 1
5028 // CHECK13-NEXT:    [[TMP67:%.*]] = zext i32 [[ADD15]] to i64
5029 // CHECK13-NEXT:    [[KERNEL_ARGS16:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
5030 // CHECK13-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 0
5031 // CHECK13-NEXT:    store i32 1, i32* [[TMP68]], align 4
5032 // CHECK13-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 1
5033 // CHECK13-NEXT:    store i32 3, i32* [[TMP69]], align 4
5034 // CHECK13-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 2
5035 // CHECK13-NEXT:    store i8** [[TMP61]], i8*** [[TMP70]], align 8
5036 // CHECK13-NEXT:    [[TMP71:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 3
5037 // CHECK13-NEXT:    store i8** [[TMP62]], i8*** [[TMP71]], align 8
5038 // CHECK13-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 4
5039 // CHECK13-NEXT:    store i64* [[TMP63]], i64** [[TMP72]], align 8
5040 // CHECK13-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 5
5041 // CHECK13-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP73]], align 8
5042 // CHECK13-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 6
5043 // CHECK13-NEXT:    store i8** null, i8*** [[TMP74]], align 8
5044 // CHECK13-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 7
5045 // CHECK13-NEXT:    store i8** null, i8*** [[TMP75]], align 8
5046 // CHECK13-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 8
5047 // CHECK13-NEXT:    store i64 [[TMP67]], i64* [[TMP76]], align 8
5048 // CHECK13-NEXT:    [[TMP77:%.*]] = 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_l159.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]])
5049 // CHECK13-NEXT:    [[TMP78:%.*]] = icmp ne i32 [[TMP77]], 0
5050 // CHECK13-NEXT:    br i1 [[TMP78]], label [[OMP_OFFLOAD_FAILED17:%.*]], label [[OMP_OFFLOAD_CONT18:%.*]]
5051 // CHECK13:       omp_offload.failed17:
5052 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l159(i64 [[TMP42]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
5053 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT18]]
5054 // CHECK13:       omp_offload.cont18:
5055 // CHECK13-NEXT:    [[TMP79:%.*]] = load i32, i32* [[M]], align 4
5056 // CHECK13-NEXT:    [[CONV19:%.*]] = bitcast i64* [[M_CASTED]] to i32*
5057 // CHECK13-NEXT:    store i32 [[TMP79]], i32* [[CONV19]], align 4
5058 // CHECK13-NEXT:    [[TMP80:%.*]] = load i64, i64* [[M_CASTED]], align 8
5059 // CHECK13-NEXT:    [[TMP81:%.*]] = load i32, i32* [[N]], align 4
5060 // CHECK13-NEXT:    [[CONV21:%.*]] = bitcast i64* [[N_CASTED20]] to i32*
5061 // CHECK13-NEXT:    store i32 [[TMP81]], i32* [[CONV21]], align 4
5062 // CHECK13-NEXT:    [[TMP82:%.*]] = load i64, i64* [[N_CASTED20]], align 8
5063 // CHECK13-NEXT:    [[TMP83:%.*]] = mul nuw i64 [[TMP1]], 4
5064 // CHECK13-NEXT:    [[TMP84:%.*]] = bitcast [4 x i64]* [[DOTOFFLOAD_SIZES25]] to i8*
5065 // CHECK13-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP84]], i8* align 8 bitcast ([4 x i64]* @.offload_sizes.8 to i8*), i64 32, i1 false)
5066 // CHECK13-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 0
5067 // CHECK13-NEXT:    [[TMP86:%.*]] = bitcast i8** [[TMP85]] to i64*
5068 // CHECK13-NEXT:    store i64 [[TMP80]], i64* [[TMP86]], align 8
5069 // CHECK13-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 0
5070 // CHECK13-NEXT:    [[TMP88:%.*]] = bitcast i8** [[TMP87]] to i64*
5071 // CHECK13-NEXT:    store i64 [[TMP80]], i64* [[TMP88]], align 8
5072 // CHECK13-NEXT:    [[TMP89:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS24]], i64 0, i64 0
5073 // CHECK13-NEXT:    store i8* null, i8** [[TMP89]], align 8
5074 // CHECK13-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 1
5075 // CHECK13-NEXT:    [[TMP91:%.*]] = bitcast i8** [[TMP90]] to i64*
5076 // CHECK13-NEXT:    store i64 [[TMP82]], i64* [[TMP91]], align 8
5077 // CHECK13-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 1
5078 // CHECK13-NEXT:    [[TMP93:%.*]] = bitcast i8** [[TMP92]] to i64*
5079 // CHECK13-NEXT:    store i64 [[TMP82]], i64* [[TMP93]], align 8
5080 // CHECK13-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS24]], i64 0, i64 1
5081 // CHECK13-NEXT:    store i8* null, i8** [[TMP94]], align 8
5082 // CHECK13-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 2
5083 // CHECK13-NEXT:    [[TMP96:%.*]] = bitcast i8** [[TMP95]] to i64*
5084 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP96]], align 8
5085 // CHECK13-NEXT:    [[TMP97:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 2
5086 // CHECK13-NEXT:    [[TMP98:%.*]] = bitcast i8** [[TMP97]] to i64*
5087 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP98]], align 8
5088 // CHECK13-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS24]], i64 0, i64 2
5089 // CHECK13-NEXT:    store i8* null, i8** [[TMP99]], align 8
5090 // CHECK13-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 3
5091 // CHECK13-NEXT:    [[TMP101:%.*]] = bitcast i8** [[TMP100]] to i32**
5092 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP101]], align 8
5093 // CHECK13-NEXT:    [[TMP102:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 3
5094 // CHECK13-NEXT:    [[TMP103:%.*]] = bitcast i8** [[TMP102]] to i32**
5095 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP103]], align 8
5096 // CHECK13-NEXT:    [[TMP104:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES25]], i32 0, i32 3
5097 // CHECK13-NEXT:    store i64 [[TMP83]], i64* [[TMP104]], align 8
5098 // CHECK13-NEXT:    [[TMP105:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS24]], i64 0, i64 3
5099 // CHECK13-NEXT:    store i8* null, i8** [[TMP105]], align 8
5100 // CHECK13-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 0
5101 // CHECK13-NEXT:    [[TMP107:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 0
5102 // CHECK13-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES25]], i32 0, i32 0
5103 // CHECK13-NEXT:    [[TMP109:%.*]] = load i32, i32* [[N]], align 4
5104 // CHECK13-NEXT:    store i32 [[TMP109]], i32* [[DOTCAPTURE_EXPR_27]], align 4
5105 // CHECK13-NEXT:    [[TMP110:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_27]], align 4
5106 // CHECK13-NEXT:    [[SUB29:%.*]] = sub nsw i32 [[TMP110]], 0
5107 // CHECK13-NEXT:    [[DIV30:%.*]] = sdiv i32 [[SUB29]], 1
5108 // CHECK13-NEXT:    [[SUB31:%.*]] = sub nsw i32 [[DIV30]], 1
5109 // CHECK13-NEXT:    store i32 [[SUB31]], i32* [[DOTCAPTURE_EXPR_28]], align 4
5110 // CHECK13-NEXT:    [[TMP111:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_28]], align 4
5111 // CHECK13-NEXT:    [[ADD32:%.*]] = add nsw i32 [[TMP111]], 1
5112 // CHECK13-NEXT:    [[TMP112:%.*]] = zext i32 [[ADD32]] to i64
5113 // CHECK13-NEXT:    [[KERNEL_ARGS33:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
5114 // CHECK13-NEXT:    [[TMP113:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 0
5115 // CHECK13-NEXT:    store i32 1, i32* [[TMP113]], align 4
5116 // CHECK13-NEXT:    [[TMP114:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 1
5117 // CHECK13-NEXT:    store i32 4, i32* [[TMP114]], align 4
5118 // CHECK13-NEXT:    [[TMP115:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 2
5119 // CHECK13-NEXT:    store i8** [[TMP106]], i8*** [[TMP115]], align 8
5120 // CHECK13-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 3
5121 // CHECK13-NEXT:    store i8** [[TMP107]], i8*** [[TMP116]], align 8
5122 // CHECK13-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 4
5123 // CHECK13-NEXT:    store i64* [[TMP108]], i64** [[TMP117]], align 8
5124 // CHECK13-NEXT:    [[TMP118:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 5
5125 // CHECK13-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP118]], align 8
5126 // CHECK13-NEXT:    [[TMP119:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 6
5127 // CHECK13-NEXT:    store i8** null, i8*** [[TMP119]], align 8
5128 // CHECK13-NEXT:    [[TMP120:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 7
5129 // CHECK13-NEXT:    store i8** null, i8*** [[TMP120]], align 8
5130 // CHECK13-NEXT:    [[TMP121:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 8
5131 // CHECK13-NEXT:    store i64 [[TMP112]], i64* [[TMP121]], align 8
5132 // CHECK13-NEXT:    [[TMP122:%.*]] = 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_l164.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]])
5133 // CHECK13-NEXT:    [[TMP123:%.*]] = icmp ne i32 [[TMP122]], 0
5134 // CHECK13-NEXT:    br i1 [[TMP123]], label [[OMP_OFFLOAD_FAILED34:%.*]], label [[OMP_OFFLOAD_CONT35:%.*]]
5135 // CHECK13:       omp_offload.failed34:
5136 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l164(i64 [[TMP80]], i64 [[TMP82]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
5137 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT35]]
5138 // CHECK13:       omp_offload.cont35:
5139 // CHECK13-NEXT:    [[TMP124:%.*]] = load i32, i32* [[N]], align 4
5140 // CHECK13-NEXT:    [[CONV37:%.*]] = bitcast i64* [[N_CASTED36]] to i32*
5141 // CHECK13-NEXT:    store i32 [[TMP124]], i32* [[CONV37]], align 4
5142 // CHECK13-NEXT:    [[TMP125:%.*]] = load i64, i64* [[N_CASTED36]], align 8
5143 // CHECK13-NEXT:    [[TMP126:%.*]] = mul nuw i64 [[TMP1]], 4
5144 // CHECK13-NEXT:    [[TMP127:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES41]] to i8*
5145 // CHECK13-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP127]], i8* align 8 bitcast ([3 x i64]* @.offload_sizes.12 to i8*), i64 24, i1 false)
5146 // CHECK13-NEXT:    [[TMP128:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS38]], i32 0, i32 0
5147 // CHECK13-NEXT:    [[TMP129:%.*]] = bitcast i8** [[TMP128]] to i64*
5148 // CHECK13-NEXT:    store i64 [[TMP125]], i64* [[TMP129]], align 8
5149 // CHECK13-NEXT:    [[TMP130:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS39]], i32 0, i32 0
5150 // CHECK13-NEXT:    [[TMP131:%.*]] = bitcast i8** [[TMP130]] to i64*
5151 // CHECK13-NEXT:    store i64 [[TMP125]], i64* [[TMP131]], align 8
5152 // CHECK13-NEXT:    [[TMP132:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS40]], i64 0, i64 0
5153 // CHECK13-NEXT:    store i8* null, i8** [[TMP132]], align 8
5154 // CHECK13-NEXT:    [[TMP133:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS38]], i32 0, i32 1
5155 // CHECK13-NEXT:    [[TMP134:%.*]] = bitcast i8** [[TMP133]] to i64*
5156 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP134]], align 8
5157 // CHECK13-NEXT:    [[TMP135:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS39]], i32 0, i32 1
5158 // CHECK13-NEXT:    [[TMP136:%.*]] = bitcast i8** [[TMP135]] to i64*
5159 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP136]], align 8
5160 // CHECK13-NEXT:    [[TMP137:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS40]], i64 0, i64 1
5161 // CHECK13-NEXT:    store i8* null, i8** [[TMP137]], align 8
5162 // CHECK13-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS38]], i32 0, i32 2
5163 // CHECK13-NEXT:    [[TMP139:%.*]] = bitcast i8** [[TMP138]] to i32**
5164 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP139]], align 8
5165 // CHECK13-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS39]], i32 0, i32 2
5166 // CHECK13-NEXT:    [[TMP141:%.*]] = bitcast i8** [[TMP140]] to i32**
5167 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP141]], align 8
5168 // CHECK13-NEXT:    [[TMP142:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES41]], i32 0, i32 2
5169 // CHECK13-NEXT:    store i64 [[TMP126]], i64* [[TMP142]], align 8
5170 // CHECK13-NEXT:    [[TMP143:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS40]], i64 0, i64 2
5171 // CHECK13-NEXT:    store i8* null, i8** [[TMP143]], align 8
5172 // CHECK13-NEXT:    [[TMP144:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS38]], i32 0, i32 0
5173 // CHECK13-NEXT:    [[TMP145:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS39]], i32 0, i32 0
5174 // CHECK13-NEXT:    [[TMP146:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES41]], i32 0, i32 0
5175 // CHECK13-NEXT:    [[TMP147:%.*]] = load i32, i32* [[N]], align 4
5176 // CHECK13-NEXT:    store i32 [[TMP147]], i32* [[DOTCAPTURE_EXPR_43]], align 4
5177 // CHECK13-NEXT:    [[TMP148:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_43]], align 4
5178 // CHECK13-NEXT:    [[SUB45:%.*]] = sub nsw i32 [[TMP148]], 0
5179 // CHECK13-NEXT:    [[DIV46:%.*]] = sdiv i32 [[SUB45]], 1
5180 // CHECK13-NEXT:    [[SUB47:%.*]] = sub nsw i32 [[DIV46]], 1
5181 // CHECK13-NEXT:    store i32 [[SUB47]], i32* [[DOTCAPTURE_EXPR_44]], align 4
5182 // CHECK13-NEXT:    [[TMP149:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_44]], align 4
5183 // CHECK13-NEXT:    [[ADD48:%.*]] = add nsw i32 [[TMP149]], 1
5184 // CHECK13-NEXT:    [[TMP150:%.*]] = zext i32 [[ADD48]] to i64
5185 // CHECK13-NEXT:    [[KERNEL_ARGS49:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
5186 // CHECK13-NEXT:    [[TMP151:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 0
5187 // CHECK13-NEXT:    store i32 1, i32* [[TMP151]], align 4
5188 // CHECK13-NEXT:    [[TMP152:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 1
5189 // CHECK13-NEXT:    store i32 3, i32* [[TMP152]], align 4
5190 // CHECK13-NEXT:    [[TMP153:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 2
5191 // CHECK13-NEXT:    store i8** [[TMP144]], i8*** [[TMP153]], align 8
5192 // CHECK13-NEXT:    [[TMP154:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 3
5193 // CHECK13-NEXT:    store i8** [[TMP145]], i8*** [[TMP154]], align 8
5194 // CHECK13-NEXT:    [[TMP155:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 4
5195 // CHECK13-NEXT:    store i64* [[TMP146]], i64** [[TMP155]], align 8
5196 // CHECK13-NEXT:    [[TMP156:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 5
5197 // CHECK13-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP156]], align 8
5198 // CHECK13-NEXT:    [[TMP157:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 6
5199 // CHECK13-NEXT:    store i8** null, i8*** [[TMP157]], align 8
5200 // CHECK13-NEXT:    [[TMP158:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 7
5201 // CHECK13-NEXT:    store i8** null, i8*** [[TMP158]], align 8
5202 // CHECK13-NEXT:    [[TMP159:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 8
5203 // CHECK13-NEXT:    store i64 [[TMP150]], i64* [[TMP159]], align 8
5204 // CHECK13-NEXT:    [[TMP160:%.*]] = 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_l169.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]])
5205 // CHECK13-NEXT:    [[TMP161:%.*]] = icmp ne i32 [[TMP160]], 0
5206 // CHECK13-NEXT:    br i1 [[TMP161]], label [[OMP_OFFLOAD_FAILED50:%.*]], label [[OMP_OFFLOAD_CONT51:%.*]]
5207 // CHECK13:       omp_offload.failed50:
5208 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l169(i64 [[TMP125]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
5209 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT51]]
5210 // CHECK13:       omp_offload.cont51:
5211 // CHECK13-NEXT:    [[TMP162:%.*]] = load i32, i32* [[M]], align 4
5212 // CHECK13-NEXT:    [[CONV53:%.*]] = bitcast i64* [[M_CASTED52]] to i32*
5213 // CHECK13-NEXT:    store i32 [[TMP162]], i32* [[CONV53]], align 4
5214 // CHECK13-NEXT:    [[TMP163:%.*]] = load i64, i64* [[M_CASTED52]], align 8
5215 // CHECK13-NEXT:    [[TMP164:%.*]] = load i32, i32* [[N]], align 4
5216 // CHECK13-NEXT:    [[CONV55:%.*]] = bitcast i64* [[N_CASTED54]] to i32*
5217 // CHECK13-NEXT:    store i32 [[TMP164]], i32* [[CONV55]], align 4
5218 // CHECK13-NEXT:    [[TMP165:%.*]] = load i64, i64* [[N_CASTED54]], align 8
5219 // CHECK13-NEXT:    [[TMP166:%.*]] = mul nuw i64 [[TMP1]], 4
5220 // CHECK13-NEXT:    [[TMP167:%.*]] = bitcast [4 x i64]* [[DOTOFFLOAD_SIZES59]] to i8*
5221 // CHECK13-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP167]], i8* align 8 bitcast ([4 x i64]* @.offload_sizes.16 to i8*), i64 32, i1 false)
5222 // CHECK13-NEXT:    [[TMP168:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 0
5223 // CHECK13-NEXT:    [[TMP169:%.*]] = bitcast i8** [[TMP168]] to i64*
5224 // CHECK13-NEXT:    store i64 [[TMP163]], i64* [[TMP169]], align 8
5225 // CHECK13-NEXT:    [[TMP170:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 0
5226 // CHECK13-NEXT:    [[TMP171:%.*]] = bitcast i8** [[TMP170]] to i64*
5227 // CHECK13-NEXT:    store i64 [[TMP163]], i64* [[TMP171]], align 8
5228 // CHECK13-NEXT:    [[TMP172:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS58]], i64 0, i64 0
5229 // CHECK13-NEXT:    store i8* null, i8** [[TMP172]], align 8
5230 // CHECK13-NEXT:    [[TMP173:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 1
5231 // CHECK13-NEXT:    [[TMP174:%.*]] = bitcast i8** [[TMP173]] to i64*
5232 // CHECK13-NEXT:    store i64 [[TMP165]], i64* [[TMP174]], align 8
5233 // CHECK13-NEXT:    [[TMP175:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 1
5234 // CHECK13-NEXT:    [[TMP176:%.*]] = bitcast i8** [[TMP175]] to i64*
5235 // CHECK13-NEXT:    store i64 [[TMP165]], i64* [[TMP176]], align 8
5236 // CHECK13-NEXT:    [[TMP177:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS58]], i64 0, i64 1
5237 // CHECK13-NEXT:    store i8* null, i8** [[TMP177]], align 8
5238 // CHECK13-NEXT:    [[TMP178:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 2
5239 // CHECK13-NEXT:    [[TMP179:%.*]] = bitcast i8** [[TMP178]] to i64*
5240 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP179]], align 8
5241 // CHECK13-NEXT:    [[TMP180:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 2
5242 // CHECK13-NEXT:    [[TMP181:%.*]] = bitcast i8** [[TMP180]] to i64*
5243 // CHECK13-NEXT:    store i64 [[TMP1]], i64* [[TMP181]], align 8
5244 // CHECK13-NEXT:    [[TMP182:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS58]], i64 0, i64 2
5245 // CHECK13-NEXT:    store i8* null, i8** [[TMP182]], align 8
5246 // CHECK13-NEXT:    [[TMP183:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 3
5247 // CHECK13-NEXT:    [[TMP184:%.*]] = bitcast i8** [[TMP183]] to i32**
5248 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP184]], align 8
5249 // CHECK13-NEXT:    [[TMP185:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 3
5250 // CHECK13-NEXT:    [[TMP186:%.*]] = bitcast i8** [[TMP185]] to i32**
5251 // CHECK13-NEXT:    store i32* [[VLA]], i32** [[TMP186]], align 8
5252 // CHECK13-NEXT:    [[TMP187:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES59]], i32 0, i32 3
5253 // CHECK13-NEXT:    store i64 [[TMP166]], i64* [[TMP187]], align 8
5254 // CHECK13-NEXT:    [[TMP188:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS58]], i64 0, i64 3
5255 // CHECK13-NEXT:    store i8* null, i8** [[TMP188]], align 8
5256 // CHECK13-NEXT:    [[TMP189:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 0
5257 // CHECK13-NEXT:    [[TMP190:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 0
5258 // CHECK13-NEXT:    [[TMP191:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES59]], i32 0, i32 0
5259 // CHECK13-NEXT:    [[TMP192:%.*]] = load i32, i32* [[N]], align 4
5260 // CHECK13-NEXT:    store i32 [[TMP192]], i32* [[DOTCAPTURE_EXPR_61]], align 4
5261 // CHECK13-NEXT:    [[TMP193:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_61]], align 4
5262 // CHECK13-NEXT:    [[SUB63:%.*]] = sub nsw i32 [[TMP193]], 0
5263 // CHECK13-NEXT:    [[DIV64:%.*]] = sdiv i32 [[SUB63]], 1
5264 // CHECK13-NEXT:    [[SUB65:%.*]] = sub nsw i32 [[DIV64]], 1
5265 // CHECK13-NEXT:    store i32 [[SUB65]], i32* [[DOTCAPTURE_EXPR_62]], align 4
5266 // CHECK13-NEXT:    [[TMP194:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_62]], align 4
5267 // CHECK13-NEXT:    [[ADD66:%.*]] = add nsw i32 [[TMP194]], 1
5268 // CHECK13-NEXT:    [[TMP195:%.*]] = zext i32 [[ADD66]] to i64
5269 // CHECK13-NEXT:    [[KERNEL_ARGS67:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
5270 // CHECK13-NEXT:    [[TMP196:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 0
5271 // CHECK13-NEXT:    store i32 1, i32* [[TMP196]], align 4
5272 // CHECK13-NEXT:    [[TMP197:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 1
5273 // CHECK13-NEXT:    store i32 4, i32* [[TMP197]], align 4
5274 // CHECK13-NEXT:    [[TMP198:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 2
5275 // CHECK13-NEXT:    store i8** [[TMP189]], i8*** [[TMP198]], align 8
5276 // CHECK13-NEXT:    [[TMP199:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 3
5277 // CHECK13-NEXT:    store i8** [[TMP190]], i8*** [[TMP199]], align 8
5278 // CHECK13-NEXT:    [[TMP200:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 4
5279 // CHECK13-NEXT:    store i64* [[TMP191]], i64** [[TMP200]], align 8
5280 // CHECK13-NEXT:    [[TMP201:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 5
5281 // CHECK13-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP201]], align 8
5282 // CHECK13-NEXT:    [[TMP202:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 6
5283 // CHECK13-NEXT:    store i8** null, i8*** [[TMP202]], align 8
5284 // CHECK13-NEXT:    [[TMP203:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 7
5285 // CHECK13-NEXT:    store i8** null, i8*** [[TMP203]], align 8
5286 // CHECK13-NEXT:    [[TMP204:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 8
5287 // CHECK13-NEXT:    store i64 [[TMP195]], i64* [[TMP204]], align 8
5288 // CHECK13-NEXT:    [[TMP205:%.*]] = 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_l174.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]])
5289 // CHECK13-NEXT:    [[TMP206:%.*]] = icmp ne i32 [[TMP205]], 0
5290 // CHECK13-NEXT:    br i1 [[TMP206]], label [[OMP_OFFLOAD_FAILED68:%.*]], label [[OMP_OFFLOAD_CONT69:%.*]]
5291 // CHECK13:       omp_offload.failed68:
5292 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l174(i64 [[TMP163]], i64 [[TMP165]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
5293 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT69]]
5294 // CHECK13:       omp_offload.cont69:
5295 // CHECK13-NEXT:    [[TMP207:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
5296 // CHECK13-NEXT:    [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiLi10EEiT_(i32 noundef signext [[TMP207]])
5297 // CHECK13-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
5298 // CHECK13-NEXT:    [[TMP208:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8
5299 // CHECK13-NEXT:    call void @llvm.stackrestore(i8* [[TMP208]])
5300 // CHECK13-NEXT:    [[TMP209:%.*]] = load i32, i32* [[RETVAL]], align 4
5301 // CHECK13-NEXT:    ret i32 [[TMP209]]
5302 //
5303 //
5304 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l154
5305 // CHECK13-SAME: (i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {
5306 // CHECK13-NEXT:  entry:
5307 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
5308 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
5309 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
5310 // CHECK13-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
5311 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
5312 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
5313 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
5314 // CHECK13-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
5315 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
5316 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[CONV]], i64 [[TMP0]], i32* [[TMP1]])
5317 // CHECK13-NEXT:    ret void
5318 //
5319 //
5320 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined.
5321 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5322 // CHECK13-NEXT:  entry:
5323 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5324 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5325 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5326 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
5327 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
5328 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5329 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5330 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5331 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5332 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
5333 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5334 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5335 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5336 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5337 // CHECK13-NEXT:    [[I3:%.*]] = alloca i32, align 4
5338 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5339 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5340 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5341 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
5342 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
5343 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5344 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
5345 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
5346 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5347 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
5348 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5349 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5350 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5351 // CHECK13-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5352 // CHECK13-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5353 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
5354 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5355 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5356 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5357 // CHECK13:       omp.precond.then:
5358 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5359 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5360 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
5361 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5362 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5363 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5364 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
5365 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5366 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5367 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5368 // CHECK13-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
5369 // CHECK13-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5370 // CHECK13:       cond.true:
5371 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5372 // CHECK13-NEXT:    br label [[COND_END:%.*]]
5373 // CHECK13:       cond.false:
5374 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5375 // CHECK13-NEXT:    br label [[COND_END]]
5376 // CHECK13:       cond.end:
5377 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
5378 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5379 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5380 // CHECK13-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
5381 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5382 // CHECK13:       omp.inner.for.cond:
5383 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
5384 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !13
5385 // CHECK13-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
5386 // CHECK13-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5387 // CHECK13:       omp.inner.for.body:
5388 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !13
5389 // CHECK13-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
5390 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !13
5391 // CHECK13-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
5392 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i64, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i64 [[TMP17]], i64 [[TMP19]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !13
5393 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5394 // CHECK13:       omp.inner.for.inc:
5395 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
5396 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !13
5397 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
5398 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
5399 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP14:![0-9]+]]
5400 // CHECK13:       omp.inner.for.end:
5401 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5402 // CHECK13:       omp.loop.exit:
5403 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5404 // CHECK13-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
5405 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
5406 // CHECK13-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
5407 // CHECK13-NEXT:    [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
5408 // CHECK13-NEXT:    br i1 [[TMP25]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
5409 // CHECK13:       .omp.final.then:
5410 // CHECK13-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5411 // CHECK13-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP26]], 0
5412 // CHECK13-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
5413 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
5414 // CHECK13-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
5415 // CHECK13-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
5416 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
5417 // CHECK13:       .omp.final.done:
5418 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
5419 // CHECK13:       omp.precond.end:
5420 // CHECK13-NEXT:    ret void
5421 //
5422 //
5423 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..1
5424 // CHECK13-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5425 // CHECK13-NEXT:  entry:
5426 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5427 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5428 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
5429 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
5430 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5431 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
5432 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
5433 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5434 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5435 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5436 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5437 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
5438 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5439 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5440 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5441 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5442 // CHECK13-NEXT:    [[I4:%.*]] = alloca i32, align 4
5443 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5444 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5445 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5446 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5447 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5448 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
5449 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
5450 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5451 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
5452 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
5453 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5454 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
5455 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5456 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5457 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5458 // CHECK13-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5459 // CHECK13-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5460 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
5461 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5462 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5463 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5464 // CHECK13:       omp.precond.then:
5465 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5466 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5467 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
5468 // CHECK13-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5469 // CHECK13-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
5470 // CHECK13-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5471 // CHECK13-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
5472 // CHECK13-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
5473 // CHECK13-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
5474 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5475 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5476 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5477 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
5478 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5479 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5480 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5481 // CHECK13-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
5482 // CHECK13-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5483 // CHECK13:       cond.true:
5484 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5485 // CHECK13-NEXT:    br label [[COND_END:%.*]]
5486 // CHECK13:       cond.false:
5487 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5488 // CHECK13-NEXT:    br label [[COND_END]]
5489 // CHECK13:       cond.end:
5490 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
5491 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5492 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5493 // CHECK13-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
5494 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5495 // CHECK13:       omp.inner.for.cond:
5496 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
5497 // CHECK13-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !17
5498 // CHECK13-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
5499 // CHECK13-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5500 // CHECK13:       omp.inner.for.body:
5501 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
5502 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
5503 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5504 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !17
5505 // CHECK13-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !17
5506 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
5507 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
5508 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !17
5509 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5510 // CHECK13:       omp.body.continue:
5511 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5512 // CHECK13:       omp.inner.for.inc:
5513 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
5514 // CHECK13-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
5515 // CHECK13-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
5516 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP18:![0-9]+]]
5517 // CHECK13:       omp.inner.for.end:
5518 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5519 // CHECK13:       omp.loop.exit:
5520 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5521 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
5522 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
5523 // CHECK13-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
5524 // CHECK13-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
5525 // CHECK13-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
5526 // CHECK13:       .omp.final.then:
5527 // CHECK13-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5528 // CHECK13-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP25]], 0
5529 // CHECK13-NEXT:    [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1
5530 // CHECK13-NEXT:    [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 1
5531 // CHECK13-NEXT:    [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]
5532 // CHECK13-NEXT:    store i32 [[ADD11]], i32* [[I4]], align 4
5533 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
5534 // CHECK13:       .omp.final.done:
5535 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
5536 // CHECK13:       omp.precond.end:
5537 // CHECK13-NEXT:    ret void
5538 //
5539 //
5540 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l159
5541 // CHECK13-SAME: (i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5542 // CHECK13-NEXT:  entry:
5543 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
5544 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
5545 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
5546 // CHECK13-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
5547 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
5548 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
5549 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
5550 // CHECK13-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
5551 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
5552 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* [[CONV]], i64 [[TMP0]], i32* [[TMP1]])
5553 // CHECK13-NEXT:    ret void
5554 //
5555 //
5556 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..2
5557 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5558 // CHECK13-NEXT:  entry:
5559 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5560 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5561 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5562 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
5563 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
5564 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5565 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5566 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5567 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5568 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
5569 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5570 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5571 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5572 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5573 // CHECK13-NEXT:    [[I3:%.*]] = alloca i32, align 4
5574 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5575 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5576 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5577 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
5578 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
5579 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5580 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
5581 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
5582 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5583 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
5584 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5585 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5586 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5587 // CHECK13-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5588 // CHECK13-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5589 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
5590 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5591 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5592 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5593 // CHECK13:       omp.precond.then:
5594 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5595 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5596 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
5597 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5598 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5599 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5600 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
5601 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5602 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5603 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5604 // CHECK13-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
5605 // CHECK13-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5606 // CHECK13:       cond.true:
5607 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5608 // CHECK13-NEXT:    br label [[COND_END:%.*]]
5609 // CHECK13:       cond.false:
5610 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5611 // CHECK13-NEXT:    br label [[COND_END]]
5612 // CHECK13:       cond.end:
5613 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
5614 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5615 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5616 // CHECK13-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
5617 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5618 // CHECK13:       omp.inner.for.cond:
5619 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
5620 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !22
5621 // CHECK13-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
5622 // CHECK13-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5623 // CHECK13:       omp.inner.for.body:
5624 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !22
5625 // CHECK13-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
5626 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !22
5627 // CHECK13-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
5628 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i64, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i64 [[TMP17]], i64 [[TMP19]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !22
5629 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5630 // CHECK13:       omp.inner.for.inc:
5631 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
5632 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !22
5633 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
5634 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
5635 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP23:![0-9]+]]
5636 // CHECK13:       omp.inner.for.end:
5637 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5638 // CHECK13:       omp.loop.exit:
5639 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5640 // CHECK13-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
5641 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
5642 // CHECK13-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
5643 // CHECK13-NEXT:    [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
5644 // CHECK13-NEXT:    br i1 [[TMP25]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
5645 // CHECK13:       .omp.final.then:
5646 // CHECK13-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5647 // CHECK13-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP26]], 0
5648 // CHECK13-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
5649 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
5650 // CHECK13-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
5651 // CHECK13-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
5652 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
5653 // CHECK13:       .omp.final.done:
5654 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
5655 // CHECK13:       omp.precond.end:
5656 // CHECK13-NEXT:    ret void
5657 //
5658 //
5659 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..3
5660 // CHECK13-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5661 // CHECK13-NEXT:  entry:
5662 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5663 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5664 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
5665 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
5666 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5667 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
5668 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
5669 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5670 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5671 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5672 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5673 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
5674 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5675 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5676 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5677 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5678 // CHECK13-NEXT:    [[I4:%.*]] = alloca i32, align 4
5679 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5680 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5681 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5682 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5683 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5684 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
5685 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
5686 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5687 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
5688 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
5689 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5690 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
5691 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5692 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5693 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5694 // CHECK13-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5695 // CHECK13-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5696 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
5697 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5698 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5699 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5700 // CHECK13:       omp.precond.then:
5701 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5702 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5703 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
5704 // CHECK13-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5705 // CHECK13-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
5706 // CHECK13-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5707 // CHECK13-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
5708 // CHECK13-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
5709 // CHECK13-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
5710 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5711 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5712 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5713 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
5714 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5715 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5716 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5717 // CHECK13-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
5718 // CHECK13-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5719 // CHECK13:       cond.true:
5720 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5721 // CHECK13-NEXT:    br label [[COND_END:%.*]]
5722 // CHECK13:       cond.false:
5723 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5724 // CHECK13-NEXT:    br label [[COND_END]]
5725 // CHECK13:       cond.end:
5726 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
5727 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5728 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5729 // CHECK13-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
5730 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5731 // CHECK13:       omp.inner.for.cond:
5732 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
5733 // CHECK13-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !25
5734 // CHECK13-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
5735 // CHECK13-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5736 // CHECK13:       omp.inner.for.body:
5737 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
5738 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
5739 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5740 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !25
5741 // CHECK13-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !25
5742 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
5743 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
5744 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !25
5745 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5746 // CHECK13:       omp.body.continue:
5747 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5748 // CHECK13:       omp.inner.for.inc:
5749 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
5750 // CHECK13-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
5751 // CHECK13-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
5752 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP26:![0-9]+]]
5753 // CHECK13:       omp.inner.for.end:
5754 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5755 // CHECK13:       omp.loop.exit:
5756 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5757 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
5758 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
5759 // CHECK13-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
5760 // CHECK13-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
5761 // CHECK13-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
5762 // CHECK13:       .omp.final.then:
5763 // CHECK13-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5764 // CHECK13-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP25]], 0
5765 // CHECK13-NEXT:    [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1
5766 // CHECK13-NEXT:    [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 1
5767 // CHECK13-NEXT:    [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]
5768 // CHECK13-NEXT:    store i32 [[ADD11]], i32* [[I4]], align 4
5769 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
5770 // CHECK13:       .omp.final.done:
5771 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
5772 // CHECK13:       omp.precond.end:
5773 // CHECK13-NEXT:    ret void
5774 //
5775 //
5776 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l164
5777 // CHECK13-SAME: (i64 noundef [[M:%.*]], i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5778 // CHECK13-NEXT:  entry:
5779 // CHECK13-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
5780 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
5781 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
5782 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
5783 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5784 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
5785 // CHECK13-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
5786 // CHECK13-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
5787 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
5788 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
5789 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
5790 // CHECK13-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
5791 // CHECK13-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
5792 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
5793 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[CONV]], align 4
5794 // CHECK13-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
5795 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5796 // CHECK13-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
5797 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[CONV2]], align 4
5798 // CHECK13-NEXT:    [[TMP4:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
5799 // CHECK13-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*, i64, i32*, i64)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* [[CONV1]], i64 [[TMP0]], i32* [[TMP1]], i64 [[TMP4]])
5800 // CHECK13-NEXT:    ret void
5801 //
5802 //
5803 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..6
5804 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
5805 // CHECK13-NEXT:  entry:
5806 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5807 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5808 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5809 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
5810 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
5811 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
5812 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5813 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5814 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5815 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
5816 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
5817 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5818 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5819 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5820 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5821 // CHECK13-NEXT:    [[I4:%.*]] = alloca i32, align 4
5822 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
5823 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5824 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5825 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5826 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
5827 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
5828 // CHECK13-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
5829 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5830 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
5831 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
5832 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
5833 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5834 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5835 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5836 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5837 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5838 // CHECK13-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
5839 // CHECK13-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
5840 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
5841 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5842 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5843 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5844 // CHECK13:       omp.precond.then:
5845 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5846 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
5847 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
5848 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5849 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5850 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[CONV]], align 4
5851 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5852 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
5853 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP7]])
5854 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5855 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
5856 // CHECK13-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
5857 // CHECK13-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5858 // CHECK13:       cond.true:
5859 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
5860 // CHECK13-NEXT:    br label [[COND_END:%.*]]
5861 // CHECK13:       cond.false:
5862 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5863 // CHECK13-NEXT:    br label [[COND_END]]
5864 // CHECK13:       cond.end:
5865 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
5866 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5867 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5868 // CHECK13-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
5869 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5870 // CHECK13:       omp.inner.for.cond:
5871 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
5872 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !28
5873 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
5874 // CHECK13-NEXT:    [[CMP6:%.*]] = icmp slt i32 [[TMP15]], [[ADD]]
5875 // CHECK13-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5876 // CHECK13:       omp.inner.for.body:
5877 // CHECK13-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !28
5878 // CHECK13-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
5879 // CHECK13-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
5880 // CHECK13-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
5881 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32, i32* [[CONV]], align 4, !llvm.access.group !28
5882 // CHECK13-NEXT:    [[CONV7:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
5883 // CHECK13-NEXT:    store i32 [[TMP21]], i32* [[CONV7]], align 4, !llvm.access.group !28
5884 // CHECK13-NEXT:    [[TMP22:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8, !llvm.access.group !28
5885 // CHECK13-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*, i64, i32*, i64)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]], i64 [[TMP22]]), !llvm.access.group !28
5886 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5887 // CHECK13:       omp.inner.for.inc:
5888 // CHECK13-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
5889 // CHECK13-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !28
5890 // CHECK13-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
5891 // CHECK13-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
5892 // CHECK13-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !28
5893 // CHECK13-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !28
5894 // CHECK13-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
5895 // CHECK13-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !28
5896 // CHECK13-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
5897 // CHECK13-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !28
5898 // CHECK13-NEXT:    [[ADD10:%.*]] = add nsw i32 [[TMP27]], [[TMP28]]
5899 // CHECK13-NEXT:    store i32 [[ADD10]], i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
5900 // CHECK13-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
5901 // CHECK13-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !28
5902 // CHECK13-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[TMP29]], [[TMP30]]
5903 // CHECK13-NEXT:    br i1 [[CMP11]], label [[COND_TRUE12:%.*]], label [[COND_FALSE13:%.*]]
5904 // CHECK13:       cond.true12:
5905 // CHECK13-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !28
5906 // CHECK13-NEXT:    br label [[COND_END14:%.*]]
5907 // CHECK13:       cond.false13:
5908 // CHECK13-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
5909 // CHECK13-NEXT:    br label [[COND_END14]]
5910 // CHECK13:       cond.end14:
5911 // CHECK13-NEXT:    [[COND15:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE12]] ], [ [[TMP32]], [[COND_FALSE13]] ]
5912 // CHECK13-NEXT:    store i32 [[COND15]], i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
5913 // CHECK13-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !28
5914 // CHECK13-NEXT:    store i32 [[TMP33]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
5915 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP29:![0-9]+]]
5916 // CHECK13:       omp.inner.for.end:
5917 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5918 // CHECK13:       omp.loop.exit:
5919 // CHECK13-NEXT:    [[TMP34:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5920 // CHECK13-NEXT:    [[TMP35:%.*]] = load i32, i32* [[TMP34]], align 4
5921 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP35]])
5922 // CHECK13-NEXT:    [[TMP36:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
5923 // CHECK13-NEXT:    [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 0
5924 // CHECK13-NEXT:    br i1 [[TMP37]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
5925 // CHECK13:       .omp.final.then:
5926 // CHECK13-NEXT:    [[TMP38:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5927 // CHECK13-NEXT:    [[SUB16:%.*]] = sub nsw i32 [[TMP38]], 0
5928 // CHECK13-NEXT:    [[DIV17:%.*]] = sdiv i32 [[SUB16]], 1
5929 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV17]], 1
5930 // CHECK13-NEXT:    [[ADD18:%.*]] = add nsw i32 0, [[MUL]]
5931 // CHECK13-NEXT:    store i32 [[ADD18]], i32* [[I4]], align 4
5932 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
5933 // CHECK13:       .omp.final.done:
5934 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
5935 // CHECK13:       omp.precond.end:
5936 // CHECK13-NEXT:    ret void
5937 //
5938 //
5939 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..7
5940 // CHECK13-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
5941 // CHECK13-NEXT:  entry:
5942 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5943 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5944 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
5945 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
5946 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
5947 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
5948 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
5949 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
5950 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5951 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5952 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5953 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
5954 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
5955 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5956 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5957 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5958 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5959 // CHECK13-NEXT:    [[I6:%.*]] = alloca i32, align 4
5960 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5961 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5962 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5963 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5964 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
5965 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
5966 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
5967 // CHECK13-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
5968 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
5969 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
5970 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
5971 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
5972 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5973 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5974 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5975 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5976 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5977 // CHECK13-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
5978 // CHECK13-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
5979 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
5980 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5981 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5982 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5983 // CHECK13:       omp.precond.then:
5984 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5985 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
5986 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
5987 // CHECK13-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5988 // CHECK13-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP7]] to i32
5989 // CHECK13-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5990 // CHECK13-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP8]] to i32
5991 // CHECK13-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
5992 // CHECK13-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
5993 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5994 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5995 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5996 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
5997 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
5998 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5999 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6000 // CHECK13-NEXT:    [[CMP7:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
6001 // CHECK13-NEXT:    br i1 [[CMP7]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6002 // CHECK13:       cond.true:
6003 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6004 // CHECK13-NEXT:    br label [[COND_END:%.*]]
6005 // CHECK13:       cond.false:
6006 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6007 // CHECK13-NEXT:    br label [[COND_END]]
6008 // CHECK13:       cond.end:
6009 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
6010 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
6011 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6012 // CHECK13-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
6013 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6014 // CHECK13:       omp.inner.for.cond:
6015 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !31
6016 // CHECK13-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !31
6017 // CHECK13-NEXT:    [[CMP8:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
6018 // CHECK13-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6019 // CHECK13:       omp.inner.for.body:
6020 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !31
6021 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
6022 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6023 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4, !llvm.access.group !31
6024 // CHECK13-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !31
6025 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
6026 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
6027 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !31
6028 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6029 // CHECK13:       omp.body.continue:
6030 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6031 // CHECK13:       omp.inner.for.inc:
6032 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !31
6033 // CHECK13-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP20]], 1
6034 // CHECK13-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !31
6035 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP32:![0-9]+]]
6036 // CHECK13:       omp.inner.for.end:
6037 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6038 // CHECK13:       omp.loop.exit:
6039 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6040 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
6041 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
6042 // CHECK13-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
6043 // CHECK13-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
6044 // CHECK13-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
6045 // CHECK13:       .omp.final.then:
6046 // CHECK13-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6047 // CHECK13-NEXT:    [[SUB10:%.*]] = sub nsw i32 [[TMP25]], 0
6048 // CHECK13-NEXT:    [[DIV11:%.*]] = sdiv i32 [[SUB10]], 1
6049 // CHECK13-NEXT:    [[MUL12:%.*]] = mul nsw i32 [[DIV11]], 1
6050 // CHECK13-NEXT:    [[ADD13:%.*]] = add nsw i32 0, [[MUL12]]
6051 // CHECK13-NEXT:    store i32 [[ADD13]], i32* [[I6]], align 4
6052 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
6053 // CHECK13:       .omp.final.done:
6054 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
6055 // CHECK13:       omp.precond.end:
6056 // CHECK13-NEXT:    ret void
6057 //
6058 //
6059 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l169
6060 // CHECK13-SAME: (i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
6061 // CHECK13-NEXT:  entry:
6062 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
6063 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
6064 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
6065 // CHECK13-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
6066 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
6067 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
6068 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
6069 // CHECK13-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
6070 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
6071 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), i32* [[CONV]], i64 [[TMP0]], i32* [[TMP1]])
6072 // CHECK13-NEXT:    ret void
6073 //
6074 //
6075 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..10
6076 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
6077 // CHECK13-NEXT:  entry:
6078 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6079 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6080 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
6081 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
6082 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
6083 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6084 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6085 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6086 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6087 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
6088 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6089 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6090 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6091 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6092 // CHECK13-NEXT:    [[I3:%.*]] = alloca i32, align 4
6093 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6094 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6095 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
6096 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
6097 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
6098 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
6099 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
6100 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
6101 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
6102 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
6103 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6104 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
6105 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6106 // CHECK13-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
6107 // CHECK13-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6108 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
6109 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6110 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
6111 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6112 // CHECK13:       omp.precond.then:
6113 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6114 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6115 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
6116 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6117 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6118 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6119 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
6120 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
6121 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6122 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6123 // CHECK13-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
6124 // CHECK13-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6125 // CHECK13:       cond.true:
6126 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6127 // CHECK13-NEXT:    br label [[COND_END:%.*]]
6128 // CHECK13:       cond.false:
6129 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6130 // CHECK13-NEXT:    br label [[COND_END]]
6131 // CHECK13:       cond.end:
6132 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
6133 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6134 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6135 // CHECK13-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
6136 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6137 // CHECK13:       omp.inner.for.cond:
6138 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !34
6139 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !34
6140 // CHECK13-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
6141 // CHECK13-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6142 // CHECK13:       omp.inner.for.body:
6143 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !34
6144 // CHECK13-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
6145 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !34
6146 // CHECK13-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
6147 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i64, i32*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP17]], i64 [[TMP19]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !34
6148 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6149 // CHECK13:       omp.inner.for.inc:
6150 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !34
6151 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !34
6152 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
6153 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !34
6154 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP35:![0-9]+]]
6155 // CHECK13:       omp.inner.for.end:
6156 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6157 // CHECK13:       omp.loop.exit:
6158 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6159 // CHECK13-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
6160 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
6161 // CHECK13-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
6162 // CHECK13-NEXT:    [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
6163 // CHECK13-NEXT:    br i1 [[TMP25]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
6164 // CHECK13:       .omp.final.then:
6165 // CHECK13-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6166 // CHECK13-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP26]], 0
6167 // CHECK13-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
6168 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
6169 // CHECK13-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
6170 // CHECK13-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
6171 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
6172 // CHECK13:       .omp.final.done:
6173 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
6174 // CHECK13:       omp.precond.end:
6175 // CHECK13-NEXT:    ret void
6176 //
6177 //
6178 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..11
6179 // CHECK13-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
6180 // CHECK13-NEXT:  entry:
6181 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6182 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6183 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
6184 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
6185 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
6186 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
6187 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
6188 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6189 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6190 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6191 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6192 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
6193 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6194 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6195 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6196 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6197 // CHECK13-NEXT:    [[I4:%.*]] = alloca i32, align 4
6198 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6199 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6200 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6201 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6202 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
6203 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
6204 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
6205 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
6206 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
6207 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
6208 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
6209 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
6210 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6211 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
6212 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6213 // CHECK13-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
6214 // CHECK13-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6215 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
6216 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6217 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
6218 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6219 // CHECK13:       omp.precond.then:
6220 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6221 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6222 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
6223 // CHECK13-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6224 // CHECK13-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
6225 // CHECK13-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6226 // CHECK13-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
6227 // CHECK13-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
6228 // CHECK13-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
6229 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6230 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6231 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6232 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6233 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6234 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
6235 // CHECK13-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP12]], i32 35, i32 [[TMP9]], i32 [[TMP10]], i32 1, i32 1)
6236 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
6237 // CHECK13:       omp.dispatch.cond:
6238 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6239 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
6240 // CHECK13-NEXT:    [[TMP15:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
6241 // CHECK13-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP15]], 0
6242 // CHECK13-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
6243 // CHECK13:       omp.dispatch.body:
6244 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6245 // CHECK13-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
6246 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6247 // CHECK13:       omp.inner.for.cond:
6248 // CHECK13-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !37
6249 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !37
6250 // CHECK13-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
6251 // CHECK13-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6252 // CHECK13:       omp.inner.for.body:
6253 // CHECK13-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !37
6254 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
6255 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6256 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !37
6257 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !37
6258 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP20]] to i64
6259 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
6260 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !37
6261 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6262 // CHECK13:       omp.body.continue:
6263 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6264 // CHECK13:       omp.inner.for.inc:
6265 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !37
6266 // CHECK13-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP21]], 1
6267 // CHECK13-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !37
6268 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP38:![0-9]+]]
6269 // CHECK13:       omp.inner.for.end:
6270 // CHECK13-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
6271 // CHECK13:       omp.dispatch.inc:
6272 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND]]
6273 // CHECK13:       omp.dispatch.end:
6274 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
6275 // CHECK13-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
6276 // CHECK13-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
6277 // CHECK13:       .omp.final.then:
6278 // CHECK13-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6279 // CHECK13-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP24]], 0
6280 // CHECK13-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
6281 // CHECK13-NEXT:    [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 1
6282 // CHECK13-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]
6283 // CHECK13-NEXT:    store i32 [[ADD10]], i32* [[I4]], align 4
6284 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
6285 // CHECK13:       .omp.final.done:
6286 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
6287 // CHECK13:       omp.precond.end:
6288 // CHECK13-NEXT:    ret void
6289 //
6290 //
6291 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l174
6292 // CHECK13-SAME: (i64 noundef [[M:%.*]], i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
6293 // CHECK13-NEXT:  entry:
6294 // CHECK13-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
6295 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
6296 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
6297 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
6298 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6299 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
6300 // CHECK13-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
6301 // CHECK13-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
6302 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
6303 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
6304 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
6305 // CHECK13-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
6306 // CHECK13-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
6307 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
6308 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[CONV]], align 4
6309 // CHECK13-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
6310 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6311 // CHECK13-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
6312 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[CONV2]], align 4
6313 // CHECK13-NEXT:    [[TMP4:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
6314 // CHECK13-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*, i64, i32*, i64)* @.omp_outlined..14 to void (i32*, i32*, ...)*), i32* [[CONV1]], i64 [[TMP0]], i32* [[TMP1]], i64 [[TMP4]])
6315 // CHECK13-NEXT:    ret void
6316 //
6317 //
6318 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..14
6319 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
6320 // CHECK13-NEXT:  entry:
6321 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6322 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6323 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
6324 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
6325 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
6326 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
6327 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6328 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6329 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6330 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
6331 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
6332 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6333 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6334 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6335 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6336 // CHECK13-NEXT:    [[I4:%.*]] = alloca i32, align 4
6337 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
6338 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6339 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6340 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
6341 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
6342 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
6343 // CHECK13-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
6344 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
6345 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
6346 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
6347 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
6348 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
6349 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6350 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6351 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
6352 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6353 // CHECK13-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
6354 // CHECK13-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
6355 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
6356 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6357 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
6358 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6359 // CHECK13:       omp.precond.then:
6360 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6361 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6362 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
6363 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6364 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6365 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6366 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
6367 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
6368 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6369 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6370 // CHECK13-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
6371 // CHECK13-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6372 // CHECK13:       cond.true:
6373 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6374 // CHECK13-NEXT:    br label [[COND_END:%.*]]
6375 // CHECK13:       cond.false:
6376 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6377 // CHECK13-NEXT:    br label [[COND_END]]
6378 // CHECK13:       cond.end:
6379 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
6380 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6381 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6382 // CHECK13-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
6383 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6384 // CHECK13:       omp.inner.for.cond:
6385 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !40
6386 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !40
6387 // CHECK13-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
6388 // CHECK13-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6389 // CHECK13:       omp.inner.for.body:
6390 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !40
6391 // CHECK13-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
6392 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !40
6393 // CHECK13-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
6394 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[CONV]], align 4, !llvm.access.group !40
6395 // CHECK13-NEXT:    [[CONV7:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
6396 // CHECK13-NEXT:    store i32 [[TMP20]], i32* [[CONV7]], align 4, !llvm.access.group !40
6397 // CHECK13-NEXT:    [[TMP21:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8, !llvm.access.group !40
6398 // CHECK13-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*, i64, i32*, i64)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i64 [[TMP17]], i64 [[TMP19]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]], i64 [[TMP21]]), !llvm.access.group !40
6399 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6400 // CHECK13:       omp.inner.for.inc:
6401 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !40
6402 // CHECK13-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !40
6403 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP22]], [[TMP23]]
6404 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !40
6405 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP41:![0-9]+]]
6406 // CHECK13:       omp.inner.for.end:
6407 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6408 // CHECK13:       omp.loop.exit:
6409 // CHECK13-NEXT:    [[TMP24:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6410 // CHECK13-NEXT:    [[TMP25:%.*]] = load i32, i32* [[TMP24]], align 4
6411 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP25]])
6412 // CHECK13-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
6413 // CHECK13-NEXT:    [[TMP27:%.*]] = icmp ne i32 [[TMP26]], 0
6414 // CHECK13-NEXT:    br i1 [[TMP27]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
6415 // CHECK13:       .omp.final.then:
6416 // CHECK13-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6417 // CHECK13-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP28]], 0
6418 // CHECK13-NEXT:    [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1
6419 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV9]], 1
6420 // CHECK13-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL]]
6421 // CHECK13-NEXT:    store i32 [[ADD10]], i32* [[I4]], align 4
6422 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
6423 // CHECK13:       .omp.final.done:
6424 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
6425 // CHECK13:       omp.precond.end:
6426 // CHECK13-NEXT:    ret void
6427 //
6428 //
6429 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..15
6430 // CHECK13-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
6431 // CHECK13-NEXT:  entry:
6432 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6433 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6434 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
6435 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
6436 // CHECK13-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
6437 // CHECK13-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
6438 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
6439 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
6440 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6441 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6442 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6443 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
6444 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
6445 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6446 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6447 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6448 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6449 // CHECK13-NEXT:    [[I6:%.*]] = alloca i32, align 4
6450 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6451 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6452 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6453 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6454 // CHECK13-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
6455 // CHECK13-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
6456 // CHECK13-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
6457 // CHECK13-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
6458 // CHECK13-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
6459 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
6460 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
6461 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
6462 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
6463 // CHECK13-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6464 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6465 // CHECK13-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
6466 // CHECK13-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6467 // CHECK13-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
6468 // CHECK13-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
6469 // CHECK13-NEXT:    store i32 0, i32* [[I]], align 4
6470 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6471 // CHECK13-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
6472 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6473 // CHECK13:       omp.precond.then:
6474 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6475 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6476 // CHECK13-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
6477 // CHECK13-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6478 // CHECK13-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP7]] to i32
6479 // CHECK13-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6480 // CHECK13-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP8]] to i32
6481 // CHECK13-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
6482 // CHECK13-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
6483 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6484 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6485 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[CONV]], align 4
6486 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6487 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6488 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6489 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
6490 // CHECK13-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 35, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 [[TMP9]])
6491 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
6492 // CHECK13:       omp.dispatch.cond:
6493 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6494 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
6495 // CHECK13-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]])
6496 // CHECK13-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
6497 // CHECK13-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
6498 // CHECK13:       omp.dispatch.body:
6499 // CHECK13-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6500 // CHECK13-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
6501 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6502 // CHECK13:       omp.inner.for.cond:
6503 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !43
6504 // CHECK13-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !43
6505 // CHECK13-NEXT:    [[CMP7:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
6506 // CHECK13-NEXT:    br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6507 // CHECK13:       omp.inner.for.body:
6508 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !43
6509 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
6510 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6511 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4, !llvm.access.group !43
6512 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !43
6513 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
6514 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
6515 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !43
6516 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6517 // CHECK13:       omp.body.continue:
6518 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6519 // CHECK13:       omp.inner.for.inc:
6520 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !43
6521 // CHECK13-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP22]], 1
6522 // CHECK13-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !43
6523 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP44:![0-9]+]]
6524 // CHECK13:       omp.inner.for.end:
6525 // CHECK13-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
6526 // CHECK13:       omp.dispatch.inc:
6527 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND]]
6528 // CHECK13:       omp.dispatch.end:
6529 // CHECK13-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
6530 // CHECK13-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
6531 // CHECK13-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
6532 // CHECK13:       .omp.final.then:
6533 // CHECK13-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6534 // CHECK13-NEXT:    [[SUB9:%.*]] = sub nsw i32 [[TMP25]], 0
6535 // CHECK13-NEXT:    [[DIV10:%.*]] = sdiv i32 [[SUB9]], 1
6536 // CHECK13-NEXT:    [[MUL11:%.*]] = mul nsw i32 [[DIV10]], 1
6537 // CHECK13-NEXT:    [[ADD12:%.*]] = add nsw i32 0, [[MUL11]]
6538 // CHECK13-NEXT:    store i32 [[ADD12]], i32* [[I6]], align 4
6539 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
6540 // CHECK13:       .omp.final.done:
6541 // CHECK13-NEXT:    br label [[OMP_PRECOND_END]]
6542 // CHECK13:       omp.precond.end:
6543 // CHECK13-NEXT:    ret void
6544 //
6545 //
6546 // CHECK13-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
6547 // CHECK13-SAME: (i32 noundef signext [[ARGC:%.*]]) #[[ATTR5:[0-9]+]] comdat {
6548 // CHECK13-NEXT:  entry:
6549 // CHECK13-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
6550 // CHECK13-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
6551 // CHECK13-NEXT:    [[M:%.*]] = alloca i32, align 4
6552 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8
6553 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8
6554 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8
6555 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6556 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 8
6557 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 8
6558 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 8
6559 // CHECK13-NEXT:    [[_TMP4:%.*]] = alloca i32, align 4
6560 // CHECK13-NEXT:    [[M_CASTED:%.*]] = alloca i64, align 8
6561 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS8:%.*]] = alloca [2 x i8*], align 8
6562 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS9:%.*]] = alloca [2 x i8*], align 8
6563 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS10:%.*]] = alloca [2 x i8*], align 8
6564 // CHECK13-NEXT:    [[_TMP11:%.*]] = alloca i32, align 4
6565 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS15:%.*]] = alloca [1 x i8*], align 8
6566 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS16:%.*]] = alloca [1 x i8*], align 8
6567 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS17:%.*]] = alloca [1 x i8*], align 8
6568 // CHECK13-NEXT:    [[_TMP18:%.*]] = alloca i32, align 4
6569 // CHECK13-NEXT:    [[M_CASTED22:%.*]] = alloca i64, align 8
6570 // CHECK13-NEXT:    [[DOTOFFLOAD_BASEPTRS24:%.*]] = alloca [2 x i8*], align 8
6571 // CHECK13-NEXT:    [[DOTOFFLOAD_PTRS25:%.*]] = alloca [2 x i8*], align 8
6572 // CHECK13-NEXT:    [[DOTOFFLOAD_MAPPERS26:%.*]] = alloca [2 x i8*], align 8
6573 // CHECK13-NEXT:    [[_TMP27:%.*]] = alloca i32, align 4
6574 // CHECK13-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
6575 // CHECK13-NEXT:    store i32 10, i32* [[M]], align 4
6576 // CHECK13-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
6577 // CHECK13-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [10 x i32]**
6578 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP1]], align 8
6579 // CHECK13-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
6580 // CHECK13-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [10 x i32]**
6581 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP3]], align 8
6582 // CHECK13-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
6583 // CHECK13-NEXT:    store i8* null, i8** [[TMP4]], align 8
6584 // CHECK13-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
6585 // CHECK13-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
6586 // CHECK13-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
6587 // CHECK13-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
6588 // CHECK13-NEXT:    store i32 1, i32* [[TMP7]], align 4
6589 // CHECK13-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
6590 // CHECK13-NEXT:    store i32 1, i32* [[TMP8]], align 4
6591 // CHECK13-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
6592 // CHECK13-NEXT:    store i8** [[TMP5]], i8*** [[TMP9]], align 8
6593 // CHECK13-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
6594 // CHECK13-NEXT:    store i8** [[TMP6]], i8*** [[TMP10]], align 8
6595 // CHECK13-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
6596 // CHECK13-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.20, i32 0, i32 0), i64** [[TMP11]], align 8
6597 // CHECK13-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
6598 // CHECK13-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.21, i32 0, i32 0), i64** [[TMP12]], align 8
6599 // CHECK13-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
6600 // CHECK13-NEXT:    store i8** null, i8*** [[TMP13]], align 8
6601 // CHECK13-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
6602 // CHECK13-NEXT:    store i8** null, i8*** [[TMP14]], align 8
6603 // CHECK13-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
6604 // CHECK13-NEXT:    store i64 10, i64* [[TMP15]], align 8
6605 // CHECK13-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
6606 // CHECK13-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
6607 // CHECK13-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
6608 // CHECK13:       omp_offload.failed:
6609 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122([10 x i32]* [[A]]) #[[ATTR3]]
6610 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT]]
6611 // CHECK13:       omp_offload.cont:
6612 // CHECK13-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
6613 // CHECK13-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to [10 x i32]**
6614 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP19]], align 8
6615 // CHECK13-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
6616 // CHECK13-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [10 x i32]**
6617 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP21]], align 8
6618 // CHECK13-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i64 0, i64 0
6619 // CHECK13-NEXT:    store i8* null, i8** [[TMP22]], align 8
6620 // CHECK13-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
6621 // CHECK13-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
6622 // CHECK13-NEXT:    [[KERNEL_ARGS5:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
6623 // CHECK13-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 0
6624 // CHECK13-NEXT:    store i32 1, i32* [[TMP25]], align 4
6625 // CHECK13-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 1
6626 // CHECK13-NEXT:    store i32 1, i32* [[TMP26]], align 4
6627 // CHECK13-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 2
6628 // CHECK13-NEXT:    store i8** [[TMP23]], i8*** [[TMP27]], align 8
6629 // CHECK13-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 3
6630 // CHECK13-NEXT:    store i8** [[TMP24]], i8*** [[TMP28]], align 8
6631 // CHECK13-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 4
6632 // CHECK13-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.24, i32 0, i32 0), i64** [[TMP29]], align 8
6633 // CHECK13-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 5
6634 // CHECK13-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.25, i32 0, i32 0), i64** [[TMP30]], align 8
6635 // CHECK13-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 6
6636 // CHECK13-NEXT:    store i8** null, i8*** [[TMP31]], align 8
6637 // CHECK13-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 7
6638 // CHECK13-NEXT:    store i8** null, i8*** [[TMP32]], align 8
6639 // CHECK13-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 8
6640 // CHECK13-NEXT:    store i64 10, i64* [[TMP33]], align 8
6641 // CHECK13-NEXT:    [[TMP34:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]])
6642 // CHECK13-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
6643 // CHECK13-NEXT:    br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
6644 // CHECK13:       omp_offload.failed6:
6645 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127([10 x i32]* [[A]]) #[[ATTR3]]
6646 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT7]]
6647 // CHECK13:       omp_offload.cont7:
6648 // CHECK13-NEXT:    [[TMP36:%.*]] = load i32, i32* [[M]], align 4
6649 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_CASTED]] to i32*
6650 // CHECK13-NEXT:    store i32 [[TMP36]], i32* [[CONV]], align 4
6651 // CHECK13-NEXT:    [[TMP37:%.*]] = load i64, i64* [[M_CASTED]], align 8
6652 // CHECK13-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 0
6653 // CHECK13-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to i64*
6654 // CHECK13-NEXT:    store i64 [[TMP37]], i64* [[TMP39]], align 8
6655 // CHECK13-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 0
6656 // CHECK13-NEXT:    [[TMP41:%.*]] = bitcast i8** [[TMP40]] to i64*
6657 // CHECK13-NEXT:    store i64 [[TMP37]], i64* [[TMP41]], align 8
6658 // CHECK13-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS10]], i64 0, i64 0
6659 // CHECK13-NEXT:    store i8* null, i8** [[TMP42]], align 8
6660 // CHECK13-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 1
6661 // CHECK13-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to [10 x i32]**
6662 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP44]], align 8
6663 // CHECK13-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 1
6664 // CHECK13-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to [10 x i32]**
6665 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP46]], align 8
6666 // CHECK13-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS10]], i64 0, i64 1
6667 // CHECK13-NEXT:    store i8* null, i8** [[TMP47]], align 8
6668 // CHECK13-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 0
6669 // CHECK13-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 0
6670 // CHECK13-NEXT:    [[KERNEL_ARGS12:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
6671 // CHECK13-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 0
6672 // CHECK13-NEXT:    store i32 1, i32* [[TMP50]], align 4
6673 // CHECK13-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 1
6674 // CHECK13-NEXT:    store i32 2, i32* [[TMP51]], align 4
6675 // CHECK13-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 2
6676 // CHECK13-NEXT:    store i8** [[TMP48]], i8*** [[TMP52]], align 8
6677 // CHECK13-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 3
6678 // CHECK13-NEXT:    store i8** [[TMP49]], i8*** [[TMP53]], align 8
6679 // CHECK13-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 4
6680 // CHECK13-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.28, i32 0, i32 0), i64** [[TMP54]], align 8
6681 // CHECK13-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 5
6682 // CHECK13-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.29, i32 0, i32 0), i64** [[TMP55]], align 8
6683 // CHECK13-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 6
6684 // CHECK13-NEXT:    store i8** null, i8*** [[TMP56]], align 8
6685 // CHECK13-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 7
6686 // CHECK13-NEXT:    store i8** null, i8*** [[TMP57]], align 8
6687 // CHECK13-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 8
6688 // CHECK13-NEXT:    store i64 10, i64* [[TMP58]], align 8
6689 // CHECK13-NEXT:    [[TMP59:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]])
6690 // CHECK13-NEXT:    [[TMP60:%.*]] = icmp ne i32 [[TMP59]], 0
6691 // CHECK13-NEXT:    br i1 [[TMP60]], label [[OMP_OFFLOAD_FAILED13:%.*]], label [[OMP_OFFLOAD_CONT14:%.*]]
6692 // CHECK13:       omp_offload.failed13:
6693 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132(i64 [[TMP37]], [10 x i32]* [[A]]) #[[ATTR3]]
6694 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT14]]
6695 // CHECK13:       omp_offload.cont14:
6696 // CHECK13-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS15]], i32 0, i32 0
6697 // CHECK13-NEXT:    [[TMP62:%.*]] = bitcast i8** [[TMP61]] to [10 x i32]**
6698 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP62]], align 8
6699 // CHECK13-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS16]], i32 0, i32 0
6700 // CHECK13-NEXT:    [[TMP64:%.*]] = bitcast i8** [[TMP63]] to [10 x i32]**
6701 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP64]], align 8
6702 // CHECK13-NEXT:    [[TMP65:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS17]], i64 0, i64 0
6703 // CHECK13-NEXT:    store i8* null, i8** [[TMP65]], align 8
6704 // CHECK13-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS15]], i32 0, i32 0
6705 // CHECK13-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS16]], i32 0, i32 0
6706 // CHECK13-NEXT:    [[KERNEL_ARGS19:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
6707 // CHECK13-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 0
6708 // CHECK13-NEXT:    store i32 1, i32* [[TMP68]], align 4
6709 // CHECK13-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 1
6710 // CHECK13-NEXT:    store i32 1, i32* [[TMP69]], align 4
6711 // CHECK13-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 2
6712 // CHECK13-NEXT:    store i8** [[TMP66]], i8*** [[TMP70]], align 8
6713 // CHECK13-NEXT:    [[TMP71:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 3
6714 // CHECK13-NEXT:    store i8** [[TMP67]], i8*** [[TMP71]], align 8
6715 // CHECK13-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 4
6716 // CHECK13-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.32, i32 0, i32 0), i64** [[TMP72]], align 8
6717 // CHECK13-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 5
6718 // CHECK13-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.33, i32 0, i32 0), i64** [[TMP73]], align 8
6719 // CHECK13-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 6
6720 // CHECK13-NEXT:    store i8** null, i8*** [[TMP74]], align 8
6721 // CHECK13-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 7
6722 // CHECK13-NEXT:    store i8** null, i8*** [[TMP75]], align 8
6723 // CHECK13-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 8
6724 // CHECK13-NEXT:    store i64 10, i64* [[TMP76]], align 8
6725 // CHECK13-NEXT:    [[TMP77:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]])
6726 // CHECK13-NEXT:    [[TMP78:%.*]] = icmp ne i32 [[TMP77]], 0
6727 // CHECK13-NEXT:    br i1 [[TMP78]], label [[OMP_OFFLOAD_FAILED20:%.*]], label [[OMP_OFFLOAD_CONT21:%.*]]
6728 // CHECK13:       omp_offload.failed20:
6729 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137([10 x i32]* [[A]]) #[[ATTR3]]
6730 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT21]]
6731 // CHECK13:       omp_offload.cont21:
6732 // CHECK13-NEXT:    [[TMP79:%.*]] = load i32, i32* [[M]], align 4
6733 // CHECK13-NEXT:    [[CONV23:%.*]] = bitcast i64* [[M_CASTED22]] to i32*
6734 // CHECK13-NEXT:    store i32 [[TMP79]], i32* [[CONV23]], align 4
6735 // CHECK13-NEXT:    [[TMP80:%.*]] = load i64, i64* [[M_CASTED22]], align 8
6736 // CHECK13-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS24]], i32 0, i32 0
6737 // CHECK13-NEXT:    [[TMP82:%.*]] = bitcast i8** [[TMP81]] to i64*
6738 // CHECK13-NEXT:    store i64 [[TMP80]], i64* [[TMP82]], align 8
6739 // CHECK13-NEXT:    [[TMP83:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS25]], i32 0, i32 0
6740 // CHECK13-NEXT:    [[TMP84:%.*]] = bitcast i8** [[TMP83]] to i64*
6741 // CHECK13-NEXT:    store i64 [[TMP80]], i64* [[TMP84]], align 8
6742 // CHECK13-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS26]], i64 0, i64 0
6743 // CHECK13-NEXT:    store i8* null, i8** [[TMP85]], align 8
6744 // CHECK13-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS24]], i32 0, i32 1
6745 // CHECK13-NEXT:    [[TMP87:%.*]] = bitcast i8** [[TMP86]] to [10 x i32]**
6746 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP87]], align 8
6747 // CHECK13-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS25]], i32 0, i32 1
6748 // CHECK13-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to [10 x i32]**
6749 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP89]], align 8
6750 // CHECK13-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS26]], i64 0, i64 1
6751 // CHECK13-NEXT:    store i8* null, i8** [[TMP90]], align 8
6752 // CHECK13-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS24]], i32 0, i32 0
6753 // CHECK13-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS25]], i32 0, i32 0
6754 // CHECK13-NEXT:    [[KERNEL_ARGS28:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
6755 // CHECK13-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 0
6756 // CHECK13-NEXT:    store i32 1, i32* [[TMP93]], align 4
6757 // CHECK13-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 1
6758 // CHECK13-NEXT:    store i32 2, i32* [[TMP94]], align 4
6759 // CHECK13-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 2
6760 // CHECK13-NEXT:    store i8** [[TMP91]], i8*** [[TMP95]], align 8
6761 // CHECK13-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 3
6762 // CHECK13-NEXT:    store i8** [[TMP92]], i8*** [[TMP96]], align 8
6763 // CHECK13-NEXT:    [[TMP97:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 4
6764 // CHECK13-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.36, i32 0, i32 0), i64** [[TMP97]], align 8
6765 // CHECK13-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 5
6766 // CHECK13-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.37, i32 0, i32 0), i64** [[TMP98]], align 8
6767 // CHECK13-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 6
6768 // CHECK13-NEXT:    store i8** null, i8*** [[TMP99]], align 8
6769 // CHECK13-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 7
6770 // CHECK13-NEXT:    store i8** null, i8*** [[TMP100]], align 8
6771 // CHECK13-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 8
6772 // CHECK13-NEXT:    store i64 10, i64* [[TMP101]], align 8
6773 // CHECK13-NEXT:    [[TMP102:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]])
6774 // CHECK13-NEXT:    [[TMP103:%.*]] = icmp ne i32 [[TMP102]], 0
6775 // CHECK13-NEXT:    br i1 [[TMP103]], label [[OMP_OFFLOAD_FAILED29:%.*]], label [[OMP_OFFLOAD_CONT30:%.*]]
6776 // CHECK13:       omp_offload.failed29:
6777 // CHECK13-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142(i64 [[TMP80]], [10 x i32]* [[A]]) #[[ATTR3]]
6778 // CHECK13-NEXT:    br label [[OMP_OFFLOAD_CONT30]]
6779 // CHECK13:       omp_offload.cont30:
6780 // CHECK13-NEXT:    ret i32 0
6781 //
6782 //
6783 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122
6784 // CHECK13-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6785 // CHECK13-NEXT:  entry:
6786 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
6787 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
6788 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
6789 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..18 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
6790 // CHECK13-NEXT:    ret void
6791 //
6792 //
6793 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..18
6794 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6795 // CHECK13-NEXT:  entry:
6796 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6797 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6798 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
6799 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6800 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6801 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6802 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6803 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6804 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6805 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
6806 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6807 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6808 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
6809 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
6810 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6811 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
6812 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6813 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6814 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6815 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
6816 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
6817 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6818 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
6819 // CHECK13-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6820 // CHECK13:       cond.true:
6821 // CHECK13-NEXT:    br label [[COND_END:%.*]]
6822 // CHECK13:       cond.false:
6823 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6824 // CHECK13-NEXT:    br label [[COND_END]]
6825 // CHECK13:       cond.end:
6826 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
6827 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6828 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6829 // CHECK13-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
6830 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6831 // CHECK13:       omp.inner.for.cond:
6832 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !46
6833 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !46
6834 // CHECK13-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
6835 // CHECK13-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6836 // CHECK13:       omp.inner.for.body:
6837 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !46
6838 // CHECK13-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
6839 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !46
6840 // CHECK13-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
6841 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]]), !llvm.access.group !46
6842 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6843 // CHECK13:       omp.inner.for.inc:
6844 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !46
6845 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !46
6846 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
6847 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !46
6848 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP47:![0-9]+]]
6849 // CHECK13:       omp.inner.for.end:
6850 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6851 // CHECK13:       omp.loop.exit:
6852 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
6853 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
6854 // CHECK13-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
6855 // CHECK13-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
6856 // CHECK13:       .omp.final.then:
6857 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
6858 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
6859 // CHECK13:       .omp.final.done:
6860 // CHECK13-NEXT:    ret void
6861 //
6862 //
6863 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..19
6864 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6865 // CHECK13-NEXT:  entry:
6866 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6867 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6868 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
6869 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
6870 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
6871 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6872 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6873 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6874 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6875 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6876 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6877 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
6878 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6879 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6880 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6881 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6882 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
6883 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
6884 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6885 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
6886 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
6887 // CHECK13-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
6888 // CHECK13-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
6889 // CHECK13-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
6890 // CHECK13-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
6891 // CHECK13-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
6892 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6893 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6894 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6895 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
6896 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
6897 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6898 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
6899 // CHECK13-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6900 // CHECK13:       cond.true:
6901 // CHECK13-NEXT:    br label [[COND_END:%.*]]
6902 // CHECK13:       cond.false:
6903 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6904 // CHECK13-NEXT:    br label [[COND_END]]
6905 // CHECK13:       cond.end:
6906 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
6907 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
6908 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6909 // CHECK13-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
6910 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6911 // CHECK13:       omp.inner.for.cond:
6912 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !49
6913 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !49
6914 // CHECK13-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
6915 // CHECK13-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6916 // CHECK13:       omp.inner.for.body:
6917 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !49
6918 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
6919 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6920 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !49
6921 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !49
6922 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
6923 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
6924 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !49
6925 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6926 // CHECK13:       omp.body.continue:
6927 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6928 // CHECK13:       omp.inner.for.inc:
6929 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !49
6930 // CHECK13-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
6931 // CHECK13-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !49
6932 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP50:![0-9]+]]
6933 // CHECK13:       omp.inner.for.end:
6934 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6935 // CHECK13:       omp.loop.exit:
6936 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
6937 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
6938 // CHECK13-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
6939 // CHECK13-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
6940 // CHECK13:       .omp.final.then:
6941 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
6942 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
6943 // CHECK13:       .omp.final.done:
6944 // CHECK13-NEXT:    ret void
6945 //
6946 //
6947 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127
6948 // CHECK13-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6949 // CHECK13-NEXT:  entry:
6950 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
6951 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
6952 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
6953 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..22 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
6954 // CHECK13-NEXT:    ret void
6955 //
6956 //
6957 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..22
6958 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6959 // CHECK13-NEXT:  entry:
6960 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
6961 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
6962 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
6963 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6964 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6965 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6966 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6967 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6968 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6969 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
6970 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
6971 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
6972 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
6973 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
6974 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6975 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
6976 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6977 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6978 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
6979 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
6980 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
6981 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6982 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
6983 // CHECK13-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6984 // CHECK13:       cond.true:
6985 // CHECK13-NEXT:    br label [[COND_END:%.*]]
6986 // CHECK13:       cond.false:
6987 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6988 // CHECK13-NEXT:    br label [[COND_END]]
6989 // CHECK13:       cond.end:
6990 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
6991 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6992 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6993 // CHECK13-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
6994 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6995 // CHECK13:       omp.inner.for.cond:
6996 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !52
6997 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !52
6998 // CHECK13-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
6999 // CHECK13-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7000 // CHECK13:       omp.inner.for.body:
7001 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !52
7002 // CHECK13-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
7003 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !52
7004 // CHECK13-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
7005 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]]), !llvm.access.group !52
7006 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7007 // CHECK13:       omp.inner.for.inc:
7008 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !52
7009 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !52
7010 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
7011 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !52
7012 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP53:![0-9]+]]
7013 // CHECK13:       omp.inner.for.end:
7014 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7015 // CHECK13:       omp.loop.exit:
7016 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
7017 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
7018 // CHECK13-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
7019 // CHECK13-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
7020 // CHECK13:       .omp.final.then:
7021 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
7022 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
7023 // CHECK13:       .omp.final.done:
7024 // CHECK13-NEXT:    ret void
7025 //
7026 //
7027 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..23
7028 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
7029 // CHECK13-NEXT:  entry:
7030 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7031 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7032 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
7033 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
7034 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7035 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7036 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7037 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7038 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7039 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7040 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7041 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
7042 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7043 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7044 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7045 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7046 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7047 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7048 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7049 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
7050 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7051 // CHECK13-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
7052 // CHECK13-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7053 // CHECK13-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
7054 // CHECK13-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
7055 // CHECK13-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
7056 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7057 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7058 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7059 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
7060 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
7061 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7062 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
7063 // CHECK13-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7064 // CHECK13:       cond.true:
7065 // CHECK13-NEXT:    br label [[COND_END:%.*]]
7066 // CHECK13:       cond.false:
7067 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7068 // CHECK13-NEXT:    br label [[COND_END]]
7069 // CHECK13:       cond.end:
7070 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
7071 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
7072 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7073 // CHECK13-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
7074 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7075 // CHECK13:       omp.inner.for.cond:
7076 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !55
7077 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !55
7078 // CHECK13-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
7079 // CHECK13-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7080 // CHECK13:       omp.inner.for.body:
7081 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !55
7082 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
7083 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7084 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !55
7085 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !55
7086 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
7087 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
7088 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !55
7089 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7090 // CHECK13:       omp.body.continue:
7091 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7092 // CHECK13:       omp.inner.for.inc:
7093 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !55
7094 // CHECK13-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
7095 // CHECK13-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !55
7096 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP56:![0-9]+]]
7097 // CHECK13:       omp.inner.for.end:
7098 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7099 // CHECK13:       omp.loop.exit:
7100 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
7101 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
7102 // CHECK13-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
7103 // CHECK13-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
7104 // CHECK13:       .omp.final.then:
7105 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
7106 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
7107 // CHECK13:       .omp.final.done:
7108 // CHECK13-NEXT:    ret void
7109 //
7110 //
7111 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132
7112 // CHECK13-SAME: (i64 noundef [[M:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
7113 // CHECK13-NEXT:  entry:
7114 // CHECK13-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
7115 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7116 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7117 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
7118 // CHECK13-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
7119 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7120 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
7121 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7122 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32, i32* [[CONV]], align 4
7123 // CHECK13-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
7124 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7125 // CHECK13-NEXT:    [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
7126 // CHECK13-NEXT:    store i32 [[TMP2]], i32* [[CONV1]], align 4
7127 // CHECK13-NEXT:    [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
7128 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*, i64)* @.omp_outlined..26 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i64 [[TMP3]])
7129 // CHECK13-NEXT:    ret void
7130 //
7131 //
7132 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..26
7133 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
7134 // CHECK13-NEXT:  entry:
7135 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7136 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7137 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7138 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
7139 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7140 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7141 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7142 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7143 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7144 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7145 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
7146 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
7147 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7148 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7149 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7150 // CHECK13-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
7151 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7152 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
7153 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7154 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
7155 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7156 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7157 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7158 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
7159 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
7160 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7161 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
7162 // CHECK13-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7163 // CHECK13:       cond.true:
7164 // CHECK13-NEXT:    br label [[COND_END:%.*]]
7165 // CHECK13:       cond.false:
7166 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7167 // CHECK13-NEXT:    br label [[COND_END]]
7168 // CHECK13:       cond.end:
7169 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
7170 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7171 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7172 // CHECK13-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
7173 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7174 // CHECK13:       omp.inner.for.cond:
7175 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !58
7176 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !58
7177 // CHECK13-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
7178 // CHECK13-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7179 // CHECK13:       omp.inner.for.body:
7180 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !58
7181 // CHECK13-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
7182 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !58
7183 // CHECK13-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
7184 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[CONV]], align 4, !llvm.access.group !58
7185 // CHECK13-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
7186 // CHECK13-NEXT:    store i32 [[TMP12]], i32* [[CONV2]], align 4, !llvm.access.group !58
7187 // CHECK13-NEXT:    [[TMP13:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8, !llvm.access.group !58
7188 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*, i64)* @.omp_outlined..27 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]], i64 [[TMP13]]), !llvm.access.group !58
7189 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7190 // CHECK13:       omp.inner.for.inc:
7191 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !58
7192 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !58
7193 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]
7194 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !58
7195 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP59:![0-9]+]]
7196 // CHECK13:       omp.inner.for.end:
7197 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7198 // CHECK13:       omp.loop.exit:
7199 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
7200 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
7201 // CHECK13-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
7202 // CHECK13-NEXT:    br i1 [[TMP17]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
7203 // CHECK13:       .omp.final.then:
7204 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
7205 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
7206 // CHECK13:       .omp.final.done:
7207 // CHECK13-NEXT:    ret void
7208 //
7209 //
7210 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..27
7211 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
7212 // CHECK13-NEXT:  entry:
7213 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7214 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7215 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
7216 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
7217 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7218 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
7219 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7220 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7221 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7222 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7223 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7224 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7225 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
7226 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7227 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7228 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7229 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7230 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7231 // CHECK13-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
7232 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7233 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
7234 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7235 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
7236 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7237 // CHECK13-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP1]] to i32
7238 // CHECK13-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7239 // CHECK13-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP2]] to i32
7240 // CHECK13-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_LB]], align 4
7241 // CHECK13-NEXT:    store i32 [[CONV2]], i32* [[DOTOMP_UB]], align 4
7242 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7243 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7244 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[CONV]], align 4
7245 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7246 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP4]], align 4
7247 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP5]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP3]])
7248 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
7249 // CHECK13:       omp.dispatch.cond:
7250 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7251 // CHECK13-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7252 // CHECK13-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP7]] to i32
7253 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP6]], [[CONV3]]
7254 // CHECK13-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7255 // CHECK13:       cond.true:
7256 // CHECK13-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7257 // CHECK13-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP8]] to i32
7258 // CHECK13-NEXT:    br label [[COND_END:%.*]]
7259 // CHECK13:       cond.false:
7260 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7261 // CHECK13-NEXT:    br label [[COND_END]]
7262 // CHECK13:       cond.end:
7263 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ [[CONV4]], [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
7264 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
7265 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7266 // CHECK13-NEXT:    store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4
7267 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7268 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7269 // CHECK13-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
7270 // CHECK13-NEXT:    br i1 [[CMP5]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
7271 // CHECK13:       omp.dispatch.body:
7272 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7273 // CHECK13:       omp.inner.for.cond:
7274 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !61
7275 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !61
7276 // CHECK13-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
7277 // CHECK13-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7278 // CHECK13:       omp.inner.for.body:
7279 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !61
7280 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1
7281 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7282 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !61
7283 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !61
7284 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP16]] to i64
7285 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
7286 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !61
7287 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7288 // CHECK13:       omp.body.continue:
7289 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7290 // CHECK13:       omp.inner.for.inc:
7291 // CHECK13-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !61
7292 // CHECK13-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP17]], 1
7293 // CHECK13-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !61
7294 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP62:![0-9]+]]
7295 // CHECK13:       omp.inner.for.end:
7296 // CHECK13-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
7297 // CHECK13:       omp.dispatch.inc:
7298 // CHECK13-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7299 // CHECK13-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7300 // CHECK13-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
7301 // CHECK13-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_LB]], align 4
7302 // CHECK13-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7303 // CHECK13-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7304 // CHECK13-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
7305 // CHECK13-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_UB]], align 4
7306 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND]]
7307 // CHECK13:       omp.dispatch.end:
7308 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP5]])
7309 // CHECK13-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
7310 // CHECK13-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
7311 // CHECK13-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
7312 // CHECK13:       .omp.final.then:
7313 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
7314 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
7315 // CHECK13:       .omp.final.done:
7316 // CHECK13-NEXT:    ret void
7317 //
7318 //
7319 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137
7320 // CHECK13-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
7321 // CHECK13-NEXT:  entry:
7322 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7323 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7324 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7325 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
7326 // CHECK13-NEXT:    ret void
7327 //
7328 //
7329 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..30
7330 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
7331 // CHECK13-NEXT:  entry:
7332 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7333 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7334 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7335 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7336 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7337 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7338 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7339 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7340 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7341 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
7342 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7343 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7344 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7345 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7346 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7347 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
7348 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7349 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7350 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7351 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
7352 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
7353 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7354 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
7355 // CHECK13-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7356 // CHECK13:       cond.true:
7357 // CHECK13-NEXT:    br label [[COND_END:%.*]]
7358 // CHECK13:       cond.false:
7359 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7360 // CHECK13-NEXT:    br label [[COND_END]]
7361 // CHECK13:       cond.end:
7362 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
7363 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7364 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7365 // CHECK13-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
7366 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7367 // CHECK13:       omp.inner.for.cond:
7368 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !64
7369 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !64
7370 // CHECK13-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
7371 // CHECK13-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7372 // CHECK13:       omp.inner.for.body:
7373 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !64
7374 // CHECK13-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
7375 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !64
7376 // CHECK13-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
7377 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]]), !llvm.access.group !64
7378 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7379 // CHECK13:       omp.inner.for.inc:
7380 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !64
7381 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !64
7382 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
7383 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !64
7384 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP65:![0-9]+]]
7385 // CHECK13:       omp.inner.for.end:
7386 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7387 // CHECK13:       omp.loop.exit:
7388 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
7389 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
7390 // CHECK13-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
7391 // CHECK13-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
7392 // CHECK13:       .omp.final.then:
7393 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
7394 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
7395 // CHECK13:       .omp.final.done:
7396 // CHECK13-NEXT:    ret void
7397 //
7398 //
7399 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..31
7400 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
7401 // CHECK13-NEXT:  entry:
7402 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7403 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7404 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
7405 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
7406 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7407 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7408 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7409 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7410 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7411 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7412 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7413 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
7414 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7415 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7416 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7417 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7418 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7419 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7420 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7421 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
7422 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7423 // CHECK13-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
7424 // CHECK13-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7425 // CHECK13-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
7426 // CHECK13-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
7427 // CHECK13-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
7428 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7429 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7430 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7431 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7432 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7433 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
7434 // CHECK13-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 35, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 1)
7435 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
7436 // CHECK13:       omp.dispatch.cond:
7437 // CHECK13-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
7438 // CHECK13-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
7439 // CHECK13-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
7440 // CHECK13:       omp.dispatch.body:
7441 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7442 // CHECK13-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
7443 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7444 // CHECK13:       omp.inner.for.cond:
7445 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !67
7446 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !67
7447 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
7448 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7449 // CHECK13:       omp.inner.for.body:
7450 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !67
7451 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
7452 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7453 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !67
7454 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !67
7455 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP12]] to i64
7456 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
7457 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !67
7458 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7459 // CHECK13:       omp.body.continue:
7460 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7461 // CHECK13:       omp.inner.for.inc:
7462 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !67
7463 // CHECK13-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP13]], 1
7464 // CHECK13-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !67
7465 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP68:![0-9]+]]
7466 // CHECK13:       omp.inner.for.end:
7467 // CHECK13-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
7468 // CHECK13:       omp.dispatch.inc:
7469 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND]]
7470 // CHECK13:       omp.dispatch.end:
7471 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
7472 // CHECK13-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
7473 // CHECK13-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
7474 // CHECK13:       .omp.final.then:
7475 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
7476 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
7477 // CHECK13:       .omp.final.done:
7478 // CHECK13-NEXT:    ret void
7479 //
7480 //
7481 // CHECK13-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142
7482 // CHECK13-SAME: (i64 noundef [[M:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
7483 // CHECK13-NEXT:  entry:
7484 // CHECK13-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
7485 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7486 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7487 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
7488 // CHECK13-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
7489 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7490 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
7491 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7492 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32, i32* [[CONV]], align 4
7493 // CHECK13-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
7494 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7495 // CHECK13-NEXT:    [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
7496 // CHECK13-NEXT:    store i32 [[TMP2]], i32* [[CONV1]], align 4
7497 // CHECK13-NEXT:    [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
7498 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*, i64)* @.omp_outlined..34 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i64 [[TMP3]])
7499 // CHECK13-NEXT:    ret void
7500 //
7501 //
7502 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..34
7503 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
7504 // CHECK13-NEXT:  entry:
7505 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7506 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7507 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7508 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
7509 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7510 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7511 // CHECK13-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7512 // CHECK13-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7513 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7514 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7515 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
7516 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
7517 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7518 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7519 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7520 // CHECK13-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
7521 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7522 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
7523 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7524 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
7525 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7526 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7527 // CHECK13-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7528 // CHECK13-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
7529 // CHECK13-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
7530 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7531 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
7532 // CHECK13-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7533 // CHECK13:       cond.true:
7534 // CHECK13-NEXT:    br label [[COND_END:%.*]]
7535 // CHECK13:       cond.false:
7536 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7537 // CHECK13-NEXT:    br label [[COND_END]]
7538 // CHECK13:       cond.end:
7539 // CHECK13-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
7540 // CHECK13-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7541 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7542 // CHECK13-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
7543 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7544 // CHECK13:       omp.inner.for.cond:
7545 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !70
7546 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !70
7547 // CHECK13-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
7548 // CHECK13-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7549 // CHECK13:       omp.inner.for.body:
7550 // CHECK13-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !70
7551 // CHECK13-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
7552 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !70
7553 // CHECK13-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
7554 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[CONV]], align 4, !llvm.access.group !70
7555 // CHECK13-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
7556 // CHECK13-NEXT:    store i32 [[TMP12]], i32* [[CONV2]], align 4, !llvm.access.group !70
7557 // CHECK13-NEXT:    [[TMP13:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8, !llvm.access.group !70
7558 // CHECK13-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*, i64)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]], i64 [[TMP13]]), !llvm.access.group !70
7559 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7560 // CHECK13:       omp.inner.for.inc:
7561 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !70
7562 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !70
7563 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]
7564 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !70
7565 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP71:![0-9]+]]
7566 // CHECK13:       omp.inner.for.end:
7567 // CHECK13-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7568 // CHECK13:       omp.loop.exit:
7569 // CHECK13-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
7570 // CHECK13-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
7571 // CHECK13-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
7572 // CHECK13-NEXT:    br i1 [[TMP17]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
7573 // CHECK13:       .omp.final.then:
7574 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
7575 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
7576 // CHECK13:       .omp.final.done:
7577 // CHECK13-NEXT:    ret void
7578 //
7579 //
7580 // CHECK13-LABEL: define {{[^@]+}}@.omp_outlined..35
7581 // CHECK13-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
7582 // CHECK13-NEXT:  entry:
7583 // CHECK13-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
7584 // CHECK13-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
7585 // CHECK13-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
7586 // CHECK13-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
7587 // CHECK13-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
7588 // CHECK13-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
7589 // CHECK13-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7590 // CHECK13-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7591 // CHECK13-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7592 // CHECK13-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7593 // CHECK13-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7594 // CHECK13-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7595 // CHECK13-NEXT:    [[I:%.*]] = alloca i32, align 4
7596 // CHECK13-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
7597 // CHECK13-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
7598 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7599 // CHECK13-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7600 // CHECK13-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
7601 // CHECK13-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
7602 // CHECK13-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
7603 // CHECK13-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
7604 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7605 // CHECK13-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
7606 // CHECK13-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
7607 // CHECK13-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP1]] to i32
7608 // CHECK13-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
7609 // CHECK13-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP2]] to i32
7610 // CHECK13-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_LB]], align 4
7611 // CHECK13-NEXT:    store i32 [[CONV2]], i32* [[DOTOMP_UB]], align 4
7612 // CHECK13-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7613 // CHECK13-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7614 // CHECK13-NEXT:    [[TMP3:%.*]] = load i32, i32* [[CONV]], align 4
7615 // CHECK13-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7616 // CHECK13-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7617 // CHECK13-NEXT:    [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
7618 // CHECK13-NEXT:    [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
7619 // CHECK13-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP7]], i32 35, i32 [[TMP4]], i32 [[TMP5]], i32 1, i32 [[TMP3]])
7620 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
7621 // CHECK13:       omp.dispatch.cond:
7622 // CHECK13-NEXT:    [[TMP8:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP7]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
7623 // CHECK13-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP8]], 0
7624 // CHECK13-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
7625 // CHECK13:       omp.dispatch.body:
7626 // CHECK13-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7627 // CHECK13-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_IV]], align 4
7628 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7629 // CHECK13:       omp.inner.for.cond:
7630 // CHECK13-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !73
7631 // CHECK13-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !73
7632 // CHECK13-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]
7633 // CHECK13-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7634 // CHECK13:       omp.inner.for.body:
7635 // CHECK13-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !73
7636 // CHECK13-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP12]], 1
7637 // CHECK13-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7638 // CHECK13-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !73
7639 // CHECK13-NEXT:    [[TMP13:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !73
7640 // CHECK13-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP13]] to i64
7641 // CHECK13-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
7642 // CHECK13-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !73
7643 // CHECK13-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7644 // CHECK13:       omp.body.continue:
7645 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7646 // CHECK13:       omp.inner.for.inc:
7647 // CHECK13-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !73
7648 // CHECK13-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP14]], 1
7649 // CHECK13-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !73
7650 // CHECK13-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP74:![0-9]+]]
7651 // CHECK13:       omp.inner.for.end:
7652 // CHECK13-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
7653 // CHECK13:       omp.dispatch.inc:
7654 // CHECK13-NEXT:    br label [[OMP_DISPATCH_COND]]
7655 // CHECK13:       omp.dispatch.end:
7656 // CHECK13-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
7657 // CHECK13-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
7658 // CHECK13-NEXT:    br i1 [[TMP16]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
7659 // CHECK13:       .omp.final.then:
7660 // CHECK13-NEXT:    store i32 10, i32* [[I]], align 4
7661 // CHECK13-NEXT:    br label [[DOTOMP_FINAL_DONE]]
7662 // CHECK13:       .omp.final.done:
7663 // CHECK13-NEXT:    ret void
7664 //
7665 //
7666 // CHECK13-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
7667 // CHECK13-SAME: () #[[ATTR6:[0-9]+]] {
7668 // CHECK13-NEXT:  entry:
7669 // CHECK13-NEXT:    call void @__tgt_register_requires(i64 1)
7670 // CHECK13-NEXT:    ret void
7671 //
7672 //
7673 // CHECK14-LABEL: define {{[^@]+}}@main
7674 // CHECK14-SAME: (i32 noundef signext [[ARGC:%.*]], i8** noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
7675 // CHECK14-NEXT:  entry:
7676 // CHECK14-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
7677 // CHECK14-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
7678 // CHECK14-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 8
7679 // CHECK14-NEXT:    [[N:%.*]] = alloca i32, align 4
7680 // CHECK14-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 8
7681 // CHECK14-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i64, align 8
7682 // CHECK14-NEXT:    [[M:%.*]] = alloca i32, align 4
7683 // CHECK14-NEXT:    [[N_CASTED:%.*]] = alloca i64, align 8
7684 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
7685 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
7686 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
7687 // CHECK14-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 8
7688 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7689 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7690 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7691 // CHECK14-NEXT:    [[N_CASTED3:%.*]] = alloca i64, align 8
7692 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [3 x i8*], align 8
7693 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS6:%.*]] = alloca [3 x i8*], align 8
7694 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [3 x i8*], align 8
7695 // CHECK14-NEXT:    [[DOTOFFLOAD_SIZES8:%.*]] = alloca [3 x i64], align 8
7696 // CHECK14-NEXT:    [[_TMP9:%.*]] = alloca i32, align 4
7697 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
7698 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_11:%.*]] = alloca i32, align 4
7699 // CHECK14-NEXT:    [[M_CASTED:%.*]] = alloca i64, align 8
7700 // CHECK14-NEXT:    [[N_CASTED20:%.*]] = alloca i64, align 8
7701 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS22:%.*]] = alloca [4 x i8*], align 8
7702 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS23:%.*]] = alloca [4 x i8*], align 8
7703 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS24:%.*]] = alloca [4 x i8*], align 8
7704 // CHECK14-NEXT:    [[DOTOFFLOAD_SIZES25:%.*]] = alloca [4 x i64], align 8
7705 // CHECK14-NEXT:    [[_TMP26:%.*]] = alloca i32, align 4
7706 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_27:%.*]] = alloca i32, align 4
7707 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_28:%.*]] = alloca i32, align 4
7708 // CHECK14-NEXT:    [[N_CASTED36:%.*]] = alloca i64, align 8
7709 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS38:%.*]] = alloca [3 x i8*], align 8
7710 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS39:%.*]] = alloca [3 x i8*], align 8
7711 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS40:%.*]] = alloca [3 x i8*], align 8
7712 // CHECK14-NEXT:    [[DOTOFFLOAD_SIZES41:%.*]] = alloca [3 x i64], align 8
7713 // CHECK14-NEXT:    [[_TMP42:%.*]] = alloca i32, align 4
7714 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_43:%.*]] = alloca i32, align 4
7715 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_44:%.*]] = alloca i32, align 4
7716 // CHECK14-NEXT:    [[M_CASTED52:%.*]] = alloca i64, align 8
7717 // CHECK14-NEXT:    [[N_CASTED54:%.*]] = alloca i64, align 8
7718 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS56:%.*]] = alloca [4 x i8*], align 8
7719 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS57:%.*]] = alloca [4 x i8*], align 8
7720 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS58:%.*]] = alloca [4 x i8*], align 8
7721 // CHECK14-NEXT:    [[DOTOFFLOAD_SIZES59:%.*]] = alloca [4 x i64], align 8
7722 // CHECK14-NEXT:    [[_TMP60:%.*]] = alloca i32, align 4
7723 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_61:%.*]] = alloca i32, align 4
7724 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_62:%.*]] = alloca i32, align 4
7725 // CHECK14-NEXT:    store i32 0, i32* [[RETVAL]], align 4
7726 // CHECK14-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
7727 // CHECK14-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
7728 // CHECK14-NEXT:    store i32 100, i32* [[N]], align 4
7729 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
7730 // CHECK14-NEXT:    [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
7731 // CHECK14-NEXT:    [[TMP2:%.*]] = call i8* @llvm.stacksave()
7732 // CHECK14-NEXT:    store i8* [[TMP2]], i8** [[SAVED_STACK]], align 8
7733 // CHECK14-NEXT:    [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 4
7734 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[__VLA_EXPR0]], align 8
7735 // CHECK14-NEXT:    store i32 10, i32* [[M]], align 4
7736 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[N]], align 4
7737 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_CASTED]] to i32*
7738 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[CONV]], align 4
7739 // CHECK14-NEXT:    [[TMP4:%.*]] = load i64, i64* [[N_CASTED]], align 8
7740 // CHECK14-NEXT:    [[TMP5:%.*]] = mul nuw i64 [[TMP1]], 4
7741 // CHECK14-NEXT:    [[TMP6:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
7742 // CHECK14-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP6]], i8* align 8 bitcast ([3 x i64]* @.offload_sizes to i8*), i64 24, i1 false)
7743 // CHECK14-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
7744 // CHECK14-NEXT:    [[TMP8:%.*]] = bitcast i8** [[TMP7]] to i64*
7745 // CHECK14-NEXT:    store i64 [[TMP4]], i64* [[TMP8]], align 8
7746 // CHECK14-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
7747 // CHECK14-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i64*
7748 // CHECK14-NEXT:    store i64 [[TMP4]], i64* [[TMP10]], align 8
7749 // CHECK14-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
7750 // CHECK14-NEXT:    store i8* null, i8** [[TMP11]], align 8
7751 // CHECK14-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
7752 // CHECK14-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i64*
7753 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP13]], align 8
7754 // CHECK14-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
7755 // CHECK14-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i64*
7756 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP15]], align 8
7757 // CHECK14-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
7758 // CHECK14-NEXT:    store i8* null, i8** [[TMP16]], align 8
7759 // CHECK14-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
7760 // CHECK14-NEXT:    [[TMP18:%.*]] = bitcast i8** [[TMP17]] to i32**
7761 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP18]], align 8
7762 // CHECK14-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
7763 // CHECK14-NEXT:    [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i32**
7764 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP20]], align 8
7765 // CHECK14-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
7766 // CHECK14-NEXT:    store i64 [[TMP5]], i64* [[TMP21]], align 8
7767 // CHECK14-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
7768 // CHECK14-NEXT:    store i8* null, i8** [[TMP22]], align 8
7769 // CHECK14-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
7770 // CHECK14-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
7771 // CHECK14-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
7772 // CHECK14-NEXT:    [[TMP26:%.*]] = load i32, i32* [[N]], align 4
7773 // CHECK14-NEXT:    store i32 [[TMP26]], i32* [[DOTCAPTURE_EXPR_]], align 4
7774 // CHECK14-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7775 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP27]], 0
7776 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7777 // CHECK14-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7778 // CHECK14-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7779 // CHECK14-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7780 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP28]], 1
7781 // CHECK14-NEXT:    [[TMP29:%.*]] = zext i32 [[ADD]] to i64
7782 // CHECK14-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
7783 // CHECK14-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
7784 // CHECK14-NEXT:    store i32 1, i32* [[TMP30]], align 4
7785 // CHECK14-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
7786 // CHECK14-NEXT:    store i32 3, i32* [[TMP31]], align 4
7787 // CHECK14-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
7788 // CHECK14-NEXT:    store i8** [[TMP23]], i8*** [[TMP32]], align 8
7789 // CHECK14-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
7790 // CHECK14-NEXT:    store i8** [[TMP24]], i8*** [[TMP33]], align 8
7791 // CHECK14-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
7792 // CHECK14-NEXT:    store i64* [[TMP25]], i64** [[TMP34]], align 8
7793 // CHECK14-NEXT:    [[TMP35:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
7794 // CHECK14-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP35]], align 8
7795 // CHECK14-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
7796 // CHECK14-NEXT:    store i8** null, i8*** [[TMP36]], align 8
7797 // CHECK14-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
7798 // CHECK14-NEXT:    store i8** null, i8*** [[TMP37]], align 8
7799 // CHECK14-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
7800 // CHECK14-NEXT:    store i64 [[TMP29]], i64* [[TMP38]], align 8
7801 // CHECK14-NEXT:    [[TMP39:%.*]] = 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_l154.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
7802 // CHECK14-NEXT:    [[TMP40:%.*]] = icmp ne i32 [[TMP39]], 0
7803 // CHECK14-NEXT:    br i1 [[TMP40]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
7804 // CHECK14:       omp_offload.failed:
7805 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l154(i64 [[TMP4]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3:[0-9]+]]
7806 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT]]
7807 // CHECK14:       omp_offload.cont:
7808 // CHECK14-NEXT:    [[TMP41:%.*]] = load i32, i32* [[N]], align 4
7809 // CHECK14-NEXT:    [[CONV4:%.*]] = bitcast i64* [[N_CASTED3]] to i32*
7810 // CHECK14-NEXT:    store i32 [[TMP41]], i32* [[CONV4]], align 4
7811 // CHECK14-NEXT:    [[TMP42:%.*]] = load i64, i64* [[N_CASTED3]], align 8
7812 // CHECK14-NEXT:    [[TMP43:%.*]] = mul nuw i64 [[TMP1]], 4
7813 // CHECK14-NEXT:    [[TMP44:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES8]] to i8*
7814 // CHECK14-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP44]], i8* align 8 bitcast ([3 x i64]* @.offload_sizes.4 to i8*), i64 24, i1 false)
7815 // CHECK14-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
7816 // CHECK14-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i64*
7817 // CHECK14-NEXT:    store i64 [[TMP42]], i64* [[TMP46]], align 8
7818 // CHECK14-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
7819 // CHECK14-NEXT:    [[TMP48:%.*]] = bitcast i8** [[TMP47]] to i64*
7820 // CHECK14-NEXT:    store i64 [[TMP42]], i64* [[TMP48]], align 8
7821 // CHECK14-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 0
7822 // CHECK14-NEXT:    store i8* null, i8** [[TMP49]], align 8
7823 // CHECK14-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 1
7824 // CHECK14-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i64*
7825 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP51]], align 8
7826 // CHECK14-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 1
7827 // CHECK14-NEXT:    [[TMP53:%.*]] = bitcast i8** [[TMP52]] to i64*
7828 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP53]], align 8
7829 // CHECK14-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 1
7830 // CHECK14-NEXT:    store i8* null, i8** [[TMP54]], align 8
7831 // CHECK14-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 2
7832 // CHECK14-NEXT:    [[TMP56:%.*]] = bitcast i8** [[TMP55]] to i32**
7833 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP56]], align 8
7834 // CHECK14-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 2
7835 // CHECK14-NEXT:    [[TMP58:%.*]] = bitcast i8** [[TMP57]] to i32**
7836 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP58]], align 8
7837 // CHECK14-NEXT:    [[TMP59:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 2
7838 // CHECK14-NEXT:    store i64 [[TMP43]], i64* [[TMP59]], align 8
7839 // CHECK14-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 2
7840 // CHECK14-NEXT:    store i8* null, i8** [[TMP60]], align 8
7841 // CHECK14-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
7842 // CHECK14-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
7843 // CHECK14-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 0
7844 // CHECK14-NEXT:    [[TMP64:%.*]] = load i32, i32* [[N]], align 4
7845 // CHECK14-NEXT:    store i32 [[TMP64]], i32* [[DOTCAPTURE_EXPR_10]], align 4
7846 // CHECK14-NEXT:    [[TMP65:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
7847 // CHECK14-NEXT:    [[SUB12:%.*]] = sub nsw i32 [[TMP65]], 0
7848 // CHECK14-NEXT:    [[DIV13:%.*]] = sdiv i32 [[SUB12]], 1
7849 // CHECK14-NEXT:    [[SUB14:%.*]] = sub nsw i32 [[DIV13]], 1
7850 // CHECK14-NEXT:    store i32 [[SUB14]], i32* [[DOTCAPTURE_EXPR_11]], align 4
7851 // CHECK14-NEXT:    [[TMP66:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
7852 // CHECK14-NEXT:    [[ADD15:%.*]] = add nsw i32 [[TMP66]], 1
7853 // CHECK14-NEXT:    [[TMP67:%.*]] = zext i32 [[ADD15]] to i64
7854 // CHECK14-NEXT:    [[KERNEL_ARGS16:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
7855 // CHECK14-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 0
7856 // CHECK14-NEXT:    store i32 1, i32* [[TMP68]], align 4
7857 // CHECK14-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 1
7858 // CHECK14-NEXT:    store i32 3, i32* [[TMP69]], align 4
7859 // CHECK14-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 2
7860 // CHECK14-NEXT:    store i8** [[TMP61]], i8*** [[TMP70]], align 8
7861 // CHECK14-NEXT:    [[TMP71:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 3
7862 // CHECK14-NEXT:    store i8** [[TMP62]], i8*** [[TMP71]], align 8
7863 // CHECK14-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 4
7864 // CHECK14-NEXT:    store i64* [[TMP63]], i64** [[TMP72]], align 8
7865 // CHECK14-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 5
7866 // CHECK14-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP73]], align 8
7867 // CHECK14-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 6
7868 // CHECK14-NEXT:    store i8** null, i8*** [[TMP74]], align 8
7869 // CHECK14-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 7
7870 // CHECK14-NEXT:    store i8** null, i8*** [[TMP75]], align 8
7871 // CHECK14-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]], i32 0, i32 8
7872 // CHECK14-NEXT:    store i64 [[TMP67]], i64* [[TMP76]], align 8
7873 // CHECK14-NEXT:    [[TMP77:%.*]] = 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_l159.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS16]])
7874 // CHECK14-NEXT:    [[TMP78:%.*]] = icmp ne i32 [[TMP77]], 0
7875 // CHECK14-NEXT:    br i1 [[TMP78]], label [[OMP_OFFLOAD_FAILED17:%.*]], label [[OMP_OFFLOAD_CONT18:%.*]]
7876 // CHECK14:       omp_offload.failed17:
7877 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l159(i64 [[TMP42]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
7878 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT18]]
7879 // CHECK14:       omp_offload.cont18:
7880 // CHECK14-NEXT:    [[TMP79:%.*]] = load i32, i32* [[M]], align 4
7881 // CHECK14-NEXT:    [[CONV19:%.*]] = bitcast i64* [[M_CASTED]] to i32*
7882 // CHECK14-NEXT:    store i32 [[TMP79]], i32* [[CONV19]], align 4
7883 // CHECK14-NEXT:    [[TMP80:%.*]] = load i64, i64* [[M_CASTED]], align 8
7884 // CHECK14-NEXT:    [[TMP81:%.*]] = load i32, i32* [[N]], align 4
7885 // CHECK14-NEXT:    [[CONV21:%.*]] = bitcast i64* [[N_CASTED20]] to i32*
7886 // CHECK14-NEXT:    store i32 [[TMP81]], i32* [[CONV21]], align 4
7887 // CHECK14-NEXT:    [[TMP82:%.*]] = load i64, i64* [[N_CASTED20]], align 8
7888 // CHECK14-NEXT:    [[TMP83:%.*]] = mul nuw i64 [[TMP1]], 4
7889 // CHECK14-NEXT:    [[TMP84:%.*]] = bitcast [4 x i64]* [[DOTOFFLOAD_SIZES25]] to i8*
7890 // CHECK14-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP84]], i8* align 8 bitcast ([4 x i64]* @.offload_sizes.8 to i8*), i64 32, i1 false)
7891 // CHECK14-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 0
7892 // CHECK14-NEXT:    [[TMP86:%.*]] = bitcast i8** [[TMP85]] to i64*
7893 // CHECK14-NEXT:    store i64 [[TMP80]], i64* [[TMP86]], align 8
7894 // CHECK14-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 0
7895 // CHECK14-NEXT:    [[TMP88:%.*]] = bitcast i8** [[TMP87]] to i64*
7896 // CHECK14-NEXT:    store i64 [[TMP80]], i64* [[TMP88]], align 8
7897 // CHECK14-NEXT:    [[TMP89:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS24]], i64 0, i64 0
7898 // CHECK14-NEXT:    store i8* null, i8** [[TMP89]], align 8
7899 // CHECK14-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 1
7900 // CHECK14-NEXT:    [[TMP91:%.*]] = bitcast i8** [[TMP90]] to i64*
7901 // CHECK14-NEXT:    store i64 [[TMP82]], i64* [[TMP91]], align 8
7902 // CHECK14-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 1
7903 // CHECK14-NEXT:    [[TMP93:%.*]] = bitcast i8** [[TMP92]] to i64*
7904 // CHECK14-NEXT:    store i64 [[TMP82]], i64* [[TMP93]], align 8
7905 // CHECK14-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS24]], i64 0, i64 1
7906 // CHECK14-NEXT:    store i8* null, i8** [[TMP94]], align 8
7907 // CHECK14-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 2
7908 // CHECK14-NEXT:    [[TMP96:%.*]] = bitcast i8** [[TMP95]] to i64*
7909 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP96]], align 8
7910 // CHECK14-NEXT:    [[TMP97:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 2
7911 // CHECK14-NEXT:    [[TMP98:%.*]] = bitcast i8** [[TMP97]] to i64*
7912 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP98]], align 8
7913 // CHECK14-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS24]], i64 0, i64 2
7914 // CHECK14-NEXT:    store i8* null, i8** [[TMP99]], align 8
7915 // CHECK14-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 3
7916 // CHECK14-NEXT:    [[TMP101:%.*]] = bitcast i8** [[TMP100]] to i32**
7917 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP101]], align 8
7918 // CHECK14-NEXT:    [[TMP102:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 3
7919 // CHECK14-NEXT:    [[TMP103:%.*]] = bitcast i8** [[TMP102]] to i32**
7920 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP103]], align 8
7921 // CHECK14-NEXT:    [[TMP104:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES25]], i32 0, i32 3
7922 // CHECK14-NEXT:    store i64 [[TMP83]], i64* [[TMP104]], align 8
7923 // CHECK14-NEXT:    [[TMP105:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS24]], i64 0, i64 3
7924 // CHECK14-NEXT:    store i8* null, i8** [[TMP105]], align 8
7925 // CHECK14-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS22]], i32 0, i32 0
7926 // CHECK14-NEXT:    [[TMP107:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS23]], i32 0, i32 0
7927 // CHECK14-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES25]], i32 0, i32 0
7928 // CHECK14-NEXT:    [[TMP109:%.*]] = load i32, i32* [[N]], align 4
7929 // CHECK14-NEXT:    store i32 [[TMP109]], i32* [[DOTCAPTURE_EXPR_27]], align 4
7930 // CHECK14-NEXT:    [[TMP110:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_27]], align 4
7931 // CHECK14-NEXT:    [[SUB29:%.*]] = sub nsw i32 [[TMP110]], 0
7932 // CHECK14-NEXT:    [[DIV30:%.*]] = sdiv i32 [[SUB29]], 1
7933 // CHECK14-NEXT:    [[SUB31:%.*]] = sub nsw i32 [[DIV30]], 1
7934 // CHECK14-NEXT:    store i32 [[SUB31]], i32* [[DOTCAPTURE_EXPR_28]], align 4
7935 // CHECK14-NEXT:    [[TMP111:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_28]], align 4
7936 // CHECK14-NEXT:    [[ADD32:%.*]] = add nsw i32 [[TMP111]], 1
7937 // CHECK14-NEXT:    [[TMP112:%.*]] = zext i32 [[ADD32]] to i64
7938 // CHECK14-NEXT:    [[KERNEL_ARGS33:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
7939 // CHECK14-NEXT:    [[TMP113:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 0
7940 // CHECK14-NEXT:    store i32 1, i32* [[TMP113]], align 4
7941 // CHECK14-NEXT:    [[TMP114:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 1
7942 // CHECK14-NEXT:    store i32 4, i32* [[TMP114]], align 4
7943 // CHECK14-NEXT:    [[TMP115:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 2
7944 // CHECK14-NEXT:    store i8** [[TMP106]], i8*** [[TMP115]], align 8
7945 // CHECK14-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 3
7946 // CHECK14-NEXT:    store i8** [[TMP107]], i8*** [[TMP116]], align 8
7947 // CHECK14-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 4
7948 // CHECK14-NEXT:    store i64* [[TMP108]], i64** [[TMP117]], align 8
7949 // CHECK14-NEXT:    [[TMP118:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 5
7950 // CHECK14-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP118]], align 8
7951 // CHECK14-NEXT:    [[TMP119:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 6
7952 // CHECK14-NEXT:    store i8** null, i8*** [[TMP119]], align 8
7953 // CHECK14-NEXT:    [[TMP120:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 7
7954 // CHECK14-NEXT:    store i8** null, i8*** [[TMP120]], align 8
7955 // CHECK14-NEXT:    [[TMP121:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]], i32 0, i32 8
7956 // CHECK14-NEXT:    store i64 [[TMP112]], i64* [[TMP121]], align 8
7957 // CHECK14-NEXT:    [[TMP122:%.*]] = 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_l164.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS33]])
7958 // CHECK14-NEXT:    [[TMP123:%.*]] = icmp ne i32 [[TMP122]], 0
7959 // CHECK14-NEXT:    br i1 [[TMP123]], label [[OMP_OFFLOAD_FAILED34:%.*]], label [[OMP_OFFLOAD_CONT35:%.*]]
7960 // CHECK14:       omp_offload.failed34:
7961 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l164(i64 [[TMP80]], i64 [[TMP82]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
7962 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT35]]
7963 // CHECK14:       omp_offload.cont35:
7964 // CHECK14-NEXT:    [[TMP124:%.*]] = load i32, i32* [[N]], align 4
7965 // CHECK14-NEXT:    [[CONV37:%.*]] = bitcast i64* [[N_CASTED36]] to i32*
7966 // CHECK14-NEXT:    store i32 [[TMP124]], i32* [[CONV37]], align 4
7967 // CHECK14-NEXT:    [[TMP125:%.*]] = load i64, i64* [[N_CASTED36]], align 8
7968 // CHECK14-NEXT:    [[TMP126:%.*]] = mul nuw i64 [[TMP1]], 4
7969 // CHECK14-NEXT:    [[TMP127:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES41]] to i8*
7970 // CHECK14-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP127]], i8* align 8 bitcast ([3 x i64]* @.offload_sizes.12 to i8*), i64 24, i1 false)
7971 // CHECK14-NEXT:    [[TMP128:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS38]], i32 0, i32 0
7972 // CHECK14-NEXT:    [[TMP129:%.*]] = bitcast i8** [[TMP128]] to i64*
7973 // CHECK14-NEXT:    store i64 [[TMP125]], i64* [[TMP129]], align 8
7974 // CHECK14-NEXT:    [[TMP130:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS39]], i32 0, i32 0
7975 // CHECK14-NEXT:    [[TMP131:%.*]] = bitcast i8** [[TMP130]] to i64*
7976 // CHECK14-NEXT:    store i64 [[TMP125]], i64* [[TMP131]], align 8
7977 // CHECK14-NEXT:    [[TMP132:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS40]], i64 0, i64 0
7978 // CHECK14-NEXT:    store i8* null, i8** [[TMP132]], align 8
7979 // CHECK14-NEXT:    [[TMP133:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS38]], i32 0, i32 1
7980 // CHECK14-NEXT:    [[TMP134:%.*]] = bitcast i8** [[TMP133]] to i64*
7981 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP134]], align 8
7982 // CHECK14-NEXT:    [[TMP135:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS39]], i32 0, i32 1
7983 // CHECK14-NEXT:    [[TMP136:%.*]] = bitcast i8** [[TMP135]] to i64*
7984 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP136]], align 8
7985 // CHECK14-NEXT:    [[TMP137:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS40]], i64 0, i64 1
7986 // CHECK14-NEXT:    store i8* null, i8** [[TMP137]], align 8
7987 // CHECK14-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS38]], i32 0, i32 2
7988 // CHECK14-NEXT:    [[TMP139:%.*]] = bitcast i8** [[TMP138]] to i32**
7989 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP139]], align 8
7990 // CHECK14-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS39]], i32 0, i32 2
7991 // CHECK14-NEXT:    [[TMP141:%.*]] = bitcast i8** [[TMP140]] to i32**
7992 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP141]], align 8
7993 // CHECK14-NEXT:    [[TMP142:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES41]], i32 0, i32 2
7994 // CHECK14-NEXT:    store i64 [[TMP126]], i64* [[TMP142]], align 8
7995 // CHECK14-NEXT:    [[TMP143:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS40]], i64 0, i64 2
7996 // CHECK14-NEXT:    store i8* null, i8** [[TMP143]], align 8
7997 // CHECK14-NEXT:    [[TMP144:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS38]], i32 0, i32 0
7998 // CHECK14-NEXT:    [[TMP145:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS39]], i32 0, i32 0
7999 // CHECK14-NEXT:    [[TMP146:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES41]], i32 0, i32 0
8000 // CHECK14-NEXT:    [[TMP147:%.*]] = load i32, i32* [[N]], align 4
8001 // CHECK14-NEXT:    store i32 [[TMP147]], i32* [[DOTCAPTURE_EXPR_43]], align 4
8002 // CHECK14-NEXT:    [[TMP148:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_43]], align 4
8003 // CHECK14-NEXT:    [[SUB45:%.*]] = sub nsw i32 [[TMP148]], 0
8004 // CHECK14-NEXT:    [[DIV46:%.*]] = sdiv i32 [[SUB45]], 1
8005 // CHECK14-NEXT:    [[SUB47:%.*]] = sub nsw i32 [[DIV46]], 1
8006 // CHECK14-NEXT:    store i32 [[SUB47]], i32* [[DOTCAPTURE_EXPR_44]], align 4
8007 // CHECK14-NEXT:    [[TMP149:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_44]], align 4
8008 // CHECK14-NEXT:    [[ADD48:%.*]] = add nsw i32 [[TMP149]], 1
8009 // CHECK14-NEXT:    [[TMP150:%.*]] = zext i32 [[ADD48]] to i64
8010 // CHECK14-NEXT:    [[KERNEL_ARGS49:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
8011 // CHECK14-NEXT:    [[TMP151:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 0
8012 // CHECK14-NEXT:    store i32 1, i32* [[TMP151]], align 4
8013 // CHECK14-NEXT:    [[TMP152:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 1
8014 // CHECK14-NEXT:    store i32 3, i32* [[TMP152]], align 4
8015 // CHECK14-NEXT:    [[TMP153:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 2
8016 // CHECK14-NEXT:    store i8** [[TMP144]], i8*** [[TMP153]], align 8
8017 // CHECK14-NEXT:    [[TMP154:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 3
8018 // CHECK14-NEXT:    store i8** [[TMP145]], i8*** [[TMP154]], align 8
8019 // CHECK14-NEXT:    [[TMP155:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 4
8020 // CHECK14-NEXT:    store i64* [[TMP146]], i64** [[TMP155]], align 8
8021 // CHECK14-NEXT:    [[TMP156:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 5
8022 // CHECK14-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP156]], align 8
8023 // CHECK14-NEXT:    [[TMP157:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 6
8024 // CHECK14-NEXT:    store i8** null, i8*** [[TMP157]], align 8
8025 // CHECK14-NEXT:    [[TMP158:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 7
8026 // CHECK14-NEXT:    store i8** null, i8*** [[TMP158]], align 8
8027 // CHECK14-NEXT:    [[TMP159:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]], i32 0, i32 8
8028 // CHECK14-NEXT:    store i64 [[TMP150]], i64* [[TMP159]], align 8
8029 // CHECK14-NEXT:    [[TMP160:%.*]] = 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_l169.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS49]])
8030 // CHECK14-NEXT:    [[TMP161:%.*]] = icmp ne i32 [[TMP160]], 0
8031 // CHECK14-NEXT:    br i1 [[TMP161]], label [[OMP_OFFLOAD_FAILED50:%.*]], label [[OMP_OFFLOAD_CONT51:%.*]]
8032 // CHECK14:       omp_offload.failed50:
8033 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l169(i64 [[TMP125]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
8034 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT51]]
8035 // CHECK14:       omp_offload.cont51:
8036 // CHECK14-NEXT:    [[TMP162:%.*]] = load i32, i32* [[M]], align 4
8037 // CHECK14-NEXT:    [[CONV53:%.*]] = bitcast i64* [[M_CASTED52]] to i32*
8038 // CHECK14-NEXT:    store i32 [[TMP162]], i32* [[CONV53]], align 4
8039 // CHECK14-NEXT:    [[TMP163:%.*]] = load i64, i64* [[M_CASTED52]], align 8
8040 // CHECK14-NEXT:    [[TMP164:%.*]] = load i32, i32* [[N]], align 4
8041 // CHECK14-NEXT:    [[CONV55:%.*]] = bitcast i64* [[N_CASTED54]] to i32*
8042 // CHECK14-NEXT:    store i32 [[TMP164]], i32* [[CONV55]], align 4
8043 // CHECK14-NEXT:    [[TMP165:%.*]] = load i64, i64* [[N_CASTED54]], align 8
8044 // CHECK14-NEXT:    [[TMP166:%.*]] = mul nuw i64 [[TMP1]], 4
8045 // CHECK14-NEXT:    [[TMP167:%.*]] = bitcast [4 x i64]* [[DOTOFFLOAD_SIZES59]] to i8*
8046 // CHECK14-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP167]], i8* align 8 bitcast ([4 x i64]* @.offload_sizes.16 to i8*), i64 32, i1 false)
8047 // CHECK14-NEXT:    [[TMP168:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 0
8048 // CHECK14-NEXT:    [[TMP169:%.*]] = bitcast i8** [[TMP168]] to i64*
8049 // CHECK14-NEXT:    store i64 [[TMP163]], i64* [[TMP169]], align 8
8050 // CHECK14-NEXT:    [[TMP170:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 0
8051 // CHECK14-NEXT:    [[TMP171:%.*]] = bitcast i8** [[TMP170]] to i64*
8052 // CHECK14-NEXT:    store i64 [[TMP163]], i64* [[TMP171]], align 8
8053 // CHECK14-NEXT:    [[TMP172:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS58]], i64 0, i64 0
8054 // CHECK14-NEXT:    store i8* null, i8** [[TMP172]], align 8
8055 // CHECK14-NEXT:    [[TMP173:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 1
8056 // CHECK14-NEXT:    [[TMP174:%.*]] = bitcast i8** [[TMP173]] to i64*
8057 // CHECK14-NEXT:    store i64 [[TMP165]], i64* [[TMP174]], align 8
8058 // CHECK14-NEXT:    [[TMP175:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 1
8059 // CHECK14-NEXT:    [[TMP176:%.*]] = bitcast i8** [[TMP175]] to i64*
8060 // CHECK14-NEXT:    store i64 [[TMP165]], i64* [[TMP176]], align 8
8061 // CHECK14-NEXT:    [[TMP177:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS58]], i64 0, i64 1
8062 // CHECK14-NEXT:    store i8* null, i8** [[TMP177]], align 8
8063 // CHECK14-NEXT:    [[TMP178:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 2
8064 // CHECK14-NEXT:    [[TMP179:%.*]] = bitcast i8** [[TMP178]] to i64*
8065 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP179]], align 8
8066 // CHECK14-NEXT:    [[TMP180:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 2
8067 // CHECK14-NEXT:    [[TMP181:%.*]] = bitcast i8** [[TMP180]] to i64*
8068 // CHECK14-NEXT:    store i64 [[TMP1]], i64* [[TMP181]], align 8
8069 // CHECK14-NEXT:    [[TMP182:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS58]], i64 0, i64 2
8070 // CHECK14-NEXT:    store i8* null, i8** [[TMP182]], align 8
8071 // CHECK14-NEXT:    [[TMP183:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 3
8072 // CHECK14-NEXT:    [[TMP184:%.*]] = bitcast i8** [[TMP183]] to i32**
8073 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP184]], align 8
8074 // CHECK14-NEXT:    [[TMP185:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 3
8075 // CHECK14-NEXT:    [[TMP186:%.*]] = bitcast i8** [[TMP185]] to i32**
8076 // CHECK14-NEXT:    store i32* [[VLA]], i32** [[TMP186]], align 8
8077 // CHECK14-NEXT:    [[TMP187:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES59]], i32 0, i32 3
8078 // CHECK14-NEXT:    store i64 [[TMP166]], i64* [[TMP187]], align 8
8079 // CHECK14-NEXT:    [[TMP188:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS58]], i64 0, i64 3
8080 // CHECK14-NEXT:    store i8* null, i8** [[TMP188]], align 8
8081 // CHECK14-NEXT:    [[TMP189:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS56]], i32 0, i32 0
8082 // CHECK14-NEXT:    [[TMP190:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS57]], i32 0, i32 0
8083 // CHECK14-NEXT:    [[TMP191:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES59]], i32 0, i32 0
8084 // CHECK14-NEXT:    [[TMP192:%.*]] = load i32, i32* [[N]], align 4
8085 // CHECK14-NEXT:    store i32 [[TMP192]], i32* [[DOTCAPTURE_EXPR_61]], align 4
8086 // CHECK14-NEXT:    [[TMP193:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_61]], align 4
8087 // CHECK14-NEXT:    [[SUB63:%.*]] = sub nsw i32 [[TMP193]], 0
8088 // CHECK14-NEXT:    [[DIV64:%.*]] = sdiv i32 [[SUB63]], 1
8089 // CHECK14-NEXT:    [[SUB65:%.*]] = sub nsw i32 [[DIV64]], 1
8090 // CHECK14-NEXT:    store i32 [[SUB65]], i32* [[DOTCAPTURE_EXPR_62]], align 4
8091 // CHECK14-NEXT:    [[TMP194:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_62]], align 4
8092 // CHECK14-NEXT:    [[ADD66:%.*]] = add nsw i32 [[TMP194]], 1
8093 // CHECK14-NEXT:    [[TMP195:%.*]] = zext i32 [[ADD66]] to i64
8094 // CHECK14-NEXT:    [[KERNEL_ARGS67:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
8095 // CHECK14-NEXT:    [[TMP196:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 0
8096 // CHECK14-NEXT:    store i32 1, i32* [[TMP196]], align 4
8097 // CHECK14-NEXT:    [[TMP197:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 1
8098 // CHECK14-NEXT:    store i32 4, i32* [[TMP197]], align 4
8099 // CHECK14-NEXT:    [[TMP198:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 2
8100 // CHECK14-NEXT:    store i8** [[TMP189]], i8*** [[TMP198]], align 8
8101 // CHECK14-NEXT:    [[TMP199:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 3
8102 // CHECK14-NEXT:    store i8** [[TMP190]], i8*** [[TMP199]], align 8
8103 // CHECK14-NEXT:    [[TMP200:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 4
8104 // CHECK14-NEXT:    store i64* [[TMP191]], i64** [[TMP200]], align 8
8105 // CHECK14-NEXT:    [[TMP201:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 5
8106 // CHECK14-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP201]], align 8
8107 // CHECK14-NEXT:    [[TMP202:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 6
8108 // CHECK14-NEXT:    store i8** null, i8*** [[TMP202]], align 8
8109 // CHECK14-NEXT:    [[TMP203:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 7
8110 // CHECK14-NEXT:    store i8** null, i8*** [[TMP203]], align 8
8111 // CHECK14-NEXT:    [[TMP204:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]], i32 0, i32 8
8112 // CHECK14-NEXT:    store i64 [[TMP195]], i64* [[TMP204]], align 8
8113 // CHECK14-NEXT:    [[TMP205:%.*]] = 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_l174.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS67]])
8114 // CHECK14-NEXT:    [[TMP206:%.*]] = icmp ne i32 [[TMP205]], 0
8115 // CHECK14-NEXT:    br i1 [[TMP206]], label [[OMP_OFFLOAD_FAILED68:%.*]], label [[OMP_OFFLOAD_CONT69:%.*]]
8116 // CHECK14:       omp_offload.failed68:
8117 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l174(i64 [[TMP163]], i64 [[TMP165]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
8118 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT69]]
8119 // CHECK14:       omp_offload.cont69:
8120 // CHECK14-NEXT:    [[TMP207:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
8121 // CHECK14-NEXT:    [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiLi10EEiT_(i32 noundef signext [[TMP207]])
8122 // CHECK14-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
8123 // CHECK14-NEXT:    [[TMP208:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8
8124 // CHECK14-NEXT:    call void @llvm.stackrestore(i8* [[TMP208]])
8125 // CHECK14-NEXT:    [[TMP209:%.*]] = load i32, i32* [[RETVAL]], align 4
8126 // CHECK14-NEXT:    ret i32 [[TMP209]]
8127 //
8128 //
8129 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l154
8130 // CHECK14-SAME: (i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {
8131 // CHECK14-NEXT:  entry:
8132 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
8133 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8134 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8135 // CHECK14-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
8136 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8137 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8138 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
8139 // CHECK14-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8140 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8141 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[CONV]], i64 [[TMP0]], i32* [[TMP1]])
8142 // CHECK14-NEXT:    ret void
8143 //
8144 //
8145 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined.
8146 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
8147 // CHECK14-NEXT:  entry:
8148 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8149 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8150 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8151 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8152 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8153 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8154 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8155 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8156 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8157 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
8158 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8159 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8160 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8161 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8162 // CHECK14-NEXT:    [[I3:%.*]] = alloca i32, align 4
8163 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8164 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8165 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8166 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8167 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8168 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8169 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8170 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8171 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
8172 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
8173 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8174 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
8175 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8176 // CHECK14-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
8177 // CHECK14-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8178 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
8179 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8180 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
8181 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8182 // CHECK14:       omp.precond.then:
8183 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8184 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8185 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
8186 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8187 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8188 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8189 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
8190 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8191 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8192 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8193 // CHECK14-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
8194 // CHECK14-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8195 // CHECK14:       cond.true:
8196 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8197 // CHECK14-NEXT:    br label [[COND_END:%.*]]
8198 // CHECK14:       cond.false:
8199 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8200 // CHECK14-NEXT:    br label [[COND_END]]
8201 // CHECK14:       cond.end:
8202 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
8203 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8204 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8205 // CHECK14-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
8206 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8207 // CHECK14:       omp.inner.for.cond:
8208 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
8209 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !13
8210 // CHECK14-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
8211 // CHECK14-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8212 // CHECK14:       omp.inner.for.body:
8213 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !13
8214 // CHECK14-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
8215 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !13
8216 // CHECK14-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
8217 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i64, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i64 [[TMP17]], i64 [[TMP19]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !13
8218 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8219 // CHECK14:       omp.inner.for.inc:
8220 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
8221 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !13
8222 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
8223 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !13
8224 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP14:![0-9]+]]
8225 // CHECK14:       omp.inner.for.end:
8226 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8227 // CHECK14:       omp.loop.exit:
8228 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8229 // CHECK14-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
8230 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
8231 // CHECK14-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
8232 // CHECK14-NEXT:    [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
8233 // CHECK14-NEXT:    br i1 [[TMP25]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
8234 // CHECK14:       .omp.final.then:
8235 // CHECK14-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8236 // CHECK14-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP26]], 0
8237 // CHECK14-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
8238 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
8239 // CHECK14-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
8240 // CHECK14-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
8241 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
8242 // CHECK14:       .omp.final.done:
8243 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
8244 // CHECK14:       omp.precond.end:
8245 // CHECK14-NEXT:    ret void
8246 //
8247 //
8248 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..1
8249 // CHECK14-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
8250 // CHECK14-NEXT:  entry:
8251 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8252 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8253 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
8254 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
8255 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8256 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8257 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8258 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8259 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8260 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8261 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8262 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
8263 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
8264 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
8265 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8266 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8267 // CHECK14-NEXT:    [[I4:%.*]] = alloca i32, align 4
8268 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8269 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8270 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8271 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8272 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8273 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8274 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8275 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8276 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8277 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8278 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
8279 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
8280 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8281 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
8282 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8283 // CHECK14-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
8284 // CHECK14-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8285 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
8286 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8287 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
8288 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8289 // CHECK14:       omp.precond.then:
8290 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
8291 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8292 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
8293 // CHECK14-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8294 // CHECK14-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
8295 // CHECK14-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8296 // CHECK14-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
8297 // CHECK14-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
8298 // CHECK14-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
8299 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8300 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8301 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8302 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
8303 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8304 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8305 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8306 // CHECK14-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
8307 // CHECK14-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8308 // CHECK14:       cond.true:
8309 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8310 // CHECK14-NEXT:    br label [[COND_END:%.*]]
8311 // CHECK14:       cond.false:
8312 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8313 // CHECK14-NEXT:    br label [[COND_END]]
8314 // CHECK14:       cond.end:
8315 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
8316 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
8317 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8318 // CHECK14-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
8319 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8320 // CHECK14:       omp.inner.for.cond:
8321 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
8322 // CHECK14-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !17
8323 // CHECK14-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
8324 // CHECK14-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8325 // CHECK14:       omp.inner.for.body:
8326 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
8327 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
8328 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8329 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !17
8330 // CHECK14-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !17
8331 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
8332 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
8333 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !17
8334 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
8335 // CHECK14:       omp.body.continue:
8336 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8337 // CHECK14:       omp.inner.for.inc:
8338 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
8339 // CHECK14-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
8340 // CHECK14-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !17
8341 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP18:![0-9]+]]
8342 // CHECK14:       omp.inner.for.end:
8343 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8344 // CHECK14:       omp.loop.exit:
8345 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8346 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
8347 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
8348 // CHECK14-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
8349 // CHECK14-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
8350 // CHECK14-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
8351 // CHECK14:       .omp.final.then:
8352 // CHECK14-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8353 // CHECK14-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP25]], 0
8354 // CHECK14-NEXT:    [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1
8355 // CHECK14-NEXT:    [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 1
8356 // CHECK14-NEXT:    [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]
8357 // CHECK14-NEXT:    store i32 [[ADD11]], i32* [[I4]], align 4
8358 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
8359 // CHECK14:       .omp.final.done:
8360 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
8361 // CHECK14:       omp.precond.end:
8362 // CHECK14-NEXT:    ret void
8363 //
8364 //
8365 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l159
8366 // CHECK14-SAME: (i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
8367 // CHECK14-NEXT:  entry:
8368 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
8369 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8370 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8371 // CHECK14-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
8372 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8373 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8374 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
8375 // CHECK14-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8376 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8377 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* [[CONV]], i64 [[TMP0]], i32* [[TMP1]])
8378 // CHECK14-NEXT:    ret void
8379 //
8380 //
8381 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..2
8382 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
8383 // CHECK14-NEXT:  entry:
8384 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8385 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8386 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8387 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8388 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8389 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8390 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8391 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8392 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8393 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
8394 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8395 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8396 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8397 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8398 // CHECK14-NEXT:    [[I3:%.*]] = alloca i32, align 4
8399 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8400 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8401 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8402 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8403 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8404 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8405 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8406 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8407 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
8408 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
8409 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8410 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
8411 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8412 // CHECK14-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
8413 // CHECK14-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8414 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
8415 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8416 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
8417 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8418 // CHECK14:       omp.precond.then:
8419 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8420 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8421 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
8422 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8423 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8424 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8425 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
8426 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8427 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8428 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8429 // CHECK14-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
8430 // CHECK14-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8431 // CHECK14:       cond.true:
8432 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8433 // CHECK14-NEXT:    br label [[COND_END:%.*]]
8434 // CHECK14:       cond.false:
8435 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8436 // CHECK14-NEXT:    br label [[COND_END]]
8437 // CHECK14:       cond.end:
8438 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
8439 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8440 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8441 // CHECK14-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
8442 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8443 // CHECK14:       omp.inner.for.cond:
8444 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
8445 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !22
8446 // CHECK14-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
8447 // CHECK14-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8448 // CHECK14:       omp.inner.for.body:
8449 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !22
8450 // CHECK14-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
8451 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !22
8452 // CHECK14-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
8453 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i64, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i64 [[TMP17]], i64 [[TMP19]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !22
8454 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8455 // CHECK14:       omp.inner.for.inc:
8456 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
8457 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !22
8458 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
8459 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !22
8460 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP23:![0-9]+]]
8461 // CHECK14:       omp.inner.for.end:
8462 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8463 // CHECK14:       omp.loop.exit:
8464 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8465 // CHECK14-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
8466 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
8467 // CHECK14-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
8468 // CHECK14-NEXT:    [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
8469 // CHECK14-NEXT:    br i1 [[TMP25]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
8470 // CHECK14:       .omp.final.then:
8471 // CHECK14-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8472 // CHECK14-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP26]], 0
8473 // CHECK14-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
8474 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
8475 // CHECK14-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
8476 // CHECK14-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
8477 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
8478 // CHECK14:       .omp.final.done:
8479 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
8480 // CHECK14:       omp.precond.end:
8481 // CHECK14-NEXT:    ret void
8482 //
8483 //
8484 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..3
8485 // CHECK14-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
8486 // CHECK14-NEXT:  entry:
8487 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8488 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8489 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
8490 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
8491 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8492 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8493 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8494 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8495 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8496 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8497 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8498 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
8499 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
8500 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
8501 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8502 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8503 // CHECK14-NEXT:    [[I4:%.*]] = alloca i32, align 4
8504 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8505 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8506 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8507 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8508 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8509 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8510 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8511 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8512 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8513 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8514 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
8515 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
8516 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8517 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
8518 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8519 // CHECK14-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
8520 // CHECK14-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8521 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
8522 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8523 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
8524 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8525 // CHECK14:       omp.precond.then:
8526 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
8527 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8528 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
8529 // CHECK14-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8530 // CHECK14-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
8531 // CHECK14-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8532 // CHECK14-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
8533 // CHECK14-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
8534 // CHECK14-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
8535 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8536 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8537 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8538 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
8539 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8540 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8541 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8542 // CHECK14-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
8543 // CHECK14-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8544 // CHECK14:       cond.true:
8545 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8546 // CHECK14-NEXT:    br label [[COND_END:%.*]]
8547 // CHECK14:       cond.false:
8548 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8549 // CHECK14-NEXT:    br label [[COND_END]]
8550 // CHECK14:       cond.end:
8551 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
8552 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
8553 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8554 // CHECK14-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
8555 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8556 // CHECK14:       omp.inner.for.cond:
8557 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
8558 // CHECK14-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !25
8559 // CHECK14-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
8560 // CHECK14-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8561 // CHECK14:       omp.inner.for.body:
8562 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
8563 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
8564 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8565 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !25
8566 // CHECK14-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !25
8567 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
8568 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
8569 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !25
8570 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
8571 // CHECK14:       omp.body.continue:
8572 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8573 // CHECK14:       omp.inner.for.inc:
8574 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
8575 // CHECK14-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
8576 // CHECK14-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !25
8577 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP26:![0-9]+]]
8578 // CHECK14:       omp.inner.for.end:
8579 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8580 // CHECK14:       omp.loop.exit:
8581 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8582 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
8583 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
8584 // CHECK14-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
8585 // CHECK14-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
8586 // CHECK14-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
8587 // CHECK14:       .omp.final.then:
8588 // CHECK14-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8589 // CHECK14-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP25]], 0
8590 // CHECK14-NEXT:    [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1
8591 // CHECK14-NEXT:    [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 1
8592 // CHECK14-NEXT:    [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]
8593 // CHECK14-NEXT:    store i32 [[ADD11]], i32* [[I4]], align 4
8594 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
8595 // CHECK14:       .omp.final.done:
8596 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
8597 // CHECK14:       omp.precond.end:
8598 // CHECK14-NEXT:    ret void
8599 //
8600 //
8601 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l164
8602 // CHECK14-SAME: (i64 noundef [[M:%.*]], i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
8603 // CHECK14-NEXT:  entry:
8604 // CHECK14-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
8605 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
8606 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8607 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8608 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8609 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
8610 // CHECK14-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
8611 // CHECK14-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
8612 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8613 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8614 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
8615 // CHECK14-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
8616 // CHECK14-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8617 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8618 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[CONV]], align 4
8619 // CHECK14-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
8620 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8621 // CHECK14-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
8622 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[CONV2]], align 4
8623 // CHECK14-NEXT:    [[TMP4:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
8624 // CHECK14-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*, i64, i32*, i64)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* [[CONV1]], i64 [[TMP0]], i32* [[TMP1]], i64 [[TMP4]])
8625 // CHECK14-NEXT:    ret void
8626 //
8627 //
8628 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..6
8629 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
8630 // CHECK14-NEXT:  entry:
8631 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8632 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8633 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8634 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8635 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8636 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
8637 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8638 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8639 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8640 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
8641 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
8642 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8643 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8644 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8645 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8646 // CHECK14-NEXT:    [[I4:%.*]] = alloca i32, align 4
8647 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
8648 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8649 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8650 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8651 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8652 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8653 // CHECK14-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
8654 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8655 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8656 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8657 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
8658 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
8659 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8660 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8661 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
8662 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8663 // CHECK14-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
8664 // CHECK14-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
8665 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
8666 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8667 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
8668 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8669 // CHECK14:       omp.precond.then:
8670 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8671 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8672 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
8673 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8674 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8675 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[CONV]], align 4
8676 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8677 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
8678 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP7]])
8679 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8680 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8681 // CHECK14-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
8682 // CHECK14-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8683 // CHECK14:       cond.true:
8684 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8685 // CHECK14-NEXT:    br label [[COND_END:%.*]]
8686 // CHECK14:       cond.false:
8687 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8688 // CHECK14-NEXT:    br label [[COND_END]]
8689 // CHECK14:       cond.end:
8690 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
8691 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8692 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8693 // CHECK14-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
8694 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8695 // CHECK14:       omp.inner.for.cond:
8696 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
8697 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !28
8698 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
8699 // CHECK14-NEXT:    [[CMP6:%.*]] = icmp slt i32 [[TMP15]], [[ADD]]
8700 // CHECK14-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8701 // CHECK14:       omp.inner.for.body:
8702 // CHECK14-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !28
8703 // CHECK14-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
8704 // CHECK14-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
8705 // CHECK14-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
8706 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32, i32* [[CONV]], align 4, !llvm.access.group !28
8707 // CHECK14-NEXT:    [[CONV7:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
8708 // CHECK14-NEXT:    store i32 [[TMP21]], i32* [[CONV7]], align 4, !llvm.access.group !28
8709 // CHECK14-NEXT:    [[TMP22:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8, !llvm.access.group !28
8710 // CHECK14-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*, i64, i32*, i64)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]], i64 [[TMP22]]), !llvm.access.group !28
8711 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8712 // CHECK14:       omp.inner.for.inc:
8713 // CHECK14-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
8714 // CHECK14-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !28
8715 // CHECK14-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
8716 // CHECK14-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
8717 // CHECK14-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !28
8718 // CHECK14-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !28
8719 // CHECK14-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
8720 // CHECK14-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !28
8721 // CHECK14-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
8722 // CHECK14-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !28
8723 // CHECK14-NEXT:    [[ADD10:%.*]] = add nsw i32 [[TMP27]], [[TMP28]]
8724 // CHECK14-NEXT:    store i32 [[ADD10]], i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
8725 // CHECK14-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
8726 // CHECK14-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !28
8727 // CHECK14-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[TMP29]], [[TMP30]]
8728 // CHECK14-NEXT:    br i1 [[CMP11]], label [[COND_TRUE12:%.*]], label [[COND_FALSE13:%.*]]
8729 // CHECK14:       cond.true12:
8730 // CHECK14-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !28
8731 // CHECK14-NEXT:    br label [[COND_END14:%.*]]
8732 // CHECK14:       cond.false13:
8733 // CHECK14-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
8734 // CHECK14-NEXT:    br label [[COND_END14]]
8735 // CHECK14:       cond.end14:
8736 // CHECK14-NEXT:    [[COND15:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE12]] ], [ [[TMP32]], [[COND_FALSE13]] ]
8737 // CHECK14-NEXT:    store i32 [[COND15]], i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !28
8738 // CHECK14-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !28
8739 // CHECK14-NEXT:    store i32 [[TMP33]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !28
8740 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP29:![0-9]+]]
8741 // CHECK14:       omp.inner.for.end:
8742 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8743 // CHECK14:       omp.loop.exit:
8744 // CHECK14-NEXT:    [[TMP34:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8745 // CHECK14-NEXT:    [[TMP35:%.*]] = load i32, i32* [[TMP34]], align 4
8746 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP35]])
8747 // CHECK14-NEXT:    [[TMP36:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
8748 // CHECK14-NEXT:    [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 0
8749 // CHECK14-NEXT:    br i1 [[TMP37]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
8750 // CHECK14:       .omp.final.then:
8751 // CHECK14-NEXT:    [[TMP38:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8752 // CHECK14-NEXT:    [[SUB16:%.*]] = sub nsw i32 [[TMP38]], 0
8753 // CHECK14-NEXT:    [[DIV17:%.*]] = sdiv i32 [[SUB16]], 1
8754 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV17]], 1
8755 // CHECK14-NEXT:    [[ADD18:%.*]] = add nsw i32 0, [[MUL]]
8756 // CHECK14-NEXT:    store i32 [[ADD18]], i32* [[I4]], align 4
8757 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
8758 // CHECK14:       .omp.final.done:
8759 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
8760 // CHECK14:       omp.precond.end:
8761 // CHECK14-NEXT:    ret void
8762 //
8763 //
8764 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..7
8765 // CHECK14-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
8766 // CHECK14-NEXT:  entry:
8767 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8768 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8769 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
8770 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
8771 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8772 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8773 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8774 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
8775 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8776 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8777 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8778 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
8779 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
8780 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
8781 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
8782 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8783 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8784 // CHECK14-NEXT:    [[I6:%.*]] = alloca i32, align 4
8785 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8786 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8787 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8788 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8789 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8790 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8791 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8792 // CHECK14-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
8793 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8794 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8795 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8796 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
8797 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
8798 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8799 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8800 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
8801 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8802 // CHECK14-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
8803 // CHECK14-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
8804 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
8805 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8806 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
8807 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8808 // CHECK14:       omp.precond.then:
8809 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
8810 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8811 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
8812 // CHECK14-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
8813 // CHECK14-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP7]] to i32
8814 // CHECK14-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
8815 // CHECK14-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP8]] to i32
8816 // CHECK14-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
8817 // CHECK14-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
8818 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8819 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8820 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8821 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
8822 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8823 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8824 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8825 // CHECK14-NEXT:    [[CMP7:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
8826 // CHECK14-NEXT:    br i1 [[CMP7]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8827 // CHECK14:       cond.true:
8828 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
8829 // CHECK14-NEXT:    br label [[COND_END:%.*]]
8830 // CHECK14:       cond.false:
8831 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8832 // CHECK14-NEXT:    br label [[COND_END]]
8833 // CHECK14:       cond.end:
8834 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
8835 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
8836 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8837 // CHECK14-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
8838 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8839 // CHECK14:       omp.inner.for.cond:
8840 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !31
8841 // CHECK14-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !31
8842 // CHECK14-NEXT:    [[CMP8:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
8843 // CHECK14-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8844 // CHECK14:       omp.inner.for.body:
8845 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !31
8846 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
8847 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8848 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4, !llvm.access.group !31
8849 // CHECK14-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !31
8850 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
8851 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
8852 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !31
8853 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
8854 // CHECK14:       omp.body.continue:
8855 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8856 // CHECK14:       omp.inner.for.inc:
8857 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !31
8858 // CHECK14-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP20]], 1
8859 // CHECK14-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !31
8860 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP32:![0-9]+]]
8861 // CHECK14:       omp.inner.for.end:
8862 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8863 // CHECK14:       omp.loop.exit:
8864 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8865 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
8866 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
8867 // CHECK14-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
8868 // CHECK14-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
8869 // CHECK14-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
8870 // CHECK14:       .omp.final.then:
8871 // CHECK14-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8872 // CHECK14-NEXT:    [[SUB10:%.*]] = sub nsw i32 [[TMP25]], 0
8873 // CHECK14-NEXT:    [[DIV11:%.*]] = sdiv i32 [[SUB10]], 1
8874 // CHECK14-NEXT:    [[MUL12:%.*]] = mul nsw i32 [[DIV11]], 1
8875 // CHECK14-NEXT:    [[ADD13:%.*]] = add nsw i32 0, [[MUL12]]
8876 // CHECK14-NEXT:    store i32 [[ADD13]], i32* [[I6]], align 4
8877 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
8878 // CHECK14:       .omp.final.done:
8879 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
8880 // CHECK14:       omp.precond.end:
8881 // CHECK14-NEXT:    ret void
8882 //
8883 //
8884 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l169
8885 // CHECK14-SAME: (i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
8886 // CHECK14-NEXT:  entry:
8887 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
8888 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8889 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8890 // CHECK14-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
8891 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8892 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8893 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
8894 // CHECK14-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8895 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8896 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), i32* [[CONV]], i64 [[TMP0]], i32* [[TMP1]])
8897 // CHECK14-NEXT:    ret void
8898 //
8899 //
8900 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..10
8901 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
8902 // CHECK14-NEXT:  entry:
8903 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
8904 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
8905 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
8906 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
8907 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
8908 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8909 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8910 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8911 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
8912 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
8913 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8914 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8915 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8916 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8917 // CHECK14-NEXT:    [[I3:%.*]] = alloca i32, align 4
8918 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
8919 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
8920 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
8921 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
8922 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
8923 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
8924 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
8925 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
8926 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
8927 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
8928 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8929 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
8930 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
8931 // CHECK14-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
8932 // CHECK14-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
8933 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
8934 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8935 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
8936 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
8937 // CHECK14:       omp.precond.then:
8938 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8939 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8940 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
8941 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8942 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8943 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8944 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
8945 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
8946 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8947 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8948 // CHECK14-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
8949 // CHECK14-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8950 // CHECK14:       cond.true:
8951 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
8952 // CHECK14-NEXT:    br label [[COND_END:%.*]]
8953 // CHECK14:       cond.false:
8954 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8955 // CHECK14-NEXT:    br label [[COND_END]]
8956 // CHECK14:       cond.end:
8957 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
8958 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8959 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8960 // CHECK14-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
8961 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8962 // CHECK14:       omp.inner.for.cond:
8963 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !34
8964 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !34
8965 // CHECK14-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
8966 // CHECK14-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8967 // CHECK14:       omp.inner.for.body:
8968 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !34
8969 // CHECK14-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
8970 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !34
8971 // CHECK14-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
8972 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i64, i32*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i64 [[TMP17]], i64 [[TMP19]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !34
8973 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8974 // CHECK14:       omp.inner.for.inc:
8975 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !34
8976 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !34
8977 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
8978 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !34
8979 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP35:![0-9]+]]
8980 // CHECK14:       omp.inner.for.end:
8981 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8982 // CHECK14:       omp.loop.exit:
8983 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
8984 // CHECK14-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
8985 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
8986 // CHECK14-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
8987 // CHECK14-NEXT:    [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
8988 // CHECK14-NEXT:    br i1 [[TMP25]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
8989 // CHECK14:       .omp.final.then:
8990 // CHECK14-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8991 // CHECK14-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP26]], 0
8992 // CHECK14-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
8993 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
8994 // CHECK14-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
8995 // CHECK14-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
8996 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
8997 // CHECK14:       .omp.final.done:
8998 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
8999 // CHECK14:       omp.precond.end:
9000 // CHECK14-NEXT:    ret void
9001 //
9002 //
9003 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..11
9004 // CHECK14-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
9005 // CHECK14-NEXT:  entry:
9006 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
9007 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
9008 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
9009 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
9010 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
9011 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
9012 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
9013 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9014 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9015 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
9016 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
9017 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
9018 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
9019 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
9020 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9021 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9022 // CHECK14-NEXT:    [[I4:%.*]] = alloca i32, align 4
9023 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
9024 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
9025 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
9026 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
9027 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
9028 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
9029 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
9030 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
9031 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
9032 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
9033 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
9034 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
9035 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9036 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
9037 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
9038 // CHECK14-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
9039 // CHECK14-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
9040 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
9041 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9042 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
9043 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
9044 // CHECK14:       omp.precond.then:
9045 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
9046 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9047 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
9048 // CHECK14-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
9049 // CHECK14-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
9050 // CHECK14-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
9051 // CHECK14-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
9052 // CHECK14-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
9053 // CHECK14-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
9054 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9055 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9056 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
9057 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9058 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9059 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
9060 // CHECK14-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP12]], i32 1073741859, i32 [[TMP9]], i32 [[TMP10]], i32 1, i32 1)
9061 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
9062 // CHECK14:       omp.dispatch.cond:
9063 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9064 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
9065 // CHECK14-NEXT:    [[TMP15:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
9066 // CHECK14-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP15]], 0
9067 // CHECK14-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
9068 // CHECK14:       omp.dispatch.body:
9069 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
9070 // CHECK14-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
9071 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9072 // CHECK14:       omp.inner.for.cond:
9073 // CHECK14-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !37
9074 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !37
9075 // CHECK14-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
9076 // CHECK14-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9077 // CHECK14:       omp.inner.for.body:
9078 // CHECK14-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !37
9079 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
9080 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
9081 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !37
9082 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !37
9083 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP20]] to i64
9084 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
9085 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !37
9086 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
9087 // CHECK14:       omp.body.continue:
9088 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9089 // CHECK14:       omp.inner.for.inc:
9090 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !37
9091 // CHECK14-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP21]], 1
9092 // CHECK14-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !37
9093 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP38:![0-9]+]]
9094 // CHECK14:       omp.inner.for.end:
9095 // CHECK14-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
9096 // CHECK14:       omp.dispatch.inc:
9097 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND]]
9098 // CHECK14:       omp.dispatch.end:
9099 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
9100 // CHECK14-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
9101 // CHECK14-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
9102 // CHECK14:       .omp.final.then:
9103 // CHECK14-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9104 // CHECK14-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP24]], 0
9105 // CHECK14-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
9106 // CHECK14-NEXT:    [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 1
9107 // CHECK14-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]
9108 // CHECK14-NEXT:    store i32 [[ADD10]], i32* [[I4]], align 4
9109 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
9110 // CHECK14:       .omp.final.done:
9111 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
9112 // CHECK14:       omp.precond.end:
9113 // CHECK14-NEXT:    ret void
9114 //
9115 //
9116 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l174
9117 // CHECK14-SAME: (i64 noundef [[M:%.*]], i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
9118 // CHECK14-NEXT:  entry:
9119 // CHECK14-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
9120 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
9121 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
9122 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
9123 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
9124 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
9125 // CHECK14-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
9126 // CHECK14-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
9127 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
9128 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
9129 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
9130 // CHECK14-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
9131 // CHECK14-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
9132 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
9133 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[CONV]], align 4
9134 // CHECK14-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
9135 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9136 // CHECK14-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
9137 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[CONV2]], align 4
9138 // CHECK14-NEXT:    [[TMP4:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
9139 // CHECK14-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*, i64, i32*, i64)* @.omp_outlined..14 to void (i32*, i32*, ...)*), i32* [[CONV1]], i64 [[TMP0]], i32* [[TMP1]], i64 [[TMP4]])
9140 // CHECK14-NEXT:    ret void
9141 //
9142 //
9143 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..14
9144 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
9145 // CHECK14-NEXT:  entry:
9146 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
9147 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
9148 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
9149 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
9150 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
9151 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
9152 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9153 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9154 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
9155 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
9156 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
9157 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
9158 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
9159 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9160 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9161 // CHECK14-NEXT:    [[I4:%.*]] = alloca i32, align 4
9162 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
9163 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
9164 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
9165 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
9166 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
9167 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
9168 // CHECK14-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
9169 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
9170 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
9171 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
9172 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
9173 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
9174 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
9175 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9176 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
9177 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
9178 // CHECK14-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
9179 // CHECK14-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
9180 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
9181 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9182 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
9183 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
9184 // CHECK14:       omp.precond.then:
9185 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
9186 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
9187 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
9188 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9189 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9190 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9191 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
9192 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9193 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9194 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
9195 // CHECK14-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
9196 // CHECK14-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9197 // CHECK14:       cond.true:
9198 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
9199 // CHECK14-NEXT:    br label [[COND_END:%.*]]
9200 // CHECK14:       cond.false:
9201 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9202 // CHECK14-NEXT:    br label [[COND_END]]
9203 // CHECK14:       cond.end:
9204 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
9205 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
9206 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
9207 // CHECK14-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
9208 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9209 // CHECK14:       omp.inner.for.cond:
9210 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !40
9211 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !40
9212 // CHECK14-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
9213 // CHECK14-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9214 // CHECK14:       omp.inner.for.body:
9215 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !40
9216 // CHECK14-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
9217 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !40
9218 // CHECK14-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
9219 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[CONV]], align 4, !llvm.access.group !40
9220 // CHECK14-NEXT:    [[CONV7:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
9221 // CHECK14-NEXT:    store i32 [[TMP20]], i32* [[CONV7]], align 4, !llvm.access.group !40
9222 // CHECK14-NEXT:    [[TMP21:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8, !llvm.access.group !40
9223 // CHECK14-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*, i64, i32*, i64)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i64 [[TMP17]], i64 [[TMP19]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]], i64 [[TMP21]]), !llvm.access.group !40
9224 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9225 // CHECK14:       omp.inner.for.inc:
9226 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !40
9227 // CHECK14-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !40
9228 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP22]], [[TMP23]]
9229 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !40
9230 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP41:![0-9]+]]
9231 // CHECK14:       omp.inner.for.end:
9232 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
9233 // CHECK14:       omp.loop.exit:
9234 // CHECK14-NEXT:    [[TMP24:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9235 // CHECK14-NEXT:    [[TMP25:%.*]] = load i32, i32* [[TMP24]], align 4
9236 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP25]])
9237 // CHECK14-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
9238 // CHECK14-NEXT:    [[TMP27:%.*]] = icmp ne i32 [[TMP26]], 0
9239 // CHECK14-NEXT:    br i1 [[TMP27]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
9240 // CHECK14:       .omp.final.then:
9241 // CHECK14-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9242 // CHECK14-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP28]], 0
9243 // CHECK14-NEXT:    [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1
9244 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV9]], 1
9245 // CHECK14-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL]]
9246 // CHECK14-NEXT:    store i32 [[ADD10]], i32* [[I4]], align 4
9247 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
9248 // CHECK14:       .omp.final.done:
9249 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
9250 // CHECK14:       omp.precond.end:
9251 // CHECK14-NEXT:    ret void
9252 //
9253 //
9254 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..15
9255 // CHECK14-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:%.*]], i64 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
9256 // CHECK14-NEXT:  entry:
9257 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
9258 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
9259 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
9260 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
9261 // CHECK14-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
9262 // CHECK14-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
9263 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
9264 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
9265 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9266 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9267 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
9268 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
9269 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
9270 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
9271 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
9272 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9273 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9274 // CHECK14-NEXT:    [[I6:%.*]] = alloca i32, align 4
9275 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
9276 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
9277 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
9278 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
9279 // CHECK14-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
9280 // CHECK14-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
9281 // CHECK14-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
9282 // CHECK14-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
9283 // CHECK14-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
9284 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
9285 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
9286 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
9287 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
9288 // CHECK14-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
9289 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9290 // CHECK14-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
9291 // CHECK14-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
9292 // CHECK14-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
9293 // CHECK14-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
9294 // CHECK14-NEXT:    store i32 0, i32* [[I]], align 4
9295 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9296 // CHECK14-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
9297 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
9298 // CHECK14:       omp.precond.then:
9299 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
9300 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
9301 // CHECK14-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
9302 // CHECK14-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
9303 // CHECK14-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP7]] to i32
9304 // CHECK14-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
9305 // CHECK14-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP8]] to i32
9306 // CHECK14-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
9307 // CHECK14-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
9308 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9309 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9310 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[CONV]], align 4
9311 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
9312 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9313 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9314 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
9315 // CHECK14-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 1073741859, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 [[TMP9]])
9316 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
9317 // CHECK14:       omp.dispatch.cond:
9318 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9319 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
9320 // CHECK14-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]])
9321 // CHECK14-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
9322 // CHECK14-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
9323 // CHECK14:       omp.dispatch.body:
9324 // CHECK14-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
9325 // CHECK14-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
9326 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9327 // CHECK14:       omp.inner.for.cond:
9328 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !43
9329 // CHECK14-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !43
9330 // CHECK14-NEXT:    [[CMP7:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
9331 // CHECK14-NEXT:    br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9332 // CHECK14:       omp.inner.for.body:
9333 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !43
9334 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
9335 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
9336 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4, !llvm.access.group !43
9337 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !43
9338 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i64
9339 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
9340 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !43
9341 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
9342 // CHECK14:       omp.body.continue:
9343 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9344 // CHECK14:       omp.inner.for.inc:
9345 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !43
9346 // CHECK14-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP22]], 1
9347 // CHECK14-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !43
9348 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP44:![0-9]+]]
9349 // CHECK14:       omp.inner.for.end:
9350 // CHECK14-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
9351 // CHECK14:       omp.dispatch.inc:
9352 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND]]
9353 // CHECK14:       omp.dispatch.end:
9354 // CHECK14-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
9355 // CHECK14-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
9356 // CHECK14-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
9357 // CHECK14:       .omp.final.then:
9358 // CHECK14-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
9359 // CHECK14-NEXT:    [[SUB9:%.*]] = sub nsw i32 [[TMP25]], 0
9360 // CHECK14-NEXT:    [[DIV10:%.*]] = sdiv i32 [[SUB9]], 1
9361 // CHECK14-NEXT:    [[MUL11:%.*]] = mul nsw i32 [[DIV10]], 1
9362 // CHECK14-NEXT:    [[ADD12:%.*]] = add nsw i32 0, [[MUL11]]
9363 // CHECK14-NEXT:    store i32 [[ADD12]], i32* [[I6]], align 4
9364 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
9365 // CHECK14:       .omp.final.done:
9366 // CHECK14-NEXT:    br label [[OMP_PRECOND_END]]
9367 // CHECK14:       omp.precond.end:
9368 // CHECK14-NEXT:    ret void
9369 //
9370 //
9371 // CHECK14-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
9372 // CHECK14-SAME: (i32 noundef signext [[ARGC:%.*]]) #[[ATTR5:[0-9]+]] comdat {
9373 // CHECK14-NEXT:  entry:
9374 // CHECK14-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
9375 // CHECK14-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
9376 // CHECK14-NEXT:    [[M:%.*]] = alloca i32, align 4
9377 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8
9378 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8
9379 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8
9380 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9381 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 8
9382 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 8
9383 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 8
9384 // CHECK14-NEXT:    [[_TMP4:%.*]] = alloca i32, align 4
9385 // CHECK14-NEXT:    [[M_CASTED:%.*]] = alloca i64, align 8
9386 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS8:%.*]] = alloca [2 x i8*], align 8
9387 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS9:%.*]] = alloca [2 x i8*], align 8
9388 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS10:%.*]] = alloca [2 x i8*], align 8
9389 // CHECK14-NEXT:    [[_TMP11:%.*]] = alloca i32, align 4
9390 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS15:%.*]] = alloca [1 x i8*], align 8
9391 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS16:%.*]] = alloca [1 x i8*], align 8
9392 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS17:%.*]] = alloca [1 x i8*], align 8
9393 // CHECK14-NEXT:    [[_TMP18:%.*]] = alloca i32, align 4
9394 // CHECK14-NEXT:    [[M_CASTED22:%.*]] = alloca i64, align 8
9395 // CHECK14-NEXT:    [[DOTOFFLOAD_BASEPTRS24:%.*]] = alloca [2 x i8*], align 8
9396 // CHECK14-NEXT:    [[DOTOFFLOAD_PTRS25:%.*]] = alloca [2 x i8*], align 8
9397 // CHECK14-NEXT:    [[DOTOFFLOAD_MAPPERS26:%.*]] = alloca [2 x i8*], align 8
9398 // CHECK14-NEXT:    [[_TMP27:%.*]] = alloca i32, align 4
9399 // CHECK14-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
9400 // CHECK14-NEXT:    store i32 10, i32* [[M]], align 4
9401 // CHECK14-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
9402 // CHECK14-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [10 x i32]**
9403 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP1]], align 8
9404 // CHECK14-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
9405 // CHECK14-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [10 x i32]**
9406 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP3]], align 8
9407 // CHECK14-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
9408 // CHECK14-NEXT:    store i8* null, i8** [[TMP4]], align 8
9409 // CHECK14-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
9410 // CHECK14-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
9411 // CHECK14-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
9412 // CHECK14-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
9413 // CHECK14-NEXT:    store i32 1, i32* [[TMP7]], align 4
9414 // CHECK14-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
9415 // CHECK14-NEXT:    store i32 1, i32* [[TMP8]], align 4
9416 // CHECK14-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
9417 // CHECK14-NEXT:    store i8** [[TMP5]], i8*** [[TMP9]], align 8
9418 // CHECK14-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
9419 // CHECK14-NEXT:    store i8** [[TMP6]], i8*** [[TMP10]], align 8
9420 // CHECK14-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
9421 // CHECK14-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.20, i32 0, i32 0), i64** [[TMP11]], align 8
9422 // CHECK14-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
9423 // CHECK14-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.21, i32 0, i32 0), i64** [[TMP12]], align 8
9424 // CHECK14-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
9425 // CHECK14-NEXT:    store i8** null, i8*** [[TMP13]], align 8
9426 // CHECK14-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
9427 // CHECK14-NEXT:    store i8** null, i8*** [[TMP14]], align 8
9428 // CHECK14-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
9429 // CHECK14-NEXT:    store i64 10, i64* [[TMP15]], align 8
9430 // CHECK14-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
9431 // CHECK14-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
9432 // CHECK14-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
9433 // CHECK14:       omp_offload.failed:
9434 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122([10 x i32]* [[A]]) #[[ATTR3]]
9435 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT]]
9436 // CHECK14:       omp_offload.cont:
9437 // CHECK14-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
9438 // CHECK14-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to [10 x i32]**
9439 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP19]], align 8
9440 // CHECK14-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
9441 // CHECK14-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [10 x i32]**
9442 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP21]], align 8
9443 // CHECK14-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i64 0, i64 0
9444 // CHECK14-NEXT:    store i8* null, i8** [[TMP22]], align 8
9445 // CHECK14-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
9446 // CHECK14-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
9447 // CHECK14-NEXT:    [[KERNEL_ARGS5:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9448 // CHECK14-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 0
9449 // CHECK14-NEXT:    store i32 1, i32* [[TMP25]], align 4
9450 // CHECK14-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 1
9451 // CHECK14-NEXT:    store i32 1, i32* [[TMP26]], align 4
9452 // CHECK14-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 2
9453 // CHECK14-NEXT:    store i8** [[TMP23]], i8*** [[TMP27]], align 8
9454 // CHECK14-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 3
9455 // CHECK14-NEXT:    store i8** [[TMP24]], i8*** [[TMP28]], align 8
9456 // CHECK14-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 4
9457 // CHECK14-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.24, i32 0, i32 0), i64** [[TMP29]], align 8
9458 // CHECK14-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 5
9459 // CHECK14-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.25, i32 0, i32 0), i64** [[TMP30]], align 8
9460 // CHECK14-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 6
9461 // CHECK14-NEXT:    store i8** null, i8*** [[TMP31]], align 8
9462 // CHECK14-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 7
9463 // CHECK14-NEXT:    store i8** null, i8*** [[TMP32]], align 8
9464 // CHECK14-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 8
9465 // CHECK14-NEXT:    store i64 10, i64* [[TMP33]], align 8
9466 // CHECK14-NEXT:    [[TMP34:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]])
9467 // CHECK14-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
9468 // CHECK14-NEXT:    br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
9469 // CHECK14:       omp_offload.failed6:
9470 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127([10 x i32]* [[A]]) #[[ATTR3]]
9471 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT7]]
9472 // CHECK14:       omp_offload.cont7:
9473 // CHECK14-NEXT:    [[TMP36:%.*]] = load i32, i32* [[M]], align 4
9474 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_CASTED]] to i32*
9475 // CHECK14-NEXT:    store i32 [[TMP36]], i32* [[CONV]], align 4
9476 // CHECK14-NEXT:    [[TMP37:%.*]] = load i64, i64* [[M_CASTED]], align 8
9477 // CHECK14-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 0
9478 // CHECK14-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to i64*
9479 // CHECK14-NEXT:    store i64 [[TMP37]], i64* [[TMP39]], align 8
9480 // CHECK14-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 0
9481 // CHECK14-NEXT:    [[TMP41:%.*]] = bitcast i8** [[TMP40]] to i64*
9482 // CHECK14-NEXT:    store i64 [[TMP37]], i64* [[TMP41]], align 8
9483 // CHECK14-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS10]], i64 0, i64 0
9484 // CHECK14-NEXT:    store i8* null, i8** [[TMP42]], align 8
9485 // CHECK14-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 1
9486 // CHECK14-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to [10 x i32]**
9487 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP44]], align 8
9488 // CHECK14-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 1
9489 // CHECK14-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to [10 x i32]**
9490 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP46]], align 8
9491 // CHECK14-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS10]], i64 0, i64 1
9492 // CHECK14-NEXT:    store i8* null, i8** [[TMP47]], align 8
9493 // CHECK14-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 0
9494 // CHECK14-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 0
9495 // CHECK14-NEXT:    [[KERNEL_ARGS12:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9496 // CHECK14-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 0
9497 // CHECK14-NEXT:    store i32 1, i32* [[TMP50]], align 4
9498 // CHECK14-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 1
9499 // CHECK14-NEXT:    store i32 2, i32* [[TMP51]], align 4
9500 // CHECK14-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 2
9501 // CHECK14-NEXT:    store i8** [[TMP48]], i8*** [[TMP52]], align 8
9502 // CHECK14-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 3
9503 // CHECK14-NEXT:    store i8** [[TMP49]], i8*** [[TMP53]], align 8
9504 // CHECK14-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 4
9505 // CHECK14-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.28, i32 0, i32 0), i64** [[TMP54]], align 8
9506 // CHECK14-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 5
9507 // CHECK14-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.29, i32 0, i32 0), i64** [[TMP55]], align 8
9508 // CHECK14-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 6
9509 // CHECK14-NEXT:    store i8** null, i8*** [[TMP56]], align 8
9510 // CHECK14-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 7
9511 // CHECK14-NEXT:    store i8** null, i8*** [[TMP57]], align 8
9512 // CHECK14-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 8
9513 // CHECK14-NEXT:    store i64 10, i64* [[TMP58]], align 8
9514 // CHECK14-NEXT:    [[TMP59:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]])
9515 // CHECK14-NEXT:    [[TMP60:%.*]] = icmp ne i32 [[TMP59]], 0
9516 // CHECK14-NEXT:    br i1 [[TMP60]], label [[OMP_OFFLOAD_FAILED13:%.*]], label [[OMP_OFFLOAD_CONT14:%.*]]
9517 // CHECK14:       omp_offload.failed13:
9518 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132(i64 [[TMP37]], [10 x i32]* [[A]]) #[[ATTR3]]
9519 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT14]]
9520 // CHECK14:       omp_offload.cont14:
9521 // CHECK14-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS15]], i32 0, i32 0
9522 // CHECK14-NEXT:    [[TMP62:%.*]] = bitcast i8** [[TMP61]] to [10 x i32]**
9523 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP62]], align 8
9524 // CHECK14-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS16]], i32 0, i32 0
9525 // CHECK14-NEXT:    [[TMP64:%.*]] = bitcast i8** [[TMP63]] to [10 x i32]**
9526 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP64]], align 8
9527 // CHECK14-NEXT:    [[TMP65:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS17]], i64 0, i64 0
9528 // CHECK14-NEXT:    store i8* null, i8** [[TMP65]], align 8
9529 // CHECK14-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS15]], i32 0, i32 0
9530 // CHECK14-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS16]], i32 0, i32 0
9531 // CHECK14-NEXT:    [[KERNEL_ARGS19:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9532 // CHECK14-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 0
9533 // CHECK14-NEXT:    store i32 1, i32* [[TMP68]], align 4
9534 // CHECK14-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 1
9535 // CHECK14-NEXT:    store i32 1, i32* [[TMP69]], align 4
9536 // CHECK14-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 2
9537 // CHECK14-NEXT:    store i8** [[TMP66]], i8*** [[TMP70]], align 8
9538 // CHECK14-NEXT:    [[TMP71:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 3
9539 // CHECK14-NEXT:    store i8** [[TMP67]], i8*** [[TMP71]], align 8
9540 // CHECK14-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 4
9541 // CHECK14-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.32, i32 0, i32 0), i64** [[TMP72]], align 8
9542 // CHECK14-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 5
9543 // CHECK14-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.33, i32 0, i32 0), i64** [[TMP73]], align 8
9544 // CHECK14-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 6
9545 // CHECK14-NEXT:    store i8** null, i8*** [[TMP74]], align 8
9546 // CHECK14-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 7
9547 // CHECK14-NEXT:    store i8** null, i8*** [[TMP75]], align 8
9548 // CHECK14-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 8
9549 // CHECK14-NEXT:    store i64 10, i64* [[TMP76]], align 8
9550 // CHECK14-NEXT:    [[TMP77:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]])
9551 // CHECK14-NEXT:    [[TMP78:%.*]] = icmp ne i32 [[TMP77]], 0
9552 // CHECK14-NEXT:    br i1 [[TMP78]], label [[OMP_OFFLOAD_FAILED20:%.*]], label [[OMP_OFFLOAD_CONT21:%.*]]
9553 // CHECK14:       omp_offload.failed20:
9554 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137([10 x i32]* [[A]]) #[[ATTR3]]
9555 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT21]]
9556 // CHECK14:       omp_offload.cont21:
9557 // CHECK14-NEXT:    [[TMP79:%.*]] = load i32, i32* [[M]], align 4
9558 // CHECK14-NEXT:    [[CONV23:%.*]] = bitcast i64* [[M_CASTED22]] to i32*
9559 // CHECK14-NEXT:    store i32 [[TMP79]], i32* [[CONV23]], align 4
9560 // CHECK14-NEXT:    [[TMP80:%.*]] = load i64, i64* [[M_CASTED22]], align 8
9561 // CHECK14-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS24]], i32 0, i32 0
9562 // CHECK14-NEXT:    [[TMP82:%.*]] = bitcast i8** [[TMP81]] to i64*
9563 // CHECK14-NEXT:    store i64 [[TMP80]], i64* [[TMP82]], align 8
9564 // CHECK14-NEXT:    [[TMP83:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS25]], i32 0, i32 0
9565 // CHECK14-NEXT:    [[TMP84:%.*]] = bitcast i8** [[TMP83]] to i64*
9566 // CHECK14-NEXT:    store i64 [[TMP80]], i64* [[TMP84]], align 8
9567 // CHECK14-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS26]], i64 0, i64 0
9568 // CHECK14-NEXT:    store i8* null, i8** [[TMP85]], align 8
9569 // CHECK14-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS24]], i32 0, i32 1
9570 // CHECK14-NEXT:    [[TMP87:%.*]] = bitcast i8** [[TMP86]] to [10 x i32]**
9571 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP87]], align 8
9572 // CHECK14-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS25]], i32 0, i32 1
9573 // CHECK14-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to [10 x i32]**
9574 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP89]], align 8
9575 // CHECK14-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS26]], i64 0, i64 1
9576 // CHECK14-NEXT:    store i8* null, i8** [[TMP90]], align 8
9577 // CHECK14-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS24]], i32 0, i32 0
9578 // CHECK14-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS25]], i32 0, i32 0
9579 // CHECK14-NEXT:    [[KERNEL_ARGS28:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
9580 // CHECK14-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 0
9581 // CHECK14-NEXT:    store i32 1, i32* [[TMP93]], align 4
9582 // CHECK14-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 1
9583 // CHECK14-NEXT:    store i32 2, i32* [[TMP94]], align 4
9584 // CHECK14-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 2
9585 // CHECK14-NEXT:    store i8** [[TMP91]], i8*** [[TMP95]], align 8
9586 // CHECK14-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 3
9587 // CHECK14-NEXT:    store i8** [[TMP92]], i8*** [[TMP96]], align 8
9588 // CHECK14-NEXT:    [[TMP97:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 4
9589 // CHECK14-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.36, i32 0, i32 0), i64** [[TMP97]], align 8
9590 // CHECK14-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 5
9591 // CHECK14-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.37, i32 0, i32 0), i64** [[TMP98]], align 8
9592 // CHECK14-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 6
9593 // CHECK14-NEXT:    store i8** null, i8*** [[TMP99]], align 8
9594 // CHECK14-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 7
9595 // CHECK14-NEXT:    store i8** null, i8*** [[TMP100]], align 8
9596 // CHECK14-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]], i32 0, i32 8
9597 // CHECK14-NEXT:    store i64 10, i64* [[TMP101]], align 8
9598 // CHECK14-NEXT:    [[TMP102:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS28]])
9599 // CHECK14-NEXT:    [[TMP103:%.*]] = icmp ne i32 [[TMP102]], 0
9600 // CHECK14-NEXT:    br i1 [[TMP103]], label [[OMP_OFFLOAD_FAILED29:%.*]], label [[OMP_OFFLOAD_CONT30:%.*]]
9601 // CHECK14:       omp_offload.failed29:
9602 // CHECK14-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142(i64 [[TMP80]], [10 x i32]* [[A]]) #[[ATTR3]]
9603 // CHECK14-NEXT:    br label [[OMP_OFFLOAD_CONT30]]
9604 // CHECK14:       omp_offload.cont30:
9605 // CHECK14-NEXT:    ret i32 0
9606 //
9607 //
9608 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122
9609 // CHECK14-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
9610 // CHECK14-NEXT:  entry:
9611 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
9612 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
9613 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
9614 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..18 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
9615 // CHECK14-NEXT:    ret void
9616 //
9617 //
9618 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..18
9619 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
9620 // CHECK14-NEXT:  entry:
9621 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
9622 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
9623 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
9624 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9625 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9626 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
9627 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
9628 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9629 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9630 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
9631 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
9632 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
9633 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
9634 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
9635 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
9636 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
9637 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9638 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9639 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9640 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
9641 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9642 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9643 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
9644 // CHECK14-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9645 // CHECK14:       cond.true:
9646 // CHECK14-NEXT:    br label [[COND_END:%.*]]
9647 // CHECK14:       cond.false:
9648 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9649 // CHECK14-NEXT:    br label [[COND_END]]
9650 // CHECK14:       cond.end:
9651 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
9652 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
9653 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
9654 // CHECK14-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
9655 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9656 // CHECK14:       omp.inner.for.cond:
9657 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !46
9658 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !46
9659 // CHECK14-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
9660 // CHECK14-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9661 // CHECK14:       omp.inner.for.body:
9662 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !46
9663 // CHECK14-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
9664 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !46
9665 // CHECK14-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
9666 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]]), !llvm.access.group !46
9667 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9668 // CHECK14:       omp.inner.for.inc:
9669 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !46
9670 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !46
9671 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
9672 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !46
9673 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP47:![0-9]+]]
9674 // CHECK14:       omp.inner.for.end:
9675 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
9676 // CHECK14:       omp.loop.exit:
9677 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
9678 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
9679 // CHECK14-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
9680 // CHECK14-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
9681 // CHECK14:       .omp.final.then:
9682 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
9683 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
9684 // CHECK14:       .omp.final.done:
9685 // CHECK14-NEXT:    ret void
9686 //
9687 //
9688 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..19
9689 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
9690 // CHECK14-NEXT:  entry:
9691 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
9692 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
9693 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
9694 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
9695 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
9696 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9697 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9698 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
9699 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
9700 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9701 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9702 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
9703 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
9704 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
9705 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
9706 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
9707 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
9708 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
9709 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
9710 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
9711 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
9712 // CHECK14-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
9713 // CHECK14-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
9714 // CHECK14-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
9715 // CHECK14-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
9716 // CHECK14-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
9717 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9718 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9719 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9720 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
9721 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9722 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9723 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
9724 // CHECK14-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9725 // CHECK14:       cond.true:
9726 // CHECK14-NEXT:    br label [[COND_END:%.*]]
9727 // CHECK14:       cond.false:
9728 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9729 // CHECK14-NEXT:    br label [[COND_END]]
9730 // CHECK14:       cond.end:
9731 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
9732 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
9733 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
9734 // CHECK14-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
9735 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9736 // CHECK14:       omp.inner.for.cond:
9737 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !49
9738 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !49
9739 // CHECK14-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
9740 // CHECK14-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9741 // CHECK14:       omp.inner.for.body:
9742 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !49
9743 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
9744 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
9745 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !49
9746 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !49
9747 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
9748 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
9749 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !49
9750 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
9751 // CHECK14:       omp.body.continue:
9752 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9753 // CHECK14:       omp.inner.for.inc:
9754 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !49
9755 // CHECK14-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
9756 // CHECK14-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !49
9757 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP50:![0-9]+]]
9758 // CHECK14:       omp.inner.for.end:
9759 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
9760 // CHECK14:       omp.loop.exit:
9761 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
9762 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
9763 // CHECK14-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
9764 // CHECK14-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
9765 // CHECK14:       .omp.final.then:
9766 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
9767 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
9768 // CHECK14:       .omp.final.done:
9769 // CHECK14-NEXT:    ret void
9770 //
9771 //
9772 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127
9773 // CHECK14-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
9774 // CHECK14-NEXT:  entry:
9775 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
9776 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
9777 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
9778 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..22 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
9779 // CHECK14-NEXT:    ret void
9780 //
9781 //
9782 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..22
9783 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
9784 // CHECK14-NEXT:  entry:
9785 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
9786 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
9787 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
9788 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9789 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9790 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
9791 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
9792 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9793 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9794 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
9795 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
9796 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
9797 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
9798 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
9799 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
9800 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
9801 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9802 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9803 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9804 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
9805 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9806 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9807 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
9808 // CHECK14-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9809 // CHECK14:       cond.true:
9810 // CHECK14-NEXT:    br label [[COND_END:%.*]]
9811 // CHECK14:       cond.false:
9812 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9813 // CHECK14-NEXT:    br label [[COND_END]]
9814 // CHECK14:       cond.end:
9815 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
9816 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
9817 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
9818 // CHECK14-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
9819 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9820 // CHECK14:       omp.inner.for.cond:
9821 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !52
9822 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !52
9823 // CHECK14-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
9824 // CHECK14-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9825 // CHECK14:       omp.inner.for.body:
9826 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !52
9827 // CHECK14-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
9828 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !52
9829 // CHECK14-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
9830 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]]), !llvm.access.group !52
9831 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9832 // CHECK14:       omp.inner.for.inc:
9833 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !52
9834 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !52
9835 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
9836 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !52
9837 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP53:![0-9]+]]
9838 // CHECK14:       omp.inner.for.end:
9839 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
9840 // CHECK14:       omp.loop.exit:
9841 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
9842 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
9843 // CHECK14-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
9844 // CHECK14-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
9845 // CHECK14:       .omp.final.then:
9846 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
9847 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
9848 // CHECK14:       .omp.final.done:
9849 // CHECK14-NEXT:    ret void
9850 //
9851 //
9852 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..23
9853 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
9854 // CHECK14-NEXT:  entry:
9855 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
9856 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
9857 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
9858 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
9859 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
9860 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9861 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9862 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
9863 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
9864 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9865 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9866 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
9867 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
9868 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
9869 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
9870 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
9871 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
9872 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
9873 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
9874 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
9875 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
9876 // CHECK14-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
9877 // CHECK14-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
9878 // CHECK14-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
9879 // CHECK14-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
9880 // CHECK14-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
9881 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9882 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9883 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9884 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
9885 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9886 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9887 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
9888 // CHECK14-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9889 // CHECK14:       cond.true:
9890 // CHECK14-NEXT:    br label [[COND_END:%.*]]
9891 // CHECK14:       cond.false:
9892 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
9893 // CHECK14-NEXT:    br label [[COND_END]]
9894 // CHECK14:       cond.end:
9895 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
9896 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
9897 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
9898 // CHECK14-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
9899 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9900 // CHECK14:       omp.inner.for.cond:
9901 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !55
9902 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !55
9903 // CHECK14-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
9904 // CHECK14-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
9905 // CHECK14:       omp.inner.for.body:
9906 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !55
9907 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
9908 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
9909 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !55
9910 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !55
9911 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
9912 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
9913 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !55
9914 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
9915 // CHECK14:       omp.body.continue:
9916 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
9917 // CHECK14:       omp.inner.for.inc:
9918 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !55
9919 // CHECK14-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
9920 // CHECK14-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !55
9921 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP56:![0-9]+]]
9922 // CHECK14:       omp.inner.for.end:
9923 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
9924 // CHECK14:       omp.loop.exit:
9925 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
9926 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
9927 // CHECK14-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
9928 // CHECK14-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
9929 // CHECK14:       .omp.final.then:
9930 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
9931 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
9932 // CHECK14:       .omp.final.done:
9933 // CHECK14-NEXT:    ret void
9934 //
9935 //
9936 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132
9937 // CHECK14-SAME: (i64 noundef [[M:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
9938 // CHECK14-NEXT:  entry:
9939 // CHECK14-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
9940 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
9941 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
9942 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
9943 // CHECK14-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
9944 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
9945 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
9946 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
9947 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32, i32* [[CONV]], align 4
9948 // CHECK14-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
9949 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
9950 // CHECK14-NEXT:    [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
9951 // CHECK14-NEXT:    store i32 [[TMP2]], i32* [[CONV1]], align 4
9952 // CHECK14-NEXT:    [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
9953 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*, i64)* @.omp_outlined..26 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i64 [[TMP3]])
9954 // CHECK14-NEXT:    ret void
9955 //
9956 //
9957 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..26
9958 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
9959 // CHECK14-NEXT:  entry:
9960 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
9961 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
9962 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
9963 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
9964 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
9965 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
9966 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
9967 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
9968 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
9969 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
9970 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
9971 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
9972 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
9973 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
9974 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
9975 // CHECK14-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
9976 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
9977 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
9978 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
9979 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
9980 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
9981 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
9982 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
9983 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
9984 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
9985 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9986 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
9987 // CHECK14-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
9988 // CHECK14:       cond.true:
9989 // CHECK14-NEXT:    br label [[COND_END:%.*]]
9990 // CHECK14:       cond.false:
9991 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
9992 // CHECK14-NEXT:    br label [[COND_END]]
9993 // CHECK14:       cond.end:
9994 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
9995 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
9996 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
9997 // CHECK14-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
9998 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
9999 // CHECK14:       omp.inner.for.cond:
10000 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !58
10001 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !58
10002 // CHECK14-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
10003 // CHECK14-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10004 // CHECK14:       omp.inner.for.body:
10005 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !58
10006 // CHECK14-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
10007 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !58
10008 // CHECK14-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
10009 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[CONV]], align 4, !llvm.access.group !58
10010 // CHECK14-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
10011 // CHECK14-NEXT:    store i32 [[TMP12]], i32* [[CONV2]], align 4, !llvm.access.group !58
10012 // CHECK14-NEXT:    [[TMP13:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8, !llvm.access.group !58
10013 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*, i64)* @.omp_outlined..27 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]], i64 [[TMP13]]), !llvm.access.group !58
10014 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10015 // CHECK14:       omp.inner.for.inc:
10016 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !58
10017 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !58
10018 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]
10019 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !58
10020 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP59:![0-9]+]]
10021 // CHECK14:       omp.inner.for.end:
10022 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10023 // CHECK14:       omp.loop.exit:
10024 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
10025 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
10026 // CHECK14-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
10027 // CHECK14-NEXT:    br i1 [[TMP17]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
10028 // CHECK14:       .omp.final.then:
10029 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
10030 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
10031 // CHECK14:       .omp.final.done:
10032 // CHECK14-NEXT:    ret void
10033 //
10034 //
10035 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..27
10036 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
10037 // CHECK14-NEXT:  entry:
10038 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
10039 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
10040 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
10041 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
10042 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
10043 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
10044 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10045 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10046 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
10047 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
10048 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10049 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10050 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
10051 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
10052 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
10053 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
10054 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
10055 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
10056 // CHECK14-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
10057 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
10058 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
10059 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
10060 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
10061 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
10062 // CHECK14-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP1]] to i32
10063 // CHECK14-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
10064 // CHECK14-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP2]] to i32
10065 // CHECK14-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_LB]], align 4
10066 // CHECK14-NEXT:    store i32 [[CONV2]], i32* [[DOTOMP_UB]], align 4
10067 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10068 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10069 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[CONV]], align 4
10070 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
10071 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP4]], align 4
10072 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP5]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP3]])
10073 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
10074 // CHECK14:       omp.dispatch.cond:
10075 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10076 // CHECK14-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
10077 // CHECK14-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP7]] to i32
10078 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP6]], [[CONV3]]
10079 // CHECK14-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10080 // CHECK14:       cond.true:
10081 // CHECK14-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
10082 // CHECK14-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP8]] to i32
10083 // CHECK14-NEXT:    br label [[COND_END:%.*]]
10084 // CHECK14:       cond.false:
10085 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10086 // CHECK14-NEXT:    br label [[COND_END]]
10087 // CHECK14:       cond.end:
10088 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ [[CONV4]], [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
10089 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
10090 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10091 // CHECK14-NEXT:    store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4
10092 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
10093 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10094 // CHECK14-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
10095 // CHECK14-NEXT:    br i1 [[CMP5]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
10096 // CHECK14:       omp.dispatch.body:
10097 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10098 // CHECK14:       omp.inner.for.cond:
10099 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !61
10100 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !61
10101 // CHECK14-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
10102 // CHECK14-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10103 // CHECK14:       omp.inner.for.body:
10104 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !61
10105 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1
10106 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
10107 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !61
10108 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !61
10109 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP16]] to i64
10110 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
10111 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !61
10112 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
10113 // CHECK14:       omp.body.continue:
10114 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10115 // CHECK14:       omp.inner.for.inc:
10116 // CHECK14-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !61
10117 // CHECK14-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP17]], 1
10118 // CHECK14-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !61
10119 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP62:![0-9]+]]
10120 // CHECK14:       omp.inner.for.end:
10121 // CHECK14-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
10122 // CHECK14:       omp.dispatch.inc:
10123 // CHECK14-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10124 // CHECK14-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10125 // CHECK14-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
10126 // CHECK14-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_LB]], align 4
10127 // CHECK14-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10128 // CHECK14-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
10129 // CHECK14-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
10130 // CHECK14-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_UB]], align 4
10131 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND]]
10132 // CHECK14:       omp.dispatch.end:
10133 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP5]])
10134 // CHECK14-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
10135 // CHECK14-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
10136 // CHECK14-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
10137 // CHECK14:       .omp.final.then:
10138 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
10139 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
10140 // CHECK14:       .omp.final.done:
10141 // CHECK14-NEXT:    ret void
10142 //
10143 //
10144 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137
10145 // CHECK14-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
10146 // CHECK14-NEXT:  entry:
10147 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
10148 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
10149 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
10150 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
10151 // CHECK14-NEXT:    ret void
10152 //
10153 //
10154 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..30
10155 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
10156 // CHECK14-NEXT:  entry:
10157 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
10158 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
10159 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
10160 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10161 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10162 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
10163 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
10164 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10165 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10166 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
10167 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
10168 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
10169 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
10170 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
10171 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
10172 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
10173 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10174 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10175 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
10176 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
10177 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
10178 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10179 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
10180 // CHECK14-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10181 // CHECK14:       cond.true:
10182 // CHECK14-NEXT:    br label [[COND_END:%.*]]
10183 // CHECK14:       cond.false:
10184 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10185 // CHECK14-NEXT:    br label [[COND_END]]
10186 // CHECK14:       cond.end:
10187 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
10188 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
10189 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10190 // CHECK14-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
10191 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10192 // CHECK14:       omp.inner.for.cond:
10193 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !64
10194 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !64
10195 // CHECK14-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
10196 // CHECK14-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10197 // CHECK14:       omp.inner.for.body:
10198 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !64
10199 // CHECK14-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
10200 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !64
10201 // CHECK14-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
10202 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]]), !llvm.access.group !64
10203 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10204 // CHECK14:       omp.inner.for.inc:
10205 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !64
10206 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !64
10207 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
10208 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !64
10209 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP65:![0-9]+]]
10210 // CHECK14:       omp.inner.for.end:
10211 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10212 // CHECK14:       omp.loop.exit:
10213 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
10214 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
10215 // CHECK14-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
10216 // CHECK14-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
10217 // CHECK14:       .omp.final.then:
10218 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
10219 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
10220 // CHECK14:       .omp.final.done:
10221 // CHECK14-NEXT:    ret void
10222 //
10223 //
10224 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..31
10225 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
10226 // CHECK14-NEXT:  entry:
10227 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
10228 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
10229 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
10230 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
10231 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
10232 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10233 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10234 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
10235 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
10236 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10237 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10238 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
10239 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
10240 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
10241 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
10242 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
10243 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
10244 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
10245 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
10246 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
10247 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
10248 // CHECK14-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
10249 // CHECK14-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
10250 // CHECK14-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
10251 // CHECK14-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
10252 // CHECK14-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
10253 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10254 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10255 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10256 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10257 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
10258 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
10259 // CHECK14-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 1073741859, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 1)
10260 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
10261 // CHECK14:       omp.dispatch.cond:
10262 // CHECK14-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
10263 // CHECK14-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
10264 // CHECK14-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
10265 // CHECK14:       omp.dispatch.body:
10266 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10267 // CHECK14-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
10268 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10269 // CHECK14:       omp.inner.for.cond:
10270 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !67
10271 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !67
10272 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
10273 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10274 // CHECK14:       omp.inner.for.body:
10275 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !67
10276 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
10277 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
10278 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !67
10279 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !67
10280 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP12]] to i64
10281 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
10282 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !67
10283 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
10284 // CHECK14:       omp.body.continue:
10285 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10286 // CHECK14:       omp.inner.for.inc:
10287 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !67
10288 // CHECK14-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP13]], 1
10289 // CHECK14-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !67
10290 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP68:![0-9]+]]
10291 // CHECK14:       omp.inner.for.end:
10292 // CHECK14-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
10293 // CHECK14:       omp.dispatch.inc:
10294 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND]]
10295 // CHECK14:       omp.dispatch.end:
10296 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
10297 // CHECK14-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
10298 // CHECK14-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
10299 // CHECK14:       .omp.final.then:
10300 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
10301 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
10302 // CHECK14:       .omp.final.done:
10303 // CHECK14-NEXT:    ret void
10304 //
10305 //
10306 // CHECK14-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142
10307 // CHECK14-SAME: (i64 noundef [[M:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
10308 // CHECK14-NEXT:  entry:
10309 // CHECK14-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
10310 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
10311 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10312 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
10313 // CHECK14-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
10314 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
10315 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
10316 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
10317 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32, i32* [[CONV]], align 4
10318 // CHECK14-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
10319 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10320 // CHECK14-NEXT:    [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
10321 // CHECK14-NEXT:    store i32 [[TMP2]], i32* [[CONV1]], align 4
10322 // CHECK14-NEXT:    [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
10323 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*, i64)* @.omp_outlined..34 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i64 [[TMP3]])
10324 // CHECK14-NEXT:    ret void
10325 //
10326 //
10327 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..34
10328 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
10329 // CHECK14-NEXT:  entry:
10330 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
10331 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
10332 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
10333 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
10334 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10335 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10336 // CHECK14-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
10337 // CHECK14-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
10338 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10339 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10340 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
10341 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
10342 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
10343 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
10344 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
10345 // CHECK14-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
10346 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
10347 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
10348 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
10349 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
10350 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10351 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10352 // CHECK14-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
10353 // CHECK14-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
10354 // CHECK14-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
10355 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10356 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
10357 // CHECK14-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10358 // CHECK14:       cond.true:
10359 // CHECK14-NEXT:    br label [[COND_END:%.*]]
10360 // CHECK14:       cond.false:
10361 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
10362 // CHECK14-NEXT:    br label [[COND_END]]
10363 // CHECK14:       cond.end:
10364 // CHECK14-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
10365 // CHECK14-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
10366 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
10367 // CHECK14-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
10368 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10369 // CHECK14:       omp.inner.for.cond:
10370 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !70
10371 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !70
10372 // CHECK14-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
10373 // CHECK14-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10374 // CHECK14:       omp.inner.for.body:
10375 // CHECK14-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !70
10376 // CHECK14-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
10377 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !70
10378 // CHECK14-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
10379 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[CONV]], align 4, !llvm.access.group !70
10380 // CHECK14-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
10381 // CHECK14-NEXT:    store i32 [[TMP12]], i32* [[CONV2]], align 4, !llvm.access.group !70
10382 // CHECK14-NEXT:    [[TMP13:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8, !llvm.access.group !70
10383 // CHECK14-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, [10 x i32]*, i64)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]], i64 [[TMP13]]), !llvm.access.group !70
10384 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10385 // CHECK14:       omp.inner.for.inc:
10386 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !70
10387 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !70
10388 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]
10389 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !70
10390 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP71:![0-9]+]]
10391 // CHECK14:       omp.inner.for.end:
10392 // CHECK14-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
10393 // CHECK14:       omp.loop.exit:
10394 // CHECK14-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
10395 // CHECK14-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
10396 // CHECK14-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
10397 // CHECK14-NEXT:    br i1 [[TMP17]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
10398 // CHECK14:       .omp.final.then:
10399 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
10400 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
10401 // CHECK14:       .omp.final.done:
10402 // CHECK14-NEXT:    ret void
10403 //
10404 //
10405 // CHECK14-LABEL: define {{[^@]+}}@.omp_outlined..35
10406 // CHECK14-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
10407 // CHECK14-NEXT:  entry:
10408 // CHECK14-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
10409 // CHECK14-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
10410 // CHECK14-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
10411 // CHECK14-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
10412 // CHECK14-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
10413 // CHECK14-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
10414 // CHECK14-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10415 // CHECK14-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10416 // CHECK14-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
10417 // CHECK14-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
10418 // CHECK14-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10419 // CHECK14-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10420 // CHECK14-NEXT:    [[I:%.*]] = alloca i32, align 4
10421 // CHECK14-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
10422 // CHECK14-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
10423 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
10424 // CHECK14-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
10425 // CHECK14-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
10426 // CHECK14-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
10427 // CHECK14-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
10428 // CHECK14-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
10429 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
10430 // CHECK14-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
10431 // CHECK14-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
10432 // CHECK14-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP1]] to i32
10433 // CHECK14-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
10434 // CHECK14-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP2]] to i32
10435 // CHECK14-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_LB]], align 4
10436 // CHECK14-NEXT:    store i32 [[CONV2]], i32* [[DOTOMP_UB]], align 4
10437 // CHECK14-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
10438 // CHECK14-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
10439 // CHECK14-NEXT:    [[TMP3:%.*]] = load i32, i32* [[CONV]], align 4
10440 // CHECK14-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10441 // CHECK14-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
10442 // CHECK14-NEXT:    [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
10443 // CHECK14-NEXT:    [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
10444 // CHECK14-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP7]], i32 1073741859, i32 [[TMP4]], i32 [[TMP5]], i32 1, i32 [[TMP3]])
10445 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
10446 // CHECK14:       omp.dispatch.cond:
10447 // CHECK14-NEXT:    [[TMP8:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP7]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
10448 // CHECK14-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP8]], 0
10449 // CHECK14-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
10450 // CHECK14:       omp.dispatch.body:
10451 // CHECK14-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
10452 // CHECK14-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_IV]], align 4
10453 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
10454 // CHECK14:       omp.inner.for.cond:
10455 // CHECK14-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !73
10456 // CHECK14-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !73
10457 // CHECK14-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]
10458 // CHECK14-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
10459 // CHECK14:       omp.inner.for.body:
10460 // CHECK14-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !73
10461 // CHECK14-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP12]], 1
10462 // CHECK14-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
10463 // CHECK14-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !73
10464 // CHECK14-NEXT:    [[TMP13:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !73
10465 // CHECK14-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP13]] to i64
10466 // CHECK14-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
10467 // CHECK14-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !73
10468 // CHECK14-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
10469 // CHECK14:       omp.body.continue:
10470 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
10471 // CHECK14:       omp.inner.for.inc:
10472 // CHECK14-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !73
10473 // CHECK14-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP14]], 1
10474 // CHECK14-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !73
10475 // CHECK14-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP74:![0-9]+]]
10476 // CHECK14:       omp.inner.for.end:
10477 // CHECK14-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
10478 // CHECK14:       omp.dispatch.inc:
10479 // CHECK14-NEXT:    br label [[OMP_DISPATCH_COND]]
10480 // CHECK14:       omp.dispatch.end:
10481 // CHECK14-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
10482 // CHECK14-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
10483 // CHECK14-NEXT:    br i1 [[TMP16]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
10484 // CHECK14:       .omp.final.then:
10485 // CHECK14-NEXT:    store i32 10, i32* [[I]], align 4
10486 // CHECK14-NEXT:    br label [[DOTOMP_FINAL_DONE]]
10487 // CHECK14:       .omp.final.done:
10488 // CHECK14-NEXT:    ret void
10489 //
10490 //
10491 // CHECK14-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
10492 // CHECK14-SAME: () #[[ATTR6:[0-9]+]] {
10493 // CHECK14-NEXT:  entry:
10494 // CHECK14-NEXT:    call void @__tgt_register_requires(i64 1)
10495 // CHECK14-NEXT:    ret void
10496 //
10497 //
10498 // CHECK17-LABEL: define {{[^@]+}}@main
10499 // CHECK17-SAME: (i32 noundef [[ARGC:%.*]], i8** noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
10500 // CHECK17-NEXT:  entry:
10501 // CHECK17-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
10502 // CHECK17-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
10503 // CHECK17-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 4
10504 // CHECK17-NEXT:    [[N:%.*]] = alloca i32, align 4
10505 // CHECK17-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 4
10506 // CHECK17-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i32, align 4
10507 // CHECK17-NEXT:    [[M:%.*]] = alloca i32, align 4
10508 // CHECK17-NEXT:    [[N_CASTED:%.*]] = alloca i32, align 4
10509 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
10510 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
10511 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
10512 // CHECK17-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 4
10513 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10514 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10515 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10516 // CHECK17-NEXT:    [[N_CASTED3:%.*]] = alloca i32, align 4
10517 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [3 x i8*], align 4
10518 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS5:%.*]] = alloca [3 x i8*], align 4
10519 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [3 x i8*], align 4
10520 // CHECK17-NEXT:    [[DOTOFFLOAD_SIZES7:%.*]] = alloca [3 x i64], align 4
10521 // CHECK17-NEXT:    [[_TMP8:%.*]] = alloca i32, align 4
10522 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4
10523 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
10524 // CHECK17-NEXT:    [[M_CASTED:%.*]] = alloca i32, align 4
10525 // CHECK17-NEXT:    [[N_CASTED18:%.*]] = alloca i32, align 4
10526 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS19:%.*]] = alloca [4 x i8*], align 4
10527 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS20:%.*]] = alloca [4 x i8*], align 4
10528 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS21:%.*]] = alloca [4 x i8*], align 4
10529 // CHECK17-NEXT:    [[DOTOFFLOAD_SIZES22:%.*]] = alloca [4 x i64], align 4
10530 // CHECK17-NEXT:    [[_TMP23:%.*]] = alloca i32, align 4
10531 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_24:%.*]] = alloca i32, align 4
10532 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_25:%.*]] = alloca i32, align 4
10533 // CHECK17-NEXT:    [[N_CASTED33:%.*]] = alloca i32, align 4
10534 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS34:%.*]] = alloca [3 x i8*], align 4
10535 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS35:%.*]] = alloca [3 x i8*], align 4
10536 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS36:%.*]] = alloca [3 x i8*], align 4
10537 // CHECK17-NEXT:    [[DOTOFFLOAD_SIZES37:%.*]] = alloca [3 x i64], align 4
10538 // CHECK17-NEXT:    [[_TMP38:%.*]] = alloca i32, align 4
10539 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_39:%.*]] = alloca i32, align 4
10540 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_40:%.*]] = alloca i32, align 4
10541 // CHECK17-NEXT:    [[M_CASTED48:%.*]] = alloca i32, align 4
10542 // CHECK17-NEXT:    [[N_CASTED49:%.*]] = alloca i32, align 4
10543 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS50:%.*]] = alloca [4 x i8*], align 4
10544 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS51:%.*]] = alloca [4 x i8*], align 4
10545 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS52:%.*]] = alloca [4 x i8*], align 4
10546 // CHECK17-NEXT:    [[DOTOFFLOAD_SIZES53:%.*]] = alloca [4 x i64], align 4
10547 // CHECK17-NEXT:    [[_TMP54:%.*]] = alloca i32, align 4
10548 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_55:%.*]] = alloca i32, align 4
10549 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_56:%.*]] = alloca i32, align 4
10550 // CHECK17-NEXT:    store i32 0, i32* [[RETVAL]], align 4
10551 // CHECK17-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
10552 // CHECK17-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 4
10553 // CHECK17-NEXT:    store i32 100, i32* [[N]], align 4
10554 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
10555 // CHECK17-NEXT:    [[TMP1:%.*]] = call i8* @llvm.stacksave()
10556 // CHECK17-NEXT:    store i8* [[TMP1]], i8** [[SAVED_STACK]], align 4
10557 // CHECK17-NEXT:    [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 4
10558 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[__VLA_EXPR0]], align 4
10559 // CHECK17-NEXT:    store i32 10, i32* [[M]], align 4
10560 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[N]], align 4
10561 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[N_CASTED]], align 4
10562 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[N_CASTED]], align 4
10563 // CHECK17-NEXT:    [[TMP4:%.*]] = mul nuw i32 [[TMP0]], 4
10564 // CHECK17-NEXT:    [[TMP5:%.*]] = sext i32 [[TMP4]] to i64
10565 // CHECK17-NEXT:    [[TMP6:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
10566 // CHECK17-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP6]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes to i8*), i32 24, i1 false)
10567 // CHECK17-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
10568 // CHECK17-NEXT:    [[TMP8:%.*]] = bitcast i8** [[TMP7]] to i32*
10569 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[TMP8]], align 4
10570 // CHECK17-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
10571 // CHECK17-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i32*
10572 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[TMP10]], align 4
10573 // CHECK17-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
10574 // CHECK17-NEXT:    store i8* null, i8** [[TMP11]], align 4
10575 // CHECK17-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
10576 // CHECK17-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i32*
10577 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP13]], align 4
10578 // CHECK17-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
10579 // CHECK17-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i32*
10580 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP15]], align 4
10581 // CHECK17-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
10582 // CHECK17-NEXT:    store i8* null, i8** [[TMP16]], align 4
10583 // CHECK17-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
10584 // CHECK17-NEXT:    [[TMP18:%.*]] = bitcast i8** [[TMP17]] to i32**
10585 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP18]], align 4
10586 // CHECK17-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
10587 // CHECK17-NEXT:    [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i32**
10588 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP20]], align 4
10589 // CHECK17-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
10590 // CHECK17-NEXT:    store i64 [[TMP5]], i64* [[TMP21]], align 4
10591 // CHECK17-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
10592 // CHECK17-NEXT:    store i8* null, i8** [[TMP22]], align 4
10593 // CHECK17-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
10594 // CHECK17-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
10595 // CHECK17-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
10596 // CHECK17-NEXT:    [[TMP26:%.*]] = load i32, i32* [[N]], align 4
10597 // CHECK17-NEXT:    store i32 [[TMP26]], i32* [[DOTCAPTURE_EXPR_]], align 4
10598 // CHECK17-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10599 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP27]], 0
10600 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10601 // CHECK17-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
10602 // CHECK17-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10603 // CHECK17-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
10604 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP28]], 1
10605 // CHECK17-NEXT:    [[TMP29:%.*]] = zext i32 [[ADD]] to i64
10606 // CHECK17-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
10607 // CHECK17-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
10608 // CHECK17-NEXT:    store i32 1, i32* [[TMP30]], align 4
10609 // CHECK17-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
10610 // CHECK17-NEXT:    store i32 3, i32* [[TMP31]], align 4
10611 // CHECK17-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
10612 // CHECK17-NEXT:    store i8** [[TMP23]], i8*** [[TMP32]], align 4
10613 // CHECK17-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
10614 // CHECK17-NEXT:    store i8** [[TMP24]], i8*** [[TMP33]], align 4
10615 // CHECK17-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
10616 // CHECK17-NEXT:    store i64* [[TMP25]], i64** [[TMP34]], align 4
10617 // CHECK17-NEXT:    [[TMP35:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
10618 // CHECK17-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP35]], align 4
10619 // CHECK17-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
10620 // CHECK17-NEXT:    store i8** null, i8*** [[TMP36]], align 4
10621 // CHECK17-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
10622 // CHECK17-NEXT:    store i8** null, i8*** [[TMP37]], align 4
10623 // CHECK17-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
10624 // CHECK17-NEXT:    store i64 [[TMP29]], i64* [[TMP38]], align 8
10625 // CHECK17-NEXT:    [[TMP39:%.*]] = 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_l154.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
10626 // CHECK17-NEXT:    [[TMP40:%.*]] = icmp ne i32 [[TMP39]], 0
10627 // CHECK17-NEXT:    br i1 [[TMP40]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
10628 // CHECK17:       omp_offload.failed:
10629 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l154(i32 [[TMP3]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3:[0-9]+]]
10630 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT]]
10631 // CHECK17:       omp_offload.cont:
10632 // CHECK17-NEXT:    [[TMP41:%.*]] = load i32, i32* [[N]], align 4
10633 // CHECK17-NEXT:    store i32 [[TMP41]], i32* [[N_CASTED3]], align 4
10634 // CHECK17-NEXT:    [[TMP42:%.*]] = load i32, i32* [[N_CASTED3]], align 4
10635 // CHECK17-NEXT:    [[TMP43:%.*]] = mul nuw i32 [[TMP0]], 4
10636 // CHECK17-NEXT:    [[TMP44:%.*]] = sext i32 [[TMP43]] to i64
10637 // CHECK17-NEXT:    [[TMP45:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES7]] to i8*
10638 // CHECK17-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP45]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes.4 to i8*), i32 24, i1 false)
10639 // CHECK17-NEXT:    [[TMP46:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
10640 // CHECK17-NEXT:    [[TMP47:%.*]] = bitcast i8** [[TMP46]] to i32*
10641 // CHECK17-NEXT:    store i32 [[TMP42]], i32* [[TMP47]], align 4
10642 // CHECK17-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
10643 // CHECK17-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to i32*
10644 // CHECK17-NEXT:    store i32 [[TMP42]], i32* [[TMP49]], align 4
10645 // CHECK17-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 0
10646 // CHECK17-NEXT:    store i8* null, i8** [[TMP50]], align 4
10647 // CHECK17-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 1
10648 // CHECK17-NEXT:    [[TMP52:%.*]] = bitcast i8** [[TMP51]] to i32*
10649 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP52]], align 4
10650 // CHECK17-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 1
10651 // CHECK17-NEXT:    [[TMP54:%.*]] = bitcast i8** [[TMP53]] to i32*
10652 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP54]], align 4
10653 // CHECK17-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 1
10654 // CHECK17-NEXT:    store i8* null, i8** [[TMP55]], align 4
10655 // CHECK17-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 2
10656 // CHECK17-NEXT:    [[TMP57:%.*]] = bitcast i8** [[TMP56]] to i32**
10657 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP57]], align 4
10658 // CHECK17-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 2
10659 // CHECK17-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
10660 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP59]], align 4
10661 // CHECK17-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 2
10662 // CHECK17-NEXT:    store i64 [[TMP44]], i64* [[TMP60]], align 4
10663 // CHECK17-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 2
10664 // CHECK17-NEXT:    store i8* null, i8** [[TMP61]], align 4
10665 // CHECK17-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
10666 // CHECK17-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
10667 // CHECK17-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 0
10668 // CHECK17-NEXT:    [[TMP65:%.*]] = load i32, i32* [[N]], align 4
10669 // CHECK17-NEXT:    store i32 [[TMP65]], i32* [[DOTCAPTURE_EXPR_9]], align 4
10670 // CHECK17-NEXT:    [[TMP66:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_9]], align 4
10671 // CHECK17-NEXT:    [[SUB11:%.*]] = sub nsw i32 [[TMP66]], 0
10672 // CHECK17-NEXT:    [[DIV12:%.*]] = sdiv i32 [[SUB11]], 1
10673 // CHECK17-NEXT:    [[SUB13:%.*]] = sub nsw i32 [[DIV12]], 1
10674 // CHECK17-NEXT:    store i32 [[SUB13]], i32* [[DOTCAPTURE_EXPR_10]], align 4
10675 // CHECK17-NEXT:    [[TMP67:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
10676 // CHECK17-NEXT:    [[ADD14:%.*]] = add nsw i32 [[TMP67]], 1
10677 // CHECK17-NEXT:    [[TMP68:%.*]] = zext i32 [[ADD14]] to i64
10678 // CHECK17-NEXT:    [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
10679 // CHECK17-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 0
10680 // CHECK17-NEXT:    store i32 1, i32* [[TMP69]], align 4
10681 // CHECK17-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 1
10682 // CHECK17-NEXT:    store i32 3, i32* [[TMP70]], align 4
10683 // CHECK17-NEXT:    [[TMP71:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 2
10684 // CHECK17-NEXT:    store i8** [[TMP62]], i8*** [[TMP71]], align 4
10685 // CHECK17-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 3
10686 // CHECK17-NEXT:    store i8** [[TMP63]], i8*** [[TMP72]], align 4
10687 // CHECK17-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 4
10688 // CHECK17-NEXT:    store i64* [[TMP64]], i64** [[TMP73]], align 4
10689 // CHECK17-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 5
10690 // CHECK17-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP74]], align 4
10691 // CHECK17-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 6
10692 // CHECK17-NEXT:    store i8** null, i8*** [[TMP75]], align 4
10693 // CHECK17-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 7
10694 // CHECK17-NEXT:    store i8** null, i8*** [[TMP76]], align 4
10695 // CHECK17-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 8
10696 // CHECK17-NEXT:    store i64 [[TMP68]], i64* [[TMP77]], align 8
10697 // CHECK17-NEXT:    [[TMP78:%.*]] = 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_l159.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]])
10698 // CHECK17-NEXT:    [[TMP79:%.*]] = icmp ne i32 [[TMP78]], 0
10699 // CHECK17-NEXT:    br i1 [[TMP79]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
10700 // CHECK17:       omp_offload.failed16:
10701 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l159(i32 [[TMP42]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
10702 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
10703 // CHECK17:       omp_offload.cont17:
10704 // CHECK17-NEXT:    [[TMP80:%.*]] = load i32, i32* [[M]], align 4
10705 // CHECK17-NEXT:    store i32 [[TMP80]], i32* [[M_CASTED]], align 4
10706 // CHECK17-NEXT:    [[TMP81:%.*]] = load i32, i32* [[M_CASTED]], align 4
10707 // CHECK17-NEXT:    [[TMP82:%.*]] = load i32, i32* [[N]], align 4
10708 // CHECK17-NEXT:    store i32 [[TMP82]], i32* [[N_CASTED18]], align 4
10709 // CHECK17-NEXT:    [[TMP83:%.*]] = load i32, i32* [[N_CASTED18]], align 4
10710 // CHECK17-NEXT:    [[TMP84:%.*]] = mul nuw i32 [[TMP0]], 4
10711 // CHECK17-NEXT:    [[TMP85:%.*]] = sext i32 [[TMP84]] to i64
10712 // CHECK17-NEXT:    [[TMP86:%.*]] = bitcast [4 x i64]* [[DOTOFFLOAD_SIZES22]] to i8*
10713 // CHECK17-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP86]], i8* align 4 bitcast ([4 x i64]* @.offload_sizes.8 to i8*), i32 32, i1 false)
10714 // CHECK17-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
10715 // CHECK17-NEXT:    [[TMP88:%.*]] = bitcast i8** [[TMP87]] to i32*
10716 // CHECK17-NEXT:    store i32 [[TMP81]], i32* [[TMP88]], align 4
10717 // CHECK17-NEXT:    [[TMP89:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
10718 // CHECK17-NEXT:    [[TMP90:%.*]] = bitcast i8** [[TMP89]] to i32*
10719 // CHECK17-NEXT:    store i32 [[TMP81]], i32* [[TMP90]], align 4
10720 // CHECK17-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 0
10721 // CHECK17-NEXT:    store i8* null, i8** [[TMP91]], align 4
10722 // CHECK17-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 1
10723 // CHECK17-NEXT:    [[TMP93:%.*]] = bitcast i8** [[TMP92]] to i32*
10724 // CHECK17-NEXT:    store i32 [[TMP83]], i32* [[TMP93]], align 4
10725 // CHECK17-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 1
10726 // CHECK17-NEXT:    [[TMP95:%.*]] = bitcast i8** [[TMP94]] to i32*
10727 // CHECK17-NEXT:    store i32 [[TMP83]], i32* [[TMP95]], align 4
10728 // CHECK17-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 1
10729 // CHECK17-NEXT:    store i8* null, i8** [[TMP96]], align 4
10730 // CHECK17-NEXT:    [[TMP97:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 2
10731 // CHECK17-NEXT:    [[TMP98:%.*]] = bitcast i8** [[TMP97]] to i32*
10732 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP98]], align 4
10733 // CHECK17-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 2
10734 // CHECK17-NEXT:    [[TMP100:%.*]] = bitcast i8** [[TMP99]] to i32*
10735 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP100]], align 4
10736 // CHECK17-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 2
10737 // CHECK17-NEXT:    store i8* null, i8** [[TMP101]], align 4
10738 // CHECK17-NEXT:    [[TMP102:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 3
10739 // CHECK17-NEXT:    [[TMP103:%.*]] = bitcast i8** [[TMP102]] to i32**
10740 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP103]], align 4
10741 // CHECK17-NEXT:    [[TMP104:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 3
10742 // CHECK17-NEXT:    [[TMP105:%.*]] = bitcast i8** [[TMP104]] to i32**
10743 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP105]], align 4
10744 // CHECK17-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES22]], i32 0, i32 3
10745 // CHECK17-NEXT:    store i64 [[TMP85]], i64* [[TMP106]], align 4
10746 // CHECK17-NEXT:    [[TMP107:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 3
10747 // CHECK17-NEXT:    store i8* null, i8** [[TMP107]], align 4
10748 // CHECK17-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
10749 // CHECK17-NEXT:    [[TMP109:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
10750 // CHECK17-NEXT:    [[TMP110:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES22]], i32 0, i32 0
10751 // CHECK17-NEXT:    [[TMP111:%.*]] = load i32, i32* [[N]], align 4
10752 // CHECK17-NEXT:    store i32 [[TMP111]], i32* [[DOTCAPTURE_EXPR_24]], align 4
10753 // CHECK17-NEXT:    [[TMP112:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_24]], align 4
10754 // CHECK17-NEXT:    [[SUB26:%.*]] = sub nsw i32 [[TMP112]], 0
10755 // CHECK17-NEXT:    [[DIV27:%.*]] = sdiv i32 [[SUB26]], 1
10756 // CHECK17-NEXT:    [[SUB28:%.*]] = sub nsw i32 [[DIV27]], 1
10757 // CHECK17-NEXT:    store i32 [[SUB28]], i32* [[DOTCAPTURE_EXPR_25]], align 4
10758 // CHECK17-NEXT:    [[TMP113:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4
10759 // CHECK17-NEXT:    [[ADD29:%.*]] = add nsw i32 [[TMP113]], 1
10760 // CHECK17-NEXT:    [[TMP114:%.*]] = zext i32 [[ADD29]] to i64
10761 // CHECK17-NEXT:    [[KERNEL_ARGS30:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
10762 // CHECK17-NEXT:    [[TMP115:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 0
10763 // CHECK17-NEXT:    store i32 1, i32* [[TMP115]], align 4
10764 // CHECK17-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 1
10765 // CHECK17-NEXT:    store i32 4, i32* [[TMP116]], align 4
10766 // CHECK17-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 2
10767 // CHECK17-NEXT:    store i8** [[TMP108]], i8*** [[TMP117]], align 4
10768 // CHECK17-NEXT:    [[TMP118:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 3
10769 // CHECK17-NEXT:    store i8** [[TMP109]], i8*** [[TMP118]], align 4
10770 // CHECK17-NEXT:    [[TMP119:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 4
10771 // CHECK17-NEXT:    store i64* [[TMP110]], i64** [[TMP119]], align 4
10772 // CHECK17-NEXT:    [[TMP120:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 5
10773 // CHECK17-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP120]], align 4
10774 // CHECK17-NEXT:    [[TMP121:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 6
10775 // CHECK17-NEXT:    store i8** null, i8*** [[TMP121]], align 4
10776 // CHECK17-NEXT:    [[TMP122:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 7
10777 // CHECK17-NEXT:    store i8** null, i8*** [[TMP122]], align 4
10778 // CHECK17-NEXT:    [[TMP123:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 8
10779 // CHECK17-NEXT:    store i64 [[TMP114]], i64* [[TMP123]], align 8
10780 // CHECK17-NEXT:    [[TMP124:%.*]] = 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_l164.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]])
10781 // CHECK17-NEXT:    [[TMP125:%.*]] = icmp ne i32 [[TMP124]], 0
10782 // CHECK17-NEXT:    br i1 [[TMP125]], label [[OMP_OFFLOAD_FAILED31:%.*]], label [[OMP_OFFLOAD_CONT32:%.*]]
10783 // CHECK17:       omp_offload.failed31:
10784 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l164(i32 [[TMP81]], i32 [[TMP83]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
10785 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT32]]
10786 // CHECK17:       omp_offload.cont32:
10787 // CHECK17-NEXT:    [[TMP126:%.*]] = load i32, i32* [[N]], align 4
10788 // CHECK17-NEXT:    store i32 [[TMP126]], i32* [[N_CASTED33]], align 4
10789 // CHECK17-NEXT:    [[TMP127:%.*]] = load i32, i32* [[N_CASTED33]], align 4
10790 // CHECK17-NEXT:    [[TMP128:%.*]] = mul nuw i32 [[TMP0]], 4
10791 // CHECK17-NEXT:    [[TMP129:%.*]] = sext i32 [[TMP128]] to i64
10792 // CHECK17-NEXT:    [[TMP130:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES37]] to i8*
10793 // CHECK17-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP130]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes.12 to i8*), i32 24, i1 false)
10794 // CHECK17-NEXT:    [[TMP131:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS34]], i32 0, i32 0
10795 // CHECK17-NEXT:    [[TMP132:%.*]] = bitcast i8** [[TMP131]] to i32*
10796 // CHECK17-NEXT:    store i32 [[TMP127]], i32* [[TMP132]], align 4
10797 // CHECK17-NEXT:    [[TMP133:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS35]], i32 0, i32 0
10798 // CHECK17-NEXT:    [[TMP134:%.*]] = bitcast i8** [[TMP133]] to i32*
10799 // CHECK17-NEXT:    store i32 [[TMP127]], i32* [[TMP134]], align 4
10800 // CHECK17-NEXT:    [[TMP135:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS36]], i32 0, i32 0
10801 // CHECK17-NEXT:    store i8* null, i8** [[TMP135]], align 4
10802 // CHECK17-NEXT:    [[TMP136:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS34]], i32 0, i32 1
10803 // CHECK17-NEXT:    [[TMP137:%.*]] = bitcast i8** [[TMP136]] to i32*
10804 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP137]], align 4
10805 // CHECK17-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS35]], i32 0, i32 1
10806 // CHECK17-NEXT:    [[TMP139:%.*]] = bitcast i8** [[TMP138]] to i32*
10807 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP139]], align 4
10808 // CHECK17-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS36]], i32 0, i32 1
10809 // CHECK17-NEXT:    store i8* null, i8** [[TMP140]], align 4
10810 // CHECK17-NEXT:    [[TMP141:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS34]], i32 0, i32 2
10811 // CHECK17-NEXT:    [[TMP142:%.*]] = bitcast i8** [[TMP141]] to i32**
10812 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP142]], align 4
10813 // CHECK17-NEXT:    [[TMP143:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS35]], i32 0, i32 2
10814 // CHECK17-NEXT:    [[TMP144:%.*]] = bitcast i8** [[TMP143]] to i32**
10815 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP144]], align 4
10816 // CHECK17-NEXT:    [[TMP145:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES37]], i32 0, i32 2
10817 // CHECK17-NEXT:    store i64 [[TMP129]], i64* [[TMP145]], align 4
10818 // CHECK17-NEXT:    [[TMP146:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS36]], i32 0, i32 2
10819 // CHECK17-NEXT:    store i8* null, i8** [[TMP146]], align 4
10820 // CHECK17-NEXT:    [[TMP147:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS34]], i32 0, i32 0
10821 // CHECK17-NEXT:    [[TMP148:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS35]], i32 0, i32 0
10822 // CHECK17-NEXT:    [[TMP149:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES37]], i32 0, i32 0
10823 // CHECK17-NEXT:    [[TMP150:%.*]] = load i32, i32* [[N]], align 4
10824 // CHECK17-NEXT:    store i32 [[TMP150]], i32* [[DOTCAPTURE_EXPR_39]], align 4
10825 // CHECK17-NEXT:    [[TMP151:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_39]], align 4
10826 // CHECK17-NEXT:    [[SUB41:%.*]] = sub nsw i32 [[TMP151]], 0
10827 // CHECK17-NEXT:    [[DIV42:%.*]] = sdiv i32 [[SUB41]], 1
10828 // CHECK17-NEXT:    [[SUB43:%.*]] = sub nsw i32 [[DIV42]], 1
10829 // CHECK17-NEXT:    store i32 [[SUB43]], i32* [[DOTCAPTURE_EXPR_40]], align 4
10830 // CHECK17-NEXT:    [[TMP152:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_40]], align 4
10831 // CHECK17-NEXT:    [[ADD44:%.*]] = add nsw i32 [[TMP152]], 1
10832 // CHECK17-NEXT:    [[TMP153:%.*]] = zext i32 [[ADD44]] to i64
10833 // CHECK17-NEXT:    [[KERNEL_ARGS45:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
10834 // CHECK17-NEXT:    [[TMP154:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 0
10835 // CHECK17-NEXT:    store i32 1, i32* [[TMP154]], align 4
10836 // CHECK17-NEXT:    [[TMP155:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 1
10837 // CHECK17-NEXT:    store i32 3, i32* [[TMP155]], align 4
10838 // CHECK17-NEXT:    [[TMP156:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 2
10839 // CHECK17-NEXT:    store i8** [[TMP147]], i8*** [[TMP156]], align 4
10840 // CHECK17-NEXT:    [[TMP157:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 3
10841 // CHECK17-NEXT:    store i8** [[TMP148]], i8*** [[TMP157]], align 4
10842 // CHECK17-NEXT:    [[TMP158:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 4
10843 // CHECK17-NEXT:    store i64* [[TMP149]], i64** [[TMP158]], align 4
10844 // CHECK17-NEXT:    [[TMP159:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 5
10845 // CHECK17-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP159]], align 4
10846 // CHECK17-NEXT:    [[TMP160:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 6
10847 // CHECK17-NEXT:    store i8** null, i8*** [[TMP160]], align 4
10848 // CHECK17-NEXT:    [[TMP161:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 7
10849 // CHECK17-NEXT:    store i8** null, i8*** [[TMP161]], align 4
10850 // CHECK17-NEXT:    [[TMP162:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 8
10851 // CHECK17-NEXT:    store i64 [[TMP153]], i64* [[TMP162]], align 8
10852 // CHECK17-NEXT:    [[TMP163:%.*]] = 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_l169.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]])
10853 // CHECK17-NEXT:    [[TMP164:%.*]] = icmp ne i32 [[TMP163]], 0
10854 // CHECK17-NEXT:    br i1 [[TMP164]], label [[OMP_OFFLOAD_FAILED46:%.*]], label [[OMP_OFFLOAD_CONT47:%.*]]
10855 // CHECK17:       omp_offload.failed46:
10856 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l169(i32 [[TMP127]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
10857 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT47]]
10858 // CHECK17:       omp_offload.cont47:
10859 // CHECK17-NEXT:    [[TMP165:%.*]] = load i32, i32* [[M]], align 4
10860 // CHECK17-NEXT:    store i32 [[TMP165]], i32* [[M_CASTED48]], align 4
10861 // CHECK17-NEXT:    [[TMP166:%.*]] = load i32, i32* [[M_CASTED48]], align 4
10862 // CHECK17-NEXT:    [[TMP167:%.*]] = load i32, i32* [[N]], align 4
10863 // CHECK17-NEXT:    store i32 [[TMP167]], i32* [[N_CASTED49]], align 4
10864 // CHECK17-NEXT:    [[TMP168:%.*]] = load i32, i32* [[N_CASTED49]], align 4
10865 // CHECK17-NEXT:    [[TMP169:%.*]] = mul nuw i32 [[TMP0]], 4
10866 // CHECK17-NEXT:    [[TMP170:%.*]] = sext i32 [[TMP169]] to i64
10867 // CHECK17-NEXT:    [[TMP171:%.*]] = bitcast [4 x i64]* [[DOTOFFLOAD_SIZES53]] to i8*
10868 // CHECK17-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP171]], i8* align 4 bitcast ([4 x i64]* @.offload_sizes.16 to i8*), i32 32, i1 false)
10869 // CHECK17-NEXT:    [[TMP172:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 0
10870 // CHECK17-NEXT:    [[TMP173:%.*]] = bitcast i8** [[TMP172]] to i32*
10871 // CHECK17-NEXT:    store i32 [[TMP166]], i32* [[TMP173]], align 4
10872 // CHECK17-NEXT:    [[TMP174:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 0
10873 // CHECK17-NEXT:    [[TMP175:%.*]] = bitcast i8** [[TMP174]] to i32*
10874 // CHECK17-NEXT:    store i32 [[TMP166]], i32* [[TMP175]], align 4
10875 // CHECK17-NEXT:    [[TMP176:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS52]], i32 0, i32 0
10876 // CHECK17-NEXT:    store i8* null, i8** [[TMP176]], align 4
10877 // CHECK17-NEXT:    [[TMP177:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 1
10878 // CHECK17-NEXT:    [[TMP178:%.*]] = bitcast i8** [[TMP177]] to i32*
10879 // CHECK17-NEXT:    store i32 [[TMP168]], i32* [[TMP178]], align 4
10880 // CHECK17-NEXT:    [[TMP179:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 1
10881 // CHECK17-NEXT:    [[TMP180:%.*]] = bitcast i8** [[TMP179]] to i32*
10882 // CHECK17-NEXT:    store i32 [[TMP168]], i32* [[TMP180]], align 4
10883 // CHECK17-NEXT:    [[TMP181:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS52]], i32 0, i32 1
10884 // CHECK17-NEXT:    store i8* null, i8** [[TMP181]], align 4
10885 // CHECK17-NEXT:    [[TMP182:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 2
10886 // CHECK17-NEXT:    [[TMP183:%.*]] = bitcast i8** [[TMP182]] to i32*
10887 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP183]], align 4
10888 // CHECK17-NEXT:    [[TMP184:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 2
10889 // CHECK17-NEXT:    [[TMP185:%.*]] = bitcast i8** [[TMP184]] to i32*
10890 // CHECK17-NEXT:    store i32 [[TMP0]], i32* [[TMP185]], align 4
10891 // CHECK17-NEXT:    [[TMP186:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS52]], i32 0, i32 2
10892 // CHECK17-NEXT:    store i8* null, i8** [[TMP186]], align 4
10893 // CHECK17-NEXT:    [[TMP187:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 3
10894 // CHECK17-NEXT:    [[TMP188:%.*]] = bitcast i8** [[TMP187]] to i32**
10895 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP188]], align 4
10896 // CHECK17-NEXT:    [[TMP189:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 3
10897 // CHECK17-NEXT:    [[TMP190:%.*]] = bitcast i8** [[TMP189]] to i32**
10898 // CHECK17-NEXT:    store i32* [[VLA]], i32** [[TMP190]], align 4
10899 // CHECK17-NEXT:    [[TMP191:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES53]], i32 0, i32 3
10900 // CHECK17-NEXT:    store i64 [[TMP170]], i64* [[TMP191]], align 4
10901 // CHECK17-NEXT:    [[TMP192:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS52]], i32 0, i32 3
10902 // CHECK17-NEXT:    store i8* null, i8** [[TMP192]], align 4
10903 // CHECK17-NEXT:    [[TMP193:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 0
10904 // CHECK17-NEXT:    [[TMP194:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 0
10905 // CHECK17-NEXT:    [[TMP195:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES53]], i32 0, i32 0
10906 // CHECK17-NEXT:    [[TMP196:%.*]] = load i32, i32* [[N]], align 4
10907 // CHECK17-NEXT:    store i32 [[TMP196]], i32* [[DOTCAPTURE_EXPR_55]], align 4
10908 // CHECK17-NEXT:    [[TMP197:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_55]], align 4
10909 // CHECK17-NEXT:    [[SUB57:%.*]] = sub nsw i32 [[TMP197]], 0
10910 // CHECK17-NEXT:    [[DIV58:%.*]] = sdiv i32 [[SUB57]], 1
10911 // CHECK17-NEXT:    [[SUB59:%.*]] = sub nsw i32 [[DIV58]], 1
10912 // CHECK17-NEXT:    store i32 [[SUB59]], i32* [[DOTCAPTURE_EXPR_56]], align 4
10913 // CHECK17-NEXT:    [[TMP198:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_56]], align 4
10914 // CHECK17-NEXT:    [[ADD60:%.*]] = add nsw i32 [[TMP198]], 1
10915 // CHECK17-NEXT:    [[TMP199:%.*]] = zext i32 [[ADD60]] to i64
10916 // CHECK17-NEXT:    [[KERNEL_ARGS61:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
10917 // CHECK17-NEXT:    [[TMP200:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 0
10918 // CHECK17-NEXT:    store i32 1, i32* [[TMP200]], align 4
10919 // CHECK17-NEXT:    [[TMP201:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 1
10920 // CHECK17-NEXT:    store i32 4, i32* [[TMP201]], align 4
10921 // CHECK17-NEXT:    [[TMP202:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 2
10922 // CHECK17-NEXT:    store i8** [[TMP193]], i8*** [[TMP202]], align 4
10923 // CHECK17-NEXT:    [[TMP203:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 3
10924 // CHECK17-NEXT:    store i8** [[TMP194]], i8*** [[TMP203]], align 4
10925 // CHECK17-NEXT:    [[TMP204:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 4
10926 // CHECK17-NEXT:    store i64* [[TMP195]], i64** [[TMP204]], align 4
10927 // CHECK17-NEXT:    [[TMP205:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 5
10928 // CHECK17-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP205]], align 4
10929 // CHECK17-NEXT:    [[TMP206:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 6
10930 // CHECK17-NEXT:    store i8** null, i8*** [[TMP206]], align 4
10931 // CHECK17-NEXT:    [[TMP207:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 7
10932 // CHECK17-NEXT:    store i8** null, i8*** [[TMP207]], align 4
10933 // CHECK17-NEXT:    [[TMP208:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 8
10934 // CHECK17-NEXT:    store i64 [[TMP199]], i64* [[TMP208]], align 8
10935 // CHECK17-NEXT:    [[TMP209:%.*]] = 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_l174.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]])
10936 // CHECK17-NEXT:    [[TMP210:%.*]] = icmp ne i32 [[TMP209]], 0
10937 // CHECK17-NEXT:    br i1 [[TMP210]], label [[OMP_OFFLOAD_FAILED62:%.*]], label [[OMP_OFFLOAD_CONT63:%.*]]
10938 // CHECK17:       omp_offload.failed62:
10939 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l174(i32 [[TMP166]], i32 [[TMP168]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
10940 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT63]]
10941 // CHECK17:       omp_offload.cont63:
10942 // CHECK17-NEXT:    [[TMP211:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
10943 // CHECK17-NEXT:    [[CALL:%.*]] = call noundef i32 @_Z5tmainIiLi10EEiT_(i32 noundef [[TMP211]])
10944 // CHECK17-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
10945 // CHECK17-NEXT:    [[TMP212:%.*]] = load i8*, i8** [[SAVED_STACK]], align 4
10946 // CHECK17-NEXT:    call void @llvm.stackrestore(i8* [[TMP212]])
10947 // CHECK17-NEXT:    [[TMP213:%.*]] = load i32, i32* [[RETVAL]], align 4
10948 // CHECK17-NEXT:    ret i32 [[TMP213]]
10949 //
10950 //
10951 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l154
10952 // CHECK17-SAME: (i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {
10953 // CHECK17-NEXT:  entry:
10954 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
10955 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
10956 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
10957 // CHECK17-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
10958 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
10959 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
10960 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
10961 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
10962 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]])
10963 // CHECK17-NEXT:    ret void
10964 //
10965 //
10966 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined.
10967 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
10968 // CHECK17-NEXT:  entry:
10969 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
10970 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
10971 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
10972 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
10973 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
10974 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
10975 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
10976 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
10977 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
10978 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
10979 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
10980 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
10981 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
10982 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
10983 // CHECK17-NEXT:    [[I3:%.*]] = alloca i32, align 4
10984 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
10985 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
10986 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
10987 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
10988 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
10989 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
10990 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
10991 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
10992 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
10993 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
10994 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
10995 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
10996 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
10997 // CHECK17-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
10998 // CHECK17-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
10999 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
11000 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11001 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
11002 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11003 // CHECK17:       omp.precond.then:
11004 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
11005 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11006 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
11007 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11008 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11009 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11010 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
11011 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
11012 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11013 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11014 // CHECK17-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
11015 // CHECK17-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11016 // CHECK17:       cond.true:
11017 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11018 // CHECK17-NEXT:    br label [[COND_END:%.*]]
11019 // CHECK17:       cond.false:
11020 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11021 // CHECK17-NEXT:    br label [[COND_END]]
11022 // CHECK17:       cond.end:
11023 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
11024 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
11025 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
11026 // CHECK17-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
11027 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11028 // CHECK17:       omp.inner.for.cond:
11029 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !14
11030 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !14
11031 // CHECK17-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
11032 // CHECK17-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11033 // CHECK17:       omp.inner.for.body:
11034 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !14
11035 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !14
11036 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32 [[TMP16]], i32 [[TMP17]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !14
11037 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11038 // CHECK17:       omp.inner.for.inc:
11039 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !14
11040 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !14
11041 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
11042 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !14
11043 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP15:![0-9]+]]
11044 // CHECK17:       omp.inner.for.end:
11045 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
11046 // CHECK17:       omp.loop.exit:
11047 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11048 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
11049 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
11050 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
11051 // CHECK17-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
11052 // CHECK17-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
11053 // CHECK17:       .omp.final.then:
11054 // CHECK17-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11055 // CHECK17-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP24]], 0
11056 // CHECK17-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
11057 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
11058 // CHECK17-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
11059 // CHECK17-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
11060 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
11061 // CHECK17:       .omp.final.done:
11062 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
11063 // CHECK17:       omp.precond.end:
11064 // CHECK17-NEXT:    ret void
11065 //
11066 //
11067 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..1
11068 // CHECK17-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
11069 // CHECK17-NEXT:  entry:
11070 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11071 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11072 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
11073 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
11074 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11075 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11076 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11077 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11078 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11079 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11080 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11081 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
11082 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
11083 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
11084 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11085 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11086 // CHECK17-NEXT:    [[I3:%.*]] = alloca i32, align 4
11087 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11088 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11089 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11090 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11091 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11092 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11093 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11094 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11095 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11096 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11097 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
11098 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
11099 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11100 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
11101 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11102 // CHECK17-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
11103 // CHECK17-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11104 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
11105 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11106 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
11107 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11108 // CHECK17:       omp.precond.then:
11109 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
11110 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11111 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
11112 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11113 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11114 // CHECK17-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
11115 // CHECK17-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
11116 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11117 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11118 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11119 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
11120 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
11121 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
11122 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11123 // CHECK17-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
11124 // CHECK17-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11125 // CHECK17:       cond.true:
11126 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11127 // CHECK17-NEXT:    br label [[COND_END:%.*]]
11128 // CHECK17:       cond.false:
11129 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
11130 // CHECK17-NEXT:    br label [[COND_END]]
11131 // CHECK17:       cond.end:
11132 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
11133 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
11134 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
11135 // CHECK17-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
11136 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11137 // CHECK17:       omp.inner.for.cond:
11138 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
11139 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !18
11140 // CHECK17-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
11141 // CHECK17-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11142 // CHECK17:       omp.inner.for.body:
11143 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
11144 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
11145 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
11146 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !18
11147 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !18
11148 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
11149 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !18
11150 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
11151 // CHECK17:       omp.body.continue:
11152 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11153 // CHECK17:       omp.inner.for.inc:
11154 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
11155 // CHECK17-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP20]], 1
11156 // CHECK17-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
11157 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP19:![0-9]+]]
11158 // CHECK17:       omp.inner.for.end:
11159 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
11160 // CHECK17:       omp.loop.exit:
11161 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11162 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
11163 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
11164 // CHECK17-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
11165 // CHECK17-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
11166 // CHECK17-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
11167 // CHECK17:       .omp.final.then:
11168 // CHECK17-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11169 // CHECK17-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP25]], 0
11170 // CHECK17-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
11171 // CHECK17-NEXT:    [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 1
11172 // CHECK17-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]
11173 // CHECK17-NEXT:    store i32 [[ADD10]], i32* [[I3]], align 4
11174 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
11175 // CHECK17:       .omp.final.done:
11176 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
11177 // CHECK17:       omp.precond.end:
11178 // CHECK17-NEXT:    ret void
11179 //
11180 //
11181 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l159
11182 // CHECK17-SAME: (i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
11183 // CHECK17-NEXT:  entry:
11184 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
11185 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11186 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11187 // CHECK17-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
11188 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11189 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11190 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11191 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11192 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]])
11193 // CHECK17-NEXT:    ret void
11194 //
11195 //
11196 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..2
11197 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
11198 // CHECK17-NEXT:  entry:
11199 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11200 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11201 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11202 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11203 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11204 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11205 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11206 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11207 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11208 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
11209 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
11210 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
11211 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11212 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11213 // CHECK17-NEXT:    [[I3:%.*]] = alloca i32, align 4
11214 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11215 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11216 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11217 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11218 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11219 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11220 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11221 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11222 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
11223 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
11224 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11225 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
11226 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11227 // CHECK17-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
11228 // CHECK17-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11229 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
11230 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11231 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
11232 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11233 // CHECK17:       omp.precond.then:
11234 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
11235 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11236 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
11237 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11238 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11239 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11240 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
11241 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
11242 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11243 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11244 // CHECK17-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
11245 // CHECK17-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11246 // CHECK17:       cond.true:
11247 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11248 // CHECK17-NEXT:    br label [[COND_END:%.*]]
11249 // CHECK17:       cond.false:
11250 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11251 // CHECK17-NEXT:    br label [[COND_END]]
11252 // CHECK17:       cond.end:
11253 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
11254 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
11255 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
11256 // CHECK17-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
11257 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11258 // CHECK17:       omp.inner.for.cond:
11259 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
11260 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !23
11261 // CHECK17-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
11262 // CHECK17-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11263 // CHECK17:       omp.inner.for.body:
11264 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !23
11265 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !23
11266 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32 [[TMP16]], i32 [[TMP17]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !23
11267 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11268 // CHECK17:       omp.inner.for.inc:
11269 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
11270 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !23
11271 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
11272 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
11273 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP24:![0-9]+]]
11274 // CHECK17:       omp.inner.for.end:
11275 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
11276 // CHECK17:       omp.loop.exit:
11277 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11278 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
11279 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
11280 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
11281 // CHECK17-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
11282 // CHECK17-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
11283 // CHECK17:       .omp.final.then:
11284 // CHECK17-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11285 // CHECK17-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP24]], 0
11286 // CHECK17-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
11287 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
11288 // CHECK17-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
11289 // CHECK17-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
11290 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
11291 // CHECK17:       .omp.final.done:
11292 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
11293 // CHECK17:       omp.precond.end:
11294 // CHECK17-NEXT:    ret void
11295 //
11296 //
11297 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..3
11298 // CHECK17-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
11299 // CHECK17-NEXT:  entry:
11300 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11301 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11302 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
11303 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
11304 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11305 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11306 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11307 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11308 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11309 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11310 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11311 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
11312 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
11313 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
11314 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11315 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11316 // CHECK17-NEXT:    [[I3:%.*]] = alloca i32, align 4
11317 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11318 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11319 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11320 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11321 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11322 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11323 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11324 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11325 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11326 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11327 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
11328 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
11329 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11330 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
11331 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11332 // CHECK17-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
11333 // CHECK17-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11334 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
11335 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11336 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
11337 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11338 // CHECK17:       omp.precond.then:
11339 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
11340 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11341 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
11342 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11343 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11344 // CHECK17-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
11345 // CHECK17-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
11346 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11347 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11348 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11349 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
11350 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
11351 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
11352 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11353 // CHECK17-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
11354 // CHECK17-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11355 // CHECK17:       cond.true:
11356 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11357 // CHECK17-NEXT:    br label [[COND_END:%.*]]
11358 // CHECK17:       cond.false:
11359 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
11360 // CHECK17-NEXT:    br label [[COND_END]]
11361 // CHECK17:       cond.end:
11362 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
11363 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
11364 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
11365 // CHECK17-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
11366 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11367 // CHECK17:       omp.inner.for.cond:
11368 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
11369 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !26
11370 // CHECK17-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
11371 // CHECK17-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11372 // CHECK17:       omp.inner.for.body:
11373 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
11374 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
11375 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
11376 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !26
11377 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !26
11378 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
11379 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !26
11380 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
11381 // CHECK17:       omp.body.continue:
11382 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11383 // CHECK17:       omp.inner.for.inc:
11384 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
11385 // CHECK17-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP20]], 1
11386 // CHECK17-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
11387 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP27:![0-9]+]]
11388 // CHECK17:       omp.inner.for.end:
11389 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
11390 // CHECK17:       omp.loop.exit:
11391 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11392 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
11393 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
11394 // CHECK17-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
11395 // CHECK17-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
11396 // CHECK17-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
11397 // CHECK17:       .omp.final.then:
11398 // CHECK17-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11399 // CHECK17-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP25]], 0
11400 // CHECK17-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
11401 // CHECK17-NEXT:    [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 1
11402 // CHECK17-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]
11403 // CHECK17-NEXT:    store i32 [[ADD10]], i32* [[I3]], align 4
11404 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
11405 // CHECK17:       .omp.final.done:
11406 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
11407 // CHECK17:       omp.precond.end:
11408 // CHECK17-NEXT:    ret void
11409 //
11410 //
11411 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l164
11412 // CHECK17-SAME: (i32 noundef [[M:%.*]], i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
11413 // CHECK17-NEXT:  entry:
11414 // CHECK17-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
11415 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
11416 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11417 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11418 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11419 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
11420 // CHECK17-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
11421 // CHECK17-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
11422 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11423 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11424 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11425 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11426 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[M_ADDR]], align 4
11427 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
11428 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11429 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
11430 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
11431 // CHECK17-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..6 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]], i32 [[TMP4]])
11432 // CHECK17-NEXT:    ret void
11433 //
11434 //
11435 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..6
11436 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
11437 // CHECK17-NEXT:  entry:
11438 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11439 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11440 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11441 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11442 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11443 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
11444 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11445 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11446 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11447 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
11448 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
11449 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
11450 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
11451 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11452 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11453 // CHECK17-NEXT:    [[I4:%.*]] = alloca i32, align 4
11454 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
11455 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11456 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11457 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11458 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11459 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11460 // CHECK17-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
11461 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11462 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11463 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11464 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
11465 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11466 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11467 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
11468 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11469 // CHECK17-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
11470 // CHECK17-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
11471 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
11472 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11473 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
11474 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11475 // CHECK17:       omp.precond.then:
11476 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
11477 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11478 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
11479 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11480 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11481 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
11482 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11483 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
11484 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP7]])
11485 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11486 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11487 // CHECK17-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
11488 // CHECK17-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11489 // CHECK17:       cond.true:
11490 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11491 // CHECK17-NEXT:    br label [[COND_END:%.*]]
11492 // CHECK17:       cond.false:
11493 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11494 // CHECK17-NEXT:    br label [[COND_END]]
11495 // CHECK17:       cond.end:
11496 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
11497 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
11498 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
11499 // CHECK17-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
11500 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11501 // CHECK17:       omp.inner.for.cond:
11502 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
11503 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !29
11504 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
11505 // CHECK17-NEXT:    [[CMP6:%.*]] = icmp slt i32 [[TMP15]], [[ADD]]
11506 // CHECK17-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11507 // CHECK17:       omp.inner.for.body:
11508 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
11509 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
11510 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4, !llvm.access.group !29
11511 // CHECK17-NEXT:    store i32 [[TMP19]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !29
11512 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !29
11513 // CHECK17-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..7 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]], i32 [[TMP20]]), !llvm.access.group !29
11514 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11515 // CHECK17:       omp.inner.for.inc:
11516 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
11517 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !29
11518 // CHECK17-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
11519 // CHECK17-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
11520 // CHECK17-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
11521 // CHECK17-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !29
11522 // CHECK17-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
11523 // CHECK17-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
11524 // CHECK17-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
11525 // CHECK17-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !29
11526 // CHECK17-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
11527 // CHECK17-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
11528 // CHECK17-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
11529 // CHECK17-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !29
11530 // CHECK17-NEXT:    [[CMP10:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
11531 // CHECK17-NEXT:    br i1 [[CMP10]], label [[COND_TRUE11:%.*]], label [[COND_FALSE12:%.*]]
11532 // CHECK17:       cond.true11:
11533 // CHECK17-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !29
11534 // CHECK17-NEXT:    br label [[COND_END13:%.*]]
11535 // CHECK17:       cond.false12:
11536 // CHECK17-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
11537 // CHECK17-NEXT:    br label [[COND_END13]]
11538 // CHECK17:       cond.end13:
11539 // CHECK17-NEXT:    [[COND14:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE11]] ], [ [[TMP30]], [[COND_FALSE12]] ]
11540 // CHECK17-NEXT:    store i32 [[COND14]], i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
11541 // CHECK17-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
11542 // CHECK17-NEXT:    store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
11543 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP30:![0-9]+]]
11544 // CHECK17:       omp.inner.for.end:
11545 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
11546 // CHECK17:       omp.loop.exit:
11547 // CHECK17-NEXT:    [[TMP32:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11548 // CHECK17-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
11549 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]])
11550 // CHECK17-NEXT:    [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
11551 // CHECK17-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
11552 // CHECK17-NEXT:    br i1 [[TMP35]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
11553 // CHECK17:       .omp.final.then:
11554 // CHECK17-NEXT:    [[TMP36:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11555 // CHECK17-NEXT:    [[SUB15:%.*]] = sub nsw i32 [[TMP36]], 0
11556 // CHECK17-NEXT:    [[DIV16:%.*]] = sdiv i32 [[SUB15]], 1
11557 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV16]], 1
11558 // CHECK17-NEXT:    [[ADD17:%.*]] = add nsw i32 0, [[MUL]]
11559 // CHECK17-NEXT:    store i32 [[ADD17]], i32* [[I4]], align 4
11560 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
11561 // CHECK17:       .omp.final.done:
11562 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
11563 // CHECK17:       omp.precond.end:
11564 // CHECK17-NEXT:    ret void
11565 //
11566 //
11567 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..7
11568 // CHECK17-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
11569 // CHECK17-NEXT:  entry:
11570 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11571 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11572 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
11573 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
11574 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11575 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11576 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11577 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
11578 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11579 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11580 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11581 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
11582 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
11583 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
11584 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
11585 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11586 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11587 // CHECK17-NEXT:    [[I4:%.*]] = alloca i32, align 4
11588 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11589 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11590 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11591 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11592 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11593 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11594 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11595 // CHECK17-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
11596 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11597 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11598 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11599 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
11600 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11601 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11602 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
11603 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11604 // CHECK17-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
11605 // CHECK17-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
11606 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
11607 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11608 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
11609 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11610 // CHECK17:       omp.precond.then:
11611 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
11612 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11613 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
11614 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11615 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11616 // CHECK17-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
11617 // CHECK17-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
11618 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11619 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11620 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11621 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
11622 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
11623 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
11624 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11625 // CHECK17-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
11626 // CHECK17-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11627 // CHECK17:       cond.true:
11628 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11629 // CHECK17-NEXT:    br label [[COND_END:%.*]]
11630 // CHECK17:       cond.false:
11631 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
11632 // CHECK17-NEXT:    br label [[COND_END]]
11633 // CHECK17:       cond.end:
11634 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
11635 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
11636 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
11637 // CHECK17-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
11638 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11639 // CHECK17:       omp.inner.for.cond:
11640 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
11641 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !32
11642 // CHECK17-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
11643 // CHECK17-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11644 // CHECK17:       omp.inner.for.body:
11645 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
11646 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
11647 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
11648 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !32
11649 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !32
11650 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
11651 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !32
11652 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
11653 // CHECK17:       omp.body.continue:
11654 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11655 // CHECK17:       omp.inner.for.inc:
11656 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
11657 // CHECK17-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
11658 // CHECK17-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
11659 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP33:![0-9]+]]
11660 // CHECK17:       omp.inner.for.end:
11661 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
11662 // CHECK17:       omp.loop.exit:
11663 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11664 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
11665 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
11666 // CHECK17-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
11667 // CHECK17-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
11668 // CHECK17-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
11669 // CHECK17:       .omp.final.then:
11670 // CHECK17-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11671 // CHECK17-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP25]], 0
11672 // CHECK17-NEXT:    [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1
11673 // CHECK17-NEXT:    [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 1
11674 // CHECK17-NEXT:    [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]
11675 // CHECK17-NEXT:    store i32 [[ADD11]], i32* [[I4]], align 4
11676 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
11677 // CHECK17:       .omp.final.done:
11678 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
11679 // CHECK17:       omp.precond.end:
11680 // CHECK17-NEXT:    ret void
11681 //
11682 //
11683 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l169
11684 // CHECK17-SAME: (i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
11685 // CHECK17-NEXT:  entry:
11686 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
11687 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11688 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11689 // CHECK17-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
11690 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11691 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11692 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11693 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11694 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]])
11695 // CHECK17-NEXT:    ret void
11696 //
11697 //
11698 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..10
11699 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
11700 // CHECK17-NEXT:  entry:
11701 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11702 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11703 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11704 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11705 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11706 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11707 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11708 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11709 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11710 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
11711 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
11712 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
11713 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11714 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11715 // CHECK17-NEXT:    [[I3:%.*]] = alloca i32, align 4
11716 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11717 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11718 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11719 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11720 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11721 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11722 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11723 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11724 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
11725 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
11726 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11727 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
11728 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11729 // CHECK17-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
11730 // CHECK17-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11731 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
11732 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11733 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
11734 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11735 // CHECK17:       omp.precond.then:
11736 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
11737 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11738 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
11739 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11740 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11741 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11742 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
11743 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
11744 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11745 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11746 // CHECK17-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
11747 // CHECK17-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11748 // CHECK17:       cond.true:
11749 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11750 // CHECK17-NEXT:    br label [[COND_END:%.*]]
11751 // CHECK17:       cond.false:
11752 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11753 // CHECK17-NEXT:    br label [[COND_END]]
11754 // CHECK17:       cond.end:
11755 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
11756 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
11757 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
11758 // CHECK17-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
11759 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11760 // CHECK17:       omp.inner.for.cond:
11761 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
11762 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !35
11763 // CHECK17-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
11764 // CHECK17-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11765 // CHECK17:       omp.inner.for.body:
11766 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !35
11767 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !35
11768 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32, i32*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP16]], i32 [[TMP17]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !35
11769 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11770 // CHECK17:       omp.inner.for.inc:
11771 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
11772 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !35
11773 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
11774 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
11775 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP36:![0-9]+]]
11776 // CHECK17:       omp.inner.for.end:
11777 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
11778 // CHECK17:       omp.loop.exit:
11779 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11780 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
11781 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
11782 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
11783 // CHECK17-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
11784 // CHECK17-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
11785 // CHECK17:       .omp.final.then:
11786 // CHECK17-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11787 // CHECK17-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP24]], 0
11788 // CHECK17-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
11789 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
11790 // CHECK17-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
11791 // CHECK17-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
11792 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
11793 // CHECK17:       .omp.final.done:
11794 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
11795 // CHECK17:       omp.precond.end:
11796 // CHECK17-NEXT:    ret void
11797 //
11798 //
11799 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..11
11800 // CHECK17-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
11801 // CHECK17-NEXT:  entry:
11802 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11803 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11804 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
11805 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
11806 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11807 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11808 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11809 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11810 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11811 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11812 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11813 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
11814 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
11815 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
11816 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11817 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11818 // CHECK17-NEXT:    [[I3:%.*]] = alloca i32, align 4
11819 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11820 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11821 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11822 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11823 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11824 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11825 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11826 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11827 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11828 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11829 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
11830 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
11831 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11832 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
11833 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11834 // CHECK17-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
11835 // CHECK17-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11836 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
11837 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11838 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
11839 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11840 // CHECK17:       omp.precond.then:
11841 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
11842 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11843 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
11844 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
11845 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
11846 // CHECK17-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
11847 // CHECK17-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
11848 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11849 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11850 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
11851 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
11852 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11853 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
11854 // CHECK17-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP12]], i32 35, i32 [[TMP9]], i32 [[TMP10]], i32 1, i32 1)
11855 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
11856 // CHECK17:       omp.dispatch.cond:
11857 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11858 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
11859 // CHECK17-NEXT:    [[TMP15:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
11860 // CHECK17-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP15]], 0
11861 // CHECK17-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
11862 // CHECK17:       omp.dispatch.body:
11863 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
11864 // CHECK17-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
11865 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11866 // CHECK17:       omp.inner.for.cond:
11867 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
11868 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !38
11869 // CHECK17-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
11870 // CHECK17-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
11871 // CHECK17:       omp.inner.for.body:
11872 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
11873 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
11874 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
11875 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !38
11876 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !38
11877 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP20]]
11878 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !38
11879 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
11880 // CHECK17:       omp.body.continue:
11881 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
11882 // CHECK17:       omp.inner.for.inc:
11883 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
11884 // CHECK17-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP21]], 1
11885 // CHECK17-NEXT:    store i32 [[ADD5]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
11886 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP39:![0-9]+]]
11887 // CHECK17:       omp.inner.for.end:
11888 // CHECK17-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
11889 // CHECK17:       omp.dispatch.inc:
11890 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND]]
11891 // CHECK17:       omp.dispatch.end:
11892 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
11893 // CHECK17-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
11894 // CHECK17-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
11895 // CHECK17:       .omp.final.then:
11896 // CHECK17-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11897 // CHECK17-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP24]], 0
11898 // CHECK17-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
11899 // CHECK17-NEXT:    [[MUL8:%.*]] = mul nsw i32 [[DIV7]], 1
11900 // CHECK17-NEXT:    [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]
11901 // CHECK17-NEXT:    store i32 [[ADD9]], i32* [[I3]], align 4
11902 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
11903 // CHECK17:       .omp.final.done:
11904 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
11905 // CHECK17:       omp.precond.end:
11906 // CHECK17-NEXT:    ret void
11907 //
11908 //
11909 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l174
11910 // CHECK17-SAME: (i32 noundef [[M:%.*]], i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
11911 // CHECK17-NEXT:  entry:
11912 // CHECK17-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
11913 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
11914 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11915 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11916 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
11917 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
11918 // CHECK17-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
11919 // CHECK17-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
11920 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11921 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11922 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11923 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11924 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[M_ADDR]], align 4
11925 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
11926 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
11927 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
11928 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
11929 // CHECK17-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..14 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]], i32 [[TMP4]])
11930 // CHECK17-NEXT:    ret void
11931 //
11932 //
11933 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..14
11934 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
11935 // CHECK17-NEXT:  entry:
11936 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
11937 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
11938 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
11939 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
11940 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
11941 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
11942 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
11943 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
11944 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
11945 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
11946 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
11947 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
11948 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
11949 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
11950 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
11951 // CHECK17-NEXT:    [[I4:%.*]] = alloca i32, align 4
11952 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
11953 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
11954 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
11955 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
11956 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
11957 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
11958 // CHECK17-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
11959 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
11960 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
11961 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
11962 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
11963 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
11964 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11965 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
11966 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
11967 // CHECK17-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
11968 // CHECK17-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
11969 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
11970 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
11971 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
11972 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
11973 // CHECK17:       omp.precond.then:
11974 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
11975 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11976 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
11977 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
11978 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
11979 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
11980 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
11981 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
11982 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11983 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11984 // CHECK17-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
11985 // CHECK17-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
11986 // CHECK17:       cond.true:
11987 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
11988 // CHECK17-NEXT:    br label [[COND_END:%.*]]
11989 // CHECK17:       cond.false:
11990 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
11991 // CHECK17-NEXT:    br label [[COND_END]]
11992 // CHECK17:       cond.end:
11993 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
11994 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
11995 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
11996 // CHECK17-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
11997 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
11998 // CHECK17:       omp.inner.for.cond:
11999 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !41
12000 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !41
12001 // CHECK17-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
12002 // CHECK17-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12003 // CHECK17:       omp.inner.for.body:
12004 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !41
12005 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !41
12006 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4, !llvm.access.group !41
12007 // CHECK17-NEXT:    store i32 [[TMP18]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !41
12008 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !41
12009 // CHECK17-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..15 to void (i32*, i32*, ...)*), i32 [[TMP16]], i32 [[TMP17]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]], i32 [[TMP19]]), !llvm.access.group !41
12010 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12011 // CHECK17:       omp.inner.for.inc:
12012 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !41
12013 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !41
12014 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
12015 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !41
12016 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP42:![0-9]+]]
12017 // CHECK17:       omp.inner.for.end:
12018 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12019 // CHECK17:       omp.loop.exit:
12020 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12021 // CHECK17-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
12022 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
12023 // CHECK17-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
12024 // CHECK17-NEXT:    [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
12025 // CHECK17-NEXT:    br i1 [[TMP25]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
12026 // CHECK17:       .omp.final.then:
12027 // CHECK17-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12028 // CHECK17-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP26]], 0
12029 // CHECK17-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
12030 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV8]], 1
12031 // CHECK17-NEXT:    [[ADD9:%.*]] = add nsw i32 0, [[MUL]]
12032 // CHECK17-NEXT:    store i32 [[ADD9]], i32* [[I4]], align 4
12033 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
12034 // CHECK17:       .omp.final.done:
12035 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
12036 // CHECK17:       omp.precond.end:
12037 // CHECK17-NEXT:    ret void
12038 //
12039 //
12040 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..15
12041 // CHECK17-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
12042 // CHECK17-NEXT:  entry:
12043 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12044 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12045 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
12046 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
12047 // CHECK17-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
12048 // CHECK17-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
12049 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
12050 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
12051 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12052 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12053 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
12054 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
12055 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
12056 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
12057 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
12058 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12059 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12060 // CHECK17-NEXT:    [[I4:%.*]] = alloca i32, align 4
12061 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12062 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12063 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12064 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12065 // CHECK17-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
12066 // CHECK17-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
12067 // CHECK17-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
12068 // CHECK17-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
12069 // CHECK17-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
12070 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
12071 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
12072 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
12073 // CHECK17-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
12074 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12075 // CHECK17-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
12076 // CHECK17-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
12077 // CHECK17-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
12078 // CHECK17-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
12079 // CHECK17-NEXT:    store i32 0, i32* [[I]], align 4
12080 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12081 // CHECK17-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
12082 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
12083 // CHECK17:       omp.precond.then:
12084 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
12085 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
12086 // CHECK17-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
12087 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12088 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12089 // CHECK17-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
12090 // CHECK17-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
12091 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12092 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12093 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
12094 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12095 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12096 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12097 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
12098 // CHECK17-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 35, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 [[TMP9]])
12099 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
12100 // CHECK17:       omp.dispatch.cond:
12101 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12102 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
12103 // CHECK17-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]])
12104 // CHECK17-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
12105 // CHECK17-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
12106 // CHECK17:       omp.dispatch.body:
12107 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12108 // CHECK17-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
12109 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12110 // CHECK17:       omp.inner.for.cond:
12111 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !44
12112 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !44
12113 // CHECK17-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
12114 // CHECK17-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12115 // CHECK17:       omp.inner.for.body:
12116 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !44
12117 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
12118 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
12119 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !44
12120 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !44
12121 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP21]]
12122 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !44
12123 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
12124 // CHECK17:       omp.body.continue:
12125 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12126 // CHECK17:       omp.inner.for.inc:
12127 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !44
12128 // CHECK17-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP22]], 1
12129 // CHECK17-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !44
12130 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP45:![0-9]+]]
12131 // CHECK17:       omp.inner.for.end:
12132 // CHECK17-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
12133 // CHECK17:       omp.dispatch.inc:
12134 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND]]
12135 // CHECK17:       omp.dispatch.end:
12136 // CHECK17-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
12137 // CHECK17-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
12138 // CHECK17-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
12139 // CHECK17:       .omp.final.then:
12140 // CHECK17-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
12141 // CHECK17-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP25]], 0
12142 // CHECK17-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
12143 // CHECK17-NEXT:    [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 1
12144 // CHECK17-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]
12145 // CHECK17-NEXT:    store i32 [[ADD10]], i32* [[I4]], align 4
12146 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
12147 // CHECK17:       .omp.final.done:
12148 // CHECK17-NEXT:    br label [[OMP_PRECOND_END]]
12149 // CHECK17:       omp.precond.end:
12150 // CHECK17-NEXT:    ret void
12151 //
12152 //
12153 // CHECK17-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
12154 // CHECK17-SAME: (i32 noundef [[ARGC:%.*]]) #[[ATTR5:[0-9]+]] comdat {
12155 // CHECK17-NEXT:  entry:
12156 // CHECK17-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
12157 // CHECK17-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
12158 // CHECK17-NEXT:    [[M:%.*]] = alloca i32, align 4
12159 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 4
12160 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 4
12161 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 4
12162 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12163 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 4
12164 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 4
12165 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 4
12166 // CHECK17-NEXT:    [[_TMP4:%.*]] = alloca i32, align 4
12167 // CHECK17-NEXT:    [[M_CASTED:%.*]] = alloca i32, align 4
12168 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS8:%.*]] = alloca [2 x i8*], align 4
12169 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS9:%.*]] = alloca [2 x i8*], align 4
12170 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS10:%.*]] = alloca [2 x i8*], align 4
12171 // CHECK17-NEXT:    [[_TMP11:%.*]] = alloca i32, align 4
12172 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS15:%.*]] = alloca [1 x i8*], align 4
12173 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS16:%.*]] = alloca [1 x i8*], align 4
12174 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS17:%.*]] = alloca [1 x i8*], align 4
12175 // CHECK17-NEXT:    [[_TMP18:%.*]] = alloca i32, align 4
12176 // CHECK17-NEXT:    [[M_CASTED22:%.*]] = alloca i32, align 4
12177 // CHECK17-NEXT:    [[DOTOFFLOAD_BASEPTRS23:%.*]] = alloca [2 x i8*], align 4
12178 // CHECK17-NEXT:    [[DOTOFFLOAD_PTRS24:%.*]] = alloca [2 x i8*], align 4
12179 // CHECK17-NEXT:    [[DOTOFFLOAD_MAPPERS25:%.*]] = alloca [2 x i8*], align 4
12180 // CHECK17-NEXT:    [[_TMP26:%.*]] = alloca i32, align 4
12181 // CHECK17-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
12182 // CHECK17-NEXT:    store i32 10, i32* [[M]], align 4
12183 // CHECK17-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
12184 // CHECK17-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [10 x i32]**
12185 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP1]], align 4
12186 // CHECK17-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
12187 // CHECK17-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [10 x i32]**
12188 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP3]], align 4
12189 // CHECK17-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
12190 // CHECK17-NEXT:    store i8* null, i8** [[TMP4]], align 4
12191 // CHECK17-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
12192 // CHECK17-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
12193 // CHECK17-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
12194 // CHECK17-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
12195 // CHECK17-NEXT:    store i32 1, i32* [[TMP7]], align 4
12196 // CHECK17-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
12197 // CHECK17-NEXT:    store i32 1, i32* [[TMP8]], align 4
12198 // CHECK17-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
12199 // CHECK17-NEXT:    store i8** [[TMP5]], i8*** [[TMP9]], align 4
12200 // CHECK17-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
12201 // CHECK17-NEXT:    store i8** [[TMP6]], i8*** [[TMP10]], align 4
12202 // CHECK17-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
12203 // CHECK17-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.20, i32 0, i32 0), i64** [[TMP11]], align 4
12204 // CHECK17-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
12205 // CHECK17-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.21, i32 0, i32 0), i64** [[TMP12]], align 4
12206 // CHECK17-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
12207 // CHECK17-NEXT:    store i8** null, i8*** [[TMP13]], align 4
12208 // CHECK17-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
12209 // CHECK17-NEXT:    store i8** null, i8*** [[TMP14]], align 4
12210 // CHECK17-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
12211 // CHECK17-NEXT:    store i64 10, i64* [[TMP15]], align 8
12212 // CHECK17-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
12213 // CHECK17-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
12214 // CHECK17-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
12215 // CHECK17:       omp_offload.failed:
12216 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122([10 x i32]* [[A]]) #[[ATTR3]]
12217 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT]]
12218 // CHECK17:       omp_offload.cont:
12219 // CHECK17-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
12220 // CHECK17-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to [10 x i32]**
12221 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP19]], align 4
12222 // CHECK17-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
12223 // CHECK17-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [10 x i32]**
12224 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP21]], align 4
12225 // CHECK17-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i32 0, i32 0
12226 // CHECK17-NEXT:    store i8* null, i8** [[TMP22]], align 4
12227 // CHECK17-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
12228 // CHECK17-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
12229 // CHECK17-NEXT:    [[KERNEL_ARGS5:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
12230 // CHECK17-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 0
12231 // CHECK17-NEXT:    store i32 1, i32* [[TMP25]], align 4
12232 // CHECK17-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 1
12233 // CHECK17-NEXT:    store i32 1, i32* [[TMP26]], align 4
12234 // CHECK17-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 2
12235 // CHECK17-NEXT:    store i8** [[TMP23]], i8*** [[TMP27]], align 4
12236 // CHECK17-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 3
12237 // CHECK17-NEXT:    store i8** [[TMP24]], i8*** [[TMP28]], align 4
12238 // CHECK17-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 4
12239 // CHECK17-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.24, i32 0, i32 0), i64** [[TMP29]], align 4
12240 // CHECK17-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 5
12241 // CHECK17-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.25, i32 0, i32 0), i64** [[TMP30]], align 4
12242 // CHECK17-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 6
12243 // CHECK17-NEXT:    store i8** null, i8*** [[TMP31]], align 4
12244 // CHECK17-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 7
12245 // CHECK17-NEXT:    store i8** null, i8*** [[TMP32]], align 4
12246 // CHECK17-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 8
12247 // CHECK17-NEXT:    store i64 10, i64* [[TMP33]], align 8
12248 // CHECK17-NEXT:    [[TMP34:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]])
12249 // CHECK17-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
12250 // CHECK17-NEXT:    br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
12251 // CHECK17:       omp_offload.failed6:
12252 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127([10 x i32]* [[A]]) #[[ATTR3]]
12253 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT7]]
12254 // CHECK17:       omp_offload.cont7:
12255 // CHECK17-NEXT:    [[TMP36:%.*]] = load i32, i32* [[M]], align 4
12256 // CHECK17-NEXT:    store i32 [[TMP36]], i32* [[M_CASTED]], align 4
12257 // CHECK17-NEXT:    [[TMP37:%.*]] = load i32, i32* [[M_CASTED]], align 4
12258 // CHECK17-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 0
12259 // CHECK17-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to i32*
12260 // CHECK17-NEXT:    store i32 [[TMP37]], i32* [[TMP39]], align 4
12261 // CHECK17-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 0
12262 // CHECK17-NEXT:    [[TMP41:%.*]] = bitcast i8** [[TMP40]] to i32*
12263 // CHECK17-NEXT:    store i32 [[TMP37]], i32* [[TMP41]], align 4
12264 // CHECK17-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS10]], i32 0, i32 0
12265 // CHECK17-NEXT:    store i8* null, i8** [[TMP42]], align 4
12266 // CHECK17-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 1
12267 // CHECK17-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to [10 x i32]**
12268 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP44]], align 4
12269 // CHECK17-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 1
12270 // CHECK17-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to [10 x i32]**
12271 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP46]], align 4
12272 // CHECK17-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS10]], i32 0, i32 1
12273 // CHECK17-NEXT:    store i8* null, i8** [[TMP47]], align 4
12274 // CHECK17-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 0
12275 // CHECK17-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 0
12276 // CHECK17-NEXT:    [[KERNEL_ARGS12:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
12277 // CHECK17-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 0
12278 // CHECK17-NEXT:    store i32 1, i32* [[TMP50]], align 4
12279 // CHECK17-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 1
12280 // CHECK17-NEXT:    store i32 2, i32* [[TMP51]], align 4
12281 // CHECK17-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 2
12282 // CHECK17-NEXT:    store i8** [[TMP48]], i8*** [[TMP52]], align 4
12283 // CHECK17-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 3
12284 // CHECK17-NEXT:    store i8** [[TMP49]], i8*** [[TMP53]], align 4
12285 // CHECK17-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 4
12286 // CHECK17-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.28, i32 0, i32 0), i64** [[TMP54]], align 4
12287 // CHECK17-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 5
12288 // CHECK17-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.29, i32 0, i32 0), i64** [[TMP55]], align 4
12289 // CHECK17-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 6
12290 // CHECK17-NEXT:    store i8** null, i8*** [[TMP56]], align 4
12291 // CHECK17-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 7
12292 // CHECK17-NEXT:    store i8** null, i8*** [[TMP57]], align 4
12293 // CHECK17-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 8
12294 // CHECK17-NEXT:    store i64 10, i64* [[TMP58]], align 8
12295 // CHECK17-NEXT:    [[TMP59:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]])
12296 // CHECK17-NEXT:    [[TMP60:%.*]] = icmp ne i32 [[TMP59]], 0
12297 // CHECK17-NEXT:    br i1 [[TMP60]], label [[OMP_OFFLOAD_FAILED13:%.*]], label [[OMP_OFFLOAD_CONT14:%.*]]
12298 // CHECK17:       omp_offload.failed13:
12299 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132(i32 [[TMP37]], [10 x i32]* [[A]]) #[[ATTR3]]
12300 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT14]]
12301 // CHECK17:       omp_offload.cont14:
12302 // CHECK17-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS15]], i32 0, i32 0
12303 // CHECK17-NEXT:    [[TMP62:%.*]] = bitcast i8** [[TMP61]] to [10 x i32]**
12304 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP62]], align 4
12305 // CHECK17-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS16]], i32 0, i32 0
12306 // CHECK17-NEXT:    [[TMP64:%.*]] = bitcast i8** [[TMP63]] to [10 x i32]**
12307 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP64]], align 4
12308 // CHECK17-NEXT:    [[TMP65:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS17]], i32 0, i32 0
12309 // CHECK17-NEXT:    store i8* null, i8** [[TMP65]], align 4
12310 // CHECK17-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS15]], i32 0, i32 0
12311 // CHECK17-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS16]], i32 0, i32 0
12312 // CHECK17-NEXT:    [[KERNEL_ARGS19:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
12313 // CHECK17-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 0
12314 // CHECK17-NEXT:    store i32 1, i32* [[TMP68]], align 4
12315 // CHECK17-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 1
12316 // CHECK17-NEXT:    store i32 1, i32* [[TMP69]], align 4
12317 // CHECK17-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 2
12318 // CHECK17-NEXT:    store i8** [[TMP66]], i8*** [[TMP70]], align 4
12319 // CHECK17-NEXT:    [[TMP71:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 3
12320 // CHECK17-NEXT:    store i8** [[TMP67]], i8*** [[TMP71]], align 4
12321 // CHECK17-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 4
12322 // CHECK17-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.32, i32 0, i32 0), i64** [[TMP72]], align 4
12323 // CHECK17-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 5
12324 // CHECK17-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.33, i32 0, i32 0), i64** [[TMP73]], align 4
12325 // CHECK17-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 6
12326 // CHECK17-NEXT:    store i8** null, i8*** [[TMP74]], align 4
12327 // CHECK17-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 7
12328 // CHECK17-NEXT:    store i8** null, i8*** [[TMP75]], align 4
12329 // CHECK17-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 8
12330 // CHECK17-NEXT:    store i64 10, i64* [[TMP76]], align 8
12331 // CHECK17-NEXT:    [[TMP77:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]])
12332 // CHECK17-NEXT:    [[TMP78:%.*]] = icmp ne i32 [[TMP77]], 0
12333 // CHECK17-NEXT:    br i1 [[TMP78]], label [[OMP_OFFLOAD_FAILED20:%.*]], label [[OMP_OFFLOAD_CONT21:%.*]]
12334 // CHECK17:       omp_offload.failed20:
12335 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137([10 x i32]* [[A]]) #[[ATTR3]]
12336 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT21]]
12337 // CHECK17:       omp_offload.cont21:
12338 // CHECK17-NEXT:    [[TMP79:%.*]] = load i32, i32* [[M]], align 4
12339 // CHECK17-NEXT:    store i32 [[TMP79]], i32* [[M_CASTED22]], align 4
12340 // CHECK17-NEXT:    [[TMP80:%.*]] = load i32, i32* [[M_CASTED22]], align 4
12341 // CHECK17-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS23]], i32 0, i32 0
12342 // CHECK17-NEXT:    [[TMP82:%.*]] = bitcast i8** [[TMP81]] to i32*
12343 // CHECK17-NEXT:    store i32 [[TMP80]], i32* [[TMP82]], align 4
12344 // CHECK17-NEXT:    [[TMP83:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS24]], i32 0, i32 0
12345 // CHECK17-NEXT:    [[TMP84:%.*]] = bitcast i8** [[TMP83]] to i32*
12346 // CHECK17-NEXT:    store i32 [[TMP80]], i32* [[TMP84]], align 4
12347 // CHECK17-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS25]], i32 0, i32 0
12348 // CHECK17-NEXT:    store i8* null, i8** [[TMP85]], align 4
12349 // CHECK17-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS23]], i32 0, i32 1
12350 // CHECK17-NEXT:    [[TMP87:%.*]] = bitcast i8** [[TMP86]] to [10 x i32]**
12351 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP87]], align 4
12352 // CHECK17-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS24]], i32 0, i32 1
12353 // CHECK17-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to [10 x i32]**
12354 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP89]], align 4
12355 // CHECK17-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS25]], i32 0, i32 1
12356 // CHECK17-NEXT:    store i8* null, i8** [[TMP90]], align 4
12357 // CHECK17-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS23]], i32 0, i32 0
12358 // CHECK17-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS24]], i32 0, i32 0
12359 // CHECK17-NEXT:    [[KERNEL_ARGS27:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
12360 // CHECK17-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 0
12361 // CHECK17-NEXT:    store i32 1, i32* [[TMP93]], align 4
12362 // CHECK17-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 1
12363 // CHECK17-NEXT:    store i32 2, i32* [[TMP94]], align 4
12364 // CHECK17-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 2
12365 // CHECK17-NEXT:    store i8** [[TMP91]], i8*** [[TMP95]], align 4
12366 // CHECK17-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 3
12367 // CHECK17-NEXT:    store i8** [[TMP92]], i8*** [[TMP96]], align 4
12368 // CHECK17-NEXT:    [[TMP97:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 4
12369 // CHECK17-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.36, i32 0, i32 0), i64** [[TMP97]], align 4
12370 // CHECK17-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 5
12371 // CHECK17-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.37, i32 0, i32 0), i64** [[TMP98]], align 4
12372 // CHECK17-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 6
12373 // CHECK17-NEXT:    store i8** null, i8*** [[TMP99]], align 4
12374 // CHECK17-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 7
12375 // CHECK17-NEXT:    store i8** null, i8*** [[TMP100]], align 4
12376 // CHECK17-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 8
12377 // CHECK17-NEXT:    store i64 10, i64* [[TMP101]], align 8
12378 // CHECK17-NEXT:    [[TMP102:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]])
12379 // CHECK17-NEXT:    [[TMP103:%.*]] = icmp ne i32 [[TMP102]], 0
12380 // CHECK17-NEXT:    br i1 [[TMP103]], label [[OMP_OFFLOAD_FAILED28:%.*]], label [[OMP_OFFLOAD_CONT29:%.*]]
12381 // CHECK17:       omp_offload.failed28:
12382 // CHECK17-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142(i32 [[TMP80]], [10 x i32]* [[A]]) #[[ATTR3]]
12383 // CHECK17-NEXT:    br label [[OMP_OFFLOAD_CONT29]]
12384 // CHECK17:       omp_offload.cont29:
12385 // CHECK17-NEXT:    ret i32 0
12386 //
12387 //
12388 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122
12389 // CHECK17-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12390 // CHECK17-NEXT:  entry:
12391 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12392 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12393 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12394 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..18 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
12395 // CHECK17-NEXT:    ret void
12396 //
12397 //
12398 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..18
12399 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12400 // CHECK17-NEXT:  entry:
12401 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12402 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12403 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12404 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12405 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12406 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
12407 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
12408 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12409 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12410 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
12411 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12412 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12413 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12414 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12415 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
12416 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
12417 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12418 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12419 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12420 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
12421 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12422 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12423 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
12424 // CHECK17-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12425 // CHECK17:       cond.true:
12426 // CHECK17-NEXT:    br label [[COND_END:%.*]]
12427 // CHECK17:       cond.false:
12428 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12429 // CHECK17-NEXT:    br label [[COND_END]]
12430 // CHECK17:       cond.end:
12431 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
12432 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
12433 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12434 // CHECK17-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
12435 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12436 // CHECK17:       omp.inner.for.cond:
12437 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !47
12438 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !47
12439 // CHECK17-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
12440 // CHECK17-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12441 // CHECK17:       omp.inner.for.body:
12442 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !47
12443 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !47
12444 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]]), !llvm.access.group !47
12445 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12446 // CHECK17:       omp.inner.for.inc:
12447 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !47
12448 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !47
12449 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
12450 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !47
12451 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP48:![0-9]+]]
12452 // CHECK17:       omp.inner.for.end:
12453 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12454 // CHECK17:       omp.loop.exit:
12455 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
12456 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
12457 // CHECK17-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
12458 // CHECK17-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
12459 // CHECK17:       .omp.final.then:
12460 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
12461 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
12462 // CHECK17:       .omp.final.done:
12463 // CHECK17-NEXT:    ret void
12464 //
12465 //
12466 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..19
12467 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12468 // CHECK17-NEXT:  entry:
12469 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12470 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12471 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
12472 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
12473 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12474 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12475 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12476 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
12477 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
12478 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12479 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12480 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
12481 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12482 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12483 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12484 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12485 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12486 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12487 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
12488 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
12489 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12490 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12491 // CHECK17-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
12492 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
12493 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12494 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12495 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12496 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
12497 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12498 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12499 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
12500 // CHECK17-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12501 // CHECK17:       cond.true:
12502 // CHECK17-NEXT:    br label [[COND_END:%.*]]
12503 // CHECK17:       cond.false:
12504 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12505 // CHECK17-NEXT:    br label [[COND_END]]
12506 // CHECK17:       cond.end:
12507 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
12508 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
12509 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12510 // CHECK17-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
12511 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12512 // CHECK17:       omp.inner.for.cond:
12513 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !50
12514 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !50
12515 // CHECK17-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
12516 // CHECK17-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12517 // CHECK17:       omp.inner.for.body:
12518 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !50
12519 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
12520 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
12521 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !50
12522 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !50
12523 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
12524 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !50
12525 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
12526 // CHECK17:       omp.body.continue:
12527 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12528 // CHECK17:       omp.inner.for.inc:
12529 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !50
12530 // CHECK17-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
12531 // CHECK17-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !50
12532 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP51:![0-9]+]]
12533 // CHECK17:       omp.inner.for.end:
12534 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12535 // CHECK17:       omp.loop.exit:
12536 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
12537 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
12538 // CHECK17-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
12539 // CHECK17-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
12540 // CHECK17:       .omp.final.then:
12541 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
12542 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
12543 // CHECK17:       .omp.final.done:
12544 // CHECK17-NEXT:    ret void
12545 //
12546 //
12547 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127
12548 // CHECK17-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12549 // CHECK17-NEXT:  entry:
12550 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12551 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12552 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12553 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..22 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
12554 // CHECK17-NEXT:    ret void
12555 //
12556 //
12557 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..22
12558 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12559 // CHECK17-NEXT:  entry:
12560 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12561 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12562 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12563 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12564 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12565 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
12566 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
12567 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12568 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12569 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
12570 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12571 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12572 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12573 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12574 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
12575 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
12576 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12577 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12578 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12579 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
12580 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12581 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12582 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
12583 // CHECK17-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12584 // CHECK17:       cond.true:
12585 // CHECK17-NEXT:    br label [[COND_END:%.*]]
12586 // CHECK17:       cond.false:
12587 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12588 // CHECK17-NEXT:    br label [[COND_END]]
12589 // CHECK17:       cond.end:
12590 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
12591 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
12592 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12593 // CHECK17-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
12594 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12595 // CHECK17:       omp.inner.for.cond:
12596 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !53
12597 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !53
12598 // CHECK17-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
12599 // CHECK17-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12600 // CHECK17:       omp.inner.for.body:
12601 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !53
12602 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !53
12603 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]]), !llvm.access.group !53
12604 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12605 // CHECK17:       omp.inner.for.inc:
12606 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !53
12607 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !53
12608 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
12609 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !53
12610 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP54:![0-9]+]]
12611 // CHECK17:       omp.inner.for.end:
12612 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12613 // CHECK17:       omp.loop.exit:
12614 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
12615 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
12616 // CHECK17-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
12617 // CHECK17-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
12618 // CHECK17:       .omp.final.then:
12619 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
12620 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
12621 // CHECK17:       .omp.final.done:
12622 // CHECK17-NEXT:    ret void
12623 //
12624 //
12625 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..23
12626 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12627 // CHECK17-NEXT:  entry:
12628 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12629 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12630 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
12631 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
12632 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12633 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12634 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12635 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
12636 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
12637 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12638 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12639 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
12640 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12641 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12642 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12643 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12644 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12645 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12646 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
12647 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
12648 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12649 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12650 // CHECK17-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
12651 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
12652 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12653 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12654 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12655 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
12656 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12657 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12658 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
12659 // CHECK17-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12660 // CHECK17:       cond.true:
12661 // CHECK17-NEXT:    br label [[COND_END:%.*]]
12662 // CHECK17:       cond.false:
12663 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12664 // CHECK17-NEXT:    br label [[COND_END]]
12665 // CHECK17:       cond.end:
12666 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
12667 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
12668 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12669 // CHECK17-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
12670 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12671 // CHECK17:       omp.inner.for.cond:
12672 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !56
12673 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !56
12674 // CHECK17-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
12675 // CHECK17-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12676 // CHECK17:       omp.inner.for.body:
12677 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !56
12678 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
12679 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
12680 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !56
12681 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !56
12682 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
12683 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !56
12684 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
12685 // CHECK17:       omp.body.continue:
12686 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12687 // CHECK17:       omp.inner.for.inc:
12688 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !56
12689 // CHECK17-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
12690 // CHECK17-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !56
12691 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP57:![0-9]+]]
12692 // CHECK17:       omp.inner.for.end:
12693 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12694 // CHECK17:       omp.loop.exit:
12695 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
12696 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
12697 // CHECK17-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
12698 // CHECK17-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
12699 // CHECK17:       .omp.final.then:
12700 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
12701 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
12702 // CHECK17:       .omp.final.done:
12703 // CHECK17-NEXT:    ret void
12704 //
12705 //
12706 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132
12707 // CHECK17-SAME: (i32 noundef [[M:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12708 // CHECK17-NEXT:  entry:
12709 // CHECK17-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
12710 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12711 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
12712 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
12713 // CHECK17-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
12714 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12715 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12716 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[M_ADDR]], align 4
12717 // CHECK17-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
12718 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
12719 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
12720 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
12721 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*, i32)* @.omp_outlined..26 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i32 [[TMP3]])
12722 // CHECK17-NEXT:    ret void
12723 //
12724 //
12725 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..26
12726 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
12727 // CHECK17-NEXT:  entry:
12728 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12729 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12730 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12731 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
12732 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12733 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12734 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
12735 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
12736 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12737 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12738 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
12739 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
12740 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12741 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12742 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12743 // CHECK17-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
12744 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12745 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
12746 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
12747 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12748 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12749 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12750 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
12751 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12752 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12753 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
12754 // CHECK17-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12755 // CHECK17:       cond.true:
12756 // CHECK17-NEXT:    br label [[COND_END:%.*]]
12757 // CHECK17:       cond.false:
12758 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12759 // CHECK17-NEXT:    br label [[COND_END]]
12760 // CHECK17:       cond.end:
12761 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
12762 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
12763 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12764 // CHECK17-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
12765 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12766 // CHECK17:       omp.inner.for.cond:
12767 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !59
12768 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !59
12769 // CHECK17-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
12770 // CHECK17-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12771 // CHECK17:       omp.inner.for.body:
12772 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !59
12773 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !59
12774 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4, !llvm.access.group !59
12775 // CHECK17-NEXT:    store i32 [[TMP10]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !59
12776 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !59
12777 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*, i32)* @.omp_outlined..27 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]], i32 [[TMP11]]), !llvm.access.group !59
12778 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12779 // CHECK17:       omp.inner.for.inc:
12780 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !59
12781 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !59
12782 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
12783 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !59
12784 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP60:![0-9]+]]
12785 // CHECK17:       omp.inner.for.end:
12786 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12787 // CHECK17:       omp.loop.exit:
12788 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
12789 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
12790 // CHECK17-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
12791 // CHECK17-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
12792 // CHECK17:       .omp.final.then:
12793 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
12794 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
12795 // CHECK17:       .omp.final.done:
12796 // CHECK17-NEXT:    ret void
12797 //
12798 //
12799 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..27
12800 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
12801 // CHECK17-NEXT:  entry:
12802 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12803 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12804 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
12805 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
12806 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12807 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
12808 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12809 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12810 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
12811 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
12812 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12813 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12814 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
12815 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12816 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12817 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12818 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12819 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12820 // CHECK17-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
12821 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12822 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
12823 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
12824 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12825 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12826 // CHECK17-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
12827 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
12828 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12829 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12830 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
12831 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12832 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP4]], align 4
12833 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP5]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP3]])
12834 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
12835 // CHECK17:       omp.dispatch.cond:
12836 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12837 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12838 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP6]], [[TMP7]]
12839 // CHECK17-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12840 // CHECK17:       cond.true:
12841 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12842 // CHECK17-NEXT:    br label [[COND_END:%.*]]
12843 // CHECK17:       cond.false:
12844 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12845 // CHECK17-NEXT:    br label [[COND_END]]
12846 // CHECK17:       cond.end:
12847 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP8]], [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
12848 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
12849 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12850 // CHECK17-NEXT:    store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4
12851 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
12852 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12853 // CHECK17-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
12854 // CHECK17-NEXT:    br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
12855 // CHECK17:       omp.dispatch.body:
12856 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12857 // CHECK17:       omp.inner.for.cond:
12858 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !62
12859 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !62
12860 // CHECK17-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
12861 // CHECK17-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12862 // CHECK17:       omp.inner.for.body:
12863 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !62
12864 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1
12865 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
12866 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !62
12867 // CHECK17-NEXT:    [[TMP16:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !62
12868 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP16]]
12869 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !62
12870 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
12871 // CHECK17:       omp.body.continue:
12872 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12873 // CHECK17:       omp.inner.for.inc:
12874 // CHECK17-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !62
12875 // CHECK17-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP17]], 1
12876 // CHECK17-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !62
12877 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP63:![0-9]+]]
12878 // CHECK17:       omp.inner.for.end:
12879 // CHECK17-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
12880 // CHECK17:       omp.dispatch.inc:
12881 // CHECK17-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
12882 // CHECK17-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
12883 // CHECK17-NEXT:    [[ADD4:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
12884 // CHECK17-NEXT:    store i32 [[ADD4]], i32* [[DOTOMP_LB]], align 4
12885 // CHECK17-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
12886 // CHECK17-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
12887 // CHECK17-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
12888 // CHECK17-NEXT:    store i32 [[ADD5]], i32* [[DOTOMP_UB]], align 4
12889 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND]]
12890 // CHECK17:       omp.dispatch.end:
12891 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP5]])
12892 // CHECK17-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
12893 // CHECK17-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
12894 // CHECK17-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
12895 // CHECK17:       .omp.final.then:
12896 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
12897 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
12898 // CHECK17:       .omp.final.done:
12899 // CHECK17-NEXT:    ret void
12900 //
12901 //
12902 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137
12903 // CHECK17-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12904 // CHECK17-NEXT:  entry:
12905 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12906 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12907 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12908 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
12909 // CHECK17-NEXT:    ret void
12910 //
12911 //
12912 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..30
12913 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12914 // CHECK17-NEXT:  entry:
12915 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12916 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12917 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12918 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12919 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12920 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
12921 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
12922 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12923 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12924 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
12925 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12926 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12927 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
12928 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
12929 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
12930 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
12931 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
12932 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
12933 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
12934 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
12935 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
12936 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12937 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
12938 // CHECK17-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
12939 // CHECK17:       cond.true:
12940 // CHECK17-NEXT:    br label [[COND_END:%.*]]
12941 // CHECK17:       cond.false:
12942 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
12943 // CHECK17-NEXT:    br label [[COND_END]]
12944 // CHECK17:       cond.end:
12945 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
12946 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
12947 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
12948 // CHECK17-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
12949 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
12950 // CHECK17:       omp.inner.for.cond:
12951 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !65
12952 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !65
12953 // CHECK17-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
12954 // CHECK17-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
12955 // CHECK17:       omp.inner.for.body:
12956 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !65
12957 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !65
12958 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]]), !llvm.access.group !65
12959 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
12960 // CHECK17:       omp.inner.for.inc:
12961 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !65
12962 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !65
12963 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
12964 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !65
12965 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP66:![0-9]+]]
12966 // CHECK17:       omp.inner.for.end:
12967 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
12968 // CHECK17:       omp.loop.exit:
12969 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
12970 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
12971 // CHECK17-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
12972 // CHECK17-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
12973 // CHECK17:       .omp.final.then:
12974 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
12975 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
12976 // CHECK17:       .omp.final.done:
12977 // CHECK17-NEXT:    ret void
12978 //
12979 //
12980 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..31
12981 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
12982 // CHECK17-NEXT:  entry:
12983 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
12984 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
12985 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
12986 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
12987 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
12988 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
12989 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
12990 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
12991 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
12992 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
12993 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
12994 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
12995 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
12996 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
12997 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
12998 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
12999 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
13000 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
13001 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
13002 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
13003 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
13004 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
13005 // CHECK17-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
13006 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
13007 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13008 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13009 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13010 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
13011 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13012 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
13013 // CHECK17-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 35, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 1)
13014 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
13015 // CHECK17:       omp.dispatch.cond:
13016 // CHECK17-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
13017 // CHECK17-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
13018 // CHECK17-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
13019 // CHECK17:       omp.dispatch.body:
13020 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13021 // CHECK17-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
13022 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
13023 // CHECK17:       omp.inner.for.cond:
13024 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !68
13025 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !68
13026 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
13027 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
13028 // CHECK17:       omp.inner.for.body:
13029 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !68
13030 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
13031 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
13032 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !68
13033 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !68
13034 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP12]]
13035 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !68
13036 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
13037 // CHECK17:       omp.body.continue:
13038 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13039 // CHECK17:       omp.inner.for.inc:
13040 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !68
13041 // CHECK17-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP13]], 1
13042 // CHECK17-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !68
13043 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP69:![0-9]+]]
13044 // CHECK17:       omp.inner.for.end:
13045 // CHECK17-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
13046 // CHECK17:       omp.dispatch.inc:
13047 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND]]
13048 // CHECK17:       omp.dispatch.end:
13049 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
13050 // CHECK17-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
13051 // CHECK17-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
13052 // CHECK17:       .omp.final.then:
13053 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
13054 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
13055 // CHECK17:       .omp.final.done:
13056 // CHECK17-NEXT:    ret void
13057 //
13058 //
13059 // CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142
13060 // CHECK17-SAME: (i32 noundef [[M:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
13061 // CHECK17-NEXT:  entry:
13062 // CHECK17-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
13063 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
13064 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
13065 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
13066 // CHECK17-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
13067 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
13068 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
13069 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[M_ADDR]], align 4
13070 // CHECK17-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
13071 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13072 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
13073 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
13074 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*, i32)* @.omp_outlined..34 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i32 [[TMP3]])
13075 // CHECK17-NEXT:    ret void
13076 //
13077 //
13078 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..34
13079 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
13080 // CHECK17-NEXT:  entry:
13081 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
13082 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
13083 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
13084 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
13085 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
13086 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13087 // CHECK17-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
13088 // CHECK17-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
13089 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
13090 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
13091 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
13092 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
13093 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
13094 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
13095 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
13096 // CHECK17-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
13097 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
13098 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
13099 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
13100 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13101 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13102 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13103 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
13104 // CHECK17-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
13105 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13106 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
13107 // CHECK17-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
13108 // CHECK17:       cond.true:
13109 // CHECK17-NEXT:    br label [[COND_END:%.*]]
13110 // CHECK17:       cond.false:
13111 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13112 // CHECK17-NEXT:    br label [[COND_END]]
13113 // CHECK17:       cond.end:
13114 // CHECK17-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
13115 // CHECK17-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
13116 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
13117 // CHECK17-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
13118 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
13119 // CHECK17:       omp.inner.for.cond:
13120 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !71
13121 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !71
13122 // CHECK17-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
13123 // CHECK17-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
13124 // CHECK17:       omp.inner.for.body:
13125 // CHECK17-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !71
13126 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !71
13127 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4, !llvm.access.group !71
13128 // CHECK17-NEXT:    store i32 [[TMP10]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !71
13129 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !71
13130 // CHECK17-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*, i32)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]], i32 [[TMP11]]), !llvm.access.group !71
13131 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13132 // CHECK17:       omp.inner.for.inc:
13133 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !71
13134 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !71
13135 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
13136 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !71
13137 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP72:![0-9]+]]
13138 // CHECK17:       omp.inner.for.end:
13139 // CHECK17-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
13140 // CHECK17:       omp.loop.exit:
13141 // CHECK17-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
13142 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
13143 // CHECK17-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
13144 // CHECK17-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
13145 // CHECK17:       .omp.final.then:
13146 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
13147 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
13148 // CHECK17:       .omp.final.done:
13149 // CHECK17-NEXT:    ret void
13150 //
13151 //
13152 // CHECK17-LABEL: define {{[^@]+}}@.omp_outlined..35
13153 // CHECK17-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
13154 // CHECK17-NEXT:  entry:
13155 // CHECK17-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
13156 // CHECK17-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
13157 // CHECK17-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
13158 // CHECK17-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
13159 // CHECK17-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
13160 // CHECK17-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
13161 // CHECK17-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
13162 // CHECK17-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13163 // CHECK17-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
13164 // CHECK17-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
13165 // CHECK17-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
13166 // CHECK17-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
13167 // CHECK17-NEXT:    [[I:%.*]] = alloca i32, align 4
13168 // CHECK17-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
13169 // CHECK17-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
13170 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
13171 // CHECK17-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
13172 // CHECK17-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
13173 // CHECK17-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
13174 // CHECK17-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
13175 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
13176 // CHECK17-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
13177 // CHECK17-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
13178 // CHECK17-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
13179 // CHECK17-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
13180 // CHECK17-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
13181 // CHECK17-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13182 // CHECK17-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13183 // CHECK17-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
13184 // CHECK17-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13185 // CHECK17-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
13186 // CHECK17-NEXT:    [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13187 // CHECK17-NEXT:    [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
13188 // CHECK17-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP7]], i32 35, i32 [[TMP4]], i32 [[TMP5]], i32 1, i32 [[TMP3]])
13189 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
13190 // CHECK17:       omp.dispatch.cond:
13191 // CHECK17-NEXT:    [[TMP8:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP7]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
13192 // CHECK17-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP8]], 0
13193 // CHECK17-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
13194 // CHECK17:       omp.dispatch.body:
13195 // CHECK17-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13196 // CHECK17-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_IV]], align 4
13197 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
13198 // CHECK17:       omp.inner.for.cond:
13199 // CHECK17-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !74
13200 // CHECK17-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !74
13201 // CHECK17-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]
13202 // CHECK17-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
13203 // CHECK17:       omp.inner.for.body:
13204 // CHECK17-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !74
13205 // CHECK17-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP12]], 1
13206 // CHECK17-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
13207 // CHECK17-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !74
13208 // CHECK17-NEXT:    [[TMP13:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !74
13209 // CHECK17-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP13]]
13210 // CHECK17-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !74
13211 // CHECK17-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
13212 // CHECK17:       omp.body.continue:
13213 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13214 // CHECK17:       omp.inner.for.inc:
13215 // CHECK17-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !74
13216 // CHECK17-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP14]], 1
13217 // CHECK17-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !74
13218 // CHECK17-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP75:![0-9]+]]
13219 // CHECK17:       omp.inner.for.end:
13220 // CHECK17-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
13221 // CHECK17:       omp.dispatch.inc:
13222 // CHECK17-NEXT:    br label [[OMP_DISPATCH_COND]]
13223 // CHECK17:       omp.dispatch.end:
13224 // CHECK17-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
13225 // CHECK17-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
13226 // CHECK17-NEXT:    br i1 [[TMP16]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
13227 // CHECK17:       .omp.final.then:
13228 // CHECK17-NEXT:    store i32 10, i32* [[I]], align 4
13229 // CHECK17-NEXT:    br label [[DOTOMP_FINAL_DONE]]
13230 // CHECK17:       .omp.final.done:
13231 // CHECK17-NEXT:    ret void
13232 //
13233 //
13234 // CHECK17-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
13235 // CHECK17-SAME: () #[[ATTR6:[0-9]+]] {
13236 // CHECK17-NEXT:  entry:
13237 // CHECK17-NEXT:    call void @__tgt_register_requires(i64 1)
13238 // CHECK17-NEXT:    ret void
13239 //
13240 //
13241 // CHECK19-LABEL: define {{[^@]+}}@main
13242 // CHECK19-SAME: (i32 noundef [[ARGC:%.*]], i8** noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
13243 // CHECK19-NEXT:  entry:
13244 // CHECK19-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
13245 // CHECK19-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
13246 // CHECK19-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 4
13247 // CHECK19-NEXT:    [[N:%.*]] = alloca i32, align 4
13248 // CHECK19-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 4
13249 // CHECK19-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i32, align 4
13250 // CHECK19-NEXT:    [[M:%.*]] = alloca i32, align 4
13251 // CHECK19-NEXT:    [[N_CASTED:%.*]] = alloca i32, align 4
13252 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
13253 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
13254 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
13255 // CHECK19-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 4
13256 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13257 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
13258 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
13259 // CHECK19-NEXT:    [[N_CASTED3:%.*]] = alloca i32, align 4
13260 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [3 x i8*], align 4
13261 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS5:%.*]] = alloca [3 x i8*], align 4
13262 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [3 x i8*], align 4
13263 // CHECK19-NEXT:    [[DOTOFFLOAD_SIZES7:%.*]] = alloca [3 x i64], align 4
13264 // CHECK19-NEXT:    [[_TMP8:%.*]] = alloca i32, align 4
13265 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4
13266 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
13267 // CHECK19-NEXT:    [[M_CASTED:%.*]] = alloca i32, align 4
13268 // CHECK19-NEXT:    [[N_CASTED18:%.*]] = alloca i32, align 4
13269 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS19:%.*]] = alloca [4 x i8*], align 4
13270 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS20:%.*]] = alloca [4 x i8*], align 4
13271 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS21:%.*]] = alloca [4 x i8*], align 4
13272 // CHECK19-NEXT:    [[DOTOFFLOAD_SIZES22:%.*]] = alloca [4 x i64], align 4
13273 // CHECK19-NEXT:    [[_TMP23:%.*]] = alloca i32, align 4
13274 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_24:%.*]] = alloca i32, align 4
13275 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_25:%.*]] = alloca i32, align 4
13276 // CHECK19-NEXT:    [[N_CASTED33:%.*]] = alloca i32, align 4
13277 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS34:%.*]] = alloca [3 x i8*], align 4
13278 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS35:%.*]] = alloca [3 x i8*], align 4
13279 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS36:%.*]] = alloca [3 x i8*], align 4
13280 // CHECK19-NEXT:    [[DOTOFFLOAD_SIZES37:%.*]] = alloca [3 x i64], align 4
13281 // CHECK19-NEXT:    [[_TMP38:%.*]] = alloca i32, align 4
13282 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_39:%.*]] = alloca i32, align 4
13283 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_40:%.*]] = alloca i32, align 4
13284 // CHECK19-NEXT:    [[M_CASTED48:%.*]] = alloca i32, align 4
13285 // CHECK19-NEXT:    [[N_CASTED49:%.*]] = alloca i32, align 4
13286 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS50:%.*]] = alloca [4 x i8*], align 4
13287 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS51:%.*]] = alloca [4 x i8*], align 4
13288 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS52:%.*]] = alloca [4 x i8*], align 4
13289 // CHECK19-NEXT:    [[DOTOFFLOAD_SIZES53:%.*]] = alloca [4 x i64], align 4
13290 // CHECK19-NEXT:    [[_TMP54:%.*]] = alloca i32, align 4
13291 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_55:%.*]] = alloca i32, align 4
13292 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_56:%.*]] = alloca i32, align 4
13293 // CHECK19-NEXT:    store i32 0, i32* [[RETVAL]], align 4
13294 // CHECK19-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
13295 // CHECK19-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 4
13296 // CHECK19-NEXT:    store i32 100, i32* [[N]], align 4
13297 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
13298 // CHECK19-NEXT:    [[TMP1:%.*]] = call i8* @llvm.stacksave()
13299 // CHECK19-NEXT:    store i8* [[TMP1]], i8** [[SAVED_STACK]], align 4
13300 // CHECK19-NEXT:    [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 4
13301 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[__VLA_EXPR0]], align 4
13302 // CHECK19-NEXT:    store i32 10, i32* [[M]], align 4
13303 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[N]], align 4
13304 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[N_CASTED]], align 4
13305 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[N_CASTED]], align 4
13306 // CHECK19-NEXT:    [[TMP4:%.*]] = mul nuw i32 [[TMP0]], 4
13307 // CHECK19-NEXT:    [[TMP5:%.*]] = sext i32 [[TMP4]] to i64
13308 // CHECK19-NEXT:    [[TMP6:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
13309 // CHECK19-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP6]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes to i8*), i32 24, i1 false)
13310 // CHECK19-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
13311 // CHECK19-NEXT:    [[TMP8:%.*]] = bitcast i8** [[TMP7]] to i32*
13312 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[TMP8]], align 4
13313 // CHECK19-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
13314 // CHECK19-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to i32*
13315 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[TMP10]], align 4
13316 // CHECK19-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
13317 // CHECK19-NEXT:    store i8* null, i8** [[TMP11]], align 4
13318 // CHECK19-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
13319 // CHECK19-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i32*
13320 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP13]], align 4
13321 // CHECK19-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
13322 // CHECK19-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i32*
13323 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP15]], align 4
13324 // CHECK19-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
13325 // CHECK19-NEXT:    store i8* null, i8** [[TMP16]], align 4
13326 // CHECK19-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
13327 // CHECK19-NEXT:    [[TMP18:%.*]] = bitcast i8** [[TMP17]] to i32**
13328 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP18]], align 4
13329 // CHECK19-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
13330 // CHECK19-NEXT:    [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i32**
13331 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP20]], align 4
13332 // CHECK19-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
13333 // CHECK19-NEXT:    store i64 [[TMP5]], i64* [[TMP21]], align 4
13334 // CHECK19-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
13335 // CHECK19-NEXT:    store i8* null, i8** [[TMP22]], align 4
13336 // CHECK19-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
13337 // CHECK19-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
13338 // CHECK19-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
13339 // CHECK19-NEXT:    [[TMP26:%.*]] = load i32, i32* [[N]], align 4
13340 // CHECK19-NEXT:    store i32 [[TMP26]], i32* [[DOTCAPTURE_EXPR_]], align 4
13341 // CHECK19-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13342 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP27]], 0
13343 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
13344 // CHECK19-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
13345 // CHECK19-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
13346 // CHECK19-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13347 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP28]], 1
13348 // CHECK19-NEXT:    [[TMP29:%.*]] = zext i32 [[ADD]] to i64
13349 // CHECK19-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
13350 // CHECK19-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
13351 // CHECK19-NEXT:    store i32 1, i32* [[TMP30]], align 4
13352 // CHECK19-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
13353 // CHECK19-NEXT:    store i32 3, i32* [[TMP31]], align 4
13354 // CHECK19-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
13355 // CHECK19-NEXT:    store i8** [[TMP23]], i8*** [[TMP32]], align 4
13356 // CHECK19-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
13357 // CHECK19-NEXT:    store i8** [[TMP24]], i8*** [[TMP33]], align 4
13358 // CHECK19-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
13359 // CHECK19-NEXT:    store i64* [[TMP25]], i64** [[TMP34]], align 4
13360 // CHECK19-NEXT:    [[TMP35:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
13361 // CHECK19-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP35]], align 4
13362 // CHECK19-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
13363 // CHECK19-NEXT:    store i8** null, i8*** [[TMP36]], align 4
13364 // CHECK19-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
13365 // CHECK19-NEXT:    store i8** null, i8*** [[TMP37]], align 4
13366 // CHECK19-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
13367 // CHECK19-NEXT:    store i64 [[TMP29]], i64* [[TMP38]], align 8
13368 // CHECK19-NEXT:    [[TMP39:%.*]] = 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_l154.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
13369 // CHECK19-NEXT:    [[TMP40:%.*]] = icmp ne i32 [[TMP39]], 0
13370 // CHECK19-NEXT:    br i1 [[TMP40]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
13371 // CHECK19:       omp_offload.failed:
13372 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l154(i32 [[TMP3]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3:[0-9]+]]
13373 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT]]
13374 // CHECK19:       omp_offload.cont:
13375 // CHECK19-NEXT:    [[TMP41:%.*]] = load i32, i32* [[N]], align 4
13376 // CHECK19-NEXT:    store i32 [[TMP41]], i32* [[N_CASTED3]], align 4
13377 // CHECK19-NEXT:    [[TMP42:%.*]] = load i32, i32* [[N_CASTED3]], align 4
13378 // CHECK19-NEXT:    [[TMP43:%.*]] = mul nuw i32 [[TMP0]], 4
13379 // CHECK19-NEXT:    [[TMP44:%.*]] = sext i32 [[TMP43]] to i64
13380 // CHECK19-NEXT:    [[TMP45:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES7]] to i8*
13381 // CHECK19-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP45]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes.4 to i8*), i32 24, i1 false)
13382 // CHECK19-NEXT:    [[TMP46:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
13383 // CHECK19-NEXT:    [[TMP47:%.*]] = bitcast i8** [[TMP46]] to i32*
13384 // CHECK19-NEXT:    store i32 [[TMP42]], i32* [[TMP47]], align 4
13385 // CHECK19-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
13386 // CHECK19-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to i32*
13387 // CHECK19-NEXT:    store i32 [[TMP42]], i32* [[TMP49]], align 4
13388 // CHECK19-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 0
13389 // CHECK19-NEXT:    store i8* null, i8** [[TMP50]], align 4
13390 // CHECK19-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 1
13391 // CHECK19-NEXT:    [[TMP52:%.*]] = bitcast i8** [[TMP51]] to i32*
13392 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP52]], align 4
13393 // CHECK19-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 1
13394 // CHECK19-NEXT:    [[TMP54:%.*]] = bitcast i8** [[TMP53]] to i32*
13395 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP54]], align 4
13396 // CHECK19-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 1
13397 // CHECK19-NEXT:    store i8* null, i8** [[TMP55]], align 4
13398 // CHECK19-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 2
13399 // CHECK19-NEXT:    [[TMP57:%.*]] = bitcast i8** [[TMP56]] to i32**
13400 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP57]], align 4
13401 // CHECK19-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 2
13402 // CHECK19-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
13403 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP59]], align 4
13404 // CHECK19-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 2
13405 // CHECK19-NEXT:    store i64 [[TMP44]], i64* [[TMP60]], align 4
13406 // CHECK19-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 2
13407 // CHECK19-NEXT:    store i8* null, i8** [[TMP61]], align 4
13408 // CHECK19-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
13409 // CHECK19-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
13410 // CHECK19-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 0
13411 // CHECK19-NEXT:    [[TMP65:%.*]] = load i32, i32* [[N]], align 4
13412 // CHECK19-NEXT:    store i32 [[TMP65]], i32* [[DOTCAPTURE_EXPR_9]], align 4
13413 // CHECK19-NEXT:    [[TMP66:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_9]], align 4
13414 // CHECK19-NEXT:    [[SUB11:%.*]] = sub nsw i32 [[TMP66]], 0
13415 // CHECK19-NEXT:    [[DIV12:%.*]] = sdiv i32 [[SUB11]], 1
13416 // CHECK19-NEXT:    [[SUB13:%.*]] = sub nsw i32 [[DIV12]], 1
13417 // CHECK19-NEXT:    store i32 [[SUB13]], i32* [[DOTCAPTURE_EXPR_10]], align 4
13418 // CHECK19-NEXT:    [[TMP67:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
13419 // CHECK19-NEXT:    [[ADD14:%.*]] = add nsw i32 [[TMP67]], 1
13420 // CHECK19-NEXT:    [[TMP68:%.*]] = zext i32 [[ADD14]] to i64
13421 // CHECK19-NEXT:    [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
13422 // CHECK19-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 0
13423 // CHECK19-NEXT:    store i32 1, i32* [[TMP69]], align 4
13424 // CHECK19-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 1
13425 // CHECK19-NEXT:    store i32 3, i32* [[TMP70]], align 4
13426 // CHECK19-NEXT:    [[TMP71:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 2
13427 // CHECK19-NEXT:    store i8** [[TMP62]], i8*** [[TMP71]], align 4
13428 // CHECK19-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 3
13429 // CHECK19-NEXT:    store i8** [[TMP63]], i8*** [[TMP72]], align 4
13430 // CHECK19-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 4
13431 // CHECK19-NEXT:    store i64* [[TMP64]], i64** [[TMP73]], align 4
13432 // CHECK19-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 5
13433 // CHECK19-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.5, i32 0, i32 0), i64** [[TMP74]], align 4
13434 // CHECK19-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 6
13435 // CHECK19-NEXT:    store i8** null, i8*** [[TMP75]], align 4
13436 // CHECK19-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 7
13437 // CHECK19-NEXT:    store i8** null, i8*** [[TMP76]], align 4
13438 // CHECK19-NEXT:    [[TMP77:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]], i32 0, i32 8
13439 // CHECK19-NEXT:    store i64 [[TMP68]], i64* [[TMP77]], align 8
13440 // CHECK19-NEXT:    [[TMP78:%.*]] = 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_l159.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS15]])
13441 // CHECK19-NEXT:    [[TMP79:%.*]] = icmp ne i32 [[TMP78]], 0
13442 // CHECK19-NEXT:    br i1 [[TMP79]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
13443 // CHECK19:       omp_offload.failed16:
13444 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l159(i32 [[TMP42]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
13445 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
13446 // CHECK19:       omp_offload.cont17:
13447 // CHECK19-NEXT:    [[TMP80:%.*]] = load i32, i32* [[M]], align 4
13448 // CHECK19-NEXT:    store i32 [[TMP80]], i32* [[M_CASTED]], align 4
13449 // CHECK19-NEXT:    [[TMP81:%.*]] = load i32, i32* [[M_CASTED]], align 4
13450 // CHECK19-NEXT:    [[TMP82:%.*]] = load i32, i32* [[N]], align 4
13451 // CHECK19-NEXT:    store i32 [[TMP82]], i32* [[N_CASTED18]], align 4
13452 // CHECK19-NEXT:    [[TMP83:%.*]] = load i32, i32* [[N_CASTED18]], align 4
13453 // CHECK19-NEXT:    [[TMP84:%.*]] = mul nuw i32 [[TMP0]], 4
13454 // CHECK19-NEXT:    [[TMP85:%.*]] = sext i32 [[TMP84]] to i64
13455 // CHECK19-NEXT:    [[TMP86:%.*]] = bitcast [4 x i64]* [[DOTOFFLOAD_SIZES22]] to i8*
13456 // CHECK19-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP86]], i8* align 4 bitcast ([4 x i64]* @.offload_sizes.8 to i8*), i32 32, i1 false)
13457 // CHECK19-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
13458 // CHECK19-NEXT:    [[TMP88:%.*]] = bitcast i8** [[TMP87]] to i32*
13459 // CHECK19-NEXT:    store i32 [[TMP81]], i32* [[TMP88]], align 4
13460 // CHECK19-NEXT:    [[TMP89:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
13461 // CHECK19-NEXT:    [[TMP90:%.*]] = bitcast i8** [[TMP89]] to i32*
13462 // CHECK19-NEXT:    store i32 [[TMP81]], i32* [[TMP90]], align 4
13463 // CHECK19-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 0
13464 // CHECK19-NEXT:    store i8* null, i8** [[TMP91]], align 4
13465 // CHECK19-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 1
13466 // CHECK19-NEXT:    [[TMP93:%.*]] = bitcast i8** [[TMP92]] to i32*
13467 // CHECK19-NEXT:    store i32 [[TMP83]], i32* [[TMP93]], align 4
13468 // CHECK19-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 1
13469 // CHECK19-NEXT:    [[TMP95:%.*]] = bitcast i8** [[TMP94]] to i32*
13470 // CHECK19-NEXT:    store i32 [[TMP83]], i32* [[TMP95]], align 4
13471 // CHECK19-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 1
13472 // CHECK19-NEXT:    store i8* null, i8** [[TMP96]], align 4
13473 // CHECK19-NEXT:    [[TMP97:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 2
13474 // CHECK19-NEXT:    [[TMP98:%.*]] = bitcast i8** [[TMP97]] to i32*
13475 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP98]], align 4
13476 // CHECK19-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 2
13477 // CHECK19-NEXT:    [[TMP100:%.*]] = bitcast i8** [[TMP99]] to i32*
13478 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP100]], align 4
13479 // CHECK19-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 2
13480 // CHECK19-NEXT:    store i8* null, i8** [[TMP101]], align 4
13481 // CHECK19-NEXT:    [[TMP102:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 3
13482 // CHECK19-NEXT:    [[TMP103:%.*]] = bitcast i8** [[TMP102]] to i32**
13483 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP103]], align 4
13484 // CHECK19-NEXT:    [[TMP104:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 3
13485 // CHECK19-NEXT:    [[TMP105:%.*]] = bitcast i8** [[TMP104]] to i32**
13486 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP105]], align 4
13487 // CHECK19-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES22]], i32 0, i32 3
13488 // CHECK19-NEXT:    store i64 [[TMP85]], i64* [[TMP106]], align 4
13489 // CHECK19-NEXT:    [[TMP107:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS21]], i32 0, i32 3
13490 // CHECK19-NEXT:    store i8* null, i8** [[TMP107]], align 4
13491 // CHECK19-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS19]], i32 0, i32 0
13492 // CHECK19-NEXT:    [[TMP109:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS20]], i32 0, i32 0
13493 // CHECK19-NEXT:    [[TMP110:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES22]], i32 0, i32 0
13494 // CHECK19-NEXT:    [[TMP111:%.*]] = load i32, i32* [[N]], align 4
13495 // CHECK19-NEXT:    store i32 [[TMP111]], i32* [[DOTCAPTURE_EXPR_24]], align 4
13496 // CHECK19-NEXT:    [[TMP112:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_24]], align 4
13497 // CHECK19-NEXT:    [[SUB26:%.*]] = sub nsw i32 [[TMP112]], 0
13498 // CHECK19-NEXT:    [[DIV27:%.*]] = sdiv i32 [[SUB26]], 1
13499 // CHECK19-NEXT:    [[SUB28:%.*]] = sub nsw i32 [[DIV27]], 1
13500 // CHECK19-NEXT:    store i32 [[SUB28]], i32* [[DOTCAPTURE_EXPR_25]], align 4
13501 // CHECK19-NEXT:    [[TMP113:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4
13502 // CHECK19-NEXT:    [[ADD29:%.*]] = add nsw i32 [[TMP113]], 1
13503 // CHECK19-NEXT:    [[TMP114:%.*]] = zext i32 [[ADD29]] to i64
13504 // CHECK19-NEXT:    [[KERNEL_ARGS30:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
13505 // CHECK19-NEXT:    [[TMP115:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 0
13506 // CHECK19-NEXT:    store i32 1, i32* [[TMP115]], align 4
13507 // CHECK19-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 1
13508 // CHECK19-NEXT:    store i32 4, i32* [[TMP116]], align 4
13509 // CHECK19-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 2
13510 // CHECK19-NEXT:    store i8** [[TMP108]], i8*** [[TMP117]], align 4
13511 // CHECK19-NEXT:    [[TMP118:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 3
13512 // CHECK19-NEXT:    store i8** [[TMP109]], i8*** [[TMP118]], align 4
13513 // CHECK19-NEXT:    [[TMP119:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 4
13514 // CHECK19-NEXT:    store i64* [[TMP110]], i64** [[TMP119]], align 4
13515 // CHECK19-NEXT:    [[TMP120:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 5
13516 // CHECK19-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.9, i32 0, i32 0), i64** [[TMP120]], align 4
13517 // CHECK19-NEXT:    [[TMP121:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 6
13518 // CHECK19-NEXT:    store i8** null, i8*** [[TMP121]], align 4
13519 // CHECK19-NEXT:    [[TMP122:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 7
13520 // CHECK19-NEXT:    store i8** null, i8*** [[TMP122]], align 4
13521 // CHECK19-NEXT:    [[TMP123:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]], i32 0, i32 8
13522 // CHECK19-NEXT:    store i64 [[TMP114]], i64* [[TMP123]], align 8
13523 // CHECK19-NEXT:    [[TMP124:%.*]] = 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_l164.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS30]])
13524 // CHECK19-NEXT:    [[TMP125:%.*]] = icmp ne i32 [[TMP124]], 0
13525 // CHECK19-NEXT:    br i1 [[TMP125]], label [[OMP_OFFLOAD_FAILED31:%.*]], label [[OMP_OFFLOAD_CONT32:%.*]]
13526 // CHECK19:       omp_offload.failed31:
13527 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l164(i32 [[TMP81]], i32 [[TMP83]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
13528 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT32]]
13529 // CHECK19:       omp_offload.cont32:
13530 // CHECK19-NEXT:    [[TMP126:%.*]] = load i32, i32* [[N]], align 4
13531 // CHECK19-NEXT:    store i32 [[TMP126]], i32* [[N_CASTED33]], align 4
13532 // CHECK19-NEXT:    [[TMP127:%.*]] = load i32, i32* [[N_CASTED33]], align 4
13533 // CHECK19-NEXT:    [[TMP128:%.*]] = mul nuw i32 [[TMP0]], 4
13534 // CHECK19-NEXT:    [[TMP129:%.*]] = sext i32 [[TMP128]] to i64
13535 // CHECK19-NEXT:    [[TMP130:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES37]] to i8*
13536 // CHECK19-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP130]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes.12 to i8*), i32 24, i1 false)
13537 // CHECK19-NEXT:    [[TMP131:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS34]], i32 0, i32 0
13538 // CHECK19-NEXT:    [[TMP132:%.*]] = bitcast i8** [[TMP131]] to i32*
13539 // CHECK19-NEXT:    store i32 [[TMP127]], i32* [[TMP132]], align 4
13540 // CHECK19-NEXT:    [[TMP133:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS35]], i32 0, i32 0
13541 // CHECK19-NEXT:    [[TMP134:%.*]] = bitcast i8** [[TMP133]] to i32*
13542 // CHECK19-NEXT:    store i32 [[TMP127]], i32* [[TMP134]], align 4
13543 // CHECK19-NEXT:    [[TMP135:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS36]], i32 0, i32 0
13544 // CHECK19-NEXT:    store i8* null, i8** [[TMP135]], align 4
13545 // CHECK19-NEXT:    [[TMP136:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS34]], i32 0, i32 1
13546 // CHECK19-NEXT:    [[TMP137:%.*]] = bitcast i8** [[TMP136]] to i32*
13547 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP137]], align 4
13548 // CHECK19-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS35]], i32 0, i32 1
13549 // CHECK19-NEXT:    [[TMP139:%.*]] = bitcast i8** [[TMP138]] to i32*
13550 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP139]], align 4
13551 // CHECK19-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS36]], i32 0, i32 1
13552 // CHECK19-NEXT:    store i8* null, i8** [[TMP140]], align 4
13553 // CHECK19-NEXT:    [[TMP141:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS34]], i32 0, i32 2
13554 // CHECK19-NEXT:    [[TMP142:%.*]] = bitcast i8** [[TMP141]] to i32**
13555 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP142]], align 4
13556 // CHECK19-NEXT:    [[TMP143:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS35]], i32 0, i32 2
13557 // CHECK19-NEXT:    [[TMP144:%.*]] = bitcast i8** [[TMP143]] to i32**
13558 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP144]], align 4
13559 // CHECK19-NEXT:    [[TMP145:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES37]], i32 0, i32 2
13560 // CHECK19-NEXT:    store i64 [[TMP129]], i64* [[TMP145]], align 4
13561 // CHECK19-NEXT:    [[TMP146:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS36]], i32 0, i32 2
13562 // CHECK19-NEXT:    store i8* null, i8** [[TMP146]], align 4
13563 // CHECK19-NEXT:    [[TMP147:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS34]], i32 0, i32 0
13564 // CHECK19-NEXT:    [[TMP148:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS35]], i32 0, i32 0
13565 // CHECK19-NEXT:    [[TMP149:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES37]], i32 0, i32 0
13566 // CHECK19-NEXT:    [[TMP150:%.*]] = load i32, i32* [[N]], align 4
13567 // CHECK19-NEXT:    store i32 [[TMP150]], i32* [[DOTCAPTURE_EXPR_39]], align 4
13568 // CHECK19-NEXT:    [[TMP151:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_39]], align 4
13569 // CHECK19-NEXT:    [[SUB41:%.*]] = sub nsw i32 [[TMP151]], 0
13570 // CHECK19-NEXT:    [[DIV42:%.*]] = sdiv i32 [[SUB41]], 1
13571 // CHECK19-NEXT:    [[SUB43:%.*]] = sub nsw i32 [[DIV42]], 1
13572 // CHECK19-NEXT:    store i32 [[SUB43]], i32* [[DOTCAPTURE_EXPR_40]], align 4
13573 // CHECK19-NEXT:    [[TMP152:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_40]], align 4
13574 // CHECK19-NEXT:    [[ADD44:%.*]] = add nsw i32 [[TMP152]], 1
13575 // CHECK19-NEXT:    [[TMP153:%.*]] = zext i32 [[ADD44]] to i64
13576 // CHECK19-NEXT:    [[KERNEL_ARGS45:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
13577 // CHECK19-NEXT:    [[TMP154:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 0
13578 // CHECK19-NEXT:    store i32 1, i32* [[TMP154]], align 4
13579 // CHECK19-NEXT:    [[TMP155:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 1
13580 // CHECK19-NEXT:    store i32 3, i32* [[TMP155]], align 4
13581 // CHECK19-NEXT:    [[TMP156:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 2
13582 // CHECK19-NEXT:    store i8** [[TMP147]], i8*** [[TMP156]], align 4
13583 // CHECK19-NEXT:    [[TMP157:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 3
13584 // CHECK19-NEXT:    store i8** [[TMP148]], i8*** [[TMP157]], align 4
13585 // CHECK19-NEXT:    [[TMP158:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 4
13586 // CHECK19-NEXT:    store i64* [[TMP149]], i64** [[TMP158]], align 4
13587 // CHECK19-NEXT:    [[TMP159:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 5
13588 // CHECK19-NEXT:    store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.13, i32 0, i32 0), i64** [[TMP159]], align 4
13589 // CHECK19-NEXT:    [[TMP160:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 6
13590 // CHECK19-NEXT:    store i8** null, i8*** [[TMP160]], align 4
13591 // CHECK19-NEXT:    [[TMP161:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 7
13592 // CHECK19-NEXT:    store i8** null, i8*** [[TMP161]], align 4
13593 // CHECK19-NEXT:    [[TMP162:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]], i32 0, i32 8
13594 // CHECK19-NEXT:    store i64 [[TMP153]], i64* [[TMP162]], align 8
13595 // CHECK19-NEXT:    [[TMP163:%.*]] = 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_l169.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS45]])
13596 // CHECK19-NEXT:    [[TMP164:%.*]] = icmp ne i32 [[TMP163]], 0
13597 // CHECK19-NEXT:    br i1 [[TMP164]], label [[OMP_OFFLOAD_FAILED46:%.*]], label [[OMP_OFFLOAD_CONT47:%.*]]
13598 // CHECK19:       omp_offload.failed46:
13599 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l169(i32 [[TMP127]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
13600 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT47]]
13601 // CHECK19:       omp_offload.cont47:
13602 // CHECK19-NEXT:    [[TMP165:%.*]] = load i32, i32* [[M]], align 4
13603 // CHECK19-NEXT:    store i32 [[TMP165]], i32* [[M_CASTED48]], align 4
13604 // CHECK19-NEXT:    [[TMP166:%.*]] = load i32, i32* [[M_CASTED48]], align 4
13605 // CHECK19-NEXT:    [[TMP167:%.*]] = load i32, i32* [[N]], align 4
13606 // CHECK19-NEXT:    store i32 [[TMP167]], i32* [[N_CASTED49]], align 4
13607 // CHECK19-NEXT:    [[TMP168:%.*]] = load i32, i32* [[N_CASTED49]], align 4
13608 // CHECK19-NEXT:    [[TMP169:%.*]] = mul nuw i32 [[TMP0]], 4
13609 // CHECK19-NEXT:    [[TMP170:%.*]] = sext i32 [[TMP169]] to i64
13610 // CHECK19-NEXT:    [[TMP171:%.*]] = bitcast [4 x i64]* [[DOTOFFLOAD_SIZES53]] to i8*
13611 // CHECK19-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP171]], i8* align 4 bitcast ([4 x i64]* @.offload_sizes.16 to i8*), i32 32, i1 false)
13612 // CHECK19-NEXT:    [[TMP172:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 0
13613 // CHECK19-NEXT:    [[TMP173:%.*]] = bitcast i8** [[TMP172]] to i32*
13614 // CHECK19-NEXT:    store i32 [[TMP166]], i32* [[TMP173]], align 4
13615 // CHECK19-NEXT:    [[TMP174:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 0
13616 // CHECK19-NEXT:    [[TMP175:%.*]] = bitcast i8** [[TMP174]] to i32*
13617 // CHECK19-NEXT:    store i32 [[TMP166]], i32* [[TMP175]], align 4
13618 // CHECK19-NEXT:    [[TMP176:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS52]], i32 0, i32 0
13619 // CHECK19-NEXT:    store i8* null, i8** [[TMP176]], align 4
13620 // CHECK19-NEXT:    [[TMP177:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 1
13621 // CHECK19-NEXT:    [[TMP178:%.*]] = bitcast i8** [[TMP177]] to i32*
13622 // CHECK19-NEXT:    store i32 [[TMP168]], i32* [[TMP178]], align 4
13623 // CHECK19-NEXT:    [[TMP179:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 1
13624 // CHECK19-NEXT:    [[TMP180:%.*]] = bitcast i8** [[TMP179]] to i32*
13625 // CHECK19-NEXT:    store i32 [[TMP168]], i32* [[TMP180]], align 4
13626 // CHECK19-NEXT:    [[TMP181:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS52]], i32 0, i32 1
13627 // CHECK19-NEXT:    store i8* null, i8** [[TMP181]], align 4
13628 // CHECK19-NEXT:    [[TMP182:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 2
13629 // CHECK19-NEXT:    [[TMP183:%.*]] = bitcast i8** [[TMP182]] to i32*
13630 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP183]], align 4
13631 // CHECK19-NEXT:    [[TMP184:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 2
13632 // CHECK19-NEXT:    [[TMP185:%.*]] = bitcast i8** [[TMP184]] to i32*
13633 // CHECK19-NEXT:    store i32 [[TMP0]], i32* [[TMP185]], align 4
13634 // CHECK19-NEXT:    [[TMP186:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS52]], i32 0, i32 2
13635 // CHECK19-NEXT:    store i8* null, i8** [[TMP186]], align 4
13636 // CHECK19-NEXT:    [[TMP187:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 3
13637 // CHECK19-NEXT:    [[TMP188:%.*]] = bitcast i8** [[TMP187]] to i32**
13638 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP188]], align 4
13639 // CHECK19-NEXT:    [[TMP189:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 3
13640 // CHECK19-NEXT:    [[TMP190:%.*]] = bitcast i8** [[TMP189]] to i32**
13641 // CHECK19-NEXT:    store i32* [[VLA]], i32** [[TMP190]], align 4
13642 // CHECK19-NEXT:    [[TMP191:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES53]], i32 0, i32 3
13643 // CHECK19-NEXT:    store i64 [[TMP170]], i64* [[TMP191]], align 4
13644 // CHECK19-NEXT:    [[TMP192:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS52]], i32 0, i32 3
13645 // CHECK19-NEXT:    store i8* null, i8** [[TMP192]], align 4
13646 // CHECK19-NEXT:    [[TMP193:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS50]], i32 0, i32 0
13647 // CHECK19-NEXT:    [[TMP194:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS51]], i32 0, i32 0
13648 // CHECK19-NEXT:    [[TMP195:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES53]], i32 0, i32 0
13649 // CHECK19-NEXT:    [[TMP196:%.*]] = load i32, i32* [[N]], align 4
13650 // CHECK19-NEXT:    store i32 [[TMP196]], i32* [[DOTCAPTURE_EXPR_55]], align 4
13651 // CHECK19-NEXT:    [[TMP197:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_55]], align 4
13652 // CHECK19-NEXT:    [[SUB57:%.*]] = sub nsw i32 [[TMP197]], 0
13653 // CHECK19-NEXT:    [[DIV58:%.*]] = sdiv i32 [[SUB57]], 1
13654 // CHECK19-NEXT:    [[SUB59:%.*]] = sub nsw i32 [[DIV58]], 1
13655 // CHECK19-NEXT:    store i32 [[SUB59]], i32* [[DOTCAPTURE_EXPR_56]], align 4
13656 // CHECK19-NEXT:    [[TMP198:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_56]], align 4
13657 // CHECK19-NEXT:    [[ADD60:%.*]] = add nsw i32 [[TMP198]], 1
13658 // CHECK19-NEXT:    [[TMP199:%.*]] = zext i32 [[ADD60]] to i64
13659 // CHECK19-NEXT:    [[KERNEL_ARGS61:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
13660 // CHECK19-NEXT:    [[TMP200:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 0
13661 // CHECK19-NEXT:    store i32 1, i32* [[TMP200]], align 4
13662 // CHECK19-NEXT:    [[TMP201:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 1
13663 // CHECK19-NEXT:    store i32 4, i32* [[TMP201]], align 4
13664 // CHECK19-NEXT:    [[TMP202:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 2
13665 // CHECK19-NEXT:    store i8** [[TMP193]], i8*** [[TMP202]], align 4
13666 // CHECK19-NEXT:    [[TMP203:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 3
13667 // CHECK19-NEXT:    store i8** [[TMP194]], i8*** [[TMP203]], align 4
13668 // CHECK19-NEXT:    [[TMP204:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 4
13669 // CHECK19-NEXT:    store i64* [[TMP195]], i64** [[TMP204]], align 4
13670 // CHECK19-NEXT:    [[TMP205:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 5
13671 // CHECK19-NEXT:    store i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.17, i32 0, i32 0), i64** [[TMP205]], align 4
13672 // CHECK19-NEXT:    [[TMP206:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 6
13673 // CHECK19-NEXT:    store i8** null, i8*** [[TMP206]], align 4
13674 // CHECK19-NEXT:    [[TMP207:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 7
13675 // CHECK19-NEXT:    store i8** null, i8*** [[TMP207]], align 4
13676 // CHECK19-NEXT:    [[TMP208:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]], i32 0, i32 8
13677 // CHECK19-NEXT:    store i64 [[TMP199]], i64* [[TMP208]], align 8
13678 // CHECK19-NEXT:    [[TMP209:%.*]] = 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_l174.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS61]])
13679 // CHECK19-NEXT:    [[TMP210:%.*]] = icmp ne i32 [[TMP209]], 0
13680 // CHECK19-NEXT:    br i1 [[TMP210]], label [[OMP_OFFLOAD_FAILED62:%.*]], label [[OMP_OFFLOAD_CONT63:%.*]]
13681 // CHECK19:       omp_offload.failed62:
13682 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l174(i32 [[TMP166]], i32 [[TMP168]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
13683 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT63]]
13684 // CHECK19:       omp_offload.cont63:
13685 // CHECK19-NEXT:    [[TMP211:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
13686 // CHECK19-NEXT:    [[CALL:%.*]] = call noundef i32 @_Z5tmainIiLi10EEiT_(i32 noundef [[TMP211]])
13687 // CHECK19-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
13688 // CHECK19-NEXT:    [[TMP212:%.*]] = load i8*, i8** [[SAVED_STACK]], align 4
13689 // CHECK19-NEXT:    call void @llvm.stackrestore(i8* [[TMP212]])
13690 // CHECK19-NEXT:    [[TMP213:%.*]] = load i32, i32* [[RETVAL]], align 4
13691 // CHECK19-NEXT:    ret i32 [[TMP213]]
13692 //
13693 //
13694 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l154
13695 // CHECK19-SAME: (i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {
13696 // CHECK19-NEXT:  entry:
13697 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
13698 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
13699 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
13700 // CHECK19-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
13701 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
13702 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
13703 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
13704 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
13705 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]])
13706 // CHECK19-NEXT:    ret void
13707 //
13708 //
13709 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined.
13710 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
13711 // CHECK19-NEXT:  entry:
13712 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
13713 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
13714 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
13715 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
13716 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
13717 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
13718 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13719 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
13720 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
13721 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
13722 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
13723 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
13724 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
13725 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
13726 // CHECK19-NEXT:    [[I3:%.*]] = alloca i32, align 4
13727 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
13728 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
13729 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
13730 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
13731 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
13732 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
13733 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
13734 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
13735 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
13736 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
13737 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13738 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
13739 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
13740 // CHECK19-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
13741 // CHECK19-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
13742 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
13743 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13744 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
13745 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
13746 // CHECK19:       omp.precond.then:
13747 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
13748 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13749 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
13750 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13751 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13752 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13753 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
13754 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
13755 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13756 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13757 // CHECK19-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
13758 // CHECK19-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
13759 // CHECK19:       cond.true:
13760 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13761 // CHECK19-NEXT:    br label [[COND_END:%.*]]
13762 // CHECK19:       cond.false:
13763 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13764 // CHECK19-NEXT:    br label [[COND_END]]
13765 // CHECK19:       cond.end:
13766 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
13767 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
13768 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
13769 // CHECK19-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
13770 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
13771 // CHECK19:       omp.inner.for.cond:
13772 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !14
13773 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !14
13774 // CHECK19-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
13775 // CHECK19-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
13776 // CHECK19:       omp.inner.for.body:
13777 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !14
13778 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !14
13779 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32 [[TMP16]], i32 [[TMP17]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !14
13780 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13781 // CHECK19:       omp.inner.for.inc:
13782 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !14
13783 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !14
13784 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
13785 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !14
13786 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP15:![0-9]+]]
13787 // CHECK19:       omp.inner.for.end:
13788 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
13789 // CHECK19:       omp.loop.exit:
13790 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13791 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
13792 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
13793 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
13794 // CHECK19-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
13795 // CHECK19-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
13796 // CHECK19:       .omp.final.then:
13797 // CHECK19-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13798 // CHECK19-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP24]], 0
13799 // CHECK19-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
13800 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
13801 // CHECK19-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
13802 // CHECK19-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
13803 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
13804 // CHECK19:       .omp.final.done:
13805 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
13806 // CHECK19:       omp.precond.end:
13807 // CHECK19-NEXT:    ret void
13808 //
13809 //
13810 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..1
13811 // CHECK19-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
13812 // CHECK19-NEXT:  entry:
13813 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
13814 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
13815 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
13816 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
13817 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
13818 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
13819 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
13820 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
13821 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13822 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
13823 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
13824 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
13825 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
13826 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
13827 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
13828 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
13829 // CHECK19-NEXT:    [[I3:%.*]] = alloca i32, align 4
13830 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
13831 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
13832 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
13833 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
13834 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
13835 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
13836 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
13837 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
13838 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
13839 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
13840 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
13841 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
13842 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13843 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
13844 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
13845 // CHECK19-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
13846 // CHECK19-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
13847 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
13848 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13849 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
13850 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
13851 // CHECK19:       omp.precond.then:
13852 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
13853 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13854 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
13855 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
13856 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
13857 // CHECK19-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
13858 // CHECK19-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
13859 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13860 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13861 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13862 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
13863 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
13864 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
13865 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13866 // CHECK19-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
13867 // CHECK19-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
13868 // CHECK19:       cond.true:
13869 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13870 // CHECK19-NEXT:    br label [[COND_END:%.*]]
13871 // CHECK19:       cond.false:
13872 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
13873 // CHECK19-NEXT:    br label [[COND_END]]
13874 // CHECK19:       cond.end:
13875 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
13876 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
13877 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
13878 // CHECK19-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
13879 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
13880 // CHECK19:       omp.inner.for.cond:
13881 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
13882 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !18
13883 // CHECK19-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
13884 // CHECK19-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
13885 // CHECK19:       omp.inner.for.body:
13886 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
13887 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
13888 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
13889 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !18
13890 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !18
13891 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
13892 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !18
13893 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
13894 // CHECK19:       omp.body.continue:
13895 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
13896 // CHECK19:       omp.inner.for.inc:
13897 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
13898 // CHECK19-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP20]], 1
13899 // CHECK19-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
13900 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP19:![0-9]+]]
13901 // CHECK19:       omp.inner.for.end:
13902 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
13903 // CHECK19:       omp.loop.exit:
13904 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13905 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
13906 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
13907 // CHECK19-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
13908 // CHECK19-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
13909 // CHECK19-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
13910 // CHECK19:       .omp.final.then:
13911 // CHECK19-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13912 // CHECK19-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP25]], 0
13913 // CHECK19-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
13914 // CHECK19-NEXT:    [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 1
13915 // CHECK19-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]
13916 // CHECK19-NEXT:    store i32 [[ADD10]], i32* [[I3]], align 4
13917 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
13918 // CHECK19:       .omp.final.done:
13919 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
13920 // CHECK19:       omp.precond.end:
13921 // CHECK19-NEXT:    ret void
13922 //
13923 //
13924 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l159
13925 // CHECK19-SAME: (i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
13926 // CHECK19-NEXT:  entry:
13927 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
13928 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
13929 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
13930 // CHECK19-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
13931 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
13932 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
13933 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
13934 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
13935 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]])
13936 // CHECK19-NEXT:    ret void
13937 //
13938 //
13939 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..2
13940 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
13941 // CHECK19-NEXT:  entry:
13942 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
13943 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
13944 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
13945 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
13946 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
13947 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
13948 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
13949 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
13950 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
13951 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
13952 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
13953 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
13954 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
13955 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
13956 // CHECK19-NEXT:    [[I3:%.*]] = alloca i32, align 4
13957 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
13958 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
13959 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
13960 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
13961 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
13962 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
13963 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
13964 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
13965 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
13966 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
13967 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13968 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
13969 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
13970 // CHECK19-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
13971 // CHECK19-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
13972 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
13973 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
13974 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
13975 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
13976 // CHECK19:       omp.precond.then:
13977 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
13978 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13979 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
13980 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
13981 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
13982 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
13983 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
13984 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
13985 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13986 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13987 // CHECK19-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
13988 // CHECK19-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
13989 // CHECK19:       cond.true:
13990 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
13991 // CHECK19-NEXT:    br label [[COND_END:%.*]]
13992 // CHECK19:       cond.false:
13993 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
13994 // CHECK19-NEXT:    br label [[COND_END]]
13995 // CHECK19:       cond.end:
13996 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
13997 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
13998 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
13999 // CHECK19-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
14000 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
14001 // CHECK19:       omp.inner.for.cond:
14002 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
14003 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !23
14004 // CHECK19-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
14005 // CHECK19-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
14006 // CHECK19:       omp.inner.for.body:
14007 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !23
14008 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !23
14009 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32 [[TMP16]], i32 [[TMP17]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !23
14010 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
14011 // CHECK19:       omp.inner.for.inc:
14012 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
14013 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !23
14014 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
14015 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !23
14016 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP24:![0-9]+]]
14017 // CHECK19:       omp.inner.for.end:
14018 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
14019 // CHECK19:       omp.loop.exit:
14020 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14021 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
14022 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
14023 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
14024 // CHECK19-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
14025 // CHECK19-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
14026 // CHECK19:       .omp.final.then:
14027 // CHECK19-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14028 // CHECK19-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP24]], 0
14029 // CHECK19-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
14030 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
14031 // CHECK19-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
14032 // CHECK19-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
14033 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
14034 // CHECK19:       .omp.final.done:
14035 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
14036 // CHECK19:       omp.precond.end:
14037 // CHECK19-NEXT:    ret void
14038 //
14039 //
14040 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..3
14041 // CHECK19-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
14042 // CHECK19-NEXT:  entry:
14043 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
14044 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
14045 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
14046 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
14047 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
14048 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14049 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14050 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
14051 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
14052 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
14053 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
14054 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
14055 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
14056 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
14057 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
14058 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
14059 // CHECK19-NEXT:    [[I3:%.*]] = alloca i32, align 4
14060 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
14061 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
14062 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
14063 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
14064 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
14065 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14066 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14067 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
14068 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14069 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14070 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
14071 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
14072 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14073 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
14074 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
14075 // CHECK19-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
14076 // CHECK19-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
14077 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
14078 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14079 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
14080 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
14081 // CHECK19:       omp.precond.then:
14082 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
14083 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14084 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
14085 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
14086 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
14087 // CHECK19-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
14088 // CHECK19-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
14089 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
14090 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
14091 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14092 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
14093 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
14094 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
14095 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14096 // CHECK19-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
14097 // CHECK19-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
14098 // CHECK19:       cond.true:
14099 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14100 // CHECK19-NEXT:    br label [[COND_END:%.*]]
14101 // CHECK19:       cond.false:
14102 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
14103 // CHECK19-NEXT:    br label [[COND_END]]
14104 // CHECK19:       cond.end:
14105 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
14106 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
14107 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
14108 // CHECK19-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
14109 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
14110 // CHECK19:       omp.inner.for.cond:
14111 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
14112 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !26
14113 // CHECK19-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
14114 // CHECK19-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
14115 // CHECK19:       omp.inner.for.body:
14116 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
14117 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
14118 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
14119 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !26
14120 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !26
14121 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
14122 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !26
14123 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
14124 // CHECK19:       omp.body.continue:
14125 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
14126 // CHECK19:       omp.inner.for.inc:
14127 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
14128 // CHECK19-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP20]], 1
14129 // CHECK19-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !26
14130 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP27:![0-9]+]]
14131 // CHECK19:       omp.inner.for.end:
14132 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
14133 // CHECK19:       omp.loop.exit:
14134 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14135 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
14136 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
14137 // CHECK19-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
14138 // CHECK19-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
14139 // CHECK19-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
14140 // CHECK19:       .omp.final.then:
14141 // CHECK19-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14142 // CHECK19-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP25]], 0
14143 // CHECK19-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
14144 // CHECK19-NEXT:    [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 1
14145 // CHECK19-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]
14146 // CHECK19-NEXT:    store i32 [[ADD10]], i32* [[I3]], align 4
14147 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
14148 // CHECK19:       .omp.final.done:
14149 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
14150 // CHECK19:       omp.precond.end:
14151 // CHECK19-NEXT:    ret void
14152 //
14153 //
14154 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l164
14155 // CHECK19-SAME: (i32 noundef [[M:%.*]], i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
14156 // CHECK19-NEXT:  entry:
14157 // CHECK19-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
14158 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
14159 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14160 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14161 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
14162 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
14163 // CHECK19-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
14164 // CHECK19-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
14165 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14166 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14167 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14168 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14169 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[M_ADDR]], align 4
14170 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
14171 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14172 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
14173 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
14174 // CHECK19-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..6 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]], i32 [[TMP4]])
14175 // CHECK19-NEXT:    ret void
14176 //
14177 //
14178 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..6
14179 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
14180 // CHECK19-NEXT:  entry:
14181 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
14182 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
14183 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
14184 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14185 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14186 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
14187 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
14188 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
14189 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
14190 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
14191 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
14192 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
14193 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
14194 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
14195 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
14196 // CHECK19-NEXT:    [[I4:%.*]] = alloca i32, align 4
14197 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
14198 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
14199 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
14200 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
14201 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14202 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14203 // CHECK19-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
14204 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
14205 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14206 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14207 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
14208 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
14209 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14210 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
14211 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
14212 // CHECK19-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
14213 // CHECK19-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
14214 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
14215 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14216 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
14217 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
14218 // CHECK19:       omp.precond.then:
14219 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
14220 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14221 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
14222 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
14223 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
14224 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
14225 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14226 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
14227 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP9]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP7]])
14228 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
14229 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14230 // CHECK19-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
14231 // CHECK19-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
14232 // CHECK19:       cond.true:
14233 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14234 // CHECK19-NEXT:    br label [[COND_END:%.*]]
14235 // CHECK19:       cond.false:
14236 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
14237 // CHECK19-NEXT:    br label [[COND_END]]
14238 // CHECK19:       cond.end:
14239 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
14240 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
14241 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
14242 // CHECK19-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
14243 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
14244 // CHECK19:       omp.inner.for.cond:
14245 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
14246 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !29
14247 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
14248 // CHECK19-NEXT:    [[CMP6:%.*]] = icmp slt i32 [[TMP15]], [[ADD]]
14249 // CHECK19-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
14250 // CHECK19:       omp.inner.for.body:
14251 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
14252 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
14253 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4, !llvm.access.group !29
14254 // CHECK19-NEXT:    store i32 [[TMP19]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !29
14255 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !29
14256 // CHECK19-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..7 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]], i32 [[TMP20]]), !llvm.access.group !29
14257 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
14258 // CHECK19:       omp.inner.for.inc:
14259 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
14260 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !29
14261 // CHECK19-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
14262 // CHECK19-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
14263 // CHECK19-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
14264 // CHECK19-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !29
14265 // CHECK19-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
14266 // CHECK19-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
14267 // CHECK19-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
14268 // CHECK19-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !29
14269 // CHECK19-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
14270 // CHECK19-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
14271 // CHECK19-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
14272 // CHECK19-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !29
14273 // CHECK19-NEXT:    [[CMP10:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
14274 // CHECK19-NEXT:    br i1 [[CMP10]], label [[COND_TRUE11:%.*]], label [[COND_FALSE12:%.*]]
14275 // CHECK19:       cond.true11:
14276 // CHECK19-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group !29
14277 // CHECK19-NEXT:    br label [[COND_END13:%.*]]
14278 // CHECK19:       cond.false12:
14279 // CHECK19-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
14280 // CHECK19-NEXT:    br label [[COND_END13]]
14281 // CHECK19:       cond.end13:
14282 // CHECK19-NEXT:    [[COND14:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE11]] ], [ [[TMP30]], [[COND_FALSE12]] ]
14283 // CHECK19-NEXT:    store i32 [[COND14]], i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !29
14284 // CHECK19-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !29
14285 // CHECK19-NEXT:    store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !29
14286 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP30:![0-9]+]]
14287 // CHECK19:       omp.inner.for.end:
14288 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
14289 // CHECK19:       omp.loop.exit:
14290 // CHECK19-NEXT:    [[TMP32:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14291 // CHECK19-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
14292 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]])
14293 // CHECK19-NEXT:    [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
14294 // CHECK19-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
14295 // CHECK19-NEXT:    br i1 [[TMP35]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
14296 // CHECK19:       .omp.final.then:
14297 // CHECK19-NEXT:    [[TMP36:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14298 // CHECK19-NEXT:    [[SUB15:%.*]] = sub nsw i32 [[TMP36]], 0
14299 // CHECK19-NEXT:    [[DIV16:%.*]] = sdiv i32 [[SUB15]], 1
14300 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV16]], 1
14301 // CHECK19-NEXT:    [[ADD17:%.*]] = add nsw i32 0, [[MUL]]
14302 // CHECK19-NEXT:    store i32 [[ADD17]], i32* [[I4]], align 4
14303 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
14304 // CHECK19:       .omp.final.done:
14305 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
14306 // CHECK19:       omp.precond.end:
14307 // CHECK19-NEXT:    ret void
14308 //
14309 //
14310 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..7
14311 // CHECK19-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
14312 // CHECK19-NEXT:  entry:
14313 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
14314 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
14315 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
14316 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
14317 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
14318 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14319 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14320 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
14321 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
14322 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
14323 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
14324 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
14325 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
14326 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
14327 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
14328 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
14329 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
14330 // CHECK19-NEXT:    [[I4:%.*]] = alloca i32, align 4
14331 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
14332 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
14333 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
14334 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
14335 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
14336 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14337 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14338 // CHECK19-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
14339 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
14340 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14341 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14342 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
14343 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
14344 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14345 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
14346 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
14347 // CHECK19-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
14348 // CHECK19-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
14349 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
14350 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14351 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
14352 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
14353 // CHECK19:       omp.precond.then:
14354 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
14355 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14356 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
14357 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
14358 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
14359 // CHECK19-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
14360 // CHECK19-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
14361 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
14362 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
14363 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14364 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
14365 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP10]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
14366 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
14367 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14368 // CHECK19-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
14369 // CHECK19-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
14370 // CHECK19:       cond.true:
14371 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14372 // CHECK19-NEXT:    br label [[COND_END:%.*]]
14373 // CHECK19:       cond.false:
14374 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
14375 // CHECK19-NEXT:    br label [[COND_END]]
14376 // CHECK19:       cond.end:
14377 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
14378 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
14379 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
14380 // CHECK19-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
14381 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
14382 // CHECK19:       omp.inner.for.cond:
14383 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
14384 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !32
14385 // CHECK19-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
14386 // CHECK19-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
14387 // CHECK19:       omp.inner.for.body:
14388 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
14389 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
14390 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
14391 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !32
14392 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !32
14393 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
14394 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !32
14395 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
14396 // CHECK19:       omp.body.continue:
14397 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
14398 // CHECK19:       omp.inner.for.inc:
14399 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
14400 // CHECK19-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
14401 // CHECK19-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !32
14402 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP33:![0-9]+]]
14403 // CHECK19:       omp.inner.for.end:
14404 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
14405 // CHECK19:       omp.loop.exit:
14406 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14407 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
14408 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
14409 // CHECK19-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
14410 // CHECK19-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
14411 // CHECK19-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
14412 // CHECK19:       .omp.final.then:
14413 // CHECK19-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14414 // CHECK19-NEXT:    [[SUB8:%.*]] = sub nsw i32 [[TMP25]], 0
14415 // CHECK19-NEXT:    [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1
14416 // CHECK19-NEXT:    [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 1
14417 // CHECK19-NEXT:    [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]
14418 // CHECK19-NEXT:    store i32 [[ADD11]], i32* [[I4]], align 4
14419 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
14420 // CHECK19:       .omp.final.done:
14421 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
14422 // CHECK19:       omp.precond.end:
14423 // CHECK19-NEXT:    ret void
14424 //
14425 //
14426 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l169
14427 // CHECK19-SAME: (i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
14428 // CHECK19-NEXT:  entry:
14429 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
14430 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14431 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14432 // CHECK19-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
14433 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14434 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14435 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14436 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14437 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32, i32*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]])
14438 // CHECK19-NEXT:    ret void
14439 //
14440 //
14441 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..10
14442 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
14443 // CHECK19-NEXT:  entry:
14444 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
14445 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
14446 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
14447 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14448 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14449 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
14450 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
14451 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
14452 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
14453 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
14454 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
14455 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
14456 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
14457 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
14458 // CHECK19-NEXT:    [[I3:%.*]] = alloca i32, align 4
14459 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
14460 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
14461 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
14462 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14463 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14464 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
14465 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14466 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14467 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
14468 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
14469 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14470 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
14471 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
14472 // CHECK19-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
14473 // CHECK19-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
14474 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
14475 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14476 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
14477 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
14478 // CHECK19:       omp.precond.then:
14479 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
14480 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14481 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
14482 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
14483 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
14484 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14485 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
14486 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
14487 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
14488 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14489 // CHECK19-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
14490 // CHECK19-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
14491 // CHECK19:       cond.true:
14492 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14493 // CHECK19-NEXT:    br label [[COND_END:%.*]]
14494 // CHECK19:       cond.false:
14495 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
14496 // CHECK19-NEXT:    br label [[COND_END]]
14497 // CHECK19:       cond.end:
14498 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
14499 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
14500 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
14501 // CHECK19-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
14502 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
14503 // CHECK19:       omp.inner.for.cond:
14504 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
14505 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !35
14506 // CHECK19-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
14507 // CHECK19-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
14508 // CHECK19:       omp.inner.for.body:
14509 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !35
14510 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !35
14511 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32, i32*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), i32 [[TMP16]], i32 [[TMP17]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]]), !llvm.access.group !35
14512 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
14513 // CHECK19:       omp.inner.for.inc:
14514 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
14515 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !35
14516 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
14517 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !35
14518 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP36:![0-9]+]]
14519 // CHECK19:       omp.inner.for.end:
14520 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
14521 // CHECK19:       omp.loop.exit:
14522 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14523 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
14524 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
14525 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
14526 // CHECK19-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
14527 // CHECK19-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
14528 // CHECK19:       .omp.final.then:
14529 // CHECK19-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14530 // CHECK19-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP24]], 0
14531 // CHECK19-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
14532 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV7]], 1
14533 // CHECK19-NEXT:    [[ADD8:%.*]] = add nsw i32 0, [[MUL]]
14534 // CHECK19-NEXT:    store i32 [[ADD8]], i32* [[I3]], align 4
14535 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
14536 // CHECK19:       .omp.final.done:
14537 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
14538 // CHECK19:       omp.precond.end:
14539 // CHECK19-NEXT:    ret void
14540 //
14541 //
14542 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..11
14543 // CHECK19-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
14544 // CHECK19-NEXT:  entry:
14545 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
14546 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
14547 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
14548 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
14549 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
14550 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14551 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14552 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
14553 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
14554 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
14555 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
14556 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
14557 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
14558 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
14559 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
14560 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
14561 // CHECK19-NEXT:    [[I3:%.*]] = alloca i32, align 4
14562 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
14563 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
14564 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
14565 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
14566 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
14567 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14568 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14569 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
14570 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14571 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14572 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
14573 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
14574 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14575 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
14576 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
14577 // CHECK19-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
14578 // CHECK19-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
14579 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
14580 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14581 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
14582 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
14583 // CHECK19:       omp.precond.then:
14584 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
14585 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14586 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
14587 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
14588 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
14589 // CHECK19-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
14590 // CHECK19-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
14591 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
14592 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
14593 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
14594 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
14595 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14596 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
14597 // CHECK19-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP12]], i32 1073741859, i32 [[TMP9]], i32 [[TMP10]], i32 1, i32 1)
14598 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
14599 // CHECK19:       omp.dispatch.cond:
14600 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14601 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
14602 // CHECK19-NEXT:    [[TMP15:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
14603 // CHECK19-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP15]], 0
14604 // CHECK19-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
14605 // CHECK19:       omp.dispatch.body:
14606 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
14607 // CHECK19-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_IV]], align 4
14608 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
14609 // CHECK19:       omp.inner.for.cond:
14610 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
14611 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !38
14612 // CHECK19-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]
14613 // CHECK19-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
14614 // CHECK19:       omp.inner.for.body:
14615 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
14616 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP19]], 1
14617 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
14618 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !38
14619 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !38
14620 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP20]]
14621 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !38
14622 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
14623 // CHECK19:       omp.body.continue:
14624 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
14625 // CHECK19:       omp.inner.for.inc:
14626 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
14627 // CHECK19-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP21]], 1
14628 // CHECK19-NEXT:    store i32 [[ADD5]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !38
14629 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP39:![0-9]+]]
14630 // CHECK19:       omp.inner.for.end:
14631 // CHECK19-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
14632 // CHECK19:       omp.dispatch.inc:
14633 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND]]
14634 // CHECK19:       omp.dispatch.end:
14635 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
14636 // CHECK19-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
14637 // CHECK19-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
14638 // CHECK19:       .omp.final.then:
14639 // CHECK19-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14640 // CHECK19-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP24]], 0
14641 // CHECK19-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
14642 // CHECK19-NEXT:    [[MUL8:%.*]] = mul nsw i32 [[DIV7]], 1
14643 // CHECK19-NEXT:    [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]
14644 // CHECK19-NEXT:    store i32 [[ADD9]], i32* [[I3]], align 4
14645 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
14646 // CHECK19:       .omp.final.done:
14647 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
14648 // CHECK19:       omp.precond.end:
14649 // CHECK19-NEXT:    ret void
14650 //
14651 //
14652 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l174
14653 // CHECK19-SAME: (i32 noundef [[M:%.*]], i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
14654 // CHECK19-NEXT:  entry:
14655 // CHECK19-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
14656 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
14657 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14658 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14659 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
14660 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
14661 // CHECK19-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
14662 // CHECK19-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
14663 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14664 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14665 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14666 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14667 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[M_ADDR]], align 4
14668 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
14669 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
14670 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
14671 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
14672 // CHECK19-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..14 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]], i32 [[TMP4]])
14673 // CHECK19-NEXT:    ret void
14674 //
14675 //
14676 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..14
14677 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
14678 // CHECK19-NEXT:  entry:
14679 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
14680 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
14681 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
14682 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14683 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14684 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
14685 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
14686 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
14687 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
14688 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
14689 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
14690 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
14691 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
14692 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
14693 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
14694 // CHECK19-NEXT:    [[I4:%.*]] = alloca i32, align 4
14695 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
14696 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
14697 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
14698 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
14699 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14700 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14701 // CHECK19-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
14702 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
14703 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14704 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14705 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
14706 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
14707 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14708 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
14709 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
14710 // CHECK19-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
14711 // CHECK19-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
14712 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
14713 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14714 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
14715 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
14716 // CHECK19:       omp.precond.then:
14717 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
14718 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14719 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
14720 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
14721 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
14722 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14723 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
14724 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP8]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
14725 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
14726 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14727 // CHECK19-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
14728 // CHECK19-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
14729 // CHECK19:       cond.true:
14730 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14731 // CHECK19-NEXT:    br label [[COND_END:%.*]]
14732 // CHECK19:       cond.false:
14733 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
14734 // CHECK19-NEXT:    br label [[COND_END]]
14735 // CHECK19:       cond.end:
14736 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
14737 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
14738 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
14739 // CHECK19-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
14740 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
14741 // CHECK19:       omp.inner.for.cond:
14742 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !41
14743 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !41
14744 // CHECK19-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
14745 // CHECK19-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
14746 // CHECK19:       omp.inner.for.body:
14747 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !41
14748 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !41
14749 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4, !llvm.access.group !41
14750 // CHECK19-NEXT:    store i32 [[TMP18]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !41
14751 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !41
14752 // CHECK19-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..15 to void (i32*, i32*, ...)*), i32 [[TMP16]], i32 [[TMP17]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]], i32 [[TMP19]]), !llvm.access.group !41
14753 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
14754 // CHECK19:       omp.inner.for.inc:
14755 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !41
14756 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !41
14757 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
14758 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !41
14759 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP42:![0-9]+]]
14760 // CHECK19:       omp.inner.for.end:
14761 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
14762 // CHECK19:       omp.loop.exit:
14763 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14764 // CHECK19-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
14765 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
14766 // CHECK19-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
14767 // CHECK19-NEXT:    [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0
14768 // CHECK19-NEXT:    br i1 [[TMP25]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
14769 // CHECK19:       .omp.final.then:
14770 // CHECK19-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14771 // CHECK19-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP26]], 0
14772 // CHECK19-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
14773 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV8]], 1
14774 // CHECK19-NEXT:    [[ADD9:%.*]] = add nsw i32 0, [[MUL]]
14775 // CHECK19-NEXT:    store i32 [[ADD9]], i32* [[I4]], align 4
14776 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
14777 // CHECK19:       .omp.final.done:
14778 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
14779 // CHECK19:       omp.precond.end:
14780 // CHECK19-NEXT:    ret void
14781 //
14782 //
14783 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..15
14784 // CHECK19-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 [[VLA:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
14785 // CHECK19-NEXT:  entry:
14786 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
14787 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
14788 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
14789 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
14790 // CHECK19-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
14791 // CHECK19-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
14792 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
14793 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
14794 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
14795 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
14796 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
14797 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
14798 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
14799 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
14800 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
14801 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
14802 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
14803 // CHECK19-NEXT:    [[I4:%.*]] = alloca i32, align 4
14804 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
14805 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
14806 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
14807 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
14808 // CHECK19-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
14809 // CHECK19-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
14810 // CHECK19-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
14811 // CHECK19-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
14812 // CHECK19-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
14813 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
14814 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
14815 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
14816 // CHECK19-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
14817 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14818 // CHECK19-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
14819 // CHECK19-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
14820 // CHECK19-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
14821 // CHECK19-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
14822 // CHECK19-NEXT:    store i32 0, i32* [[I]], align 4
14823 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14824 // CHECK19-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
14825 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
14826 // CHECK19:       omp.precond.then:
14827 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
14828 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
14829 // CHECK19-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
14830 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
14831 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
14832 // CHECK19-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
14833 // CHECK19-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
14834 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
14835 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
14836 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
14837 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
14838 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
14839 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14840 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4
14841 // CHECK19-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP13]], i32 1073741859, i32 [[TMP10]], i32 [[TMP11]], i32 1, i32 [[TMP9]])
14842 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
14843 // CHECK19:       omp.dispatch.cond:
14844 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
14845 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4
14846 // CHECK19-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]])
14847 // CHECK19-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP16]], 0
14848 // CHECK19-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
14849 // CHECK19:       omp.dispatch.body:
14850 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
14851 // CHECK19-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
14852 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
14853 // CHECK19:       omp.inner.for.cond:
14854 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !44
14855 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !44
14856 // CHECK19-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
14857 // CHECK19-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
14858 // CHECK19:       omp.inner.for.body:
14859 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !44
14860 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP20]], 1
14861 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
14862 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4, !llvm.access.group !44
14863 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I4]], align 4, !llvm.access.group !44
14864 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP21]]
14865 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !44
14866 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
14867 // CHECK19:       omp.body.continue:
14868 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
14869 // CHECK19:       omp.inner.for.inc:
14870 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !44
14871 // CHECK19-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP22]], 1
14872 // CHECK19-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !44
14873 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP45:![0-9]+]]
14874 // CHECK19:       omp.inner.for.end:
14875 // CHECK19-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
14876 // CHECK19:       omp.dispatch.inc:
14877 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND]]
14878 // CHECK19:       omp.dispatch.end:
14879 // CHECK19-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
14880 // CHECK19-NEXT:    [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0
14881 // CHECK19-NEXT:    br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
14882 // CHECK19:       .omp.final.then:
14883 // CHECK19-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
14884 // CHECK19-NEXT:    [[SUB7:%.*]] = sub nsw i32 [[TMP25]], 0
14885 // CHECK19-NEXT:    [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1
14886 // CHECK19-NEXT:    [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 1
14887 // CHECK19-NEXT:    [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]
14888 // CHECK19-NEXT:    store i32 [[ADD10]], i32* [[I4]], align 4
14889 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
14890 // CHECK19:       .omp.final.done:
14891 // CHECK19-NEXT:    br label [[OMP_PRECOND_END]]
14892 // CHECK19:       omp.precond.end:
14893 // CHECK19-NEXT:    ret void
14894 //
14895 //
14896 // CHECK19-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
14897 // CHECK19-SAME: (i32 noundef [[ARGC:%.*]]) #[[ATTR5:[0-9]+]] comdat {
14898 // CHECK19-NEXT:  entry:
14899 // CHECK19-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
14900 // CHECK19-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
14901 // CHECK19-NEXT:    [[M:%.*]] = alloca i32, align 4
14902 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 4
14903 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 4
14904 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 4
14905 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
14906 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 4
14907 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 4
14908 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 4
14909 // CHECK19-NEXT:    [[_TMP4:%.*]] = alloca i32, align 4
14910 // CHECK19-NEXT:    [[M_CASTED:%.*]] = alloca i32, align 4
14911 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS8:%.*]] = alloca [2 x i8*], align 4
14912 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS9:%.*]] = alloca [2 x i8*], align 4
14913 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS10:%.*]] = alloca [2 x i8*], align 4
14914 // CHECK19-NEXT:    [[_TMP11:%.*]] = alloca i32, align 4
14915 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS15:%.*]] = alloca [1 x i8*], align 4
14916 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS16:%.*]] = alloca [1 x i8*], align 4
14917 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS17:%.*]] = alloca [1 x i8*], align 4
14918 // CHECK19-NEXT:    [[_TMP18:%.*]] = alloca i32, align 4
14919 // CHECK19-NEXT:    [[M_CASTED22:%.*]] = alloca i32, align 4
14920 // CHECK19-NEXT:    [[DOTOFFLOAD_BASEPTRS23:%.*]] = alloca [2 x i8*], align 4
14921 // CHECK19-NEXT:    [[DOTOFFLOAD_PTRS24:%.*]] = alloca [2 x i8*], align 4
14922 // CHECK19-NEXT:    [[DOTOFFLOAD_MAPPERS25:%.*]] = alloca [2 x i8*], align 4
14923 // CHECK19-NEXT:    [[_TMP26:%.*]] = alloca i32, align 4
14924 // CHECK19-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
14925 // CHECK19-NEXT:    store i32 10, i32* [[M]], align 4
14926 // CHECK19-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
14927 // CHECK19-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [10 x i32]**
14928 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP1]], align 4
14929 // CHECK19-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
14930 // CHECK19-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [10 x i32]**
14931 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP3]], align 4
14932 // CHECK19-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
14933 // CHECK19-NEXT:    store i8* null, i8** [[TMP4]], align 4
14934 // CHECK19-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
14935 // CHECK19-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
14936 // CHECK19-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
14937 // CHECK19-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0
14938 // CHECK19-NEXT:    store i32 1, i32* [[TMP7]], align 4
14939 // CHECK19-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1
14940 // CHECK19-NEXT:    store i32 1, i32* [[TMP8]], align 4
14941 // CHECK19-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2
14942 // CHECK19-NEXT:    store i8** [[TMP5]], i8*** [[TMP9]], align 4
14943 // CHECK19-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3
14944 // CHECK19-NEXT:    store i8** [[TMP6]], i8*** [[TMP10]], align 4
14945 // CHECK19-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4
14946 // CHECK19-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.20, i32 0, i32 0), i64** [[TMP11]], align 4
14947 // CHECK19-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5
14948 // CHECK19-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.21, i32 0, i32 0), i64** [[TMP12]], align 4
14949 // CHECK19-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6
14950 // CHECK19-NEXT:    store i8** null, i8*** [[TMP13]], align 4
14951 // CHECK19-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7
14952 // CHECK19-NEXT:    store i8** null, i8*** [[TMP14]], align 4
14953 // CHECK19-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 8
14954 // CHECK19-NEXT:    store i64 10, i64* [[TMP15]], align 8
14955 // CHECK19-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]])
14956 // CHECK19-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
14957 // CHECK19-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
14958 // CHECK19:       omp_offload.failed:
14959 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122([10 x i32]* [[A]]) #[[ATTR3]]
14960 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT]]
14961 // CHECK19:       omp_offload.cont:
14962 // CHECK19-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
14963 // CHECK19-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to [10 x i32]**
14964 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP19]], align 4
14965 // CHECK19-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
14966 // CHECK19-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [10 x i32]**
14967 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP21]], align 4
14968 // CHECK19-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i32 0, i32 0
14969 // CHECK19-NEXT:    store i8* null, i8** [[TMP22]], align 4
14970 // CHECK19-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
14971 // CHECK19-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
14972 // CHECK19-NEXT:    [[KERNEL_ARGS5:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
14973 // CHECK19-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 0
14974 // CHECK19-NEXT:    store i32 1, i32* [[TMP25]], align 4
14975 // CHECK19-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 1
14976 // CHECK19-NEXT:    store i32 1, i32* [[TMP26]], align 4
14977 // CHECK19-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 2
14978 // CHECK19-NEXT:    store i8** [[TMP23]], i8*** [[TMP27]], align 4
14979 // CHECK19-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 3
14980 // CHECK19-NEXT:    store i8** [[TMP24]], i8*** [[TMP28]], align 4
14981 // CHECK19-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 4
14982 // CHECK19-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.24, i32 0, i32 0), i64** [[TMP29]], align 4
14983 // CHECK19-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 5
14984 // CHECK19-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.25, i32 0, i32 0), i64** [[TMP30]], align 4
14985 // CHECK19-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 6
14986 // CHECK19-NEXT:    store i8** null, i8*** [[TMP31]], align 4
14987 // CHECK19-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 7
14988 // CHECK19-NEXT:    store i8** null, i8*** [[TMP32]], align 4
14989 // CHECK19-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]], i32 0, i32 8
14990 // CHECK19-NEXT:    store i64 10, i64* [[TMP33]], align 8
14991 // CHECK19-NEXT:    [[TMP34:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS5]])
14992 // CHECK19-NEXT:    [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 0
14993 // CHECK19-NEXT:    br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
14994 // CHECK19:       omp_offload.failed6:
14995 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127([10 x i32]* [[A]]) #[[ATTR3]]
14996 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT7]]
14997 // CHECK19:       omp_offload.cont7:
14998 // CHECK19-NEXT:    [[TMP36:%.*]] = load i32, i32* [[M]], align 4
14999 // CHECK19-NEXT:    store i32 [[TMP36]], i32* [[M_CASTED]], align 4
15000 // CHECK19-NEXT:    [[TMP37:%.*]] = load i32, i32* [[M_CASTED]], align 4
15001 // CHECK19-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 0
15002 // CHECK19-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to i32*
15003 // CHECK19-NEXT:    store i32 [[TMP37]], i32* [[TMP39]], align 4
15004 // CHECK19-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 0
15005 // CHECK19-NEXT:    [[TMP41:%.*]] = bitcast i8** [[TMP40]] to i32*
15006 // CHECK19-NEXT:    store i32 [[TMP37]], i32* [[TMP41]], align 4
15007 // CHECK19-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS10]], i32 0, i32 0
15008 // CHECK19-NEXT:    store i8* null, i8** [[TMP42]], align 4
15009 // CHECK19-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 1
15010 // CHECK19-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to [10 x i32]**
15011 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP44]], align 4
15012 // CHECK19-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 1
15013 // CHECK19-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to [10 x i32]**
15014 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP46]], align 4
15015 // CHECK19-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS10]], i32 0, i32 1
15016 // CHECK19-NEXT:    store i8* null, i8** [[TMP47]], align 4
15017 // CHECK19-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS8]], i32 0, i32 0
15018 // CHECK19-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS9]], i32 0, i32 0
15019 // CHECK19-NEXT:    [[KERNEL_ARGS12:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
15020 // CHECK19-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 0
15021 // CHECK19-NEXT:    store i32 1, i32* [[TMP50]], align 4
15022 // CHECK19-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 1
15023 // CHECK19-NEXT:    store i32 2, i32* [[TMP51]], align 4
15024 // CHECK19-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 2
15025 // CHECK19-NEXT:    store i8** [[TMP48]], i8*** [[TMP52]], align 4
15026 // CHECK19-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 3
15027 // CHECK19-NEXT:    store i8** [[TMP49]], i8*** [[TMP53]], align 4
15028 // CHECK19-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 4
15029 // CHECK19-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.28, i32 0, i32 0), i64** [[TMP54]], align 4
15030 // CHECK19-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 5
15031 // CHECK19-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.29, i32 0, i32 0), i64** [[TMP55]], align 4
15032 // CHECK19-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 6
15033 // CHECK19-NEXT:    store i8** null, i8*** [[TMP56]], align 4
15034 // CHECK19-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 7
15035 // CHECK19-NEXT:    store i8** null, i8*** [[TMP57]], align 4
15036 // CHECK19-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]], i32 0, i32 8
15037 // CHECK19-NEXT:    store i64 10, i64* [[TMP58]], align 8
15038 // CHECK19-NEXT:    [[TMP59:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS12]])
15039 // CHECK19-NEXT:    [[TMP60:%.*]] = icmp ne i32 [[TMP59]], 0
15040 // CHECK19-NEXT:    br i1 [[TMP60]], label [[OMP_OFFLOAD_FAILED13:%.*]], label [[OMP_OFFLOAD_CONT14:%.*]]
15041 // CHECK19:       omp_offload.failed13:
15042 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132(i32 [[TMP37]], [10 x i32]* [[A]]) #[[ATTR3]]
15043 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT14]]
15044 // CHECK19:       omp_offload.cont14:
15045 // CHECK19-NEXT:    [[TMP61:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS15]], i32 0, i32 0
15046 // CHECK19-NEXT:    [[TMP62:%.*]] = bitcast i8** [[TMP61]] to [10 x i32]**
15047 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP62]], align 4
15048 // CHECK19-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS16]], i32 0, i32 0
15049 // CHECK19-NEXT:    [[TMP64:%.*]] = bitcast i8** [[TMP63]] to [10 x i32]**
15050 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP64]], align 4
15051 // CHECK19-NEXT:    [[TMP65:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS17]], i32 0, i32 0
15052 // CHECK19-NEXT:    store i8* null, i8** [[TMP65]], align 4
15053 // CHECK19-NEXT:    [[TMP66:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS15]], i32 0, i32 0
15054 // CHECK19-NEXT:    [[TMP67:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS16]], i32 0, i32 0
15055 // CHECK19-NEXT:    [[KERNEL_ARGS19:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
15056 // CHECK19-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 0
15057 // CHECK19-NEXT:    store i32 1, i32* [[TMP68]], align 4
15058 // CHECK19-NEXT:    [[TMP69:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 1
15059 // CHECK19-NEXT:    store i32 1, i32* [[TMP69]], align 4
15060 // CHECK19-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 2
15061 // CHECK19-NEXT:    store i8** [[TMP66]], i8*** [[TMP70]], align 4
15062 // CHECK19-NEXT:    [[TMP71:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 3
15063 // CHECK19-NEXT:    store i8** [[TMP67]], i8*** [[TMP71]], align 4
15064 // CHECK19-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 4
15065 // CHECK19-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.32, i32 0, i32 0), i64** [[TMP72]], align 4
15066 // CHECK19-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 5
15067 // CHECK19-NEXT:    store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.33, i32 0, i32 0), i64** [[TMP73]], align 4
15068 // CHECK19-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 6
15069 // CHECK19-NEXT:    store i8** null, i8*** [[TMP74]], align 4
15070 // CHECK19-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 7
15071 // CHECK19-NEXT:    store i8** null, i8*** [[TMP75]], align 4
15072 // CHECK19-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]], i32 0, i32 8
15073 // CHECK19-NEXT:    store i64 10, i64* [[TMP76]], align 8
15074 // CHECK19-NEXT:    [[TMP77:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS19]])
15075 // CHECK19-NEXT:    [[TMP78:%.*]] = icmp ne i32 [[TMP77]], 0
15076 // CHECK19-NEXT:    br i1 [[TMP78]], label [[OMP_OFFLOAD_FAILED20:%.*]], label [[OMP_OFFLOAD_CONT21:%.*]]
15077 // CHECK19:       omp_offload.failed20:
15078 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137([10 x i32]* [[A]]) #[[ATTR3]]
15079 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT21]]
15080 // CHECK19:       omp_offload.cont21:
15081 // CHECK19-NEXT:    [[TMP79:%.*]] = load i32, i32* [[M]], align 4
15082 // CHECK19-NEXT:    store i32 [[TMP79]], i32* [[M_CASTED22]], align 4
15083 // CHECK19-NEXT:    [[TMP80:%.*]] = load i32, i32* [[M_CASTED22]], align 4
15084 // CHECK19-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS23]], i32 0, i32 0
15085 // CHECK19-NEXT:    [[TMP82:%.*]] = bitcast i8** [[TMP81]] to i32*
15086 // CHECK19-NEXT:    store i32 [[TMP80]], i32* [[TMP82]], align 4
15087 // CHECK19-NEXT:    [[TMP83:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS24]], i32 0, i32 0
15088 // CHECK19-NEXT:    [[TMP84:%.*]] = bitcast i8** [[TMP83]] to i32*
15089 // CHECK19-NEXT:    store i32 [[TMP80]], i32* [[TMP84]], align 4
15090 // CHECK19-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS25]], i32 0, i32 0
15091 // CHECK19-NEXT:    store i8* null, i8** [[TMP85]], align 4
15092 // CHECK19-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS23]], i32 0, i32 1
15093 // CHECK19-NEXT:    [[TMP87:%.*]] = bitcast i8** [[TMP86]] to [10 x i32]**
15094 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP87]], align 4
15095 // CHECK19-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS24]], i32 0, i32 1
15096 // CHECK19-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to [10 x i32]**
15097 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP89]], align 4
15098 // CHECK19-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS25]], i32 0, i32 1
15099 // CHECK19-NEXT:    store i8* null, i8** [[TMP90]], align 4
15100 // CHECK19-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS23]], i32 0, i32 0
15101 // CHECK19-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS24]], i32 0, i32 0
15102 // CHECK19-NEXT:    [[KERNEL_ARGS27:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8
15103 // CHECK19-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 0
15104 // CHECK19-NEXT:    store i32 1, i32* [[TMP93]], align 4
15105 // CHECK19-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 1
15106 // CHECK19-NEXT:    store i32 2, i32* [[TMP94]], align 4
15107 // CHECK19-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 2
15108 // CHECK19-NEXT:    store i8** [[TMP91]], i8*** [[TMP95]], align 4
15109 // CHECK19-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 3
15110 // CHECK19-NEXT:    store i8** [[TMP92]], i8*** [[TMP96]], align 4
15111 // CHECK19-NEXT:    [[TMP97:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 4
15112 // CHECK19-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.36, i32 0, i32 0), i64** [[TMP97]], align 4
15113 // CHECK19-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 5
15114 // CHECK19-NEXT:    store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.37, i32 0, i32 0), i64** [[TMP98]], align 4
15115 // CHECK19-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 6
15116 // CHECK19-NEXT:    store i8** null, i8*** [[TMP99]], align 4
15117 // CHECK19-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 7
15118 // CHECK19-NEXT:    store i8** null, i8*** [[TMP100]], align 4
15119 // CHECK19-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]], i32 0, i32 8
15120 // CHECK19-NEXT:    store i64 10, i64* [[TMP101]], align 8
15121 // CHECK19-NEXT:    [[TMP102:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB3]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS27]])
15122 // CHECK19-NEXT:    [[TMP103:%.*]] = icmp ne i32 [[TMP102]], 0
15123 // CHECK19-NEXT:    br i1 [[TMP103]], label [[OMP_OFFLOAD_FAILED28:%.*]], label [[OMP_OFFLOAD_CONT29:%.*]]
15124 // CHECK19:       omp_offload.failed28:
15125 // CHECK19-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142(i32 [[TMP80]], [10 x i32]* [[A]]) #[[ATTR3]]
15126 // CHECK19-NEXT:    br label [[OMP_OFFLOAD_CONT29]]
15127 // CHECK19:       omp_offload.cont29:
15128 // CHECK19-NEXT:    ret i32 0
15129 //
15130 //
15131 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l122
15132 // CHECK19-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15133 // CHECK19-NEXT:  entry:
15134 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15135 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15136 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15137 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..18 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
15138 // CHECK19-NEXT:    ret void
15139 //
15140 //
15141 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..18
15142 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15143 // CHECK19-NEXT:  entry:
15144 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15145 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15146 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15147 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15148 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15149 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
15150 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
15151 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15152 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15153 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15154 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15155 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15156 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15157 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15158 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
15159 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
15160 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15161 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15162 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15163 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
15164 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
15165 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15166 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
15167 // CHECK19-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
15168 // CHECK19:       cond.true:
15169 // CHECK19-NEXT:    br label [[COND_END:%.*]]
15170 // CHECK19:       cond.false:
15171 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15172 // CHECK19-NEXT:    br label [[COND_END]]
15173 // CHECK19:       cond.end:
15174 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
15175 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
15176 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
15177 // CHECK19-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
15178 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15179 // CHECK19:       omp.inner.for.cond:
15180 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !47
15181 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !47
15182 // CHECK19-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
15183 // CHECK19-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15184 // CHECK19:       omp.inner.for.body:
15185 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !47
15186 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !47
15187 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]]), !llvm.access.group !47
15188 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15189 // CHECK19:       omp.inner.for.inc:
15190 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !47
15191 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !47
15192 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
15193 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !47
15194 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP48:![0-9]+]]
15195 // CHECK19:       omp.inner.for.end:
15196 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
15197 // CHECK19:       omp.loop.exit:
15198 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
15199 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15200 // CHECK19-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
15201 // CHECK19-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15202 // CHECK19:       .omp.final.then:
15203 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15204 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15205 // CHECK19:       .omp.final.done:
15206 // CHECK19-NEXT:    ret void
15207 //
15208 //
15209 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..19
15210 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15211 // CHECK19-NEXT:  entry:
15212 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15213 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15214 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
15215 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
15216 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15217 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15218 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15219 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
15220 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
15221 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15222 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15223 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15224 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15225 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15226 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15227 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15228 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15229 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15230 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
15231 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
15232 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15233 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15234 // CHECK19-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
15235 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
15236 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15237 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15238 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15239 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
15240 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
15241 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15242 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
15243 // CHECK19-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
15244 // CHECK19:       cond.true:
15245 // CHECK19-NEXT:    br label [[COND_END:%.*]]
15246 // CHECK19:       cond.false:
15247 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15248 // CHECK19-NEXT:    br label [[COND_END]]
15249 // CHECK19:       cond.end:
15250 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
15251 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
15252 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
15253 // CHECK19-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
15254 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15255 // CHECK19:       omp.inner.for.cond:
15256 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !50
15257 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !50
15258 // CHECK19-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
15259 // CHECK19-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15260 // CHECK19:       omp.inner.for.body:
15261 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !50
15262 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
15263 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
15264 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !50
15265 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !50
15266 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
15267 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !50
15268 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
15269 // CHECK19:       omp.body.continue:
15270 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15271 // CHECK19:       omp.inner.for.inc:
15272 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !50
15273 // CHECK19-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
15274 // CHECK19-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !50
15275 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP51:![0-9]+]]
15276 // CHECK19:       omp.inner.for.end:
15277 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
15278 // CHECK19:       omp.loop.exit:
15279 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
15280 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15281 // CHECK19-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
15282 // CHECK19-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15283 // CHECK19:       .omp.final.then:
15284 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15285 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15286 // CHECK19:       .omp.final.done:
15287 // CHECK19-NEXT:    ret void
15288 //
15289 //
15290 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l127
15291 // CHECK19-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15292 // CHECK19-NEXT:  entry:
15293 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15294 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15295 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15296 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..22 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
15297 // CHECK19-NEXT:    ret void
15298 //
15299 //
15300 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..22
15301 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15302 // CHECK19-NEXT:  entry:
15303 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15304 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15305 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15306 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15307 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15308 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
15309 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
15310 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15311 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15312 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15313 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15314 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15315 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15316 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15317 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
15318 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
15319 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15320 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15321 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15322 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
15323 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
15324 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15325 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
15326 // CHECK19-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
15327 // CHECK19:       cond.true:
15328 // CHECK19-NEXT:    br label [[COND_END:%.*]]
15329 // CHECK19:       cond.false:
15330 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15331 // CHECK19-NEXT:    br label [[COND_END]]
15332 // CHECK19:       cond.end:
15333 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
15334 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
15335 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
15336 // CHECK19-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
15337 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15338 // CHECK19:       omp.inner.for.cond:
15339 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !53
15340 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !53
15341 // CHECK19-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
15342 // CHECK19-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15343 // CHECK19:       omp.inner.for.body:
15344 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !53
15345 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !53
15346 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]]), !llvm.access.group !53
15347 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15348 // CHECK19:       omp.inner.for.inc:
15349 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !53
15350 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !53
15351 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
15352 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !53
15353 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP54:![0-9]+]]
15354 // CHECK19:       omp.inner.for.end:
15355 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
15356 // CHECK19:       omp.loop.exit:
15357 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
15358 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15359 // CHECK19-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
15360 // CHECK19-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15361 // CHECK19:       .omp.final.then:
15362 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15363 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15364 // CHECK19:       .omp.final.done:
15365 // CHECK19-NEXT:    ret void
15366 //
15367 //
15368 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..23
15369 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15370 // CHECK19-NEXT:  entry:
15371 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15372 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15373 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
15374 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
15375 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15376 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15377 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15378 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
15379 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
15380 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15381 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15382 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15383 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15384 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15385 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15386 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15387 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15388 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15389 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
15390 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
15391 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15392 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15393 // CHECK19-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
15394 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
15395 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15396 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15397 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15398 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
15399 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP4]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
15400 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15401 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
15402 // CHECK19-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
15403 // CHECK19:       cond.true:
15404 // CHECK19-NEXT:    br label [[COND_END:%.*]]
15405 // CHECK19:       cond.false:
15406 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15407 // CHECK19-NEXT:    br label [[COND_END]]
15408 // CHECK19:       cond.end:
15409 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
15410 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
15411 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
15412 // CHECK19-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
15413 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15414 // CHECK19:       omp.inner.for.cond:
15415 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !56
15416 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !56
15417 // CHECK19-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
15418 // CHECK19-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15419 // CHECK19:       omp.inner.for.body:
15420 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !56
15421 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
15422 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
15423 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !56
15424 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !56
15425 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
15426 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !56
15427 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
15428 // CHECK19:       omp.body.continue:
15429 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15430 // CHECK19:       omp.inner.for.inc:
15431 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !56
15432 // CHECK19-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
15433 // CHECK19-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !56
15434 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP57:![0-9]+]]
15435 // CHECK19:       omp.inner.for.end:
15436 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
15437 // CHECK19:       omp.loop.exit:
15438 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
15439 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15440 // CHECK19-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
15441 // CHECK19-NEXT:    br i1 [[TMP14]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15442 // CHECK19:       .omp.final.then:
15443 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15444 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15445 // CHECK19:       .omp.final.done:
15446 // CHECK19-NEXT:    ret void
15447 //
15448 //
15449 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l132
15450 // CHECK19-SAME: (i32 noundef [[M:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15451 // CHECK19-NEXT:  entry:
15452 // CHECK19-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
15453 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15454 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
15455 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
15456 // CHECK19-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
15457 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15458 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15459 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[M_ADDR]], align 4
15460 // CHECK19-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
15461 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
15462 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
15463 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
15464 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*, i32)* @.omp_outlined..26 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i32 [[TMP3]])
15465 // CHECK19-NEXT:    ret void
15466 //
15467 //
15468 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..26
15469 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
15470 // CHECK19-NEXT:  entry:
15471 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15472 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15473 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15474 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
15475 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15476 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15477 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
15478 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
15479 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15480 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15481 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15482 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
15483 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15484 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15485 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15486 // CHECK19-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
15487 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15488 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
15489 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
15490 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15491 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15492 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15493 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
15494 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
15495 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15496 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
15497 // CHECK19-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
15498 // CHECK19:       cond.true:
15499 // CHECK19-NEXT:    br label [[COND_END:%.*]]
15500 // CHECK19:       cond.false:
15501 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15502 // CHECK19-NEXT:    br label [[COND_END]]
15503 // CHECK19:       cond.end:
15504 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
15505 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
15506 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
15507 // CHECK19-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
15508 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15509 // CHECK19:       omp.inner.for.cond:
15510 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !59
15511 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !59
15512 // CHECK19-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
15513 // CHECK19-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15514 // CHECK19:       omp.inner.for.body:
15515 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !59
15516 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !59
15517 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4, !llvm.access.group !59
15518 // CHECK19-NEXT:    store i32 [[TMP10]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !59
15519 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !59
15520 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*, i32)* @.omp_outlined..27 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]], i32 [[TMP11]]), !llvm.access.group !59
15521 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15522 // CHECK19:       omp.inner.for.inc:
15523 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !59
15524 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !59
15525 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
15526 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !59
15527 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP60:![0-9]+]]
15528 // CHECK19:       omp.inner.for.end:
15529 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
15530 // CHECK19:       omp.loop.exit:
15531 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
15532 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15533 // CHECK19-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
15534 // CHECK19-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15535 // CHECK19:       .omp.final.then:
15536 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15537 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15538 // CHECK19:       .omp.final.done:
15539 // CHECK19-NEXT:    ret void
15540 //
15541 //
15542 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..27
15543 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
15544 // CHECK19-NEXT:  entry:
15545 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15546 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15547 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
15548 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
15549 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15550 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
15551 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15552 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15553 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
15554 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
15555 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15556 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15557 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15558 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15559 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15560 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15561 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15562 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15563 // CHECK19-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
15564 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15565 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
15566 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
15567 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15568 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15569 // CHECK19-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
15570 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
15571 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15572 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15573 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
15574 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15575 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP4]], align 4
15576 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP5]], i32 33, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP3]])
15577 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
15578 // CHECK19:       omp.dispatch.cond:
15579 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15580 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15581 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP6]], [[TMP7]]
15582 // CHECK19-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
15583 // CHECK19:       cond.true:
15584 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15585 // CHECK19-NEXT:    br label [[COND_END:%.*]]
15586 // CHECK19:       cond.false:
15587 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15588 // CHECK19-NEXT:    br label [[COND_END]]
15589 // CHECK19:       cond.end:
15590 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP8]], [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
15591 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
15592 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
15593 // CHECK19-NEXT:    store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4
15594 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
15595 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15596 // CHECK19-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
15597 // CHECK19-NEXT:    br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
15598 // CHECK19:       omp.dispatch.body:
15599 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15600 // CHECK19:       omp.inner.for.cond:
15601 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !62
15602 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !62
15603 // CHECK19-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
15604 // CHECK19-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15605 // CHECK19:       omp.inner.for.body:
15606 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !62
15607 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1
15608 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
15609 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !62
15610 // CHECK19-NEXT:    [[TMP16:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !62
15611 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP16]]
15612 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !62
15613 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
15614 // CHECK19:       omp.body.continue:
15615 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15616 // CHECK19:       omp.inner.for.inc:
15617 // CHECK19-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !62
15618 // CHECK19-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP17]], 1
15619 // CHECK19-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !62
15620 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP63:![0-9]+]]
15621 // CHECK19:       omp.inner.for.end:
15622 // CHECK19-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
15623 // CHECK19:       omp.dispatch.inc:
15624 // CHECK19-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
15625 // CHECK19-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
15626 // CHECK19-NEXT:    [[ADD4:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
15627 // CHECK19-NEXT:    store i32 [[ADD4]], i32* [[DOTOMP_LB]], align 4
15628 // CHECK19-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15629 // CHECK19-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
15630 // CHECK19-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
15631 // CHECK19-NEXT:    store i32 [[ADD5]], i32* [[DOTOMP_UB]], align 4
15632 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND]]
15633 // CHECK19:       omp.dispatch.end:
15634 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP5]])
15635 // CHECK19-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15636 // CHECK19-NEXT:    [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
15637 // CHECK19-NEXT:    br i1 [[TMP23]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15638 // CHECK19:       .omp.final.then:
15639 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15640 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15641 // CHECK19:       .omp.final.done:
15642 // CHECK19-NEXT:    ret void
15643 //
15644 //
15645 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l137
15646 // CHECK19-SAME: ([10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15647 // CHECK19-NEXT:  entry:
15648 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15649 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15650 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15651 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
15652 // CHECK19-NEXT:    ret void
15653 //
15654 //
15655 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..30
15656 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15657 // CHECK19-NEXT:  entry:
15658 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15659 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15660 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15661 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15662 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15663 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
15664 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
15665 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15666 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15667 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15668 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15669 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15670 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15671 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15672 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
15673 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
15674 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15675 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15676 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15677 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
15678 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
15679 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15680 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
15681 // CHECK19-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
15682 // CHECK19:       cond.true:
15683 // CHECK19-NEXT:    br label [[COND_END:%.*]]
15684 // CHECK19:       cond.false:
15685 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15686 // CHECK19-NEXT:    br label [[COND_END]]
15687 // CHECK19:       cond.end:
15688 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
15689 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
15690 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
15691 // CHECK19-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
15692 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15693 // CHECK19:       omp.inner.for.cond:
15694 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !65
15695 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !65
15696 // CHECK19-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
15697 // CHECK19-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15698 // CHECK19:       omp.inner.for.body:
15699 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !65
15700 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !65
15701 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]]), !llvm.access.group !65
15702 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15703 // CHECK19:       omp.inner.for.inc:
15704 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !65
15705 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !65
15706 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
15707 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !65
15708 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP66:![0-9]+]]
15709 // CHECK19:       omp.inner.for.end:
15710 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
15711 // CHECK19:       omp.loop.exit:
15712 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
15713 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15714 // CHECK19-NEXT:    [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
15715 // CHECK19-NEXT:    br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15716 // CHECK19:       .omp.final.then:
15717 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15718 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15719 // CHECK19:       .omp.final.done:
15720 // CHECK19-NEXT:    ret void
15721 //
15722 //
15723 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..31
15724 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15725 // CHECK19-NEXT:  entry:
15726 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15727 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15728 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
15729 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
15730 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15731 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15732 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15733 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
15734 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
15735 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15736 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15737 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15738 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15739 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15740 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15741 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15742 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15743 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15744 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
15745 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
15746 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15747 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15748 // CHECK19-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
15749 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
15750 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15751 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15752 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
15753 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15754 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15755 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4
15756 // CHECK19-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32 1073741859, i32 [[TMP3]], i32 [[TMP4]], i32 1, i32 1)
15757 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
15758 // CHECK19:       omp.dispatch.cond:
15759 // CHECK19-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP6]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
15760 // CHECK19-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP7]], 0
15761 // CHECK19-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
15762 // CHECK19:       omp.dispatch.body:
15763 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
15764 // CHECK19-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_IV]], align 4
15765 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15766 // CHECK19:       omp.inner.for.cond:
15767 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !68
15768 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !68
15769 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]
15770 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15771 // CHECK19:       omp.inner.for.body:
15772 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !68
15773 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], 1
15774 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
15775 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !68
15776 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !68
15777 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP12]]
15778 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !68
15779 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
15780 // CHECK19:       omp.body.continue:
15781 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15782 // CHECK19:       omp.inner.for.inc:
15783 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !68
15784 // CHECK19-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP13]], 1
15785 // CHECK19-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !68
15786 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP69:![0-9]+]]
15787 // CHECK19:       omp.inner.for.end:
15788 // CHECK19-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
15789 // CHECK19:       omp.dispatch.inc:
15790 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND]]
15791 // CHECK19:       omp.dispatch.end:
15792 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15793 // CHECK19-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
15794 // CHECK19-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15795 // CHECK19:       .omp.final.then:
15796 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15797 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15798 // CHECK19:       .omp.final.done:
15799 // CHECK19-NEXT:    ret void
15800 //
15801 //
15802 // CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l142
15803 // CHECK19-SAME: (i32 noundef [[M:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
15804 // CHECK19-NEXT:  entry:
15805 // CHECK19-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
15806 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15807 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
15808 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
15809 // CHECK19-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
15810 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15811 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15812 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[M_ADDR]], align 4
15813 // CHECK19-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
15814 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
15815 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
15816 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
15817 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x i32]*, i32)* @.omp_outlined..34 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i32 [[TMP3]])
15818 // CHECK19-NEXT:    ret void
15819 //
15820 //
15821 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..34
15822 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
15823 // CHECK19-NEXT:  entry:
15824 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15825 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15826 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15827 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
15828 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15829 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15830 // CHECK19-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
15831 // CHECK19-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
15832 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15833 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15834 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15835 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
15836 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15837 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15838 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15839 // CHECK19-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
15840 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15841 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
15842 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
15843 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15844 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15845 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15846 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
15847 // CHECK19-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
15848 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15849 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
15850 // CHECK19-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
15851 // CHECK19:       cond.true:
15852 // CHECK19-NEXT:    br label [[COND_END:%.*]]
15853 // CHECK19:       cond.false:
15854 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
15855 // CHECK19-NEXT:    br label [[COND_END]]
15856 // CHECK19:       cond.end:
15857 // CHECK19-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
15858 // CHECK19-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
15859 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
15860 // CHECK19-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
15861 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15862 // CHECK19:       omp.inner.for.cond:
15863 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !71
15864 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !71
15865 // CHECK19-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
15866 // CHECK19-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15867 // CHECK19:       omp.inner.for.body:
15868 // CHECK19-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4, !llvm.access.group !71
15869 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4, !llvm.access.group !71
15870 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4, !llvm.access.group !71
15871 // CHECK19-NEXT:    store i32 [[TMP10]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !71
15872 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group !71
15873 // CHECK19-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, [10 x i32]*, i32)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]], i32 [[TMP11]]), !llvm.access.group !71
15874 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15875 // CHECK19:       omp.inner.for.inc:
15876 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !71
15877 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4, !llvm.access.group !71
15878 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
15879 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !71
15880 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP72:![0-9]+]]
15881 // CHECK19:       omp.inner.for.end:
15882 // CHECK19-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
15883 // CHECK19:       omp.loop.exit:
15884 // CHECK19-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
15885 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15886 // CHECK19-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
15887 // CHECK19-NEXT:    br i1 [[TMP15]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15888 // CHECK19:       .omp.final.then:
15889 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15890 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15891 // CHECK19:       .omp.final.done:
15892 // CHECK19-NEXT:    ret void
15893 //
15894 //
15895 // CHECK19-LABEL: define {{[^@]+}}@.omp_outlined..35
15896 // CHECK19-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
15897 // CHECK19-NEXT:  entry:
15898 // CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
15899 // CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
15900 // CHECK19-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
15901 // CHECK19-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
15902 // CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
15903 // CHECK19-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
15904 // CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
15905 // CHECK19-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15906 // CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
15907 // CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
15908 // CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
15909 // CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
15910 // CHECK19-NEXT:    [[I:%.*]] = alloca i32, align 4
15911 // CHECK19-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
15912 // CHECK19-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
15913 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15914 // CHECK19-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15915 // CHECK19-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
15916 // CHECK19-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
15917 // CHECK19-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
15918 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
15919 // CHECK19-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
15920 // CHECK19-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
15921 // CHECK19-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
15922 // CHECK19-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
15923 // CHECK19-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
15924 // CHECK19-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
15925 // CHECK19-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
15926 // CHECK19-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
15927 // CHECK19-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
15928 // CHECK19-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
15929 // CHECK19-NEXT:    [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
15930 // CHECK19-NEXT:    [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
15931 // CHECK19-NEXT:    call void @__kmpc_dispatch_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP7]], i32 1073741859, i32 [[TMP4]], i32 [[TMP5]], i32 1, i32 [[TMP3]])
15932 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND:%.*]]
15933 // CHECK19:       omp.dispatch.cond:
15934 // CHECK19-NEXT:    [[TMP8:%.*]] = call i32 @__kmpc_dispatch_next_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP7]], i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]])
15935 // CHECK19-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP8]], 0
15936 // CHECK19-NEXT:    br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]
15937 // CHECK19:       omp.dispatch.body:
15938 // CHECK19-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
15939 // CHECK19-NEXT:    store i32 [[TMP9]], i32* [[DOTOMP_IV]], align 4
15940 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
15941 // CHECK19:       omp.inner.for.cond:
15942 // CHECK19-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !74
15943 // CHECK19-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !74
15944 // CHECK19-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]
15945 // CHECK19-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
15946 // CHECK19:       omp.inner.for.body:
15947 // CHECK19-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !74
15948 // CHECK19-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP12]], 1
15949 // CHECK19-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
15950 // CHECK19-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !74
15951 // CHECK19-NEXT:    [[TMP13:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !74
15952 // CHECK19-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP13]]
15953 // CHECK19-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !74
15954 // CHECK19-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
15955 // CHECK19:       omp.body.continue:
15956 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
15957 // CHECK19:       omp.inner.for.inc:
15958 // CHECK19-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !74
15959 // CHECK19-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP14]], 1
15960 // CHECK19-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !74
15961 // CHECK19-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP75:![0-9]+]]
15962 // CHECK19:       omp.inner.for.end:
15963 // CHECK19-NEXT:    br label [[OMP_DISPATCH_INC:%.*]]
15964 // CHECK19:       omp.dispatch.inc:
15965 // CHECK19-NEXT:    br label [[OMP_DISPATCH_COND]]
15966 // CHECK19:       omp.dispatch.end:
15967 // CHECK19-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IS_LAST]], align 4
15968 // CHECK19-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
15969 // CHECK19-NEXT:    br i1 [[TMP16]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]
15970 // CHECK19:       .omp.final.then:
15971 // CHECK19-NEXT:    store i32 10, i32* [[I]], align 4
15972 // CHECK19-NEXT:    br label [[DOTOMP_FINAL_DONE]]
15973 // CHECK19:       .omp.final.done:
15974 // CHECK19-NEXT:    ret void
15975 //
15976 //
15977 // CHECK19-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
15978 // CHECK19-SAME: () #[[ATTR6:[0-9]+]] {
15979 // CHECK19-NEXT:  entry:
15980 // CHECK19-NEXT:    call void @__tgt_register_requires(i64 1)
15981 // CHECK19-NEXT:    ret void
15982 //
15983 //
15984 // CHECK21-LABEL: define {{[^@]+}}@main
15985 // CHECK21-SAME: (i32 noundef signext [[ARGC:%.*]], i8** noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
15986 // CHECK21-NEXT:  entry:
15987 // CHECK21-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
15988 // CHECK21-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
15989 // CHECK21-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 8
15990 // CHECK21-NEXT:    [[N:%.*]] = alloca i32, align 4
15991 // CHECK21-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 8
15992 // CHECK21-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i64, align 8
15993 // CHECK21-NEXT:    [[M:%.*]] = alloca i32, align 4
15994 // CHECK21-NEXT:    [[TMP:%.*]] = alloca i32, align 4
15995 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
15996 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
15997 // CHECK21-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
15998 // CHECK21-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
15999 // CHECK21-NEXT:    [[I:%.*]] = alloca i32, align 4
16000 // CHECK21-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
16001 // CHECK21-NEXT:    [[I3:%.*]] = alloca i32, align 4
16002 // CHECK21-NEXT:    [[_TMP10:%.*]] = alloca i32, align 4
16003 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_11:%.*]] = alloca i32, align 4
16004 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_12:%.*]] = alloca i32, align 4
16005 // CHECK21-NEXT:    [[DOTOMP_LB16:%.*]] = alloca i32, align 4
16006 // CHECK21-NEXT:    [[DOTOMP_UB17:%.*]] = alloca i32, align 4
16007 // CHECK21-NEXT:    [[I18:%.*]] = alloca i32, align 4
16008 // CHECK21-NEXT:    [[DOTOMP_IV21:%.*]] = alloca i32, align 4
16009 // CHECK21-NEXT:    [[I22:%.*]] = alloca i32, align 4
16010 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_39:%.*]] = alloca i32, align 4
16011 // CHECK21-NEXT:    [[_TMP40:%.*]] = alloca i32, align 4
16012 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_41:%.*]] = alloca i32, align 4
16013 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_42:%.*]] = alloca i32, align 4
16014 // CHECK21-NEXT:    [[DOTOMP_LB46:%.*]] = alloca i32, align 4
16015 // CHECK21-NEXT:    [[DOTOMP_UB47:%.*]] = alloca i32, align 4
16016 // CHECK21-NEXT:    [[I48:%.*]] = alloca i32, align 4
16017 // CHECK21-NEXT:    [[DOTOMP_IV51:%.*]] = alloca i32, align 4
16018 // CHECK21-NEXT:    [[I52:%.*]] = alloca i32, align 4
16019 // CHECK21-NEXT:    [[_TMP69:%.*]] = alloca i32, align 4
16020 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_70:%.*]] = alloca i32, align 4
16021 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_71:%.*]] = alloca i32, align 4
16022 // CHECK21-NEXT:    [[DOTOMP_LB75:%.*]] = alloca i32, align 4
16023 // CHECK21-NEXT:    [[DOTOMP_UB76:%.*]] = alloca i32, align 4
16024 // CHECK21-NEXT:    [[I77:%.*]] = alloca i32, align 4
16025 // CHECK21-NEXT:    [[DOTOMP_IV80:%.*]] = alloca i32, align 4
16026 // CHECK21-NEXT:    [[I81:%.*]] = alloca i32, align 4
16027 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_98:%.*]] = alloca i32, align 4
16028 // CHECK21-NEXT:    [[_TMP99:%.*]] = alloca i32, align 4
16029 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_100:%.*]] = alloca i32, align 4
16030 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_101:%.*]] = alloca i32, align 4
16031 // CHECK21-NEXT:    [[DOTOMP_LB105:%.*]] = alloca i32, align 4
16032 // CHECK21-NEXT:    [[DOTOMP_UB106:%.*]] = alloca i32, align 4
16033 // CHECK21-NEXT:    [[I107:%.*]] = alloca i32, align 4
16034 // CHECK21-NEXT:    [[DOTOMP_IV110:%.*]] = alloca i32, align 4
16035 // CHECK21-NEXT:    [[I111:%.*]] = alloca i32, align 4
16036 // CHECK21-NEXT:    store i32 0, i32* [[RETVAL]], align 4
16037 // CHECK21-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
16038 // CHECK21-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
16039 // CHECK21-NEXT:    store i32 100, i32* [[N]], align 4
16040 // CHECK21-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
16041 // CHECK21-NEXT:    [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
16042 // CHECK21-NEXT:    [[TMP2:%.*]] = call i8* @llvm.stacksave()
16043 // CHECK21-NEXT:    store i8* [[TMP2]], i8** [[SAVED_STACK]], align 8
16044 // CHECK21-NEXT:    [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 4
16045 // CHECK21-NEXT:    store i64 [[TMP1]], i64* [[__VLA_EXPR0]], align 8
16046 // CHECK21-NEXT:    store i32 10, i32* [[M]], align 4
16047 // CHECK21-NEXT:    [[TMP3:%.*]] = load i32, i32* [[N]], align 4
16048 // CHECK21-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
16049 // CHECK21-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
16050 // CHECK21-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
16051 // CHECK21-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
16052 // CHECK21-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
16053 // CHECK21-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
16054 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
16055 // CHECK21-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
16056 // CHECK21-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4
16057 // CHECK21-NEXT:    store i32 0, i32* [[I]], align 4
16058 // CHECK21-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
16059 // CHECK21-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]
16060 // CHECK21-NEXT:    br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]
16061 // CHECK21:       simd.if.then:
16062 // CHECK21-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
16063 // CHECK21-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
16064 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
16065 // CHECK21:       omp.inner.for.cond:
16066 // CHECK21-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !2
16067 // CHECK21-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !2
16068 // CHECK21-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
16069 // CHECK21-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
16070 // CHECK21:       omp.inner.for.body:
16071 // CHECK21-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !2
16072 // CHECK21-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
16073 // CHECK21-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
16074 // CHECK21-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !2
16075 // CHECK21-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !2
16076 // CHECK21-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
16077 // CHECK21-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i64 [[IDXPROM]]
16078 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !2
16079 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
16080 // CHECK21:       omp.body.continue:
16081 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
16082 // CHECK21:       omp.inner.for.inc:
16083 // CHECK21-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !2
16084 // CHECK21-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP12]], 1
16085 // CHECK21-NEXT:    store i32 [[ADD5]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !2
16086 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]
16087 // CHECK21:       omp.inner.for.end:
16088 // CHECK21-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
16089 // CHECK21-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP13]], 0
16090 // CHECK21-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
16091 // CHECK21-NEXT:    [[MUL8:%.*]] = mul nsw i32 [[DIV7]], 1
16092 // CHECK21-NEXT:    [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]
16093 // CHECK21-NEXT:    store i32 [[ADD9]], i32* [[I3]], align 4
16094 // CHECK21-NEXT:    br label [[SIMD_IF_END]]
16095 // CHECK21:       simd.if.end:
16096 // CHECK21-NEXT:    [[TMP14:%.*]] = load i32, i32* [[N]], align 4
16097 // CHECK21-NEXT:    store i32 [[TMP14]], i32* [[DOTCAPTURE_EXPR_11]], align 4
16098 // CHECK21-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
16099 // CHECK21-NEXT:    [[SUB13:%.*]] = sub nsw i32 [[TMP15]], 0
16100 // CHECK21-NEXT:    [[DIV14:%.*]] = sdiv i32 [[SUB13]], 1
16101 // CHECK21-NEXT:    [[SUB15:%.*]] = sub nsw i32 [[DIV14]], 1
16102 // CHECK21-NEXT:    store i32 [[SUB15]], i32* [[DOTCAPTURE_EXPR_12]], align 4
16103 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB16]], align 4
16104 // CHECK21-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_12]], align 4
16105 // CHECK21-NEXT:    store i32 [[TMP16]], i32* [[DOTOMP_UB17]], align 4
16106 // CHECK21-NEXT:    store i32 0, i32* [[I18]], align 4
16107 // CHECK21-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
16108 // CHECK21-NEXT:    [[CMP19:%.*]] = icmp slt i32 0, [[TMP17]]
16109 // CHECK21-NEXT:    br i1 [[CMP19]], label [[SIMD_IF_THEN20:%.*]], label [[SIMD_IF_END38:%.*]]
16110 // CHECK21:       simd.if.then20:
16111 // CHECK21-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_LB16]], align 4
16112 // CHECK21-NEXT:    store i32 [[TMP18]], i32* [[DOTOMP_IV21]], align 4
16113 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND23:%.*]]
16114 // CHECK21:       omp.inner.for.cond23:
16115 // CHECK21-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !6
16116 // CHECK21-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_UB17]], align 4, !llvm.access.group !6
16117 // CHECK21-NEXT:    [[CMP24:%.*]] = icmp sle i32 [[TMP19]], [[TMP20]]
16118 // CHECK21-NEXT:    br i1 [[CMP24]], label [[OMP_INNER_FOR_BODY25:%.*]], label [[OMP_INNER_FOR_END33:%.*]]
16119 // CHECK21:       omp.inner.for.body25:
16120 // CHECK21-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !6
16121 // CHECK21-NEXT:    [[MUL26:%.*]] = mul nsw i32 [[TMP21]], 1
16122 // CHECK21-NEXT:    [[ADD27:%.*]] = add nsw i32 0, [[MUL26]]
16123 // CHECK21-NEXT:    store i32 [[ADD27]], i32* [[I22]], align 4, !llvm.access.group !6
16124 // CHECK21-NEXT:    [[TMP22:%.*]] = load i32, i32* [[I22]], align 4, !llvm.access.group !6
16125 // CHECK21-NEXT:    [[IDXPROM28:%.*]] = sext i32 [[TMP22]] to i64
16126 // CHECK21-NEXT:    [[ARRAYIDX29:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i64 [[IDXPROM28]]
16127 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX29]], align 4, !llvm.access.group !6
16128 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE30:%.*]]
16129 // CHECK21:       omp.body.continue30:
16130 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC31:%.*]]
16131 // CHECK21:       omp.inner.for.inc31:
16132 // CHECK21-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !6
16133 // CHECK21-NEXT:    [[ADD32:%.*]] = add nsw i32 [[TMP23]], 1
16134 // CHECK21-NEXT:    store i32 [[ADD32]], i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !6
16135 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND23]], !llvm.loop [[LOOP7:![0-9]+]]
16136 // CHECK21:       omp.inner.for.end33:
16137 // CHECK21-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
16138 // CHECK21-NEXT:    [[SUB34:%.*]] = sub nsw i32 [[TMP24]], 0
16139 // CHECK21-NEXT:    [[DIV35:%.*]] = sdiv i32 [[SUB34]], 1
16140 // CHECK21-NEXT:    [[MUL36:%.*]] = mul nsw i32 [[DIV35]], 1
16141 // CHECK21-NEXT:    [[ADD37:%.*]] = add nsw i32 0, [[MUL36]]
16142 // CHECK21-NEXT:    store i32 [[ADD37]], i32* [[I22]], align 4
16143 // CHECK21-NEXT:    br label [[SIMD_IF_END38]]
16144 // CHECK21:       simd.if.end38:
16145 // CHECK21-NEXT:    [[TMP25:%.*]] = load i32, i32* [[M]], align 4
16146 // CHECK21-NEXT:    store i32 [[TMP25]], i32* [[DOTCAPTURE_EXPR_39]], align 4
16147 // CHECK21-NEXT:    [[TMP26:%.*]] = load i32, i32* [[N]], align 4
16148 // CHECK21-NEXT:    store i32 [[TMP26]], i32* [[DOTCAPTURE_EXPR_41]], align 4
16149 // CHECK21-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_41]], align 4
16150 // CHECK21-NEXT:    [[SUB43:%.*]] = sub nsw i32 [[TMP27]], 0
16151 // CHECK21-NEXT:    [[DIV44:%.*]] = sdiv i32 [[SUB43]], 1
16152 // CHECK21-NEXT:    [[SUB45:%.*]] = sub nsw i32 [[DIV44]], 1
16153 // CHECK21-NEXT:    store i32 [[SUB45]], i32* [[DOTCAPTURE_EXPR_42]], align 4
16154 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB46]], align 4
16155 // CHECK21-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_42]], align 4
16156 // CHECK21-NEXT:    store i32 [[TMP28]], i32* [[DOTOMP_UB47]], align 4
16157 // CHECK21-NEXT:    store i32 0, i32* [[I48]], align 4
16158 // CHECK21-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_41]], align 4
16159 // CHECK21-NEXT:    [[CMP49:%.*]] = icmp slt i32 0, [[TMP29]]
16160 // CHECK21-NEXT:    br i1 [[CMP49]], label [[SIMD_IF_THEN50:%.*]], label [[SIMD_IF_END68:%.*]]
16161 // CHECK21:       simd.if.then50:
16162 // CHECK21-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_LB46]], align 4
16163 // CHECK21-NEXT:    store i32 [[TMP30]], i32* [[DOTOMP_IV51]], align 4
16164 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND53:%.*]]
16165 // CHECK21:       omp.inner.for.cond53:
16166 // CHECK21-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_IV51]], align 4, !llvm.access.group !9
16167 // CHECK21-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_UB47]], align 4, !llvm.access.group !9
16168 // CHECK21-NEXT:    [[CMP54:%.*]] = icmp sle i32 [[TMP31]], [[TMP32]]
16169 // CHECK21-NEXT:    br i1 [[CMP54]], label [[OMP_INNER_FOR_BODY55:%.*]], label [[OMP_INNER_FOR_END63:%.*]]
16170 // CHECK21:       omp.inner.for.body55:
16171 // CHECK21-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_IV51]], align 4, !llvm.access.group !9
16172 // CHECK21-NEXT:    [[MUL56:%.*]] = mul nsw i32 [[TMP33]], 1
16173 // CHECK21-NEXT:    [[ADD57:%.*]] = add nsw i32 0, [[MUL56]]
16174 // CHECK21-NEXT:    store i32 [[ADD57]], i32* [[I52]], align 4, !llvm.access.group !9
16175 // CHECK21-NEXT:    [[TMP34:%.*]] = load i32, i32* [[I52]], align 4, !llvm.access.group !9
16176 // CHECK21-NEXT:    [[IDXPROM58:%.*]] = sext i32 [[TMP34]] to i64
16177 // CHECK21-NEXT:    [[ARRAYIDX59:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i64 [[IDXPROM58]]
16178 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX59]], align 4, !llvm.access.group !9
16179 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE60:%.*]]
16180 // CHECK21:       omp.body.continue60:
16181 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC61:%.*]]
16182 // CHECK21:       omp.inner.for.inc61:
16183 // CHECK21-NEXT:    [[TMP35:%.*]] = load i32, i32* [[DOTOMP_IV51]], align 4, !llvm.access.group !9
16184 // CHECK21-NEXT:    [[ADD62:%.*]] = add nsw i32 [[TMP35]], 1
16185 // CHECK21-NEXT:    store i32 [[ADD62]], i32* [[DOTOMP_IV51]], align 4, !llvm.access.group !9
16186 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND53]], !llvm.loop [[LOOP10:![0-9]+]]
16187 // CHECK21:       omp.inner.for.end63:
16188 // CHECK21-NEXT:    [[TMP36:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_41]], align 4
16189 // CHECK21-NEXT:    [[SUB64:%.*]] = sub nsw i32 [[TMP36]], 0
16190 // CHECK21-NEXT:    [[DIV65:%.*]] = sdiv i32 [[SUB64]], 1
16191 // CHECK21-NEXT:    [[MUL66:%.*]] = mul nsw i32 [[DIV65]], 1
16192 // CHECK21-NEXT:    [[ADD67:%.*]] = add nsw i32 0, [[MUL66]]
16193 // CHECK21-NEXT:    store i32 [[ADD67]], i32* [[I52]], align 4
16194 // CHECK21-NEXT:    br label [[SIMD_IF_END68]]
16195 // CHECK21:       simd.if.end68:
16196 // CHECK21-NEXT:    [[TMP37:%.*]] = load i32, i32* [[N]], align 4
16197 // CHECK21-NEXT:    store i32 [[TMP37]], i32* [[DOTCAPTURE_EXPR_70]], align 4
16198 // CHECK21-NEXT:    [[TMP38:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_70]], align 4
16199 // CHECK21-NEXT:    [[SUB72:%.*]] = sub nsw i32 [[TMP38]], 0
16200 // CHECK21-NEXT:    [[DIV73:%.*]] = sdiv i32 [[SUB72]], 1
16201 // CHECK21-NEXT:    [[SUB74:%.*]] = sub nsw i32 [[DIV73]], 1
16202 // CHECK21-NEXT:    store i32 [[SUB74]], i32* [[DOTCAPTURE_EXPR_71]], align 4
16203 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB75]], align 4
16204 // CHECK21-NEXT:    [[TMP39:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_71]], align 4
16205 // CHECK21-NEXT:    store i32 [[TMP39]], i32* [[DOTOMP_UB76]], align 4
16206 // CHECK21-NEXT:    store i32 0, i32* [[I77]], align 4
16207 // CHECK21-NEXT:    [[TMP40:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_70]], align 4
16208 // CHECK21-NEXT:    [[CMP78:%.*]] = icmp slt i32 0, [[TMP40]]
16209 // CHECK21-NEXT:    br i1 [[CMP78]], label [[SIMD_IF_THEN79:%.*]], label [[SIMD_IF_END97:%.*]]
16210 // CHECK21:       simd.if.then79:
16211 // CHECK21-NEXT:    [[TMP41:%.*]] = load i32, i32* [[DOTOMP_LB75]], align 4
16212 // CHECK21-NEXT:    store i32 [[TMP41]], i32* [[DOTOMP_IV80]], align 4
16213 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND82:%.*]]
16214 // CHECK21:       omp.inner.for.cond82:
16215 // CHECK21-NEXT:    [[TMP42:%.*]] = load i32, i32* [[DOTOMP_IV80]], align 4, !llvm.access.group !12
16216 // CHECK21-NEXT:    [[TMP43:%.*]] = load i32, i32* [[DOTOMP_UB76]], align 4, !llvm.access.group !12
16217 // CHECK21-NEXT:    [[CMP83:%.*]] = icmp sle i32 [[TMP42]], [[TMP43]]
16218 // CHECK21-NEXT:    br i1 [[CMP83]], label [[OMP_INNER_FOR_BODY84:%.*]], label [[OMP_INNER_FOR_END92:%.*]]
16219 // CHECK21:       omp.inner.for.body84:
16220 // CHECK21-NEXT:    [[TMP44:%.*]] = load i32, i32* [[DOTOMP_IV80]], align 4, !llvm.access.group !12
16221 // CHECK21-NEXT:    [[MUL85:%.*]] = mul nsw i32 [[TMP44]], 1
16222 // CHECK21-NEXT:    [[ADD86:%.*]] = add nsw i32 0, [[MUL85]]
16223 // CHECK21-NEXT:    store i32 [[ADD86]], i32* [[I81]], align 4, !llvm.access.group !12
16224 // CHECK21-NEXT:    [[TMP45:%.*]] = load i32, i32* [[I81]], align 4, !llvm.access.group !12
16225 // CHECK21-NEXT:    [[IDXPROM87:%.*]] = sext i32 [[TMP45]] to i64
16226 // CHECK21-NEXT:    [[ARRAYIDX88:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i64 [[IDXPROM87]]
16227 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX88]], align 4, !llvm.access.group !12
16228 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE89:%.*]]
16229 // CHECK21:       omp.body.continue89:
16230 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC90:%.*]]
16231 // CHECK21:       omp.inner.for.inc90:
16232 // CHECK21-NEXT:    [[TMP46:%.*]] = load i32, i32* [[DOTOMP_IV80]], align 4, !llvm.access.group !12
16233 // CHECK21-NEXT:    [[ADD91:%.*]] = add nsw i32 [[TMP46]], 1
16234 // CHECK21-NEXT:    store i32 [[ADD91]], i32* [[DOTOMP_IV80]], align 4, !llvm.access.group !12
16235 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND82]], !llvm.loop [[LOOP13:![0-9]+]]
16236 // CHECK21:       omp.inner.for.end92:
16237 // CHECK21-NEXT:    [[TMP47:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_70]], align 4
16238 // CHECK21-NEXT:    [[SUB93:%.*]] = sub nsw i32 [[TMP47]], 0
16239 // CHECK21-NEXT:    [[DIV94:%.*]] = sdiv i32 [[SUB93]], 1
16240 // CHECK21-NEXT:    [[MUL95:%.*]] = mul nsw i32 [[DIV94]], 1
16241 // CHECK21-NEXT:    [[ADD96:%.*]] = add nsw i32 0, [[MUL95]]
16242 // CHECK21-NEXT:    store i32 [[ADD96]], i32* [[I81]], align 4
16243 // CHECK21-NEXT:    br label [[SIMD_IF_END97]]
16244 // CHECK21:       simd.if.end97:
16245 // CHECK21-NEXT:    [[TMP48:%.*]] = load i32, i32* [[M]], align 4
16246 // CHECK21-NEXT:    store i32 [[TMP48]], i32* [[DOTCAPTURE_EXPR_98]], align 4
16247 // CHECK21-NEXT:    [[TMP49:%.*]] = load i32, i32* [[N]], align 4
16248 // CHECK21-NEXT:    store i32 [[TMP49]], i32* [[DOTCAPTURE_EXPR_100]], align 4
16249 // CHECK21-NEXT:    [[TMP50:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_100]], align 4
16250 // CHECK21-NEXT:    [[SUB102:%.*]] = sub nsw i32 [[TMP50]], 0
16251 // CHECK21-NEXT:    [[DIV103:%.*]] = sdiv i32 [[SUB102]], 1
16252 // CHECK21-NEXT:    [[SUB104:%.*]] = sub nsw i32 [[DIV103]], 1
16253 // CHECK21-NEXT:    store i32 [[SUB104]], i32* [[DOTCAPTURE_EXPR_101]], align 4
16254 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB105]], align 4
16255 // CHECK21-NEXT:    [[TMP51:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_101]], align 4
16256 // CHECK21-NEXT:    store i32 [[TMP51]], i32* [[DOTOMP_UB106]], align 4
16257 // CHECK21-NEXT:    store i32 0, i32* [[I107]], align 4
16258 // CHECK21-NEXT:    [[TMP52:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_100]], align 4
16259 // CHECK21-NEXT:    [[CMP108:%.*]] = icmp slt i32 0, [[TMP52]]
16260 // CHECK21-NEXT:    br i1 [[CMP108]], label [[SIMD_IF_THEN109:%.*]], label [[SIMD_IF_END127:%.*]]
16261 // CHECK21:       simd.if.then109:
16262 // CHECK21-NEXT:    [[TMP53:%.*]] = load i32, i32* [[DOTOMP_LB105]], align 4
16263 // CHECK21-NEXT:    store i32 [[TMP53]], i32* [[DOTOMP_IV110]], align 4
16264 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND112:%.*]]
16265 // CHECK21:       omp.inner.for.cond112:
16266 // CHECK21-NEXT:    [[TMP54:%.*]] = load i32, i32* [[DOTOMP_IV110]], align 4, !llvm.access.group !15
16267 // CHECK21-NEXT:    [[TMP55:%.*]] = load i32, i32* [[DOTOMP_UB106]], align 4, !llvm.access.group !15
16268 // CHECK21-NEXT:    [[CMP113:%.*]] = icmp sle i32 [[TMP54]], [[TMP55]]
16269 // CHECK21-NEXT:    br i1 [[CMP113]], label [[OMP_INNER_FOR_BODY114:%.*]], label [[OMP_INNER_FOR_END122:%.*]]
16270 // CHECK21:       omp.inner.for.body114:
16271 // CHECK21-NEXT:    [[TMP56:%.*]] = load i32, i32* [[DOTOMP_IV110]], align 4, !llvm.access.group !15
16272 // CHECK21-NEXT:    [[MUL115:%.*]] = mul nsw i32 [[TMP56]], 1
16273 // CHECK21-NEXT:    [[ADD116:%.*]] = add nsw i32 0, [[MUL115]]
16274 // CHECK21-NEXT:    store i32 [[ADD116]], i32* [[I111]], align 4, !llvm.access.group !15
16275 // CHECK21-NEXT:    [[TMP57:%.*]] = load i32, i32* [[I111]], align 4, !llvm.access.group !15
16276 // CHECK21-NEXT:    [[IDXPROM117:%.*]] = sext i32 [[TMP57]] to i64
16277 // CHECK21-NEXT:    [[ARRAYIDX118:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i64 [[IDXPROM117]]
16278 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX118]], align 4, !llvm.access.group !15
16279 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE119:%.*]]
16280 // CHECK21:       omp.body.continue119:
16281 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC120:%.*]]
16282 // CHECK21:       omp.inner.for.inc120:
16283 // CHECK21-NEXT:    [[TMP58:%.*]] = load i32, i32* [[DOTOMP_IV110]], align 4, !llvm.access.group !15
16284 // CHECK21-NEXT:    [[ADD121:%.*]] = add nsw i32 [[TMP58]], 1
16285 // CHECK21-NEXT:    store i32 [[ADD121]], i32* [[DOTOMP_IV110]], align 4, !llvm.access.group !15
16286 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND112]], !llvm.loop [[LOOP16:![0-9]+]]
16287 // CHECK21:       omp.inner.for.end122:
16288 // CHECK21-NEXT:    [[TMP59:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_100]], align 4
16289 // CHECK21-NEXT:    [[SUB123:%.*]] = sub nsw i32 [[TMP59]], 0
16290 // CHECK21-NEXT:    [[DIV124:%.*]] = sdiv i32 [[SUB123]], 1
16291 // CHECK21-NEXT:    [[MUL125:%.*]] = mul nsw i32 [[DIV124]], 1
16292 // CHECK21-NEXT:    [[ADD126:%.*]] = add nsw i32 0, [[MUL125]]
16293 // CHECK21-NEXT:    store i32 [[ADD126]], i32* [[I111]], align 4
16294 // CHECK21-NEXT:    br label [[SIMD_IF_END127]]
16295 // CHECK21:       simd.if.end127:
16296 // CHECK21-NEXT:    [[TMP60:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
16297 // CHECK21-NEXT:    [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiLi10EEiT_(i32 noundef signext [[TMP60]])
16298 // CHECK21-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
16299 // CHECK21-NEXT:    [[TMP61:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8
16300 // CHECK21-NEXT:    call void @llvm.stackrestore(i8* [[TMP61]])
16301 // CHECK21-NEXT:    [[TMP62:%.*]] = load i32, i32* [[RETVAL]], align 4
16302 // CHECK21-NEXT:    ret i32 [[TMP62]]
16303 //
16304 //
16305 // CHECK21-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
16306 // CHECK21-SAME: (i32 noundef signext [[ARGC:%.*]]) #[[ATTR2:[0-9]+]] comdat {
16307 // CHECK21-NEXT:  entry:
16308 // CHECK21-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
16309 // CHECK21-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
16310 // CHECK21-NEXT:    [[M:%.*]] = alloca i32, align 4
16311 // CHECK21-NEXT:    [[TMP:%.*]] = alloca i32, align 4
16312 // CHECK21-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
16313 // CHECK21-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
16314 // CHECK21-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
16315 // CHECK21-NEXT:    [[I:%.*]] = alloca i32, align 4
16316 // CHECK21-NEXT:    [[_TMP2:%.*]] = alloca i32, align 4
16317 // CHECK21-NEXT:    [[DOTOMP_LB3:%.*]] = alloca i32, align 4
16318 // CHECK21-NEXT:    [[DOTOMP_UB4:%.*]] = alloca i32, align 4
16319 // CHECK21-NEXT:    [[DOTOMP_IV5:%.*]] = alloca i32, align 4
16320 // CHECK21-NEXT:    [[I6:%.*]] = alloca i32, align 4
16321 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
16322 // CHECK21-NEXT:    [[_TMP18:%.*]] = alloca i32, align 4
16323 // CHECK21-NEXT:    [[DOTOMP_LB19:%.*]] = alloca i32, align 4
16324 // CHECK21-NEXT:    [[DOTOMP_UB20:%.*]] = alloca i32, align 4
16325 // CHECK21-NEXT:    [[DOTOMP_IV21:%.*]] = alloca i32, align 4
16326 // CHECK21-NEXT:    [[I22:%.*]] = alloca i32, align 4
16327 // CHECK21-NEXT:    [[_TMP34:%.*]] = alloca i32, align 4
16328 // CHECK21-NEXT:    [[DOTOMP_LB35:%.*]] = alloca i32, align 4
16329 // CHECK21-NEXT:    [[DOTOMP_UB36:%.*]] = alloca i32, align 4
16330 // CHECK21-NEXT:    [[DOTOMP_IV37:%.*]] = alloca i32, align 4
16331 // CHECK21-NEXT:    [[I38:%.*]] = alloca i32, align 4
16332 // CHECK21-NEXT:    [[DOTCAPTURE_EXPR_50:%.*]] = alloca i32, align 4
16333 // CHECK21-NEXT:    [[_TMP51:%.*]] = alloca i32, align 4
16334 // CHECK21-NEXT:    [[DOTOMP_LB52:%.*]] = alloca i32, align 4
16335 // CHECK21-NEXT:    [[DOTOMP_UB53:%.*]] = alloca i32, align 4
16336 // CHECK21-NEXT:    [[DOTOMP_IV54:%.*]] = alloca i32, align 4
16337 // CHECK21-NEXT:    [[I55:%.*]] = alloca i32, align 4
16338 // CHECK21-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
16339 // CHECK21-NEXT:    store i32 10, i32* [[M]], align 4
16340 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
16341 // CHECK21-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
16342 // CHECK21-NEXT:    [[TMP0:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
16343 // CHECK21-NEXT:    store i32 [[TMP0]], i32* [[DOTOMP_IV]], align 4
16344 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
16345 // CHECK21:       omp.inner.for.cond:
16346 // CHECK21-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
16347 // CHECK21-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !18
16348 // CHECK21-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]
16349 // CHECK21-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
16350 // CHECK21:       omp.inner.for.body:
16351 // CHECK21-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
16352 // CHECK21-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP3]], 1
16353 // CHECK21-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
16354 // CHECK21-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !18
16355 // CHECK21-NEXT:    [[TMP4:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !18
16356 // CHECK21-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64
16357 // CHECK21-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
16358 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !18
16359 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
16360 // CHECK21:       omp.body.continue:
16361 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
16362 // CHECK21:       omp.inner.for.inc:
16363 // CHECK21-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
16364 // CHECK21-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP5]], 1
16365 // CHECK21-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !18
16366 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP19:![0-9]+]]
16367 // CHECK21:       omp.inner.for.end:
16368 // CHECK21-NEXT:    store i32 10, i32* [[I]], align 4
16369 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB3]], align 4
16370 // CHECK21-NEXT:    store i32 9, i32* [[DOTOMP_UB4]], align 4
16371 // CHECK21-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_LB3]], align 4
16372 // CHECK21-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_IV5]], align 4
16373 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND7:%.*]]
16374 // CHECK21:       omp.inner.for.cond7:
16375 // CHECK21-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_IV5]], align 4, !llvm.access.group !21
16376 // CHECK21-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB4]], align 4, !llvm.access.group !21
16377 // CHECK21-NEXT:    [[CMP8:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]
16378 // CHECK21-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY9:%.*]], label [[OMP_INNER_FOR_END17:%.*]]
16379 // CHECK21:       omp.inner.for.body9:
16380 // CHECK21-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV5]], align 4, !llvm.access.group !21
16381 // CHECK21-NEXT:    [[MUL10:%.*]] = mul nsw i32 [[TMP9]], 1
16382 // CHECK21-NEXT:    [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]
16383 // CHECK21-NEXT:    store i32 [[ADD11]], i32* [[I6]], align 4, !llvm.access.group !21
16384 // CHECK21-NEXT:    [[TMP10:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !21
16385 // CHECK21-NEXT:    [[IDXPROM12:%.*]] = sext i32 [[TMP10]] to i64
16386 // CHECK21-NEXT:    [[ARRAYIDX13:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i64 0, i64 [[IDXPROM12]]
16387 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX13]], align 4, !llvm.access.group !21
16388 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE14:%.*]]
16389 // CHECK21:       omp.body.continue14:
16390 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC15:%.*]]
16391 // CHECK21:       omp.inner.for.inc15:
16392 // CHECK21-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV5]], align 4, !llvm.access.group !21
16393 // CHECK21-NEXT:    [[ADD16:%.*]] = add nsw i32 [[TMP11]], 1
16394 // CHECK21-NEXT:    store i32 [[ADD16]], i32* [[DOTOMP_IV5]], align 4, !llvm.access.group !21
16395 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND7]], !llvm.loop [[LOOP22:![0-9]+]]
16396 // CHECK21:       omp.inner.for.end17:
16397 // CHECK21-NEXT:    store i32 10, i32* [[I6]], align 4
16398 // CHECK21-NEXT:    [[TMP12:%.*]] = load i32, i32* [[M]], align 4
16399 // CHECK21-NEXT:    store i32 [[TMP12]], i32* [[DOTCAPTURE_EXPR_]], align 4
16400 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB19]], align 4
16401 // CHECK21-NEXT:    store i32 9, i32* [[DOTOMP_UB20]], align 4
16402 // CHECK21-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_LB19]], align 4
16403 // CHECK21-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV21]], align 4
16404 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND23:%.*]]
16405 // CHECK21:       omp.inner.for.cond23:
16406 // CHECK21-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !24
16407 // CHECK21-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB20]], align 4, !llvm.access.group !24
16408 // CHECK21-NEXT:    [[CMP24:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
16409 // CHECK21-NEXT:    br i1 [[CMP24]], label [[OMP_INNER_FOR_BODY25:%.*]], label [[OMP_INNER_FOR_END33:%.*]]
16410 // CHECK21:       omp.inner.for.body25:
16411 // CHECK21-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !24
16412 // CHECK21-NEXT:    [[MUL26:%.*]] = mul nsw i32 [[TMP16]], 1
16413 // CHECK21-NEXT:    [[ADD27:%.*]] = add nsw i32 0, [[MUL26]]
16414 // CHECK21-NEXT:    store i32 [[ADD27]], i32* [[I22]], align 4, !llvm.access.group !24
16415 // CHECK21-NEXT:    [[TMP17:%.*]] = load i32, i32* [[I22]], align 4, !llvm.access.group !24
16416 // CHECK21-NEXT:    [[IDXPROM28:%.*]] = sext i32 [[TMP17]] to i64
16417 // CHECK21-NEXT:    [[ARRAYIDX29:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i64 0, i64 [[IDXPROM28]]
16418 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX29]], align 4, !llvm.access.group !24
16419 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE30:%.*]]
16420 // CHECK21:       omp.body.continue30:
16421 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC31:%.*]]
16422 // CHECK21:       omp.inner.for.inc31:
16423 // CHECK21-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !24
16424 // CHECK21-NEXT:    [[ADD32:%.*]] = add nsw i32 [[TMP18]], 1
16425 // CHECK21-NEXT:    store i32 [[ADD32]], i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !24
16426 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND23]], !llvm.loop [[LOOP25:![0-9]+]]
16427 // CHECK21:       omp.inner.for.end33:
16428 // CHECK21-NEXT:    store i32 10, i32* [[I22]], align 4
16429 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB35]], align 4
16430 // CHECK21-NEXT:    store i32 9, i32* [[DOTOMP_UB36]], align 4
16431 // CHECK21-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_LB35]], align 4
16432 // CHECK21-NEXT:    store i32 [[TMP19]], i32* [[DOTOMP_IV37]], align 4
16433 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND39:%.*]]
16434 // CHECK21:       omp.inner.for.cond39:
16435 // CHECK21-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV37]], align 4, !llvm.access.group !27
16436 // CHECK21-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB36]], align 4, !llvm.access.group !27
16437 // CHECK21-NEXT:    [[CMP40:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]
16438 // CHECK21-NEXT:    br i1 [[CMP40]], label [[OMP_INNER_FOR_BODY41:%.*]], label [[OMP_INNER_FOR_END49:%.*]]
16439 // CHECK21:       omp.inner.for.body41:
16440 // CHECK21-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV37]], align 4, !llvm.access.group !27
16441 // CHECK21-NEXT:    [[MUL42:%.*]] = mul nsw i32 [[TMP22]], 1
16442 // CHECK21-NEXT:    [[ADD43:%.*]] = add nsw i32 0, [[MUL42]]
16443 // CHECK21-NEXT:    store i32 [[ADD43]], i32* [[I38]], align 4, !llvm.access.group !27
16444 // CHECK21-NEXT:    [[TMP23:%.*]] = load i32, i32* [[I38]], align 4, !llvm.access.group !27
16445 // CHECK21-NEXT:    [[IDXPROM44:%.*]] = sext i32 [[TMP23]] to i64
16446 // CHECK21-NEXT:    [[ARRAYIDX45:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i64 0, i64 [[IDXPROM44]]
16447 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX45]], align 4, !llvm.access.group !27
16448 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE46:%.*]]
16449 // CHECK21:       omp.body.continue46:
16450 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC47:%.*]]
16451 // CHECK21:       omp.inner.for.inc47:
16452 // CHECK21-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IV37]], align 4, !llvm.access.group !27
16453 // CHECK21-NEXT:    [[ADD48:%.*]] = add nsw i32 [[TMP24]], 1
16454 // CHECK21-NEXT:    store i32 [[ADD48]], i32* [[DOTOMP_IV37]], align 4, !llvm.access.group !27
16455 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND39]], !llvm.loop [[LOOP28:![0-9]+]]
16456 // CHECK21:       omp.inner.for.end49:
16457 // CHECK21-NEXT:    store i32 10, i32* [[I38]], align 4
16458 // CHECK21-NEXT:    [[TMP25:%.*]] = load i32, i32* [[M]], align 4
16459 // CHECK21-NEXT:    store i32 [[TMP25]], i32* [[DOTCAPTURE_EXPR_50]], align 4
16460 // CHECK21-NEXT:    store i32 0, i32* [[DOTOMP_LB52]], align 4
16461 // CHECK21-NEXT:    store i32 9, i32* [[DOTOMP_UB53]], align 4
16462 // CHECK21-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_LB52]], align 4
16463 // CHECK21-NEXT:    store i32 [[TMP26]], i32* [[DOTOMP_IV54]], align 4
16464 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND56:%.*]]
16465 // CHECK21:       omp.inner.for.cond56:
16466 // CHECK21-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_IV54]], align 4, !llvm.access.group !30
16467 // CHECK21-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_UB53]], align 4, !llvm.access.group !30
16468 // CHECK21-NEXT:    [[CMP57:%.*]] = icmp sle i32 [[TMP27]], [[TMP28]]
16469 // CHECK21-NEXT:    br i1 [[CMP57]], label [[OMP_INNER_FOR_BODY58:%.*]], label [[OMP_INNER_FOR_END66:%.*]]
16470 // CHECK21:       omp.inner.for.body58:
16471 // CHECK21-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_IV54]], align 4, !llvm.access.group !30
16472 // CHECK21-NEXT:    [[MUL59:%.*]] = mul nsw i32 [[TMP29]], 1
16473 // CHECK21-NEXT:    [[ADD60:%.*]] = add nsw i32 0, [[MUL59]]
16474 // CHECK21-NEXT:    store i32 [[ADD60]], i32* [[I55]], align 4, !llvm.access.group !30
16475 // CHECK21-NEXT:    [[TMP30:%.*]] = load i32, i32* [[I55]], align 4, !llvm.access.group !30
16476 // CHECK21-NEXT:    [[IDXPROM61:%.*]] = sext i32 [[TMP30]] to i64
16477 // CHECK21-NEXT:    [[ARRAYIDX62:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i64 0, i64 [[IDXPROM61]]
16478 // CHECK21-NEXT:    store i32 0, i32* [[ARRAYIDX62]], align 4, !llvm.access.group !30
16479 // CHECK21-NEXT:    br label [[OMP_BODY_CONTINUE63:%.*]]
16480 // CHECK21:       omp.body.continue63:
16481 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_INC64:%.*]]
16482 // CHECK21:       omp.inner.for.inc64:
16483 // CHECK21-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_IV54]], align 4, !llvm.access.group !30
16484 // CHECK21-NEXT:    [[ADD65:%.*]] = add nsw i32 [[TMP31]], 1
16485 // CHECK21-NEXT:    store i32 [[ADD65]], i32* [[DOTOMP_IV54]], align 4, !llvm.access.group !30
16486 // CHECK21-NEXT:    br label [[OMP_INNER_FOR_COND56]], !llvm.loop [[LOOP31:![0-9]+]]
16487 // CHECK21:       omp.inner.for.end66:
16488 // CHECK21-NEXT:    store i32 10, i32* [[I55]], align 4
16489 // CHECK21-NEXT:    ret i32 0
16490 //
16491 //
16492 // CHECK23-LABEL: define {{[^@]+}}@main
16493 // CHECK23-SAME: (i32 noundef [[ARGC:%.*]], i8** noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
16494 // CHECK23-NEXT:  entry:
16495 // CHECK23-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
16496 // CHECK23-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
16497 // CHECK23-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 4
16498 // CHECK23-NEXT:    [[N:%.*]] = alloca i32, align 4
16499 // CHECK23-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 4
16500 // CHECK23-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i32, align 4
16501 // CHECK23-NEXT:    [[M:%.*]] = alloca i32, align 4
16502 // CHECK23-NEXT:    [[TMP:%.*]] = alloca i32, align 4
16503 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
16504 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
16505 // CHECK23-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
16506 // CHECK23-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
16507 // CHECK23-NEXT:    [[I:%.*]] = alloca i32, align 4
16508 // CHECK23-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
16509 // CHECK23-NEXT:    [[I3:%.*]] = alloca i32, align 4
16510 // CHECK23-NEXT:    [[_TMP10:%.*]] = alloca i32, align 4
16511 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_11:%.*]] = alloca i32, align 4
16512 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_12:%.*]] = alloca i32, align 4
16513 // CHECK23-NEXT:    [[DOTOMP_LB16:%.*]] = alloca i32, align 4
16514 // CHECK23-NEXT:    [[DOTOMP_UB17:%.*]] = alloca i32, align 4
16515 // CHECK23-NEXT:    [[I18:%.*]] = alloca i32, align 4
16516 // CHECK23-NEXT:    [[DOTOMP_IV21:%.*]] = alloca i32, align 4
16517 // CHECK23-NEXT:    [[I22:%.*]] = alloca i32, align 4
16518 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_38:%.*]] = alloca i32, align 4
16519 // CHECK23-NEXT:    [[_TMP39:%.*]] = alloca i32, align 4
16520 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_40:%.*]] = alloca i32, align 4
16521 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_41:%.*]] = alloca i32, align 4
16522 // CHECK23-NEXT:    [[DOTOMP_LB45:%.*]] = alloca i32, align 4
16523 // CHECK23-NEXT:    [[DOTOMP_UB46:%.*]] = alloca i32, align 4
16524 // CHECK23-NEXT:    [[I47:%.*]] = alloca i32, align 4
16525 // CHECK23-NEXT:    [[DOTOMP_IV50:%.*]] = alloca i32, align 4
16526 // CHECK23-NEXT:    [[I51:%.*]] = alloca i32, align 4
16527 // CHECK23-NEXT:    [[_TMP67:%.*]] = alloca i32, align 4
16528 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_68:%.*]] = alloca i32, align 4
16529 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_69:%.*]] = alloca i32, align 4
16530 // CHECK23-NEXT:    [[DOTOMP_LB73:%.*]] = alloca i32, align 4
16531 // CHECK23-NEXT:    [[DOTOMP_UB74:%.*]] = alloca i32, align 4
16532 // CHECK23-NEXT:    [[I75:%.*]] = alloca i32, align 4
16533 // CHECK23-NEXT:    [[DOTOMP_IV78:%.*]] = alloca i32, align 4
16534 // CHECK23-NEXT:    [[I79:%.*]] = alloca i32, align 4
16535 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_95:%.*]] = alloca i32, align 4
16536 // CHECK23-NEXT:    [[_TMP96:%.*]] = alloca i32, align 4
16537 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_97:%.*]] = alloca i32, align 4
16538 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_98:%.*]] = alloca i32, align 4
16539 // CHECK23-NEXT:    [[DOTOMP_LB102:%.*]] = alloca i32, align 4
16540 // CHECK23-NEXT:    [[DOTOMP_UB103:%.*]] = alloca i32, align 4
16541 // CHECK23-NEXT:    [[I104:%.*]] = alloca i32, align 4
16542 // CHECK23-NEXT:    [[DOTOMP_IV107:%.*]] = alloca i32, align 4
16543 // CHECK23-NEXT:    [[I108:%.*]] = alloca i32, align 4
16544 // CHECK23-NEXT:    store i32 0, i32* [[RETVAL]], align 4
16545 // CHECK23-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
16546 // CHECK23-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 4
16547 // CHECK23-NEXT:    store i32 100, i32* [[N]], align 4
16548 // CHECK23-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
16549 // CHECK23-NEXT:    [[TMP1:%.*]] = call i8* @llvm.stacksave()
16550 // CHECK23-NEXT:    store i8* [[TMP1]], i8** [[SAVED_STACK]], align 4
16551 // CHECK23-NEXT:    [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 4
16552 // CHECK23-NEXT:    store i32 [[TMP0]], i32* [[__VLA_EXPR0]], align 4
16553 // CHECK23-NEXT:    store i32 10, i32* [[M]], align 4
16554 // CHECK23-NEXT:    [[TMP2:%.*]] = load i32, i32* [[N]], align 4
16555 // CHECK23-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
16556 // CHECK23-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
16557 // CHECK23-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
16558 // CHECK23-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
16559 // CHECK23-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
16560 // CHECK23-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
16561 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
16562 // CHECK23-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
16563 // CHECK23-NEXT:    store i32 [[TMP4]], i32* [[DOTOMP_UB]], align 4
16564 // CHECK23-NEXT:    store i32 0, i32* [[I]], align 4
16565 // CHECK23-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
16566 // CHECK23-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
16567 // CHECK23-NEXT:    br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]
16568 // CHECK23:       simd.if.then:
16569 // CHECK23-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
16570 // CHECK23-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_IV]], align 4
16571 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
16572 // CHECK23:       omp.inner.for.cond:
16573 // CHECK23-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !3
16574 // CHECK23-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !3
16575 // CHECK23-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]
16576 // CHECK23-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
16577 // CHECK23:       omp.inner.for.body:
16578 // CHECK23-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !3
16579 // CHECK23-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP9]], 1
16580 // CHECK23-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
16581 // CHECK23-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4, !llvm.access.group !3
16582 // CHECK23-NEXT:    [[TMP10:%.*]] = load i32, i32* [[I3]], align 4, !llvm.access.group !3
16583 // CHECK23-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i32 [[TMP10]]
16584 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !3
16585 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
16586 // CHECK23:       omp.body.continue:
16587 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
16588 // CHECK23:       omp.inner.for.inc:
16589 // CHECK23-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !3
16590 // CHECK23-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP11]], 1
16591 // CHECK23-NEXT:    store i32 [[ADD5]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !3
16592 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]
16593 // CHECK23:       omp.inner.for.end:
16594 // CHECK23-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
16595 // CHECK23-NEXT:    [[SUB6:%.*]] = sub nsw i32 [[TMP12]], 0
16596 // CHECK23-NEXT:    [[DIV7:%.*]] = sdiv i32 [[SUB6]], 1
16597 // CHECK23-NEXT:    [[MUL8:%.*]] = mul nsw i32 [[DIV7]], 1
16598 // CHECK23-NEXT:    [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]
16599 // CHECK23-NEXT:    store i32 [[ADD9]], i32* [[I3]], align 4
16600 // CHECK23-NEXT:    br label [[SIMD_IF_END]]
16601 // CHECK23:       simd.if.end:
16602 // CHECK23-NEXT:    [[TMP13:%.*]] = load i32, i32* [[N]], align 4
16603 // CHECK23-NEXT:    store i32 [[TMP13]], i32* [[DOTCAPTURE_EXPR_11]], align 4
16604 // CHECK23-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
16605 // CHECK23-NEXT:    [[SUB13:%.*]] = sub nsw i32 [[TMP14]], 0
16606 // CHECK23-NEXT:    [[DIV14:%.*]] = sdiv i32 [[SUB13]], 1
16607 // CHECK23-NEXT:    [[SUB15:%.*]] = sub nsw i32 [[DIV14]], 1
16608 // CHECK23-NEXT:    store i32 [[SUB15]], i32* [[DOTCAPTURE_EXPR_12]], align 4
16609 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB16]], align 4
16610 // CHECK23-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_12]], align 4
16611 // CHECK23-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_UB17]], align 4
16612 // CHECK23-NEXT:    store i32 0, i32* [[I18]], align 4
16613 // CHECK23-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
16614 // CHECK23-NEXT:    [[CMP19:%.*]] = icmp slt i32 0, [[TMP16]]
16615 // CHECK23-NEXT:    br i1 [[CMP19]], label [[SIMD_IF_THEN20:%.*]], label [[SIMD_IF_END37:%.*]]
16616 // CHECK23:       simd.if.then20:
16617 // CHECK23-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_LB16]], align 4
16618 // CHECK23-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV21]], align 4
16619 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND23:%.*]]
16620 // CHECK23:       omp.inner.for.cond23:
16621 // CHECK23-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !7
16622 // CHECK23-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_UB17]], align 4, !llvm.access.group !7
16623 // CHECK23-NEXT:    [[CMP24:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]
16624 // CHECK23-NEXT:    br i1 [[CMP24]], label [[OMP_INNER_FOR_BODY25:%.*]], label [[OMP_INNER_FOR_END32:%.*]]
16625 // CHECK23:       omp.inner.for.body25:
16626 // CHECK23-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !7
16627 // CHECK23-NEXT:    [[MUL26:%.*]] = mul nsw i32 [[TMP20]], 1
16628 // CHECK23-NEXT:    [[ADD27:%.*]] = add nsw i32 0, [[MUL26]]
16629 // CHECK23-NEXT:    store i32 [[ADD27]], i32* [[I22]], align 4, !llvm.access.group !7
16630 // CHECK23-NEXT:    [[TMP21:%.*]] = load i32, i32* [[I22]], align 4, !llvm.access.group !7
16631 // CHECK23-NEXT:    [[ARRAYIDX28:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i32 [[TMP21]]
16632 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX28]], align 4, !llvm.access.group !7
16633 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE29:%.*]]
16634 // CHECK23:       omp.body.continue29:
16635 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC30:%.*]]
16636 // CHECK23:       omp.inner.for.inc30:
16637 // CHECK23-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !7
16638 // CHECK23-NEXT:    [[ADD31:%.*]] = add nsw i32 [[TMP22]], 1
16639 // CHECK23-NEXT:    store i32 [[ADD31]], i32* [[DOTOMP_IV21]], align 4, !llvm.access.group !7
16640 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND23]], !llvm.loop [[LOOP8:![0-9]+]]
16641 // CHECK23:       omp.inner.for.end32:
16642 // CHECK23-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
16643 // CHECK23-NEXT:    [[SUB33:%.*]] = sub nsw i32 [[TMP23]], 0
16644 // CHECK23-NEXT:    [[DIV34:%.*]] = sdiv i32 [[SUB33]], 1
16645 // CHECK23-NEXT:    [[MUL35:%.*]] = mul nsw i32 [[DIV34]], 1
16646 // CHECK23-NEXT:    [[ADD36:%.*]] = add nsw i32 0, [[MUL35]]
16647 // CHECK23-NEXT:    store i32 [[ADD36]], i32* [[I22]], align 4
16648 // CHECK23-NEXT:    br label [[SIMD_IF_END37]]
16649 // CHECK23:       simd.if.end37:
16650 // CHECK23-NEXT:    [[TMP24:%.*]] = load i32, i32* [[M]], align 4
16651 // CHECK23-NEXT:    store i32 [[TMP24]], i32* [[DOTCAPTURE_EXPR_38]], align 4
16652 // CHECK23-NEXT:    [[TMP25:%.*]] = load i32, i32* [[N]], align 4
16653 // CHECK23-NEXT:    store i32 [[TMP25]], i32* [[DOTCAPTURE_EXPR_40]], align 4
16654 // CHECK23-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_40]], align 4
16655 // CHECK23-NEXT:    [[SUB42:%.*]] = sub nsw i32 [[TMP26]], 0
16656 // CHECK23-NEXT:    [[DIV43:%.*]] = sdiv i32 [[SUB42]], 1
16657 // CHECK23-NEXT:    [[SUB44:%.*]] = sub nsw i32 [[DIV43]], 1
16658 // CHECK23-NEXT:    store i32 [[SUB44]], i32* [[DOTCAPTURE_EXPR_41]], align 4
16659 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB45]], align 4
16660 // CHECK23-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_41]], align 4
16661 // CHECK23-NEXT:    store i32 [[TMP27]], i32* [[DOTOMP_UB46]], align 4
16662 // CHECK23-NEXT:    store i32 0, i32* [[I47]], align 4
16663 // CHECK23-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_40]], align 4
16664 // CHECK23-NEXT:    [[CMP48:%.*]] = icmp slt i32 0, [[TMP28]]
16665 // CHECK23-NEXT:    br i1 [[CMP48]], label [[SIMD_IF_THEN49:%.*]], label [[SIMD_IF_END66:%.*]]
16666 // CHECK23:       simd.if.then49:
16667 // CHECK23-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_LB45]], align 4
16668 // CHECK23-NEXT:    store i32 [[TMP29]], i32* [[DOTOMP_IV50]], align 4
16669 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND52:%.*]]
16670 // CHECK23:       omp.inner.for.cond52:
16671 // CHECK23-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_IV50]], align 4, !llvm.access.group !10
16672 // CHECK23-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_UB46]], align 4, !llvm.access.group !10
16673 // CHECK23-NEXT:    [[CMP53:%.*]] = icmp sle i32 [[TMP30]], [[TMP31]]
16674 // CHECK23-NEXT:    br i1 [[CMP53]], label [[OMP_INNER_FOR_BODY54:%.*]], label [[OMP_INNER_FOR_END61:%.*]]
16675 // CHECK23:       omp.inner.for.body54:
16676 // CHECK23-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV50]], align 4, !llvm.access.group !10
16677 // CHECK23-NEXT:    [[MUL55:%.*]] = mul nsw i32 [[TMP32]], 1
16678 // CHECK23-NEXT:    [[ADD56:%.*]] = add nsw i32 0, [[MUL55]]
16679 // CHECK23-NEXT:    store i32 [[ADD56]], i32* [[I51]], align 4, !llvm.access.group !10
16680 // CHECK23-NEXT:    [[TMP33:%.*]] = load i32, i32* [[I51]], align 4, !llvm.access.group !10
16681 // CHECK23-NEXT:    [[ARRAYIDX57:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i32 [[TMP33]]
16682 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX57]], align 4, !llvm.access.group !10
16683 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE58:%.*]]
16684 // CHECK23:       omp.body.continue58:
16685 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC59:%.*]]
16686 // CHECK23:       omp.inner.for.inc59:
16687 // CHECK23-NEXT:    [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IV50]], align 4, !llvm.access.group !10
16688 // CHECK23-NEXT:    [[ADD60:%.*]] = add nsw i32 [[TMP34]], 1
16689 // CHECK23-NEXT:    store i32 [[ADD60]], i32* [[DOTOMP_IV50]], align 4, !llvm.access.group !10
16690 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND52]], !llvm.loop [[LOOP11:![0-9]+]]
16691 // CHECK23:       omp.inner.for.end61:
16692 // CHECK23-NEXT:    [[TMP35:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_40]], align 4
16693 // CHECK23-NEXT:    [[SUB62:%.*]] = sub nsw i32 [[TMP35]], 0
16694 // CHECK23-NEXT:    [[DIV63:%.*]] = sdiv i32 [[SUB62]], 1
16695 // CHECK23-NEXT:    [[MUL64:%.*]] = mul nsw i32 [[DIV63]], 1
16696 // CHECK23-NEXT:    [[ADD65:%.*]] = add nsw i32 0, [[MUL64]]
16697 // CHECK23-NEXT:    store i32 [[ADD65]], i32* [[I51]], align 4
16698 // CHECK23-NEXT:    br label [[SIMD_IF_END66]]
16699 // CHECK23:       simd.if.end66:
16700 // CHECK23-NEXT:    [[TMP36:%.*]] = load i32, i32* [[N]], align 4
16701 // CHECK23-NEXT:    store i32 [[TMP36]], i32* [[DOTCAPTURE_EXPR_68]], align 4
16702 // CHECK23-NEXT:    [[TMP37:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_68]], align 4
16703 // CHECK23-NEXT:    [[SUB70:%.*]] = sub nsw i32 [[TMP37]], 0
16704 // CHECK23-NEXT:    [[DIV71:%.*]] = sdiv i32 [[SUB70]], 1
16705 // CHECK23-NEXT:    [[SUB72:%.*]] = sub nsw i32 [[DIV71]], 1
16706 // CHECK23-NEXT:    store i32 [[SUB72]], i32* [[DOTCAPTURE_EXPR_69]], align 4
16707 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB73]], align 4
16708 // CHECK23-NEXT:    [[TMP38:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_69]], align 4
16709 // CHECK23-NEXT:    store i32 [[TMP38]], i32* [[DOTOMP_UB74]], align 4
16710 // CHECK23-NEXT:    store i32 0, i32* [[I75]], align 4
16711 // CHECK23-NEXT:    [[TMP39:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_68]], align 4
16712 // CHECK23-NEXT:    [[CMP76:%.*]] = icmp slt i32 0, [[TMP39]]
16713 // CHECK23-NEXT:    br i1 [[CMP76]], label [[SIMD_IF_THEN77:%.*]], label [[SIMD_IF_END94:%.*]]
16714 // CHECK23:       simd.if.then77:
16715 // CHECK23-NEXT:    [[TMP40:%.*]] = load i32, i32* [[DOTOMP_LB73]], align 4
16716 // CHECK23-NEXT:    store i32 [[TMP40]], i32* [[DOTOMP_IV78]], align 4
16717 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND80:%.*]]
16718 // CHECK23:       omp.inner.for.cond80:
16719 // CHECK23-NEXT:    [[TMP41:%.*]] = load i32, i32* [[DOTOMP_IV78]], align 4, !llvm.access.group !13
16720 // CHECK23-NEXT:    [[TMP42:%.*]] = load i32, i32* [[DOTOMP_UB74]], align 4, !llvm.access.group !13
16721 // CHECK23-NEXT:    [[CMP81:%.*]] = icmp sle i32 [[TMP41]], [[TMP42]]
16722 // CHECK23-NEXT:    br i1 [[CMP81]], label [[OMP_INNER_FOR_BODY82:%.*]], label [[OMP_INNER_FOR_END89:%.*]]
16723 // CHECK23:       omp.inner.for.body82:
16724 // CHECK23-NEXT:    [[TMP43:%.*]] = load i32, i32* [[DOTOMP_IV78]], align 4, !llvm.access.group !13
16725 // CHECK23-NEXT:    [[MUL83:%.*]] = mul nsw i32 [[TMP43]], 1
16726 // CHECK23-NEXT:    [[ADD84:%.*]] = add nsw i32 0, [[MUL83]]
16727 // CHECK23-NEXT:    store i32 [[ADD84]], i32* [[I79]], align 4, !llvm.access.group !13
16728 // CHECK23-NEXT:    [[TMP44:%.*]] = load i32, i32* [[I79]], align 4, !llvm.access.group !13
16729 // CHECK23-NEXT:    [[ARRAYIDX85:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i32 [[TMP44]]
16730 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX85]], align 4, !llvm.access.group !13
16731 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE86:%.*]]
16732 // CHECK23:       omp.body.continue86:
16733 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC87:%.*]]
16734 // CHECK23:       omp.inner.for.inc87:
16735 // CHECK23-NEXT:    [[TMP45:%.*]] = load i32, i32* [[DOTOMP_IV78]], align 4, !llvm.access.group !13
16736 // CHECK23-NEXT:    [[ADD88:%.*]] = add nsw i32 [[TMP45]], 1
16737 // CHECK23-NEXT:    store i32 [[ADD88]], i32* [[DOTOMP_IV78]], align 4, !llvm.access.group !13
16738 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND80]], !llvm.loop [[LOOP14:![0-9]+]]
16739 // CHECK23:       omp.inner.for.end89:
16740 // CHECK23-NEXT:    [[TMP46:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_68]], align 4
16741 // CHECK23-NEXT:    [[SUB90:%.*]] = sub nsw i32 [[TMP46]], 0
16742 // CHECK23-NEXT:    [[DIV91:%.*]] = sdiv i32 [[SUB90]], 1
16743 // CHECK23-NEXT:    [[MUL92:%.*]] = mul nsw i32 [[DIV91]], 1
16744 // CHECK23-NEXT:    [[ADD93:%.*]] = add nsw i32 0, [[MUL92]]
16745 // CHECK23-NEXT:    store i32 [[ADD93]], i32* [[I79]], align 4
16746 // CHECK23-NEXT:    br label [[SIMD_IF_END94]]
16747 // CHECK23:       simd.if.end94:
16748 // CHECK23-NEXT:    [[TMP47:%.*]] = load i32, i32* [[M]], align 4
16749 // CHECK23-NEXT:    store i32 [[TMP47]], i32* [[DOTCAPTURE_EXPR_95]], align 4
16750 // CHECK23-NEXT:    [[TMP48:%.*]] = load i32, i32* [[N]], align 4
16751 // CHECK23-NEXT:    store i32 [[TMP48]], i32* [[DOTCAPTURE_EXPR_97]], align 4
16752 // CHECK23-NEXT:    [[TMP49:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_97]], align 4
16753 // CHECK23-NEXT:    [[SUB99:%.*]] = sub nsw i32 [[TMP49]], 0
16754 // CHECK23-NEXT:    [[DIV100:%.*]] = sdiv i32 [[SUB99]], 1
16755 // CHECK23-NEXT:    [[SUB101:%.*]] = sub nsw i32 [[DIV100]], 1
16756 // CHECK23-NEXT:    store i32 [[SUB101]], i32* [[DOTCAPTURE_EXPR_98]], align 4
16757 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB102]], align 4
16758 // CHECK23-NEXT:    [[TMP50:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_98]], align 4
16759 // CHECK23-NEXT:    store i32 [[TMP50]], i32* [[DOTOMP_UB103]], align 4
16760 // CHECK23-NEXT:    store i32 0, i32* [[I104]], align 4
16761 // CHECK23-NEXT:    [[TMP51:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_97]], align 4
16762 // CHECK23-NEXT:    [[CMP105:%.*]] = icmp slt i32 0, [[TMP51]]
16763 // CHECK23-NEXT:    br i1 [[CMP105]], label [[SIMD_IF_THEN106:%.*]], label [[SIMD_IF_END123:%.*]]
16764 // CHECK23:       simd.if.then106:
16765 // CHECK23-NEXT:    [[TMP52:%.*]] = load i32, i32* [[DOTOMP_LB102]], align 4
16766 // CHECK23-NEXT:    store i32 [[TMP52]], i32* [[DOTOMP_IV107]], align 4
16767 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND109:%.*]]
16768 // CHECK23:       omp.inner.for.cond109:
16769 // CHECK23-NEXT:    [[TMP53:%.*]] = load i32, i32* [[DOTOMP_IV107]], align 4, !llvm.access.group !16
16770 // CHECK23-NEXT:    [[TMP54:%.*]] = load i32, i32* [[DOTOMP_UB103]], align 4, !llvm.access.group !16
16771 // CHECK23-NEXT:    [[CMP110:%.*]] = icmp sle i32 [[TMP53]], [[TMP54]]
16772 // CHECK23-NEXT:    br i1 [[CMP110]], label [[OMP_INNER_FOR_BODY111:%.*]], label [[OMP_INNER_FOR_END118:%.*]]
16773 // CHECK23:       omp.inner.for.body111:
16774 // CHECK23-NEXT:    [[TMP55:%.*]] = load i32, i32* [[DOTOMP_IV107]], align 4, !llvm.access.group !16
16775 // CHECK23-NEXT:    [[MUL112:%.*]] = mul nsw i32 [[TMP55]], 1
16776 // CHECK23-NEXT:    [[ADD113:%.*]] = add nsw i32 0, [[MUL112]]
16777 // CHECK23-NEXT:    store i32 [[ADD113]], i32* [[I108]], align 4, !llvm.access.group !16
16778 // CHECK23-NEXT:    [[TMP56:%.*]] = load i32, i32* [[I108]], align 4, !llvm.access.group !16
16779 // CHECK23-NEXT:    [[ARRAYIDX114:%.*]] = getelementptr inbounds i32, i32* [[VLA]], i32 [[TMP56]]
16780 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX114]], align 4, !llvm.access.group !16
16781 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE115:%.*]]
16782 // CHECK23:       omp.body.continue115:
16783 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC116:%.*]]
16784 // CHECK23:       omp.inner.for.inc116:
16785 // CHECK23-NEXT:    [[TMP57:%.*]] = load i32, i32* [[DOTOMP_IV107]], align 4, !llvm.access.group !16
16786 // CHECK23-NEXT:    [[ADD117:%.*]] = add nsw i32 [[TMP57]], 1
16787 // CHECK23-NEXT:    store i32 [[ADD117]], i32* [[DOTOMP_IV107]], align 4, !llvm.access.group !16
16788 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND109]], !llvm.loop [[LOOP17:![0-9]+]]
16789 // CHECK23:       omp.inner.for.end118:
16790 // CHECK23-NEXT:    [[TMP58:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_97]], align 4
16791 // CHECK23-NEXT:    [[SUB119:%.*]] = sub nsw i32 [[TMP58]], 0
16792 // CHECK23-NEXT:    [[DIV120:%.*]] = sdiv i32 [[SUB119]], 1
16793 // CHECK23-NEXT:    [[MUL121:%.*]] = mul nsw i32 [[DIV120]], 1
16794 // CHECK23-NEXT:    [[ADD122:%.*]] = add nsw i32 0, [[MUL121]]
16795 // CHECK23-NEXT:    store i32 [[ADD122]], i32* [[I108]], align 4
16796 // CHECK23-NEXT:    br label [[SIMD_IF_END123]]
16797 // CHECK23:       simd.if.end123:
16798 // CHECK23-NEXT:    [[TMP59:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
16799 // CHECK23-NEXT:    [[CALL:%.*]] = call noundef i32 @_Z5tmainIiLi10EEiT_(i32 noundef [[TMP59]])
16800 // CHECK23-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
16801 // CHECK23-NEXT:    [[TMP60:%.*]] = load i8*, i8** [[SAVED_STACK]], align 4
16802 // CHECK23-NEXT:    call void @llvm.stackrestore(i8* [[TMP60]])
16803 // CHECK23-NEXT:    [[TMP61:%.*]] = load i32, i32* [[RETVAL]], align 4
16804 // CHECK23-NEXT:    ret i32 [[TMP61]]
16805 //
16806 //
16807 // CHECK23-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
16808 // CHECK23-SAME: (i32 noundef [[ARGC:%.*]]) #[[ATTR2:[0-9]+]] comdat {
16809 // CHECK23-NEXT:  entry:
16810 // CHECK23-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
16811 // CHECK23-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
16812 // CHECK23-NEXT:    [[M:%.*]] = alloca i32, align 4
16813 // CHECK23-NEXT:    [[TMP:%.*]] = alloca i32, align 4
16814 // CHECK23-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
16815 // CHECK23-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
16816 // CHECK23-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
16817 // CHECK23-NEXT:    [[I:%.*]] = alloca i32, align 4
16818 // CHECK23-NEXT:    [[_TMP2:%.*]] = alloca i32, align 4
16819 // CHECK23-NEXT:    [[DOTOMP_LB3:%.*]] = alloca i32, align 4
16820 // CHECK23-NEXT:    [[DOTOMP_UB4:%.*]] = alloca i32, align 4
16821 // CHECK23-NEXT:    [[DOTOMP_IV5:%.*]] = alloca i32, align 4
16822 // CHECK23-NEXT:    [[I6:%.*]] = alloca i32, align 4
16823 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
16824 // CHECK23-NEXT:    [[_TMP17:%.*]] = alloca i32, align 4
16825 // CHECK23-NEXT:    [[DOTOMP_LB18:%.*]] = alloca i32, align 4
16826 // CHECK23-NEXT:    [[DOTOMP_UB19:%.*]] = alloca i32, align 4
16827 // CHECK23-NEXT:    [[DOTOMP_IV20:%.*]] = alloca i32, align 4
16828 // CHECK23-NEXT:    [[I21:%.*]] = alloca i32, align 4
16829 // CHECK23-NEXT:    [[_TMP32:%.*]] = alloca i32, align 4
16830 // CHECK23-NEXT:    [[DOTOMP_LB33:%.*]] = alloca i32, align 4
16831 // CHECK23-NEXT:    [[DOTOMP_UB34:%.*]] = alloca i32, align 4
16832 // CHECK23-NEXT:    [[DOTOMP_IV35:%.*]] = alloca i32, align 4
16833 // CHECK23-NEXT:    [[I36:%.*]] = alloca i32, align 4
16834 // CHECK23-NEXT:    [[DOTCAPTURE_EXPR_47:%.*]] = alloca i32, align 4
16835 // CHECK23-NEXT:    [[_TMP48:%.*]] = alloca i32, align 4
16836 // CHECK23-NEXT:    [[DOTOMP_LB49:%.*]] = alloca i32, align 4
16837 // CHECK23-NEXT:    [[DOTOMP_UB50:%.*]] = alloca i32, align 4
16838 // CHECK23-NEXT:    [[DOTOMP_IV51:%.*]] = alloca i32, align 4
16839 // CHECK23-NEXT:    [[I52:%.*]] = alloca i32, align 4
16840 // CHECK23-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
16841 // CHECK23-NEXT:    store i32 10, i32* [[M]], align 4
16842 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
16843 // CHECK23-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
16844 // CHECK23-NEXT:    [[TMP0:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
16845 // CHECK23-NEXT:    store i32 [[TMP0]], i32* [[DOTOMP_IV]], align 4
16846 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
16847 // CHECK23:       omp.inner.for.cond:
16848 // CHECK23-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !19
16849 // CHECK23-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4, !llvm.access.group !19
16850 // CHECK23-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]
16851 // CHECK23-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
16852 // CHECK23:       omp.inner.for.body:
16853 // CHECK23-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !19
16854 // CHECK23-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP3]], 1
16855 // CHECK23-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
16856 // CHECK23-NEXT:    store i32 [[ADD]], i32* [[I]], align 4, !llvm.access.group !19
16857 // CHECK23-NEXT:    [[TMP4:%.*]] = load i32, i32* [[I]], align 4, !llvm.access.group !19
16858 // CHECK23-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i32 0, i32 [[TMP4]]
16859 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4, !llvm.access.group !19
16860 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
16861 // CHECK23:       omp.body.continue:
16862 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
16863 // CHECK23:       omp.inner.for.inc:
16864 // CHECK23-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4, !llvm.access.group !19
16865 // CHECK23-NEXT:    [[ADD1:%.*]] = add nsw i32 [[TMP5]], 1
16866 // CHECK23-NEXT:    store i32 [[ADD1]], i32* [[DOTOMP_IV]], align 4, !llvm.access.group !19
16867 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP20:![0-9]+]]
16868 // CHECK23:       omp.inner.for.end:
16869 // CHECK23-NEXT:    store i32 10, i32* [[I]], align 4
16870 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB3]], align 4
16871 // CHECK23-NEXT:    store i32 9, i32* [[DOTOMP_UB4]], align 4
16872 // CHECK23-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_LB3]], align 4
16873 // CHECK23-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_IV5]], align 4
16874 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND7:%.*]]
16875 // CHECK23:       omp.inner.for.cond7:
16876 // CHECK23-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_IV5]], align 4, !llvm.access.group !22
16877 // CHECK23-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB4]], align 4, !llvm.access.group !22
16878 // CHECK23-NEXT:    [[CMP8:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]
16879 // CHECK23-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY9:%.*]], label [[OMP_INNER_FOR_END16:%.*]]
16880 // CHECK23:       omp.inner.for.body9:
16881 // CHECK23-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV5]], align 4, !llvm.access.group !22
16882 // CHECK23-NEXT:    [[MUL10:%.*]] = mul nsw i32 [[TMP9]], 1
16883 // CHECK23-NEXT:    [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]
16884 // CHECK23-NEXT:    store i32 [[ADD11]], i32* [[I6]], align 4, !llvm.access.group !22
16885 // CHECK23-NEXT:    [[TMP10:%.*]] = load i32, i32* [[I6]], align 4, !llvm.access.group !22
16886 // CHECK23-NEXT:    [[ARRAYIDX12:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i32 0, i32 [[TMP10]]
16887 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX12]], align 4, !llvm.access.group !22
16888 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE13:%.*]]
16889 // CHECK23:       omp.body.continue13:
16890 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC14:%.*]]
16891 // CHECK23:       omp.inner.for.inc14:
16892 // CHECK23-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV5]], align 4, !llvm.access.group !22
16893 // CHECK23-NEXT:    [[ADD15:%.*]] = add nsw i32 [[TMP11]], 1
16894 // CHECK23-NEXT:    store i32 [[ADD15]], i32* [[DOTOMP_IV5]], align 4, !llvm.access.group !22
16895 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND7]], !llvm.loop [[LOOP23:![0-9]+]]
16896 // CHECK23:       omp.inner.for.end16:
16897 // CHECK23-NEXT:    store i32 10, i32* [[I6]], align 4
16898 // CHECK23-NEXT:    [[TMP12:%.*]] = load i32, i32* [[M]], align 4
16899 // CHECK23-NEXT:    store i32 [[TMP12]], i32* [[DOTCAPTURE_EXPR_]], align 4
16900 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB18]], align 4
16901 // CHECK23-NEXT:    store i32 9, i32* [[DOTOMP_UB19]], align 4
16902 // CHECK23-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_LB18]], align 4
16903 // CHECK23-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV20]], align 4
16904 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND22:%.*]]
16905 // CHECK23:       omp.inner.for.cond22:
16906 // CHECK23-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV20]], align 4, !llvm.access.group !25
16907 // CHECK23-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB19]], align 4, !llvm.access.group !25
16908 // CHECK23-NEXT:    [[CMP23:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
16909 // CHECK23-NEXT:    br i1 [[CMP23]], label [[OMP_INNER_FOR_BODY24:%.*]], label [[OMP_INNER_FOR_END31:%.*]]
16910 // CHECK23:       omp.inner.for.body24:
16911 // CHECK23-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV20]], align 4, !llvm.access.group !25
16912 // CHECK23-NEXT:    [[MUL25:%.*]] = mul nsw i32 [[TMP16]], 1
16913 // CHECK23-NEXT:    [[ADD26:%.*]] = add nsw i32 0, [[MUL25]]
16914 // CHECK23-NEXT:    store i32 [[ADD26]], i32* [[I21]], align 4, !llvm.access.group !25
16915 // CHECK23-NEXT:    [[TMP17:%.*]] = load i32, i32* [[I21]], align 4, !llvm.access.group !25
16916 // CHECK23-NEXT:    [[ARRAYIDX27:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i32 0, i32 [[TMP17]]
16917 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX27]], align 4, !llvm.access.group !25
16918 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE28:%.*]]
16919 // CHECK23:       omp.body.continue28:
16920 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC29:%.*]]
16921 // CHECK23:       omp.inner.for.inc29:
16922 // CHECK23-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV20]], align 4, !llvm.access.group !25
16923 // CHECK23-NEXT:    [[ADD30:%.*]] = add nsw i32 [[TMP18]], 1
16924 // CHECK23-NEXT:    store i32 [[ADD30]], i32* [[DOTOMP_IV20]], align 4, !llvm.access.group !25
16925 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND22]], !llvm.loop [[LOOP26:![0-9]+]]
16926 // CHECK23:       omp.inner.for.end31:
16927 // CHECK23-NEXT:    store i32 10, i32* [[I21]], align 4
16928 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB33]], align 4
16929 // CHECK23-NEXT:    store i32 9, i32* [[DOTOMP_UB34]], align 4
16930 // CHECK23-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_LB33]], align 4
16931 // CHECK23-NEXT:    store i32 [[TMP19]], i32* [[DOTOMP_IV35]], align 4
16932 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND37:%.*]]
16933 // CHECK23:       omp.inner.for.cond37:
16934 // CHECK23-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV35]], align 4, !llvm.access.group !28
16935 // CHECK23-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB34]], align 4, !llvm.access.group !28
16936 // CHECK23-NEXT:    [[CMP38:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]
16937 // CHECK23-NEXT:    br i1 [[CMP38]], label [[OMP_INNER_FOR_BODY39:%.*]], label [[OMP_INNER_FOR_END46:%.*]]
16938 // CHECK23:       omp.inner.for.body39:
16939 // CHECK23-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV35]], align 4, !llvm.access.group !28
16940 // CHECK23-NEXT:    [[MUL40:%.*]] = mul nsw i32 [[TMP22]], 1
16941 // CHECK23-NEXT:    [[ADD41:%.*]] = add nsw i32 0, [[MUL40]]
16942 // CHECK23-NEXT:    store i32 [[ADD41]], i32* [[I36]], align 4, !llvm.access.group !28
16943 // CHECK23-NEXT:    [[TMP23:%.*]] = load i32, i32* [[I36]], align 4, !llvm.access.group !28
16944 // CHECK23-NEXT:    [[ARRAYIDX42:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i32 0, i32 [[TMP23]]
16945 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX42]], align 4, !llvm.access.group !28
16946 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE43:%.*]]
16947 // CHECK23:       omp.body.continue43:
16948 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC44:%.*]]
16949 // CHECK23:       omp.inner.for.inc44:
16950 // CHECK23-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_IV35]], align 4, !llvm.access.group !28
16951 // CHECK23-NEXT:    [[ADD45:%.*]] = add nsw i32 [[TMP24]], 1
16952 // CHECK23-NEXT:    store i32 [[ADD45]], i32* [[DOTOMP_IV35]], align 4, !llvm.access.group !28
16953 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND37]], !llvm.loop [[LOOP29:![0-9]+]]
16954 // CHECK23:       omp.inner.for.end46:
16955 // CHECK23-NEXT:    store i32 10, i32* [[I36]], align 4
16956 // CHECK23-NEXT:    [[TMP25:%.*]] = load i32, i32* [[M]], align 4
16957 // CHECK23-NEXT:    store i32 [[TMP25]], i32* [[DOTCAPTURE_EXPR_47]], align 4
16958 // CHECK23-NEXT:    store i32 0, i32* [[DOTOMP_LB49]], align 4
16959 // CHECK23-NEXT:    store i32 9, i32* [[DOTOMP_UB50]], align 4
16960 // CHECK23-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_LB49]], align 4
16961 // CHECK23-NEXT:    store i32 [[TMP26]], i32* [[DOTOMP_IV51]], align 4
16962 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND53:%.*]]
16963 // CHECK23:       omp.inner.for.cond53:
16964 // CHECK23-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_IV51]], align 4, !llvm.access.group !31
16965 // CHECK23-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_UB50]], align 4, !llvm.access.group !31
16966 // CHECK23-NEXT:    [[CMP54:%.*]] = icmp sle i32 [[TMP27]], [[TMP28]]
16967 // CHECK23-NEXT:    br i1 [[CMP54]], label [[OMP_INNER_FOR_BODY55:%.*]], label [[OMP_INNER_FOR_END62:%.*]]
16968 // CHECK23:       omp.inner.for.body55:
16969 // CHECK23-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_IV51]], align 4, !llvm.access.group !31
16970 // CHECK23-NEXT:    [[MUL56:%.*]] = mul nsw i32 [[TMP29]], 1
16971 // CHECK23-NEXT:    [[ADD57:%.*]] = add nsw i32 0, [[MUL56]]
16972 // CHECK23-NEXT:    store i32 [[ADD57]], i32* [[I52]], align 4, !llvm.access.group !31
16973 // CHECK23-NEXT:    [[TMP30:%.*]] = load i32, i32* [[I52]], align 4, !llvm.access.group !31
16974 // CHECK23-NEXT:    [[ARRAYIDX58:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i32 0, i32 [[TMP30]]
16975 // CHECK23-NEXT:    store i32 0, i32* [[ARRAYIDX58]], align 4, !llvm.access.group !31
16976 // CHECK23-NEXT:    br label [[OMP_BODY_CONTINUE59:%.*]]
16977 // CHECK23:       omp.body.continue59:
16978 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_INC60:%.*]]
16979 // CHECK23:       omp.inner.for.inc60:
16980 // CHECK23-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_IV51]], align 4, !llvm.access.group !31
16981 // CHECK23-NEXT:    [[ADD61:%.*]] = add nsw i32 [[TMP31]], 1
16982 // CHECK23-NEXT:    store i32 [[ADD61]], i32* [[DOTOMP_IV51]], align 4, !llvm.access.group !31
16983 // CHECK23-NEXT:    br label [[OMP_INNER_FOR_COND53]], !llvm.loop [[LOOP32:![0-9]+]]
16984 // CHECK23:       omp.inner.for.end62:
16985 // CHECK23-NEXT:    store i32 10, i32* [[I52]], align 4
16986 // CHECK23-NEXT:    ret i32 0
16987 //
16988