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 -DCK1 -verify -fopenmp -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 -DCK1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
9 // RUN: %clang_cc1 -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
10 // RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK3
11 // RUN: %clang_cc1 -DCK1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
12 // RUN: %clang_cc1 -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=CHECK4
13 
14 // RUN: %clang_cc1 -DCK1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
15 // RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
16 // RUN: %clang_cc1 -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 --implicit-check-not="{{__kmpc|__tgt}}"
17 // RUN: %clang_cc1 -DCK1 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
18 // RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
19 // RUN: %clang_cc1 -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 --implicit-check-not="{{__kmpc|__tgt}}"
20 #ifdef CK1
21 
22 template <typename T, int X, long long Y>
23 struct SS{
24   T a[X];
25   float b;
fooSS26   int foo(void) {
27 
28     #pragma omp target
29     #pragma omp teams distribute parallel for
30     for(int i = 0; i < X; i++) {
31       a[i] = (T)0;
32     }
33     #pragma omp target
34     #pragma omp teams distribute parallel for dist_schedule(static)
35     for(int i = 0; i < X; i++) {
36       a[i] = (T)0;
37     }
38     #pragma omp target
39     #pragma omp teams distribute parallel for dist_schedule(static, X/2)
40     for(int i = 0; i < X; i++) {
41       a[i] = (T)0;
42     }
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53     return a[0];
54   }
55 };
56 
teams_template_struct(void)57 int teams_template_struct(void) {
58   SS<int, 123, 456> V;
59   return V.foo();
60 
61 }
62 #endif // CK1
63 
64 // Test host codegen.
65 // RUN: %clang_cc1 -DCK2 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK9
66 // RUN: %clang_cc1 -DCK2 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
67 // RUN: %clang_cc1 -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=CHECK10
68 // RUN: %clang_cc1 -DCK2 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK11
69 // RUN: %clang_cc1 -DCK2 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
70 // RUN: %clang_cc1 -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=CHECK12
71 
72 // RUN: %clang_cc1 -DCK2 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
73 // RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
74 // RUN: %clang_cc1 -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 --implicit-check-not="{{__kmpc|__tgt}}"
75 // RUN: %clang_cc1 -DCK2 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
76 // RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
77 // RUN: %clang_cc1 -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 --implicit-check-not="{{__kmpc|__tgt}}"
78 #ifdef CK2
79 
80 template <typename T, int n>
tmain(T argc)81 int tmain(T argc) {
82   T a[n];
83   int m = 10;
84 #pragma omp target
85 #pragma omp teams distribute parallel for
86   for(int i = 0; i < n; i++) {
87     a[i] = (T)0;
88   }
89 #pragma omp target
90 #pragma omp teams distribute parallel for dist_schedule(static)
91   for(int i = 0; i < n; i++) {
92     a[i] = (T)0;
93   }
94 #pragma omp target
95 #pragma omp teams distribute parallel for dist_schedule(static, m)
96   for(int i = 0; i < n; i++) {
97     a[i] = (T)0;
98   }
99   return 0;
100 }
101 
main(int argc,char ** argv)102 int main (int argc, char **argv) {
103   int n = 100;
104   int a[n];
105   int m = 10;
106 #pragma omp target
107 #pragma omp teams distribute parallel for
108   for(int i = 0; i < n; i++) {
109     a[i] = 0;
110   }
111 #pragma omp target
112 #pragma omp teams distribute parallel for dist_schedule(static)
113   for(int i = 0; i < n; i++) {
114     a[i] = 0;
115   }
116 #pragma omp target
117 #pragma omp teams distribute parallel for dist_schedule(static, m)
118   for(int i = 0; i < n; i++) {
119     a[i] = 0;
120   }
121   return tmain<int, 10>(argc);
122 }
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 
144 #endif // CK2
145 #endif // #ifndef HEADER
146 // CHECK1-LABEL: define {{[^@]+}}@_Z21teams_template_structv
147 // CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
148 // CHECK1-NEXT:  entry:
149 // CHECK1-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
150 // CHECK1-NEXT:    [[CALL:%.*]] = call signext i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* nonnull align 4 dereferenceable(496) [[V]])
151 // CHECK1-NEXT:    ret i32 [[CALL]]
152 //
153 //
154 // CHECK1-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
155 // CHECK1-SAME: (%struct.SS* nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
156 // CHECK1-NEXT:  entry:
157 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
158 // CHECK1-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8
159 // CHECK1-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8
160 // CHECK1-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8
161 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
162 // CHECK1-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 8
163 // CHECK1-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 8
164 // CHECK1-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 8
165 // CHECK1-NEXT:    [[_TMP6:%.*]] = alloca i32, align 4
166 // CHECK1-NEXT:    [[DOTOFFLOAD_BASEPTRS10:%.*]] = alloca [1 x i8*], align 8
167 // CHECK1-NEXT:    [[DOTOFFLOAD_PTRS11:%.*]] = alloca [1 x i8*], align 8
168 // CHECK1-NEXT:    [[DOTOFFLOAD_MAPPERS12:%.*]] = alloca [1 x i8*], align 8
169 // CHECK1-NEXT:    [[_TMP13:%.*]] = alloca i32, align 4
170 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
171 // CHECK1-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
172 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
173 // CHECK1-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
174 // CHECK1-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to %struct.SS**
175 // CHECK1-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP1]], align 8
176 // CHECK1-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
177 // CHECK1-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [123 x i32]**
178 // CHECK1-NEXT:    store [123 x i32]* [[A]], [123 x i32]** [[TMP3]], align 8
179 // CHECK1-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
180 // CHECK1-NEXT:    store i8* null, i8** [[TMP4]], align 8
181 // CHECK1-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
182 // CHECK1-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
183 // CHECK1-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i64 123)
184 // CHECK1-NEXT:    [[TMP7:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28.region_id, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
185 // CHECK1-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
186 // CHECK1-NEXT:    br i1 [[TMP8]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
187 // CHECK1:       omp_offload.failed:
188 // CHECK1-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28(%struct.SS* [[THIS1]]) #[[ATTR2:[0-9]+]]
189 // CHECK1-NEXT:    br label [[OMP_OFFLOAD_CONT]]
190 // CHECK1:       omp_offload.cont:
191 // CHECK1-NEXT:    [[A2:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
192 // CHECK1-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
193 // CHECK1-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to %struct.SS**
194 // CHECK1-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP10]], align 8
195 // CHECK1-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
196 // CHECK1-NEXT:    [[TMP12:%.*]] = bitcast i8** [[TMP11]] to [123 x i32]**
197 // CHECK1-NEXT:    store [123 x i32]* [[A2]], [123 x i32]** [[TMP12]], align 8
198 // CHECK1-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i64 0, i64 0
199 // CHECK1-NEXT:    store i8* null, i8** [[TMP13]], align 8
200 // CHECK1-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
201 // CHECK1-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
202 // CHECK1-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 123)
203 // CHECK1-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33.region_id, i32 1, i8** [[TMP14]], i8** [[TMP15]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.4, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.5, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
204 // CHECK1-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
205 // CHECK1-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED7:%.*]], label [[OMP_OFFLOAD_CONT8:%.*]]
206 // CHECK1:       omp_offload.failed7:
207 // CHECK1-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33(%struct.SS* [[THIS1]]) #[[ATTR2]]
208 // CHECK1-NEXT:    br label [[OMP_OFFLOAD_CONT8]]
209 // CHECK1:       omp_offload.cont8:
210 // CHECK1-NEXT:    [[A9:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
211 // CHECK1-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS10]], i32 0, i32 0
212 // CHECK1-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to %struct.SS**
213 // CHECK1-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP19]], align 8
214 // CHECK1-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS11]], i32 0, i32 0
215 // CHECK1-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [123 x i32]**
216 // CHECK1-NEXT:    store [123 x i32]* [[A9]], [123 x i32]** [[TMP21]], align 8
217 // CHECK1-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS12]], i64 0, i64 0
218 // CHECK1-NEXT:    store i8* null, i8** [[TMP22]], align 8
219 // CHECK1-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS10]], i32 0, i32 0
220 // CHECK1-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS11]], i32 0, i32 0
221 // CHECK1-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 123)
222 // CHECK1-NEXT:    [[TMP25:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38.region_id, i32 1, i8** [[TMP23]], i8** [[TMP24]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
223 // CHECK1-NEXT:    [[TMP26:%.*]] = icmp ne i32 [[TMP25]], 0
224 // CHECK1-NEXT:    br i1 [[TMP26]], label [[OMP_OFFLOAD_FAILED14:%.*]], label [[OMP_OFFLOAD_CONT15:%.*]]
225 // CHECK1:       omp_offload.failed14:
226 // CHECK1-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38(%struct.SS* [[THIS1]]) #[[ATTR2]]
227 // CHECK1-NEXT:    br label [[OMP_OFFLOAD_CONT15]]
228 // CHECK1:       omp_offload.cont15:
229 // CHECK1-NEXT:    [[A16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
230 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A16]], i64 0, i64 0
231 // CHECK1-NEXT:    [[TMP27:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
232 // CHECK1-NEXT:    ret i32 [[TMP27]]
233 //
234 //
235 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28
236 // CHECK1-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {
237 // CHECK1-NEXT:  entry:
238 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
239 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
240 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
241 // 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]])
242 // CHECK1-NEXT:    ret void
243 //
244 //
245 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
246 // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
247 // CHECK1-NEXT:  entry:
248 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
249 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
250 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
251 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
252 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
253 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
254 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
255 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
256 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
257 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
258 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
259 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
260 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
261 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
262 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
263 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
264 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
265 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
266 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
267 // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
268 // 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)
269 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
270 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
271 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
272 // CHECK1:       cond.true:
273 // CHECK1-NEXT:    br label [[COND_END:%.*]]
274 // CHECK1:       cond.false:
275 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
276 // CHECK1-NEXT:    br label [[COND_END]]
277 // CHECK1:       cond.end:
278 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
279 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
280 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
281 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
282 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
283 // CHECK1:       omp.inner.for.cond:
284 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
285 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
286 // CHECK1-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
287 // CHECK1-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
288 // CHECK1:       omp.inner.for.body:
289 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
290 // CHECK1-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
291 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
292 // CHECK1-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
293 // 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]])
294 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
295 // CHECK1:       omp.inner.for.inc:
296 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
297 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
298 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
299 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
300 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
301 // CHECK1:       omp.inner.for.end:
302 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
303 // CHECK1:       omp.loop.exit:
304 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
305 // CHECK1-NEXT:    ret void
306 //
307 //
308 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..1
309 // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
310 // CHECK1-NEXT:  entry:
311 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
312 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
313 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
314 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
315 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
316 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
317 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
318 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
319 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
320 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
321 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
322 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
323 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
324 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
325 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
326 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
327 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
328 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
329 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
330 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
331 // CHECK1-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
332 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
333 // CHECK1-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
334 // CHECK1-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
335 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
336 // CHECK1-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
337 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
338 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
339 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
340 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
341 // 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)
342 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
343 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
344 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
345 // CHECK1:       cond.true:
346 // CHECK1-NEXT:    br label [[COND_END:%.*]]
347 // CHECK1:       cond.false:
348 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
349 // CHECK1-NEXT:    br label [[COND_END]]
350 // CHECK1:       cond.end:
351 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
352 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
353 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
354 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
355 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
356 // CHECK1:       omp.inner.for.cond:
357 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
358 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
359 // CHECK1-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
360 // CHECK1-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
361 // CHECK1:       omp.inner.for.body:
362 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
363 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
364 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
365 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
366 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
367 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
368 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
369 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
370 // CHECK1-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
371 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
372 // CHECK1:       omp.body.continue:
373 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
374 // CHECK1:       omp.inner.for.inc:
375 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
376 // CHECK1-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
377 // CHECK1-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
378 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
379 // CHECK1:       omp.inner.for.end:
380 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
381 // CHECK1:       omp.loop.exit:
382 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
383 // CHECK1-NEXT:    ret void
384 //
385 //
386 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33
387 // CHECK1-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
388 // CHECK1-NEXT:  entry:
389 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
390 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
391 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
392 // 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]])
393 // CHECK1-NEXT:    ret void
394 //
395 //
396 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..2
397 // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
398 // CHECK1-NEXT:  entry:
399 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
400 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
401 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
402 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
403 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
404 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
405 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
406 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
407 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
408 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
409 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
410 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
411 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
412 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
413 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
414 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
415 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
416 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
417 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
418 // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
419 // 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)
420 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
421 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
422 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
423 // CHECK1:       cond.true:
424 // CHECK1-NEXT:    br label [[COND_END:%.*]]
425 // CHECK1:       cond.false:
426 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
427 // CHECK1-NEXT:    br label [[COND_END]]
428 // CHECK1:       cond.end:
429 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
430 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
431 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
432 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
433 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
434 // CHECK1:       omp.inner.for.cond:
435 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
436 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
437 // CHECK1-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
438 // CHECK1-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
439 // CHECK1:       omp.inner.for.body:
440 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
441 // CHECK1-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
442 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
443 // CHECK1-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
444 // 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]])
445 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
446 // CHECK1:       omp.inner.for.inc:
447 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
448 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
449 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
450 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
451 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
452 // CHECK1:       omp.inner.for.end:
453 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
454 // CHECK1:       omp.loop.exit:
455 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
456 // CHECK1-NEXT:    ret void
457 //
458 //
459 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..3
460 // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
461 // CHECK1-NEXT:  entry:
462 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
463 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
464 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
465 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
466 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
467 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
468 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
469 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
470 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
471 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
472 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
473 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
474 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
475 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
476 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
477 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
478 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
479 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
480 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
481 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
482 // CHECK1-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
483 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
484 // CHECK1-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
485 // CHECK1-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
486 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
487 // CHECK1-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
488 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
489 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
490 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
491 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
492 // 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)
493 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
494 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
495 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
496 // CHECK1:       cond.true:
497 // CHECK1-NEXT:    br label [[COND_END:%.*]]
498 // CHECK1:       cond.false:
499 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
500 // CHECK1-NEXT:    br label [[COND_END]]
501 // CHECK1:       cond.end:
502 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
503 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
504 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
505 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
506 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
507 // CHECK1:       omp.inner.for.cond:
508 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
509 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
510 // CHECK1-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
511 // CHECK1-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
512 // CHECK1:       omp.inner.for.body:
513 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
514 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
515 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
516 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
517 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
518 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
519 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
520 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
521 // CHECK1-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
522 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
523 // CHECK1:       omp.body.continue:
524 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
525 // CHECK1:       omp.inner.for.inc:
526 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
527 // CHECK1-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
528 // CHECK1-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
529 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
530 // CHECK1:       omp.inner.for.end:
531 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
532 // CHECK1:       omp.loop.exit:
533 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
534 // CHECK1-NEXT:    ret void
535 //
536 //
537 // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38
538 // CHECK1-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
539 // CHECK1-NEXT:  entry:
540 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
541 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
542 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
543 // 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]])
544 // CHECK1-NEXT:    ret void
545 //
546 //
547 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..6
548 // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
549 // CHECK1-NEXT:  entry:
550 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
551 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
552 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
553 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
554 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
555 // CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
556 // CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
557 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
558 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
559 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
560 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
561 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
562 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
563 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
564 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
565 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
566 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
567 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
568 // CHECK1-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
569 // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
570 // CHECK1-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 61)
571 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
572 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
573 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
574 // CHECK1:       cond.true:
575 // CHECK1-NEXT:    br label [[COND_END:%.*]]
576 // CHECK1:       cond.false:
577 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
578 // CHECK1-NEXT:    br label [[COND_END]]
579 // CHECK1:       cond.end:
580 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
581 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
582 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
583 // CHECK1-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
584 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
585 // CHECK1:       omp.inner.for.cond:
586 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
587 // CHECK1-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[TMP6]], 123
588 // CHECK1-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
589 // CHECK1:       omp.inner.for.body:
590 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
591 // CHECK1-NEXT:    [[TMP8:%.*]] = zext i32 [[TMP7]] to i64
592 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
593 // CHECK1-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP9]] to i64
594 // 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 [[TMP8]], i64 [[TMP10]], %struct.SS* [[TMP0]])
595 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
596 // CHECK1:       omp.inner.for.inc:
597 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
598 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
599 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]
600 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
601 // CHECK1-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
602 // CHECK1-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
603 // CHECK1-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]
604 // CHECK1-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_COMB_LB]], align 4
605 // CHECK1-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
606 // CHECK1-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
607 // CHECK1-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP15]], [[TMP16]]
608 // CHECK1-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_COMB_UB]], align 4
609 // CHECK1-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
610 // CHECK1-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP17]], 122
611 // CHECK1-NEXT:    br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]
612 // CHECK1:       cond.true5:
613 // CHECK1-NEXT:    br label [[COND_END7:%.*]]
614 // CHECK1:       cond.false6:
615 // CHECK1-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
616 // CHECK1-NEXT:    br label [[COND_END7]]
617 // CHECK1:       cond.end7:
618 // CHECK1-NEXT:    [[COND8:%.*]] = phi i32 [ 122, [[COND_TRUE5]] ], [ [[TMP18]], [[COND_FALSE6]] ]
619 // CHECK1-NEXT:    store i32 [[COND8]], i32* [[DOTOMP_COMB_UB]], align 4
620 // CHECK1-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
621 // CHECK1-NEXT:    store i32 [[TMP19]], i32* [[DOTOMP_IV]], align 4
622 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
623 // CHECK1:       omp.inner.for.end:
624 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
625 // CHECK1:       omp.loop.exit:
626 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
627 // CHECK1-NEXT:    ret void
628 //
629 //
630 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..7
631 // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
632 // CHECK1-NEXT:  entry:
633 // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
634 // CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
635 // CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
636 // CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
637 // CHECK1-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
638 // CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
639 // CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4
640 // CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
641 // CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
642 // CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
643 // CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
644 // CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4
645 // CHECK1-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
646 // CHECK1-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
647 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
648 // CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
649 // CHECK1-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
650 // CHECK1-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
651 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
652 // CHECK1-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
653 // CHECK1-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
654 // CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
655 // CHECK1-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
656 // CHECK1-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
657 // CHECK1-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
658 // CHECK1-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
659 // CHECK1-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
660 // CHECK1-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
661 // CHECK1-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
662 // CHECK1-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
663 // 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)
664 // CHECK1-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
665 // CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
666 // CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
667 // CHECK1:       cond.true:
668 // CHECK1-NEXT:    br label [[COND_END:%.*]]
669 // CHECK1:       cond.false:
670 // CHECK1-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
671 // CHECK1-NEXT:    br label [[COND_END]]
672 // CHECK1:       cond.end:
673 // CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
674 // CHECK1-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
675 // CHECK1-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
676 // CHECK1-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
677 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
678 // CHECK1:       omp.inner.for.cond:
679 // CHECK1-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
680 // CHECK1-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
681 // CHECK1-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
682 // CHECK1-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
683 // CHECK1:       omp.inner.for.body:
684 // CHECK1-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
685 // CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
686 // CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
687 // CHECK1-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
688 // CHECK1-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
689 // CHECK1-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
690 // CHECK1-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
691 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
692 // CHECK1-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
693 // CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
694 // CHECK1:       omp.body.continue:
695 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
696 // CHECK1:       omp.inner.for.inc:
697 // CHECK1-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
698 // CHECK1-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
699 // CHECK1-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
700 // CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]
701 // CHECK1:       omp.inner.for.end:
702 // CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
703 // CHECK1:       omp.loop.exit:
704 // CHECK1-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
705 // CHECK1-NEXT:    ret void
706 //
707 //
708 // CHECK1-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
709 // CHECK1-SAME: () #[[ATTR3:[0-9]+]] {
710 // CHECK1-NEXT:  entry:
711 // CHECK1-NEXT:    call void @__tgt_register_requires(i64 1)
712 // CHECK1-NEXT:    ret void
713 //
714 //
715 // CHECK2-LABEL: define {{[^@]+}}@_Z21teams_template_structv
716 // CHECK2-SAME: () #[[ATTR0:[0-9]+]] {
717 // CHECK2-NEXT:  entry:
718 // CHECK2-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
719 // CHECK2-NEXT:    [[CALL:%.*]] = call signext i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* nonnull align 4 dereferenceable(496) [[V]])
720 // CHECK2-NEXT:    ret i32 [[CALL]]
721 //
722 //
723 // CHECK2-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
724 // CHECK2-SAME: (%struct.SS* nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
725 // CHECK2-NEXT:  entry:
726 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
727 // CHECK2-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8
728 // CHECK2-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8
729 // CHECK2-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8
730 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
731 // CHECK2-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 8
732 // CHECK2-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 8
733 // CHECK2-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 8
734 // CHECK2-NEXT:    [[_TMP6:%.*]] = alloca i32, align 4
735 // CHECK2-NEXT:    [[DOTOFFLOAD_BASEPTRS10:%.*]] = alloca [1 x i8*], align 8
736 // CHECK2-NEXT:    [[DOTOFFLOAD_PTRS11:%.*]] = alloca [1 x i8*], align 8
737 // CHECK2-NEXT:    [[DOTOFFLOAD_MAPPERS12:%.*]] = alloca [1 x i8*], align 8
738 // CHECK2-NEXT:    [[_TMP13:%.*]] = alloca i32, align 4
739 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
740 // CHECK2-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
741 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
742 // CHECK2-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
743 // CHECK2-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to %struct.SS**
744 // CHECK2-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP1]], align 8
745 // CHECK2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
746 // CHECK2-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [123 x i32]**
747 // CHECK2-NEXT:    store [123 x i32]* [[A]], [123 x i32]** [[TMP3]], align 8
748 // CHECK2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
749 // CHECK2-NEXT:    store i8* null, i8** [[TMP4]], align 8
750 // CHECK2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
751 // CHECK2-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
752 // CHECK2-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i64 123)
753 // CHECK2-NEXT:    [[TMP7:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28.region_id, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
754 // CHECK2-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
755 // CHECK2-NEXT:    br i1 [[TMP8]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
756 // CHECK2:       omp_offload.failed:
757 // CHECK2-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28(%struct.SS* [[THIS1]]) #[[ATTR2:[0-9]+]]
758 // CHECK2-NEXT:    br label [[OMP_OFFLOAD_CONT]]
759 // CHECK2:       omp_offload.cont:
760 // CHECK2-NEXT:    [[A2:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
761 // CHECK2-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
762 // CHECK2-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to %struct.SS**
763 // CHECK2-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP10]], align 8
764 // CHECK2-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
765 // CHECK2-NEXT:    [[TMP12:%.*]] = bitcast i8** [[TMP11]] to [123 x i32]**
766 // CHECK2-NEXT:    store [123 x i32]* [[A2]], [123 x i32]** [[TMP12]], align 8
767 // CHECK2-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i64 0, i64 0
768 // CHECK2-NEXT:    store i8* null, i8** [[TMP13]], align 8
769 // CHECK2-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
770 // CHECK2-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
771 // CHECK2-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 123)
772 // CHECK2-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33.region_id, i32 1, i8** [[TMP14]], i8** [[TMP15]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.4, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.5, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
773 // CHECK2-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
774 // CHECK2-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED7:%.*]], label [[OMP_OFFLOAD_CONT8:%.*]]
775 // CHECK2:       omp_offload.failed7:
776 // CHECK2-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33(%struct.SS* [[THIS1]]) #[[ATTR2]]
777 // CHECK2-NEXT:    br label [[OMP_OFFLOAD_CONT8]]
778 // CHECK2:       omp_offload.cont8:
779 // CHECK2-NEXT:    [[A9:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
780 // CHECK2-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS10]], i32 0, i32 0
781 // CHECK2-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to %struct.SS**
782 // CHECK2-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP19]], align 8
783 // CHECK2-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS11]], i32 0, i32 0
784 // CHECK2-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [123 x i32]**
785 // CHECK2-NEXT:    store [123 x i32]* [[A9]], [123 x i32]** [[TMP21]], align 8
786 // CHECK2-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS12]], i64 0, i64 0
787 // CHECK2-NEXT:    store i8* null, i8** [[TMP22]], align 8
788 // CHECK2-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS10]], i32 0, i32 0
789 // CHECK2-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS11]], i32 0, i32 0
790 // CHECK2-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 123)
791 // CHECK2-NEXT:    [[TMP25:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38.region_id, i32 1, i8** [[TMP23]], i8** [[TMP24]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
792 // CHECK2-NEXT:    [[TMP26:%.*]] = icmp ne i32 [[TMP25]], 0
793 // CHECK2-NEXT:    br i1 [[TMP26]], label [[OMP_OFFLOAD_FAILED14:%.*]], label [[OMP_OFFLOAD_CONT15:%.*]]
794 // CHECK2:       omp_offload.failed14:
795 // CHECK2-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38(%struct.SS* [[THIS1]]) #[[ATTR2]]
796 // CHECK2-NEXT:    br label [[OMP_OFFLOAD_CONT15]]
797 // CHECK2:       omp_offload.cont15:
798 // CHECK2-NEXT:    [[A16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
799 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A16]], i64 0, i64 0
800 // CHECK2-NEXT:    [[TMP27:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
801 // CHECK2-NEXT:    ret i32 [[TMP27]]
802 //
803 //
804 // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28
805 // CHECK2-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {
806 // CHECK2-NEXT:  entry:
807 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
808 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
809 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
810 // 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]])
811 // CHECK2-NEXT:    ret void
812 //
813 //
814 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
815 // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
816 // CHECK2-NEXT:  entry:
817 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
818 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
819 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
820 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
821 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
822 // CHECK2-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
823 // CHECK2-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
824 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
825 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
826 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
827 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
828 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
829 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
830 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
831 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
832 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
833 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
834 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
835 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
836 // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
837 // 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)
838 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
839 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
840 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
841 // CHECK2:       cond.true:
842 // CHECK2-NEXT:    br label [[COND_END:%.*]]
843 // CHECK2:       cond.false:
844 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
845 // CHECK2-NEXT:    br label [[COND_END]]
846 // CHECK2:       cond.end:
847 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
848 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
849 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
850 // CHECK2-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
851 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
852 // CHECK2:       omp.inner.for.cond:
853 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
854 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
855 // CHECK2-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
856 // CHECK2-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
857 // CHECK2:       omp.inner.for.body:
858 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
859 // CHECK2-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
860 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
861 // CHECK2-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
862 // 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]])
863 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
864 // CHECK2:       omp.inner.for.inc:
865 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
866 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
867 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
868 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
869 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]]
870 // CHECK2:       omp.inner.for.end:
871 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
872 // CHECK2:       omp.loop.exit:
873 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
874 // CHECK2-NEXT:    ret void
875 //
876 //
877 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..1
878 // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
879 // CHECK2-NEXT:  entry:
880 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
881 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
882 // CHECK2-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
883 // CHECK2-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
884 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
885 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
886 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
887 // CHECK2-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
888 // CHECK2-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
889 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
890 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
891 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
892 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
893 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
894 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
895 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
896 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
897 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
898 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
899 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
900 // CHECK2-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
901 // CHECK2-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
902 // CHECK2-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
903 // CHECK2-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
904 // CHECK2-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
905 // CHECK2-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
906 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
907 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
908 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
909 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
910 // 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)
911 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
912 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
913 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
914 // CHECK2:       cond.true:
915 // CHECK2-NEXT:    br label [[COND_END:%.*]]
916 // CHECK2:       cond.false:
917 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
918 // CHECK2-NEXT:    br label [[COND_END]]
919 // CHECK2:       cond.end:
920 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
921 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
922 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
923 // CHECK2-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
924 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
925 // CHECK2:       omp.inner.for.cond:
926 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
927 // CHECK2-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
928 // CHECK2-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
929 // CHECK2-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
930 // CHECK2:       omp.inner.for.body:
931 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
932 // CHECK2-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
933 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
934 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
935 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
936 // CHECK2-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
937 // CHECK2-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
938 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
939 // CHECK2-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
940 // CHECK2-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
941 // CHECK2:       omp.body.continue:
942 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
943 // CHECK2:       omp.inner.for.inc:
944 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
945 // CHECK2-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
946 // CHECK2-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
947 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]]
948 // CHECK2:       omp.inner.for.end:
949 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
950 // CHECK2:       omp.loop.exit:
951 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
952 // CHECK2-NEXT:    ret void
953 //
954 //
955 // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33
956 // CHECK2-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
957 // CHECK2-NEXT:  entry:
958 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
959 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
960 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
961 // 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]])
962 // CHECK2-NEXT:    ret void
963 //
964 //
965 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..2
966 // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
967 // CHECK2-NEXT:  entry:
968 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
969 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
970 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
971 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
972 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
973 // CHECK2-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
974 // CHECK2-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
975 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
976 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
977 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
978 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
979 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
980 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
981 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
982 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
983 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
984 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
985 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
986 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
987 // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
988 // 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)
989 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
990 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
991 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
992 // CHECK2:       cond.true:
993 // CHECK2-NEXT:    br label [[COND_END:%.*]]
994 // CHECK2:       cond.false:
995 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
996 // CHECK2-NEXT:    br label [[COND_END]]
997 // CHECK2:       cond.end:
998 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
999 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1000 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1001 // CHECK2-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1002 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1003 // CHECK2:       omp.inner.for.cond:
1004 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1005 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1006 // CHECK2-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
1007 // CHECK2-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1008 // CHECK2:       omp.inner.for.body:
1009 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1010 // CHECK2-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
1011 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1012 // CHECK2-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
1013 // 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]])
1014 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1015 // CHECK2:       omp.inner.for.inc:
1016 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1017 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1018 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
1019 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
1020 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]]
1021 // CHECK2:       omp.inner.for.end:
1022 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1023 // CHECK2:       omp.loop.exit:
1024 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1025 // CHECK2-NEXT:    ret void
1026 //
1027 //
1028 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..3
1029 // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1030 // CHECK2-NEXT:  entry:
1031 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1032 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1033 // CHECK2-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1034 // CHECK2-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1035 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1036 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1037 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1038 // CHECK2-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1039 // CHECK2-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1040 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1041 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1042 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
1043 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1044 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1045 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1046 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1047 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1048 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1049 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1050 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1051 // CHECK2-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1052 // CHECK2-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
1053 // CHECK2-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1054 // CHECK2-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
1055 // CHECK2-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1056 // CHECK2-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
1057 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1058 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1059 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1060 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
1061 // 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)
1062 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1063 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
1064 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1065 // CHECK2:       cond.true:
1066 // CHECK2-NEXT:    br label [[COND_END:%.*]]
1067 // CHECK2:       cond.false:
1068 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1069 // CHECK2-NEXT:    br label [[COND_END]]
1070 // CHECK2:       cond.end:
1071 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
1072 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1073 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1074 // CHECK2-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
1075 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1076 // CHECK2:       omp.inner.for.cond:
1077 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1078 // CHECK2-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1079 // CHECK2-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
1080 // CHECK2-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1081 // CHECK2:       omp.inner.for.body:
1082 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1083 // CHECK2-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
1084 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1085 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
1086 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
1087 // CHECK2-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
1088 // CHECK2-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
1089 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
1090 // CHECK2-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
1091 // CHECK2-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1092 // CHECK2:       omp.body.continue:
1093 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1094 // CHECK2:       omp.inner.for.inc:
1095 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1096 // CHECK2-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
1097 // CHECK2-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
1098 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]]
1099 // CHECK2:       omp.inner.for.end:
1100 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1101 // CHECK2:       omp.loop.exit:
1102 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
1103 // CHECK2-NEXT:    ret void
1104 //
1105 //
1106 // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38
1107 // CHECK2-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1108 // CHECK2-NEXT:  entry:
1109 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1110 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1111 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1112 // 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]])
1113 // CHECK2-NEXT:    ret void
1114 //
1115 //
1116 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..6
1117 // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1118 // CHECK2-NEXT:  entry:
1119 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1120 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1121 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1122 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1123 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1124 // CHECK2-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1125 // CHECK2-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1126 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1127 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1128 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
1129 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1130 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1131 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1132 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1133 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1134 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
1135 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1136 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1137 // CHECK2-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1138 // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
1139 // CHECK2-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 61)
1140 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1141 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
1142 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1143 // CHECK2:       cond.true:
1144 // CHECK2-NEXT:    br label [[COND_END:%.*]]
1145 // CHECK2:       cond.false:
1146 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1147 // CHECK2-NEXT:    br label [[COND_END]]
1148 // CHECK2:       cond.end:
1149 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1150 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1151 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1152 // CHECK2-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1153 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1154 // CHECK2:       omp.inner.for.cond:
1155 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1156 // CHECK2-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[TMP6]], 123
1157 // CHECK2-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1158 // CHECK2:       omp.inner.for.body:
1159 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1160 // CHECK2-NEXT:    [[TMP8:%.*]] = zext i32 [[TMP7]] to i64
1161 // CHECK2-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1162 // CHECK2-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP9]] to i64
1163 // 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 [[TMP8]], i64 [[TMP10]], %struct.SS* [[TMP0]])
1164 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1165 // CHECK2:       omp.inner.for.inc:
1166 // CHECK2-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1167 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1168 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]
1169 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
1170 // CHECK2-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1171 // CHECK2-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1172 // CHECK2-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]
1173 // CHECK2-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_COMB_LB]], align 4
1174 // CHECK2-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1175 // CHECK2-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1176 // CHECK2-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP15]], [[TMP16]]
1177 // CHECK2-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_COMB_UB]], align 4
1178 // CHECK2-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1179 // CHECK2-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP17]], 122
1180 // CHECK2-NEXT:    br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]
1181 // CHECK2:       cond.true5:
1182 // CHECK2-NEXT:    br label [[COND_END7:%.*]]
1183 // CHECK2:       cond.false6:
1184 // CHECK2-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1185 // CHECK2-NEXT:    br label [[COND_END7]]
1186 // CHECK2:       cond.end7:
1187 // CHECK2-NEXT:    [[COND8:%.*]] = phi i32 [ 122, [[COND_TRUE5]] ], [ [[TMP18]], [[COND_FALSE6]] ]
1188 // CHECK2-NEXT:    store i32 [[COND8]], i32* [[DOTOMP_COMB_UB]], align 4
1189 // CHECK2-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1190 // CHECK2-NEXT:    store i32 [[TMP19]], i32* [[DOTOMP_IV]], align 4
1191 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]]
1192 // CHECK2:       omp.inner.for.end:
1193 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1194 // CHECK2:       omp.loop.exit:
1195 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1196 // CHECK2-NEXT:    ret void
1197 //
1198 //
1199 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..7
1200 // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1201 // CHECK2-NEXT:  entry:
1202 // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1203 // CHECK2-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1204 // CHECK2-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
1205 // CHECK2-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
1206 // CHECK2-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 8
1207 // CHECK2-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1208 // CHECK2-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1209 // CHECK2-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1210 // CHECK2-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1211 // CHECK2-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1212 // CHECK2-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1213 // CHECK2-NEXT:    [[I:%.*]] = alloca i32, align 4
1214 // CHECK2-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1215 // CHECK2-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1216 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1217 // CHECK2-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1218 // CHECK2-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 8
1219 // CHECK2-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 8
1220 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1221 // CHECK2-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1222 // CHECK2-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
1223 // CHECK2-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
1224 // CHECK2-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
1225 // CHECK2-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
1226 // CHECK2-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
1227 // CHECK2-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
1228 // CHECK2-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1229 // CHECK2-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1230 // CHECK2-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1231 // CHECK2-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
1232 // 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)
1233 // CHECK2-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1234 // CHECK2-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
1235 // CHECK2-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1236 // CHECK2:       cond.true:
1237 // CHECK2-NEXT:    br label [[COND_END:%.*]]
1238 // CHECK2:       cond.false:
1239 // CHECK2-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1240 // CHECK2-NEXT:    br label [[COND_END]]
1241 // CHECK2:       cond.end:
1242 // CHECK2-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
1243 // CHECK2-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1244 // CHECK2-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1245 // CHECK2-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
1246 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1247 // CHECK2:       omp.inner.for.cond:
1248 // CHECK2-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1249 // CHECK2-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1250 // CHECK2-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
1251 // CHECK2-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1252 // CHECK2:       omp.inner.for.body:
1253 // CHECK2-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1254 // CHECK2-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
1255 // CHECK2-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1256 // CHECK2-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
1257 // CHECK2-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
1258 // CHECK2-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
1259 // CHECK2-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
1260 // CHECK2-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i64 0, i64 [[IDXPROM]]
1261 // CHECK2-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
1262 // CHECK2-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1263 // CHECK2:       omp.body.continue:
1264 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1265 // CHECK2:       omp.inner.for.inc:
1266 // CHECK2-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1267 // CHECK2-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
1268 // CHECK2-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
1269 // CHECK2-NEXT:    br label [[OMP_INNER_FOR_COND]]
1270 // CHECK2:       omp.inner.for.end:
1271 // CHECK2-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1272 // CHECK2:       omp.loop.exit:
1273 // CHECK2-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
1274 // CHECK2-NEXT:    ret void
1275 //
1276 //
1277 // CHECK2-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
1278 // CHECK2-SAME: () #[[ATTR3:[0-9]+]] {
1279 // CHECK2-NEXT:  entry:
1280 // CHECK2-NEXT:    call void @__tgt_register_requires(i64 1)
1281 // CHECK2-NEXT:    ret void
1282 //
1283 //
1284 // CHECK3-LABEL: define {{[^@]+}}@_Z21teams_template_structv
1285 // CHECK3-SAME: () #[[ATTR0:[0-9]+]] {
1286 // CHECK3-NEXT:  entry:
1287 // CHECK3-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
1288 // CHECK3-NEXT:    [[CALL:%.*]] = call i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* nonnull align 4 dereferenceable(496) [[V]])
1289 // CHECK3-NEXT:    ret i32 [[CALL]]
1290 //
1291 //
1292 // CHECK3-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
1293 // CHECK3-SAME: (%struct.SS* nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
1294 // CHECK3-NEXT:  entry:
1295 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1296 // CHECK3-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 4
1297 // CHECK3-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 4
1298 // CHECK3-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 4
1299 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1300 // CHECK3-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
1301 // CHECK3-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
1302 // CHECK3-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
1303 // CHECK3-NEXT:    [[_TMP6:%.*]] = alloca i32, align 4
1304 // CHECK3-NEXT:    [[DOTOFFLOAD_BASEPTRS10:%.*]] = alloca [1 x i8*], align 4
1305 // CHECK3-NEXT:    [[DOTOFFLOAD_PTRS11:%.*]] = alloca [1 x i8*], align 4
1306 // CHECK3-NEXT:    [[DOTOFFLOAD_MAPPERS12:%.*]] = alloca [1 x i8*], align 4
1307 // CHECK3-NEXT:    [[_TMP13:%.*]] = alloca i32, align 4
1308 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1309 // CHECK3-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1310 // CHECK3-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
1311 // CHECK3-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1312 // CHECK3-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to %struct.SS**
1313 // CHECK3-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP1]], align 4
1314 // CHECK3-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1315 // CHECK3-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [123 x i32]**
1316 // CHECK3-NEXT:    store [123 x i32]* [[A]], [123 x i32]** [[TMP3]], align 4
1317 // CHECK3-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
1318 // CHECK3-NEXT:    store i8* null, i8** [[TMP4]], align 4
1319 // CHECK3-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1320 // CHECK3-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1321 // CHECK3-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i64 123)
1322 // CHECK3-NEXT:    [[TMP7:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28.region_id, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
1323 // CHECK3-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
1324 // CHECK3-NEXT:    br i1 [[TMP8]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
1325 // CHECK3:       omp_offload.failed:
1326 // CHECK3-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28(%struct.SS* [[THIS1]]) #[[ATTR2:[0-9]+]]
1327 // CHECK3-NEXT:    br label [[OMP_OFFLOAD_CONT]]
1328 // CHECK3:       omp_offload.cont:
1329 // CHECK3-NEXT:    [[A2:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1330 // CHECK3-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1331 // CHECK3-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to %struct.SS**
1332 // CHECK3-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP10]], align 4
1333 // CHECK3-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1334 // CHECK3-NEXT:    [[TMP12:%.*]] = bitcast i8** [[TMP11]] to [123 x i32]**
1335 // CHECK3-NEXT:    store [123 x i32]* [[A2]], [123 x i32]** [[TMP12]], align 4
1336 // CHECK3-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
1337 // CHECK3-NEXT:    store i8* null, i8** [[TMP13]], align 4
1338 // CHECK3-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1339 // CHECK3-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1340 // CHECK3-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 123)
1341 // CHECK3-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33.region_id, i32 1, i8** [[TMP14]], i8** [[TMP15]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.4, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.5, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
1342 // CHECK3-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
1343 // CHECK3-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED7:%.*]], label [[OMP_OFFLOAD_CONT8:%.*]]
1344 // CHECK3:       omp_offload.failed7:
1345 // CHECK3-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33(%struct.SS* [[THIS1]]) #[[ATTR2]]
1346 // CHECK3-NEXT:    br label [[OMP_OFFLOAD_CONT8]]
1347 // CHECK3:       omp_offload.cont8:
1348 // CHECK3-NEXT:    [[A9:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1349 // CHECK3-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS10]], i32 0, i32 0
1350 // CHECK3-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to %struct.SS**
1351 // CHECK3-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP19]], align 4
1352 // CHECK3-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS11]], i32 0, i32 0
1353 // CHECK3-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [123 x i32]**
1354 // CHECK3-NEXT:    store [123 x i32]* [[A9]], [123 x i32]** [[TMP21]], align 4
1355 // CHECK3-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS12]], i32 0, i32 0
1356 // CHECK3-NEXT:    store i8* null, i8** [[TMP22]], align 4
1357 // CHECK3-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS10]], i32 0, i32 0
1358 // CHECK3-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS11]], i32 0, i32 0
1359 // CHECK3-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 123)
1360 // CHECK3-NEXT:    [[TMP25:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38.region_id, i32 1, i8** [[TMP23]], i8** [[TMP24]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
1361 // CHECK3-NEXT:    [[TMP26:%.*]] = icmp ne i32 [[TMP25]], 0
1362 // CHECK3-NEXT:    br i1 [[TMP26]], label [[OMP_OFFLOAD_FAILED14:%.*]], label [[OMP_OFFLOAD_CONT15:%.*]]
1363 // CHECK3:       omp_offload.failed14:
1364 // CHECK3-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38(%struct.SS* [[THIS1]]) #[[ATTR2]]
1365 // CHECK3-NEXT:    br label [[OMP_OFFLOAD_CONT15]]
1366 // CHECK3:       omp_offload.cont15:
1367 // CHECK3-NEXT:    [[A16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1368 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A16]], i32 0, i32 0
1369 // CHECK3-NEXT:    [[TMP27:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
1370 // CHECK3-NEXT:    ret i32 [[TMP27]]
1371 //
1372 //
1373 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28
1374 // CHECK3-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {
1375 // CHECK3-NEXT:  entry:
1376 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1377 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1378 // CHECK3-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1379 // CHECK3-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]])
1380 // CHECK3-NEXT:    ret void
1381 //
1382 //
1383 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined.
1384 // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1385 // CHECK3-NEXT:  entry:
1386 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1387 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1388 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1389 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1390 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1391 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1392 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1393 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1394 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1395 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
1396 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1397 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1398 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1399 // CHECK3-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1400 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1401 // CHECK3-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
1402 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1403 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1404 // CHECK3-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
1405 // CHECK3-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
1406 // CHECK3-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)
1407 // CHECK3-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1408 // CHECK3-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
1409 // CHECK3-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1410 // CHECK3:       cond.true:
1411 // CHECK3-NEXT:    br label [[COND_END:%.*]]
1412 // CHECK3:       cond.false:
1413 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1414 // CHECK3-NEXT:    br label [[COND_END]]
1415 // CHECK3:       cond.end:
1416 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1417 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1418 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1419 // CHECK3-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1420 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1421 // CHECK3:       omp.inner.for.cond:
1422 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1423 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1424 // CHECK3-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
1425 // CHECK3-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1426 // CHECK3:       omp.inner.for.body:
1427 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1428 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1429 // CHECK3-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]])
1430 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1431 // CHECK3:       omp.inner.for.inc:
1432 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1433 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1434 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
1435 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
1436 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
1437 // CHECK3:       omp.inner.for.end:
1438 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1439 // CHECK3:       omp.loop.exit:
1440 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1441 // CHECK3-NEXT:    ret void
1442 //
1443 //
1444 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..1
1445 // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1446 // CHECK3-NEXT:  entry:
1447 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1448 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1449 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
1450 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
1451 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1452 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1453 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1454 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1455 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1456 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1457 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1458 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
1459 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1460 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1461 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
1462 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
1463 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1464 // CHECK3-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1465 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1466 // CHECK3-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1467 // CHECK3-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
1468 // CHECK3-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
1469 // CHECK3-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
1470 // CHECK3-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
1471 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1472 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1473 // CHECK3-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
1474 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
1475 // CHECK3-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)
1476 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1477 // CHECK3-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
1478 // CHECK3-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1479 // CHECK3:       cond.true:
1480 // CHECK3-NEXT:    br label [[COND_END:%.*]]
1481 // CHECK3:       cond.false:
1482 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1483 // CHECK3-NEXT:    br label [[COND_END]]
1484 // CHECK3:       cond.end:
1485 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
1486 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1487 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1488 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
1489 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1490 // CHECK3:       omp.inner.for.cond:
1491 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1492 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1493 // CHECK3-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
1494 // CHECK3-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1495 // CHECK3:       omp.inner.for.body:
1496 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1497 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
1498 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1499 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
1500 // CHECK3-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
1501 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
1502 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
1503 // CHECK3-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
1504 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1505 // CHECK3:       omp.body.continue:
1506 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1507 // CHECK3:       omp.inner.for.inc:
1508 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1509 // CHECK3-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
1510 // CHECK3-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
1511 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
1512 // CHECK3:       omp.inner.for.end:
1513 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1514 // CHECK3:       omp.loop.exit:
1515 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
1516 // CHECK3-NEXT:    ret void
1517 //
1518 //
1519 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33
1520 // CHECK3-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1521 // CHECK3-NEXT:  entry:
1522 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1523 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1524 // CHECK3-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1525 // CHECK3-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]])
1526 // CHECK3-NEXT:    ret void
1527 //
1528 //
1529 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..2
1530 // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1531 // CHECK3-NEXT:  entry:
1532 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1533 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1534 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1535 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1536 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1537 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1538 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1539 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1540 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1541 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
1542 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1543 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1544 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1545 // CHECK3-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1546 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1547 // CHECK3-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
1548 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1549 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1550 // CHECK3-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
1551 // CHECK3-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
1552 // CHECK3-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)
1553 // CHECK3-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1554 // CHECK3-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
1555 // CHECK3-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1556 // CHECK3:       cond.true:
1557 // CHECK3-NEXT:    br label [[COND_END:%.*]]
1558 // CHECK3:       cond.false:
1559 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1560 // CHECK3-NEXT:    br label [[COND_END]]
1561 // CHECK3:       cond.end:
1562 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1563 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1564 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1565 // CHECK3-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1566 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1567 // CHECK3:       omp.inner.for.cond:
1568 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1569 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1570 // CHECK3-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
1571 // CHECK3-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1572 // CHECK3:       omp.inner.for.body:
1573 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1574 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1575 // CHECK3-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]])
1576 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1577 // CHECK3:       omp.inner.for.inc:
1578 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1579 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1580 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
1581 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
1582 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
1583 // CHECK3:       omp.inner.for.end:
1584 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1585 // CHECK3:       omp.loop.exit:
1586 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1587 // CHECK3-NEXT:    ret void
1588 //
1589 //
1590 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..3
1591 // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1592 // CHECK3-NEXT:  entry:
1593 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1594 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1595 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
1596 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
1597 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1598 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1599 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1600 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1601 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1602 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1603 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1604 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
1605 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1606 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1607 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
1608 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
1609 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1610 // CHECK3-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1611 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1612 // CHECK3-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1613 // CHECK3-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
1614 // CHECK3-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
1615 // CHECK3-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
1616 // CHECK3-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
1617 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1618 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1619 // CHECK3-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
1620 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
1621 // CHECK3-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)
1622 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1623 // CHECK3-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
1624 // CHECK3-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1625 // CHECK3:       cond.true:
1626 // CHECK3-NEXT:    br label [[COND_END:%.*]]
1627 // CHECK3:       cond.false:
1628 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1629 // CHECK3-NEXT:    br label [[COND_END]]
1630 // CHECK3:       cond.end:
1631 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
1632 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1633 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1634 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
1635 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1636 // CHECK3:       omp.inner.for.cond:
1637 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1638 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1639 // CHECK3-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
1640 // CHECK3-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1641 // CHECK3:       omp.inner.for.body:
1642 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1643 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
1644 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1645 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
1646 // CHECK3-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
1647 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
1648 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
1649 // CHECK3-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
1650 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1651 // CHECK3:       omp.body.continue:
1652 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1653 // CHECK3:       omp.inner.for.inc:
1654 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1655 // CHECK3-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
1656 // CHECK3-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
1657 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
1658 // CHECK3:       omp.inner.for.end:
1659 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1660 // CHECK3:       omp.loop.exit:
1661 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
1662 // CHECK3-NEXT:    ret void
1663 //
1664 //
1665 // CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38
1666 // CHECK3-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1667 // CHECK3-NEXT:  entry:
1668 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1669 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1670 // CHECK3-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1671 // CHECK3-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]])
1672 // CHECK3-NEXT:    ret void
1673 //
1674 //
1675 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..6
1676 // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1677 // CHECK3-NEXT:  entry:
1678 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1679 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1680 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1681 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1682 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1683 // CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1684 // CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1685 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1686 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1687 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
1688 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1689 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1690 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1691 // CHECK3-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1692 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1693 // CHECK3-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
1694 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1695 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1696 // CHECK3-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
1697 // CHECK3-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
1698 // CHECK3-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 61)
1699 // CHECK3-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1700 // CHECK3-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
1701 // CHECK3-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1702 // CHECK3:       cond.true:
1703 // CHECK3-NEXT:    br label [[COND_END:%.*]]
1704 // CHECK3:       cond.false:
1705 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1706 // CHECK3-NEXT:    br label [[COND_END]]
1707 // CHECK3:       cond.end:
1708 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1709 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1710 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1711 // CHECK3-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1712 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1713 // CHECK3:       omp.inner.for.cond:
1714 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1715 // CHECK3-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[TMP6]], 123
1716 // CHECK3-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1717 // CHECK3:       omp.inner.for.body:
1718 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1719 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1720 // CHECK3-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 [[TMP7]], i32 [[TMP8]], %struct.SS* [[TMP0]])
1721 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1722 // CHECK3:       omp.inner.for.inc:
1723 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1724 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1725 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]
1726 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
1727 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1728 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1729 // CHECK3-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]
1730 // CHECK3-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_COMB_LB]], align 4
1731 // CHECK3-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1732 // CHECK3-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1733 // CHECK3-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]
1734 // CHECK3-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_COMB_UB]], align 4
1735 // CHECK3-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1736 // CHECK3-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP15]], 122
1737 // CHECK3-NEXT:    br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]
1738 // CHECK3:       cond.true5:
1739 // CHECK3-NEXT:    br label [[COND_END7:%.*]]
1740 // CHECK3:       cond.false6:
1741 // CHECK3-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1742 // CHECK3-NEXT:    br label [[COND_END7]]
1743 // CHECK3:       cond.end7:
1744 // CHECK3-NEXT:    [[COND8:%.*]] = phi i32 [ 122, [[COND_TRUE5]] ], [ [[TMP16]], [[COND_FALSE6]] ]
1745 // CHECK3-NEXT:    store i32 [[COND8]], i32* [[DOTOMP_COMB_UB]], align 4
1746 // CHECK3-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1747 // CHECK3-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
1748 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
1749 // CHECK3:       omp.inner.for.end:
1750 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1751 // CHECK3:       omp.loop.exit:
1752 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1753 // CHECK3-NEXT:    ret void
1754 //
1755 //
1756 // CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..7
1757 // CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1758 // CHECK3-NEXT:  entry:
1759 // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1760 // CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1761 // CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
1762 // CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
1763 // CHECK3-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1764 // CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1765 // CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1766 // CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
1767 // CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
1768 // CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1769 // CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1770 // CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4
1771 // CHECK3-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1772 // CHECK3-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1773 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
1774 // CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
1775 // CHECK3-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1776 // CHECK3-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1777 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
1778 // CHECK3-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
1779 // CHECK3-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
1780 // CHECK3-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
1781 // CHECK3-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
1782 // CHECK3-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
1783 // CHECK3-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1784 // CHECK3-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1785 // CHECK3-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
1786 // CHECK3-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
1787 // CHECK3-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)
1788 // CHECK3-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1789 // CHECK3-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
1790 // CHECK3-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1791 // CHECK3:       cond.true:
1792 // CHECK3-NEXT:    br label [[COND_END:%.*]]
1793 // CHECK3:       cond.false:
1794 // CHECK3-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1795 // CHECK3-NEXT:    br label [[COND_END]]
1796 // CHECK3:       cond.end:
1797 // CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
1798 // CHECK3-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1799 // CHECK3-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1800 // CHECK3-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
1801 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1802 // CHECK3:       omp.inner.for.cond:
1803 // CHECK3-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1804 // CHECK3-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1805 // CHECK3-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
1806 // CHECK3-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1807 // CHECK3:       omp.inner.for.body:
1808 // CHECK3-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1809 // CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
1810 // CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1811 // CHECK3-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
1812 // CHECK3-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
1813 // CHECK3-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
1814 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
1815 // CHECK3-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
1816 // CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
1817 // CHECK3:       omp.body.continue:
1818 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1819 // CHECK3:       omp.inner.for.inc:
1820 // CHECK3-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1821 // CHECK3-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
1822 // CHECK3-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
1823 // CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]
1824 // CHECK3:       omp.inner.for.end:
1825 // CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1826 // CHECK3:       omp.loop.exit:
1827 // CHECK3-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
1828 // CHECK3-NEXT:    ret void
1829 //
1830 //
1831 // CHECK3-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
1832 // CHECK3-SAME: () #[[ATTR3:[0-9]+]] {
1833 // CHECK3-NEXT:  entry:
1834 // CHECK3-NEXT:    call void @__tgt_register_requires(i64 1)
1835 // CHECK3-NEXT:    ret void
1836 //
1837 //
1838 // CHECK4-LABEL: define {{[^@]+}}@_Z21teams_template_structv
1839 // CHECK4-SAME: () #[[ATTR0:[0-9]+]] {
1840 // CHECK4-NEXT:  entry:
1841 // CHECK4-NEXT:    [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 4
1842 // CHECK4-NEXT:    [[CALL:%.*]] = call i32 @_ZN2SSIiLi123ELx456EE3fooEv(%struct.SS* nonnull align 4 dereferenceable(496) [[V]])
1843 // CHECK4-NEXT:    ret i32 [[CALL]]
1844 //
1845 //
1846 // CHECK4-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv
1847 // CHECK4-SAME: (%struct.SS* nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {
1848 // CHECK4-NEXT:  entry:
1849 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1850 // CHECK4-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 4
1851 // CHECK4-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 4
1852 // CHECK4-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 4
1853 // CHECK4-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1854 // CHECK4-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
1855 // CHECK4-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
1856 // CHECK4-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
1857 // CHECK4-NEXT:    [[_TMP6:%.*]] = alloca i32, align 4
1858 // CHECK4-NEXT:    [[DOTOFFLOAD_BASEPTRS10:%.*]] = alloca [1 x i8*], align 4
1859 // CHECK4-NEXT:    [[DOTOFFLOAD_PTRS11:%.*]] = alloca [1 x i8*], align 4
1860 // CHECK4-NEXT:    [[DOTOFFLOAD_MAPPERS12:%.*]] = alloca [1 x i8*], align 4
1861 // CHECK4-NEXT:    [[_TMP13:%.*]] = alloca i32, align 4
1862 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1863 // CHECK4-NEXT:    [[THIS1:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1864 // CHECK4-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[THIS1]], i32 0, i32 0
1865 // CHECK4-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1866 // CHECK4-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to %struct.SS**
1867 // CHECK4-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP1]], align 4
1868 // CHECK4-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1869 // CHECK4-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [123 x i32]**
1870 // CHECK4-NEXT:    store [123 x i32]* [[A]], [123 x i32]** [[TMP3]], align 4
1871 // CHECK4-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
1872 // CHECK4-NEXT:    store i8* null, i8** [[TMP4]], align 4
1873 // CHECK4-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
1874 // CHECK4-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
1875 // CHECK4-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i64 123)
1876 // CHECK4-NEXT:    [[TMP7:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28.region_id, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
1877 // CHECK4-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
1878 // CHECK4-NEXT:    br i1 [[TMP8]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
1879 // CHECK4:       omp_offload.failed:
1880 // CHECK4-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28(%struct.SS* [[THIS1]]) #[[ATTR2:[0-9]+]]
1881 // CHECK4-NEXT:    br label [[OMP_OFFLOAD_CONT]]
1882 // CHECK4:       omp_offload.cont:
1883 // CHECK4-NEXT:    [[A2:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1884 // CHECK4-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1885 // CHECK4-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to %struct.SS**
1886 // CHECK4-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP10]], align 4
1887 // CHECK4-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1888 // CHECK4-NEXT:    [[TMP12:%.*]] = bitcast i8** [[TMP11]] to [123 x i32]**
1889 // CHECK4-NEXT:    store [123 x i32]* [[A2]], [123 x i32]** [[TMP12]], align 4
1890 // CHECK4-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
1891 // CHECK4-NEXT:    store i8* null, i8** [[TMP13]], align 4
1892 // CHECK4-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
1893 // CHECK4-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
1894 // CHECK4-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 123)
1895 // CHECK4-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33.region_id, i32 1, i8** [[TMP14]], i8** [[TMP15]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.4, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.5, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
1896 // CHECK4-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
1897 // CHECK4-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED7:%.*]], label [[OMP_OFFLOAD_CONT8:%.*]]
1898 // CHECK4:       omp_offload.failed7:
1899 // CHECK4-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33(%struct.SS* [[THIS1]]) #[[ATTR2]]
1900 // CHECK4-NEXT:    br label [[OMP_OFFLOAD_CONT8]]
1901 // CHECK4:       omp_offload.cont8:
1902 // CHECK4-NEXT:    [[A9:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1903 // CHECK4-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS10]], i32 0, i32 0
1904 // CHECK4-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to %struct.SS**
1905 // CHECK4-NEXT:    store %struct.SS* [[THIS1]], %struct.SS** [[TMP19]], align 4
1906 // CHECK4-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS11]], i32 0, i32 0
1907 // CHECK4-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to [123 x i32]**
1908 // CHECK4-NEXT:    store [123 x i32]* [[A9]], [123 x i32]** [[TMP21]], align 4
1909 // CHECK4-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS12]], i32 0, i32 0
1910 // CHECK4-NEXT:    store i8* null, i8** [[TMP22]], align 4
1911 // CHECK4-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS10]], i32 0, i32 0
1912 // CHECK4-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS11]], i32 0, i32 0
1913 // CHECK4-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 123)
1914 // CHECK4-NEXT:    [[TMP25:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38.region_id, i32 1, i8** [[TMP23]], i8** [[TMP24]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.8, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.9, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
1915 // CHECK4-NEXT:    [[TMP26:%.*]] = icmp ne i32 [[TMP25]], 0
1916 // CHECK4-NEXT:    br i1 [[TMP26]], label [[OMP_OFFLOAD_FAILED14:%.*]], label [[OMP_OFFLOAD_CONT15:%.*]]
1917 // CHECK4:       omp_offload.failed14:
1918 // CHECK4-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38(%struct.SS* [[THIS1]]) #[[ATTR2]]
1919 // CHECK4-NEXT:    br label [[OMP_OFFLOAD_CONT15]]
1920 // CHECK4:       omp_offload.cont15:
1921 // CHECK4-NEXT:    [[A16:%.*]] = getelementptr inbounds [[STRUCT_SS]], %struct.SS* [[THIS1]], i32 0, i32 0
1922 // CHECK4-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A16]], i32 0, i32 0
1923 // CHECK4-NEXT:    [[TMP27:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
1924 // CHECK4-NEXT:    ret i32 [[TMP27]]
1925 //
1926 //
1927 // CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l28
1928 // CHECK4-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {
1929 // CHECK4-NEXT:  entry:
1930 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1931 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1932 // CHECK4-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1933 // CHECK4-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]])
1934 // CHECK4-NEXT:    ret void
1935 //
1936 //
1937 // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined.
1938 // CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
1939 // CHECK4-NEXT:  entry:
1940 // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
1941 // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
1942 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
1943 // CHECK4-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
1944 // CHECK4-NEXT:    [[TMP:%.*]] = alloca i32, align 4
1945 // CHECK4-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
1946 // CHECK4-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
1947 // CHECK4-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1948 // CHECK4-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1949 // CHECK4-NEXT:    [[I:%.*]] = alloca i32, align 4
1950 // CHECK4-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
1951 // CHECK4-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
1952 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
1953 // CHECK4-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
1954 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
1955 // CHECK4-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
1956 // CHECK4-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1957 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
1958 // CHECK4-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
1959 // CHECK4-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
1960 // CHECK4-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)
1961 // CHECK4-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1962 // CHECK4-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
1963 // CHECK4-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1964 // CHECK4:       cond.true:
1965 // CHECK4-NEXT:    br label [[COND_END:%.*]]
1966 // CHECK4:       cond.false:
1967 // CHECK4-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1968 // CHECK4-NEXT:    br label [[COND_END]]
1969 // CHECK4:       cond.end:
1970 // CHECK4-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
1971 // CHECK4-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
1972 // CHECK4-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1973 // CHECK4-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
1974 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
1975 // CHECK4:       omp.inner.for.cond:
1976 // CHECK4-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1977 // CHECK4-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1978 // CHECK4-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
1979 // CHECK4-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1980 // CHECK4:       omp.inner.for.body:
1981 // CHECK4-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
1982 // CHECK4-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
1983 // CHECK4-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]])
1984 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
1985 // CHECK4:       omp.inner.for.inc:
1986 // CHECK4-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1987 // CHECK4-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
1988 // CHECK4-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
1989 // CHECK4-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
1990 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND]]
1991 // CHECK4:       omp.inner.for.end:
1992 // CHECK4-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
1993 // CHECK4:       omp.loop.exit:
1994 // CHECK4-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
1995 // CHECK4-NEXT:    ret void
1996 //
1997 //
1998 // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..1
1999 // CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
2000 // CHECK4-NEXT:  entry:
2001 // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2002 // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2003 // CHECK4-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
2004 // CHECK4-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
2005 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2006 // CHECK4-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2007 // CHECK4-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2008 // CHECK4-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2009 // CHECK4-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2010 // CHECK4-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2011 // CHECK4-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2012 // CHECK4-NEXT:    [[I:%.*]] = alloca i32, align 4
2013 // CHECK4-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2014 // CHECK4-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2015 // CHECK4-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2016 // CHECK4-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2017 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2018 // CHECK4-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2019 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2020 // CHECK4-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
2021 // CHECK4-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2022 // CHECK4-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2023 // CHECK4-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
2024 // CHECK4-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
2025 // CHECK4-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2026 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2027 // CHECK4-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2028 // CHECK4-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
2029 // CHECK4-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)
2030 // CHECK4-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2031 // CHECK4-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
2032 // CHECK4-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2033 // CHECK4:       cond.true:
2034 // CHECK4-NEXT:    br label [[COND_END:%.*]]
2035 // CHECK4:       cond.false:
2036 // CHECK4-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2037 // CHECK4-NEXT:    br label [[COND_END]]
2038 // CHECK4:       cond.end:
2039 // CHECK4-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
2040 // CHECK4-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
2041 // CHECK4-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2042 // CHECK4-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
2043 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2044 // CHECK4:       omp.inner.for.cond:
2045 // CHECK4-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2046 // CHECK4-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2047 // CHECK4-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
2048 // CHECK4-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2049 // CHECK4:       omp.inner.for.body:
2050 // CHECK4-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2051 // CHECK4-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
2052 // CHECK4-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2053 // CHECK4-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
2054 // CHECK4-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
2055 // CHECK4-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
2056 // CHECK4-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
2057 // CHECK4-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
2058 // CHECK4-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2059 // CHECK4:       omp.body.continue:
2060 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2061 // CHECK4:       omp.inner.for.inc:
2062 // CHECK4-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2063 // CHECK4-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
2064 // CHECK4-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
2065 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND]]
2066 // CHECK4:       omp.inner.for.end:
2067 // CHECK4-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2068 // CHECK4:       omp.loop.exit:
2069 // CHECK4-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
2070 // CHECK4-NEXT:    ret void
2071 //
2072 //
2073 // CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l33
2074 // CHECK4-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
2075 // CHECK4-NEXT:  entry:
2076 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2077 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2078 // CHECK4-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2079 // CHECK4-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]])
2080 // CHECK4-NEXT:    ret void
2081 //
2082 //
2083 // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..2
2084 // CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
2085 // CHECK4-NEXT:  entry:
2086 // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2087 // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2088 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2089 // CHECK4-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2090 // CHECK4-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2091 // CHECK4-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2092 // CHECK4-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2093 // CHECK4-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2094 // CHECK4-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2095 // CHECK4-NEXT:    [[I:%.*]] = alloca i32, align 4
2096 // CHECK4-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2097 // CHECK4-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2098 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2099 // CHECK4-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2100 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2101 // CHECK4-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
2102 // CHECK4-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2103 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2104 // CHECK4-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2105 // CHECK4-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
2106 // CHECK4-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)
2107 // CHECK4-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2108 // CHECK4-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
2109 // CHECK4-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2110 // CHECK4:       cond.true:
2111 // CHECK4-NEXT:    br label [[COND_END:%.*]]
2112 // CHECK4:       cond.false:
2113 // CHECK4-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2114 // CHECK4-NEXT:    br label [[COND_END]]
2115 // CHECK4:       cond.end:
2116 // CHECK4-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
2117 // CHECK4-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2118 // CHECK4-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2119 // CHECK4-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
2120 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2121 // CHECK4:       omp.inner.for.cond:
2122 // CHECK4-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2123 // CHECK4-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2124 // CHECK4-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
2125 // CHECK4-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2126 // CHECK4:       omp.inner.for.body:
2127 // CHECK4-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2128 // CHECK4-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2129 // CHECK4-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]])
2130 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2131 // CHECK4:       omp.inner.for.inc:
2132 // CHECK4-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2133 // CHECK4-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2134 // CHECK4-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
2135 // CHECK4-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
2136 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND]]
2137 // CHECK4:       omp.inner.for.end:
2138 // CHECK4-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2139 // CHECK4:       omp.loop.exit:
2140 // CHECK4-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
2141 // CHECK4-NEXT:    ret void
2142 //
2143 //
2144 // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..3
2145 // CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
2146 // CHECK4-NEXT:  entry:
2147 // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2148 // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2149 // CHECK4-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
2150 // CHECK4-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
2151 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2152 // CHECK4-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2153 // CHECK4-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2154 // CHECK4-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2155 // CHECK4-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2156 // CHECK4-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2157 // CHECK4-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2158 // CHECK4-NEXT:    [[I:%.*]] = alloca i32, align 4
2159 // CHECK4-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2160 // CHECK4-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2161 // CHECK4-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2162 // CHECK4-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2163 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2164 // CHECK4-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2165 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2166 // CHECK4-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
2167 // CHECK4-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2168 // CHECK4-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2169 // CHECK4-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
2170 // CHECK4-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
2171 // CHECK4-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2172 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2173 // CHECK4-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2174 // CHECK4-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
2175 // CHECK4-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)
2176 // CHECK4-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2177 // CHECK4-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
2178 // CHECK4-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2179 // CHECK4:       cond.true:
2180 // CHECK4-NEXT:    br label [[COND_END:%.*]]
2181 // CHECK4:       cond.false:
2182 // CHECK4-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2183 // CHECK4-NEXT:    br label [[COND_END]]
2184 // CHECK4:       cond.end:
2185 // CHECK4-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
2186 // CHECK4-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
2187 // CHECK4-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2188 // CHECK4-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
2189 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2190 // CHECK4:       omp.inner.for.cond:
2191 // CHECK4-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2192 // CHECK4-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2193 // CHECK4-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
2194 // CHECK4-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2195 // CHECK4:       omp.inner.for.body:
2196 // CHECK4-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2197 // CHECK4-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
2198 // CHECK4-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2199 // CHECK4-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
2200 // CHECK4-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
2201 // CHECK4-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
2202 // CHECK4-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
2203 // CHECK4-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
2204 // CHECK4-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2205 // CHECK4:       omp.body.continue:
2206 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2207 // CHECK4:       omp.inner.for.inc:
2208 // CHECK4-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2209 // CHECK4-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
2210 // CHECK4-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
2211 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND]]
2212 // CHECK4:       omp.inner.for.end:
2213 // CHECK4-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2214 // CHECK4:       omp.loop.exit:
2215 // CHECK4-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
2216 // CHECK4-NEXT:    ret void
2217 //
2218 //
2219 // CHECK4-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l38
2220 // CHECK4-SAME: (%struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
2221 // CHECK4-NEXT:  entry:
2222 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2223 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2224 // CHECK4-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2225 // CHECK4-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]])
2226 // CHECK4-NEXT:    ret void
2227 //
2228 //
2229 // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..6
2230 // CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
2231 // CHECK4-NEXT:  entry:
2232 // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2233 // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2234 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2235 // CHECK4-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2236 // CHECK4-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2237 // CHECK4-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2238 // CHECK4-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2239 // CHECK4-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2240 // CHECK4-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2241 // CHECK4-NEXT:    [[I:%.*]] = alloca i32, align 4
2242 // CHECK4-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2243 // CHECK4-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2244 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2245 // CHECK4-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2246 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2247 // CHECK4-NEXT:    store i32 122, i32* [[DOTOMP_COMB_UB]], align 4
2248 // CHECK4-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2249 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2250 // CHECK4-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2251 // CHECK4-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
2252 // CHECK4-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 61)
2253 // CHECK4-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2254 // CHECK4-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 122
2255 // CHECK4-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2256 // CHECK4:       cond.true:
2257 // CHECK4-NEXT:    br label [[COND_END:%.*]]
2258 // CHECK4:       cond.false:
2259 // CHECK4-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2260 // CHECK4-NEXT:    br label [[COND_END]]
2261 // CHECK4:       cond.end:
2262 // CHECK4-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
2263 // CHECK4-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2264 // CHECK4-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2265 // CHECK4-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
2266 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2267 // CHECK4:       omp.inner.for.cond:
2268 // CHECK4-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2269 // CHECK4-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[TMP6]], 123
2270 // CHECK4-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2271 // CHECK4:       omp.inner.for.body:
2272 // CHECK4-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2273 // CHECK4-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2274 // CHECK4-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 [[TMP7]], i32 [[TMP8]], %struct.SS* [[TMP0]])
2275 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2276 // CHECK4:       omp.inner.for.inc:
2277 // CHECK4-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2278 // CHECK4-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2279 // CHECK4-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]
2280 // CHECK4-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
2281 // CHECK4-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2282 // CHECK4-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2283 // CHECK4-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]
2284 // CHECK4-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_COMB_LB]], align 4
2285 // CHECK4-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2286 // CHECK4-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2287 // CHECK4-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]
2288 // CHECK4-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_COMB_UB]], align 4
2289 // CHECK4-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2290 // CHECK4-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP15]], 122
2291 // CHECK4-NEXT:    br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]
2292 // CHECK4:       cond.true5:
2293 // CHECK4-NEXT:    br label [[COND_END7:%.*]]
2294 // CHECK4:       cond.false6:
2295 // CHECK4-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2296 // CHECK4-NEXT:    br label [[COND_END7]]
2297 // CHECK4:       cond.end7:
2298 // CHECK4-NEXT:    [[COND8:%.*]] = phi i32 [ 122, [[COND_TRUE5]] ], [ [[TMP16]], [[COND_FALSE6]] ]
2299 // CHECK4-NEXT:    store i32 [[COND8]], i32* [[DOTOMP_COMB_UB]], align 4
2300 // CHECK4-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2301 // CHECK4-NEXT:    store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4
2302 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND]]
2303 // CHECK4:       omp.inner.for.end:
2304 // CHECK4-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2305 // CHECK4:       omp.loop.exit:
2306 // CHECK4-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
2307 // CHECK4-NEXT:    ret void
2308 //
2309 //
2310 // CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..7
2311 // CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], %struct.SS* [[THIS:%.*]]) #[[ATTR1]] {
2312 // CHECK4-NEXT:  entry:
2313 // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
2314 // CHECK4-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
2315 // CHECK4-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
2316 // CHECK4-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
2317 // CHECK4-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.SS*, align 4
2318 // CHECK4-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2319 // CHECK4-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2320 // CHECK4-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2321 // CHECK4-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2322 // CHECK4-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2323 // CHECK4-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2324 // CHECK4-NEXT:    [[I:%.*]] = alloca i32, align 4
2325 // CHECK4-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
2326 // CHECK4-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
2327 // CHECK4-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2328 // CHECK4-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2329 // CHECK4-NEXT:    store %struct.SS* [[THIS]], %struct.SS** [[THIS_ADDR]], align 4
2330 // CHECK4-NEXT:    [[TMP0:%.*]] = load %struct.SS*, %struct.SS** [[THIS_ADDR]], align 4
2331 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2332 // CHECK4-NEXT:    store i32 122, i32* [[DOTOMP_UB]], align 4
2333 // CHECK4-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
2334 // CHECK4-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
2335 // CHECK4-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
2336 // CHECK4-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
2337 // CHECK4-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2338 // CHECK4-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2339 // CHECK4-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
2340 // CHECK4-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
2341 // CHECK4-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)
2342 // CHECK4-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2343 // CHECK4-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 122
2344 // CHECK4-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2345 // CHECK4:       cond.true:
2346 // CHECK4-NEXT:    br label [[COND_END:%.*]]
2347 // CHECK4:       cond.false:
2348 // CHECK4-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2349 // CHECK4-NEXT:    br label [[COND_END]]
2350 // CHECK4:       cond.end:
2351 // CHECK4-NEXT:    [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
2352 // CHECK4-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
2353 // CHECK4-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2354 // CHECK4-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
2355 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2356 // CHECK4:       omp.inner.for.cond:
2357 // CHECK4-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2358 // CHECK4-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2359 // CHECK4-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
2360 // CHECK4-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2361 // CHECK4:       omp.inner.for.body:
2362 // CHECK4-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2363 // CHECK4-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
2364 // CHECK4-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2365 // CHECK4-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
2366 // CHECK4-NEXT:    [[A:%.*]] = getelementptr inbounds [[STRUCT_SS:%.*]], %struct.SS* [[TMP0]], i32 0, i32 0
2367 // CHECK4-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
2368 // CHECK4-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], [123 x i32]* [[A]], i32 0, i32 [[TMP11]]
2369 // CHECK4-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
2370 // CHECK4-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2371 // CHECK4:       omp.body.continue:
2372 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2373 // CHECK4:       omp.inner.for.inc:
2374 // CHECK4-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2375 // CHECK4-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
2376 // CHECK4-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
2377 // CHECK4-NEXT:    br label [[OMP_INNER_FOR_COND]]
2378 // CHECK4:       omp.inner.for.end:
2379 // CHECK4-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2380 // CHECK4:       omp.loop.exit:
2381 // CHECK4-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
2382 // CHECK4-NEXT:    ret void
2383 //
2384 //
2385 // CHECK4-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
2386 // CHECK4-SAME: () #[[ATTR3:[0-9]+]] {
2387 // CHECK4-NEXT:  entry:
2388 // CHECK4-NEXT:    call void @__tgt_register_requires(i64 1)
2389 // CHECK4-NEXT:    ret void
2390 //
2391 //
2392 // CHECK9-LABEL: define {{[^@]+}}@main
2393 // CHECK9-SAME: (i32 signext [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
2394 // CHECK9-NEXT:  entry:
2395 // CHECK9-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
2396 // CHECK9-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
2397 // CHECK9-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 8
2398 // CHECK9-NEXT:    [[N:%.*]] = alloca i32, align 4
2399 // CHECK9-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 8
2400 // CHECK9-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i64, align 8
2401 // CHECK9-NEXT:    [[M:%.*]] = alloca i32, align 4
2402 // CHECK9-NEXT:    [[N_CASTED:%.*]] = alloca i64, align 8
2403 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
2404 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
2405 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
2406 // CHECK9-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 8
2407 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2408 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2409 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2410 // CHECK9-NEXT:    [[N_CASTED3:%.*]] = alloca i64, align 8
2411 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [3 x i8*], align 8
2412 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS6:%.*]] = alloca [3 x i8*], align 8
2413 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [3 x i8*], align 8
2414 // CHECK9-NEXT:    [[DOTOFFLOAD_SIZES8:%.*]] = alloca [3 x i64], align 8
2415 // CHECK9-NEXT:    [[_TMP9:%.*]] = alloca i32, align 4
2416 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
2417 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_11:%.*]] = alloca i32, align 4
2418 // CHECK9-NEXT:    [[M_CASTED:%.*]] = alloca i64, align 8
2419 // CHECK9-NEXT:    [[N_CASTED19:%.*]] = alloca i64, align 8
2420 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS21:%.*]] = alloca [4 x i8*], align 8
2421 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS22:%.*]] = alloca [4 x i8*], align 8
2422 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS23:%.*]] = alloca [4 x i8*], align 8
2423 // CHECK9-NEXT:    [[DOTOFFLOAD_SIZES24:%.*]] = alloca [4 x i64], align 8
2424 // CHECK9-NEXT:    [[_TMP25:%.*]] = alloca i32, align 4
2425 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_26:%.*]] = alloca i32, align 4
2426 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_27:%.*]] = alloca i32, align 4
2427 // CHECK9-NEXT:    store i32 0, i32* [[RETVAL]], align 4
2428 // CHECK9-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
2429 // CHECK9-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
2430 // CHECK9-NEXT:    store i32 100, i32* [[N]], align 4
2431 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
2432 // CHECK9-NEXT:    [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
2433 // CHECK9-NEXT:    [[TMP2:%.*]] = call i8* @llvm.stacksave()
2434 // CHECK9-NEXT:    store i8* [[TMP2]], i8** [[SAVED_STACK]], align 8
2435 // CHECK9-NEXT:    [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 4
2436 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[__VLA_EXPR0]], align 8
2437 // CHECK9-NEXT:    store i32 10, i32* [[M]], align 4
2438 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[N]], align 4
2439 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_CASTED]] to i32*
2440 // CHECK9-NEXT:    store i32 [[TMP3]], i32* [[CONV]], align 4
2441 // CHECK9-NEXT:    [[TMP4:%.*]] = load i64, i64* [[N_CASTED]], align 8
2442 // CHECK9-NEXT:    [[TMP5:%.*]] = mul nuw i64 [[TMP1]], 4
2443 // CHECK9-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
2444 // CHECK9-NEXT:    [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i64*
2445 // CHECK9-NEXT:    store i64 [[TMP4]], i64* [[TMP7]], align 8
2446 // CHECK9-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
2447 // CHECK9-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i64*
2448 // CHECK9-NEXT:    store i64 [[TMP4]], i64* [[TMP9]], align 8
2449 // CHECK9-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
2450 // CHECK9-NEXT:    store i64 4, i64* [[TMP10]], align 8
2451 // CHECK9-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
2452 // CHECK9-NEXT:    store i8* null, i8** [[TMP11]], align 8
2453 // CHECK9-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
2454 // CHECK9-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i64*
2455 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP13]], align 8
2456 // CHECK9-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
2457 // CHECK9-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i64*
2458 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP15]], align 8
2459 // CHECK9-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 1
2460 // CHECK9-NEXT:    store i64 8, i64* [[TMP16]], align 8
2461 // CHECK9-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
2462 // CHECK9-NEXT:    store i8* null, i8** [[TMP17]], align 8
2463 // CHECK9-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
2464 // CHECK9-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
2465 // CHECK9-NEXT:    store i32* [[VLA]], i32** [[TMP19]], align 8
2466 // CHECK9-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
2467 // CHECK9-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32**
2468 // CHECK9-NEXT:    store i32* [[VLA]], i32** [[TMP21]], align 8
2469 // CHECK9-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
2470 // CHECK9-NEXT:    store i64 [[TMP5]], i64* [[TMP22]], align 8
2471 // CHECK9-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
2472 // CHECK9-NEXT:    store i8* null, i8** [[TMP23]], align 8
2473 // CHECK9-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
2474 // CHECK9-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
2475 // CHECK9-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
2476 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[N]], align 4
2477 // CHECK9-NEXT:    store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4
2478 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2479 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0
2480 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2481 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2482 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2483 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2484 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP29]], 1
2485 // CHECK9-NEXT:    [[TMP30:%.*]] = zext i32 [[ADD]] to i64
2486 // CHECK9-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i64 [[TMP30]])
2487 // CHECK9-NEXT:    [[TMP31:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* [[TMP26]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
2488 // CHECK9-NEXT:    [[TMP32:%.*]] = icmp ne i32 [[TMP31]], 0
2489 // CHECK9-NEXT:    br i1 [[TMP32]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
2490 // CHECK9:       omp_offload.failed:
2491 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106(i64 [[TMP4]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3:[0-9]+]]
2492 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT]]
2493 // CHECK9:       omp_offload.cont:
2494 // CHECK9-NEXT:    [[TMP33:%.*]] = load i32, i32* [[N]], align 4
2495 // CHECK9-NEXT:    [[CONV4:%.*]] = bitcast i64* [[N_CASTED3]] to i32*
2496 // CHECK9-NEXT:    store i32 [[TMP33]], i32* [[CONV4]], align 4
2497 // CHECK9-NEXT:    [[TMP34:%.*]] = load i64, i64* [[N_CASTED3]], align 8
2498 // CHECK9-NEXT:    [[TMP35:%.*]] = mul nuw i64 [[TMP1]], 4
2499 // CHECK9-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
2500 // CHECK9-NEXT:    [[TMP37:%.*]] = bitcast i8** [[TMP36]] to i64*
2501 // CHECK9-NEXT:    store i64 [[TMP34]], i64* [[TMP37]], align 8
2502 // CHECK9-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
2503 // CHECK9-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to i64*
2504 // CHECK9-NEXT:    store i64 [[TMP34]], i64* [[TMP39]], align 8
2505 // CHECK9-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 0
2506 // CHECK9-NEXT:    store i64 4, i64* [[TMP40]], align 8
2507 // CHECK9-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 0
2508 // CHECK9-NEXT:    store i8* null, i8** [[TMP41]], align 8
2509 // CHECK9-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 1
2510 // CHECK9-NEXT:    [[TMP43:%.*]] = bitcast i8** [[TMP42]] to i64*
2511 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP43]], align 8
2512 // CHECK9-NEXT:    [[TMP44:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 1
2513 // CHECK9-NEXT:    [[TMP45:%.*]] = bitcast i8** [[TMP44]] to i64*
2514 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP45]], align 8
2515 // CHECK9-NEXT:    [[TMP46:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 1
2516 // CHECK9-NEXT:    store i64 8, i64* [[TMP46]], align 8
2517 // CHECK9-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 1
2518 // CHECK9-NEXT:    store i8* null, i8** [[TMP47]], align 8
2519 // CHECK9-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 2
2520 // CHECK9-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to i32**
2521 // CHECK9-NEXT:    store i32* [[VLA]], i32** [[TMP49]], align 8
2522 // CHECK9-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 2
2523 // CHECK9-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
2524 // CHECK9-NEXT:    store i32* [[VLA]], i32** [[TMP51]], align 8
2525 // CHECK9-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 2
2526 // CHECK9-NEXT:    store i64 [[TMP35]], i64* [[TMP52]], align 8
2527 // CHECK9-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 2
2528 // CHECK9-NEXT:    store i8* null, i8** [[TMP53]], align 8
2529 // CHECK9-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
2530 // CHECK9-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
2531 // CHECK9-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 0
2532 // CHECK9-NEXT:    [[TMP57:%.*]] = load i32, i32* [[N]], align 4
2533 // CHECK9-NEXT:    store i32 [[TMP57]], i32* [[DOTCAPTURE_EXPR_10]], align 4
2534 // CHECK9-NEXT:    [[TMP58:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
2535 // CHECK9-NEXT:    [[SUB12:%.*]] = sub nsw i32 [[TMP58]], 0
2536 // CHECK9-NEXT:    [[DIV13:%.*]] = sdiv i32 [[SUB12]], 1
2537 // CHECK9-NEXT:    [[SUB14:%.*]] = sub nsw i32 [[DIV13]], 1
2538 // CHECK9-NEXT:    store i32 [[SUB14]], i32* [[DOTCAPTURE_EXPR_11]], align 4
2539 // CHECK9-NEXT:    [[TMP59:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
2540 // CHECK9-NEXT:    [[ADD15:%.*]] = add nsw i32 [[TMP59]], 1
2541 // CHECK9-NEXT:    [[TMP60:%.*]] = zext i32 [[ADD15]] to i64
2542 // CHECK9-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 [[TMP60]])
2543 // CHECK9-NEXT:    [[TMP61:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111.region_id, i32 3, i8** [[TMP54]], i8** [[TMP55]], i64* [[TMP56]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
2544 // CHECK9-NEXT:    [[TMP62:%.*]] = icmp ne i32 [[TMP61]], 0
2545 // CHECK9-NEXT:    br i1 [[TMP62]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
2546 // CHECK9:       omp_offload.failed16:
2547 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111(i64 [[TMP34]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
2548 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
2549 // CHECK9:       omp_offload.cont17:
2550 // CHECK9-NEXT:    [[TMP63:%.*]] = load i32, i32* [[M]], align 4
2551 // CHECK9-NEXT:    [[CONV18:%.*]] = bitcast i64* [[M_CASTED]] to i32*
2552 // CHECK9-NEXT:    store i32 [[TMP63]], i32* [[CONV18]], align 4
2553 // CHECK9-NEXT:    [[TMP64:%.*]] = load i64, i64* [[M_CASTED]], align 8
2554 // CHECK9-NEXT:    [[TMP65:%.*]] = load i32, i32* [[N]], align 4
2555 // CHECK9-NEXT:    [[CONV20:%.*]] = bitcast i64* [[N_CASTED19]] to i32*
2556 // CHECK9-NEXT:    store i32 [[TMP65]], i32* [[CONV20]], align 4
2557 // CHECK9-NEXT:    [[TMP66:%.*]] = load i64, i64* [[N_CASTED19]], align 8
2558 // CHECK9-NEXT:    [[TMP67:%.*]] = mul nuw i64 [[TMP1]], 4
2559 // CHECK9-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 0
2560 // CHECK9-NEXT:    [[TMP69:%.*]] = bitcast i8** [[TMP68]] to i64*
2561 // CHECK9-NEXT:    store i64 [[TMP64]], i64* [[TMP69]], align 8
2562 // CHECK9-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 0
2563 // CHECK9-NEXT:    [[TMP71:%.*]] = bitcast i8** [[TMP70]] to i64*
2564 // CHECK9-NEXT:    store i64 [[TMP64]], i64* [[TMP71]], align 8
2565 // CHECK9-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 0
2566 // CHECK9-NEXT:    store i64 4, i64* [[TMP72]], align 8
2567 // CHECK9-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 0
2568 // CHECK9-NEXT:    store i8* null, i8** [[TMP73]], align 8
2569 // CHECK9-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 1
2570 // CHECK9-NEXT:    [[TMP75:%.*]] = bitcast i8** [[TMP74]] to i64*
2571 // CHECK9-NEXT:    store i64 [[TMP66]], i64* [[TMP75]], align 8
2572 // CHECK9-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 1
2573 // CHECK9-NEXT:    [[TMP77:%.*]] = bitcast i8** [[TMP76]] to i64*
2574 // CHECK9-NEXT:    store i64 [[TMP66]], i64* [[TMP77]], align 8
2575 // CHECK9-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 1
2576 // CHECK9-NEXT:    store i64 4, i64* [[TMP78]], align 8
2577 // CHECK9-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 1
2578 // CHECK9-NEXT:    store i8* null, i8** [[TMP79]], align 8
2579 // CHECK9-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 2
2580 // CHECK9-NEXT:    [[TMP81:%.*]] = bitcast i8** [[TMP80]] to i64*
2581 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP81]], align 8
2582 // CHECK9-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 2
2583 // CHECK9-NEXT:    [[TMP83:%.*]] = bitcast i8** [[TMP82]] to i64*
2584 // CHECK9-NEXT:    store i64 [[TMP1]], i64* [[TMP83]], align 8
2585 // CHECK9-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 2
2586 // CHECK9-NEXT:    store i64 8, i64* [[TMP84]], align 8
2587 // CHECK9-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 2
2588 // CHECK9-NEXT:    store i8* null, i8** [[TMP85]], align 8
2589 // CHECK9-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 3
2590 // CHECK9-NEXT:    [[TMP87:%.*]] = bitcast i8** [[TMP86]] to i32**
2591 // CHECK9-NEXT:    store i32* [[VLA]], i32** [[TMP87]], align 8
2592 // CHECK9-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 3
2593 // CHECK9-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to i32**
2594 // CHECK9-NEXT:    store i32* [[VLA]], i32** [[TMP89]], align 8
2595 // CHECK9-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 3
2596 // CHECK9-NEXT:    store i64 [[TMP67]], i64* [[TMP90]], align 8
2597 // CHECK9-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 3
2598 // CHECK9-NEXT:    store i8* null, i8** [[TMP91]], align 8
2599 // CHECK9-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 0
2600 // CHECK9-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 0
2601 // CHECK9-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 0
2602 // CHECK9-NEXT:    [[TMP95:%.*]] = load i32, i32* [[N]], align 4
2603 // CHECK9-NEXT:    store i32 [[TMP95]], i32* [[DOTCAPTURE_EXPR_26]], align 4
2604 // CHECK9-NEXT:    [[TMP96:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_26]], align 4
2605 // CHECK9-NEXT:    [[SUB28:%.*]] = sub nsw i32 [[TMP96]], 0
2606 // CHECK9-NEXT:    [[DIV29:%.*]] = sdiv i32 [[SUB28]], 1
2607 // CHECK9-NEXT:    [[SUB30:%.*]] = sub nsw i32 [[DIV29]], 1
2608 // CHECK9-NEXT:    store i32 [[SUB30]], i32* [[DOTCAPTURE_EXPR_27]], align 4
2609 // CHECK9-NEXT:    [[TMP97:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_27]], align 4
2610 // CHECK9-NEXT:    [[ADD31:%.*]] = add nsw i32 [[TMP97]], 1
2611 // CHECK9-NEXT:    [[TMP98:%.*]] = zext i32 [[ADD31]] to i64
2612 // CHECK9-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 [[TMP98]])
2613 // CHECK9-NEXT:    [[TMP99:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116.region_id, i32 4, i8** [[TMP92]], i8** [[TMP93]], i64* [[TMP94]], i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.7, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
2614 // CHECK9-NEXT:    [[TMP100:%.*]] = icmp ne i32 [[TMP99]], 0
2615 // CHECK9-NEXT:    br i1 [[TMP100]], label [[OMP_OFFLOAD_FAILED32:%.*]], label [[OMP_OFFLOAD_CONT33:%.*]]
2616 // CHECK9:       omp_offload.failed32:
2617 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116(i64 [[TMP64]], i64 [[TMP66]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
2618 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT33]]
2619 // CHECK9:       omp_offload.cont33:
2620 // CHECK9-NEXT:    [[TMP101:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
2621 // CHECK9-NEXT:    [[CALL:%.*]] = call signext i32 @_Z5tmainIiLi10EEiT_(i32 signext [[TMP101]])
2622 // CHECK9-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
2623 // CHECK9-NEXT:    [[TMP102:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8
2624 // CHECK9-NEXT:    call void @llvm.stackrestore(i8* [[TMP102]])
2625 // CHECK9-NEXT:    [[TMP103:%.*]] = load i32, i32* [[RETVAL]], align 4
2626 // CHECK9-NEXT:    ret i32 [[TMP103]]
2627 //
2628 //
2629 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106
2630 // CHECK9-SAME: (i64 [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {
2631 // CHECK9-NEXT:  entry:
2632 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
2633 // CHECK9-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
2634 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
2635 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
2636 // CHECK9-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
2637 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
2638 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
2639 // CHECK9-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
2640 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
2641 // CHECK9-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]])
2642 // CHECK9-NEXT:    ret void
2643 //
2644 //
2645 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined.
2646 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
2647 // CHECK9-NEXT:  entry:
2648 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2649 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2650 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
2651 // CHECK9-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
2652 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
2653 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2654 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2655 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2656 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2657 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
2658 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2659 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2660 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2661 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2662 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
2663 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2664 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2665 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
2666 // CHECK9-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
2667 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
2668 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
2669 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
2670 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
2671 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
2672 // CHECK9-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
2673 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2674 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
2675 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2676 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2677 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2678 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
2679 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2680 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
2681 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2682 // CHECK9:       omp.precond.then:
2683 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2684 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2685 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
2686 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2687 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2688 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2689 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
2690 // CHECK9-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)
2691 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2692 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2693 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
2694 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2695 // CHECK9:       cond.true:
2696 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2697 // CHECK9-NEXT:    br label [[COND_END:%.*]]
2698 // CHECK9:       cond.false:
2699 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2700 // CHECK9-NEXT:    br label [[COND_END]]
2701 // CHECK9:       cond.end:
2702 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
2703 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2704 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2705 // CHECK9-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
2706 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2707 // CHECK9:       omp.inner.for.cond:
2708 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2709 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2710 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
2711 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2712 // CHECK9:       omp.inner.for.body:
2713 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2714 // CHECK9-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
2715 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2716 // CHECK9-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
2717 // CHECK9-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]])
2718 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2719 // CHECK9:       omp.inner.for.inc:
2720 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2721 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2722 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
2723 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
2724 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
2725 // CHECK9:       omp.inner.for.end:
2726 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2727 // CHECK9:       omp.loop.exit:
2728 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2729 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
2730 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
2731 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
2732 // CHECK9:       omp.precond.end:
2733 // CHECK9-NEXT:    ret void
2734 //
2735 //
2736 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..1
2737 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
2738 // CHECK9-NEXT:  entry:
2739 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2740 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2741 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
2742 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
2743 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
2744 // CHECK9-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
2745 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
2746 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2747 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2748 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2749 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2750 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
2751 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2752 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2753 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2754 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2755 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
2756 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2757 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2758 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2759 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2760 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
2761 // CHECK9-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
2762 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
2763 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
2764 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
2765 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
2766 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
2767 // CHECK9-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
2768 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2769 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
2770 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2771 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2772 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2773 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
2774 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2775 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
2776 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2777 // CHECK9:       omp.precond.then:
2778 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2779 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2780 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
2781 // CHECK9-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2782 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
2783 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2784 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
2785 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
2786 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
2787 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2788 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2789 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2790 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
2791 // CHECK9-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)
2792 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2793 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2794 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
2795 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2796 // CHECK9:       cond.true:
2797 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2798 // CHECK9-NEXT:    br label [[COND_END:%.*]]
2799 // CHECK9:       cond.false:
2800 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2801 // CHECK9-NEXT:    br label [[COND_END]]
2802 // CHECK9:       cond.end:
2803 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
2804 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
2805 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2806 // CHECK9-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
2807 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2808 // CHECK9:       omp.inner.for.cond:
2809 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2810 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2811 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
2812 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2813 // CHECK9:       omp.inner.for.body:
2814 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2815 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
2816 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2817 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
2818 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4
2819 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
2820 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
2821 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
2822 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
2823 // CHECK9:       omp.body.continue:
2824 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2825 // CHECK9:       omp.inner.for.inc:
2826 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2827 // CHECK9-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
2828 // CHECK9-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4
2829 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
2830 // CHECK9:       omp.inner.for.end:
2831 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2832 // CHECK9:       omp.loop.exit:
2833 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2834 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
2835 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
2836 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
2837 // CHECK9:       omp.precond.end:
2838 // CHECK9-NEXT:    ret void
2839 //
2840 //
2841 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111
2842 // CHECK9-SAME: (i64 [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
2843 // CHECK9-NEXT:  entry:
2844 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
2845 // CHECK9-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
2846 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
2847 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
2848 // CHECK9-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
2849 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
2850 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
2851 // CHECK9-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
2852 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
2853 // CHECK9-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]])
2854 // CHECK9-NEXT:    ret void
2855 //
2856 //
2857 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..2
2858 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
2859 // CHECK9-NEXT:  entry:
2860 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2861 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2862 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
2863 // CHECK9-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
2864 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
2865 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2866 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2867 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2868 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2869 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
2870 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
2871 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
2872 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2873 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2874 // CHECK9-NEXT:    [[I3:%.*]] = alloca i32, align 4
2875 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2876 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2877 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
2878 // CHECK9-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
2879 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
2880 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
2881 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
2882 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
2883 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
2884 // CHECK9-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
2885 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2886 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
2887 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2888 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2889 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2890 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
2891 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2892 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
2893 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2894 // CHECK9:       omp.precond.then:
2895 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
2896 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2897 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
2898 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2899 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
2900 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2901 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
2902 // CHECK9-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)
2903 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2904 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2905 // CHECK9-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
2906 // CHECK9-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2907 // CHECK9:       cond.true:
2908 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2909 // CHECK9-NEXT:    br label [[COND_END:%.*]]
2910 // CHECK9:       cond.false:
2911 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2912 // CHECK9-NEXT:    br label [[COND_END]]
2913 // CHECK9:       cond.end:
2914 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
2915 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
2916 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2917 // CHECK9-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
2918 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
2919 // CHECK9:       omp.inner.for.cond:
2920 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2921 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2922 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
2923 // CHECK9-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2924 // CHECK9:       omp.inner.for.body:
2925 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
2926 // CHECK9-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
2927 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
2928 // CHECK9-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
2929 // CHECK9-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]])
2930 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
2931 // CHECK9:       omp.inner.for.inc:
2932 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2933 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
2934 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
2935 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
2936 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
2937 // CHECK9:       omp.inner.for.end:
2938 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
2939 // CHECK9:       omp.loop.exit:
2940 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2941 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
2942 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
2943 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
2944 // CHECK9:       omp.precond.end:
2945 // CHECK9-NEXT:    ret void
2946 //
2947 //
2948 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..3
2949 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
2950 // CHECK9-NEXT:  entry:
2951 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2952 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2953 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
2954 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
2955 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
2956 // CHECK9-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
2957 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
2958 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
2959 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
2960 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2961 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2962 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
2963 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
2964 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
2965 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2966 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2967 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
2968 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2969 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2970 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2971 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2972 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
2973 // CHECK9-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
2974 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
2975 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
2976 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
2977 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
2978 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
2979 // CHECK9-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
2980 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2981 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
2982 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2983 // CHECK9-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2984 // CHECK9-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2985 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
2986 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2987 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
2988 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2989 // CHECK9:       omp.precond.then:
2990 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
2991 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2992 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
2993 // CHECK9-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
2994 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
2995 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
2996 // CHECK9-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
2997 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
2998 // CHECK9-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
2999 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3000 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3001 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3002 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
3003 // CHECK9-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)
3004 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3005 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3006 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
3007 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3008 // CHECK9:       cond.true:
3009 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3010 // CHECK9-NEXT:    br label [[COND_END:%.*]]
3011 // CHECK9:       cond.false:
3012 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3013 // CHECK9-NEXT:    br label [[COND_END]]
3014 // CHECK9:       cond.end:
3015 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
3016 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3017 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3018 // CHECK9-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
3019 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3020 // CHECK9:       omp.inner.for.cond:
3021 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3022 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3023 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
3024 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3025 // CHECK9:       omp.inner.for.body:
3026 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3027 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
3028 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3029 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
3030 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4
3031 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
3032 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
3033 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
3034 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3035 // CHECK9:       omp.body.continue:
3036 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3037 // CHECK9:       omp.inner.for.inc:
3038 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3039 // CHECK9-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
3040 // CHECK9-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4
3041 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
3042 // CHECK9:       omp.inner.for.end:
3043 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3044 // CHECK9:       omp.loop.exit:
3045 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3046 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
3047 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
3048 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
3049 // CHECK9:       omp.precond.end:
3050 // CHECK9-NEXT:    ret void
3051 //
3052 //
3053 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116
3054 // CHECK9-SAME: (i64 [[M:%.*]], i64 [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
3055 // CHECK9-NEXT:  entry:
3056 // CHECK9-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
3057 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
3058 // CHECK9-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
3059 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
3060 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3061 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
3062 // CHECK9-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
3063 // CHECK9-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
3064 // CHECK9-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
3065 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
3066 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
3067 // CHECK9-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
3068 // CHECK9-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
3069 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
3070 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32, i32* [[CONV]], align 8
3071 // CHECK9-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
3072 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3073 // CHECK9-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
3074 // CHECK9-NEXT:    store i32 [[TMP3]], i32* [[CONV2]], align 4
3075 // CHECK9-NEXT:    [[TMP4:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
3076 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32*, i64)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* [[CONV1]], i64 [[TMP0]], i32* [[TMP1]], i64 [[TMP4]])
3077 // CHECK9-NEXT:    ret void
3078 //
3079 //
3080 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..5
3081 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
3082 // CHECK9-NEXT:  entry:
3083 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3084 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3085 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
3086 // CHECK9-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
3087 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
3088 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
3089 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3090 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3091 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3092 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
3093 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
3094 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3095 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3096 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3097 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3098 // CHECK9-NEXT:    [[I4:%.*]] = alloca i32, align 4
3099 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
3100 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3101 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3102 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
3103 // CHECK9-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
3104 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
3105 // CHECK9-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3106 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
3107 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
3108 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
3109 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3110 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
3111 // CHECK9-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3112 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3113 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
3114 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3115 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
3116 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
3117 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
3118 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3119 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
3120 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3121 // CHECK9:       omp.precond.then:
3122 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3123 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3124 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
3125 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3126 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3127 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[CONV]], align 8
3128 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3129 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
3130 // CHECK9-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]])
3131 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3132 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3133 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
3134 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3135 // CHECK9:       cond.true:
3136 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3137 // CHECK9-NEXT:    br label [[COND_END:%.*]]
3138 // CHECK9:       cond.false:
3139 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3140 // CHECK9-NEXT:    br label [[COND_END]]
3141 // CHECK9:       cond.end:
3142 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
3143 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3144 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3145 // CHECK9-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
3146 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3147 // CHECK9:       omp.inner.for.cond:
3148 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3149 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3150 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
3151 // CHECK9-NEXT:    [[CMP6:%.*]] = icmp slt i32 [[TMP15]], [[ADD]]
3152 // CHECK9-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3153 // CHECK9:       omp.inner.for.body:
3154 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3155 // CHECK9-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
3156 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3157 // CHECK9-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
3158 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[CONV]], align 8
3159 // CHECK9-NEXT:    [[CONV7:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
3160 // CHECK9-NEXT:    store i32 [[TMP21]], i32* [[CONV7]], align 4
3161 // CHECK9-NEXT:    [[TMP22:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
3162 // CHECK9-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64, i64, i32*, i64, i32*, i64)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]], i64 [[TMP22]])
3163 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3164 // CHECK9:       omp.inner.for.inc:
3165 // CHECK9-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3166 // CHECK9-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3167 // CHECK9-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
3168 // CHECK9-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4
3169 // CHECK9-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3170 // CHECK9-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3171 // CHECK9-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
3172 // CHECK9-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_COMB_LB]], align 4
3173 // CHECK9-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3174 // CHECK9-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3175 // CHECK9-NEXT:    [[ADD10:%.*]] = add nsw i32 [[TMP27]], [[TMP28]]
3176 // CHECK9-NEXT:    store i32 [[ADD10]], i32* [[DOTOMP_COMB_UB]], align 4
3177 // CHECK9-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3178 // CHECK9-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3179 // CHECK9-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[TMP29]], [[TMP30]]
3180 // CHECK9-NEXT:    br i1 [[CMP11]], label [[COND_TRUE12:%.*]], label [[COND_FALSE13:%.*]]
3181 // CHECK9:       cond.true12:
3182 // CHECK9-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3183 // CHECK9-NEXT:    br label [[COND_END14:%.*]]
3184 // CHECK9:       cond.false13:
3185 // CHECK9-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3186 // CHECK9-NEXT:    br label [[COND_END14]]
3187 // CHECK9:       cond.end14:
3188 // CHECK9-NEXT:    [[COND15:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE12]] ], [ [[TMP32]], [[COND_FALSE13]] ]
3189 // CHECK9-NEXT:    store i32 [[COND15]], i32* [[DOTOMP_COMB_UB]], align 4
3190 // CHECK9-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3191 // CHECK9-NEXT:    store i32 [[TMP33]], i32* [[DOTOMP_IV]], align 4
3192 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
3193 // CHECK9:       omp.inner.for.end:
3194 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3195 // CHECK9:       omp.loop.exit:
3196 // CHECK9-NEXT:    [[TMP34:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3197 // CHECK9-NEXT:    [[TMP35:%.*]] = load i32, i32* [[TMP34]], align 4
3198 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP35]])
3199 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
3200 // CHECK9:       omp.precond.end:
3201 // CHECK9-NEXT:    ret void
3202 //
3203 //
3204 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..6
3205 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
3206 // CHECK9-NEXT:  entry:
3207 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3208 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3209 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
3210 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
3211 // CHECK9-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
3212 // CHECK9-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
3213 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
3214 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
3215 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3216 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3217 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3218 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
3219 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
3220 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3221 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3222 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3223 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3224 // CHECK9-NEXT:    [[I6:%.*]] = alloca i32, align 4
3225 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3226 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3227 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
3228 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
3229 // CHECK9-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
3230 // CHECK9-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
3231 // CHECK9-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
3232 // CHECK9-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3233 // CHECK9-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
3234 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
3235 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
3236 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3237 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
3238 // CHECK9-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3239 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3240 // CHECK9-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
3241 // CHECK9-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3242 // CHECK9-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
3243 // CHECK9-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
3244 // CHECK9-NEXT:    store i32 0, i32* [[I]], align 4
3245 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3246 // CHECK9-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
3247 // CHECK9-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3248 // CHECK9:       omp.precond.then:
3249 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3250 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3251 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
3252 // CHECK9-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
3253 // CHECK9-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP7]] to i32
3254 // CHECK9-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
3255 // CHECK9-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP8]] to i32
3256 // CHECK9-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
3257 // CHECK9-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
3258 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3259 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3260 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3261 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
3262 // CHECK9-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)
3263 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3264 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3265 // CHECK9-NEXT:    [[CMP7:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
3266 // CHECK9-NEXT:    br i1 [[CMP7]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3267 // CHECK9:       cond.true:
3268 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
3269 // CHECK9-NEXT:    br label [[COND_END:%.*]]
3270 // CHECK9:       cond.false:
3271 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3272 // CHECK9-NEXT:    br label [[COND_END]]
3273 // CHECK9:       cond.end:
3274 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
3275 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3276 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3277 // CHECK9-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
3278 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3279 // CHECK9:       omp.inner.for.cond:
3280 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3281 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3282 // CHECK9-NEXT:    [[CMP8:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
3283 // CHECK9-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3284 // CHECK9:       omp.inner.for.body:
3285 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3286 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
3287 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3288 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4
3289 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I6]], align 4
3290 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
3291 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
3292 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
3293 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3294 // CHECK9:       omp.body.continue:
3295 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3296 // CHECK9:       omp.inner.for.inc:
3297 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3298 // CHECK9-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP20]], 1
3299 // CHECK9-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
3300 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
3301 // CHECK9:       omp.inner.for.end:
3302 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3303 // CHECK9:       omp.loop.exit:
3304 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3305 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
3306 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
3307 // CHECK9-NEXT:    br label [[OMP_PRECOND_END]]
3308 // CHECK9:       omp.precond.end:
3309 // CHECK9-NEXT:    ret void
3310 //
3311 //
3312 // CHECK9-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
3313 // CHECK9-SAME: (i32 signext [[ARGC:%.*]]) #[[ATTR4:[0-9]+]] comdat {
3314 // CHECK9-NEXT:  entry:
3315 // CHECK9-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
3316 // CHECK9-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
3317 // CHECK9-NEXT:    [[M:%.*]] = alloca i32, align 4
3318 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8
3319 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8
3320 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8
3321 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3322 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 8
3323 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 8
3324 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 8
3325 // CHECK9-NEXT:    [[_TMP4:%.*]] = alloca i32, align 4
3326 // CHECK9-NEXT:    [[M_CASTED:%.*]] = alloca i64, align 8
3327 // CHECK9-NEXT:    [[DOTOFFLOAD_BASEPTRS7:%.*]] = alloca [2 x i8*], align 8
3328 // CHECK9-NEXT:    [[DOTOFFLOAD_PTRS8:%.*]] = alloca [2 x i8*], align 8
3329 // CHECK9-NEXT:    [[DOTOFFLOAD_MAPPERS9:%.*]] = alloca [2 x i8*], align 8
3330 // CHECK9-NEXT:    [[_TMP10:%.*]] = alloca i32, align 4
3331 // CHECK9-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
3332 // CHECK9-NEXT:    store i32 10, i32* [[M]], align 4
3333 // CHECK9-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3334 // CHECK9-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [10 x i32]**
3335 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP1]], align 8
3336 // CHECK9-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3337 // CHECK9-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [10 x i32]**
3338 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP3]], align 8
3339 // CHECK9-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
3340 // CHECK9-NEXT:    store i8* null, i8** [[TMP4]], align 8
3341 // CHECK9-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3342 // CHECK9-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3343 // CHECK9-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
3344 // CHECK9-NEXT:    [[TMP7:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84.region_id, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.10, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
3345 // CHECK9-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
3346 // CHECK9-NEXT:    br i1 [[TMP8]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
3347 // CHECK9:       omp_offload.failed:
3348 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84([10 x i32]* [[A]]) #[[ATTR3]]
3349 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT]]
3350 // CHECK9:       omp_offload.cont:
3351 // CHECK9-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
3352 // CHECK9-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to [10 x i32]**
3353 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP10]], align 8
3354 // CHECK9-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
3355 // CHECK9-NEXT:    [[TMP12:%.*]] = bitcast i8** [[TMP11]] to [10 x i32]**
3356 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP12]], align 8
3357 // CHECK9-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i64 0, i64 0
3358 // CHECK9-NEXT:    store i8* null, i8** [[TMP13]], align 8
3359 // CHECK9-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
3360 // CHECK9-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
3361 // CHECK9-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
3362 // CHECK9-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89.region_id, i32 1, i8** [[TMP14]], i8** [[TMP15]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.13, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.14, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
3363 // CHECK9-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
3364 // CHECK9-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED5:%.*]], label [[OMP_OFFLOAD_CONT6:%.*]]
3365 // CHECK9:       omp_offload.failed5:
3366 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89([10 x i32]* [[A]]) #[[ATTR3]]
3367 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT6]]
3368 // CHECK9:       omp_offload.cont6:
3369 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[M]], align 4
3370 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_CASTED]] to i32*
3371 // CHECK9-NEXT:    store i32 [[TMP18]], i32* [[CONV]], align 4
3372 // CHECK9-NEXT:    [[TMP19:%.*]] = load i64, i64* [[M_CASTED]], align 8
3373 // CHECK9-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
3374 // CHECK9-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i64*
3375 // CHECK9-NEXT:    store i64 [[TMP19]], i64* [[TMP21]], align 8
3376 // CHECK9-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
3377 // CHECK9-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to i64*
3378 // CHECK9-NEXT:    store i64 [[TMP19]], i64* [[TMP23]], align 8
3379 // CHECK9-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i64 0, i64 0
3380 // CHECK9-NEXT:    store i8* null, i8** [[TMP24]], align 8
3381 // CHECK9-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 1
3382 // CHECK9-NEXT:    [[TMP26:%.*]] = bitcast i8** [[TMP25]] to [10 x i32]**
3383 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP26]], align 8
3384 // CHECK9-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 1
3385 // CHECK9-NEXT:    [[TMP28:%.*]] = bitcast i8** [[TMP27]] to [10 x i32]**
3386 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP28]], align 8
3387 // CHECK9-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i64 0, i64 1
3388 // CHECK9-NEXT:    store i8* null, i8** [[TMP29]], align 8
3389 // CHECK9-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
3390 // CHECK9-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
3391 // CHECK9-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
3392 // CHECK9-NEXT:    [[TMP32:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94.region_id, i32 2, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.17, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.18, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
3393 // CHECK9-NEXT:    [[TMP33:%.*]] = icmp ne i32 [[TMP32]], 0
3394 // CHECK9-NEXT:    br i1 [[TMP33]], label [[OMP_OFFLOAD_FAILED11:%.*]], label [[OMP_OFFLOAD_CONT12:%.*]]
3395 // CHECK9:       omp_offload.failed11:
3396 // CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94(i64 [[TMP19]], [10 x i32]* [[A]]) #[[ATTR3]]
3397 // CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT12]]
3398 // CHECK9:       omp_offload.cont12:
3399 // CHECK9-NEXT:    ret i32 0
3400 //
3401 //
3402 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84
3403 // CHECK9-SAME: ([10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
3404 // CHECK9-NEXT:  entry:
3405 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
3406 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
3407 // CHECK9-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
3408 // CHECK9-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..8 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
3409 // CHECK9-NEXT:    ret void
3410 //
3411 //
3412 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..8
3413 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
3414 // CHECK9-NEXT:  entry:
3415 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3416 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3417 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
3418 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3419 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3420 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3421 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3422 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3423 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3424 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
3425 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3426 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3427 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
3428 // CHECK9-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
3429 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3430 // CHECK9-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
3431 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3432 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3433 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3434 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
3435 // CHECK9-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)
3436 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3437 // CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
3438 // CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3439 // CHECK9:       cond.true:
3440 // CHECK9-NEXT:    br label [[COND_END:%.*]]
3441 // CHECK9:       cond.false:
3442 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3443 // CHECK9-NEXT:    br label [[COND_END]]
3444 // CHECK9:       cond.end:
3445 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
3446 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3447 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3448 // CHECK9-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
3449 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3450 // CHECK9:       omp.inner.for.cond:
3451 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3452 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3453 // CHECK9-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
3454 // CHECK9-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3455 // CHECK9:       omp.inner.for.body:
3456 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3457 // CHECK9-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
3458 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3459 // CHECK9-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
3460 // CHECK9-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..9 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]])
3461 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3462 // CHECK9:       omp.inner.for.inc:
3463 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3464 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3465 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
3466 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
3467 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
3468 // CHECK9:       omp.inner.for.end:
3469 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3470 // CHECK9:       omp.loop.exit:
3471 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
3472 // CHECK9-NEXT:    ret void
3473 //
3474 //
3475 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..9
3476 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
3477 // CHECK9-NEXT:  entry:
3478 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3479 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3480 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
3481 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
3482 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
3483 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3484 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3485 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3486 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3487 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3488 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3489 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
3490 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3491 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3492 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
3493 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
3494 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
3495 // CHECK9-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
3496 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3497 // CHECK9-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
3498 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
3499 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
3500 // CHECK9-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
3501 // CHECK9-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
3502 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
3503 // CHECK9-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
3504 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3505 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3506 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3507 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
3508 // CHECK9-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)
3509 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3510 // CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
3511 // CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3512 // CHECK9:       cond.true:
3513 // CHECK9-NEXT:    br label [[COND_END:%.*]]
3514 // CHECK9:       cond.false:
3515 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3516 // CHECK9-NEXT:    br label [[COND_END]]
3517 // CHECK9:       cond.end:
3518 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
3519 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3520 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3521 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
3522 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3523 // CHECK9:       omp.inner.for.cond:
3524 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3525 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3526 // CHECK9-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
3527 // CHECK9-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3528 // CHECK9:       omp.inner.for.body:
3529 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3530 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
3531 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3532 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
3533 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
3534 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
3535 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
3536 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
3537 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3538 // CHECK9:       omp.body.continue:
3539 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3540 // CHECK9:       omp.inner.for.inc:
3541 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3542 // CHECK9-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
3543 // CHECK9-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
3544 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
3545 // CHECK9:       omp.inner.for.end:
3546 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3547 // CHECK9:       omp.loop.exit:
3548 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
3549 // CHECK9-NEXT:    ret void
3550 //
3551 //
3552 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89
3553 // CHECK9-SAME: ([10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
3554 // CHECK9-NEXT:  entry:
3555 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
3556 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
3557 // CHECK9-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
3558 // CHECK9-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..11 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
3559 // CHECK9-NEXT:    ret void
3560 //
3561 //
3562 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..11
3563 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
3564 // CHECK9-NEXT:  entry:
3565 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3566 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3567 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
3568 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3569 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3570 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3571 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3572 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3573 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3574 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
3575 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3576 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3577 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
3578 // CHECK9-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
3579 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3580 // CHECK9-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
3581 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3582 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3583 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3584 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
3585 // CHECK9-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)
3586 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3587 // CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
3588 // CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3589 // CHECK9:       cond.true:
3590 // CHECK9-NEXT:    br label [[COND_END:%.*]]
3591 // CHECK9:       cond.false:
3592 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3593 // CHECK9-NEXT:    br label [[COND_END]]
3594 // CHECK9:       cond.end:
3595 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
3596 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3597 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3598 // CHECK9-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
3599 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3600 // CHECK9:       omp.inner.for.cond:
3601 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3602 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3603 // CHECK9-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
3604 // CHECK9-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3605 // CHECK9:       omp.inner.for.body:
3606 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3607 // CHECK9-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
3608 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3609 // CHECK9-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
3610 // CHECK9-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..12 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]])
3611 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3612 // CHECK9:       omp.inner.for.inc:
3613 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3614 // CHECK9-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3615 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
3616 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
3617 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
3618 // CHECK9:       omp.inner.for.end:
3619 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3620 // CHECK9:       omp.loop.exit:
3621 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
3622 // CHECK9-NEXT:    ret void
3623 //
3624 //
3625 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..12
3626 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
3627 // CHECK9-NEXT:  entry:
3628 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3629 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3630 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
3631 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
3632 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
3633 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3634 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3635 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3636 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3637 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3638 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3639 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
3640 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3641 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3642 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
3643 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
3644 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
3645 // CHECK9-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
3646 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3647 // CHECK9-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
3648 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
3649 // CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
3650 // CHECK9-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
3651 // CHECK9-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
3652 // CHECK9-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
3653 // CHECK9-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
3654 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3655 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3656 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3657 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
3658 // CHECK9-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)
3659 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3660 // CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
3661 // CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3662 // CHECK9:       cond.true:
3663 // CHECK9-NEXT:    br label [[COND_END:%.*]]
3664 // CHECK9:       cond.false:
3665 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3666 // CHECK9-NEXT:    br label [[COND_END]]
3667 // CHECK9:       cond.end:
3668 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
3669 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3670 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3671 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
3672 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3673 // CHECK9:       omp.inner.for.cond:
3674 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3675 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3676 // CHECK9-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
3677 // CHECK9-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3678 // CHECK9:       omp.inner.for.body:
3679 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3680 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
3681 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3682 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
3683 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
3684 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
3685 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
3686 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
3687 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3688 // CHECK9:       omp.body.continue:
3689 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3690 // CHECK9:       omp.inner.for.inc:
3691 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3692 // CHECK9-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
3693 // CHECK9-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
3694 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
3695 // CHECK9:       omp.inner.for.end:
3696 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3697 // CHECK9:       omp.loop.exit:
3698 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
3699 // CHECK9-NEXT:    ret void
3700 //
3701 //
3702 // CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94
3703 // CHECK9-SAME: (i64 [[M:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
3704 // CHECK9-NEXT:  entry:
3705 // CHECK9-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
3706 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
3707 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3708 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
3709 // CHECK9-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
3710 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
3711 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
3712 // CHECK9-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
3713 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3714 // CHECK9-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
3715 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3716 // CHECK9-NEXT:    [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
3717 // CHECK9-NEXT:    store i32 [[TMP2]], i32* [[CONV1]], align 4
3718 // CHECK9-NEXT:    [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
3719 // CHECK9-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..15 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i64 [[TMP3]])
3720 // CHECK9-NEXT:    ret void
3721 //
3722 //
3723 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..15
3724 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
3725 // CHECK9-NEXT:  entry:
3726 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3727 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3728 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
3729 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
3730 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3731 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3732 // CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
3733 // CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
3734 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3735 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3736 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
3737 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
3738 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3739 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3740 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
3741 // CHECK9-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3742 // CHECK9-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
3743 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3744 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
3745 // CHECK9-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
3746 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3747 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3748 // CHECK9-NEXT:    [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
3749 // CHECK9-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3750 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
3751 // CHECK9-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP1]])
3752 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3753 // CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 9
3754 // CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3755 // CHECK9:       cond.true:
3756 // CHECK9-NEXT:    br label [[COND_END:%.*]]
3757 // CHECK9:       cond.false:
3758 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3759 // CHECK9-NEXT:    br label [[COND_END]]
3760 // CHECK9:       cond.end:
3761 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]
3762 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
3763 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3764 // CHECK9-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_IV]], align 4
3765 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3766 // CHECK9:       omp.inner.for.cond:
3767 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3768 // CHECK9-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[TMP7]], 10
3769 // CHECK9-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3770 // CHECK9:       omp.inner.for.body:
3771 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3772 // CHECK9-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
3773 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3774 // CHECK9-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
3775 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[CONV]], align 8
3776 // CHECK9-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
3777 // CHECK9-NEXT:    store i32 [[TMP12]], i32* [[CONV2]], align 4
3778 // CHECK9-NEXT:    [[TMP13:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
3779 // CHECK9-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..16 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]], i64 [[TMP13]])
3780 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3781 // CHECK9:       omp.inner.for.inc:
3782 // CHECK9-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3783 // CHECK9-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3784 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]
3785 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
3786 // CHECK9-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3787 // CHECK9-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3788 // CHECK9-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]
3789 // CHECK9-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_COMB_LB]], align 4
3790 // CHECK9-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3791 // CHECK9-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
3792 // CHECK9-NEXT:    [[ADD4:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
3793 // CHECK9-NEXT:    store i32 [[ADD4]], i32* [[DOTOMP_COMB_UB]], align 4
3794 // CHECK9-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3795 // CHECK9-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP20]], 9
3796 // CHECK9-NEXT:    br i1 [[CMP5]], label [[COND_TRUE6:%.*]], label [[COND_FALSE7:%.*]]
3797 // CHECK9:       cond.true6:
3798 // CHECK9-NEXT:    br label [[COND_END8:%.*]]
3799 // CHECK9:       cond.false7:
3800 // CHECK9-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
3801 // CHECK9-NEXT:    br label [[COND_END8]]
3802 // CHECK9:       cond.end8:
3803 // CHECK9-NEXT:    [[COND9:%.*]] = phi i32 [ 9, [[COND_TRUE6]] ], [ [[TMP21]], [[COND_FALSE7]] ]
3804 // CHECK9-NEXT:    store i32 [[COND9]], i32* [[DOTOMP_COMB_UB]], align 4
3805 // CHECK9-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
3806 // CHECK9-NEXT:    store i32 [[TMP22]], i32* [[DOTOMP_IV]], align 4
3807 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
3808 // CHECK9:       omp.inner.for.end:
3809 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3810 // CHECK9:       omp.loop.exit:
3811 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]])
3812 // CHECK9-NEXT:    ret void
3813 //
3814 //
3815 // CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..16
3816 // CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
3817 // CHECK9-NEXT:  entry:
3818 // CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3819 // CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3820 // CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
3821 // CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
3822 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
3823 // CHECK9-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
3824 // CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
3825 // CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3826 // CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
3827 // CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
3828 // CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3829 // CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3830 // CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4
3831 // CHECK9-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3832 // CHECK9-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3833 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
3834 // CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
3835 // CHECK9-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
3836 // CHECK9-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
3837 // CHECK9-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
3838 // CHECK9-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
3839 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
3840 // CHECK9-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
3841 // CHECK9-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
3842 // CHECK9-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP1]] to i32
3843 // CHECK9-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
3844 // CHECK9-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP2]] to i32
3845 // CHECK9-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_LB]], align 4
3846 // CHECK9-NEXT:    store i32 [[CONV2]], i32* [[DOTOMP_UB]], align 4
3847 // CHECK9-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3848 // CHECK9-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
3849 // CHECK9-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3850 // CHECK9-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
3851 // CHECK9-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)
3852 // CHECK9-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3853 // CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
3854 // CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3855 // CHECK9:       cond.true:
3856 // CHECK9-NEXT:    br label [[COND_END:%.*]]
3857 // CHECK9:       cond.false:
3858 // CHECK9-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3859 // CHECK9-NEXT:    br label [[COND_END]]
3860 // CHECK9:       cond.end:
3861 // CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
3862 // CHECK9-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3863 // CHECK9-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3864 // CHECK9-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
3865 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
3866 // CHECK9:       omp.inner.for.cond:
3867 // CHECK9-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3868 // CHECK9-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3869 // CHECK9-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
3870 // CHECK9-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3871 // CHECK9:       omp.inner.for.body:
3872 // CHECK9-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3873 // CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
3874 // CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3875 // CHECK9-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
3876 // CHECK9-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
3877 // CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
3878 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
3879 // CHECK9-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
3880 // CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
3881 // CHECK9:       omp.body.continue:
3882 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
3883 // CHECK9:       omp.inner.for.inc:
3884 // CHECK9-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3885 // CHECK9-NEXT:    [[ADD4:%.*]] = add nsw i32 [[TMP12]], 1
3886 // CHECK9-NEXT:    store i32 [[ADD4]], i32* [[DOTOMP_IV]], align 4
3887 // CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]
3888 // CHECK9:       omp.inner.for.end:
3889 // CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
3890 // CHECK9:       omp.loop.exit:
3891 // CHECK9-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
3892 // CHECK9-NEXT:    ret void
3893 //
3894 //
3895 // CHECK9-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
3896 // CHECK9-SAME: () #[[ATTR5:[0-9]+]] {
3897 // CHECK9-NEXT:  entry:
3898 // CHECK9-NEXT:    call void @__tgt_register_requires(i64 1)
3899 // CHECK9-NEXT:    ret void
3900 //
3901 //
3902 // CHECK10-LABEL: define {{[^@]+}}@main
3903 // CHECK10-SAME: (i32 signext [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
3904 // CHECK10-NEXT:  entry:
3905 // CHECK10-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
3906 // CHECK10-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
3907 // CHECK10-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 8
3908 // CHECK10-NEXT:    [[N:%.*]] = alloca i32, align 4
3909 // CHECK10-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 8
3910 // CHECK10-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i64, align 8
3911 // CHECK10-NEXT:    [[M:%.*]] = alloca i32, align 4
3912 // CHECK10-NEXT:    [[N_CASTED:%.*]] = alloca i64, align 8
3913 // CHECK10-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
3914 // CHECK10-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
3915 // CHECK10-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
3916 // CHECK10-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 8
3917 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
3918 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3919 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3920 // CHECK10-NEXT:    [[N_CASTED3:%.*]] = alloca i64, align 8
3921 // CHECK10-NEXT:    [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [3 x i8*], align 8
3922 // CHECK10-NEXT:    [[DOTOFFLOAD_PTRS6:%.*]] = alloca [3 x i8*], align 8
3923 // CHECK10-NEXT:    [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [3 x i8*], align 8
3924 // CHECK10-NEXT:    [[DOTOFFLOAD_SIZES8:%.*]] = alloca [3 x i64], align 8
3925 // CHECK10-NEXT:    [[_TMP9:%.*]] = alloca i32, align 4
3926 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
3927 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_11:%.*]] = alloca i32, align 4
3928 // CHECK10-NEXT:    [[M_CASTED:%.*]] = alloca i64, align 8
3929 // CHECK10-NEXT:    [[N_CASTED19:%.*]] = alloca i64, align 8
3930 // CHECK10-NEXT:    [[DOTOFFLOAD_BASEPTRS21:%.*]] = alloca [4 x i8*], align 8
3931 // CHECK10-NEXT:    [[DOTOFFLOAD_PTRS22:%.*]] = alloca [4 x i8*], align 8
3932 // CHECK10-NEXT:    [[DOTOFFLOAD_MAPPERS23:%.*]] = alloca [4 x i8*], align 8
3933 // CHECK10-NEXT:    [[DOTOFFLOAD_SIZES24:%.*]] = alloca [4 x i64], align 8
3934 // CHECK10-NEXT:    [[_TMP25:%.*]] = alloca i32, align 4
3935 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_26:%.*]] = alloca i32, align 4
3936 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_27:%.*]] = alloca i32, align 4
3937 // CHECK10-NEXT:    store i32 0, i32* [[RETVAL]], align 4
3938 // CHECK10-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
3939 // CHECK10-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
3940 // CHECK10-NEXT:    store i32 100, i32* [[N]], align 4
3941 // CHECK10-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
3942 // CHECK10-NEXT:    [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
3943 // CHECK10-NEXT:    [[TMP2:%.*]] = call i8* @llvm.stacksave()
3944 // CHECK10-NEXT:    store i8* [[TMP2]], i8** [[SAVED_STACK]], align 8
3945 // CHECK10-NEXT:    [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 4
3946 // CHECK10-NEXT:    store i64 [[TMP1]], i64* [[__VLA_EXPR0]], align 8
3947 // CHECK10-NEXT:    store i32 10, i32* [[M]], align 4
3948 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[N]], align 4
3949 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_CASTED]] to i32*
3950 // CHECK10-NEXT:    store i32 [[TMP3]], i32* [[CONV]], align 4
3951 // CHECK10-NEXT:    [[TMP4:%.*]] = load i64, i64* [[N_CASTED]], align 8
3952 // CHECK10-NEXT:    [[TMP5:%.*]] = mul nuw i64 [[TMP1]], 4
3953 // CHECK10-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3954 // CHECK10-NEXT:    [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i64*
3955 // CHECK10-NEXT:    store i64 [[TMP4]], i64* [[TMP7]], align 8
3956 // CHECK10-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3957 // CHECK10-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i64*
3958 // CHECK10-NEXT:    store i64 [[TMP4]], i64* [[TMP9]], align 8
3959 // CHECK10-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
3960 // CHECK10-NEXT:    store i64 4, i64* [[TMP10]], align 8
3961 // CHECK10-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
3962 // CHECK10-NEXT:    store i8* null, i8** [[TMP11]], align 8
3963 // CHECK10-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
3964 // CHECK10-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i64*
3965 // CHECK10-NEXT:    store i64 [[TMP1]], i64* [[TMP13]], align 8
3966 // CHECK10-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
3967 // CHECK10-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i64*
3968 // CHECK10-NEXT:    store i64 [[TMP1]], i64* [[TMP15]], align 8
3969 // CHECK10-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 1
3970 // CHECK10-NEXT:    store i64 8, i64* [[TMP16]], align 8
3971 // CHECK10-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
3972 // CHECK10-NEXT:    store i8* null, i8** [[TMP17]], align 8
3973 // CHECK10-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
3974 // CHECK10-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
3975 // CHECK10-NEXT:    store i32* [[VLA]], i32** [[TMP19]], align 8
3976 // CHECK10-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
3977 // CHECK10-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32**
3978 // CHECK10-NEXT:    store i32* [[VLA]], i32** [[TMP21]], align 8
3979 // CHECK10-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
3980 // CHECK10-NEXT:    store i64 [[TMP5]], i64* [[TMP22]], align 8
3981 // CHECK10-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
3982 // CHECK10-NEXT:    store i8* null, i8** [[TMP23]], align 8
3983 // CHECK10-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
3984 // CHECK10-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
3985 // CHECK10-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
3986 // CHECK10-NEXT:    [[TMP27:%.*]] = load i32, i32* [[N]], align 4
3987 // CHECK10-NEXT:    store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4
3988 // CHECK10-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3989 // CHECK10-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0
3990 // CHECK10-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3991 // CHECK10-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
3992 // CHECK10-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3993 // CHECK10-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3994 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP29]], 1
3995 // CHECK10-NEXT:    [[TMP30:%.*]] = zext i32 [[ADD]] to i64
3996 // CHECK10-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i64 [[TMP30]])
3997 // CHECK10-NEXT:    [[TMP31:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* [[TMP26]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
3998 // CHECK10-NEXT:    [[TMP32:%.*]] = icmp ne i32 [[TMP31]], 0
3999 // CHECK10-NEXT:    br i1 [[TMP32]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4000 // CHECK10:       omp_offload.failed:
4001 // CHECK10-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106(i64 [[TMP4]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3:[0-9]+]]
4002 // CHECK10-NEXT:    br label [[OMP_OFFLOAD_CONT]]
4003 // CHECK10:       omp_offload.cont:
4004 // CHECK10-NEXT:    [[TMP33:%.*]] = load i32, i32* [[N]], align 4
4005 // CHECK10-NEXT:    [[CONV4:%.*]] = bitcast i64* [[N_CASTED3]] to i32*
4006 // CHECK10-NEXT:    store i32 [[TMP33]], i32* [[CONV4]], align 4
4007 // CHECK10-NEXT:    [[TMP34:%.*]] = load i64, i64* [[N_CASTED3]], align 8
4008 // CHECK10-NEXT:    [[TMP35:%.*]] = mul nuw i64 [[TMP1]], 4
4009 // CHECK10-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
4010 // CHECK10-NEXT:    [[TMP37:%.*]] = bitcast i8** [[TMP36]] to i64*
4011 // CHECK10-NEXT:    store i64 [[TMP34]], i64* [[TMP37]], align 8
4012 // CHECK10-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
4013 // CHECK10-NEXT:    [[TMP39:%.*]] = bitcast i8** [[TMP38]] to i64*
4014 // CHECK10-NEXT:    store i64 [[TMP34]], i64* [[TMP39]], align 8
4015 // CHECK10-NEXT:    [[TMP40:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 0
4016 // CHECK10-NEXT:    store i64 4, i64* [[TMP40]], align 8
4017 // CHECK10-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 0
4018 // CHECK10-NEXT:    store i8* null, i8** [[TMP41]], align 8
4019 // CHECK10-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 1
4020 // CHECK10-NEXT:    [[TMP43:%.*]] = bitcast i8** [[TMP42]] to i64*
4021 // CHECK10-NEXT:    store i64 [[TMP1]], i64* [[TMP43]], align 8
4022 // CHECK10-NEXT:    [[TMP44:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 1
4023 // CHECK10-NEXT:    [[TMP45:%.*]] = bitcast i8** [[TMP44]] to i64*
4024 // CHECK10-NEXT:    store i64 [[TMP1]], i64* [[TMP45]], align 8
4025 // CHECK10-NEXT:    [[TMP46:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 1
4026 // CHECK10-NEXT:    store i64 8, i64* [[TMP46]], align 8
4027 // CHECK10-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 1
4028 // CHECK10-NEXT:    store i8* null, i8** [[TMP47]], align 8
4029 // CHECK10-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 2
4030 // CHECK10-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to i32**
4031 // CHECK10-NEXT:    store i32* [[VLA]], i32** [[TMP49]], align 8
4032 // CHECK10-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 2
4033 // CHECK10-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
4034 // CHECK10-NEXT:    store i32* [[VLA]], i32** [[TMP51]], align 8
4035 // CHECK10-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 2
4036 // CHECK10-NEXT:    store i64 [[TMP35]], i64* [[TMP52]], align 8
4037 // CHECK10-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 2
4038 // CHECK10-NEXT:    store i8* null, i8** [[TMP53]], align 8
4039 // CHECK10-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
4040 // CHECK10-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
4041 // CHECK10-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES8]], i32 0, i32 0
4042 // CHECK10-NEXT:    [[TMP57:%.*]] = load i32, i32* [[N]], align 4
4043 // CHECK10-NEXT:    store i32 [[TMP57]], i32* [[DOTCAPTURE_EXPR_10]], align 4
4044 // CHECK10-NEXT:    [[TMP58:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
4045 // CHECK10-NEXT:    [[SUB12:%.*]] = sub nsw i32 [[TMP58]], 0
4046 // CHECK10-NEXT:    [[DIV13:%.*]] = sdiv i32 [[SUB12]], 1
4047 // CHECK10-NEXT:    [[SUB14:%.*]] = sub nsw i32 [[DIV13]], 1
4048 // CHECK10-NEXT:    store i32 [[SUB14]], i32* [[DOTCAPTURE_EXPR_11]], align 4
4049 // CHECK10-NEXT:    [[TMP59:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_11]], align 4
4050 // CHECK10-NEXT:    [[ADD15:%.*]] = add nsw i32 [[TMP59]], 1
4051 // CHECK10-NEXT:    [[TMP60:%.*]] = zext i32 [[ADD15]] to i64
4052 // CHECK10-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 [[TMP60]])
4053 // CHECK10-NEXT:    [[TMP61:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111.region_id, i32 3, i8** [[TMP54]], i8** [[TMP55]], i64* [[TMP56]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
4054 // CHECK10-NEXT:    [[TMP62:%.*]] = icmp ne i32 [[TMP61]], 0
4055 // CHECK10-NEXT:    br i1 [[TMP62]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]
4056 // CHECK10:       omp_offload.failed16:
4057 // CHECK10-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111(i64 [[TMP34]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
4058 // CHECK10-NEXT:    br label [[OMP_OFFLOAD_CONT17]]
4059 // CHECK10:       omp_offload.cont17:
4060 // CHECK10-NEXT:    [[TMP63:%.*]] = load i32, i32* [[M]], align 4
4061 // CHECK10-NEXT:    [[CONV18:%.*]] = bitcast i64* [[M_CASTED]] to i32*
4062 // CHECK10-NEXT:    store i32 [[TMP63]], i32* [[CONV18]], align 4
4063 // CHECK10-NEXT:    [[TMP64:%.*]] = load i64, i64* [[M_CASTED]], align 8
4064 // CHECK10-NEXT:    [[TMP65:%.*]] = load i32, i32* [[N]], align 4
4065 // CHECK10-NEXT:    [[CONV20:%.*]] = bitcast i64* [[N_CASTED19]] to i32*
4066 // CHECK10-NEXT:    store i32 [[TMP65]], i32* [[CONV20]], align 4
4067 // CHECK10-NEXT:    [[TMP66:%.*]] = load i64, i64* [[N_CASTED19]], align 8
4068 // CHECK10-NEXT:    [[TMP67:%.*]] = mul nuw i64 [[TMP1]], 4
4069 // CHECK10-NEXT:    [[TMP68:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 0
4070 // CHECK10-NEXT:    [[TMP69:%.*]] = bitcast i8** [[TMP68]] to i64*
4071 // CHECK10-NEXT:    store i64 [[TMP64]], i64* [[TMP69]], align 8
4072 // CHECK10-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 0
4073 // CHECK10-NEXT:    [[TMP71:%.*]] = bitcast i8** [[TMP70]] to i64*
4074 // CHECK10-NEXT:    store i64 [[TMP64]], i64* [[TMP71]], align 8
4075 // CHECK10-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 0
4076 // CHECK10-NEXT:    store i64 4, i64* [[TMP72]], align 8
4077 // CHECK10-NEXT:    [[TMP73:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 0
4078 // CHECK10-NEXT:    store i8* null, i8** [[TMP73]], align 8
4079 // CHECK10-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 1
4080 // CHECK10-NEXT:    [[TMP75:%.*]] = bitcast i8** [[TMP74]] to i64*
4081 // CHECK10-NEXT:    store i64 [[TMP66]], i64* [[TMP75]], align 8
4082 // CHECK10-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 1
4083 // CHECK10-NEXT:    [[TMP77:%.*]] = bitcast i8** [[TMP76]] to i64*
4084 // CHECK10-NEXT:    store i64 [[TMP66]], i64* [[TMP77]], align 8
4085 // CHECK10-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 1
4086 // CHECK10-NEXT:    store i64 4, i64* [[TMP78]], align 8
4087 // CHECK10-NEXT:    [[TMP79:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 1
4088 // CHECK10-NEXT:    store i8* null, i8** [[TMP79]], align 8
4089 // CHECK10-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 2
4090 // CHECK10-NEXT:    [[TMP81:%.*]] = bitcast i8** [[TMP80]] to i64*
4091 // CHECK10-NEXT:    store i64 [[TMP1]], i64* [[TMP81]], align 8
4092 // CHECK10-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 2
4093 // CHECK10-NEXT:    [[TMP83:%.*]] = bitcast i8** [[TMP82]] to i64*
4094 // CHECK10-NEXT:    store i64 [[TMP1]], i64* [[TMP83]], align 8
4095 // CHECK10-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 2
4096 // CHECK10-NEXT:    store i64 8, i64* [[TMP84]], align 8
4097 // CHECK10-NEXT:    [[TMP85:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 2
4098 // CHECK10-NEXT:    store i8* null, i8** [[TMP85]], align 8
4099 // CHECK10-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 3
4100 // CHECK10-NEXT:    [[TMP87:%.*]] = bitcast i8** [[TMP86]] to i32**
4101 // CHECK10-NEXT:    store i32* [[VLA]], i32** [[TMP87]], align 8
4102 // CHECK10-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 3
4103 // CHECK10-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to i32**
4104 // CHECK10-NEXT:    store i32* [[VLA]], i32** [[TMP89]], align 8
4105 // CHECK10-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 3
4106 // CHECK10-NEXT:    store i64 [[TMP67]], i64* [[TMP90]], align 8
4107 // CHECK10-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS23]], i64 0, i64 3
4108 // CHECK10-NEXT:    store i8* null, i8** [[TMP91]], align 8
4109 // CHECK10-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS21]], i32 0, i32 0
4110 // CHECK10-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS22]], i32 0, i32 0
4111 // CHECK10-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES24]], i32 0, i32 0
4112 // CHECK10-NEXT:    [[TMP95:%.*]] = load i32, i32* [[N]], align 4
4113 // CHECK10-NEXT:    store i32 [[TMP95]], i32* [[DOTCAPTURE_EXPR_26]], align 4
4114 // CHECK10-NEXT:    [[TMP96:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_26]], align 4
4115 // CHECK10-NEXT:    [[SUB28:%.*]] = sub nsw i32 [[TMP96]], 0
4116 // CHECK10-NEXT:    [[DIV29:%.*]] = sdiv i32 [[SUB28]], 1
4117 // CHECK10-NEXT:    [[SUB30:%.*]] = sub nsw i32 [[DIV29]], 1
4118 // CHECK10-NEXT:    store i32 [[SUB30]], i32* [[DOTCAPTURE_EXPR_27]], align 4
4119 // CHECK10-NEXT:    [[TMP97:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_27]], align 4
4120 // CHECK10-NEXT:    [[ADD31:%.*]] = add nsw i32 [[TMP97]], 1
4121 // CHECK10-NEXT:    [[TMP98:%.*]] = zext i32 [[ADD31]] to i64
4122 // CHECK10-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 [[TMP98]])
4123 // CHECK10-NEXT:    [[TMP99:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116.region_id, i32 4, i8** [[TMP92]], i8** [[TMP93]], i64* [[TMP94]], i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.7, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
4124 // CHECK10-NEXT:    [[TMP100:%.*]] = icmp ne i32 [[TMP99]], 0
4125 // CHECK10-NEXT:    br i1 [[TMP100]], label [[OMP_OFFLOAD_FAILED32:%.*]], label [[OMP_OFFLOAD_CONT33:%.*]]
4126 // CHECK10:       omp_offload.failed32:
4127 // CHECK10-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116(i64 [[TMP64]], i64 [[TMP66]], i64 [[TMP1]], i32* [[VLA]]) #[[ATTR3]]
4128 // CHECK10-NEXT:    br label [[OMP_OFFLOAD_CONT33]]
4129 // CHECK10:       omp_offload.cont33:
4130 // CHECK10-NEXT:    [[TMP101:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
4131 // CHECK10-NEXT:    [[CALL:%.*]] = call signext i32 @_Z5tmainIiLi10EEiT_(i32 signext [[TMP101]])
4132 // CHECK10-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
4133 // CHECK10-NEXT:    [[TMP102:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8
4134 // CHECK10-NEXT:    call void @llvm.stackrestore(i8* [[TMP102]])
4135 // CHECK10-NEXT:    [[TMP103:%.*]] = load i32, i32* [[RETVAL]], align 4
4136 // CHECK10-NEXT:    ret i32 [[TMP103]]
4137 //
4138 //
4139 // CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106
4140 // CHECK10-SAME: (i64 [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {
4141 // CHECK10-NEXT:  entry:
4142 // CHECK10-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
4143 // CHECK10-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
4144 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
4145 // CHECK10-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
4146 // CHECK10-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
4147 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
4148 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
4149 // CHECK10-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
4150 // CHECK10-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
4151 // CHECK10-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]])
4152 // CHECK10-NEXT:    ret void
4153 //
4154 //
4155 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined.
4156 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
4157 // CHECK10-NEXT:  entry:
4158 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4159 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4160 // CHECK10-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
4161 // CHECK10-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
4162 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
4163 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4164 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4165 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4166 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4167 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
4168 // CHECK10-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
4169 // CHECK10-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
4170 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4171 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4172 // CHECK10-NEXT:    [[I3:%.*]] = alloca i32, align 4
4173 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4174 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4175 // CHECK10-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
4176 // CHECK10-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
4177 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
4178 // CHECK10-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
4179 // CHECK10-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
4180 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
4181 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
4182 // CHECK10-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
4183 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4184 // CHECK10-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
4185 // CHECK10-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4186 // CHECK10-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
4187 // CHECK10-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4188 // CHECK10-NEXT:    store i32 0, i32* [[I]], align 4
4189 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4190 // CHECK10-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
4191 // CHECK10-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4192 // CHECK10:       omp.precond.then:
4193 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
4194 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4195 // CHECK10-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
4196 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4197 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4198 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4199 // CHECK10-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
4200 // CHECK10-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)
4201 // CHECK10-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4202 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4203 // CHECK10-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
4204 // CHECK10-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4205 // CHECK10:       cond.true:
4206 // CHECK10-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4207 // CHECK10-NEXT:    br label [[COND_END:%.*]]
4208 // CHECK10:       cond.false:
4209 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4210 // CHECK10-NEXT:    br label [[COND_END]]
4211 // CHECK10:       cond.end:
4212 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
4213 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
4214 // CHECK10-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4215 // CHECK10-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
4216 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4217 // CHECK10:       omp.inner.for.cond:
4218 // CHECK10-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4219 // CHECK10-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4220 // CHECK10-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
4221 // CHECK10-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4222 // CHECK10:       omp.inner.for.body:
4223 // CHECK10-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4224 // CHECK10-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
4225 // CHECK10-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4226 // CHECK10-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
4227 // CHECK10-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]])
4228 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4229 // CHECK10:       omp.inner.for.inc:
4230 // CHECK10-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4231 // CHECK10-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
4232 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
4233 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
4234 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
4235 // CHECK10:       omp.inner.for.end:
4236 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4237 // CHECK10:       omp.loop.exit:
4238 // CHECK10-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4239 // CHECK10-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
4240 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
4241 // CHECK10-NEXT:    br label [[OMP_PRECOND_END]]
4242 // CHECK10:       omp.precond.end:
4243 // CHECK10-NEXT:    ret void
4244 //
4245 //
4246 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..1
4247 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
4248 // CHECK10-NEXT:  entry:
4249 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4250 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4251 // CHECK10-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
4252 // CHECK10-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
4253 // CHECK10-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
4254 // CHECK10-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
4255 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
4256 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4257 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4258 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4259 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4260 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
4261 // CHECK10-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4262 // CHECK10-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4263 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4264 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4265 // CHECK10-NEXT:    [[I4:%.*]] = alloca i32, align 4
4266 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4267 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4268 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
4269 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
4270 // CHECK10-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
4271 // CHECK10-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
4272 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
4273 // CHECK10-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
4274 // CHECK10-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
4275 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
4276 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
4277 // CHECK10-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
4278 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4279 // CHECK10-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
4280 // CHECK10-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4281 // CHECK10-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
4282 // CHECK10-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4283 // CHECK10-NEXT:    store i32 0, i32* [[I]], align 4
4284 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4285 // CHECK10-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
4286 // CHECK10-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4287 // CHECK10:       omp.precond.then:
4288 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
4289 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4290 // CHECK10-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
4291 // CHECK10-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
4292 // CHECK10-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
4293 // CHECK10-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
4294 // CHECK10-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
4295 // CHECK10-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
4296 // CHECK10-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
4297 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4298 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4299 // CHECK10-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4300 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
4301 // CHECK10-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)
4302 // CHECK10-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4303 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4304 // CHECK10-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
4305 // CHECK10-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4306 // CHECK10:       cond.true:
4307 // CHECK10-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4308 // CHECK10-NEXT:    br label [[COND_END:%.*]]
4309 // CHECK10:       cond.false:
4310 // CHECK10-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4311 // CHECK10-NEXT:    br label [[COND_END]]
4312 // CHECK10:       cond.end:
4313 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
4314 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
4315 // CHECK10-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4316 // CHECK10-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
4317 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4318 // CHECK10:       omp.inner.for.cond:
4319 // CHECK10-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4320 // CHECK10-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4321 // CHECK10-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
4322 // CHECK10-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4323 // CHECK10:       omp.inner.for.body:
4324 // CHECK10-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4325 // CHECK10-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
4326 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4327 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
4328 // CHECK10-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4
4329 // CHECK10-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
4330 // CHECK10-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
4331 // CHECK10-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
4332 // CHECK10-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4333 // CHECK10:       omp.body.continue:
4334 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4335 // CHECK10:       omp.inner.for.inc:
4336 // CHECK10-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4337 // CHECK10-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
4338 // CHECK10-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4
4339 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
4340 // CHECK10:       omp.inner.for.end:
4341 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4342 // CHECK10:       omp.loop.exit:
4343 // CHECK10-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4344 // CHECK10-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
4345 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
4346 // CHECK10-NEXT:    br label [[OMP_PRECOND_END]]
4347 // CHECK10:       omp.precond.end:
4348 // CHECK10-NEXT:    ret void
4349 //
4350 //
4351 // CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111
4352 // CHECK10-SAME: (i64 [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
4353 // CHECK10-NEXT:  entry:
4354 // CHECK10-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
4355 // CHECK10-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
4356 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
4357 // CHECK10-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
4358 // CHECK10-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
4359 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
4360 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[N_ADDR]] to i32*
4361 // CHECK10-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
4362 // CHECK10-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
4363 // CHECK10-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]])
4364 // CHECK10-NEXT:    ret void
4365 //
4366 //
4367 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..2
4368 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
4369 // CHECK10-NEXT:  entry:
4370 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4371 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4372 // CHECK10-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
4373 // CHECK10-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
4374 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
4375 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4376 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4377 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4378 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4379 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
4380 // CHECK10-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
4381 // CHECK10-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
4382 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4383 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4384 // CHECK10-NEXT:    [[I3:%.*]] = alloca i32, align 4
4385 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4386 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4387 // CHECK10-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
4388 // CHECK10-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
4389 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
4390 // CHECK10-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
4391 // CHECK10-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
4392 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
4393 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
4394 // CHECK10-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
4395 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4396 // CHECK10-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
4397 // CHECK10-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4398 // CHECK10-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
4399 // CHECK10-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4400 // CHECK10-NEXT:    store i32 0, i32* [[I]], align 4
4401 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4402 // CHECK10-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
4403 // CHECK10-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4404 // CHECK10:       omp.precond.then:
4405 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
4406 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4407 // CHECK10-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
4408 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4409 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4410 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4411 // CHECK10-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
4412 // CHECK10-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)
4413 // CHECK10-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4414 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4415 // CHECK10-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
4416 // CHECK10-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4417 // CHECK10:       cond.true:
4418 // CHECK10-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4419 // CHECK10-NEXT:    br label [[COND_END:%.*]]
4420 // CHECK10:       cond.false:
4421 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4422 // CHECK10-NEXT:    br label [[COND_END]]
4423 // CHECK10:       cond.end:
4424 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
4425 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
4426 // CHECK10-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4427 // CHECK10-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
4428 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4429 // CHECK10:       omp.inner.for.cond:
4430 // CHECK10-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4431 // CHECK10-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4432 // CHECK10-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
4433 // CHECK10-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4434 // CHECK10:       omp.inner.for.body:
4435 // CHECK10-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4436 // CHECK10-NEXT:    [[TMP17:%.*]] = zext i32 [[TMP16]] to i64
4437 // CHECK10-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4438 // CHECK10-NEXT:    [[TMP19:%.*]] = zext i32 [[TMP18]] to i64
4439 // CHECK10-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]])
4440 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4441 // CHECK10:       omp.inner.for.inc:
4442 // CHECK10-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4443 // CHECK10-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
4444 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]
4445 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
4446 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
4447 // CHECK10:       omp.inner.for.end:
4448 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4449 // CHECK10:       omp.loop.exit:
4450 // CHECK10-NEXT:    [[TMP22:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4451 // CHECK10-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 4
4452 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP23]])
4453 // CHECK10-NEXT:    br label [[OMP_PRECOND_END]]
4454 // CHECK10:       omp.precond.end:
4455 // CHECK10-NEXT:    ret void
4456 //
4457 //
4458 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..3
4459 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
4460 // CHECK10-NEXT:  entry:
4461 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4462 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4463 // CHECK10-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
4464 // CHECK10-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
4465 // CHECK10-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
4466 // CHECK10-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
4467 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
4468 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4469 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4470 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4471 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4472 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
4473 // CHECK10-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4474 // CHECK10-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4475 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4476 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4477 // CHECK10-NEXT:    [[I4:%.*]] = alloca i32, align 4
4478 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4479 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4480 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
4481 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
4482 // CHECK10-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
4483 // CHECK10-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
4484 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
4485 // CHECK10-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
4486 // CHECK10-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
4487 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
4488 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
4489 // CHECK10-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
4490 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4491 // CHECK10-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
4492 // CHECK10-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4493 // CHECK10-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
4494 // CHECK10-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4495 // CHECK10-NEXT:    store i32 0, i32* [[I]], align 4
4496 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4497 // CHECK10-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
4498 // CHECK10-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4499 // CHECK10:       omp.precond.then:
4500 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
4501 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4502 // CHECK10-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
4503 // CHECK10-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
4504 // CHECK10-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP7]] to i32
4505 // CHECK10-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
4506 // CHECK10-NEXT:    [[CONV3:%.*]] = trunc i64 [[TMP8]] to i32
4507 // CHECK10-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
4508 // CHECK10-NEXT:    store i32 [[CONV3]], i32* [[DOTOMP_UB]], align 4
4509 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4510 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4511 // CHECK10-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4512 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
4513 // CHECK10-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)
4514 // CHECK10-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4515 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4516 // CHECK10-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
4517 // CHECK10-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4518 // CHECK10:       cond.true:
4519 // CHECK10-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4520 // CHECK10-NEXT:    br label [[COND_END:%.*]]
4521 // CHECK10:       cond.false:
4522 // CHECK10-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4523 // CHECK10-NEXT:    br label [[COND_END]]
4524 // CHECK10:       cond.end:
4525 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
4526 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
4527 // CHECK10-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4528 // CHECK10-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
4529 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4530 // CHECK10:       omp.inner.for.cond:
4531 // CHECK10-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4532 // CHECK10-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4533 // CHECK10-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
4534 // CHECK10-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4535 // CHECK10:       omp.inner.for.body:
4536 // CHECK10-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4537 // CHECK10-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
4538 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4539 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
4540 // CHECK10-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4
4541 // CHECK10-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
4542 // CHECK10-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
4543 // CHECK10-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
4544 // CHECK10-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4545 // CHECK10:       omp.body.continue:
4546 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4547 // CHECK10:       omp.inner.for.inc:
4548 // CHECK10-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4549 // CHECK10-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
4550 // CHECK10-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4
4551 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
4552 // CHECK10:       omp.inner.for.end:
4553 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4554 // CHECK10:       omp.loop.exit:
4555 // CHECK10-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4556 // CHECK10-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
4557 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
4558 // CHECK10-NEXT:    br label [[OMP_PRECOND_END]]
4559 // CHECK10:       omp.precond.end:
4560 // CHECK10-NEXT:    ret void
4561 //
4562 //
4563 // CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116
4564 // CHECK10-SAME: (i64 [[M:%.*]], i64 [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
4565 // CHECK10-NEXT:  entry:
4566 // CHECK10-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
4567 // CHECK10-NEXT:    [[N_ADDR:%.*]] = alloca i64, align 8
4568 // CHECK10-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
4569 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
4570 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4571 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
4572 // CHECK10-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
4573 // CHECK10-NEXT:    store i64 [[N]], i64* [[N_ADDR]], align 8
4574 // CHECK10-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
4575 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
4576 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
4577 // CHECK10-NEXT:    [[CONV1:%.*]] = bitcast i64* [[N_ADDR]] to i32*
4578 // CHECK10-NEXT:    [[TMP0:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
4579 // CHECK10-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 8
4580 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32, i32* [[CONV]], align 8
4581 // CHECK10-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
4582 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4583 // CHECK10-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
4584 // CHECK10-NEXT:    store i32 [[TMP3]], i32* [[CONV2]], align 4
4585 // CHECK10-NEXT:    [[TMP4:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
4586 // CHECK10-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..5 to void (i32*, i32*, ...)*), i32* [[CONV1]], i64 [[TMP0]], i32* [[TMP1]], i64 [[TMP4]])
4587 // CHECK10-NEXT:    ret void
4588 //
4589 //
4590 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..5
4591 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
4592 // CHECK10-NEXT:  entry:
4593 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4594 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4595 // CHECK10-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
4596 // CHECK10-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
4597 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
4598 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
4599 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4600 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4601 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4602 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
4603 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
4604 // CHECK10-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
4605 // CHECK10-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
4606 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4607 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4608 // CHECK10-NEXT:    [[I4:%.*]] = alloca i32, align 4
4609 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
4610 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4611 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4612 // CHECK10-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
4613 // CHECK10-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
4614 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
4615 // CHECK10-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
4616 // CHECK10-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
4617 // CHECK10-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
4618 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
4619 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
4620 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
4621 // CHECK10-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4622 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4623 // CHECK10-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
4624 // CHECK10-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4625 // CHECK10-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
4626 // CHECK10-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
4627 // CHECK10-NEXT:    store i32 0, i32* [[I]], align 4
4628 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4629 // CHECK10-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
4630 // CHECK10-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4631 // CHECK10:       omp.precond.then:
4632 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
4633 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4634 // CHECK10-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
4635 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4636 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4637 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32, i32* [[CONV]], align 8
4638 // CHECK10-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4639 // CHECK10-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
4640 // CHECK10-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]])
4641 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4642 // CHECK10-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4643 // CHECK10-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
4644 // CHECK10-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4645 // CHECK10:       cond.true:
4646 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4647 // CHECK10-NEXT:    br label [[COND_END:%.*]]
4648 // CHECK10:       cond.false:
4649 // CHECK10-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4650 // CHECK10-NEXT:    br label [[COND_END]]
4651 // CHECK10:       cond.end:
4652 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
4653 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
4654 // CHECK10-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4655 // CHECK10-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
4656 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4657 // CHECK10:       omp.inner.for.cond:
4658 // CHECK10-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4659 // CHECK10-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4660 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
4661 // CHECK10-NEXT:    [[CMP6:%.*]] = icmp slt i32 [[TMP15]], [[ADD]]
4662 // CHECK10-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4663 // CHECK10:       omp.inner.for.body:
4664 // CHECK10-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4665 // CHECK10-NEXT:    [[TMP18:%.*]] = zext i32 [[TMP17]] to i64
4666 // CHECK10-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4667 // CHECK10-NEXT:    [[TMP20:%.*]] = zext i32 [[TMP19]] to i64
4668 // CHECK10-NEXT:    [[TMP21:%.*]] = load i32, i32* [[CONV]], align 8
4669 // CHECK10-NEXT:    [[CONV7:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
4670 // CHECK10-NEXT:    store i32 [[TMP21]], i32* [[CONV7]], align 4
4671 // CHECK10-NEXT:    [[TMP22:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
4672 // CHECK10-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..6 to void (i32*, i32*, ...)*), i64 [[TMP18]], i64 [[TMP20]], i32* [[TMP0]], i64 [[TMP1]], i32* [[TMP2]], i64 [[TMP22]])
4673 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4674 // CHECK10:       omp.inner.for.inc:
4675 // CHECK10-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4676 // CHECK10-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
4677 // CHECK10-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
4678 // CHECK10-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4
4679 // CHECK10-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4680 // CHECK10-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
4681 // CHECK10-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
4682 // CHECK10-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_COMB_LB]], align 4
4683 // CHECK10-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4684 // CHECK10-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
4685 // CHECK10-NEXT:    [[ADD10:%.*]] = add nsw i32 [[TMP27]], [[TMP28]]
4686 // CHECK10-NEXT:    store i32 [[ADD10]], i32* [[DOTOMP_COMB_UB]], align 4
4687 // CHECK10-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4688 // CHECK10-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4689 // CHECK10-NEXT:    [[CMP11:%.*]] = icmp sgt i32 [[TMP29]], [[TMP30]]
4690 // CHECK10-NEXT:    br i1 [[CMP11]], label [[COND_TRUE12:%.*]], label [[COND_FALSE13:%.*]]
4691 // CHECK10:       cond.true12:
4692 // CHECK10-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4693 // CHECK10-NEXT:    br label [[COND_END14:%.*]]
4694 // CHECK10:       cond.false13:
4695 // CHECK10-NEXT:    [[TMP32:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4696 // CHECK10-NEXT:    br label [[COND_END14]]
4697 // CHECK10:       cond.end14:
4698 // CHECK10-NEXT:    [[COND15:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE12]] ], [ [[TMP32]], [[COND_FALSE13]] ]
4699 // CHECK10-NEXT:    store i32 [[COND15]], i32* [[DOTOMP_COMB_UB]], align 4
4700 // CHECK10-NEXT:    [[TMP33:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4701 // CHECK10-NEXT:    store i32 [[TMP33]], i32* [[DOTOMP_IV]], align 4
4702 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
4703 // CHECK10:       omp.inner.for.end:
4704 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4705 // CHECK10:       omp.loop.exit:
4706 // CHECK10-NEXT:    [[TMP34:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4707 // CHECK10-NEXT:    [[TMP35:%.*]] = load i32, i32* [[TMP34]], align 4
4708 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP35]])
4709 // CHECK10-NEXT:    br label [[OMP_PRECOND_END]]
4710 // CHECK10:       omp.precond.end:
4711 // CHECK10-NEXT:    ret void
4712 //
4713 //
4714 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..6
4715 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i64 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
4716 // CHECK10-NEXT:  entry:
4717 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4718 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4719 // CHECK10-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
4720 // CHECK10-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
4721 // CHECK10-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 8
4722 // CHECK10-NEXT:    [[VLA_ADDR:%.*]] = alloca i64, align 8
4723 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 8
4724 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
4725 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4726 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4727 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4728 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
4729 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
4730 // CHECK10-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4731 // CHECK10-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4732 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4733 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4734 // CHECK10-NEXT:    [[I6:%.*]] = alloca i32, align 4
4735 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4736 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4737 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
4738 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
4739 // CHECK10-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 8
4740 // CHECK10-NEXT:    store i64 [[VLA]], i64* [[VLA_ADDR]], align 8
4741 // CHECK10-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 8
4742 // CHECK10-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
4743 // CHECK10-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 8
4744 // CHECK10-NEXT:    [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8
4745 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 8
4746 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
4747 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
4748 // CHECK10-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4749 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4750 // CHECK10-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
4751 // CHECK10-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4752 // CHECK10-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
4753 // CHECK10-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
4754 // CHECK10-NEXT:    store i32 0, i32* [[I]], align 4
4755 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4756 // CHECK10-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
4757 // CHECK10-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4758 // CHECK10:       omp.precond.then:
4759 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
4760 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4761 // CHECK10-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
4762 // CHECK10-NEXT:    [[TMP7:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
4763 // CHECK10-NEXT:    [[CONV4:%.*]] = trunc i64 [[TMP7]] to i32
4764 // CHECK10-NEXT:    [[TMP8:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
4765 // CHECK10-NEXT:    [[CONV5:%.*]] = trunc i64 [[TMP8]] to i32
4766 // CHECK10-NEXT:    store i32 [[CONV4]], i32* [[DOTOMP_LB]], align 4
4767 // CHECK10-NEXT:    store i32 [[CONV5]], i32* [[DOTOMP_UB]], align 4
4768 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4769 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4770 // CHECK10-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4771 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
4772 // CHECK10-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)
4773 // CHECK10-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4774 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4775 // CHECK10-NEXT:    [[CMP7:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
4776 // CHECK10-NEXT:    br i1 [[CMP7]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4777 // CHECK10:       cond.true:
4778 // CHECK10-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
4779 // CHECK10-NEXT:    br label [[COND_END:%.*]]
4780 // CHECK10:       cond.false:
4781 // CHECK10-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4782 // CHECK10-NEXT:    br label [[COND_END]]
4783 // CHECK10:       cond.end:
4784 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
4785 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
4786 // CHECK10-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4787 // CHECK10-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
4788 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4789 // CHECK10:       omp.inner.for.cond:
4790 // CHECK10-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4791 // CHECK10-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4792 // CHECK10-NEXT:    [[CMP8:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
4793 // CHECK10-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4794 // CHECK10:       omp.inner.for.body:
4795 // CHECK10-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4796 // CHECK10-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
4797 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4798 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[I6]], align 4
4799 // CHECK10-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I6]], align 4
4800 // CHECK10-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i64
4801 // CHECK10-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[IDXPROM]]
4802 // CHECK10-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
4803 // CHECK10-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
4804 // CHECK10:       omp.body.continue:
4805 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4806 // CHECK10:       omp.inner.for.inc:
4807 // CHECK10-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4808 // CHECK10-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP20]], 1
4809 // CHECK10-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
4810 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
4811 // CHECK10:       omp.inner.for.end:
4812 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4813 // CHECK10:       omp.loop.exit:
4814 // CHECK10-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4815 // CHECK10-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
4816 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
4817 // CHECK10-NEXT:    br label [[OMP_PRECOND_END]]
4818 // CHECK10:       omp.precond.end:
4819 // CHECK10-NEXT:    ret void
4820 //
4821 //
4822 // CHECK10-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
4823 // CHECK10-SAME: (i32 signext [[ARGC:%.*]]) #[[ATTR4:[0-9]+]] comdat {
4824 // CHECK10-NEXT:  entry:
4825 // CHECK10-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
4826 // CHECK10-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
4827 // CHECK10-NEXT:    [[M:%.*]] = alloca i32, align 4
4828 // CHECK10-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8
4829 // CHECK10-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8
4830 // CHECK10-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8
4831 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4832 // CHECK10-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 8
4833 // CHECK10-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 8
4834 // CHECK10-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 8
4835 // CHECK10-NEXT:    [[_TMP4:%.*]] = alloca i32, align 4
4836 // CHECK10-NEXT:    [[M_CASTED:%.*]] = alloca i64, align 8
4837 // CHECK10-NEXT:    [[DOTOFFLOAD_BASEPTRS7:%.*]] = alloca [2 x i8*], align 8
4838 // CHECK10-NEXT:    [[DOTOFFLOAD_PTRS8:%.*]] = alloca [2 x i8*], align 8
4839 // CHECK10-NEXT:    [[DOTOFFLOAD_MAPPERS9:%.*]] = alloca [2 x i8*], align 8
4840 // CHECK10-NEXT:    [[_TMP10:%.*]] = alloca i32, align 4
4841 // CHECK10-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
4842 // CHECK10-NEXT:    store i32 10, i32* [[M]], align 4
4843 // CHECK10-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4844 // CHECK10-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [10 x i32]**
4845 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP1]], align 8
4846 // CHECK10-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4847 // CHECK10-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [10 x i32]**
4848 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP3]], align 8
4849 // CHECK10-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
4850 // CHECK10-NEXT:    store i8* null, i8** [[TMP4]], align 8
4851 // CHECK10-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4852 // CHECK10-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4853 // CHECK10-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
4854 // CHECK10-NEXT:    [[TMP7:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84.region_id, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.10, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
4855 // CHECK10-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
4856 // CHECK10-NEXT:    br i1 [[TMP8]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4857 // CHECK10:       omp_offload.failed:
4858 // CHECK10-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84([10 x i32]* [[A]]) #[[ATTR3]]
4859 // CHECK10-NEXT:    br label [[OMP_OFFLOAD_CONT]]
4860 // CHECK10:       omp_offload.cont:
4861 // CHECK10-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
4862 // CHECK10-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to [10 x i32]**
4863 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP10]], align 8
4864 // CHECK10-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
4865 // CHECK10-NEXT:    [[TMP12:%.*]] = bitcast i8** [[TMP11]] to [10 x i32]**
4866 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP12]], align 8
4867 // CHECK10-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i64 0, i64 0
4868 // CHECK10-NEXT:    store i8* null, i8** [[TMP13]], align 8
4869 // CHECK10-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
4870 // CHECK10-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
4871 // CHECK10-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
4872 // CHECK10-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89.region_id, i32 1, i8** [[TMP14]], i8** [[TMP15]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.13, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.14, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
4873 // CHECK10-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
4874 // CHECK10-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED5:%.*]], label [[OMP_OFFLOAD_CONT6:%.*]]
4875 // CHECK10:       omp_offload.failed5:
4876 // CHECK10-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89([10 x i32]* [[A]]) #[[ATTR3]]
4877 // CHECK10-NEXT:    br label [[OMP_OFFLOAD_CONT6]]
4878 // CHECK10:       omp_offload.cont6:
4879 // CHECK10-NEXT:    [[TMP18:%.*]] = load i32, i32* [[M]], align 4
4880 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_CASTED]] to i32*
4881 // CHECK10-NEXT:    store i32 [[TMP18]], i32* [[CONV]], align 4
4882 // CHECK10-NEXT:    [[TMP19:%.*]] = load i64, i64* [[M_CASTED]], align 8
4883 // CHECK10-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
4884 // CHECK10-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i64*
4885 // CHECK10-NEXT:    store i64 [[TMP19]], i64* [[TMP21]], align 8
4886 // CHECK10-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
4887 // CHECK10-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to i64*
4888 // CHECK10-NEXT:    store i64 [[TMP19]], i64* [[TMP23]], align 8
4889 // CHECK10-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i64 0, i64 0
4890 // CHECK10-NEXT:    store i8* null, i8** [[TMP24]], align 8
4891 // CHECK10-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 1
4892 // CHECK10-NEXT:    [[TMP26:%.*]] = bitcast i8** [[TMP25]] to [10 x i32]**
4893 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP26]], align 8
4894 // CHECK10-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 1
4895 // CHECK10-NEXT:    [[TMP28:%.*]] = bitcast i8** [[TMP27]] to [10 x i32]**
4896 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP28]], align 8
4897 // CHECK10-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i64 0, i64 1
4898 // CHECK10-NEXT:    store i8* null, i8** [[TMP29]], align 8
4899 // CHECK10-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
4900 // CHECK10-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
4901 // CHECK10-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
4902 // CHECK10-NEXT:    [[TMP32:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94.region_id, i32 2, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.17, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.18, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
4903 // CHECK10-NEXT:    [[TMP33:%.*]] = icmp ne i32 [[TMP32]], 0
4904 // CHECK10-NEXT:    br i1 [[TMP33]], label [[OMP_OFFLOAD_FAILED11:%.*]], label [[OMP_OFFLOAD_CONT12:%.*]]
4905 // CHECK10:       omp_offload.failed11:
4906 // CHECK10-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94(i64 [[TMP19]], [10 x i32]* [[A]]) #[[ATTR3]]
4907 // CHECK10-NEXT:    br label [[OMP_OFFLOAD_CONT12]]
4908 // CHECK10:       omp_offload.cont12:
4909 // CHECK10-NEXT:    ret i32 0
4910 //
4911 //
4912 // CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84
4913 // CHECK10-SAME: ([10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
4914 // CHECK10-NEXT:  entry:
4915 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
4916 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
4917 // CHECK10-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
4918 // CHECK10-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..8 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
4919 // CHECK10-NEXT:    ret void
4920 //
4921 //
4922 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..8
4923 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
4924 // CHECK10-NEXT:  entry:
4925 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4926 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4927 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
4928 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4929 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4930 // CHECK10-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
4931 // CHECK10-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
4932 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4933 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4934 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
4935 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4936 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4937 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
4938 // CHECK10-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
4939 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
4940 // CHECK10-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
4941 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4942 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
4943 // CHECK10-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
4944 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
4945 // CHECK10-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)
4946 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4947 // CHECK10-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
4948 // CHECK10-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4949 // CHECK10:       cond.true:
4950 // CHECK10-NEXT:    br label [[COND_END:%.*]]
4951 // CHECK10:       cond.false:
4952 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4953 // CHECK10-NEXT:    br label [[COND_END]]
4954 // CHECK10:       cond.end:
4955 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
4956 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
4957 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4958 // CHECK10-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
4959 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
4960 // CHECK10:       omp.inner.for.cond:
4961 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4962 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4963 // CHECK10-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
4964 // CHECK10-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4965 // CHECK10:       omp.inner.for.body:
4966 // CHECK10-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
4967 // CHECK10-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
4968 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
4969 // CHECK10-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
4970 // CHECK10-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..9 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]])
4971 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
4972 // CHECK10:       omp.inner.for.inc:
4973 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4974 // CHECK10-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
4975 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
4976 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
4977 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
4978 // CHECK10:       omp.inner.for.end:
4979 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
4980 // CHECK10:       omp.loop.exit:
4981 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
4982 // CHECK10-NEXT:    ret void
4983 //
4984 //
4985 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..9
4986 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
4987 // CHECK10-NEXT:  entry:
4988 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4989 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4990 // CHECK10-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
4991 // CHECK10-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
4992 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
4993 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
4994 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
4995 // CHECK10-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
4996 // CHECK10-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
4997 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4998 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4999 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
5000 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5001 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5002 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5003 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5004 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
5005 // CHECK10-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
5006 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5007 // CHECK10-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
5008 // CHECK10-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5009 // CHECK10-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
5010 // CHECK10-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5011 // CHECK10-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
5012 // CHECK10-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
5013 // CHECK10-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
5014 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5015 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5016 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5017 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
5018 // CHECK10-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)
5019 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5020 // CHECK10-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
5021 // CHECK10-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5022 // CHECK10:       cond.true:
5023 // CHECK10-NEXT:    br label [[COND_END:%.*]]
5024 // CHECK10:       cond.false:
5025 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5026 // CHECK10-NEXT:    br label [[COND_END]]
5027 // CHECK10:       cond.end:
5028 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
5029 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5030 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5031 // CHECK10-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
5032 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5033 // CHECK10:       omp.inner.for.cond:
5034 // CHECK10-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5035 // CHECK10-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5036 // CHECK10-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
5037 // CHECK10-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5038 // CHECK10:       omp.inner.for.body:
5039 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5040 // CHECK10-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
5041 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5042 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
5043 // CHECK10-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
5044 // CHECK10-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
5045 // CHECK10-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
5046 // CHECK10-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
5047 // CHECK10-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5048 // CHECK10:       omp.body.continue:
5049 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5050 // CHECK10:       omp.inner.for.inc:
5051 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5052 // CHECK10-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
5053 // CHECK10-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
5054 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
5055 // CHECK10:       omp.inner.for.end:
5056 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5057 // CHECK10:       omp.loop.exit:
5058 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
5059 // CHECK10-NEXT:    ret void
5060 //
5061 //
5062 // CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89
5063 // CHECK10-SAME: ([10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
5064 // CHECK10-NEXT:  entry:
5065 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
5066 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
5067 // CHECK10-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
5068 // CHECK10-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..11 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
5069 // CHECK10-NEXT:    ret void
5070 //
5071 //
5072 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..11
5073 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
5074 // CHECK10-NEXT:  entry:
5075 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5076 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5077 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
5078 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5079 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5080 // CHECK10-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5081 // CHECK10-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5082 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5083 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5084 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
5085 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5086 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5087 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
5088 // CHECK10-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
5089 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5090 // CHECK10-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
5091 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5092 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5093 // CHECK10-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5094 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
5095 // CHECK10-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)
5096 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5097 // CHECK10-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
5098 // CHECK10-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5099 // CHECK10:       cond.true:
5100 // CHECK10-NEXT:    br label [[COND_END:%.*]]
5101 // CHECK10:       cond.false:
5102 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5103 // CHECK10-NEXT:    br label [[COND_END]]
5104 // CHECK10:       cond.end:
5105 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
5106 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5107 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5108 // CHECK10-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
5109 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5110 // CHECK10:       omp.inner.for.cond:
5111 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5112 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5113 // CHECK10-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
5114 // CHECK10-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5115 // CHECK10:       omp.inner.for.body:
5116 // CHECK10-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5117 // CHECK10-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
5118 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5119 // CHECK10-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
5120 // CHECK10-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..12 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]])
5121 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5122 // CHECK10:       omp.inner.for.inc:
5123 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5124 // CHECK10-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5125 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
5126 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
5127 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
5128 // CHECK10:       omp.inner.for.end:
5129 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5130 // CHECK10:       omp.loop.exit:
5131 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
5132 // CHECK10-NEXT:    ret void
5133 //
5134 //
5135 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..12
5136 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
5137 // CHECK10-NEXT:  entry:
5138 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5139 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5140 // CHECK10-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
5141 // CHECK10-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
5142 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
5143 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5144 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5145 // CHECK10-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5146 // CHECK10-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5147 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5148 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5149 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
5150 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5151 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5152 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5153 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5154 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
5155 // CHECK10-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
5156 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5157 // CHECK10-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
5158 // CHECK10-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5159 // CHECK10-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP1]] to i32
5160 // CHECK10-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5161 // CHECK10-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP2]] to i32
5162 // CHECK10-NEXT:    store i32 [[CONV]], i32* [[DOTOMP_LB]], align 4
5163 // CHECK10-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_UB]], align 4
5164 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5165 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5166 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5167 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
5168 // CHECK10-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)
5169 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5170 // CHECK10-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
5171 // CHECK10-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5172 // CHECK10:       cond.true:
5173 // CHECK10-NEXT:    br label [[COND_END:%.*]]
5174 // CHECK10:       cond.false:
5175 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5176 // CHECK10-NEXT:    br label [[COND_END]]
5177 // CHECK10:       cond.end:
5178 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
5179 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5180 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5181 // CHECK10-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
5182 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5183 // CHECK10:       omp.inner.for.cond:
5184 // CHECK10-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5185 // CHECK10-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5186 // CHECK10-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
5187 // CHECK10-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5188 // CHECK10:       omp.inner.for.body:
5189 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5190 // CHECK10-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
5191 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5192 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
5193 // CHECK10-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
5194 // CHECK10-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
5195 // CHECK10-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
5196 // CHECK10-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
5197 // CHECK10-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5198 // CHECK10:       omp.body.continue:
5199 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5200 // CHECK10:       omp.inner.for.inc:
5201 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5202 // CHECK10-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP12]], 1
5203 // CHECK10-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_IV]], align 4
5204 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
5205 // CHECK10:       omp.inner.for.end:
5206 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5207 // CHECK10:       omp.loop.exit:
5208 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
5209 // CHECK10-NEXT:    ret void
5210 //
5211 //
5212 // CHECK10-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94
5213 // CHECK10-SAME: (i64 [[M:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
5214 // CHECK10-NEXT:  entry:
5215 // CHECK10-NEXT:    [[M_ADDR:%.*]] = alloca i64, align 8
5216 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
5217 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5218 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
5219 // CHECK10-NEXT:    store i64 [[M]], i64* [[M_ADDR]], align 8
5220 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
5221 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[M_ADDR]] to i32*
5222 // CHECK10-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
5223 // CHECK10-NEXT:    [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
5224 // CHECK10-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
5225 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5226 // CHECK10-NEXT:    [[CONV1:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
5227 // CHECK10-NEXT:    store i32 [[TMP2]], i32* [[CONV1]], align 4
5228 // CHECK10-NEXT:    [[TMP3:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
5229 // CHECK10-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..15 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i64 [[TMP3]])
5230 // CHECK10-NEXT:    ret void
5231 //
5232 //
5233 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..15
5234 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
5235 // CHECK10-NEXT:  entry:
5236 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5237 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5238 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
5239 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
5240 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5241 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5242 // CHECK10-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5243 // CHECK10-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5244 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5245 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5246 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
5247 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8
5248 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5249 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5250 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
5251 // CHECK10-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
5252 // CHECK10-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
5253 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
5254 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5255 // CHECK10-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
5256 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5257 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5258 // CHECK10-NEXT:    [[TMP1:%.*]] = load i32, i32* [[CONV]], align 8
5259 // CHECK10-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5260 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
5261 // CHECK10-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP1]])
5262 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5263 // CHECK10-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 9
5264 // CHECK10-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5265 // CHECK10:       cond.true:
5266 // CHECK10-NEXT:    br label [[COND_END:%.*]]
5267 // CHECK10:       cond.false:
5268 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5269 // CHECK10-NEXT:    br label [[COND_END]]
5270 // CHECK10:       cond.end:
5271 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]
5272 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5273 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5274 // CHECK10-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_IV]], align 4
5275 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5276 // CHECK10:       omp.inner.for.cond:
5277 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5278 // CHECK10-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[TMP7]], 10
5279 // CHECK10-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5280 // CHECK10:       omp.inner.for.body:
5281 // CHECK10-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5282 // CHECK10-NEXT:    [[TMP9:%.*]] = zext i32 [[TMP8]] to i64
5283 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5284 // CHECK10-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i64
5285 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[CONV]], align 8
5286 // CHECK10-NEXT:    [[CONV2:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__CASTED]] to i32*
5287 // CHECK10-NEXT:    store i32 [[TMP12]], i32* [[CONV2]], align 4
5288 // CHECK10-NEXT:    [[TMP13:%.*]] = load i64, i64* [[DOTCAPTURE_EXPR__CASTED]], align 8
5289 // CHECK10-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..16 to void (i32*, i32*, ...)*), i64 [[TMP9]], i64 [[TMP11]], [10 x i32]* [[TMP0]], i64 [[TMP13]])
5290 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5291 // CHECK10:       omp.inner.for.inc:
5292 // CHECK10-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5293 // CHECK10-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5294 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]
5295 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
5296 // CHECK10-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5297 // CHECK10-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5298 // CHECK10-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]
5299 // CHECK10-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_COMB_LB]], align 4
5300 // CHECK10-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5301 // CHECK10-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5302 // CHECK10-NEXT:    [[ADD4:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
5303 // CHECK10-NEXT:    store i32 [[ADD4]], i32* [[DOTOMP_COMB_UB]], align 4
5304 // CHECK10-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5305 // CHECK10-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP20]], 9
5306 // CHECK10-NEXT:    br i1 [[CMP5]], label [[COND_TRUE6:%.*]], label [[COND_FALSE7:%.*]]
5307 // CHECK10:       cond.true6:
5308 // CHECK10-NEXT:    br label [[COND_END8:%.*]]
5309 // CHECK10:       cond.false7:
5310 // CHECK10-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5311 // CHECK10-NEXT:    br label [[COND_END8]]
5312 // CHECK10:       cond.end8:
5313 // CHECK10-NEXT:    [[COND9:%.*]] = phi i32 [ 9, [[COND_TRUE6]] ], [ [[TMP21]], [[COND_FALSE7]] ]
5314 // CHECK10-NEXT:    store i32 [[COND9]], i32* [[DOTOMP_COMB_UB]], align 4
5315 // CHECK10-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5316 // CHECK10-NEXT:    store i32 [[TMP22]], i32* [[DOTOMP_IV]], align 4
5317 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
5318 // CHECK10:       omp.inner.for.end:
5319 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5320 // CHECK10:       omp.loop.exit:
5321 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]])
5322 // CHECK10-NEXT:    ret void
5323 //
5324 //
5325 // CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..16
5326 // CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i64 [[DOTPREVIOUS_LB_:%.*]], i64 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]], i64 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
5327 // CHECK10-NEXT:  entry:
5328 // CHECK10-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
5329 // CHECK10-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
5330 // CHECK10-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8
5331 // CHECK10-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8
5332 // CHECK10-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 8
5333 // CHECK10-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8
5334 // CHECK10-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5335 // CHECK10-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5336 // CHECK10-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5337 // CHECK10-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5338 // CHECK10-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5339 // CHECK10-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5340 // CHECK10-NEXT:    [[I:%.*]] = alloca i32, align 4
5341 // CHECK10-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
5342 // CHECK10-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
5343 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_LB_]], i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5344 // CHECK10-NEXT:    store i64 [[DOTPREVIOUS_UB_]], i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5345 // CHECK10-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 8
5346 // CHECK10-NEXT:    store i64 [[DOTCAPTURE_EXPR_]], i64* [[DOTCAPTURE_EXPR__ADDR]], align 8
5347 // CHECK10-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 8
5348 // CHECK10-NEXT:    [[CONV:%.*]] = bitcast i64* [[DOTCAPTURE_EXPR__ADDR]] to i32*
5349 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5350 // CHECK10-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
5351 // CHECK10-NEXT:    [[TMP1:%.*]] = load i64, i64* [[DOTPREVIOUS_LB__ADDR]], align 8
5352 // CHECK10-NEXT:    [[CONV1:%.*]] = trunc i64 [[TMP1]] to i32
5353 // CHECK10-NEXT:    [[TMP2:%.*]] = load i64, i64* [[DOTPREVIOUS_UB__ADDR]], align 8
5354 // CHECK10-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP2]] to i32
5355 // CHECK10-NEXT:    store i32 [[CONV1]], i32* [[DOTOMP_LB]], align 4
5356 // CHECK10-NEXT:    store i32 [[CONV2]], i32* [[DOTOMP_UB]], align 4
5357 // CHECK10-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5358 // CHECK10-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5359 // CHECK10-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
5360 // CHECK10-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
5361 // CHECK10-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)
5362 // CHECK10-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5363 // CHECK10-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
5364 // CHECK10-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5365 // CHECK10:       cond.true:
5366 // CHECK10-NEXT:    br label [[COND_END:%.*]]
5367 // CHECK10:       cond.false:
5368 // CHECK10-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5369 // CHECK10-NEXT:    br label [[COND_END]]
5370 // CHECK10:       cond.end:
5371 // CHECK10-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
5372 // CHECK10-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5373 // CHECK10-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5374 // CHECK10-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
5375 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5376 // CHECK10:       omp.inner.for.cond:
5377 // CHECK10-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5378 // CHECK10-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5379 // CHECK10-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
5380 // CHECK10-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5381 // CHECK10:       omp.inner.for.body:
5382 // CHECK10-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5383 // CHECK10-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
5384 // CHECK10-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5385 // CHECK10-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
5386 // CHECK10-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
5387 // CHECK10-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64
5388 // CHECK10-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i64 0, i64 [[IDXPROM]]
5389 // CHECK10-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
5390 // CHECK10-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5391 // CHECK10:       omp.body.continue:
5392 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5393 // CHECK10:       omp.inner.for.inc:
5394 // CHECK10-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5395 // CHECK10-NEXT:    [[ADD4:%.*]] = add nsw i32 [[TMP12]], 1
5396 // CHECK10-NEXT:    store i32 [[ADD4]], i32* [[DOTOMP_IV]], align 4
5397 // CHECK10-NEXT:    br label [[OMP_INNER_FOR_COND]]
5398 // CHECK10:       omp.inner.for.end:
5399 // CHECK10-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5400 // CHECK10:       omp.loop.exit:
5401 // CHECK10-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
5402 // CHECK10-NEXT:    ret void
5403 //
5404 //
5405 // CHECK10-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
5406 // CHECK10-SAME: () #[[ATTR5:[0-9]+]] {
5407 // CHECK10-NEXT:  entry:
5408 // CHECK10-NEXT:    call void @__tgt_register_requires(i64 1)
5409 // CHECK10-NEXT:    ret void
5410 //
5411 //
5412 // CHECK11-LABEL: define {{[^@]+}}@main
5413 // CHECK11-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
5414 // CHECK11-NEXT:  entry:
5415 // CHECK11-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
5416 // CHECK11-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
5417 // CHECK11-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 4
5418 // CHECK11-NEXT:    [[N:%.*]] = alloca i32, align 4
5419 // CHECK11-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 4
5420 // CHECK11-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i32, align 4
5421 // CHECK11-NEXT:    [[M:%.*]] = alloca i32, align 4
5422 // CHECK11-NEXT:    [[N_CASTED:%.*]] = alloca i32, align 4
5423 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
5424 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
5425 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
5426 // CHECK11-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 4
5427 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5428 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5429 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5430 // CHECK11-NEXT:    [[N_CASTED3:%.*]] = alloca i32, align 4
5431 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [3 x i8*], align 4
5432 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS5:%.*]] = alloca [3 x i8*], align 4
5433 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [3 x i8*], align 4
5434 // CHECK11-NEXT:    [[DOTOFFLOAD_SIZES7:%.*]] = alloca [3 x i64], align 4
5435 // CHECK11-NEXT:    [[_TMP8:%.*]] = alloca i32, align 4
5436 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4
5437 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
5438 // CHECK11-NEXT:    [[M_CASTED:%.*]] = alloca i32, align 4
5439 // CHECK11-NEXT:    [[N_CASTED17:%.*]] = alloca i32, align 4
5440 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS18:%.*]] = alloca [4 x i8*], align 4
5441 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS19:%.*]] = alloca [4 x i8*], align 4
5442 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS20:%.*]] = alloca [4 x i8*], align 4
5443 // CHECK11-NEXT:    [[DOTOFFLOAD_SIZES21:%.*]] = alloca [4 x i64], align 4
5444 // CHECK11-NEXT:    [[_TMP22:%.*]] = alloca i32, align 4
5445 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_23:%.*]] = alloca i32, align 4
5446 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_24:%.*]] = alloca i32, align 4
5447 // CHECK11-NEXT:    store i32 0, i32* [[RETVAL]], align 4
5448 // CHECK11-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
5449 // CHECK11-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 4
5450 // CHECK11-NEXT:    store i32 100, i32* [[N]], align 4
5451 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
5452 // CHECK11-NEXT:    [[TMP1:%.*]] = call i8* @llvm.stacksave()
5453 // CHECK11-NEXT:    store i8* [[TMP1]], i8** [[SAVED_STACK]], align 4
5454 // CHECK11-NEXT:    [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 4
5455 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[__VLA_EXPR0]], align 4
5456 // CHECK11-NEXT:    store i32 10, i32* [[M]], align 4
5457 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32, i32* [[N]], align 4
5458 // CHECK11-NEXT:    store i32 [[TMP2]], i32* [[N_CASTED]], align 4
5459 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[N_CASTED]], align 4
5460 // CHECK11-NEXT:    [[TMP4:%.*]] = mul nuw i32 [[TMP0]], 4
5461 // CHECK11-NEXT:    [[TMP5:%.*]] = sext i32 [[TMP4]] to i64
5462 // CHECK11-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5463 // CHECK11-NEXT:    [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i32*
5464 // CHECK11-NEXT:    store i32 [[TMP3]], i32* [[TMP7]], align 4
5465 // CHECK11-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5466 // CHECK11-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i32*
5467 // CHECK11-NEXT:    store i32 [[TMP3]], i32* [[TMP9]], align 4
5468 // CHECK11-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
5469 // CHECK11-NEXT:    store i64 4, i64* [[TMP10]], align 4
5470 // CHECK11-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
5471 // CHECK11-NEXT:    store i8* null, i8** [[TMP11]], align 4
5472 // CHECK11-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
5473 // CHECK11-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i32*
5474 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[TMP13]], align 4
5475 // CHECK11-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
5476 // CHECK11-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i32*
5477 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[TMP15]], align 4
5478 // CHECK11-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 1
5479 // CHECK11-NEXT:    store i64 4, i64* [[TMP16]], align 4
5480 // CHECK11-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
5481 // CHECK11-NEXT:    store i8* null, i8** [[TMP17]], align 4
5482 // CHECK11-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
5483 // CHECK11-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
5484 // CHECK11-NEXT:    store i32* [[VLA]], i32** [[TMP19]], align 4
5485 // CHECK11-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
5486 // CHECK11-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32**
5487 // CHECK11-NEXT:    store i32* [[VLA]], i32** [[TMP21]], align 4
5488 // CHECK11-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
5489 // CHECK11-NEXT:    store i64 [[TMP5]], i64* [[TMP22]], align 4
5490 // CHECK11-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
5491 // CHECK11-NEXT:    store i8* null, i8** [[TMP23]], align 4
5492 // CHECK11-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5493 // CHECK11-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5494 // CHECK11-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
5495 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[N]], align 4
5496 // CHECK11-NEXT:    store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4
5497 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5498 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0
5499 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5500 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5501 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5502 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5503 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP29]], 1
5504 // CHECK11-NEXT:    [[TMP30:%.*]] = zext i32 [[ADD]] to i64
5505 // CHECK11-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i64 [[TMP30]])
5506 // CHECK11-NEXT:    [[TMP31:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* [[TMP26]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
5507 // CHECK11-NEXT:    [[TMP32:%.*]] = icmp ne i32 [[TMP31]], 0
5508 // CHECK11-NEXT:    br i1 [[TMP32]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
5509 // CHECK11:       omp_offload.failed:
5510 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106(i32 [[TMP3]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3:[0-9]+]]
5511 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT]]
5512 // CHECK11:       omp_offload.cont:
5513 // CHECK11-NEXT:    [[TMP33:%.*]] = load i32, i32* [[N]], align 4
5514 // CHECK11-NEXT:    store i32 [[TMP33]], i32* [[N_CASTED3]], align 4
5515 // CHECK11-NEXT:    [[TMP34:%.*]] = load i32, i32* [[N_CASTED3]], align 4
5516 // CHECK11-NEXT:    [[TMP35:%.*]] = mul nuw i32 [[TMP0]], 4
5517 // CHECK11-NEXT:    [[TMP36:%.*]] = sext i32 [[TMP35]] to i64
5518 // CHECK11-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
5519 // CHECK11-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to i32*
5520 // CHECK11-NEXT:    store i32 [[TMP34]], i32* [[TMP38]], align 4
5521 // CHECK11-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
5522 // CHECK11-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32*
5523 // CHECK11-NEXT:    store i32 [[TMP34]], i32* [[TMP40]], align 4
5524 // CHECK11-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 0
5525 // CHECK11-NEXT:    store i64 4, i64* [[TMP41]], align 4
5526 // CHECK11-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 0
5527 // CHECK11-NEXT:    store i8* null, i8** [[TMP42]], align 4
5528 // CHECK11-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 1
5529 // CHECK11-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to i32*
5530 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[TMP44]], align 4
5531 // CHECK11-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 1
5532 // CHECK11-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32*
5533 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[TMP46]], align 4
5534 // CHECK11-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 1
5535 // CHECK11-NEXT:    store i64 4, i64* [[TMP47]], align 4
5536 // CHECK11-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 1
5537 // CHECK11-NEXT:    store i8* null, i8** [[TMP48]], align 4
5538 // CHECK11-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 2
5539 // CHECK11-NEXT:    [[TMP50:%.*]] = bitcast i8** [[TMP49]] to i32**
5540 // CHECK11-NEXT:    store i32* [[VLA]], i32** [[TMP50]], align 4
5541 // CHECK11-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 2
5542 // CHECK11-NEXT:    [[TMP52:%.*]] = bitcast i8** [[TMP51]] to i32**
5543 // CHECK11-NEXT:    store i32* [[VLA]], i32** [[TMP52]], align 4
5544 // CHECK11-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 2
5545 // CHECK11-NEXT:    store i64 [[TMP36]], i64* [[TMP53]], align 4
5546 // CHECK11-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 2
5547 // CHECK11-NEXT:    store i8* null, i8** [[TMP54]], align 4
5548 // CHECK11-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
5549 // CHECK11-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
5550 // CHECK11-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 0
5551 // CHECK11-NEXT:    [[TMP58:%.*]] = load i32, i32* [[N]], align 4
5552 // CHECK11-NEXT:    store i32 [[TMP58]], i32* [[DOTCAPTURE_EXPR_9]], align 4
5553 // CHECK11-NEXT:    [[TMP59:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_9]], align 4
5554 // CHECK11-NEXT:    [[SUB11:%.*]] = sub nsw i32 [[TMP59]], 0
5555 // CHECK11-NEXT:    [[DIV12:%.*]] = sdiv i32 [[SUB11]], 1
5556 // CHECK11-NEXT:    [[SUB13:%.*]] = sub nsw i32 [[DIV12]], 1
5557 // CHECK11-NEXT:    store i32 [[SUB13]], i32* [[DOTCAPTURE_EXPR_10]], align 4
5558 // CHECK11-NEXT:    [[TMP60:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
5559 // CHECK11-NEXT:    [[ADD14:%.*]] = add nsw i32 [[TMP60]], 1
5560 // CHECK11-NEXT:    [[TMP61:%.*]] = zext i32 [[ADD14]] to i64
5561 // CHECK11-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 [[TMP61]])
5562 // CHECK11-NEXT:    [[TMP62:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111.region_id, i32 3, i8** [[TMP55]], i8** [[TMP56]], i64* [[TMP57]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
5563 // CHECK11-NEXT:    [[TMP63:%.*]] = icmp ne i32 [[TMP62]], 0
5564 // CHECK11-NEXT:    br i1 [[TMP63]], label [[OMP_OFFLOAD_FAILED15:%.*]], label [[OMP_OFFLOAD_CONT16:%.*]]
5565 // CHECK11:       omp_offload.failed15:
5566 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111(i32 [[TMP34]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
5567 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT16]]
5568 // CHECK11:       omp_offload.cont16:
5569 // CHECK11-NEXT:    [[TMP64:%.*]] = load i32, i32* [[M]], align 4
5570 // CHECK11-NEXT:    store i32 [[TMP64]], i32* [[M_CASTED]], align 4
5571 // CHECK11-NEXT:    [[TMP65:%.*]] = load i32, i32* [[M_CASTED]], align 4
5572 // CHECK11-NEXT:    [[TMP66:%.*]] = load i32, i32* [[N]], align 4
5573 // CHECK11-NEXT:    store i32 [[TMP66]], i32* [[N_CASTED17]], align 4
5574 // CHECK11-NEXT:    [[TMP67:%.*]] = load i32, i32* [[N_CASTED17]], align 4
5575 // CHECK11-NEXT:    [[TMP68:%.*]] = mul nuw i32 [[TMP0]], 4
5576 // CHECK11-NEXT:    [[TMP69:%.*]] = sext i32 [[TMP68]] to i64
5577 // CHECK11-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0
5578 // CHECK11-NEXT:    [[TMP71:%.*]] = bitcast i8** [[TMP70]] to i32*
5579 // CHECK11-NEXT:    store i32 [[TMP65]], i32* [[TMP71]], align 4
5580 // CHECK11-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 0
5581 // CHECK11-NEXT:    [[TMP73:%.*]] = bitcast i8** [[TMP72]] to i32*
5582 // CHECK11-NEXT:    store i32 [[TMP65]], i32* [[TMP73]], align 4
5583 // CHECK11-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 0
5584 // CHECK11-NEXT:    store i64 4, i64* [[TMP74]], align 4
5585 // CHECK11-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 0
5586 // CHECK11-NEXT:    store i8* null, i8** [[TMP75]], align 4
5587 // CHECK11-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 1
5588 // CHECK11-NEXT:    [[TMP77:%.*]] = bitcast i8** [[TMP76]] to i32*
5589 // CHECK11-NEXT:    store i32 [[TMP67]], i32* [[TMP77]], align 4
5590 // CHECK11-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 1
5591 // CHECK11-NEXT:    [[TMP79:%.*]] = bitcast i8** [[TMP78]] to i32*
5592 // CHECK11-NEXT:    store i32 [[TMP67]], i32* [[TMP79]], align 4
5593 // CHECK11-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 1
5594 // CHECK11-NEXT:    store i64 4, i64* [[TMP80]], align 4
5595 // CHECK11-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 1
5596 // CHECK11-NEXT:    store i8* null, i8** [[TMP81]], align 4
5597 // CHECK11-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 2
5598 // CHECK11-NEXT:    [[TMP83:%.*]] = bitcast i8** [[TMP82]] to i32*
5599 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[TMP83]], align 4
5600 // CHECK11-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 2
5601 // CHECK11-NEXT:    [[TMP85:%.*]] = bitcast i8** [[TMP84]] to i32*
5602 // CHECK11-NEXT:    store i32 [[TMP0]], i32* [[TMP85]], align 4
5603 // CHECK11-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 2
5604 // CHECK11-NEXT:    store i64 4, i64* [[TMP86]], align 4
5605 // CHECK11-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 2
5606 // CHECK11-NEXT:    store i8* null, i8** [[TMP87]], align 4
5607 // CHECK11-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 3
5608 // CHECK11-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to i32**
5609 // CHECK11-NEXT:    store i32* [[VLA]], i32** [[TMP89]], align 4
5610 // CHECK11-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 3
5611 // CHECK11-NEXT:    [[TMP91:%.*]] = bitcast i8** [[TMP90]] to i32**
5612 // CHECK11-NEXT:    store i32* [[VLA]], i32** [[TMP91]], align 4
5613 // CHECK11-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 3
5614 // CHECK11-NEXT:    store i64 [[TMP69]], i64* [[TMP92]], align 4
5615 // CHECK11-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 3
5616 // CHECK11-NEXT:    store i8* null, i8** [[TMP93]], align 4
5617 // CHECK11-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0
5618 // CHECK11-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 0
5619 // CHECK11-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 0
5620 // CHECK11-NEXT:    [[TMP97:%.*]] = load i32, i32* [[N]], align 4
5621 // CHECK11-NEXT:    store i32 [[TMP97]], i32* [[DOTCAPTURE_EXPR_23]], align 4
5622 // CHECK11-NEXT:    [[TMP98:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_23]], align 4
5623 // CHECK11-NEXT:    [[SUB25:%.*]] = sub nsw i32 [[TMP98]], 0
5624 // CHECK11-NEXT:    [[DIV26:%.*]] = sdiv i32 [[SUB25]], 1
5625 // CHECK11-NEXT:    [[SUB27:%.*]] = sub nsw i32 [[DIV26]], 1
5626 // CHECK11-NEXT:    store i32 [[SUB27]], i32* [[DOTCAPTURE_EXPR_24]], align 4
5627 // CHECK11-NEXT:    [[TMP99:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_24]], align 4
5628 // CHECK11-NEXT:    [[ADD28:%.*]] = add nsw i32 [[TMP99]], 1
5629 // CHECK11-NEXT:    [[TMP100:%.*]] = zext i32 [[ADD28]] to i64
5630 // CHECK11-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 [[TMP100]])
5631 // CHECK11-NEXT:    [[TMP101:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116.region_id, i32 4, i8** [[TMP94]], i8** [[TMP95]], i64* [[TMP96]], i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.7, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
5632 // CHECK11-NEXT:    [[TMP102:%.*]] = icmp ne i32 [[TMP101]], 0
5633 // CHECK11-NEXT:    br i1 [[TMP102]], label [[OMP_OFFLOAD_FAILED29:%.*]], label [[OMP_OFFLOAD_CONT30:%.*]]
5634 // CHECK11:       omp_offload.failed29:
5635 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116(i32 [[TMP65]], i32 [[TMP67]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
5636 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT30]]
5637 // CHECK11:       omp_offload.cont30:
5638 // CHECK11-NEXT:    [[TMP103:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
5639 // CHECK11-NEXT:    [[CALL:%.*]] = call i32 @_Z5tmainIiLi10EEiT_(i32 [[TMP103]])
5640 // CHECK11-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
5641 // CHECK11-NEXT:    [[TMP104:%.*]] = load i8*, i8** [[SAVED_STACK]], align 4
5642 // CHECK11-NEXT:    call void @llvm.stackrestore(i8* [[TMP104]])
5643 // CHECK11-NEXT:    [[TMP105:%.*]] = load i32, i32* [[RETVAL]], align 4
5644 // CHECK11-NEXT:    ret i32 [[TMP105]]
5645 //
5646 //
5647 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106
5648 // CHECK11-SAME: (i32 [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {
5649 // CHECK11-NEXT:  entry:
5650 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
5651 // CHECK11-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
5652 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
5653 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
5654 // CHECK11-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
5655 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
5656 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
5657 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
5658 // CHECK11-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]])
5659 // CHECK11-NEXT:    ret void
5660 //
5661 //
5662 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined.
5663 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5664 // CHECK11-NEXT:  entry:
5665 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5666 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5667 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
5668 // CHECK11-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
5669 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
5670 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5671 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5672 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5673 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5674 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
5675 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5676 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5677 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5678 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5679 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
5680 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5681 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5682 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
5683 // CHECK11-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
5684 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
5685 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
5686 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
5687 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
5688 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5689 // CHECK11-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
5690 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5691 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5692 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5693 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5694 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5695 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
5696 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5697 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5698 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5699 // CHECK11:       omp.precond.then:
5700 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5701 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5702 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
5703 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5704 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5705 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
5706 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
5707 // CHECK11-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)
5708 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5709 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5710 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
5711 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5712 // CHECK11:       cond.true:
5713 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5714 // CHECK11-NEXT:    br label [[COND_END:%.*]]
5715 // CHECK11:       cond.false:
5716 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5717 // CHECK11-NEXT:    br label [[COND_END]]
5718 // CHECK11:       cond.end:
5719 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
5720 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5721 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5722 // CHECK11-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
5723 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5724 // CHECK11:       omp.inner.for.cond:
5725 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5726 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5727 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
5728 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5729 // CHECK11:       omp.inner.for.body:
5730 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5731 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5732 // CHECK11-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]])
5733 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5734 // CHECK11:       omp.inner.for.inc:
5735 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5736 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5737 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
5738 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
5739 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
5740 // CHECK11:       omp.inner.for.end:
5741 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5742 // CHECK11:       omp.loop.exit:
5743 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
5744 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
5745 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
5746 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
5747 // CHECK11:       omp.precond.end:
5748 // CHECK11-NEXT:    ret void
5749 //
5750 //
5751 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..1
5752 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5753 // CHECK11-NEXT:  entry:
5754 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5755 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5756 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
5757 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
5758 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
5759 // CHECK11-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
5760 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
5761 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5762 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5763 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5764 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5765 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
5766 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5767 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5768 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5769 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5770 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
5771 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5772 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5773 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
5774 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
5775 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
5776 // CHECK11-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
5777 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
5778 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
5779 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
5780 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
5781 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5782 // CHECK11-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
5783 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5784 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5785 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5786 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5787 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5788 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
5789 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5790 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5791 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5792 // CHECK11:       omp.precond.then:
5793 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
5794 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5795 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
5796 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
5797 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
5798 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
5799 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
5800 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5801 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5802 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
5803 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
5804 // CHECK11-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)
5805 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5806 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5807 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
5808 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5809 // CHECK11:       cond.true:
5810 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5811 // CHECK11-NEXT:    br label [[COND_END:%.*]]
5812 // CHECK11:       cond.false:
5813 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5814 // CHECK11-NEXT:    br label [[COND_END]]
5815 // CHECK11:       cond.end:
5816 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
5817 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
5818 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
5819 // CHECK11-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
5820 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5821 // CHECK11:       omp.inner.for.cond:
5822 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5823 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
5824 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
5825 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5826 // CHECK11:       omp.inner.for.body:
5827 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5828 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
5829 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5830 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
5831 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I3]], align 4
5832 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
5833 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
5834 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
5835 // CHECK11:       omp.body.continue:
5836 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5837 // CHECK11:       omp.inner.for.inc:
5838 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5839 // CHECK11-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP20]], 1
5840 // CHECK11-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
5841 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
5842 // CHECK11:       omp.inner.for.end:
5843 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5844 // CHECK11:       omp.loop.exit:
5845 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
5846 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
5847 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
5848 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
5849 // CHECK11:       omp.precond.end:
5850 // CHECK11-NEXT:    ret void
5851 //
5852 //
5853 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111
5854 // CHECK11-SAME: (i32 [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5855 // CHECK11-NEXT:  entry:
5856 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
5857 // CHECK11-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
5858 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
5859 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
5860 // CHECK11-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
5861 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
5862 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
5863 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
5864 // CHECK11-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]])
5865 // CHECK11-NEXT:    ret void
5866 //
5867 //
5868 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..2
5869 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5870 // CHECK11-NEXT:  entry:
5871 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5872 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5873 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
5874 // CHECK11-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
5875 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
5876 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5877 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5878 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5879 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5880 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
5881 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
5882 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
5883 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5884 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5885 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
5886 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5887 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5888 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
5889 // CHECK11-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
5890 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
5891 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
5892 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
5893 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
5894 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5895 // CHECK11-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
5896 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5897 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5898 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5899 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5900 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5901 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
5902 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5903 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5904 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5905 // CHECK11:       omp.precond.then:
5906 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
5907 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5908 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
5909 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
5910 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
5911 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
5912 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
5913 // CHECK11-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)
5914 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5915 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5916 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
5917 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5918 // CHECK11:       cond.true:
5919 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
5920 // CHECK11-NEXT:    br label [[COND_END:%.*]]
5921 // CHECK11:       cond.false:
5922 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5923 // CHECK11-NEXT:    br label [[COND_END]]
5924 // CHECK11:       cond.end:
5925 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
5926 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
5927 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5928 // CHECK11-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
5929 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
5930 // CHECK11:       omp.inner.for.cond:
5931 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5932 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5933 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
5934 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5935 // CHECK11:       omp.inner.for.body:
5936 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
5937 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
5938 // CHECK11-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]])
5939 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
5940 // CHECK11:       omp.inner.for.inc:
5941 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5942 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
5943 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
5944 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
5945 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
5946 // CHECK11:       omp.inner.for.end:
5947 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
5948 // CHECK11:       omp.loop.exit:
5949 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
5950 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
5951 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
5952 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
5953 // CHECK11:       omp.precond.end:
5954 // CHECK11-NEXT:    ret void
5955 //
5956 //
5957 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..3
5958 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
5959 // CHECK11-NEXT:  entry:
5960 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
5961 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
5962 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
5963 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
5964 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
5965 // CHECK11-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
5966 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
5967 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
5968 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
5969 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
5970 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
5971 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
5972 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
5973 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
5974 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5975 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5976 // CHECK11-NEXT:    [[I3:%.*]] = alloca i32, align 4
5977 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
5978 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
5979 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
5980 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
5981 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
5982 // CHECK11-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
5983 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
5984 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
5985 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
5986 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
5987 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
5988 // CHECK11-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
5989 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5990 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
5991 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
5992 // CHECK11-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
5993 // CHECK11-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
5994 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
5995 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
5996 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
5997 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
5998 // CHECK11:       omp.precond.then:
5999 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6000 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6001 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
6002 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
6003 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
6004 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
6005 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
6006 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6007 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6008 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6009 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
6010 // CHECK11-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)
6011 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6012 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6013 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
6014 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6015 // CHECK11:       cond.true:
6016 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6017 // CHECK11-NEXT:    br label [[COND_END:%.*]]
6018 // CHECK11:       cond.false:
6019 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6020 // CHECK11-NEXT:    br label [[COND_END]]
6021 // CHECK11:       cond.end:
6022 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
6023 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
6024 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6025 // CHECK11-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
6026 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6027 // CHECK11:       omp.inner.for.cond:
6028 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6029 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6030 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
6031 // CHECK11-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6032 // CHECK11:       omp.inner.for.body:
6033 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6034 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
6035 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6036 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
6037 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I3]], align 4
6038 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
6039 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
6040 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6041 // CHECK11:       omp.body.continue:
6042 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6043 // CHECK11:       omp.inner.for.inc:
6044 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6045 // CHECK11-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP20]], 1
6046 // CHECK11-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
6047 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
6048 // CHECK11:       omp.inner.for.end:
6049 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6050 // CHECK11:       omp.loop.exit:
6051 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6052 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
6053 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
6054 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
6055 // CHECK11:       omp.precond.end:
6056 // CHECK11-NEXT:    ret void
6057 //
6058 //
6059 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116
6060 // CHECK11-SAME: (i32 [[M:%.*]], i32 [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
6061 // CHECK11-NEXT:  entry:
6062 // CHECK11-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
6063 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
6064 // CHECK11-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
6065 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
6066 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6067 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
6068 // CHECK11-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
6069 // CHECK11-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
6070 // CHECK11-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
6071 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
6072 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
6073 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
6074 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32, i32* [[M_ADDR]], align 4
6075 // CHECK11-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
6076 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6077 // CHECK11-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
6078 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
6079 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB3]], i32 4, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32, i32*, i32)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]], i32 [[TMP4]])
6080 // CHECK11-NEXT:    ret void
6081 //
6082 //
6083 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..5
6084 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
6085 // CHECK11-NEXT:  entry:
6086 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
6087 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
6088 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
6089 // CHECK11-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
6090 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
6091 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
6092 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6093 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6094 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6095 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
6096 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
6097 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6098 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6099 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6100 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6101 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
6102 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
6103 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
6104 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
6105 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
6106 // CHECK11-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
6107 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
6108 // CHECK11-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
6109 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
6110 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
6111 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
6112 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
6113 // CHECK11-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6114 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6115 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
6116 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6117 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
6118 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
6119 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
6120 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6121 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
6122 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6123 // CHECK11:       omp.precond.then:
6124 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6125 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6126 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
6127 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6128 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6129 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
6130 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6131 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
6132 // CHECK11-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]])
6133 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6134 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6135 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
6136 // CHECK11-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6137 // CHECK11:       cond.true:
6138 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6139 // CHECK11-NEXT:    br label [[COND_END:%.*]]
6140 // CHECK11:       cond.false:
6141 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6142 // CHECK11-NEXT:    br label [[COND_END]]
6143 // CHECK11:       cond.end:
6144 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
6145 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6146 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6147 // CHECK11-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
6148 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6149 // CHECK11:       omp.inner.for.cond:
6150 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6151 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6152 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
6153 // CHECK11-NEXT:    [[CMP6:%.*]] = icmp slt i32 [[TMP15]], [[ADD]]
6154 // CHECK11-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6155 // CHECK11:       omp.inner.for.body:
6156 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6157 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6158 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
6159 // CHECK11-NEXT:    store i32 [[TMP19]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
6160 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
6161 // CHECK11-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB3]], i32 6, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32*, i32, i32*, i32)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]], i32 [[TMP20]])
6162 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6163 // CHECK11:       omp.inner.for.inc:
6164 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6165 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6166 // CHECK11-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
6167 // CHECK11-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4
6168 // CHECK11-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6169 // CHECK11-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6170 // CHECK11-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
6171 // CHECK11-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_LB]], align 4
6172 // CHECK11-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6173 // CHECK11-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6174 // CHECK11-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
6175 // CHECK11-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_COMB_UB]], align 4
6176 // CHECK11-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6177 // CHECK11-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6178 // CHECK11-NEXT:    [[CMP10:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
6179 // CHECK11-NEXT:    br i1 [[CMP10]], label [[COND_TRUE11:%.*]], label [[COND_FALSE12:%.*]]
6180 // CHECK11:       cond.true11:
6181 // CHECK11-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6182 // CHECK11-NEXT:    br label [[COND_END13:%.*]]
6183 // CHECK11:       cond.false12:
6184 // CHECK11-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6185 // CHECK11-NEXT:    br label [[COND_END13]]
6186 // CHECK11:       cond.end13:
6187 // CHECK11-NEXT:    [[COND14:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE11]] ], [ [[TMP30]], [[COND_FALSE12]] ]
6188 // CHECK11-NEXT:    store i32 [[COND14]], i32* [[DOTOMP_COMB_UB]], align 4
6189 // CHECK11-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6190 // CHECK11-NEXT:    store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4
6191 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
6192 // CHECK11:       omp.inner.for.end:
6193 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6194 // CHECK11:       omp.loop.exit:
6195 // CHECK11-NEXT:    [[TMP32:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6196 // CHECK11-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
6197 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]])
6198 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
6199 // CHECK11:       omp.precond.end:
6200 // CHECK11-NEXT:    ret void
6201 //
6202 //
6203 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..6
6204 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
6205 // CHECK11-NEXT:  entry:
6206 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
6207 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
6208 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
6209 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
6210 // CHECK11-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
6211 // CHECK11-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
6212 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
6213 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
6214 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6215 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6216 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6217 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
6218 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
6219 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6220 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6221 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6222 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6223 // CHECK11-NEXT:    [[I4:%.*]] = alloca i32, align 4
6224 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
6225 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
6226 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
6227 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
6228 // CHECK11-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
6229 // CHECK11-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
6230 // CHECK11-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
6231 // CHECK11-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
6232 // CHECK11-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
6233 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
6234 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
6235 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
6236 // CHECK11-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6237 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6238 // CHECK11-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
6239 // CHECK11-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6240 // CHECK11-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
6241 // CHECK11-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
6242 // CHECK11-NEXT:    store i32 0, i32* [[I]], align 4
6243 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6244 // CHECK11-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
6245 // CHECK11-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
6246 // CHECK11:       omp.precond.then:
6247 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6248 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6249 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
6250 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
6251 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
6252 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
6253 // CHECK11-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
6254 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6255 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6256 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6257 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
6258 // CHECK11-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)
6259 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6260 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6261 // CHECK11-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
6262 // CHECK11-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6263 // CHECK11:       cond.true:
6264 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
6265 // CHECK11-NEXT:    br label [[COND_END:%.*]]
6266 // CHECK11:       cond.false:
6267 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6268 // CHECK11-NEXT:    br label [[COND_END]]
6269 // CHECK11:       cond.end:
6270 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
6271 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
6272 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6273 // CHECK11-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
6274 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6275 // CHECK11:       omp.inner.for.cond:
6276 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6277 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6278 // CHECK11-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
6279 // CHECK11-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6280 // CHECK11:       omp.inner.for.body:
6281 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6282 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
6283 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6284 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
6285 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4
6286 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
6287 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
6288 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6289 // CHECK11:       omp.body.continue:
6290 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6291 // CHECK11:       omp.inner.for.inc:
6292 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6293 // CHECK11-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
6294 // CHECK11-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4
6295 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
6296 // CHECK11:       omp.inner.for.end:
6297 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6298 // CHECK11:       omp.loop.exit:
6299 // CHECK11-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6300 // CHECK11-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
6301 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
6302 // CHECK11-NEXT:    br label [[OMP_PRECOND_END]]
6303 // CHECK11:       omp.precond.end:
6304 // CHECK11-NEXT:    ret void
6305 //
6306 //
6307 // CHECK11-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
6308 // CHECK11-SAME: (i32 [[ARGC:%.*]]) #[[ATTR4:[0-9]+]] comdat {
6309 // CHECK11-NEXT:  entry:
6310 // CHECK11-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
6311 // CHECK11-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
6312 // CHECK11-NEXT:    [[M:%.*]] = alloca i32, align 4
6313 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 4
6314 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 4
6315 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 4
6316 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6317 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 4
6318 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 4
6319 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 4
6320 // CHECK11-NEXT:    [[_TMP4:%.*]] = alloca i32, align 4
6321 // CHECK11-NEXT:    [[M_CASTED:%.*]] = alloca i32, align 4
6322 // CHECK11-NEXT:    [[DOTOFFLOAD_BASEPTRS7:%.*]] = alloca [2 x i8*], align 4
6323 // CHECK11-NEXT:    [[DOTOFFLOAD_PTRS8:%.*]] = alloca [2 x i8*], align 4
6324 // CHECK11-NEXT:    [[DOTOFFLOAD_MAPPERS9:%.*]] = alloca [2 x i8*], align 4
6325 // CHECK11-NEXT:    [[_TMP10:%.*]] = alloca i32, align 4
6326 // CHECK11-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
6327 // CHECK11-NEXT:    store i32 10, i32* [[M]], align 4
6328 // CHECK11-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
6329 // CHECK11-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [10 x i32]**
6330 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP1]], align 4
6331 // CHECK11-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
6332 // CHECK11-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [10 x i32]**
6333 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP3]], align 4
6334 // CHECK11-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
6335 // CHECK11-NEXT:    store i8* null, i8** [[TMP4]], align 4
6336 // CHECK11-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
6337 // CHECK11-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
6338 // CHECK11-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
6339 // CHECK11-NEXT:    [[TMP7:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84.region_id, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.10, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
6340 // CHECK11-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
6341 // CHECK11-NEXT:    br i1 [[TMP8]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
6342 // CHECK11:       omp_offload.failed:
6343 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84([10 x i32]* [[A]]) #[[ATTR3]]
6344 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT]]
6345 // CHECK11:       omp_offload.cont:
6346 // CHECK11-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
6347 // CHECK11-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to [10 x i32]**
6348 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP10]], align 4
6349 // CHECK11-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
6350 // CHECK11-NEXT:    [[TMP12:%.*]] = bitcast i8** [[TMP11]] to [10 x i32]**
6351 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP12]], align 4
6352 // CHECK11-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i32 0, i32 0
6353 // CHECK11-NEXT:    store i8* null, i8** [[TMP13]], align 4
6354 // CHECK11-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
6355 // CHECK11-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
6356 // CHECK11-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
6357 // CHECK11-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89.region_id, i32 1, i8** [[TMP14]], i8** [[TMP15]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.13, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.14, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
6358 // CHECK11-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
6359 // CHECK11-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED5:%.*]], label [[OMP_OFFLOAD_CONT6:%.*]]
6360 // CHECK11:       omp_offload.failed5:
6361 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89([10 x i32]* [[A]]) #[[ATTR3]]
6362 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT6]]
6363 // CHECK11:       omp_offload.cont6:
6364 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[M]], align 4
6365 // CHECK11-NEXT:    store i32 [[TMP18]], i32* [[M_CASTED]], align 4
6366 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[M_CASTED]], align 4
6367 // CHECK11-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
6368 // CHECK11-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32*
6369 // CHECK11-NEXT:    store i32 [[TMP19]], i32* [[TMP21]], align 4
6370 // CHECK11-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
6371 // CHECK11-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to i32*
6372 // CHECK11-NEXT:    store i32 [[TMP19]], i32* [[TMP23]], align 4
6373 // CHECK11-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i32 0, i32 0
6374 // CHECK11-NEXT:    store i8* null, i8** [[TMP24]], align 4
6375 // CHECK11-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 1
6376 // CHECK11-NEXT:    [[TMP26:%.*]] = bitcast i8** [[TMP25]] to [10 x i32]**
6377 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP26]], align 4
6378 // CHECK11-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 1
6379 // CHECK11-NEXT:    [[TMP28:%.*]] = bitcast i8** [[TMP27]] to [10 x i32]**
6380 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP28]], align 4
6381 // CHECK11-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i32 0, i32 1
6382 // CHECK11-NEXT:    store i8* null, i8** [[TMP29]], align 4
6383 // CHECK11-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
6384 // CHECK11-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
6385 // CHECK11-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
6386 // CHECK11-NEXT:    [[TMP32:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94.region_id, i32 2, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.17, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.18, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
6387 // CHECK11-NEXT:    [[TMP33:%.*]] = icmp ne i32 [[TMP32]], 0
6388 // CHECK11-NEXT:    br i1 [[TMP33]], label [[OMP_OFFLOAD_FAILED11:%.*]], label [[OMP_OFFLOAD_CONT12:%.*]]
6389 // CHECK11:       omp_offload.failed11:
6390 // CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94(i32 [[TMP19]], [10 x i32]* [[A]]) #[[ATTR3]]
6391 // CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT12]]
6392 // CHECK11:       omp_offload.cont12:
6393 // CHECK11-NEXT:    ret i32 0
6394 //
6395 //
6396 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84
6397 // CHECK11-SAME: ([10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6398 // CHECK11-NEXT:  entry:
6399 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
6400 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
6401 // CHECK11-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
6402 // CHECK11-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..8 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
6403 // CHECK11-NEXT:    ret void
6404 //
6405 //
6406 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..8
6407 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6408 // CHECK11-NEXT:  entry:
6409 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
6410 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
6411 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
6412 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6413 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6414 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6415 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6416 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6417 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6418 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
6419 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
6420 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
6421 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
6422 // CHECK11-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
6423 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6424 // CHECK11-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
6425 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6426 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6427 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6428 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
6429 // CHECK11-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)
6430 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6431 // CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
6432 // CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6433 // CHECK11:       cond.true:
6434 // CHECK11-NEXT:    br label [[COND_END:%.*]]
6435 // CHECK11:       cond.false:
6436 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6437 // CHECK11-NEXT:    br label [[COND_END]]
6438 // CHECK11:       cond.end:
6439 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
6440 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6441 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6442 // CHECK11-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
6443 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6444 // CHECK11:       omp.inner.for.cond:
6445 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6446 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6447 // CHECK11-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
6448 // CHECK11-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6449 // CHECK11:       omp.inner.for.body:
6450 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6451 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6452 // CHECK11-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..9 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]])
6453 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6454 // CHECK11:       omp.inner.for.inc:
6455 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6456 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6457 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
6458 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
6459 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
6460 // CHECK11:       omp.inner.for.end:
6461 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6462 // CHECK11:       omp.loop.exit:
6463 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
6464 // CHECK11-NEXT:    ret void
6465 //
6466 //
6467 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..9
6468 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6469 // CHECK11-NEXT:  entry:
6470 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
6471 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
6472 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
6473 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
6474 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
6475 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6476 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6477 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6478 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6479 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6480 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6481 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
6482 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
6483 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
6484 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
6485 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
6486 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
6487 // CHECK11-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
6488 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6489 // CHECK11-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
6490 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
6491 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
6492 // CHECK11-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
6493 // CHECK11-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
6494 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6495 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6496 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6497 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
6498 // CHECK11-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)
6499 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6500 // CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
6501 // CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6502 // CHECK11:       cond.true:
6503 // CHECK11-NEXT:    br label [[COND_END:%.*]]
6504 // CHECK11:       cond.false:
6505 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6506 // CHECK11-NEXT:    br label [[COND_END]]
6507 // CHECK11:       cond.end:
6508 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
6509 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
6510 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6511 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
6512 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6513 // CHECK11:       omp.inner.for.cond:
6514 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6515 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6516 // CHECK11-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
6517 // CHECK11-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6518 // CHECK11:       omp.inner.for.body:
6519 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6520 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
6521 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6522 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
6523 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
6524 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
6525 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
6526 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6527 // CHECK11:       omp.body.continue:
6528 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6529 // CHECK11:       omp.inner.for.inc:
6530 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6531 // CHECK11-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
6532 // CHECK11-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
6533 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
6534 // CHECK11:       omp.inner.for.end:
6535 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6536 // CHECK11:       omp.loop.exit:
6537 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
6538 // CHECK11-NEXT:    ret void
6539 //
6540 //
6541 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89
6542 // CHECK11-SAME: ([10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6543 // CHECK11-NEXT:  entry:
6544 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
6545 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
6546 // CHECK11-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
6547 // CHECK11-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..11 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
6548 // CHECK11-NEXT:    ret void
6549 //
6550 //
6551 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..11
6552 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6553 // CHECK11-NEXT:  entry:
6554 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
6555 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
6556 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
6557 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6558 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6559 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6560 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6561 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6562 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6563 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
6564 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
6565 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
6566 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
6567 // CHECK11-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
6568 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6569 // CHECK11-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
6570 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6571 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6572 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6573 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
6574 // CHECK11-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)
6575 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6576 // CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
6577 // CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6578 // CHECK11:       cond.true:
6579 // CHECK11-NEXT:    br label [[COND_END:%.*]]
6580 // CHECK11:       cond.false:
6581 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6582 // CHECK11-NEXT:    br label [[COND_END]]
6583 // CHECK11:       cond.end:
6584 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
6585 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6586 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6587 // CHECK11-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
6588 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6589 // CHECK11:       omp.inner.for.cond:
6590 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6591 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6592 // CHECK11-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
6593 // CHECK11-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6594 // CHECK11:       omp.inner.for.body:
6595 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6596 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6597 // CHECK11-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..12 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]])
6598 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6599 // CHECK11:       omp.inner.for.inc:
6600 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6601 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6602 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
6603 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
6604 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
6605 // CHECK11:       omp.inner.for.end:
6606 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6607 // CHECK11:       omp.loop.exit:
6608 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
6609 // CHECK11-NEXT:    ret void
6610 //
6611 //
6612 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..12
6613 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6614 // CHECK11-NEXT:  entry:
6615 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
6616 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
6617 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
6618 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
6619 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
6620 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6621 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6622 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6623 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6624 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6625 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6626 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
6627 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
6628 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
6629 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
6630 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
6631 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
6632 // CHECK11-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
6633 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6634 // CHECK11-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
6635 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
6636 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
6637 // CHECK11-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
6638 // CHECK11-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
6639 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6640 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6641 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6642 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
6643 // CHECK11-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)
6644 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6645 // CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
6646 // CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6647 // CHECK11:       cond.true:
6648 // CHECK11-NEXT:    br label [[COND_END:%.*]]
6649 // CHECK11:       cond.false:
6650 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6651 // CHECK11-NEXT:    br label [[COND_END]]
6652 // CHECK11:       cond.end:
6653 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
6654 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
6655 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6656 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
6657 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6658 // CHECK11:       omp.inner.for.cond:
6659 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6660 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6661 // CHECK11-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
6662 // CHECK11-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6663 // CHECK11:       omp.inner.for.body:
6664 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6665 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
6666 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6667 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
6668 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
6669 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
6670 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
6671 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6672 // CHECK11:       omp.body.continue:
6673 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6674 // CHECK11:       omp.inner.for.inc:
6675 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6676 // CHECK11-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
6677 // CHECK11-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
6678 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
6679 // CHECK11:       omp.inner.for.end:
6680 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6681 // CHECK11:       omp.loop.exit:
6682 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
6683 // CHECK11-NEXT:    ret void
6684 //
6685 //
6686 // CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94
6687 // CHECK11-SAME: (i32 [[M:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
6688 // CHECK11-NEXT:  entry:
6689 // CHECK11-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
6690 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
6691 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6692 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
6693 // CHECK11-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
6694 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
6695 // CHECK11-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
6696 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[M_ADDR]], align 4
6697 // CHECK11-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
6698 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6699 // CHECK11-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
6700 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
6701 // CHECK11-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..15 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i32 [[TMP3]])
6702 // CHECK11-NEXT:    ret void
6703 //
6704 //
6705 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..15
6706 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
6707 // CHECK11-NEXT:  entry:
6708 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
6709 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
6710 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
6711 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
6712 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6713 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6714 // CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
6715 // CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
6716 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6717 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6718 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
6719 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
6720 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
6721 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
6722 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
6723 // CHECK11-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
6724 // CHECK11-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
6725 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
6726 // CHECK11-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
6727 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6728 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6729 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
6730 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6731 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
6732 // CHECK11-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP1]])
6733 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6734 // CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 9
6735 // CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6736 // CHECK11:       cond.true:
6737 // CHECK11-NEXT:    br label [[COND_END:%.*]]
6738 // CHECK11:       cond.false:
6739 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6740 // CHECK11-NEXT:    br label [[COND_END]]
6741 // CHECK11:       cond.end:
6742 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]
6743 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
6744 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6745 // CHECK11-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_IV]], align 4
6746 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6747 // CHECK11:       omp.inner.for.cond:
6748 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6749 // CHECK11-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[TMP7]], 10
6750 // CHECK11-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6751 // CHECK11:       omp.inner.for.body:
6752 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6753 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6754 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
6755 // CHECK11-NEXT:    store i32 [[TMP10]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
6756 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
6757 // CHECK11-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..16 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]], i32 [[TMP11]])
6758 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6759 // CHECK11:       omp.inner.for.inc:
6760 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6761 // CHECK11-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6762 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
6763 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
6764 // CHECK11-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6765 // CHECK11-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6766 // CHECK11-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]
6767 // CHECK11-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_COMB_LB]], align 4
6768 // CHECK11-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6769 // CHECK11-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
6770 // CHECK11-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]
6771 // CHECK11-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_COMB_UB]], align 4
6772 // CHECK11-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6773 // CHECK11-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 9
6774 // CHECK11-NEXT:    br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]
6775 // CHECK11:       cond.true5:
6776 // CHECK11-NEXT:    br label [[COND_END7:%.*]]
6777 // CHECK11:       cond.false6:
6778 // CHECK11-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
6779 // CHECK11-NEXT:    br label [[COND_END7]]
6780 // CHECK11:       cond.end7:
6781 // CHECK11-NEXT:    [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]
6782 // CHECK11-NEXT:    store i32 [[COND8]], i32* [[DOTOMP_COMB_UB]], align 4
6783 // CHECK11-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
6784 // CHECK11-NEXT:    store i32 [[TMP20]], i32* [[DOTOMP_IV]], align 4
6785 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
6786 // CHECK11:       omp.inner.for.end:
6787 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6788 // CHECK11:       omp.loop.exit:
6789 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]])
6790 // CHECK11-NEXT:    ret void
6791 //
6792 //
6793 // CHECK11-LABEL: define {{[^@]+}}@.omp_outlined..16
6794 // CHECK11-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
6795 // CHECK11-NEXT:  entry:
6796 // CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
6797 // CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
6798 // CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
6799 // CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
6800 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
6801 // CHECK11-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
6802 // CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
6803 // CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6804 // CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
6805 // CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
6806 // CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6807 // CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6808 // CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 4
6809 // CHECK11-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
6810 // CHECK11-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
6811 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
6812 // CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
6813 // CHECK11-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
6814 // CHECK11-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
6815 // CHECK11-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
6816 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
6817 // CHECK11-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
6818 // CHECK11-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
6819 // CHECK11-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
6820 // CHECK11-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
6821 // CHECK11-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
6822 // CHECK11-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
6823 // CHECK11-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
6824 // CHECK11-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
6825 // CHECK11-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
6826 // CHECK11-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)
6827 // CHECK11-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6828 // CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
6829 // CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6830 // CHECK11:       cond.true:
6831 // CHECK11-NEXT:    br label [[COND_END:%.*]]
6832 // CHECK11:       cond.false:
6833 // CHECK11-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6834 // CHECK11-NEXT:    br label [[COND_END]]
6835 // CHECK11:       cond.end:
6836 // CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
6837 // CHECK11-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
6838 // CHECK11-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
6839 // CHECK11-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
6840 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
6841 // CHECK11:       omp.inner.for.cond:
6842 // CHECK11-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6843 // CHECK11-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
6844 // CHECK11-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
6845 // CHECK11-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6846 // CHECK11:       omp.inner.for.body:
6847 // CHECK11-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6848 // CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
6849 // CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6850 // CHECK11-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
6851 // CHECK11-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
6852 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
6853 // CHECK11-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
6854 // CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
6855 // CHECK11:       omp.body.continue:
6856 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
6857 // CHECK11:       omp.inner.for.inc:
6858 // CHECK11-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
6859 // CHECK11-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
6860 // CHECK11-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
6861 // CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]
6862 // CHECK11:       omp.inner.for.end:
6863 // CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
6864 // CHECK11:       omp.loop.exit:
6865 // CHECK11-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
6866 // CHECK11-NEXT:    ret void
6867 //
6868 //
6869 // CHECK11-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
6870 // CHECK11-SAME: () #[[ATTR5:[0-9]+]] {
6871 // CHECK11-NEXT:  entry:
6872 // CHECK11-NEXT:    call void @__tgt_register_requires(i64 1)
6873 // CHECK11-NEXT:    ret void
6874 //
6875 //
6876 // CHECK12-LABEL: define {{[^@]+}}@main
6877 // CHECK12-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
6878 // CHECK12-NEXT:  entry:
6879 // CHECK12-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
6880 // CHECK12-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
6881 // CHECK12-NEXT:    [[ARGV_ADDR:%.*]] = alloca i8**, align 4
6882 // CHECK12-NEXT:    [[N:%.*]] = alloca i32, align 4
6883 // CHECK12-NEXT:    [[SAVED_STACK:%.*]] = alloca i8*, align 4
6884 // CHECK12-NEXT:    [[__VLA_EXPR0:%.*]] = alloca i32, align 4
6885 // CHECK12-NEXT:    [[M:%.*]] = alloca i32, align 4
6886 // CHECK12-NEXT:    [[N_CASTED:%.*]] = alloca i32, align 4
6887 // CHECK12-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
6888 // CHECK12-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
6889 // CHECK12-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
6890 // CHECK12-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 4
6891 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
6892 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
6893 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
6894 // CHECK12-NEXT:    [[N_CASTED3:%.*]] = alloca i32, align 4
6895 // CHECK12-NEXT:    [[DOTOFFLOAD_BASEPTRS4:%.*]] = alloca [3 x i8*], align 4
6896 // CHECK12-NEXT:    [[DOTOFFLOAD_PTRS5:%.*]] = alloca [3 x i8*], align 4
6897 // CHECK12-NEXT:    [[DOTOFFLOAD_MAPPERS6:%.*]] = alloca [3 x i8*], align 4
6898 // CHECK12-NEXT:    [[DOTOFFLOAD_SIZES7:%.*]] = alloca [3 x i64], align 4
6899 // CHECK12-NEXT:    [[_TMP8:%.*]] = alloca i32, align 4
6900 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4
6901 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4
6902 // CHECK12-NEXT:    [[M_CASTED:%.*]] = alloca i32, align 4
6903 // CHECK12-NEXT:    [[N_CASTED17:%.*]] = alloca i32, align 4
6904 // CHECK12-NEXT:    [[DOTOFFLOAD_BASEPTRS18:%.*]] = alloca [4 x i8*], align 4
6905 // CHECK12-NEXT:    [[DOTOFFLOAD_PTRS19:%.*]] = alloca [4 x i8*], align 4
6906 // CHECK12-NEXT:    [[DOTOFFLOAD_MAPPERS20:%.*]] = alloca [4 x i8*], align 4
6907 // CHECK12-NEXT:    [[DOTOFFLOAD_SIZES21:%.*]] = alloca [4 x i64], align 4
6908 // CHECK12-NEXT:    [[_TMP22:%.*]] = alloca i32, align 4
6909 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_23:%.*]] = alloca i32, align 4
6910 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_24:%.*]] = alloca i32, align 4
6911 // CHECK12-NEXT:    store i32 0, i32* [[RETVAL]], align 4
6912 // CHECK12-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
6913 // CHECK12-NEXT:    store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 4
6914 // CHECK12-NEXT:    store i32 100, i32* [[N]], align 4
6915 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
6916 // CHECK12-NEXT:    [[TMP1:%.*]] = call i8* @llvm.stacksave()
6917 // CHECK12-NEXT:    store i8* [[TMP1]], i8** [[SAVED_STACK]], align 4
6918 // CHECK12-NEXT:    [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 4
6919 // CHECK12-NEXT:    store i32 [[TMP0]], i32* [[__VLA_EXPR0]], align 4
6920 // CHECK12-NEXT:    store i32 10, i32* [[M]], align 4
6921 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32, i32* [[N]], align 4
6922 // CHECK12-NEXT:    store i32 [[TMP2]], i32* [[N_CASTED]], align 4
6923 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[N_CASTED]], align 4
6924 // CHECK12-NEXT:    [[TMP4:%.*]] = mul nuw i32 [[TMP0]], 4
6925 // CHECK12-NEXT:    [[TMP5:%.*]] = sext i32 [[TMP4]] to i64
6926 // CHECK12-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
6927 // CHECK12-NEXT:    [[TMP7:%.*]] = bitcast i8** [[TMP6]] to i32*
6928 // CHECK12-NEXT:    store i32 [[TMP3]], i32* [[TMP7]], align 4
6929 // CHECK12-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
6930 // CHECK12-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to i32*
6931 // CHECK12-NEXT:    store i32 [[TMP3]], i32* [[TMP9]], align 4
6932 // CHECK12-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
6933 // CHECK12-NEXT:    store i64 4, i64* [[TMP10]], align 4
6934 // CHECK12-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
6935 // CHECK12-NEXT:    store i8* null, i8** [[TMP11]], align 4
6936 // CHECK12-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
6937 // CHECK12-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i32*
6938 // CHECK12-NEXT:    store i32 [[TMP0]], i32* [[TMP13]], align 4
6939 // CHECK12-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
6940 // CHECK12-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i32*
6941 // CHECK12-NEXT:    store i32 [[TMP0]], i32* [[TMP15]], align 4
6942 // CHECK12-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 1
6943 // CHECK12-NEXT:    store i64 4, i64* [[TMP16]], align 4
6944 // CHECK12-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
6945 // CHECK12-NEXT:    store i8* null, i8** [[TMP17]], align 4
6946 // CHECK12-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
6947 // CHECK12-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
6948 // CHECK12-NEXT:    store i32* [[VLA]], i32** [[TMP19]], align 4
6949 // CHECK12-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
6950 // CHECK12-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32**
6951 // CHECK12-NEXT:    store i32* [[VLA]], i32** [[TMP21]], align 4
6952 // CHECK12-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
6953 // CHECK12-NEXT:    store i64 [[TMP5]], i64* [[TMP22]], align 4
6954 // CHECK12-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
6955 // CHECK12-NEXT:    store i8* null, i8** [[TMP23]], align 4
6956 // CHECK12-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
6957 // CHECK12-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
6958 // CHECK12-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
6959 // CHECK12-NEXT:    [[TMP27:%.*]] = load i32, i32* [[N]], align 4
6960 // CHECK12-NEXT:    store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4
6961 // CHECK12-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
6962 // CHECK12-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0
6963 // CHECK12-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
6964 // CHECK12-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
6965 // CHECK12-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
6966 // CHECK12-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
6967 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP29]], 1
6968 // CHECK12-NEXT:    [[TMP30:%.*]] = zext i32 [[ADD]] to i64
6969 // CHECK12-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3:[0-9]+]], i64 -1, i64 [[TMP30]])
6970 // CHECK12-NEXT:    [[TMP31:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* [[TMP26]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
6971 // CHECK12-NEXT:    [[TMP32:%.*]] = icmp ne i32 [[TMP31]], 0
6972 // CHECK12-NEXT:    br i1 [[TMP32]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
6973 // CHECK12:       omp_offload.failed:
6974 // CHECK12-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106(i32 [[TMP3]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3:[0-9]+]]
6975 // CHECK12-NEXT:    br label [[OMP_OFFLOAD_CONT]]
6976 // CHECK12:       omp_offload.cont:
6977 // CHECK12-NEXT:    [[TMP33:%.*]] = load i32, i32* [[N]], align 4
6978 // CHECK12-NEXT:    store i32 [[TMP33]], i32* [[N_CASTED3]], align 4
6979 // CHECK12-NEXT:    [[TMP34:%.*]] = load i32, i32* [[N_CASTED3]], align 4
6980 // CHECK12-NEXT:    [[TMP35:%.*]] = mul nuw i32 [[TMP0]], 4
6981 // CHECK12-NEXT:    [[TMP36:%.*]] = sext i32 [[TMP35]] to i64
6982 // CHECK12-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
6983 // CHECK12-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to i32*
6984 // CHECK12-NEXT:    store i32 [[TMP34]], i32* [[TMP38]], align 4
6985 // CHECK12-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
6986 // CHECK12-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32*
6987 // CHECK12-NEXT:    store i32 [[TMP34]], i32* [[TMP40]], align 4
6988 // CHECK12-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 0
6989 // CHECK12-NEXT:    store i64 4, i64* [[TMP41]], align 4
6990 // CHECK12-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 0
6991 // CHECK12-NEXT:    store i8* null, i8** [[TMP42]], align 4
6992 // CHECK12-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 1
6993 // CHECK12-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to i32*
6994 // CHECK12-NEXT:    store i32 [[TMP0]], i32* [[TMP44]], align 4
6995 // CHECK12-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 1
6996 // CHECK12-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32*
6997 // CHECK12-NEXT:    store i32 [[TMP0]], i32* [[TMP46]], align 4
6998 // CHECK12-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 1
6999 // CHECK12-NEXT:    store i64 4, i64* [[TMP47]], align 4
7000 // CHECK12-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 1
7001 // CHECK12-NEXT:    store i8* null, i8** [[TMP48]], align 4
7002 // CHECK12-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 2
7003 // CHECK12-NEXT:    [[TMP50:%.*]] = bitcast i8** [[TMP49]] to i32**
7004 // CHECK12-NEXT:    store i32* [[VLA]], i32** [[TMP50]], align 4
7005 // CHECK12-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 2
7006 // CHECK12-NEXT:    [[TMP52:%.*]] = bitcast i8** [[TMP51]] to i32**
7007 // CHECK12-NEXT:    store i32* [[VLA]], i32** [[TMP52]], align 4
7008 // CHECK12-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 2
7009 // CHECK12-NEXT:    store i64 [[TMP36]], i64* [[TMP53]], align 4
7010 // CHECK12-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS6]], i32 0, i32 2
7011 // CHECK12-NEXT:    store i8* null, i8** [[TMP54]], align 4
7012 // CHECK12-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS4]], i32 0, i32 0
7013 // CHECK12-NEXT:    [[TMP56:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS5]], i32 0, i32 0
7014 // CHECK12-NEXT:    [[TMP57:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES7]], i32 0, i32 0
7015 // CHECK12-NEXT:    [[TMP58:%.*]] = load i32, i32* [[N]], align 4
7016 // CHECK12-NEXT:    store i32 [[TMP58]], i32* [[DOTCAPTURE_EXPR_9]], align 4
7017 // CHECK12-NEXT:    [[TMP59:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_9]], align 4
7018 // CHECK12-NEXT:    [[SUB11:%.*]] = sub nsw i32 [[TMP59]], 0
7019 // CHECK12-NEXT:    [[DIV12:%.*]] = sdiv i32 [[SUB11]], 1
7020 // CHECK12-NEXT:    [[SUB13:%.*]] = sub nsw i32 [[DIV12]], 1
7021 // CHECK12-NEXT:    store i32 [[SUB13]], i32* [[DOTCAPTURE_EXPR_10]], align 4
7022 // CHECK12-NEXT:    [[TMP60:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_10]], align 4
7023 // CHECK12-NEXT:    [[ADD14:%.*]] = add nsw i32 [[TMP60]], 1
7024 // CHECK12-NEXT:    [[TMP61:%.*]] = zext i32 [[ADD14]] to i64
7025 // CHECK12-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 [[TMP61]])
7026 // CHECK12-NEXT:    [[TMP62:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111.region_id, i32 3, i8** [[TMP55]], i8** [[TMP56]], i64* [[TMP57]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
7027 // CHECK12-NEXT:    [[TMP63:%.*]] = icmp ne i32 [[TMP62]], 0
7028 // CHECK12-NEXT:    br i1 [[TMP63]], label [[OMP_OFFLOAD_FAILED15:%.*]], label [[OMP_OFFLOAD_CONT16:%.*]]
7029 // CHECK12:       omp_offload.failed15:
7030 // CHECK12-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111(i32 [[TMP34]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
7031 // CHECK12-NEXT:    br label [[OMP_OFFLOAD_CONT16]]
7032 // CHECK12:       omp_offload.cont16:
7033 // CHECK12-NEXT:    [[TMP64:%.*]] = load i32, i32* [[M]], align 4
7034 // CHECK12-NEXT:    store i32 [[TMP64]], i32* [[M_CASTED]], align 4
7035 // CHECK12-NEXT:    [[TMP65:%.*]] = load i32, i32* [[M_CASTED]], align 4
7036 // CHECK12-NEXT:    [[TMP66:%.*]] = load i32, i32* [[N]], align 4
7037 // CHECK12-NEXT:    store i32 [[TMP66]], i32* [[N_CASTED17]], align 4
7038 // CHECK12-NEXT:    [[TMP67:%.*]] = load i32, i32* [[N_CASTED17]], align 4
7039 // CHECK12-NEXT:    [[TMP68:%.*]] = mul nuw i32 [[TMP0]], 4
7040 // CHECK12-NEXT:    [[TMP69:%.*]] = sext i32 [[TMP68]] to i64
7041 // CHECK12-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0
7042 // CHECK12-NEXT:    [[TMP71:%.*]] = bitcast i8** [[TMP70]] to i32*
7043 // CHECK12-NEXT:    store i32 [[TMP65]], i32* [[TMP71]], align 4
7044 // CHECK12-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 0
7045 // CHECK12-NEXT:    [[TMP73:%.*]] = bitcast i8** [[TMP72]] to i32*
7046 // CHECK12-NEXT:    store i32 [[TMP65]], i32* [[TMP73]], align 4
7047 // CHECK12-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 0
7048 // CHECK12-NEXT:    store i64 4, i64* [[TMP74]], align 4
7049 // CHECK12-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 0
7050 // CHECK12-NEXT:    store i8* null, i8** [[TMP75]], align 4
7051 // CHECK12-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 1
7052 // CHECK12-NEXT:    [[TMP77:%.*]] = bitcast i8** [[TMP76]] to i32*
7053 // CHECK12-NEXT:    store i32 [[TMP67]], i32* [[TMP77]], align 4
7054 // CHECK12-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 1
7055 // CHECK12-NEXT:    [[TMP79:%.*]] = bitcast i8** [[TMP78]] to i32*
7056 // CHECK12-NEXT:    store i32 [[TMP67]], i32* [[TMP79]], align 4
7057 // CHECK12-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 1
7058 // CHECK12-NEXT:    store i64 4, i64* [[TMP80]], align 4
7059 // CHECK12-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 1
7060 // CHECK12-NEXT:    store i8* null, i8** [[TMP81]], align 4
7061 // CHECK12-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 2
7062 // CHECK12-NEXT:    [[TMP83:%.*]] = bitcast i8** [[TMP82]] to i32*
7063 // CHECK12-NEXT:    store i32 [[TMP0]], i32* [[TMP83]], align 4
7064 // CHECK12-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 2
7065 // CHECK12-NEXT:    [[TMP85:%.*]] = bitcast i8** [[TMP84]] to i32*
7066 // CHECK12-NEXT:    store i32 [[TMP0]], i32* [[TMP85]], align 4
7067 // CHECK12-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 2
7068 // CHECK12-NEXT:    store i64 4, i64* [[TMP86]], align 4
7069 // CHECK12-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 2
7070 // CHECK12-NEXT:    store i8* null, i8** [[TMP87]], align 4
7071 // CHECK12-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 3
7072 // CHECK12-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to i32**
7073 // CHECK12-NEXT:    store i32* [[VLA]], i32** [[TMP89]], align 4
7074 // CHECK12-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 3
7075 // CHECK12-NEXT:    [[TMP91:%.*]] = bitcast i8** [[TMP90]] to i32**
7076 // CHECK12-NEXT:    store i32* [[VLA]], i32** [[TMP91]], align 4
7077 // CHECK12-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 3
7078 // CHECK12-NEXT:    store i64 [[TMP69]], i64* [[TMP92]], align 4
7079 // CHECK12-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_MAPPERS20]], i32 0, i32 3
7080 // CHECK12-NEXT:    store i8* null, i8** [[TMP93]], align 4
7081 // CHECK12-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0
7082 // CHECK12-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[DOTOFFLOAD_PTRS19]], i32 0, i32 0
7083 // CHECK12-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [4 x i64], [4 x i64]* [[DOTOFFLOAD_SIZES21]], i32 0, i32 0
7084 // CHECK12-NEXT:    [[TMP97:%.*]] = load i32, i32* [[N]], align 4
7085 // CHECK12-NEXT:    store i32 [[TMP97]], i32* [[DOTCAPTURE_EXPR_23]], align 4
7086 // CHECK12-NEXT:    [[TMP98:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_23]], align 4
7087 // CHECK12-NEXT:    [[SUB25:%.*]] = sub nsw i32 [[TMP98]], 0
7088 // CHECK12-NEXT:    [[DIV26:%.*]] = sdiv i32 [[SUB25]], 1
7089 // CHECK12-NEXT:    [[SUB27:%.*]] = sub nsw i32 [[DIV26]], 1
7090 // CHECK12-NEXT:    store i32 [[SUB27]], i32* [[DOTCAPTURE_EXPR_24]], align 4
7091 // CHECK12-NEXT:    [[TMP99:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_24]], align 4
7092 // CHECK12-NEXT:    [[ADD28:%.*]] = add nsw i32 [[TMP99]], 1
7093 // CHECK12-NEXT:    [[TMP100:%.*]] = zext i32 [[ADD28]] to i64
7094 // CHECK12-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 [[TMP100]])
7095 // CHECK12-NEXT:    [[TMP101:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116.region_id, i32 4, i8** [[TMP94]], i8** [[TMP95]], i64* [[TMP96]], i64* getelementptr inbounds ([4 x i64], [4 x i64]* @.offload_maptypes.7, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
7096 // CHECK12-NEXT:    [[TMP102:%.*]] = icmp ne i32 [[TMP101]], 0
7097 // CHECK12-NEXT:    br i1 [[TMP102]], label [[OMP_OFFLOAD_FAILED29:%.*]], label [[OMP_OFFLOAD_CONT30:%.*]]
7098 // CHECK12:       omp_offload.failed29:
7099 // CHECK12-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116(i32 [[TMP65]], i32 [[TMP67]], i32 [[TMP0]], i32* [[VLA]]) #[[ATTR3]]
7100 // CHECK12-NEXT:    br label [[OMP_OFFLOAD_CONT30]]
7101 // CHECK12:       omp_offload.cont30:
7102 // CHECK12-NEXT:    [[TMP103:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
7103 // CHECK12-NEXT:    [[CALL:%.*]] = call i32 @_Z5tmainIiLi10EEiT_(i32 [[TMP103]])
7104 // CHECK12-NEXT:    store i32 [[CALL]], i32* [[RETVAL]], align 4
7105 // CHECK12-NEXT:    [[TMP104:%.*]] = load i8*, i8** [[SAVED_STACK]], align 4
7106 // CHECK12-NEXT:    call void @llvm.stackrestore(i8* [[TMP104]])
7107 // CHECK12-NEXT:    [[TMP105:%.*]] = load i32, i32* [[RETVAL]], align 4
7108 // CHECK12-NEXT:    ret i32 [[TMP105]]
7109 //
7110 //
7111 // CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106
7112 // CHECK12-SAME: (i32 [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {
7113 // CHECK12-NEXT:  entry:
7114 // CHECK12-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
7115 // CHECK12-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
7116 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
7117 // CHECK12-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
7118 // CHECK12-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
7119 // CHECK12-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
7120 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
7121 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
7122 // CHECK12-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]])
7123 // CHECK12-NEXT:    ret void
7124 //
7125 //
7126 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined.
7127 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
7128 // CHECK12-NEXT:  entry:
7129 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
7130 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
7131 // CHECK12-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
7132 // CHECK12-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
7133 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
7134 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7135 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7136 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7137 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7138 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
7139 // CHECK12-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7140 // CHECK12-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7141 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7142 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7143 // CHECK12-NEXT:    [[I3:%.*]] = alloca i32, align 4
7144 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
7145 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
7146 // CHECK12-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
7147 // CHECK12-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
7148 // CHECK12-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
7149 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
7150 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
7151 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
7152 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
7153 // CHECK12-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
7154 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7155 // CHECK12-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
7156 // CHECK12-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7157 // CHECK12-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7158 // CHECK12-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7159 // CHECK12-NEXT:    store i32 0, i32* [[I]], align 4
7160 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7161 // CHECK12-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
7162 // CHECK12-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7163 // CHECK12:       omp.precond.then:
7164 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7165 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7166 // CHECK12-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
7167 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7168 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7169 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7170 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
7171 // CHECK12-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)
7172 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7173 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7174 // CHECK12-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
7175 // CHECK12-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7176 // CHECK12:       cond.true:
7177 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7178 // CHECK12-NEXT:    br label [[COND_END:%.*]]
7179 // CHECK12:       cond.false:
7180 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7181 // CHECK12-NEXT:    br label [[COND_END]]
7182 // CHECK12:       cond.end:
7183 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
7184 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7185 // CHECK12-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7186 // CHECK12-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
7187 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7188 // CHECK12:       omp.inner.for.cond:
7189 // CHECK12-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7190 // CHECK12-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7191 // CHECK12-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
7192 // CHECK12-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7193 // CHECK12:       omp.inner.for.body:
7194 // CHECK12-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7195 // CHECK12-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7196 // CHECK12-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]])
7197 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7198 // CHECK12:       omp.inner.for.inc:
7199 // CHECK12-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7200 // CHECK12-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7201 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
7202 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
7203 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
7204 // CHECK12:       omp.inner.for.end:
7205 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7206 // CHECK12:       omp.loop.exit:
7207 // CHECK12-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7208 // CHECK12-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
7209 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
7210 // CHECK12-NEXT:    br label [[OMP_PRECOND_END]]
7211 // CHECK12:       omp.precond.end:
7212 // CHECK12-NEXT:    ret void
7213 //
7214 //
7215 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..1
7216 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
7217 // CHECK12-NEXT:  entry:
7218 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
7219 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
7220 // CHECK12-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
7221 // CHECK12-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
7222 // CHECK12-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
7223 // CHECK12-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
7224 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
7225 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7226 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7227 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7228 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7229 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
7230 // CHECK12-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7231 // CHECK12-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7232 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7233 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7234 // CHECK12-NEXT:    [[I3:%.*]] = alloca i32, align 4
7235 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
7236 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
7237 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
7238 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
7239 // CHECK12-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
7240 // CHECK12-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
7241 // CHECK12-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
7242 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
7243 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
7244 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
7245 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
7246 // CHECK12-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
7247 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7248 // CHECK12-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
7249 // CHECK12-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7250 // CHECK12-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7251 // CHECK12-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7252 // CHECK12-NEXT:    store i32 0, i32* [[I]], align 4
7253 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7254 // CHECK12-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
7255 // CHECK12-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7256 // CHECK12:       omp.precond.then:
7257 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7258 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7259 // CHECK12-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
7260 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
7261 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
7262 // CHECK12-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
7263 // CHECK12-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
7264 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7265 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7266 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7267 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
7268 // CHECK12-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)
7269 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7270 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7271 // CHECK12-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
7272 // CHECK12-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7273 // CHECK12:       cond.true:
7274 // CHECK12-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7275 // CHECK12-NEXT:    br label [[COND_END:%.*]]
7276 // CHECK12:       cond.false:
7277 // CHECK12-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7278 // CHECK12-NEXT:    br label [[COND_END]]
7279 // CHECK12:       cond.end:
7280 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
7281 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
7282 // CHECK12-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7283 // CHECK12-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
7284 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7285 // CHECK12:       omp.inner.for.cond:
7286 // CHECK12-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7287 // CHECK12-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7288 // CHECK12-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
7289 // CHECK12-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7290 // CHECK12:       omp.inner.for.body:
7291 // CHECK12-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7292 // CHECK12-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
7293 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7294 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
7295 // CHECK12-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I3]], align 4
7296 // CHECK12-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
7297 // CHECK12-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
7298 // CHECK12-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7299 // CHECK12:       omp.body.continue:
7300 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7301 // CHECK12:       omp.inner.for.inc:
7302 // CHECK12-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7303 // CHECK12-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP20]], 1
7304 // CHECK12-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
7305 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
7306 // CHECK12:       omp.inner.for.end:
7307 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7308 // CHECK12:       omp.loop.exit:
7309 // CHECK12-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7310 // CHECK12-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
7311 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
7312 // CHECK12-NEXT:    br label [[OMP_PRECOND_END]]
7313 // CHECK12:       omp.precond.end:
7314 // CHECK12-NEXT:    ret void
7315 //
7316 //
7317 // CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l111
7318 // CHECK12-SAME: (i32 [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
7319 // CHECK12-NEXT:  entry:
7320 // CHECK12-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
7321 // CHECK12-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
7322 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
7323 // CHECK12-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
7324 // CHECK12-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
7325 // CHECK12-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
7326 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
7327 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
7328 // CHECK12-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]])
7329 // CHECK12-NEXT:    ret void
7330 //
7331 //
7332 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..2
7333 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
7334 // CHECK12-NEXT:  entry:
7335 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
7336 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
7337 // CHECK12-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
7338 // CHECK12-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
7339 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
7340 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7341 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7342 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7343 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7344 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
7345 // CHECK12-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7346 // CHECK12-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7347 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7348 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7349 // CHECK12-NEXT:    [[I3:%.*]] = alloca i32, align 4
7350 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
7351 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
7352 // CHECK12-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
7353 // CHECK12-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
7354 // CHECK12-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
7355 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
7356 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
7357 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
7358 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
7359 // CHECK12-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
7360 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7361 // CHECK12-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
7362 // CHECK12-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7363 // CHECK12-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7364 // CHECK12-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7365 // CHECK12-NEXT:    store i32 0, i32* [[I]], align 4
7366 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7367 // CHECK12-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
7368 // CHECK12-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7369 // CHECK12:       omp.precond.then:
7370 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7371 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7372 // CHECK12-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
7373 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7374 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7375 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7376 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
7377 // CHECK12-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)
7378 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7379 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7380 // CHECK12-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]
7381 // CHECK12-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7382 // CHECK12:       cond.true:
7383 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7384 // CHECK12-NEXT:    br label [[COND_END:%.*]]
7385 // CHECK12:       cond.false:
7386 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7387 // CHECK12-NEXT:    br label [[COND_END]]
7388 // CHECK12:       cond.end:
7389 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
7390 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7391 // CHECK12-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7392 // CHECK12-NEXT:    store i32 [[TMP13]], i32* [[DOTOMP_IV]], align 4
7393 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7394 // CHECK12:       omp.inner.for.cond:
7395 // CHECK12-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7396 // CHECK12-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7397 // CHECK12-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]
7398 // CHECK12-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7399 // CHECK12:       omp.inner.for.body:
7400 // CHECK12-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7401 // CHECK12-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7402 // CHECK12-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]])
7403 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7404 // CHECK12:       omp.inner.for.inc:
7405 // CHECK12-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7406 // CHECK12-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7407 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]
7408 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
7409 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
7410 // CHECK12:       omp.inner.for.end:
7411 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7412 // CHECK12:       omp.loop.exit:
7413 // CHECK12-NEXT:    [[TMP20:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7414 // CHECK12-NEXT:    [[TMP21:%.*]] = load i32, i32* [[TMP20]], align 4
7415 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP21]])
7416 // CHECK12-NEXT:    br label [[OMP_PRECOND_END]]
7417 // CHECK12:       omp.precond.end:
7418 // CHECK12-NEXT:    ret void
7419 //
7420 //
7421 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..3
7422 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
7423 // CHECK12-NEXT:  entry:
7424 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
7425 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
7426 // CHECK12-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
7427 // CHECK12-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
7428 // CHECK12-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
7429 // CHECK12-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
7430 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
7431 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7432 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7433 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7434 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7435 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
7436 // CHECK12-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7437 // CHECK12-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7438 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7439 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7440 // CHECK12-NEXT:    [[I3:%.*]] = alloca i32, align 4
7441 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
7442 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
7443 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
7444 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
7445 // CHECK12-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
7446 // CHECK12-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
7447 // CHECK12-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
7448 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
7449 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
7450 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
7451 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
7452 // CHECK12-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_]], align 4
7453 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7454 // CHECK12-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
7455 // CHECK12-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7456 // CHECK12-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
7457 // CHECK12-NEXT:    store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7458 // CHECK12-NEXT:    store i32 0, i32* [[I]], align 4
7459 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7460 // CHECK12-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
7461 // CHECK12-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7462 // CHECK12:       omp.precond.then:
7463 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7464 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7465 // CHECK12-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
7466 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
7467 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
7468 // CHECK12-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
7469 // CHECK12-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
7470 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7471 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7472 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7473 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
7474 // CHECK12-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)
7475 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7476 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7477 // CHECK12-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
7478 // CHECK12-NEXT:    br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7479 // CHECK12:       cond.true:
7480 // CHECK12-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7481 // CHECK12-NEXT:    br label [[COND_END:%.*]]
7482 // CHECK12:       cond.false:
7483 // CHECK12-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7484 // CHECK12-NEXT:    br label [[COND_END]]
7485 // CHECK12:       cond.end:
7486 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
7487 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
7488 // CHECK12-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7489 // CHECK12-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
7490 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7491 // CHECK12:       omp.inner.for.cond:
7492 // CHECK12-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7493 // CHECK12-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7494 // CHECK12-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
7495 // CHECK12-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7496 // CHECK12:       omp.inner.for.body:
7497 // CHECK12-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7498 // CHECK12-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
7499 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7500 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[I3]], align 4
7501 // CHECK12-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I3]], align 4
7502 // CHECK12-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
7503 // CHECK12-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
7504 // CHECK12-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7505 // CHECK12:       omp.body.continue:
7506 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7507 // CHECK12:       omp.inner.for.inc:
7508 // CHECK12-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7509 // CHECK12-NEXT:    [[ADD6:%.*]] = add nsw i32 [[TMP20]], 1
7510 // CHECK12-NEXT:    store i32 [[ADD6]], i32* [[DOTOMP_IV]], align 4
7511 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
7512 // CHECK12:       omp.inner.for.end:
7513 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7514 // CHECK12:       omp.loop.exit:
7515 // CHECK12-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7516 // CHECK12-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
7517 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
7518 // CHECK12-NEXT:    br label [[OMP_PRECOND_END]]
7519 // CHECK12:       omp.precond.end:
7520 // CHECK12-NEXT:    ret void
7521 //
7522 //
7523 // CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l116
7524 // CHECK12-SAME: (i32 [[M:%.*]], i32 [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {
7525 // CHECK12-NEXT:  entry:
7526 // CHECK12-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
7527 // CHECK12-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
7528 // CHECK12-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
7529 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
7530 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
7531 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
7532 // CHECK12-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
7533 // CHECK12-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4
7534 // CHECK12-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
7535 // CHECK12-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
7536 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
7537 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[A_ADDR]], align 4
7538 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32, i32* [[M_ADDR]], align 4
7539 // CHECK12-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
7540 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
7541 // CHECK12-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
7542 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
7543 // CHECK12-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..5 to void (i32*, i32*, ...)*), i32* [[N_ADDR]], i32 [[TMP0]], i32* [[TMP1]], i32 [[TMP4]])
7544 // CHECK12-NEXT:    ret void
7545 //
7546 //
7547 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..5
7548 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
7549 // CHECK12-NEXT:  entry:
7550 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
7551 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
7552 // CHECK12-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
7553 // CHECK12-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
7554 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
7555 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
7556 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7557 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7558 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7559 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
7560 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
7561 // CHECK12-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7562 // CHECK12-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7563 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7564 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7565 // CHECK12-NEXT:    [[I4:%.*]] = alloca i32, align 4
7566 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
7567 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
7568 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
7569 // CHECK12-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
7570 // CHECK12-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
7571 // CHECK12-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
7572 // CHECK12-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
7573 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
7574 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
7575 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
7576 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
7577 // CHECK12-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7578 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7579 // CHECK12-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
7580 // CHECK12-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7581 // CHECK12-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
7582 // CHECK12-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
7583 // CHECK12-NEXT:    store i32 0, i32* [[I]], align 4
7584 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7585 // CHECK12-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
7586 // CHECK12-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7587 // CHECK12:       omp.precond.then:
7588 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7589 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
7590 // CHECK12-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_COMB_UB]], align 4
7591 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7592 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7593 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
7594 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7595 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP8]], align 4
7596 // CHECK12-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]])
7597 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7598 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
7599 // CHECK12-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP10]], [[TMP11]]
7600 // CHECK12-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7601 // CHECK12:       cond.true:
7602 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
7603 // CHECK12-NEXT:    br label [[COND_END:%.*]]
7604 // CHECK12:       cond.false:
7605 // CHECK12-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7606 // CHECK12-NEXT:    br label [[COND_END]]
7607 // CHECK12:       cond.end:
7608 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP12]], [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]
7609 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7610 // CHECK12-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7611 // CHECK12-NEXT:    store i32 [[TMP14]], i32* [[DOTOMP_IV]], align 4
7612 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7613 // CHECK12:       omp.inner.for.cond:
7614 // CHECK12-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7615 // CHECK12-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
7616 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP16]], 1
7617 // CHECK12-NEXT:    [[CMP6:%.*]] = icmp slt i32 [[TMP15]], [[ADD]]
7618 // CHECK12-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7619 // CHECK12:       omp.inner.for.body:
7620 // CHECK12-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7621 // CHECK12-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7622 // CHECK12-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
7623 // CHECK12-NEXT:    store i32 [[TMP19]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
7624 // CHECK12-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
7625 // CHECK12-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..6 to void (i32*, i32*, ...)*), i32 [[TMP17]], i32 [[TMP18]], i32* [[TMP0]], i32 [[TMP1]], i32* [[TMP2]], i32 [[TMP20]])
7626 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7627 // CHECK12:       omp.inner.for.inc:
7628 // CHECK12-NEXT:    [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7629 // CHECK12-NEXT:    [[TMP22:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7630 // CHECK12-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]
7631 // CHECK12-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4
7632 // CHECK12-NEXT:    [[TMP23:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7633 // CHECK12-NEXT:    [[TMP24:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7634 // CHECK12-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
7635 // CHECK12-NEXT:    store i32 [[ADD8]], i32* [[DOTOMP_COMB_LB]], align 4
7636 // CHECK12-NEXT:    [[TMP25:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7637 // CHECK12-NEXT:    [[TMP26:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7638 // CHECK12-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]
7639 // CHECK12-NEXT:    store i32 [[ADD9]], i32* [[DOTOMP_COMB_UB]], align 4
7640 // CHECK12-NEXT:    [[TMP27:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7641 // CHECK12-NEXT:    [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
7642 // CHECK12-NEXT:    [[CMP10:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
7643 // CHECK12-NEXT:    br i1 [[CMP10]], label [[COND_TRUE11:%.*]], label [[COND_FALSE12:%.*]]
7644 // CHECK12:       cond.true11:
7645 // CHECK12-NEXT:    [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
7646 // CHECK12-NEXT:    br label [[COND_END13:%.*]]
7647 // CHECK12:       cond.false12:
7648 // CHECK12-NEXT:    [[TMP30:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7649 // CHECK12-NEXT:    br label [[COND_END13]]
7650 // CHECK12:       cond.end13:
7651 // CHECK12-NEXT:    [[COND14:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE11]] ], [ [[TMP30]], [[COND_FALSE12]] ]
7652 // CHECK12-NEXT:    store i32 [[COND14]], i32* [[DOTOMP_COMB_UB]], align 4
7653 // CHECK12-NEXT:    [[TMP31:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7654 // CHECK12-NEXT:    store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4
7655 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
7656 // CHECK12:       omp.inner.for.end:
7657 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7658 // CHECK12:       omp.loop.exit:
7659 // CHECK12-NEXT:    [[TMP32:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7660 // CHECK12-NEXT:    [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4
7661 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]])
7662 // CHECK12-NEXT:    br label [[OMP_PRECOND_END]]
7663 // CHECK12:       omp.precond.end:
7664 // CHECK12-NEXT:    ret void
7665 //
7666 //
7667 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..6
7668 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], i32* nonnull align 4 dereferenceable(4) [[N:%.*]], i32 [[VLA:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
7669 // CHECK12-NEXT:  entry:
7670 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
7671 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
7672 // CHECK12-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
7673 // CHECK12-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
7674 // CHECK12-NEXT:    [[N_ADDR:%.*]] = alloca i32*, align 4
7675 // CHECK12-NEXT:    [[VLA_ADDR:%.*]] = alloca i32, align 4
7676 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca i32*, align 4
7677 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
7678 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7679 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7680 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
7681 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
7682 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
7683 // CHECK12-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7684 // CHECK12-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7685 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7686 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7687 // CHECK12-NEXT:    [[I4:%.*]] = alloca i32, align 4
7688 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
7689 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
7690 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
7691 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
7692 // CHECK12-NEXT:    store i32* [[N]], i32** [[N_ADDR]], align 4
7693 // CHECK12-NEXT:    store i32 [[VLA]], i32* [[VLA_ADDR]], align 4
7694 // CHECK12-NEXT:    store i32* [[A]], i32** [[A_ADDR]], align 4
7695 // CHECK12-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
7696 // CHECK12-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[N_ADDR]], align 4
7697 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[VLA_ADDR]], align 4
7698 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[A_ADDR]], align 4
7699 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP0]], align 4
7700 // CHECK12-NEXT:    store i32 [[TMP3]], i32* [[DOTCAPTURE_EXPR_1]], align 4
7701 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7702 // CHECK12-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0
7703 // CHECK12-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1
7704 // CHECK12-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1
7705 // CHECK12-NEXT:    store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4
7706 // CHECK12-NEXT:    store i32 0, i32* [[I]], align 4
7707 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
7708 // CHECK12-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
7709 // CHECK12-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
7710 // CHECK12:       omp.precond.then:
7711 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7712 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
7713 // CHECK12-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_UB]], align 4
7714 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
7715 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
7716 // CHECK12-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_LB]], align 4
7717 // CHECK12-NEXT:    store i32 [[TMP8]], i32* [[DOTOMP_UB]], align 4
7718 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7719 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7720 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7721 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4
7722 // CHECK12-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)
7723 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7724 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
7725 // CHECK12-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]
7726 // CHECK12-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7727 // CHECK12:       cond.true:
7728 // CHECK12-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4
7729 // CHECK12-NEXT:    br label [[COND_END:%.*]]
7730 // CHECK12:       cond.false:
7731 // CHECK12-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7732 // CHECK12-NEXT:    br label [[COND_END]]
7733 // CHECK12:       cond.end:
7734 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]
7735 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
7736 // CHECK12-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7737 // CHECK12-NEXT:    store i32 [[TMP15]], i32* [[DOTOMP_IV]], align 4
7738 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7739 // CHECK12:       omp.inner.for.cond:
7740 // CHECK12-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7741 // CHECK12-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7742 // CHECK12-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]
7743 // CHECK12-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7744 // CHECK12:       omp.inner.for.body:
7745 // CHECK12-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7746 // CHECK12-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1
7747 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7748 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[I4]], align 4
7749 // CHECK12-NEXT:    [[TMP19:%.*]] = load i32, i32* [[I4]], align 4
7750 // CHECK12-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i32 [[TMP19]]
7751 // CHECK12-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
7752 // CHECK12-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7753 // CHECK12:       omp.body.continue:
7754 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7755 // CHECK12:       omp.inner.for.inc:
7756 // CHECK12-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7757 // CHECK12-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP20]], 1
7758 // CHECK12-NEXT:    store i32 [[ADD7]], i32* [[DOTOMP_IV]], align 4
7759 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
7760 // CHECK12:       omp.inner.for.end:
7761 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7762 // CHECK12:       omp.loop.exit:
7763 // CHECK12-NEXT:    [[TMP21:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7764 // CHECK12-NEXT:    [[TMP22:%.*]] = load i32, i32* [[TMP21]], align 4
7765 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP22]])
7766 // CHECK12-NEXT:    br label [[OMP_PRECOND_END]]
7767 // CHECK12:       omp.precond.end:
7768 // CHECK12-NEXT:    ret void
7769 //
7770 //
7771 // CHECK12-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_
7772 // CHECK12-SAME: (i32 [[ARGC:%.*]]) #[[ATTR4:[0-9]+]] comdat {
7773 // CHECK12-NEXT:  entry:
7774 // CHECK12-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4
7775 // CHECK12-NEXT:    [[A:%.*]] = alloca [10 x i32], align 4
7776 // CHECK12-NEXT:    [[M:%.*]] = alloca i32, align 4
7777 // CHECK12-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 4
7778 // CHECK12-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 4
7779 // CHECK12-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 4
7780 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7781 // CHECK12-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 4
7782 // CHECK12-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 4
7783 // CHECK12-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 4
7784 // CHECK12-NEXT:    [[_TMP4:%.*]] = alloca i32, align 4
7785 // CHECK12-NEXT:    [[M_CASTED:%.*]] = alloca i32, align 4
7786 // CHECK12-NEXT:    [[DOTOFFLOAD_BASEPTRS7:%.*]] = alloca [2 x i8*], align 4
7787 // CHECK12-NEXT:    [[DOTOFFLOAD_PTRS8:%.*]] = alloca [2 x i8*], align 4
7788 // CHECK12-NEXT:    [[DOTOFFLOAD_MAPPERS9:%.*]] = alloca [2 x i8*], align 4
7789 // CHECK12-NEXT:    [[_TMP10:%.*]] = alloca i32, align 4
7790 // CHECK12-NEXT:    store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
7791 // CHECK12-NEXT:    store i32 10, i32* [[M]], align 4
7792 // CHECK12-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
7793 // CHECK12-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [10 x i32]**
7794 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP1]], align 4
7795 // CHECK12-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
7796 // CHECK12-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [10 x i32]**
7797 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP3]], align 4
7798 // CHECK12-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
7799 // CHECK12-NEXT:    store i8* null, i8** [[TMP4]], align 4
7800 // CHECK12-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
7801 // CHECK12-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
7802 // CHECK12-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
7803 // CHECK12-NEXT:    [[TMP7:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84.region_id, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.10, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
7804 // CHECK12-NEXT:    [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0
7805 // CHECK12-NEXT:    br i1 [[TMP8]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
7806 // CHECK12:       omp_offload.failed:
7807 // CHECK12-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84([10 x i32]* [[A]]) #[[ATTR3]]
7808 // CHECK12-NEXT:    br label [[OMP_OFFLOAD_CONT]]
7809 // CHECK12:       omp_offload.cont:
7810 // CHECK12-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
7811 // CHECK12-NEXT:    [[TMP10:%.*]] = bitcast i8** [[TMP9]] to [10 x i32]**
7812 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP10]], align 4
7813 // CHECK12-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
7814 // CHECK12-NEXT:    [[TMP12:%.*]] = bitcast i8** [[TMP11]] to [10 x i32]**
7815 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP12]], align 4
7816 // CHECK12-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i32 0, i32 0
7817 // CHECK12-NEXT:    store i8* null, i8** [[TMP13]], align 4
7818 // CHECK12-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
7819 // CHECK12-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
7820 // CHECK12-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
7821 // CHECK12-NEXT:    [[TMP16:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89.region_id, i32 1, i8** [[TMP14]], i8** [[TMP15]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.13, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.14, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
7822 // CHECK12-NEXT:    [[TMP17:%.*]] = icmp ne i32 [[TMP16]], 0
7823 // CHECK12-NEXT:    br i1 [[TMP17]], label [[OMP_OFFLOAD_FAILED5:%.*]], label [[OMP_OFFLOAD_CONT6:%.*]]
7824 // CHECK12:       omp_offload.failed5:
7825 // CHECK12-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89([10 x i32]* [[A]]) #[[ATTR3]]
7826 // CHECK12-NEXT:    br label [[OMP_OFFLOAD_CONT6]]
7827 // CHECK12:       omp_offload.cont6:
7828 // CHECK12-NEXT:    [[TMP18:%.*]] = load i32, i32* [[M]], align 4
7829 // CHECK12-NEXT:    store i32 [[TMP18]], i32* [[M_CASTED]], align 4
7830 // CHECK12-NEXT:    [[TMP19:%.*]] = load i32, i32* [[M_CASTED]], align 4
7831 // CHECK12-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
7832 // CHECK12-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32*
7833 // CHECK12-NEXT:    store i32 [[TMP19]], i32* [[TMP21]], align 4
7834 // CHECK12-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
7835 // CHECK12-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to i32*
7836 // CHECK12-NEXT:    store i32 [[TMP19]], i32* [[TMP23]], align 4
7837 // CHECK12-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i32 0, i32 0
7838 // CHECK12-NEXT:    store i8* null, i8** [[TMP24]], align 4
7839 // CHECK12-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 1
7840 // CHECK12-NEXT:    [[TMP26:%.*]] = bitcast i8** [[TMP25]] to [10 x i32]**
7841 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP26]], align 4
7842 // CHECK12-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 1
7843 // CHECK12-NEXT:    [[TMP28:%.*]] = bitcast i8** [[TMP27]] to [10 x i32]**
7844 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[TMP28]], align 4
7845 // CHECK12-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i32 0, i32 1
7846 // CHECK12-NEXT:    store i8* null, i8** [[TMP29]], align 4
7847 // CHECK12-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0
7848 // CHECK12-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0
7849 // CHECK12-NEXT:    call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i64 10)
7850 // CHECK12-NEXT:    [[TMP32:%.*]] = call i32 @__tgt_target_teams_mapper(%struct.ident_t* @[[GLOB3]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94.region_id, i32 2, i8** [[TMP30]], i8** [[TMP31]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.17, i32 0, i32 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.18, i32 0, i32 0), i8** null, i8** null, i32 0, i32 0)
7851 // CHECK12-NEXT:    [[TMP33:%.*]] = icmp ne i32 [[TMP32]], 0
7852 // CHECK12-NEXT:    br i1 [[TMP33]], label [[OMP_OFFLOAD_FAILED11:%.*]], label [[OMP_OFFLOAD_CONT12:%.*]]
7853 // CHECK12:       omp_offload.failed11:
7854 // CHECK12-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94(i32 [[TMP19]], [10 x i32]* [[A]]) #[[ATTR3]]
7855 // CHECK12-NEXT:    br label [[OMP_OFFLOAD_CONT12]]
7856 // CHECK12:       omp_offload.cont12:
7857 // CHECK12-NEXT:    ret i32 0
7858 //
7859 //
7860 // CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l84
7861 // CHECK12-SAME: ([10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
7862 // CHECK12-NEXT:  entry:
7863 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
7864 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
7865 // CHECK12-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
7866 // CHECK12-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..8 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
7867 // CHECK12-NEXT:    ret void
7868 //
7869 //
7870 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..8
7871 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
7872 // CHECK12-NEXT:  entry:
7873 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
7874 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
7875 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
7876 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7877 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7878 // CHECK12-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
7879 // CHECK12-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
7880 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7881 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7882 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
7883 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
7884 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
7885 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
7886 // CHECK12-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
7887 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
7888 // CHECK12-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
7889 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7890 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7891 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7892 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
7893 // CHECK12-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)
7894 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7895 // CHECK12-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
7896 // CHECK12-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7897 // CHECK12:       cond.true:
7898 // CHECK12-NEXT:    br label [[COND_END:%.*]]
7899 // CHECK12:       cond.false:
7900 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7901 // CHECK12-NEXT:    br label [[COND_END]]
7902 // CHECK12:       cond.end:
7903 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
7904 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
7905 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7906 // CHECK12-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
7907 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7908 // CHECK12:       omp.inner.for.cond:
7909 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7910 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7911 // CHECK12-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
7912 // CHECK12-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7913 // CHECK12:       omp.inner.for.body:
7914 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
7915 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
7916 // CHECK12-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..9 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]])
7917 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7918 // CHECK12:       omp.inner.for.inc:
7919 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7920 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
7921 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
7922 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
7923 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
7924 // CHECK12:       omp.inner.for.end:
7925 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
7926 // CHECK12:       omp.loop.exit:
7927 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
7928 // CHECK12-NEXT:    ret void
7929 //
7930 //
7931 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..9
7932 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
7933 // CHECK12-NEXT:  entry:
7934 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
7935 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
7936 // CHECK12-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
7937 // CHECK12-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
7938 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
7939 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
7940 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
7941 // CHECK12-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
7942 // CHECK12-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
7943 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7944 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7945 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
7946 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
7947 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
7948 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
7949 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
7950 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
7951 // CHECK12-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
7952 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
7953 // CHECK12-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
7954 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
7955 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
7956 // CHECK12-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
7957 // CHECK12-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
7958 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
7959 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
7960 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
7961 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
7962 // CHECK12-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)
7963 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7964 // CHECK12-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
7965 // CHECK12-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7966 // CHECK12:       cond.true:
7967 // CHECK12-NEXT:    br label [[COND_END:%.*]]
7968 // CHECK12:       cond.false:
7969 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7970 // CHECK12-NEXT:    br label [[COND_END]]
7971 // CHECK12:       cond.end:
7972 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
7973 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
7974 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
7975 // CHECK12-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
7976 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
7977 // CHECK12:       omp.inner.for.cond:
7978 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7979 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
7980 // CHECK12-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
7981 // CHECK12-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7982 // CHECK12:       omp.inner.for.body:
7983 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7984 // CHECK12-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
7985 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7986 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
7987 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
7988 // CHECK12-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
7989 // CHECK12-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
7990 // CHECK12-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
7991 // CHECK12:       omp.body.continue:
7992 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
7993 // CHECK12:       omp.inner.for.inc:
7994 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
7995 // CHECK12-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
7996 // CHECK12-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
7997 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
7998 // CHECK12:       omp.inner.for.end:
7999 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8000 // CHECK12:       omp.loop.exit:
8001 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
8002 // CHECK12-NEXT:    ret void
8003 //
8004 //
8005 // CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l89
8006 // CHECK12-SAME: ([10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
8007 // CHECK12-NEXT:  entry:
8008 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
8009 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
8010 // CHECK12-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
8011 // CHECK12-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..11 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]])
8012 // CHECK12-NEXT:    ret void
8013 //
8014 //
8015 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..11
8016 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
8017 // CHECK12-NEXT:  entry:
8018 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
8019 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
8020 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
8021 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8022 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8023 // CHECK12-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8024 // CHECK12-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8025 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8026 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8027 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
8028 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
8029 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
8030 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
8031 // CHECK12-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
8032 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8033 // CHECK12-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
8034 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8035 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8036 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
8037 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32, i32* [[TMP1]], align 4
8038 // CHECK12-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)
8039 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8040 // CHECK12-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9
8041 // CHECK12-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8042 // CHECK12:       cond.true:
8043 // CHECK12-NEXT:    br label [[COND_END:%.*]]
8044 // CHECK12:       cond.false:
8045 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8046 // CHECK12-NEXT:    br label [[COND_END]]
8047 // CHECK12:       cond.end:
8048 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]
8049 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8050 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8051 // CHECK12-NEXT:    store i32 [[TMP5]], i32* [[DOTOMP_IV]], align 4
8052 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8053 // CHECK12:       omp.inner.for.cond:
8054 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8055 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8056 // CHECK12-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
8057 // CHECK12-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8058 // CHECK12:       omp.inner.for.body:
8059 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8060 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8061 // CHECK12-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..12 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]])
8062 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8063 // CHECK12:       omp.inner.for.inc:
8064 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8065 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8066 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP10]], [[TMP11]]
8067 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
8068 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
8069 // CHECK12:       omp.inner.for.end:
8070 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8071 // CHECK12:       omp.loop.exit:
8072 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]])
8073 // CHECK12-NEXT:    ret void
8074 //
8075 //
8076 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..12
8077 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
8078 // CHECK12-NEXT:  entry:
8079 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
8080 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
8081 // CHECK12-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
8082 // CHECK12-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
8083 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
8084 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8085 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8086 // CHECK12-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
8087 // CHECK12-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
8088 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8089 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8090 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
8091 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
8092 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
8093 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
8094 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
8095 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
8096 // CHECK12-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
8097 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
8098 // CHECK12-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
8099 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
8100 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
8101 // CHECK12-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
8102 // CHECK12-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
8103 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8104 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8105 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
8106 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
8107 // CHECK12-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)
8108 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8109 // CHECK12-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
8110 // CHECK12-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8111 // CHECK12:       cond.true:
8112 // CHECK12-NEXT:    br label [[COND_END:%.*]]
8113 // CHECK12:       cond.false:
8114 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8115 // CHECK12-NEXT:    br label [[COND_END]]
8116 // CHECK12:       cond.end:
8117 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
8118 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
8119 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8120 // CHECK12-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
8121 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8122 // CHECK12:       omp.inner.for.cond:
8123 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8124 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8125 // CHECK12-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
8126 // CHECK12-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8127 // CHECK12:       omp.inner.for.body:
8128 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8129 // CHECK12-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
8130 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8131 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
8132 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
8133 // CHECK12-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
8134 // CHECK12-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
8135 // CHECK12-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
8136 // CHECK12:       omp.body.continue:
8137 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8138 // CHECK12:       omp.inner.for.inc:
8139 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8140 // CHECK12-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
8141 // CHECK12-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
8142 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
8143 // CHECK12:       omp.inner.for.end:
8144 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8145 // CHECK12:       omp.loop.exit:
8146 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
8147 // CHECK12-NEXT:    ret void
8148 //
8149 //
8150 // CHECK12-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l94
8151 // CHECK12-SAME: (i32 [[M:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {
8152 // CHECK12-NEXT:  entry:
8153 // CHECK12-NEXT:    [[M_ADDR:%.*]] = alloca i32, align 4
8154 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
8155 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
8156 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
8157 // CHECK12-NEXT:    store i32 [[M]], i32* [[M_ADDR]], align 4
8158 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
8159 // CHECK12-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
8160 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[M_ADDR]], align 4
8161 // CHECK12-NEXT:    store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4
8162 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
8163 // CHECK12-NEXT:    store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
8164 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
8165 // CHECK12-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..15 to void (i32*, i32*, ...)*), [10 x i32]* [[TMP0]], i32 [[TMP3]])
8166 // CHECK12-NEXT:    ret void
8167 //
8168 //
8169 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..15
8170 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
8171 // CHECK12-NEXT:  entry:
8172 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
8173 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
8174 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
8175 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
8176 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8177 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8178 // CHECK12-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4
8179 // CHECK12-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4
8180 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8181 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8182 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
8183 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 4
8184 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
8185 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
8186 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
8187 // CHECK12-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
8188 // CHECK12-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
8189 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_COMB_LB]], align 4
8190 // CHECK12-NEXT:    store i32 9, i32* [[DOTOMP_COMB_UB]], align 4
8191 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8192 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8193 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
8194 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
8195 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
8196 // CHECK12-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i32 91, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 [[TMP1]])
8197 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8198 // CHECK12-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 9
8199 // CHECK12-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8200 // CHECK12:       cond.true:
8201 // CHECK12-NEXT:    br label [[COND_END:%.*]]
8202 // CHECK12:       cond.false:
8203 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8204 // CHECK12-NEXT:    br label [[COND_END]]
8205 // CHECK12:       cond.end:
8206 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]
8207 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4
8208 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8209 // CHECK12-NEXT:    store i32 [[TMP6]], i32* [[DOTOMP_IV]], align 4
8210 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8211 // CHECK12:       omp.inner.for.cond:
8212 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8213 // CHECK12-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[TMP7]], 10
8214 // CHECK12-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8215 // CHECK12:       omp.inner.for.body:
8216 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8217 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8218 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
8219 // CHECK12-NEXT:    store i32 [[TMP10]], i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
8220 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR__CASTED]], align 4
8221 // CHECK12-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..16 to void (i32*, i32*, ...)*), i32 [[TMP8]], i32 [[TMP9]], [10 x i32]* [[TMP0]], i32 [[TMP11]])
8222 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8223 // CHECK12:       omp.inner.for.inc:
8224 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8225 // CHECK12-NEXT:    [[TMP13:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8226 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
8227 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4
8228 // CHECK12-NEXT:    [[TMP14:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8229 // CHECK12-NEXT:    [[TMP15:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8230 // CHECK12-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]
8231 // CHECK12-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_COMB_LB]], align 4
8232 // CHECK12-NEXT:    [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8233 // CHECK12-NEXT:    [[TMP17:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4
8234 // CHECK12-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]
8235 // CHECK12-NEXT:    store i32 [[ADD3]], i32* [[DOTOMP_COMB_UB]], align 4
8236 // CHECK12-NEXT:    [[TMP18:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8237 // CHECK12-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 9
8238 // CHECK12-NEXT:    br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]
8239 // CHECK12:       cond.true5:
8240 // CHECK12-NEXT:    br label [[COND_END7:%.*]]
8241 // CHECK12:       cond.false6:
8242 // CHECK12-NEXT:    [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4
8243 // CHECK12-NEXT:    br label [[COND_END7]]
8244 // CHECK12:       cond.end7:
8245 // CHECK12-NEXT:    [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]
8246 // CHECK12-NEXT:    store i32 [[COND8]], i32* [[DOTOMP_COMB_UB]], align 4
8247 // CHECK12-NEXT:    [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4
8248 // CHECK12-NEXT:    store i32 [[TMP20]], i32* [[DOTOMP_IV]], align 4
8249 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
8250 // CHECK12:       omp.inner.for.end:
8251 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8252 // CHECK12:       omp.loop.exit:
8253 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]])
8254 // CHECK12-NEXT:    ret void
8255 //
8256 //
8257 // CHECK12-LABEL: define {{[^@]+}}@.omp_outlined..16
8258 // CHECK12-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32 [[DOTPREVIOUS_LB_:%.*]], i32 [[DOTPREVIOUS_UB_:%.*]], [10 x i32]* nonnull align 4 dereferenceable(40) [[A:%.*]], i32 [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {
8259 // CHECK12-NEXT:  entry:
8260 // CHECK12-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4
8261 // CHECK12-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4
8262 // CHECK12-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4
8263 // CHECK12-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4
8264 // CHECK12-NEXT:    [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4
8265 // CHECK12-NEXT:    [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 4
8266 // CHECK12-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4
8267 // CHECK12-NEXT:    [[TMP:%.*]] = alloca i32, align 4
8268 // CHECK12-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
8269 // CHECK12-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
8270 // CHECK12-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8271 // CHECK12-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8272 // CHECK12-NEXT:    [[I:%.*]] = alloca i32, align 4
8273 // CHECK12-NEXT:    store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4
8274 // CHECK12-NEXT:    store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4
8275 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4
8276 // CHECK12-NEXT:    store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4
8277 // CHECK12-NEXT:    store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4
8278 // CHECK12-NEXT:    store i32 [[DOTCAPTURE_EXPR_]], i32* [[DOTCAPTURE_EXPR__ADDR]], align 4
8279 // CHECK12-NEXT:    [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4
8280 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
8281 // CHECK12-NEXT:    store i32 9, i32* [[DOTOMP_UB]], align 4
8282 // CHECK12-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4
8283 // CHECK12-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4
8284 // CHECK12-NEXT:    store i32 [[TMP1]], i32* [[DOTOMP_LB]], align 4
8285 // CHECK12-NEXT:    store i32 [[TMP2]], i32* [[DOTOMP_UB]], align 4
8286 // CHECK12-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
8287 // CHECK12-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
8288 // CHECK12-NEXT:    [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4
8289 // CHECK12-NEXT:    [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
8290 // CHECK12-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)
8291 // CHECK12-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8292 // CHECK12-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9
8293 // CHECK12-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8294 // CHECK12:       cond.true:
8295 // CHECK12-NEXT:    br label [[COND_END:%.*]]
8296 // CHECK12:       cond.false:
8297 // CHECK12-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8298 // CHECK12-NEXT:    br label [[COND_END]]
8299 // CHECK12:       cond.end:
8300 // CHECK12-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]
8301 // CHECK12-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
8302 // CHECK12-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
8303 // CHECK12-NEXT:    store i32 [[TMP7]], i32* [[DOTOMP_IV]], align 4
8304 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
8305 // CHECK12:       omp.inner.for.cond:
8306 // CHECK12-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8307 // CHECK12-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
8308 // CHECK12-NEXT:    [[CMP1:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]
8309 // CHECK12-NEXT:    br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8310 // CHECK12:       omp.inner.for.body:
8311 // CHECK12-NEXT:    [[TMP10:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8312 // CHECK12-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP10]], 1
8313 // CHECK12-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8314 // CHECK12-NEXT:    store i32 [[ADD]], i32* [[I]], align 4
8315 // CHECK12-NEXT:    [[TMP11:%.*]] = load i32, i32* [[I]], align 4
8316 // CHECK12-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 [[TMP11]]
8317 // CHECK12-NEXT:    store i32 0, i32* [[ARRAYIDX]], align 4
8318 // CHECK12-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
8319 // CHECK12:       omp.body.continue:
8320 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]
8321 // CHECK12:       omp.inner.for.inc:
8322 // CHECK12-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
8323 // CHECK12-NEXT:    [[ADD2:%.*]] = add nsw i32 [[TMP12]], 1
8324 // CHECK12-NEXT:    store i32 [[ADD2]], i32* [[DOTOMP_IV]], align 4
8325 // CHECK12-NEXT:    br label [[OMP_INNER_FOR_COND]]
8326 // CHECK12:       omp.inner.for.end:
8327 // CHECK12-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
8328 // CHECK12:       omp.loop.exit:
8329 // CHECK12-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]])
8330 // CHECK12-NEXT:    ret void
8331 //
8332 //
8333 // CHECK12-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg
8334 // CHECK12-SAME: () #[[ATTR5:[0-9]+]] {
8335 // CHECK12-NEXT:  entry:
8336 // CHECK12-NEXT:    call void @__tgt_register_requires(i64 1)
8337 // CHECK12-NEXT:    ret void
8338 //
8339 //