3816 lines · cpp
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// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK13// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s4// RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK15 6// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK37// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s8// RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK39// expected-no-diagnostics10#ifndef HEADER11#define HEADER12 13enum omp_allocator_handle_t {14 omp_null_allocator = 0,15 omp_default_mem_alloc = 1,16 omp_large_cap_mem_alloc = 2,17 omp_const_mem_alloc = 3,18 omp_high_bw_mem_alloc = 4,19 omp_low_lat_mem_alloc = 5,20 omp_cgroup_mem_alloc = 6,21 omp_pteam_mem_alloc = 7,22 omp_thread_mem_alloc = 8,23 KMP_ALLOCATOR_MAX_HANDLE = __UINTPTR_MAX__24};25 26volatile double g, g_orig;27volatile double &g1 = g_orig;28 29struct BaseS {30 int x;31};32struct BaseS1 {33 float y;34};35 36template <class T>37struct S : public BaseS, public BaseS1 {38 T f;39 S(T a) : f(a + g) {}40 S() : f(g) {}41 S& operator=(const S&);42 ~S() {}43};44void red(BaseS1&, const BaseS1&);45void red_plus(BaseS1&, const BaseS1&);46void init(BaseS1&, const BaseS1&);47void init1(BaseS1&, const BaseS1&);48void init2(BaseS1&, const BaseS1&);49void init_plus(BaseS1&, const BaseS1&);50#pragma omp declare reduction(operator& : BaseS1 : red(omp_out, omp_in)) initializer(init(omp_priv, omp_orig))51#pragma omp declare reduction(+ : BaseS1 : red_plus(omp_out, omp_in)) initializer(init_plus(omp_priv, omp_orig))52#pragma omp declare reduction(&& : S<float>, S<int> : omp_out.f *= omp_in.f) initializer(init1(omp_priv, omp_orig))53 54 55#pragma omp declare reduction(operator* : S<int> : omp_out.f = 17 * omp_in.f) initializer(omp_priv = S<int>())56void bazz() {57 S<int> s;58#pragma omp parallel59#pragma omp simd reduction(*: s)60 for (int I = 0; I < 10; ++I)61 ;62}63 64 65 66#pragma omp declare reduction(operator&& : int : omp_out = 111 & omp_in)67template <typename T, int length>68T tmain() {69 T t;70 S<T> test;71 T t_var = T(), t_var1;72 T vec[] = {1, 2};73 S<T> s_arr[] = {1, 2};74 S<T> &var = test;75 S<T> var1;76 S<T> arr[length];77#pragma omp declare reduction(operator& : T : omp_out = 15 + omp_in)78#pragma omp declare reduction(operator+ : T : omp_out = 1513 + omp_in) initializer(omp_priv = 321)79#pragma omp declare reduction(min : T : omp_out = 47 - omp_in) initializer(omp_priv = 432 / omp_orig)80#pragma omp declare reduction(operator&& : S<T> : omp_out.f = 17 * omp_in.f) initializer(init2(omp_priv, omp_orig))81#pragma omp declare reduction(operator&& : T : omp_out = 17 * omp_in)82#pragma omp parallel83#pragma omp for reduction(+ : t_var) reduction(& : var) reduction(&& : var1) reduction(min : t_var1) nowait84 for (int i = 0; i < 2; ++i) {85 vec[i] = t_var;86 s_arr[i] = var;87 }88#pragma omp parallel89#pragma omp for reduction(&& : t_var)90 for (int i = 0; i < 2; ++i) {91 vec[i] = t_var;92 s_arr[i] = var;93 }94#pragma omp parallel95#pragma omp for reduction(+ : arr[1:length-2])96 for (int i = 0; i < 2; ++i) {97 vec[i] = t_var;98 s_arr[i] = var;99 }100 return T();101}102 103extern S<float> **foo();104 105#pragma omp declare reduction(operator- : float, double : omp_out = 333 + omp_in)106#pragma omp declare reduction(min : float, double : omp_out = 555 + omp_in)107int main() {108#pragma omp declare reduction(operator+ : float, double : omp_out = 222 - omp_in) initializer(omp_priv = -1)109 S<float> test;110 float t_var = 0, t_var1;111 int vec[] = {1, 2};112 S<float> s_arr[] = {1, 2, 3, 4};113 S<float> &var = test;114 S<float> var1, arrs[10][4];115 S<float> **var2 = foo();116 S<float> vvar2[5];117 S<float>(&var3)[4] = s_arr;118#pragma omp declare reduction(operator+ : int : omp_out = 555 * omp_in) initializer(omp_priv = 888)119#pragma omp parallel120#pragma omp for reduction(+ : t_var) reduction(& : var) reduction(&& : var1) reduction(min : t_var1)121 for (int i = 0; i < 2; ++i) {122 vec[i] = t_var;123 s_arr[i] = var;124 }125 int arr[10][vec[1]];126#pragma omp parallel for reduction(+ : arr[1][ : vec[1]]) reduction(& : arrs[1 : vec[1]][1 : 2])127 for (int i = 0; i < 10; ++i)128 ++arr[1][i];129#pragma omp parallel130#pragma omp for reduction(+ : arr) reduction(& : arrs)131 for (int i = 0; i < 10; ++i)132 ++arr[1][i];133#pragma omp parallel134#pragma omp for reduction(& : var2[0 : 5][1 : 6])135 for (int i = 0; i < 10; ++i)136 ;137#pragma omp parallel138#pragma omp for reduction(& : vvar2[0 : 5])139 for (int i = 0; i < 10; ++i)140 ;141#pragma omp parallel142#pragma omp for reduction(& : var3[1 : 2])143 for (int i = 0; i < 10; ++i)144 ;145#pragma omp parallel146#pragma omp for reduction(& : var3) allocate(omp_cgroup_mem_alloc: var3)147 for (int i = 0; i < 10; ++i)148 ;149 return tmain<int, 42>();150}151 152 153// Reduction list for runtime.154 155 156 157// For + reduction operation initial value of private variable is -1.158 159// For & reduction operation initial value of private variable is defined by call of 'init()' function.160 161// For && reduction operation initial value of private variable is 1.0.162 163// For min reduction operation initial value of private variable is largest repesentable value.164 165// Skip checks for internal operations.166 167// ptr RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};168 169 170// res = __kmpc_reduce(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);171 172 173// switch(res)174 175// case 1:176// t_var += t_var_reduction;177 178// var = var.operator &(var_reduction);179 180// var1 = var1.operator &&(var1_reduction);181 182// t_var1 = min(t_var1, t_var1_reduction);183 184// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);185 186// break;187 188// case 2:189// t_var += t_var_reduction;190 191// var = var.operator &(var_reduction);192 193// var1 = var1.operator &&(var1_reduction);194 195// t_var1 = min(t_var1, t_var1_reduction);196 197// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);198 199// break;200 201 202 203 204 205 206 207 208// void reduce_func(ptr lhs[<n>], ptr rhs[<n>]) {209// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);210// ...211// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],212// *(Type<n>-1*)rhs[<n>-1]);213// }214// t_var_lhs = (ptr)lhs[0];215// t_var_rhs = (ptr)rhs[0];216 217// var_lhs = (Sptr)lhs[1];218// var_rhs = (Sptr)rhs[1];219 220// var1_lhs = (Sptr)lhs[2];221// var1_rhs = (Sptr)rhs[2];222 223// t_var1_lhs = (ptr)lhs[3];224// t_var1_rhs = (ptr)rhs[3];225 226// t_var_lhs += t_var_rhs;227 228// var_lhs = var_lhs.operator &(var_rhs);229 230// var1_lhs = var1_lhs.operator &&(var1_rhs);231 232// t_var1_lhs = min(t_var1_lhs, t_var1_rhs);233 234 235 236// Reduction list for runtime.237 238 239 240// Check initialization of private copy.241 242 243// Check initialization of private copy.244 245// Skip checks for internal operations.246 247// ptr RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};248 249 250// res = __kmpc_reduce(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);251 252 253// switch(res)254 255// case 1:256 257// arr[:] += arr_reduction[:];258 259// arrs[:] = var.operator &(arrs_reduction[:]);260 261// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);262 263// break;264 265// case 2:266 267// arr[:] += arr_reduction[:];268 269// arrs[:] = var.operator &(arrs_reduction[:]);270 271// break;272 273// Check destruction of private copy.274 275 276 277 278// void reduce_func(ptr lhs[<n>], ptr rhs[<n>]) {279// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);280// ...281// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],282// *(Type<n>-1*)rhs[<n>-1]);283// }284// arr_rhs = (int*)rhs[0];285// arr_lhs = (int*)lhs[0];286 287// arr_size = (size_t)lhs[1];288 289// arrs_rhs = (Sptr)rhs[2];290// arrs_lhs = (Sptr)lhs[2];291 292// arrs_size = (size_t)lhs[3];293 294// arr_lhs[:] += arr_rhs[:];295 296// arrs_lhs = arrs_lhs.operator &(arrs_rhs);297 298 299 300 301// Reduction list for runtime.302 303 304 305// Check initialization of private copy.306 307// Check initialization of private copy.308 309 310// Skip checks for internal operations.311 312// ptr RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};313 314 315// res = __kmpc_reduce(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);316 317 318// switch(res)319 320// case 1:321 322// arr[:] += arr_reduction[:];323 324// arrs[:] = var.operator &(arrs_reduction[:]);325 326// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);327 328// break;329 330// case 2:331 332// arr[:] += arr_reduction[:];333 334// arrs[:] = var.operator &(arrs_reduction[:]);335 336// break;337 338// Check destruction of private copy.339 340 341// void reduce_func(ptr lhs[<n>], ptr rhs[<n>]) {342// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);343// ...344// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],345// *(Type<n>-1*)rhs[<n>-1]);346// }347// arr_rhs = (int*)rhs[0];348// arr_lhs = (int*)lhs[0];349 350// arr_size = (size_t)lhs[1];351 352// arrs_rhs = (Sptr)rhs[2];353// arrs_lhs = (Sptr)lhs[2];354 355// arr_lhs[:] += arr_rhs[:];356 357// arrs_lhs = arrs_lhs.operator &(arrs_rhs);358 359 360 361 362// Reduction list for runtime.363 364 365 366 367 368// Reduction list for runtime.369 370 371 372 373 374// Reduction list for runtime.375 376 377 378 379 380 381 382 383 384// Reduction list for runtime.385 386 387 388 389// Not interested in this one:390 391// Reduction list for runtime.392 393 394 395// For + reduction operation initial value of private variable is 0.396 397// For & reduction operation initial value of private variable is ones in all bits.398 399// For && reduction operation initial value of private variable is 1.0.400 401// For min reduction operation initial value of private variable is largest repesentable value.402 403// Skip checks for internal operations.404 405// ptr RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};406 407 408// res = __kmpc_reduce_nowait(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);409 410 411// switch(res)412 413// case 1:414// t_var += t_var_reduction;415 416// var = var.operator &(var_reduction);417 418// var1 = var1.operator &&(var1_reduction);419 420// t_var1 = min(t_var1, t_var1_reduction);421 422// __kmpc_end_reduce_nowait(<loc>, <gtid>, &<lock>);423 424// break;425 426// case 2:427// t_var += t_var_reduction;428 429// var = var.operator &(var_reduction);430 431// var1 = var1.operator &&(var1_reduction);432 433// t_var1 = min(t_var1, t_var1_reduction);434 435// break;436 437 438 439 440 441 442 443// void reduce_func(ptr lhs[<n>], ptr rhs[<n>]) {444// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);445// ...446// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],447// *(Type<n>-1*)rhs[<n>-1]);448// }449// t_var_lhs = (iptr)lhs[0];450// t_var_rhs = (iptr)rhs[0];451 452// var_lhs = (Sptr)lhs[1];453// var_rhs = (Sptr)rhs[1];454 455// var1_lhs = (Sptr)lhs[2];456// var1_rhs = (Sptr)rhs[2];457 458// t_var1_lhs = (iptr)lhs[3];459// t_var1_rhs = (iptr)rhs[3];460 461// t_var_lhs += t_var_rhs;462 463// var_lhs = var_lhs.operator &(var_rhs);464 465// var1_lhs = var1_lhs.operator &&(var1_rhs);466 467// t_var1_lhs = min(t_var1_lhs, t_var1_rhs);468 469 470 471// Reduction list for runtime.472 473 474 475 476#endif477 478// CHECK1-LABEL: define {{[^@]+}}@_Z4bazzv479// CHECK1-SAME: () #[[ATTR0:[0-9]+]] {480// CHECK1-NEXT: entry:481// CHECK1-NEXT: [[S:%.*]] = alloca [[STRUCT_S:%.*]], align 4482// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[S]])483// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1:[0-9]+]], i32 1, ptr @_Z4bazzv.omp_outlined, ptr [[S]])484// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[S]]) #[[ATTR3:[0-9]+]]485// CHECK1-NEXT: ret void486//487//488// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ev489// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {490// CHECK1-NEXT: entry:491// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8492// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8493// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8494// CHECK1-NEXT: call void @_ZN1SIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]])495// CHECK1-NEXT: ret void496//497//498// CHECK1-LABEL: define {{[^@]+}}@_Z4bazzv.omp_outlined499// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(12) [[S:%.*]]) #[[ATTR1:[0-9]+]] {500// CHECK1-NEXT: entry:501// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8502// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8503// CHECK1-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8504// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4505// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4506// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4507// CHECK1-NEXT: [[S1:%.*]] = alloca [[STRUCT_S:%.*]], align 4508// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8509// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8510// CHECK1-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8511// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8512// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IV]], align 4513// CHECK1-NEXT: call void @.omp_initializer.(ptr noundef [[S1]], ptr noundef [[TMP0]])514// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]515// CHECK1: omp.inner.for.cond:516// CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3:![0-9]+]]517// CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 10518// CHECK1-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]519// CHECK1: omp.inner.for.cond.cleanup:520// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]521// CHECK1: omp.inner.for.body:522// CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]523// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP2]], 1524// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]525// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP3]]526// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]527// CHECK1: omp.body.continue:528// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]529// CHECK1: omp.inner.for.inc:530// CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]531// CHECK1-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP3]], 1532// CHECK1-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]533// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]534// CHECK1: omp.inner.for.end:535// CHECK1-NEXT: store i32 10, ptr [[I]], align 4536// CHECK1-NEXT: call void @.omp_combiner.(ptr noundef [[TMP0]], ptr noundef [[S1]])537// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[S1]]) #[[ATTR3]]538// CHECK1-NEXT: ret void539//540//541// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner.542// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2:[0-9]+]] {543// CHECK1-NEXT: entry:544// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8545// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8546// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8547// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8548// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8549// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8550// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[TMP2]], i32 0, i32 2551// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[F]], align 4552// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 17, [[TMP4]]553// CHECK1-NEXT: [[F2:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[TMP3]], i32 0, i32 2554// CHECK1-NEXT: store i32 [[MUL]], ptr [[F2]], align 4555// CHECK1-NEXT: ret void556//557//558// CHECK1-LABEL: define {{[^@]+}}@.omp_initializer.559// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {560// CHECK1-NEXT: entry:561// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8562// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8563// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8564// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8565// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8566// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8567// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TMP3]])568// CHECK1-NEXT: ret void569//570//571// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiED1Ev572// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {573// CHECK1-NEXT: entry:574// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8575// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8576// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8577// CHECK1-NEXT: call void @_ZN1SIiED2Ev(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]]) #[[ATTR3]]578// CHECK1-NEXT: ret void579//580//581// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ev582// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {583// CHECK1-NEXT: entry:584// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8585// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8586// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8587// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[THIS1]], i64 4588// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 2589// CHECK1-NEXT: [[TMP1:%.*]] = load volatile double, ptr @g, align 8590// CHECK1-NEXT: [[CONV:%.*]] = fptosi double [[TMP1]] to i32591// CHECK1-NEXT: store i32 [[CONV]], ptr [[F]], align 4592// CHECK1-NEXT: ret void593//594//595// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiED2Ev596// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {597// CHECK1-NEXT: entry:598// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8599// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8600// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8601// CHECK1-NEXT: ret void602//603//604// CHECK1-LABEL: define {{[^@]+}}@main605// CHECK1-SAME: () #[[ATTR4:[0-9]+]] {606// CHECK1-NEXT: entry:607// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4608// CHECK1-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S_0:%.*]], align 4609// CHECK1-NEXT: [[T_VAR:%.*]] = alloca float, align 4610// CHECK1-NEXT: [[T_VAR1:%.*]] = alloca float, align 4611// CHECK1-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 4612// CHECK1-NEXT: [[S_ARR:%.*]] = alloca [4 x %struct.S.0], align 16613// CHECK1-NEXT: [[VAR:%.*]] = alloca ptr, align 8614// CHECK1-NEXT: [[VAR1:%.*]] = alloca [[STRUCT_S_0]], align 4615// CHECK1-NEXT: [[ARRS:%.*]] = alloca [10 x [4 x %struct.S.0]], align 16616// CHECK1-NEXT: [[VAR2:%.*]] = alloca ptr, align 8617// CHECK1-NEXT: [[VVAR2:%.*]] = alloca [5 x %struct.S.0], align 16618// CHECK1-NEXT: [[VAR3:%.*]] = alloca ptr, align 8619// CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 8620// CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8621// CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 4622// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TEST]])623// CHECK1-NEXT: store float 0.000000e+00, ptr [[T_VAR]], align 4624// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const.main.vec, i64 8, i1 false)625// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(12) [[S_ARR]], float noundef 1.000000e+00)626// CHECK1-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 1627// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYINIT_ELEMENT]], float noundef 2.000000e+00)628// CHECK1-NEXT: [[ARRAYINIT_ELEMENT1:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 2629// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYINIT_ELEMENT1]], float noundef 3.000000e+00)630// CHECK1-NEXT: [[ARRAYINIT_ELEMENT2:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 3631// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYINIT_ELEMENT2]], float noundef 4.000000e+00)632// CHECK1-NEXT: store ptr [[TEST]], ptr [[VAR]], align 8633// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR1]])634// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [10 x [4 x %struct.S.0]], ptr [[ARRS]], i32 0, i32 0, i32 0635// CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 40636// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]637// CHECK1: arrayctor.loop:638// CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]639// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYCTOR_CUR]])640// CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i64 1641// CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]642// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]643// CHECK1: arrayctor.cont:644// CHECK1-NEXT: [[CALL:%.*]] = call noundef ptr @_Z3foov()645// CHECK1-NEXT: store ptr [[CALL]], ptr [[VAR2]], align 8646// CHECK1-NEXT: [[ARRAY_BEGIN3:%.*]] = getelementptr inbounds [5 x %struct.S.0], ptr [[VVAR2]], i32 0, i32 0647// CHECK1-NEXT: [[ARRAYCTOR_END4:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN3]], i64 5648// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP5:%.*]]649// CHECK1: arrayctor.loop5:650// CHECK1-NEXT: [[ARRAYCTOR_CUR6:%.*]] = phi ptr [ [[ARRAY_BEGIN3]], [[ARRAYCTOR_CONT]] ], [ [[ARRAYCTOR_NEXT7:%.*]], [[ARRAYCTOR_LOOP5]] ]651// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYCTOR_CUR6]])652// CHECK1-NEXT: [[ARRAYCTOR_NEXT7]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR6]], i64 1653// CHECK1-NEXT: [[ARRAYCTOR_DONE8:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT7]], [[ARRAYCTOR_END4]]654// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE8]], label [[ARRAYCTOR_CONT9:%.*]], label [[ARRAYCTOR_LOOP5]]655// CHECK1: arrayctor.cont9:656// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[VAR3]], align 8657// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 8658// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 6, ptr @main.omp_outlined, ptr [[T_VAR]], ptr [[TMP0]], ptr [[VAR1]], ptr [[T_VAR1]], ptr [[VEC]], ptr [[S_ARR]])659// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i64 0, i64 1660// CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4661// CHECK1-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64662// CHECK1-NEXT: [[TMP3:%.*]] = call ptr @llvm.stacksave.p0()663// CHECK1-NEXT: store ptr [[TMP3]], ptr [[SAVED_STACK]], align 8664// CHECK1-NEXT: [[TMP4:%.*]] = mul nuw i64 10, [[TMP2]]665// CHECK1-NEXT: [[VLA:%.*]] = alloca i32, i64 [[TMP4]], align 16666// CHECK1-NEXT: store i64 [[TMP2]], ptr [[__VLA_EXPR0]], align 8667// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 5, ptr @main.omp_outlined.8, i64 10, i64 [[TMP2]], ptr [[VLA]], ptr [[VEC]], ptr [[ARRS]])668// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @main.omp_outlined.11, i64 10, i64 [[TMP2]], ptr [[VLA]], ptr [[ARRS]])669// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @main.omp_outlined.12, ptr [[VAR2]])670// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @main.omp_outlined.13, ptr [[VVAR2]])671// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[VAR3]], align 8672// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @main.omp_outlined.14, ptr [[TMP5]])673// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[VAR3]], align 8674// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @main.omp_outlined.15, ptr [[TMP6]])675// CHECK1-NEXT: [[CALL10:%.*]] = call noundef i32 @_Z5tmainIiLi42EET_v()676// CHECK1-NEXT: store i32 [[CALL10]], ptr [[RETVAL]], align 4677// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[SAVED_STACK]], align 8678// CHECK1-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP7]])679// CHECK1-NEXT: [[ARRAY_BEGIN11:%.*]] = getelementptr inbounds [5 x %struct.S.0], ptr [[VVAR2]], i32 0, i32 0680// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN11]], i64 5681// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]682// CHECK1: arraydestroy.body:683// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP8]], [[ARRAYCTOR_CONT9]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]684// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1685// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]686// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN11]]687// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE12:%.*]], label [[ARRAYDESTROY_BODY]]688// CHECK1: arraydestroy.done12:689// CHECK1-NEXT: [[ARRAY_BEGIN13:%.*]] = getelementptr inbounds [10 x [4 x %struct.S.0]], ptr [[ARRS]], i32 0, i32 0, i32 0690// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN13]], i64 40691// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY14:%.*]]692// CHECK1: arraydestroy.body14:693// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST15:%.*]] = phi ptr [ [[TMP9]], [[ARRAYDESTROY_DONE12]] ], [ [[ARRAYDESTROY_ELEMENT16:%.*]], [[ARRAYDESTROY_BODY14]] ]694// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT16]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST15]], i64 -1695// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT16]]) #[[ATTR3]]696// CHECK1-NEXT: [[ARRAYDESTROY_DONE17:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT16]], [[ARRAY_BEGIN13]]697// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE17]], label [[ARRAYDESTROY_DONE18:%.*]], label [[ARRAYDESTROY_BODY14]]698// CHECK1: arraydestroy.done18:699// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR1]]) #[[ATTR3]]700// CHECK1-NEXT: [[ARRAY_BEGIN19:%.*]] = getelementptr inbounds [4 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 0701// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN19]], i64 4702// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY20:%.*]]703// CHECK1: arraydestroy.body20:704// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST21:%.*]] = phi ptr [ [[TMP10]], [[ARRAYDESTROY_DONE18]] ], [ [[ARRAYDESTROY_ELEMENT22:%.*]], [[ARRAYDESTROY_BODY20]] ]705// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT22]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST21]], i64 -1706// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT22]]) #[[ATTR3]]707// CHECK1-NEXT: [[ARRAYDESTROY_DONE23:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT22]], [[ARRAY_BEGIN19]]708// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE23]], label [[ARRAYDESTROY_DONE24:%.*]], label [[ARRAYDESTROY_BODY20]]709// CHECK1: arraydestroy.done24:710// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TEST]]) #[[ATTR3]]711// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[RETVAL]], align 4712// CHECK1-NEXT: ret i32 [[TMP11]]713//714//715// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ev716// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {717// CHECK1-NEXT: entry:718// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8719// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8720// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8721// CHECK1-NEXT: call void @_ZN1SIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]])722// CHECK1-NEXT: ret void723//724//725// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ef726// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR0]] align 2 {727// CHECK1-NEXT: entry:728// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8729// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 4730// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8731// CHECK1-NEXT: store float [[A]], ptr [[A_ADDR]], align 4732// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8733// CHECK1-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4734// CHECK1-NEXT: call void @_ZN1SIfEC2Ef(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]], float noundef [[TMP0]])735// CHECK1-NEXT: ret void736//737//738// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined739// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[T_VAR:%.*]], ptr noundef nonnull align 4 dereferenceable(12) [[VAR:%.*]], ptr noundef nonnull align 4 dereferenceable(12) [[VAR1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[T_VAR1:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[VEC:%.*]], ptr noundef nonnull align 4 dereferenceable(48) [[S_ARR:%.*]]) #[[ATTR1]] {740// CHECK1-NEXT: entry:741// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8742// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8743// CHECK1-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 8744// CHECK1-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 8745// CHECK1-NEXT: [[VAR1_ADDR:%.*]] = alloca ptr, align 8746// CHECK1-NEXT: [[T_VAR1_ADDR:%.*]] = alloca ptr, align 8747// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 8748// CHECK1-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 8749// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8750// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8751// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4752// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 4753// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4754// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4755// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4756// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4757// CHECK1-NEXT: [[T_VAR3:%.*]] = alloca float, align 4758// CHECK1-NEXT: [[VAR4:%.*]] = alloca [[STRUCT_S_0:%.*]], align 4759// CHECK1-NEXT: [[_TMP6:%.*]] = alloca ptr, align 8760// CHECK1-NEXT: [[VAR17:%.*]] = alloca [[STRUCT_S_0]], align 4761// CHECK1-NEXT: [[T_VAR18:%.*]] = alloca float, align 4762// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4763// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [4 x ptr], align 8764// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8765// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8766// CHECK1-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 8767// CHECK1-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 8768// CHECK1-NEXT: store ptr [[VAR1]], ptr [[VAR1_ADDR]], align 8769// CHECK1-NEXT: store ptr [[T_VAR1]], ptr [[T_VAR1_ADDR]], align 8770// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 8771// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 8772// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 8773// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VAR_ADDR]], align 8774// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR1_ADDR]], align 8775// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[T_VAR1_ADDR]], align 8776// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[VEC_ADDR]], align 8777// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 8778// CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 8779// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 8780// CHECK1-NEXT: store ptr [[TMP6]], ptr [[_TMP1]], align 8781// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4782// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 4783// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4784// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4785// CHECK1-NEXT: call void @.omp_initializer..2(ptr noundef [[T_VAR3]], ptr noundef [[TMP0]])786// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP1]], align 8787// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[VAR4]], i64 4788// CHECK1-NEXT: [[ADD_PTR5:%.*]] = getelementptr inbounds i8, ptr [[TMP7]], i64 4789// CHECK1-NEXT: call void @.omp_initializer..4(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR5]])790// CHECK1-NEXT: store ptr [[VAR4]], ptr [[_TMP6]], align 8791// CHECK1-NEXT: call void @.omp_initializer..6(ptr noundef [[VAR17]], ptr noundef [[TMP2]])792// CHECK1-NEXT: [[TMP8:%.*]] = load float, ptr @.init, align 4793// CHECK1-NEXT: store float [[TMP8]], ptr [[T_VAR18]], align 4794// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8795// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 4796// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP10]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)797// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4798// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP11]], 1799// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]800// CHECK1: cond.true:801// CHECK1-NEXT: br label [[COND_END:%.*]]802// CHECK1: cond.false:803// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4804// CHECK1-NEXT: br label [[COND_END]]805// CHECK1: cond.end:806// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]807// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4808// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4809// CHECK1-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4810// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]811// CHECK1: omp.inner.for.cond:812// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4813// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4814// CHECK1-NEXT: [[CMP9:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]815// CHECK1-NEXT: br i1 [[CMP9]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]816// CHECK1: omp.inner.for.cond.cleanup:817// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]818// CHECK1: omp.inner.for.body:819// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4820// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP16]], 1821// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]822// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 4823// CHECK1-NEXT: [[TMP17:%.*]] = load float, ptr [[T_VAR3]], align 4824// CHECK1-NEXT: [[CONV:%.*]] = fptosi float [[TMP17]] to i32825// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[I]], align 4826// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP18]] to i64827// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP4]], i64 0, i64 [[IDXPROM]]828// CHECK1-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4829// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[_TMP6]], align 8830// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[I]], align 4831// CHECK1-NEXT: [[IDXPROM10:%.*]] = sext i32 [[TMP20]] to i64832// CHECK1-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds [4 x %struct.S.0], ptr [[TMP5]], i64 0, i64 [[IDXPROM10]]833// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN1SIfEaSERKS0_(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYIDX11]], ptr noundef nonnull align 4 dereferenceable(12) [[TMP19]])834// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]835// CHECK1: omp.body.continue:836// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]837// CHECK1: omp.inner.for.inc:838// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4839// CHECK1-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP21]], 1840// CHECK1-NEXT: store i32 [[ADD12]], ptr [[DOTOMP_IV]], align 4841// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]842// CHECK1: omp.inner.for.end:843// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]844// CHECK1: omp.loop.exit:845// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP10]])846// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0847// CHECK1-NEXT: store ptr [[T_VAR3]], ptr [[TMP22]], align 8848// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 1849// CHECK1-NEXT: store ptr [[VAR4]], ptr [[TMP23]], align 8850// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 2851// CHECK1-NEXT: store ptr [[VAR17]], ptr [[TMP24]], align 8852// CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 3853// CHECK1-NEXT: store ptr [[T_VAR18]], ptr [[TMP25]], align 8854// CHECK1-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3:[0-9]+]], i32 [[TMP10]], i32 4, i64 32, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)855// CHECK1-NEXT: switch i32 [[TMP26]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [856// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]857// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]858// CHECK1-NEXT: ]859// CHECK1: .omp.reduction.case1:860// CHECK1-NEXT: call void @.omp_combiner..1(ptr noundef [[TMP0]], ptr noundef [[T_VAR3]])861// CHECK1-NEXT: [[ADD_PTR13:%.*]] = getelementptr inbounds i8, ptr [[TMP7]], i64 4862// CHECK1-NEXT: [[ADD_PTR14:%.*]] = getelementptr inbounds i8, ptr [[VAR4]], i64 4863// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR13]], ptr noundef [[ADD_PTR14]])864// CHECK1-NEXT: call void @.omp_combiner..5(ptr noundef [[TMP2]], ptr noundef [[VAR17]])865// CHECK1-NEXT: call void @.omp_combiner..7(ptr noundef [[TMP3]], ptr noundef [[T_VAR18]])866// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP10]], ptr @.gomp_critical_user_.reduction.var)867// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]868// CHECK1: .omp.reduction.case2:869// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP10]], ptr @.gomp_critical_user_.atomic_reduction.var)870// CHECK1-NEXT: call void @.omp_combiner..1(ptr noundef [[TMP0]], ptr noundef [[T_VAR3]])871// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP10]], ptr @.gomp_critical_user_.atomic_reduction.var)872// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP10]], ptr @.gomp_critical_user_.atomic_reduction.var)873// CHECK1-NEXT: [[ADD_PTR15:%.*]] = getelementptr inbounds i8, ptr [[TMP7]], i64 4874// CHECK1-NEXT: [[ADD_PTR16:%.*]] = getelementptr inbounds i8, ptr [[VAR4]], i64 4875// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR15]], ptr noundef [[ADD_PTR16]])876// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP10]], ptr @.gomp_critical_user_.atomic_reduction.var)877// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP10]], ptr @.gomp_critical_user_.atomic_reduction.var)878// CHECK1-NEXT: call void @.omp_combiner..5(ptr noundef [[TMP2]], ptr noundef [[VAR17]])879// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP10]], ptr @.gomp_critical_user_.atomic_reduction.var)880// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP10]], ptr @.gomp_critical_user_.atomic_reduction.var)881// CHECK1-NEXT: call void @.omp_combiner..7(ptr noundef [[TMP3]], ptr noundef [[T_VAR18]])882// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP10]], ptr @.gomp_critical_user_.atomic_reduction.var)883// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP10]], ptr @.gomp_critical_user_.reduction.var)884// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]885// CHECK1: .omp.reduction.default:886// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR17]]) #[[ATTR3]]887// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR4]]) #[[ATTR3]]888// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4:[0-9]+]], i32 [[TMP10]])889// CHECK1-NEXT: ret void890//891//892// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..1893// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {894// CHECK1-NEXT: entry:895// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8896// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8897// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8898// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8899// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8900// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8901// CHECK1-NEXT: [[TMP4:%.*]] = load float, ptr [[TMP2]], align 4902// CHECK1-NEXT: [[SUB:%.*]] = fsub float 2.220000e+02, [[TMP4]]903// CHECK1-NEXT: store float [[SUB]], ptr [[TMP3]], align 4904// CHECK1-NEXT: ret void905//906//907// CHECK1-LABEL: define {{[^@]+}}@.omp_initializer..2908// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {909// CHECK1-NEXT: entry:910// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8911// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8912// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8913// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8914// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8915// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8916// CHECK1-NEXT: store float -1.000000e+00, ptr [[TMP3]], align 4917// CHECK1-NEXT: ret void918//919//920// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..3921// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {922// CHECK1-NEXT: entry:923// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8924// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8925// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8926// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8927// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8928// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8929// CHECK1-NEXT: call void @_Z3redR6BaseS1RKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP3]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP2]])930// CHECK1-NEXT: ret void931//932//933// CHECK1-LABEL: define {{[^@]+}}@.omp_initializer..4934// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {935// CHECK1-NEXT: entry:936// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8937// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8938// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8939// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8940// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8941// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8942// CHECK1-NEXT: call void @_Z4initR6BaseS1RKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP3]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP2]])943// CHECK1-NEXT: ret void944//945//946// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..5947// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {948// CHECK1-NEXT: entry:949// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8950// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8951// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8952// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8953// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8954// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8955// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[TMP2]], i32 0, i32 2956// CHECK1-NEXT: [[TMP4:%.*]] = load float, ptr [[F]], align 4957// CHECK1-NEXT: [[F2:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0]], ptr [[TMP3]], i32 0, i32 2958// CHECK1-NEXT: [[TMP5:%.*]] = load float, ptr [[F2]], align 4959// CHECK1-NEXT: [[MUL:%.*]] = fmul float [[TMP5]], [[TMP4]]960// CHECK1-NEXT: store float [[MUL]], ptr [[F2]], align 4961// CHECK1-NEXT: ret void962//963//964// CHECK1-LABEL: define {{[^@]+}}@.omp_initializer..6965// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {966// CHECK1-NEXT: entry:967// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8968// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8969// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8970// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8971// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8972// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8973// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[TMP3]], i64 4974// CHECK1-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[TMP2]], i64 4975// CHECK1-NEXT: call void @_Z5init1R6BaseS1RKS_(ptr noundef nonnull align 4 dereferenceable(4) [[ADD_PTR]], ptr noundef nonnull align 4 dereferenceable(4) [[ADD_PTR2]])976// CHECK1-NEXT: ret void977//978//979// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.omp.reduction.reduction_func980// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7:[0-9]+]] {981// CHECK1-NEXT: entry:982// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8983// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8984// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8985// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8986// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8987// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8988// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 0989// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8990// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 0991// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8992// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 1993// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 8994// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 1995// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 8996// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 2997// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 8998// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 2999// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 81000// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 31001// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 81002// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 31003// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 81004// CHECK1-NEXT: call void @.omp_combiner..1(ptr noundef [[TMP7]], ptr noundef [[TMP5]])1005// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[TMP11]], i64 41006// CHECK1-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[TMP9]], i64 41007// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR2]])1008// CHECK1-NEXT: call void @.omp_combiner..5(ptr noundef [[TMP15]], ptr noundef [[TMP13]])1009// CHECK1-NEXT: call void @.omp_combiner..7(ptr noundef [[TMP19]], ptr noundef [[TMP17]])1010// CHECK1-NEXT: ret void1011//1012//1013// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..71014// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {1015// CHECK1-NEXT: entry:1016// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81017// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81018// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81019// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81020// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 81021// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 81022// CHECK1-NEXT: [[TMP4:%.*]] = load float, ptr [[TMP2]], align 41023// CHECK1-NEXT: [[ADD:%.*]] = fadd float 5.550000e+02, [[TMP4]]1024// CHECK1-NEXT: store float [[ADD]], ptr [[TMP3]], align 41025// CHECK1-NEXT: ret void1026//1027//1028// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED1Ev1029// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {1030// CHECK1-NEXT: entry:1031// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81032// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81033// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81034// CHECK1-NEXT: call void @_ZN1SIfED2Ev(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]]) #[[ATTR3]]1035// CHECK1-NEXT: ret void1036//1037//1038// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.81039// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[VLA:%.*]], i64 noundef [[VLA1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[ARR:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[VEC:%.*]], ptr noundef nonnull align 4 dereferenceable(480) [[ARRS:%.*]]) #[[ATTR1]] {1040// CHECK1-NEXT: entry:1041// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81042// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81043// CHECK1-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 81044// CHECK1-NEXT: [[VLA_ADDR2:%.*]] = alloca i64, align 81045// CHECK1-NEXT: [[ARR_ADDR:%.*]] = alloca ptr, align 81046// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 81047// CHECK1-NEXT: [[ARRS_ADDR:%.*]] = alloca ptr, align 81048// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41049// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 41050// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41051// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41052// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41053// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41054// CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 81055// CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 81056// CHECK1-NEXT: [[__VLA_EXPR1:%.*]] = alloca i64, align 81057// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 41058// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [4 x ptr], align 81059// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81060// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81061// CHECK1-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 81062// CHECK1-NEXT: store i64 [[VLA1]], ptr [[VLA_ADDR2]], align 81063// CHECK1-NEXT: store ptr [[ARR]], ptr [[ARR_ADDR]], align 81064// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 81065// CHECK1-NEXT: store ptr [[ARRS]], ptr [[ARRS_ADDR]], align 81066// CHECK1-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR]], align 81067// CHECK1-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR2]], align 81068// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARR_ADDR]], align 81069// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VEC_ADDR]], align 81070// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[ARRS_ADDR]], align 81071// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41072// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41073// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41074// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41075// CHECK1-NEXT: [[TMP5:%.*]] = mul nsw i64 1, [[TMP1]]1076// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[TMP5]]1077// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw i32, ptr [[ARRAYIDX]], i64 01078// CHECK1-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP3]], i64 0, i64 11079// CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX4]], align 41080// CHECK1-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i641081// CHECK1-NEXT: [[LB_ADD_LEN:%.*]] = add nsw i64 -1, [[TMP7]]1082// CHECK1-NEXT: [[TMP8:%.*]] = mul nsw i64 1, [[TMP1]]1083// CHECK1-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[TMP8]]1084// CHECK1-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds nuw i32, ptr [[ARRAYIDX5]], i64 [[LB_ADD_LEN]]1085// CHECK1-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[ARRAYIDX6]] to i641086// CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[ARRAYIDX3]] to i641087// CHECK1-NEXT: [[TMP11:%.*]] = sub i64 [[TMP9]], [[TMP10]]1088// CHECK1-NEXT: [[TMP12:%.*]] = sdiv exact i64 [[TMP11]], ptrtoint (ptr getelementptr (i32, ptr null, i32 1) to i64)1089// CHECK1-NEXT: [[TMP13:%.*]] = add nuw i64 [[TMP12]], 11090// CHECK1-NEXT: [[TMP14:%.*]] = mul nuw i64 [[TMP13]], ptrtoint (ptr getelementptr (i32, ptr null, i32 1) to i64)1091// CHECK1-NEXT: [[TMP15:%.*]] = call ptr @llvm.stacksave.p0()1092// CHECK1-NEXT: store ptr [[TMP15]], ptr [[SAVED_STACK]], align 81093// CHECK1-NEXT: [[VLA7:%.*]] = alloca i32, i64 [[TMP13]], align 161094// CHECK1-NEXT: store i64 [[TMP13]], ptr [[__VLA_EXPR0]], align 81095// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[VLA7]], i64 [[TMP13]]1096// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[VLA7]], [[TMP16]]1097// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]1098// CHECK1: omp.arrayinit.body:1099// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[ARRAYIDX3]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]1100// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[VLA7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT8:%.*]], [[OMP_ARRAYINIT_BODY]] ]1101// CHECK1-NEXT: call void @.omp_initializer..10(ptr noundef [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef [[OMP_ARRAYCPY_SRCELEMENTPAST]])1102// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11103// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT8]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11104// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT8]], [[TMP16]]1105// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]1106// CHECK1: omp.arrayinit.done:1107// CHECK1-NEXT: [[TMP17:%.*]] = ptrtoint ptr [[TMP2]] to i641108// CHECK1-NEXT: [[TMP18:%.*]] = ptrtoint ptr [[ARRAYIDX3]] to i641109// CHECK1-NEXT: [[TMP19:%.*]] = sub i64 [[TMP17]], [[TMP18]]1110// CHECK1-NEXT: [[TMP20:%.*]] = sdiv exact i64 [[TMP19]], ptrtoint (ptr getelementptr (i32, ptr null, i32 1) to i64)1111// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr i32, ptr [[VLA7]], i64 [[TMP20]]1112// CHECK1-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds nuw [10 x [4 x %struct.S.0]], ptr [[TMP4]], i64 0, i64 11113// CHECK1-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x %struct.S.0], ptr [[ARRAYIDX9]], i64 0, i64 01114// CHECK1-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[ARRAYDECAY]], i64 11115// CHECK1-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP3]], i64 0, i64 11116// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[ARRAYIDX11]], align 41117// CHECK1-NEXT: [[TMP23:%.*]] = sext i32 [[TMP22]] to i641118// CHECK1-NEXT: [[LB_ADD_LEN12:%.*]] = add nsw i64 0, [[TMP23]]1119// CHECK1-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds nuw [10 x [4 x %struct.S.0]], ptr [[TMP4]], i64 0, i64 [[LB_ADD_LEN12]]1120// CHECK1-NEXT: [[ARRAYDECAY14:%.*]] = getelementptr inbounds [4 x %struct.S.0], ptr [[ARRAYIDX13]], i64 0, i64 01121// CHECK1-NEXT: [[ARRAYIDX15:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0]], ptr [[ARRAYDECAY14]], i64 21122// CHECK1-NEXT: [[TMP24:%.*]] = ptrtoint ptr [[ARRAYIDX15]] to i641123// CHECK1-NEXT: [[TMP25:%.*]] = ptrtoint ptr [[ARRAYIDX10]] to i641124// CHECK1-NEXT: [[TMP26:%.*]] = sub i64 [[TMP24]], [[TMP25]]1125// CHECK1-NEXT: [[TMP27:%.*]] = sdiv exact i64 [[TMP26]], ptrtoint (ptr getelementptr ([[STRUCT_S_0]], ptr null, i32 1) to i64)1126// CHECK1-NEXT: [[TMP28:%.*]] = add nuw i64 [[TMP27]], 11127// CHECK1-NEXT: [[TMP29:%.*]] = mul nuw i64 [[TMP28]], ptrtoint (ptr getelementptr ([[STRUCT_S_0]], ptr null, i32 1) to i64)1128// CHECK1-NEXT: [[VLA16:%.*]] = alloca [[STRUCT_S_0]], i64 [[TMP28]], align 161129// CHECK1-NEXT: store i64 [[TMP28]], ptr [[__VLA_EXPR1]], align 81130// CHECK1-NEXT: [[TMP30:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[VLA16]], i64 [[TMP28]]1131// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY17:%.*]] = icmp eq ptr [[VLA16]], [[TMP30]]1132// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY17]], label [[OMP_ARRAYINIT_DONE25:%.*]], label [[OMP_ARRAYINIT_BODY18:%.*]]1133// CHECK1: omp.arrayinit.body18:1134// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST19:%.*]] = phi ptr [ [[ARRAYIDX10]], [[OMP_ARRAYINIT_DONE]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT22:%.*]], [[OMP_ARRAYINIT_BODY18]] ]1135// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST20:%.*]] = phi ptr [ [[VLA16]], [[OMP_ARRAYINIT_DONE]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT23:%.*]], [[OMP_ARRAYINIT_BODY18]] ]1136// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST20]], i64 41137// CHECK1-NEXT: [[ADD_PTR21:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST19]], i64 41138// CHECK1-NEXT: call void @.omp_initializer..4(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR21]])1139// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT22]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST19]], i32 11140// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT23]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST20]], i32 11141// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE24:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT23]], [[TMP30]]1142// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE24]], label [[OMP_ARRAYINIT_DONE25]], label [[OMP_ARRAYINIT_BODY18]]1143// CHECK1: omp.arrayinit.done25:1144// CHECK1-NEXT: [[TMP31:%.*]] = ptrtoint ptr [[TMP4]] to i641145// CHECK1-NEXT: [[TMP32:%.*]] = ptrtoint ptr [[ARRAYIDX10]] to i641146// CHECK1-NEXT: [[TMP33:%.*]] = sub i64 [[TMP31]], [[TMP32]]1147// CHECK1-NEXT: [[TMP34:%.*]] = sdiv exact i64 [[TMP33]], ptrtoint (ptr getelementptr ([[STRUCT_S_0]], ptr null, i32 1) to i64)1148// CHECK1-NEXT: [[TMP35:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[VLA16]], i64 [[TMP34]]1149// CHECK1-NEXT: [[TMP36:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81150// CHECK1-NEXT: [[TMP37:%.*]] = load i32, ptr [[TMP36]], align 41151// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP37]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1152// CHECK1-NEXT: [[TMP38:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41153// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP38]], 91154// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1155// CHECK1: cond.true:1156// CHECK1-NEXT: br label [[COND_END:%.*]]1157// CHECK1: cond.false:1158// CHECK1-NEXT: [[TMP39:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41159// CHECK1-NEXT: br label [[COND_END]]1160// CHECK1: cond.end:1161// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP39]], [[COND_FALSE]] ]1162// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41163// CHECK1-NEXT: [[TMP40:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41164// CHECK1-NEXT: store i32 [[TMP40]], ptr [[DOTOMP_IV]], align 41165// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1166// CHECK1: omp.inner.for.cond:1167// CHECK1-NEXT: [[TMP41:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41168// CHECK1-NEXT: [[TMP42:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41169// CHECK1-NEXT: [[CMP26:%.*]] = icmp sle i32 [[TMP41]], [[TMP42]]1170// CHECK1-NEXT: br i1 [[CMP26]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1171// CHECK1: omp.inner.for.cond.cleanup:1172// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1173// CHECK1: omp.inner.for.body:1174// CHECK1-NEXT: [[TMP43:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41175// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP43]], 11176// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1177// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 41178// CHECK1-NEXT: [[TMP44:%.*]] = mul nsw i64 1, [[TMP1]]1179// CHECK1-NEXT: [[ARRAYIDX27:%.*]] = getelementptr inbounds i32, ptr [[TMP21]], i64 [[TMP44]]1180// CHECK1-NEXT: [[TMP45:%.*]] = load i32, ptr [[I]], align 41181// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP45]] to i641182// CHECK1-NEXT: [[ARRAYIDX28:%.*]] = getelementptr inbounds i32, ptr [[ARRAYIDX27]], i64 [[IDXPROM]]1183// CHECK1-NEXT: [[TMP46:%.*]] = load i32, ptr [[ARRAYIDX28]], align 41184// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP46]], 11185// CHECK1-NEXT: store i32 [[INC]], ptr [[ARRAYIDX28]], align 41186// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1187// CHECK1: omp.body.continue:1188// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1189// CHECK1: omp.inner.for.inc:1190// CHECK1-NEXT: [[TMP47:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41191// CHECK1-NEXT: [[ADD29:%.*]] = add nsw i32 [[TMP47]], 11192// CHECK1-NEXT: store i32 [[ADD29]], ptr [[DOTOMP_IV]], align 41193// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]1194// CHECK1: omp.inner.for.end:1195// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1196// CHECK1: omp.loop.exit:1197// CHECK1-NEXT: [[TMP48:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81198// CHECK1-NEXT: [[TMP49:%.*]] = load i32, ptr [[TMP48]], align 41199// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP49]])1200// CHECK1-NEXT: [[TMP50:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01201// CHECK1-NEXT: store ptr [[VLA7]], ptr [[TMP50]], align 81202// CHECK1-NEXT: [[TMP51:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 11203// CHECK1-NEXT: [[TMP52:%.*]] = inttoptr i64 [[TMP13]] to ptr1204// CHECK1-NEXT: store ptr [[TMP52]], ptr [[TMP51]], align 81205// CHECK1-NEXT: [[TMP53:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 21206// CHECK1-NEXT: store ptr [[VLA16]], ptr [[TMP53]], align 81207// CHECK1-NEXT: [[TMP54:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 31208// CHECK1-NEXT: [[TMP55:%.*]] = inttoptr i64 [[TMP28]] to ptr1209// CHECK1-NEXT: store ptr [[TMP55]], ptr [[TMP54]], align 81210// CHECK1-NEXT: [[TMP56:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81211// CHECK1-NEXT: [[TMP57:%.*]] = load i32, ptr [[TMP56]], align 41212// CHECK1-NEXT: [[TMP58:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB3]], i32 [[TMP57]], i32 2, i64 32, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.8.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1213// CHECK1-NEXT: switch i32 [[TMP58]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1214// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1215// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1216// CHECK1-NEXT: ]1217// CHECK1: .omp.reduction.case1:1218// CHECK1-NEXT: [[TMP59:%.*]] = getelementptr i32, ptr [[ARRAYIDX3]], i64 [[TMP13]]1219// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX3]], [[TMP59]]1220// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE34:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1221// CHECK1: omp.arraycpy.body:1222// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST30:%.*]] = phi ptr [ [[VLA7]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1223// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST31:%.*]] = phi ptr [ [[ARRAYIDX3]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT32:%.*]], [[OMP_ARRAYCPY_BODY]] ]1224// CHECK1-NEXT: call void @.omp_combiner..9(ptr noundef [[OMP_ARRAYCPY_DESTELEMENTPAST31]], ptr noundef [[OMP_ARRAYCPY_SRCELEMENTPAST30]])1225// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT32]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST31]], i32 11226// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST30]], i32 11227// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE33:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT32]], [[TMP59]]1228// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE33]], label [[OMP_ARRAYCPY_DONE34]], label [[OMP_ARRAYCPY_BODY]]1229// CHECK1: omp.arraycpy.done34:1230// CHECK1-NEXT: [[TMP60:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX10]], i64 [[TMP28]]1231// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY35:%.*]] = icmp eq ptr [[ARRAYIDX10]], [[TMP60]]1232// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY35]], label [[OMP_ARRAYCPY_DONE44:%.*]], label [[OMP_ARRAYCPY_BODY36:%.*]]1233// CHECK1: omp.arraycpy.body36:1234// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST37:%.*]] = phi ptr [ [[VLA16]], [[OMP_ARRAYCPY_DONE34]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT42:%.*]], [[OMP_ARRAYCPY_BODY36]] ]1235// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST38:%.*]] = phi ptr [ [[ARRAYIDX10]], [[OMP_ARRAYCPY_DONE34]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT41:%.*]], [[OMP_ARRAYCPY_BODY36]] ]1236// CHECK1-NEXT: [[ADD_PTR39:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST38]], i64 41237// CHECK1-NEXT: [[ADD_PTR40:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST37]], i64 41238// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR39]], ptr noundef [[ADD_PTR40]])1239// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT41]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST38]], i32 11240// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT42]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST37]], i32 11241// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE43:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT41]], [[TMP60]]1242// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE43]], label [[OMP_ARRAYCPY_DONE44]], label [[OMP_ARRAYCPY_BODY36]]1243// CHECK1: omp.arraycpy.done44:1244// CHECK1-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB3]], i32 [[TMP57]], ptr @.gomp_critical_user_.reduction.var)1245// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1246// CHECK1: .omp.reduction.case2:1247// CHECK1-NEXT: [[TMP61:%.*]] = getelementptr i32, ptr [[ARRAYIDX3]], i64 [[TMP13]]1248// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY45:%.*]] = icmp eq ptr [[ARRAYIDX3]], [[TMP61]]1249// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY45]], label [[OMP_ARRAYCPY_DONE52:%.*]], label [[OMP_ARRAYCPY_BODY46:%.*]]1250// CHECK1: omp.arraycpy.body46:1251// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST47:%.*]] = phi ptr [ [[VLA7]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT50:%.*]], [[OMP_ARRAYCPY_BODY46]] ]1252// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST48:%.*]] = phi ptr [ [[ARRAYIDX3]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT49:%.*]], [[OMP_ARRAYCPY_BODY46]] ]1253// CHECK1-NEXT: [[TMP62:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81254// CHECK1-NEXT: [[TMP63:%.*]] = load i32, ptr [[TMP62]], align 41255// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP63]], ptr @.gomp_critical_user_.atomic_reduction.var)1256// CHECK1-NEXT: call void @.omp_combiner..9(ptr noundef [[OMP_ARRAYCPY_DESTELEMENTPAST48]], ptr noundef [[OMP_ARRAYCPY_SRCELEMENTPAST47]])1257// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP63]], ptr @.gomp_critical_user_.atomic_reduction.var)1258// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT49]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST48]], i32 11259// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT50]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST47]], i32 11260// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE51:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT49]], [[TMP61]]1261// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE51]], label [[OMP_ARRAYCPY_DONE52]], label [[OMP_ARRAYCPY_BODY46]]1262// CHECK1: omp.arraycpy.done52:1263// CHECK1-NEXT: [[TMP64:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX10]], i64 [[TMP28]]1264// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY53:%.*]] = icmp eq ptr [[ARRAYIDX10]], [[TMP64]]1265// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY53]], label [[OMP_ARRAYCPY_DONE62:%.*]], label [[OMP_ARRAYCPY_BODY54:%.*]]1266// CHECK1: omp.arraycpy.body54:1267// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST55:%.*]] = phi ptr [ [[VLA16]], [[OMP_ARRAYCPY_DONE52]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT60:%.*]], [[OMP_ARRAYCPY_BODY54]] ]1268// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST56:%.*]] = phi ptr [ [[ARRAYIDX10]], [[OMP_ARRAYCPY_DONE52]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT59:%.*]], [[OMP_ARRAYCPY_BODY54]] ]1269// CHECK1-NEXT: [[TMP65:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81270// CHECK1-NEXT: [[TMP66:%.*]] = load i32, ptr [[TMP65]], align 41271// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP66]], ptr @.gomp_critical_user_.atomic_reduction.var)1272// CHECK1-NEXT: [[ADD_PTR57:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST56]], i64 41273// CHECK1-NEXT: [[ADD_PTR58:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST55]], i64 41274// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR57]], ptr noundef [[ADD_PTR58]])1275// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP66]], ptr @.gomp_critical_user_.atomic_reduction.var)1276// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT59]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST56]], i32 11277// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT60]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST55]], i32 11278// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE61:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT59]], [[TMP64]]1279// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE61]], label [[OMP_ARRAYCPY_DONE62]], label [[OMP_ARRAYCPY_BODY54]]1280// CHECK1: omp.arraycpy.done62:1281// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1282// CHECK1: .omp.reduction.default:1283// CHECK1-NEXT: [[TMP67:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[VLA16]], i64 [[TMP28]]1284// CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr [[VLA16]], [[TMP67]]1285// CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE63:%.*]], label [[ARRAYDESTROY_BODY:%.*]]1286// CHECK1: arraydestroy.body:1287// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP67]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1288// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11289// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]1290// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[VLA16]]1291// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE63]], label [[ARRAYDESTROY_BODY]]1292// CHECK1: arraydestroy.done63:1293// CHECK1-NEXT: [[TMP68:%.*]] = load ptr, ptr [[SAVED_STACK]], align 81294// CHECK1-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP68]])1295// CHECK1-NEXT: ret void1296//1297//1298// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..91299// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {1300// CHECK1-NEXT: entry:1301// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81302// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81303// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81304// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81305// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 81306// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 81307// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP2]], align 41308// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 555, [[TMP4]]1309// CHECK1-NEXT: store i32 [[MUL]], ptr [[TMP3]], align 41310// CHECK1-NEXT: ret void1311//1312//1313// CHECK1-LABEL: define {{[^@]+}}@.omp_initializer..101314// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {1315// CHECK1-NEXT: entry:1316// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81317// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81318// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81319// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81320// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 81321// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 81322// CHECK1-NEXT: store i32 888, ptr [[TMP3]], align 41323// CHECK1-NEXT: ret void1324//1325//1326// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.8.omp.reduction.reduction_func1327// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7]] {1328// CHECK1-NEXT: entry:1329// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81330// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81331// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81332// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81333// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81334// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81335// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 01336// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81337// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 01338// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81339// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 11340// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 81341// CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP9]] to i641342// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 21343// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 81344// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 21345// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 81346// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 31347// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 81348// CHECK1-NEXT: [[TMP17:%.*]] = ptrtoint ptr [[TMP16]] to i641349// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr i32, ptr [[TMP7]], i64 [[TMP10]]1350// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP18]]1351// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1352// CHECK1: omp.arraycpy.body:1353// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1354// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1355// CHECK1-NEXT: call void @.omp_combiner..9(ptr noundef [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef [[OMP_ARRAYCPY_SRCELEMENTPAST]])1356// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11357// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11358// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP18]]1359// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]1360// CHECK1: omp.arraycpy.done2:1361// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[TMP14]], i64 [[TMP17]]1362// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY3:%.*]] = icmp eq ptr [[TMP14]], [[TMP19]]1363// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY3]], label [[OMP_ARRAYCPY_DONE11:%.*]], label [[OMP_ARRAYCPY_BODY4:%.*]]1364// CHECK1: omp.arraycpy.body4:1365// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST5:%.*]] = phi ptr [ [[TMP12]], [[OMP_ARRAYCPY_DONE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT9:%.*]], [[OMP_ARRAYCPY_BODY4]] ]1366// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST6:%.*]] = phi ptr [ [[TMP14]], [[OMP_ARRAYCPY_DONE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT8:%.*]], [[OMP_ARRAYCPY_BODY4]] ]1367// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST6]], i64 41368// CHECK1-NEXT: [[ADD_PTR7:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST5]], i64 41369// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR7]])1370// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT8]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST6]], i32 11371// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT9]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST5]], i32 11372// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE10:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT8]], [[TMP19]]1373// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_DONE11]], label [[OMP_ARRAYCPY_BODY4]]1374// CHECK1: omp.arraycpy.done11:1375// CHECK1-NEXT: ret void1376//1377//1378// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.111379// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[VLA:%.*]], i64 noundef [[VLA1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[ARR:%.*]], ptr noundef nonnull align 4 dereferenceable(480) [[ARRS:%.*]]) #[[ATTR1]] {1380// CHECK1-NEXT: entry:1381// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81382// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81383// CHECK1-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 81384// CHECK1-NEXT: [[VLA_ADDR2:%.*]] = alloca i64, align 81385// CHECK1-NEXT: [[ARR_ADDR:%.*]] = alloca ptr, align 81386// CHECK1-NEXT: [[ARRS_ADDR:%.*]] = alloca ptr, align 81387// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41388// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 41389// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41390// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41391// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41392// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41393// CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 81394// CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 81395// CHECK1-NEXT: [[ARRS5:%.*]] = alloca [10 x [4 x %struct.S.0]], align 161396// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 41397// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [3 x ptr], align 81398// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81399// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81400// CHECK1-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 81401// CHECK1-NEXT: store i64 [[VLA1]], ptr [[VLA_ADDR2]], align 81402// CHECK1-NEXT: store ptr [[ARR]], ptr [[ARR_ADDR]], align 81403// CHECK1-NEXT: store ptr [[ARRS]], ptr [[ARRS_ADDR]], align 81404// CHECK1-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR]], align 81405// CHECK1-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR2]], align 81406// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARR_ADDR]], align 81407// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[ARRS_ADDR]], align 81408// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41409// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41410// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41411// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41412// CHECK1-NEXT: [[TMP4:%.*]] = mul nuw i64 [[TMP0]], [[TMP1]]1413// CHECK1-NEXT: [[TMP5:%.*]] = mul nuw i64 [[TMP4]], 41414// CHECK1-NEXT: [[TMP6:%.*]] = udiv exact i64 [[TMP5]], ptrtoint (ptr getelementptr (i32, ptr null, i32 1) to i64)1415// CHECK1-NEXT: [[TMP7:%.*]] = call ptr @llvm.stacksave.p0()1416// CHECK1-NEXT: store ptr [[TMP7]], ptr [[SAVED_STACK]], align 81417// CHECK1-NEXT: [[VLA3:%.*]] = alloca i32, i64 [[TMP6]], align 161418// CHECK1-NEXT: store i64 [[TMP6]], ptr [[__VLA_EXPR0]], align 81419// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr i32, ptr [[VLA3]], i64 [[TMP6]]1420// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[VLA3]], [[TMP8]]1421// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]1422// CHECK1: omp.arrayinit.body:1423// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]1424// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[VLA3]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT4:%.*]], [[OMP_ARRAYINIT_BODY]] ]1425// CHECK1-NEXT: call void @.omp_initializer..10(ptr noundef [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef [[OMP_ARRAYCPY_SRCELEMENTPAST]])1426// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11427// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT4]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11428// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT4]], [[TMP8]]1429// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]1430// CHECK1: omp.arrayinit.done:1431// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [10 x [4 x %struct.S.0]], ptr [[ARRS5]], i32 0, i32 0, i32 01432// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[ARRAY_BEGIN]], i64 401433// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY6:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP9]]1434// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY6]], label [[OMP_ARRAYINIT_DONE14:%.*]], label [[OMP_ARRAYINIT_BODY7:%.*]]1435// CHECK1: omp.arrayinit.body7:1436// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST8:%.*]] = phi ptr [ [[TMP3]], [[OMP_ARRAYINIT_DONE]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT11:%.*]], [[OMP_ARRAYINIT_BODY7]] ]1437// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST9:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[OMP_ARRAYINIT_DONE]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT12:%.*]], [[OMP_ARRAYINIT_BODY7]] ]1438// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST9]], i64 41439// CHECK1-NEXT: [[ADD_PTR10:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST8]], i64 41440// CHECK1-NEXT: call void @.omp_initializer..4(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR10]])1441// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT11]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST8]], i32 11442// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT12]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST9]], i32 11443// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE13:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT12]], [[TMP9]]1444// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE13]], label [[OMP_ARRAYINIT_DONE14]], label [[OMP_ARRAYINIT_BODY7]]1445// CHECK1: omp.arrayinit.done14:1446// CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81447// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 41448// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP11]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1449// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41450// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP12]], 91451// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1452// CHECK1: cond.true:1453// CHECK1-NEXT: br label [[COND_END:%.*]]1454// CHECK1: cond.false:1455// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41456// CHECK1-NEXT: br label [[COND_END]]1457// CHECK1: cond.end:1458// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]1459// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41460// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41461// CHECK1-NEXT: store i32 [[TMP14]], ptr [[DOTOMP_IV]], align 41462// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1463// CHECK1: omp.inner.for.cond:1464// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41465// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41466// CHECK1-NEXT: [[CMP15:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]1467// CHECK1-NEXT: br i1 [[CMP15]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1468// CHECK1: omp.inner.for.cond.cleanup:1469// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1470// CHECK1: omp.inner.for.body:1471// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41472// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP17]], 11473// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1474// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 41475// CHECK1-NEXT: [[TMP18:%.*]] = mul nsw i64 1, [[TMP1]]1476// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA3]], i64 [[TMP18]]1477// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[I]], align 41478// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i641479// CHECK1-NEXT: [[ARRAYIDX16:%.*]] = getelementptr inbounds i32, ptr [[ARRAYIDX]], i64 [[IDXPROM]]1480// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[ARRAYIDX16]], align 41481// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP20]], 11482// CHECK1-NEXT: store i32 [[INC]], ptr [[ARRAYIDX16]], align 41483// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1484// CHECK1: omp.body.continue:1485// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1486// CHECK1: omp.inner.for.inc:1487// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41488// CHECK1-NEXT: [[ADD17:%.*]] = add nsw i32 [[TMP21]], 11489// CHECK1-NEXT: store i32 [[ADD17]], ptr [[DOTOMP_IV]], align 41490// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]1491// CHECK1: omp.inner.for.end:1492// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1493// CHECK1: omp.loop.exit:1494// CHECK1-NEXT: [[TMP22:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81495// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 41496// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP23]])1497// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01498// CHECK1-NEXT: store ptr [[VLA3]], ptr [[TMP24]], align 81499// CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 11500// CHECK1-NEXT: [[TMP26:%.*]] = inttoptr i64 [[TMP6]] to ptr1501// CHECK1-NEXT: store ptr [[TMP26]], ptr [[TMP25]], align 81502// CHECK1-NEXT: [[TMP27:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 21503// CHECK1-NEXT: store ptr [[ARRS5]], ptr [[TMP27]], align 81504// CHECK1-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81505// CHECK1-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 41506// CHECK1-NEXT: [[TMP30:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3]], i32 [[TMP29]], i32 2, i64 24, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.11.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1507// CHECK1-NEXT: switch i32 [[TMP30]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1508// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1509// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1510// CHECK1-NEXT: ]1511// CHECK1: .omp.reduction.case1:1512// CHECK1-NEXT: [[TMP31:%.*]] = getelementptr i32, ptr [[TMP2]], i64 [[TMP6]]1513// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP2]], [[TMP31]]1514// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE22:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1515// CHECK1: omp.arraycpy.body:1516// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST18:%.*]] = phi ptr [ [[VLA3]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1517// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST19:%.*]] = phi ptr [ [[TMP2]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT20:%.*]], [[OMP_ARRAYCPY_BODY]] ]1518// CHECK1-NEXT: call void @.omp_combiner..9(ptr noundef [[OMP_ARRAYCPY_DESTELEMENTPAST19]], ptr noundef [[OMP_ARRAYCPY_SRCELEMENTPAST18]])1519// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT20]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST19]], i32 11520// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST18]], i32 11521// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE21:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT20]], [[TMP31]]1522// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE21]], label [[OMP_ARRAYCPY_DONE22]], label [[OMP_ARRAYCPY_BODY]]1523// CHECK1: omp.arraycpy.done22:1524// CHECK1-NEXT: [[TMP32:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[TMP3]], i64 401525// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY23:%.*]] = icmp eq ptr [[TMP3]], [[TMP32]]1526// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY23]], label [[OMP_ARRAYCPY_DONE32:%.*]], label [[OMP_ARRAYCPY_BODY24:%.*]]1527// CHECK1: omp.arraycpy.body24:1528// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST25:%.*]] = phi ptr [ [[ARRS5]], [[OMP_ARRAYCPY_DONE22]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT30:%.*]], [[OMP_ARRAYCPY_BODY24]] ]1529// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST26:%.*]] = phi ptr [ [[TMP3]], [[OMP_ARRAYCPY_DONE22]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT29:%.*]], [[OMP_ARRAYCPY_BODY24]] ]1530// CHECK1-NEXT: [[ADD_PTR27:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST26]], i64 41531// CHECK1-NEXT: [[ADD_PTR28:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST25]], i64 41532// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR27]], ptr noundef [[ADD_PTR28]])1533// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT29]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST26]], i32 11534// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT30]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST25]], i32 11535// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE31:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT29]], [[TMP32]]1536// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE31]], label [[OMP_ARRAYCPY_DONE32]], label [[OMP_ARRAYCPY_BODY24]]1537// CHECK1: omp.arraycpy.done32:1538// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.reduction.var)1539// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1540// CHECK1: .omp.reduction.case2:1541// CHECK1-NEXT: [[TMP33:%.*]] = getelementptr i32, ptr [[TMP2]], i64 [[TMP6]]1542// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY33:%.*]] = icmp eq ptr [[TMP2]], [[TMP33]]1543// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY33]], label [[OMP_ARRAYCPY_DONE40:%.*]], label [[OMP_ARRAYCPY_BODY34:%.*]]1544// CHECK1: omp.arraycpy.body34:1545// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST35:%.*]] = phi ptr [ [[VLA3]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT38:%.*]], [[OMP_ARRAYCPY_BODY34]] ]1546// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST36:%.*]] = phi ptr [ [[TMP2]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT37:%.*]], [[OMP_ARRAYCPY_BODY34]] ]1547// CHECK1-NEXT: [[TMP34:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81548// CHECK1-NEXT: [[TMP35:%.*]] = load i32, ptr [[TMP34]], align 41549// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP35]], ptr @.gomp_critical_user_.atomic_reduction.var)1550// CHECK1-NEXT: call void @.omp_combiner..9(ptr noundef [[OMP_ARRAYCPY_DESTELEMENTPAST36]], ptr noundef [[OMP_ARRAYCPY_SRCELEMENTPAST35]])1551// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP35]], ptr @.gomp_critical_user_.atomic_reduction.var)1552// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT37]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST36]], i32 11553// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT38]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST35]], i32 11554// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE39:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT37]], [[TMP33]]1555// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE39]], label [[OMP_ARRAYCPY_DONE40]], label [[OMP_ARRAYCPY_BODY34]]1556// CHECK1: omp.arraycpy.done40:1557// CHECK1-NEXT: [[TMP36:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[TMP3]], i64 401558// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY41:%.*]] = icmp eq ptr [[TMP3]], [[TMP36]]1559// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY41]], label [[OMP_ARRAYCPY_DONE50:%.*]], label [[OMP_ARRAYCPY_BODY42:%.*]]1560// CHECK1: omp.arraycpy.body42:1561// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST43:%.*]] = phi ptr [ [[ARRS5]], [[OMP_ARRAYCPY_DONE40]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT48:%.*]], [[OMP_ARRAYCPY_BODY42]] ]1562// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST44:%.*]] = phi ptr [ [[TMP3]], [[OMP_ARRAYCPY_DONE40]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT47:%.*]], [[OMP_ARRAYCPY_BODY42]] ]1563// CHECK1-NEXT: [[TMP37:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81564// CHECK1-NEXT: [[TMP38:%.*]] = load i32, ptr [[TMP37]], align 41565// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP38]], ptr @.gomp_critical_user_.atomic_reduction.var)1566// CHECK1-NEXT: [[ADD_PTR45:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST44]], i64 41567// CHECK1-NEXT: [[ADD_PTR46:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST43]], i64 41568// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR45]], ptr noundef [[ADD_PTR46]])1569// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP38]], ptr @.gomp_critical_user_.atomic_reduction.var)1570// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT47]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST44]], i32 11571// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT48]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST43]], i32 11572// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE49:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT47]], [[TMP36]]1573// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE49]], label [[OMP_ARRAYCPY_DONE50]], label [[OMP_ARRAYCPY_BODY42]]1574// CHECK1: omp.arraycpy.done50:1575// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.reduction.var)1576// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1577// CHECK1: .omp.reduction.default:1578// CHECK1-NEXT: [[ARRAY_BEGIN51:%.*]] = getelementptr inbounds [10 x [4 x %struct.S.0]], ptr [[ARRS5]], i32 0, i32 0, i32 01579// CHECK1-NEXT: [[TMP39:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN51]], i64 401580// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1581// CHECK1: arraydestroy.body:1582// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP39]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1583// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11584// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]1585// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN51]]1586// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE52:%.*]], label [[ARRAYDESTROY_BODY]]1587// CHECK1: arraydestroy.done52:1588// CHECK1-NEXT: [[TMP40:%.*]] = load ptr, ptr [[SAVED_STACK]], align 81589// CHECK1-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP40]])1590// CHECK1-NEXT: [[TMP41:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81591// CHECK1-NEXT: [[TMP42:%.*]] = load i32, ptr [[TMP41]], align 41592// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP42]])1593// CHECK1-NEXT: ret void1594//1595//1596// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.11.omp.reduction.reduction_func1597// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7]] {1598// CHECK1-NEXT: entry:1599// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81600// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81601// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81602// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81603// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81604// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81605// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 01606// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81607// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 01608// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81609// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 11610// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 81611// CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP9]] to i641612// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 21613// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 81614// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 21615// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 81616// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr i32, ptr [[TMP7]], i64 [[TMP10]]1617// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP15]]1618// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1619// CHECK1: omp.arraycpy.body:1620// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1621// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1622// CHECK1-NEXT: call void @.omp_combiner..9(ptr noundef [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef [[OMP_ARRAYCPY_SRCELEMENTPAST]])1623// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11624// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11625// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP15]]1626// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]1627// CHECK1: omp.arraycpy.done2:1628// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[TMP14]], i64 401629// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY3:%.*]] = icmp eq ptr [[TMP14]], [[TMP16]]1630// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY3]], label [[OMP_ARRAYCPY_DONE11:%.*]], label [[OMP_ARRAYCPY_BODY4:%.*]]1631// CHECK1: omp.arraycpy.body4:1632// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST5:%.*]] = phi ptr [ [[TMP12]], [[OMP_ARRAYCPY_DONE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT9:%.*]], [[OMP_ARRAYCPY_BODY4]] ]1633// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST6:%.*]] = phi ptr [ [[TMP14]], [[OMP_ARRAYCPY_DONE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT8:%.*]], [[OMP_ARRAYCPY_BODY4]] ]1634// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST6]], i64 41635// CHECK1-NEXT: [[ADD_PTR7:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST5]], i64 41636// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR7]])1637// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT8]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST6]], i32 11638// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT9]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST5]], i32 11639// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE10:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT8]], [[TMP16]]1640// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_DONE11]], label [[OMP_ARRAYCPY_BODY4]]1641// CHECK1: omp.arraycpy.done11:1642// CHECK1-NEXT: ret void1643//1644//1645// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.121646// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[VAR2:%.*]]) #[[ATTR1]] {1647// CHECK1-NEXT: entry:1648// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81649// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81650// CHECK1-NEXT: [[VAR2_ADDR:%.*]] = alloca ptr, align 81651// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41652// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 41653// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41654// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41655// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41656// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41657// CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 81658// CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 81659// CHECK1-NEXT: [[_TMP6:%.*]] = alloca ptr, align 81660// CHECK1-NEXT: [[_TMP7:%.*]] = alloca ptr, align 81661// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 41662// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 81663// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81664// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81665// CHECK1-NEXT: store ptr [[VAR2]], ptr [[VAR2_ADDR]], align 81666// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR2_ADDR]], align 81667// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41668// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41669// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41670// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41671// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 81672// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw ptr, ptr [[TMP1]], i64 01673// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARRAYIDX]], align 81674// CHECK1-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[TMP2]], i64 11675// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP0]], align 81676// CHECK1-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds nuw ptr, ptr [[TMP3]], i64 41677// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[ARRAYIDX2]], align 81678// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0]], ptr [[TMP4]], i64 61679// CHECK1-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[ARRAYIDX3]] to i641680// CHECK1-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[ARRAYIDX1]] to i641681// CHECK1-NEXT: [[TMP7:%.*]] = sub i64 [[TMP5]], [[TMP6]]1682// CHECK1-NEXT: [[TMP8:%.*]] = sdiv exact i64 [[TMP7]], ptrtoint (ptr getelementptr ([[STRUCT_S_0]], ptr null, i32 1) to i64)1683// CHECK1-NEXT: [[TMP9:%.*]] = add nuw i64 [[TMP8]], 11684// CHECK1-NEXT: [[TMP10:%.*]] = mul nuw i64 [[TMP9]], ptrtoint (ptr getelementptr ([[STRUCT_S_0]], ptr null, i32 1) to i64)1685// CHECK1-NEXT: [[TMP11:%.*]] = call ptr @llvm.stacksave.p0()1686// CHECK1-NEXT: store ptr [[TMP11]], ptr [[SAVED_STACK]], align 81687// CHECK1-NEXT: [[VLA:%.*]] = alloca [[STRUCT_S_0]], i64 [[TMP9]], align 161688// CHECK1-NEXT: store i64 [[TMP9]], ptr [[__VLA_EXPR0]], align 81689// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[VLA]], i64 [[TMP9]]1690// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[VLA]], [[TMP12]]1691// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]1692// CHECK1: omp.arrayinit.body:1693// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[ARRAYIDX1]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]1694// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[VLA]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT5:%.*]], [[OMP_ARRAYINIT_BODY]] ]1695// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 41696// CHECK1-NEXT: [[ADD_PTR4:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 41697// CHECK1-NEXT: call void @.omp_initializer..4(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR4]])1698// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11699// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT5]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11700// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT5]], [[TMP12]]1701// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]1702// CHECK1: omp.arrayinit.done:1703// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP0]], align 81704// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 81705// CHECK1-NEXT: [[TMP15:%.*]] = ptrtoint ptr [[TMP14]] to i641706// CHECK1-NEXT: [[TMP16:%.*]] = ptrtoint ptr [[ARRAYIDX1]] to i641707// CHECK1-NEXT: [[TMP17:%.*]] = sub i64 [[TMP15]], [[TMP16]]1708// CHECK1-NEXT: [[TMP18:%.*]] = sdiv exact i64 [[TMP17]], ptrtoint (ptr getelementptr ([[STRUCT_S_0]], ptr null, i32 1) to i64)1709// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[VLA]], i64 [[TMP18]]1710// CHECK1-NEXT: store ptr [[_TMP7]], ptr [[_TMP6]], align 81711// CHECK1-NEXT: store ptr [[TMP19]], ptr [[_TMP7]], align 81712// CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81713// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41714// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP21]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1715// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41716// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP22]], 91717// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1718// CHECK1: cond.true:1719// CHECK1-NEXT: br label [[COND_END:%.*]]1720// CHECK1: cond.false:1721// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41722// CHECK1-NEXT: br label [[COND_END]]1723// CHECK1: cond.end:1724// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP23]], [[COND_FALSE]] ]1725// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41726// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41727// CHECK1-NEXT: store i32 [[TMP24]], ptr [[DOTOMP_IV]], align 41728// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1729// CHECK1: omp.inner.for.cond:1730// CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41731// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41732// CHECK1-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP25]], [[TMP26]]1733// CHECK1-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1734// CHECK1: omp.inner.for.cond.cleanup:1735// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1736// CHECK1: omp.inner.for.body:1737// CHECK1-NEXT: [[TMP27:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41738// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP27]], 11739// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1740// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 41741// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1742// CHECK1: omp.body.continue:1743// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1744// CHECK1: omp.inner.for.inc:1745// CHECK1-NEXT: [[TMP28:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41746// CHECK1-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP28]], 11747// CHECK1-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 41748// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]1749// CHECK1: omp.inner.for.end:1750// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1751// CHECK1: omp.loop.exit:1752// CHECK1-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81753// CHECK1-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 41754// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP30]])1755// CHECK1-NEXT: [[TMP31:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01756// CHECK1-NEXT: store ptr [[VLA]], ptr [[TMP31]], align 81757// CHECK1-NEXT: [[TMP32:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 11758// CHECK1-NEXT: [[TMP33:%.*]] = inttoptr i64 [[TMP9]] to ptr1759// CHECK1-NEXT: store ptr [[TMP33]], ptr [[TMP32]], align 81760// CHECK1-NEXT: [[TMP34:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81761// CHECK1-NEXT: [[TMP35:%.*]] = load i32, ptr [[TMP34]], align 41762// CHECK1-NEXT: [[TMP36:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3]], i32 [[TMP35]], i32 1, i64 16, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.12.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1763// CHECK1-NEXT: switch i32 [[TMP36]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1764// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1765// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1766// CHECK1-NEXT: ]1767// CHECK1: .omp.reduction.case1:1768// CHECK1-NEXT: [[TMP37:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX1]], i64 [[TMP9]]1769// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX1]], [[TMP37]]1770// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE16:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1771// CHECK1: omp.arraycpy.body:1772// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST10:%.*]] = phi ptr [ [[VLA]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1773// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST11:%.*]] = phi ptr [ [[ARRAYIDX1]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT14:%.*]], [[OMP_ARRAYCPY_BODY]] ]1774// CHECK1-NEXT: [[ADD_PTR12:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST11]], i64 41775// CHECK1-NEXT: [[ADD_PTR13:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST10]], i64 41776// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR12]], ptr noundef [[ADD_PTR13]])1777// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT14]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST11]], i32 11778// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST10]], i32 11779// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE15:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT14]], [[TMP37]]1780// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE15]], label [[OMP_ARRAYCPY_DONE16]], label [[OMP_ARRAYCPY_BODY]]1781// CHECK1: omp.arraycpy.done16:1782// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP35]], ptr @.gomp_critical_user_.reduction.var)1783// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1784// CHECK1: .omp.reduction.case2:1785// CHECK1-NEXT: [[TMP38:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX1]], i64 [[TMP9]]1786// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY17:%.*]] = icmp eq ptr [[ARRAYIDX1]], [[TMP38]]1787// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY17]], label [[OMP_ARRAYCPY_DONE26:%.*]], label [[OMP_ARRAYCPY_BODY18:%.*]]1788// CHECK1: omp.arraycpy.body18:1789// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST19:%.*]] = phi ptr [ [[VLA]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT24:%.*]], [[OMP_ARRAYCPY_BODY18]] ]1790// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST20:%.*]] = phi ptr [ [[ARRAYIDX1]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT23:%.*]], [[OMP_ARRAYCPY_BODY18]] ]1791// CHECK1-NEXT: [[TMP39:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81792// CHECK1-NEXT: [[TMP40:%.*]] = load i32, ptr [[TMP39]], align 41793// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP40]], ptr @.gomp_critical_user_.atomic_reduction.var)1794// CHECK1-NEXT: [[ADD_PTR21:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST20]], i64 41795// CHECK1-NEXT: [[ADD_PTR22:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST19]], i64 41796// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR21]], ptr noundef [[ADD_PTR22]])1797// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP40]], ptr @.gomp_critical_user_.atomic_reduction.var)1798// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT23]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST20]], i32 11799// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT24]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST19]], i32 11800// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE25:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT23]], [[TMP38]]1801// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE25]], label [[OMP_ARRAYCPY_DONE26]], label [[OMP_ARRAYCPY_BODY18]]1802// CHECK1: omp.arraycpy.done26:1803// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP35]], ptr @.gomp_critical_user_.reduction.var)1804// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1805// CHECK1: .omp.reduction.default:1806// CHECK1-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[VLA]], i64 [[TMP9]]1807// CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr [[VLA]], [[TMP41]]1808// CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE27:%.*]], label [[ARRAYDESTROY_BODY:%.*]]1809// CHECK1: arraydestroy.body:1810// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP41]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1811// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11812// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]1813// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[VLA]]1814// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE27]], label [[ARRAYDESTROY_BODY]]1815// CHECK1: arraydestroy.done27:1816// CHECK1-NEXT: [[TMP42:%.*]] = load ptr, ptr [[SAVED_STACK]], align 81817// CHECK1-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP42]])1818// CHECK1-NEXT: [[TMP43:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81819// CHECK1-NEXT: [[TMP44:%.*]] = load i32, ptr [[TMP43]], align 41820// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP44]])1821// CHECK1-NEXT: ret void1822//1823//1824// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.12.omp.reduction.reduction_func1825// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7]] {1826// CHECK1-NEXT: entry:1827// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81828// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81829// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81830// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81831// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81832// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81833// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 01834// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81835// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 01836// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81837// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 11838// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 81839// CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP9]] to i641840// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[TMP7]], i64 [[TMP10]]1841// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP11]]1842// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE3:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1843// CHECK1: omp.arraycpy.body:1844// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1845// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1846// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 41847// CHECK1-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 41848// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR2]])1849// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11850// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11851// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP11]]1852// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE3]], label [[OMP_ARRAYCPY_BODY]]1853// CHECK1: omp.arraycpy.done3:1854// CHECK1-NEXT: ret void1855//1856//1857// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.131858// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(60) [[VVAR2:%.*]]) #[[ATTR1]] {1859// CHECK1-NEXT: entry:1860// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81861// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81862// CHECK1-NEXT: [[VVAR2_ADDR:%.*]] = alloca ptr, align 81863// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41864// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 41865// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41866// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41867// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41868// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41869// CHECK1-NEXT: [[VVAR22:%.*]] = alloca [5 x %struct.S.0], align 161870// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 41871// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81872// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81873// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81874// CHECK1-NEXT: store ptr [[VVAR2]], ptr [[VVAR2_ADDR]], align 81875// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VVAR2_ADDR]], align 81876// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41877// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41878// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41879// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41880// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [5 x %struct.S.0], ptr [[TMP0]], i64 0, i64 01881// CHECK1-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw [5 x %struct.S.0], ptr [[TMP0]], i64 0, i64 41882// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S.0], ptr [[VVAR22]], i32 0, i32 01883// CHECK1-NEXT: [[TMP1:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[ARRAY_BEGIN]], i64 51884// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP1]]1885// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]1886// CHECK1: omp.arrayinit.body:1887// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[ARRAYIDX]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]1888// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT4:%.*]], [[OMP_ARRAYINIT_BODY]] ]1889// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 41890// CHECK1-NEXT: [[ADD_PTR3:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 41891// CHECK1-NEXT: call void @.omp_initializer..4(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR3]])1892// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11893// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT4]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11894// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT4]], [[TMP1]]1895// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]1896// CHECK1: omp.arrayinit.done:1897// CHECK1-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[TMP0]] to i641898// CHECK1-NEXT: [[TMP3:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i641899// CHECK1-NEXT: [[TMP4:%.*]] = sub i64 [[TMP2]], [[TMP3]]1900// CHECK1-NEXT: [[TMP5:%.*]] = sdiv exact i64 [[TMP4]], ptrtoint (ptr getelementptr ([[STRUCT_S_0]], ptr null, i32 1) to i64)1901// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[VVAR22]], i64 [[TMP5]]1902// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81903// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41904// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1905// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41906// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP9]], 91907// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1908// CHECK1: cond.true:1909// CHECK1-NEXT: br label [[COND_END:%.*]]1910// CHECK1: cond.false:1911// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41912// CHECK1-NEXT: br label [[COND_END]]1913// CHECK1: cond.end:1914// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP10]], [[COND_FALSE]] ]1915// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41916// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41917// CHECK1-NEXT: store i32 [[TMP11]], ptr [[DOTOMP_IV]], align 41918// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1919// CHECK1: omp.inner.for.cond:1920// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41921// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41922// CHECK1-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]1923// CHECK1-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1924// CHECK1: omp.inner.for.cond.cleanup:1925// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1926// CHECK1: omp.inner.for.body:1927// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41928// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP14]], 11929// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1930// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 41931// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1932// CHECK1: omp.body.continue:1933// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1934// CHECK1: omp.inner.for.inc:1935// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41936// CHECK1-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP15]], 11937// CHECK1-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 41938// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]1939// CHECK1: omp.inner.for.end:1940// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1941// CHECK1: omp.loop.exit:1942// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81943// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 41944// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP17]])1945// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01946// CHECK1-NEXT: store ptr [[VVAR22]], ptr [[TMP18]], align 81947// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81948// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 41949// CHECK1-NEXT: [[TMP21:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3]], i32 [[TMP20]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.13.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1950// CHECK1-NEXT: switch i32 [[TMP21]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1951// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1952// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1953// CHECK1-NEXT: ]1954// CHECK1: .omp.reduction.case1:1955// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX]], i64 51956// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP22]]1957// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE13:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1958// CHECK1: omp.arraycpy.body:1959// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST7:%.*]] = phi ptr [ [[VVAR22]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1960// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST8:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT11:%.*]], [[OMP_ARRAYCPY_BODY]] ]1961// CHECK1-NEXT: [[ADD_PTR9:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST8]], i64 41962// CHECK1-NEXT: [[ADD_PTR10:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST7]], i64 41963// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR9]], ptr noundef [[ADD_PTR10]])1964// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT11]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST8]], i32 11965// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST7]], i32 11966// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE12:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT11]], [[TMP22]]1967// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE12]], label [[OMP_ARRAYCPY_DONE13]], label [[OMP_ARRAYCPY_BODY]]1968// CHECK1: omp.arraycpy.done13:1969// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP20]], ptr @.gomp_critical_user_.reduction.var)1970// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1971// CHECK1: .omp.reduction.case2:1972// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX]], i64 51973// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY14:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP23]]1974// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY14]], label [[OMP_ARRAYCPY_DONE23:%.*]], label [[OMP_ARRAYCPY_BODY15:%.*]]1975// CHECK1: omp.arraycpy.body15:1976// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST16:%.*]] = phi ptr [ [[VVAR22]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT21:%.*]], [[OMP_ARRAYCPY_BODY15]] ]1977// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST17:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT20:%.*]], [[OMP_ARRAYCPY_BODY15]] ]1978// CHECK1-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81979// CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 41980// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP25]], ptr @.gomp_critical_user_.atomic_reduction.var)1981// CHECK1-NEXT: [[ADD_PTR18:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST17]], i64 41982// CHECK1-NEXT: [[ADD_PTR19:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST16]], i64 41983// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR18]], ptr noundef [[ADD_PTR19]])1984// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP25]], ptr @.gomp_critical_user_.atomic_reduction.var)1985// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT20]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST17]], i32 11986// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT21]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST16]], i32 11987// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE22:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT20]], [[TMP23]]1988// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE22]], label [[OMP_ARRAYCPY_DONE23]], label [[OMP_ARRAYCPY_BODY15]]1989// CHECK1: omp.arraycpy.done23:1990// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP20]], ptr @.gomp_critical_user_.reduction.var)1991// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1992// CHECK1: .omp.reduction.default:1993// CHECK1-NEXT: [[ARRAY_BEGIN24:%.*]] = getelementptr inbounds [5 x %struct.S.0], ptr [[VVAR22]], i32 0, i32 01994// CHECK1-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN24]], i64 51995// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1996// CHECK1: arraydestroy.body:1997// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP26]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1998// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11999// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]2000// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN24]]2001// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE25:%.*]], label [[ARRAYDESTROY_BODY]]2002// CHECK1: arraydestroy.done25:2003// CHECK1-NEXT: [[TMP27:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82004// CHECK1-NEXT: [[TMP28:%.*]] = load i32, ptr [[TMP27]], align 42005// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP28]])2006// CHECK1-NEXT: ret void2007//2008//2009// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.13.omp.reduction.reduction_func2010// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7]] {2011// CHECK1-NEXT: entry:2012// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82013// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82014// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82015// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82016// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82017// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82018// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02019// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82020// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02021// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82022// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[TMP7]], i64 52023// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]2024// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE3:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2025// CHECK1: omp.arraycpy.body:2026// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2027// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2028// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 42029// CHECK1-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 42030// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR2]])2031// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12032// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12033// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]2034// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE3]], label [[OMP_ARRAYCPY_BODY]]2035// CHECK1: omp.arraycpy.done3:2036// CHECK1-NEXT: ret void2037//2038//2039// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.142040// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(48) [[VAR3:%.*]]) #[[ATTR1]] {2041// CHECK1-NEXT: entry:2042// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82043// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82044// CHECK1-NEXT: [[VAR3_ADDR:%.*]] = alloca ptr, align 82045// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 82046// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82047// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42048// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 42049// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42050// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42051// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42052// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42053// CHECK1-NEXT: [[VAR34:%.*]] = alloca [2 x %struct.S.0], align 162054// CHECK1-NEXT: [[_TMP7:%.*]] = alloca ptr, align 82055// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42056// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82057// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82058// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82059// CHECK1-NEXT: store ptr [[VAR3]], ptr [[VAR3_ADDR]], align 82060// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR3_ADDR]], align 82061// CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 82062// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 82063// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 82064// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42065// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42066// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42067// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42068// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 82069// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [4 x %struct.S.0], ptr [[TMP2]], i64 0, i64 12070// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[_TMP1]], align 82071// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [4 x %struct.S.0], ptr [[TMP3]], i64 0, i64 22072// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[VAR34]], i32 0, i32 02073// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[ARRAY_BEGIN]], i64 22074// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP4]]2075// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]2076// CHECK1: omp.arrayinit.body:2077// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[ARRAYIDX]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]2078// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT6:%.*]], [[OMP_ARRAYINIT_BODY]] ]2079// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 42080// CHECK1-NEXT: [[ADD_PTR5:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 42081// CHECK1-NEXT: call void @.omp_initializer..4(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR5]])2082// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12083// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT6]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12084// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT6]], [[TMP4]]2085// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]2086// CHECK1: omp.arrayinit.done:2087// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[_TMP1]], align 82088// CHECK1-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP5]] to i642089// CHECK1-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i642090// CHECK1-NEXT: [[TMP8:%.*]] = sub i64 [[TMP6]], [[TMP7]]2091// CHECK1-NEXT: [[TMP9:%.*]] = sdiv exact i64 [[TMP8]], ptrtoint (ptr getelementptr ([[STRUCT_S_0]], ptr null, i32 1) to i64)2092// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[VAR34]], i64 [[TMP9]]2093// CHECK1-NEXT: store ptr [[TMP10]], ptr [[_TMP7]], align 82094// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82095// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 42096// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP12]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2097// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42098// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP13]], 92099// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2100// CHECK1: cond.true:2101// CHECK1-NEXT: br label [[COND_END:%.*]]2102// CHECK1: cond.false:2103// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42104// CHECK1-NEXT: br label [[COND_END]]2105// CHECK1: cond.end:2106// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]2107// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42108// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42109// CHECK1-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_IV]], align 42110// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2111// CHECK1: omp.inner.for.cond:2112// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42113// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42114// CHECK1-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]2115// CHECK1-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2116// CHECK1: omp.inner.for.cond.cleanup:2117// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2118// CHECK1: omp.inner.for.body:2119// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42120// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP18]], 12121// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2122// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42123// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2124// CHECK1: omp.body.continue:2125// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2126// CHECK1: omp.inner.for.inc:2127// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42128// CHECK1-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP19]], 12129// CHECK1-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 42130// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2131// CHECK1: omp.inner.for.end:2132// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2133// CHECK1: omp.loop.exit:2134// CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82135// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 42136// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP21]])2137// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02138// CHECK1-NEXT: store ptr [[VAR34]], ptr [[TMP22]], align 82139// CHECK1-NEXT: [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82140// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 42141// CHECK1-NEXT: [[TMP25:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.14.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2142// CHECK1-NEXT: switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2143// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2144// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2145// CHECK1-NEXT: ]2146// CHECK1: .omp.reduction.case1:2147// CHECK1-NEXT: [[TMP26:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX]], i64 22148// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP26]]2149// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE16:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2150// CHECK1: omp.arraycpy.body:2151// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST10:%.*]] = phi ptr [ [[VAR34]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2152// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST11:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT14:%.*]], [[OMP_ARRAYCPY_BODY]] ]2153// CHECK1-NEXT: [[ADD_PTR12:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST11]], i64 42154// CHECK1-NEXT: [[ADD_PTR13:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST10]], i64 42155// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR12]], ptr noundef [[ADD_PTR13]])2156// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT14]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST11]], i32 12157// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST10]], i32 12158// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE15:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT14]], [[TMP26]]2159// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE15]], label [[OMP_ARRAYCPY_DONE16]], label [[OMP_ARRAYCPY_BODY]]2160// CHECK1: omp.arraycpy.done16:2161// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)2162// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2163// CHECK1: .omp.reduction.case2:2164// CHECK1-NEXT: [[TMP27:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX]], i64 22165// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY17:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP27]]2166// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY17]], label [[OMP_ARRAYCPY_DONE26:%.*]], label [[OMP_ARRAYCPY_BODY18:%.*]]2167// CHECK1: omp.arraycpy.body18:2168// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST19:%.*]] = phi ptr [ [[VAR34]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT24:%.*]], [[OMP_ARRAYCPY_BODY18]] ]2169// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST20:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT23:%.*]], [[OMP_ARRAYCPY_BODY18]] ]2170// CHECK1-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82171// CHECK1-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 42172// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)2173// CHECK1-NEXT: [[ADD_PTR21:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST20]], i64 42174// CHECK1-NEXT: [[ADD_PTR22:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST19]], i64 42175// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR21]], ptr noundef [[ADD_PTR22]])2176// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)2177// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT23]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST20]], i32 12178// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT24]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST19]], i32 12179// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE25:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT23]], [[TMP27]]2180// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE25]], label [[OMP_ARRAYCPY_DONE26]], label [[OMP_ARRAYCPY_BODY18]]2181// CHECK1: omp.arraycpy.done26:2182// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)2183// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2184// CHECK1: .omp.reduction.default:2185// CHECK1-NEXT: [[ARRAY_BEGIN27:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[VAR34]], i32 0, i32 02186// CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN27]], i64 22187// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2188// CHECK1: arraydestroy.body:2189// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP30]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2190// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12191// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]2192// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN27]]2193// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE28:%.*]], label [[ARRAYDESTROY_BODY]]2194// CHECK1: arraydestroy.done28:2195// CHECK1-NEXT: [[TMP31:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82196// CHECK1-NEXT: [[TMP32:%.*]] = load i32, ptr [[TMP31]], align 42197// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP32]])2198// CHECK1-NEXT: ret void2199//2200//2201// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.14.omp.reduction.reduction_func2202// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7]] {2203// CHECK1-NEXT: entry:2204// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82205// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82206// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82207// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82208// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82209// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82210// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02211// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82212// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02213// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82214// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[TMP7]], i64 22215// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]2216// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE3:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2217// CHECK1: omp.arraycpy.body:2218// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2219// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2220// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 42221// CHECK1-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 42222// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR2]])2223// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12224// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12225// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]2226// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE3]], label [[OMP_ARRAYCPY_BODY]]2227// CHECK1: omp.arraycpy.done3:2228// CHECK1-NEXT: ret void2229//2230//2231// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.152232// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(48) [[VAR3:%.*]]) #[[ATTR1]] {2233// CHECK1-NEXT: entry:2234// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82235// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82236// CHECK1-NEXT: [[VAR3_ADDR:%.*]] = alloca ptr, align 82237// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 82238// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82239// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42240// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 42241// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42242// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42243// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42244// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42245// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 82246// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42247// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82248// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82249// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82250// CHECK1-NEXT: store ptr [[VAR3]], ptr [[VAR3_ADDR]], align 82251// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR3_ADDR]], align 82252// CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 82253// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 82254// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 82255// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42256// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42257// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42258// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42259// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 82260// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82261// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 42262// CHECK1-NEXT: [[DOTVAR3__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP4]], i64 48, ptr inttoptr (i64 6 to ptr))2263// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [4 x %struct.S.0], ptr [[DOTVAR3__VOID_ADDR]], i32 0, i32 02264// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[ARRAY_BEGIN]], i64 42265// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP5]]2266// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]2267// CHECK1: omp.arrayinit.body:2268// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP2]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]2269// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT4:%.*]], [[OMP_ARRAYINIT_BODY]] ]2270// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 42271// CHECK1-NEXT: [[ADD_PTR3:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 42272// CHECK1-NEXT: call void @.omp_initializer..4(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR3]])2273// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12274// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT4]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12275// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT4]], [[TMP5]]2276// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]2277// CHECK1: omp.arrayinit.done:2278// CHECK1-NEXT: store ptr [[DOTVAR3__VOID_ADDR]], ptr [[_TMP5]], align 82279// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP4]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2280// CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42281// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP6]], 92282// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2283// CHECK1: cond.true:2284// CHECK1-NEXT: br label [[COND_END:%.*]]2285// CHECK1: cond.false:2286// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42287// CHECK1-NEXT: br label [[COND_END]]2288// CHECK1: cond.end:2289// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]2290// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42291// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42292// CHECK1-NEXT: store i32 [[TMP8]], ptr [[DOTOMP_IV]], align 42293// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2294// CHECK1: omp.inner.for.cond:2295// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42296// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42297// CHECK1-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]2298// CHECK1-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2299// CHECK1: omp.inner.for.cond.cleanup:2300// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2301// CHECK1: omp.inner.for.body:2302// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42303// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP11]], 12304// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2305// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42306// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2307// CHECK1: omp.body.continue:2308// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2309// CHECK1: omp.inner.for.inc:2310// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42311// CHECK1-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP12]], 12312// CHECK1-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 42313// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2314// CHECK1: omp.inner.for.end:2315// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2316// CHECK1: omp.loop.exit:2317// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP4]])2318// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02319// CHECK1-NEXT: store ptr [[DOTVAR3__VOID_ADDR]], ptr [[TMP13]], align 82320// CHECK1-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3]], i32 [[TMP4]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.15.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2321// CHECK1-NEXT: switch i32 [[TMP14]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2322// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2323// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2324// CHECK1-NEXT: ]2325// CHECK1: .omp.reduction.case1:2326// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[TMP2]], i64 42327// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP2]], [[TMP15]]2328// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE14:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2329// CHECK1: omp.arraycpy.body:2330// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST8:%.*]] = phi ptr [ [[DOTVAR3__VOID_ADDR]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2331// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST9:%.*]] = phi ptr [ [[TMP2]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT12:%.*]], [[OMP_ARRAYCPY_BODY]] ]2332// CHECK1-NEXT: [[ADD_PTR10:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST9]], i64 42333// CHECK1-NEXT: [[ADD_PTR11:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST8]], i64 42334// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR10]], ptr noundef [[ADD_PTR11]])2335// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT12]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST9]], i32 12336// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST8]], i32 12337// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE13:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT12]], [[TMP15]]2338// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE13]], label [[OMP_ARRAYCPY_DONE14]], label [[OMP_ARRAYCPY_BODY]]2339// CHECK1: omp.arraycpy.done14:2340// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP4]], ptr @.gomp_critical_user_.reduction.var)2341// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2342// CHECK1: .omp.reduction.case2:2343// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[TMP2]], i64 42344// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY15:%.*]] = icmp eq ptr [[TMP2]], [[TMP16]]2345// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY15]], label [[OMP_ARRAYCPY_DONE24:%.*]], label [[OMP_ARRAYCPY_BODY16:%.*]]2346// CHECK1: omp.arraycpy.body16:2347// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST17:%.*]] = phi ptr [ [[DOTVAR3__VOID_ADDR]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT22:%.*]], [[OMP_ARRAYCPY_BODY16]] ]2348// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST18:%.*]] = phi ptr [ [[TMP2]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT21:%.*]], [[OMP_ARRAYCPY_BODY16]] ]2349// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP4]], ptr @.gomp_critical_user_.atomic_reduction.var)2350// CHECK1-NEXT: [[ADD_PTR19:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST18]], i64 42351// CHECK1-NEXT: [[ADD_PTR20:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST17]], i64 42352// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR19]], ptr noundef [[ADD_PTR20]])2353// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP4]], ptr @.gomp_critical_user_.atomic_reduction.var)2354// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT21]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST18]], i32 12355// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT22]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST17]], i32 12356// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE23:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT21]], [[TMP16]]2357// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE23]], label [[OMP_ARRAYCPY_DONE24]], label [[OMP_ARRAYCPY_BODY16]]2358// CHECK1: omp.arraycpy.done24:2359// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP4]], ptr @.gomp_critical_user_.reduction.var)2360// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2361// CHECK1: .omp.reduction.default:2362// CHECK1-NEXT: [[ARRAY_BEGIN25:%.*]] = getelementptr inbounds [4 x %struct.S.0], ptr [[DOTVAR3__VOID_ADDR]], i32 0, i32 02363// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN25]], i64 42364// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2365// CHECK1: arraydestroy.body:2366// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP17]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2367// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12368// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]2369// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN25]]2370// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE26:%.*]], label [[ARRAYDESTROY_BODY]]2371// CHECK1: arraydestroy.done26:2372// CHECK1-NEXT: call void @__kmpc_free(i32 [[TMP4]], ptr [[DOTVAR3__VOID_ADDR]], ptr inttoptr (i64 6 to ptr))2373// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP4]])2374// CHECK1-NEXT: ret void2375//2376//2377// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.15.omp.reduction.reduction_func2378// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7]] {2379// CHECK1-NEXT: entry:2380// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82381// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82382// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82383// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82384// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82385// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82386// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02387// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82388// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02389// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82390// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S_0:%.*]], ptr [[TMP7]], i64 42391// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]2392// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE3:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2393// CHECK1: omp.arraycpy.body:2394// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2395// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2396// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 42397// CHECK1-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 42398// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR2]])2399// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12400// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12401// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]2402// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE3]], label [[OMP_ARRAYCPY_BODY]]2403// CHECK1: omp.arraycpy.done3:2404// CHECK1-NEXT: ret void2405//2406//2407// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v2408// CHECK1-SAME: () #[[ATTR0]] {2409// CHECK1-NEXT: entry:2410// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 42411// CHECK1-NEXT: [[T:%.*]] = alloca i32, align 42412// CHECK1-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S:%.*]], align 42413// CHECK1-NEXT: [[T_VAR:%.*]] = alloca i32, align 42414// CHECK1-NEXT: [[T_VAR1:%.*]] = alloca i32, align 42415// CHECK1-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 42416// CHECK1-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S], align 162417// CHECK1-NEXT: [[VAR:%.*]] = alloca ptr, align 82418// CHECK1-NEXT: [[VAR1:%.*]] = alloca [[STRUCT_S]], align 42419// CHECK1-NEXT: [[ARR:%.*]] = alloca [42 x %struct.S], align 162420// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TEST]])2421// CHECK1-NEXT: store i32 0, ptr [[T_VAR]], align 42422// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const._Z5tmainIiLi42EET_v.vec, i64 8, i1 false)2423// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(12) [[S_ARR]], i32 noundef 1)2424// CHECK1-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i64 12425// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYINIT_ELEMENT]], i32 noundef 2)2426// CHECK1-NEXT: store ptr [[TEST]], ptr [[VAR]], align 82427// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR1]])2428// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [42 x %struct.S], ptr [[ARR]], i32 0, i32 02429// CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 422430// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]2431// CHECK1: arrayctor.loop:2432// CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]2433// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYCTOR_CUR]])2434// CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i64 12435// CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]2436// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]2437// CHECK1: arrayctor.cont:2438// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 82439// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 6, ptr @_Z5tmainIiLi42EET_v.omp_outlined, ptr [[T_VAR]], ptr [[TMP0]], ptr [[VAR1]], ptr [[T_VAR1]], ptr [[VEC]], ptr [[S_ARR]])2440// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VAR]], align 82441// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 4, ptr @_Z5tmainIiLi42EET_v.omp_outlined.22, ptr [[T_VAR]], ptr [[VEC]], ptr [[S_ARR]], ptr [[TMP1]])2442// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR]], align 82443// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 5, ptr @_Z5tmainIiLi42EET_v.omp_outlined.25, ptr [[ARR]], ptr [[VEC]], ptr [[T_VAR]], ptr [[S_ARR]], ptr [[TMP2]])2444// CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 42445// CHECK1-NEXT: [[ARRAY_BEGIN1:%.*]] = getelementptr inbounds [42 x %struct.S], ptr [[ARR]], i32 0, i32 02446// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN1]], i64 422447// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2448// CHECK1: arraydestroy.body:2449// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP3]], [[ARRAYCTOR_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2450// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12451// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]2452// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN1]]2453// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]2454// CHECK1: arraydestroy.done2:2455// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR1]]) #[[ATTR3]]2456// CHECK1-NEXT: [[ARRAY_BEGIN3:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 02457// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN3]], i64 22458// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY4:%.*]]2459// CHECK1: arraydestroy.body4:2460// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST5:%.*]] = phi ptr [ [[TMP4]], [[ARRAYDESTROY_DONE2]] ], [ [[ARRAYDESTROY_ELEMENT6:%.*]], [[ARRAYDESTROY_BODY4]] ]2461// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT6]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST5]], i64 -12462// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT6]]) #[[ATTR3]]2463// CHECK1-NEXT: [[ARRAYDESTROY_DONE7:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT6]], [[ARRAY_BEGIN3]]2464// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE7]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY4]]2465// CHECK1: arraydestroy.done8:2466// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TEST]]) #[[ATTR3]]2467// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[RETVAL]], align 42468// CHECK1-NEXT: ret i32 [[TMP5]]2469//2470//2471// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev2472// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {2473// CHECK1-NEXT: entry:2474// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82475// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82476// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82477// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[THIS1]], i64 42478// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 22479// CHECK1-NEXT: [[TMP1:%.*]] = load volatile double, ptr @g, align 82480// CHECK1-NEXT: [[CONV:%.*]] = fptrunc double [[TMP1]] to float2481// CHECK1-NEXT: store float [[CONV]], ptr [[F]], align 42482// CHECK1-NEXT: ret void2483//2484//2485// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef2486// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR0]] align 2 {2487// CHECK1-NEXT: entry:2488// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82489// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 42490// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82491// CHECK1-NEXT: store float [[A]], ptr [[A_ADDR]], align 42492// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82493// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[THIS1]], i64 42494// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 22495// CHECK1-NEXT: [[TMP1:%.*]] = load float, ptr [[A_ADDR]], align 42496// CHECK1-NEXT: [[CONV:%.*]] = fpext float [[TMP1]] to double2497// CHECK1-NEXT: [[TMP2:%.*]] = load volatile double, ptr @g, align 82498// CHECK1-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP2]]2499// CHECK1-NEXT: [[CONV2:%.*]] = fptrunc double [[ADD]] to float2500// CHECK1-NEXT: store float [[CONV2]], ptr [[F]], align 42501// CHECK1-NEXT: ret void2502//2503//2504// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev2505// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {2506// CHECK1-NEXT: entry:2507// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82508// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82509// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82510// CHECK1-NEXT: ret void2511//2512//2513// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ei2514// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR0]] align 2 {2515// CHECK1-NEXT: entry:2516// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82517// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i32, align 42518// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82519// CHECK1-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 42520// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82521// CHECK1-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 42522// CHECK1-NEXT: call void @_ZN1SIiEC2Ei(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]], i32 noundef [[TMP0]])2523// CHECK1-NEXT: ret void2524//2525//2526// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined2527// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[T_VAR:%.*]], ptr noundef nonnull align 4 dereferenceable(12) [[VAR:%.*]], ptr noundef nonnull align 4 dereferenceable(12) [[VAR1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[T_VAR1:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[VEC:%.*]], ptr noundef nonnull align 4 dereferenceable(24) [[S_ARR:%.*]]) #[[ATTR1]] {2528// CHECK1-NEXT: entry:2529// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82530// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82531// CHECK1-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 82532// CHECK1-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 82533// CHECK1-NEXT: [[VAR1_ADDR:%.*]] = alloca ptr, align 82534// CHECK1-NEXT: [[T_VAR1_ADDR:%.*]] = alloca ptr, align 82535// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 82536// CHECK1-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 82537// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 82538// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82539// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42540// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 42541// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42542// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42543// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42544// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42545// CHECK1-NEXT: [[T_VAR3:%.*]] = alloca i32, align 42546// CHECK1-NEXT: [[VAR4:%.*]] = alloca [[STRUCT_S:%.*]], align 42547// CHECK1-NEXT: [[_TMP6:%.*]] = alloca ptr, align 82548// CHECK1-NEXT: [[VAR17:%.*]] = alloca [[STRUCT_S]], align 42549// CHECK1-NEXT: [[T_VAR18:%.*]] = alloca i32, align 42550// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42551// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [4 x ptr], align 82552// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82553// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82554// CHECK1-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 82555// CHECK1-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 82556// CHECK1-NEXT: store ptr [[VAR1]], ptr [[VAR1_ADDR]], align 82557// CHECK1-NEXT: store ptr [[T_VAR1]], ptr [[T_VAR1_ADDR]], align 82558// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 82559// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 82560// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 82561// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VAR_ADDR]], align 82562// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR1_ADDR]], align 82563// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[T_VAR1_ADDR]], align 82564// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[VEC_ADDR]], align 82565// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 82566// CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 82567// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 82568// CHECK1-NEXT: store ptr [[TMP6]], ptr [[_TMP1]], align 82569// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42570// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 42571// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42572// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42573// CHECK1-NEXT: call void @.omp_initializer..17(ptr noundef [[T_VAR3]], ptr noundef [[TMP0]])2574// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP1]], align 82575// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[VAR4]], i64 42576// CHECK1-NEXT: [[ADD_PTR5:%.*]] = getelementptr inbounds i8, ptr [[TMP7]], i64 42577// CHECK1-NEXT: call void @.omp_initializer..4(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR5]])2578// CHECK1-NEXT: store ptr [[VAR4]], ptr [[_TMP6]], align 82579// CHECK1-NEXT: call void @.omp_initializer..19(ptr noundef [[VAR17]], ptr noundef [[TMP2]])2580// CHECK1-NEXT: call void @.omp_initializer..21(ptr noundef [[T_VAR18]], ptr noundef [[TMP3]])2581// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82582// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 42583// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP9]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2584// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42585// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP10]], 12586// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2587// CHECK1: cond.true:2588// CHECK1-NEXT: br label [[COND_END:%.*]]2589// CHECK1: cond.false:2590// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42591// CHECK1-NEXT: br label [[COND_END]]2592// CHECK1: cond.end:2593// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]2594// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42595// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42596// CHECK1-NEXT: store i32 [[TMP12]], ptr [[DOTOMP_IV]], align 42597// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2598// CHECK1: omp.inner.for.cond:2599// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42600// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42601// CHECK1-NEXT: [[CMP9:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]2602// CHECK1-NEXT: br i1 [[CMP9]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2603// CHECK1: omp.inner.for.cond.cleanup:2604// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2605// CHECK1: omp.inner.for.body:2606// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42607// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 12608// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2609// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42610// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[T_VAR3]], align 42611// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 42612// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP17]] to i642613// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP4]], i64 0, i64 [[IDXPROM]]2614// CHECK1-NEXT: store i32 [[TMP16]], ptr [[ARRAYIDX]], align 42615// CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[_TMP6]], align 82616// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[I]], align 42617// CHECK1-NEXT: [[IDXPROM10:%.*]] = sext i32 [[TMP19]] to i642618// CHECK1-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[TMP5]], i64 0, i64 [[IDXPROM10]]2619// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN1SIiEaSERKS0_(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYIDX11]], ptr noundef nonnull align 4 dereferenceable(12) [[TMP18]])2620// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2621// CHECK1: omp.body.continue:2622// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2623// CHECK1: omp.inner.for.inc:2624// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42625// CHECK1-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP20]], 12626// CHECK1-NEXT: store i32 [[ADD12]], ptr [[DOTOMP_IV]], align 42627// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2628// CHECK1: omp.inner.for.end:2629// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2630// CHECK1: omp.loop.exit:2631// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP9]])2632// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02633// CHECK1-NEXT: store ptr [[T_VAR3]], ptr [[TMP21]], align 82634// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 12635// CHECK1-NEXT: store ptr [[VAR4]], ptr [[TMP22]], align 82636// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 22637// CHECK1-NEXT: store ptr [[VAR17]], ptr [[TMP23]], align 82638// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 32639// CHECK1-NEXT: store ptr [[T_VAR18]], ptr [[TMP24]], align 82640// CHECK1-NEXT: [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB3]], i32 [[TMP9]], i32 4, i64 32, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z5tmainIiLi42EET_v.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2641// CHECK1-NEXT: switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2642// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2643// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2644// CHECK1-NEXT: ]2645// CHECK1: .omp.reduction.case1:2646// CHECK1-NEXT: call void @.omp_combiner..16(ptr noundef [[TMP0]], ptr noundef [[T_VAR3]])2647// CHECK1-NEXT: [[ADD_PTR13:%.*]] = getelementptr inbounds i8, ptr [[TMP7]], i64 42648// CHECK1-NEXT: [[ADD_PTR14:%.*]] = getelementptr inbounds i8, ptr [[VAR4]], i64 42649// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR13]], ptr noundef [[ADD_PTR14]])2650// CHECK1-NEXT: call void @.omp_combiner..18(ptr noundef [[TMP2]], ptr noundef [[VAR17]])2651// CHECK1-NEXT: call void @.omp_combiner..20(ptr noundef [[TMP3]], ptr noundef [[T_VAR18]])2652// CHECK1-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB3]], i32 [[TMP9]], ptr @.gomp_critical_user_.reduction.var)2653// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2654// CHECK1: .omp.reduction.case2:2655// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)2656// CHECK1-NEXT: call void @.omp_combiner..16(ptr noundef [[TMP0]], ptr noundef [[T_VAR3]])2657// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)2658// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)2659// CHECK1-NEXT: [[ADD_PTR15:%.*]] = getelementptr inbounds i8, ptr [[TMP7]], i64 42660// CHECK1-NEXT: [[ADD_PTR16:%.*]] = getelementptr inbounds i8, ptr [[VAR4]], i64 42661// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR15]], ptr noundef [[ADD_PTR16]])2662// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)2663// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)2664// CHECK1-NEXT: call void @.omp_combiner..18(ptr noundef [[TMP2]], ptr noundef [[VAR17]])2665// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)2666// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)2667// CHECK1-NEXT: call void @.omp_combiner..20(ptr noundef [[TMP3]], ptr noundef [[T_VAR18]])2668// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)2669// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2670// CHECK1: .omp.reduction.default:2671// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR17]]) #[[ATTR3]]2672// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR4]]) #[[ATTR3]]2673// CHECK1-NEXT: ret void2674//2675//2676// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..162677// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {2678// CHECK1-NEXT: entry:2679// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82680// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82681// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82682// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82683// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 82684// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 82685// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP2]], align 42686// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 1513, [[TMP4]]2687// CHECK1-NEXT: store i32 [[ADD]], ptr [[TMP3]], align 42688// CHECK1-NEXT: ret void2689//2690//2691// CHECK1-LABEL: define {{[^@]+}}@.omp_initializer..172692// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {2693// CHECK1-NEXT: entry:2694// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82695// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82696// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82697// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82698// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 82699// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 82700// CHECK1-NEXT: store i32 321, ptr [[TMP3]], align 42701// CHECK1-NEXT: ret void2702//2703//2704// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..182705// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {2706// CHECK1-NEXT: entry:2707// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82708// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82709// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82710// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82711// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 82712// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 82713// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[TMP2]], i32 0, i32 22714// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[F]], align 42715// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 17, [[TMP4]]2716// CHECK1-NEXT: [[F2:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[TMP3]], i32 0, i32 22717// CHECK1-NEXT: store i32 [[MUL]], ptr [[F2]], align 42718// CHECK1-NEXT: ret void2719//2720//2721// CHECK1-LABEL: define {{[^@]+}}@.omp_initializer..192722// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {2723// CHECK1-NEXT: entry:2724// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82725// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82726// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82727// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82728// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 82729// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 82730// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[TMP3]], i64 42731// CHECK1-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[TMP2]], i64 42732// CHECK1-NEXT: call void @_Z5init2R6BaseS1RKS_(ptr noundef nonnull align 4 dereferenceable(4) [[ADD_PTR]], ptr noundef nonnull align 4 dereferenceable(4) [[ADD_PTR2]])2733// CHECK1-NEXT: ret void2734//2735//2736// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..202737// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {2738// CHECK1-NEXT: entry:2739// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82740// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82741// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82742// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82743// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 82744// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 82745// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP2]], align 42746// CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 47, [[TMP4]]2747// CHECK1-NEXT: store i32 [[SUB]], ptr [[TMP3]], align 42748// CHECK1-NEXT: ret void2749//2750//2751// CHECK1-LABEL: define {{[^@]+}}@.omp_initializer..212752// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {2753// CHECK1-NEXT: entry:2754// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82755// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82756// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82757// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82758// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 82759// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 82760// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP2]], align 42761// CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 432, [[TMP4]]2762// CHECK1-NEXT: store i32 [[DIV]], ptr [[TMP3]], align 42763// CHECK1-NEXT: ret void2764//2765//2766// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.omp.reduction.reduction_func2767// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7]] {2768// CHECK1-NEXT: entry:2769// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82770// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82771// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82772// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82773// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82774// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82775// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 02776// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82777// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 02778// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82779// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 12780// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 82781// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 12782// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 82783// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 22784// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 82785// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 22786// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 82787// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 32788// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 82789// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 32790// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 82791// CHECK1-NEXT: call void @.omp_combiner..16(ptr noundef [[TMP7]], ptr noundef [[TMP5]])2792// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[TMP11]], i64 42793// CHECK1-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[TMP9]], i64 42794// CHECK1-NEXT: call void @.omp_combiner..3(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR2]])2795// CHECK1-NEXT: call void @.omp_combiner..18(ptr noundef [[TMP15]], ptr noundef [[TMP13]])2796// CHECK1-NEXT: call void @.omp_combiner..20(ptr noundef [[TMP19]], ptr noundef [[TMP17]])2797// CHECK1-NEXT: ret void2798//2799//2800// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.222801// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[T_VAR:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[VEC:%.*]], ptr noundef nonnull align 4 dereferenceable(24) [[S_ARR:%.*]], ptr noundef nonnull align 4 dereferenceable(12) [[VAR:%.*]]) #[[ATTR1]] {2802// CHECK1-NEXT: entry:2803// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82804// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82805// CHECK1-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 82806// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 82807// CHECK1-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 82808// CHECK1-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 82809// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 82810// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82811// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42812// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 42813// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42814// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42815// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42816// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42817// CHECK1-NEXT: [[T_VAR3:%.*]] = alloca i32, align 42818// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42819// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82820// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82821// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82822// CHECK1-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 82823// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 82824// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 82825// CHECK1-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 82826// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 82827// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VEC_ADDR]], align 82828// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 82829// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 82830// CHECK1-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 82831// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 82832// CHECK1-NEXT: store ptr [[TMP4]], ptr [[_TMP1]], align 82833// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42834// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 42835// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42836// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42837// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr @.init.23, align 42838// CHECK1-NEXT: store i32 [[TMP5]], ptr [[T_VAR3]], align 42839// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82840// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 42841// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP7]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2842// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42843// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP8]], 12844// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2845// CHECK1: cond.true:2846// CHECK1-NEXT: br label [[COND_END:%.*]]2847// CHECK1: cond.false:2848// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42849// CHECK1-NEXT: br label [[COND_END]]2850// CHECK1: cond.end:2851// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]2852// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42853// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42854// CHECK1-NEXT: store i32 [[TMP10]], ptr [[DOTOMP_IV]], align 42855// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2856// CHECK1: omp.inner.for.cond:2857// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42858// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42859// CHECK1-NEXT: [[CMP4:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]2860// CHECK1-NEXT: br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2861// CHECK1: omp.inner.for.body:2862// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42863// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 12864// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2865// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42866// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[T_VAR3]], align 42867// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[I]], align 42868// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP15]] to i642869// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP1]], i64 0, i64 [[IDXPROM]]2870// CHECK1-NEXT: store i32 [[TMP14]], ptr [[ARRAYIDX]], align 42871// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP1]], align 82872// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 42873// CHECK1-NEXT: [[IDXPROM5:%.*]] = sext i32 [[TMP17]] to i642874// CHECK1-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[TMP2]], i64 0, i64 [[IDXPROM5]]2875// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN1SIiEaSERKS0_(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYIDX6]], ptr noundef nonnull align 4 dereferenceable(12) [[TMP16]])2876// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2877// CHECK1: omp.body.continue:2878// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2879// CHECK1: omp.inner.for.inc:2880// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42881// CHECK1-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP18]], 12882// CHECK1-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 42883// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2884// CHECK1: omp.inner.for.end:2885// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2886// CHECK1: omp.loop.exit:2887// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP7]])2888// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02889// CHECK1-NEXT: store ptr [[T_VAR3]], ptr [[TMP19]], align 82890// CHECK1-NEXT: [[TMP20:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3]], i32 [[TMP7]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z5tmainIiLi42EET_v.omp_outlined.22.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2891// CHECK1-NEXT: switch i32 [[TMP20]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2892// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2893// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2894// CHECK1-NEXT: ]2895// CHECK1: .omp.reduction.case1:2896// CHECK1-NEXT: call void @.omp_combiner..24(ptr noundef [[TMP0]], ptr noundef [[T_VAR3]])2897// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP7]], ptr @.gomp_critical_user_.reduction.var)2898// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2899// CHECK1: .omp.reduction.case2:2900// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP7]], ptr @.gomp_critical_user_.atomic_reduction.var)2901// CHECK1-NEXT: call void @.omp_combiner..24(ptr noundef [[TMP0]], ptr noundef [[T_VAR3]])2902// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP7]], ptr @.gomp_critical_user_.atomic_reduction.var)2903// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP7]], ptr @.gomp_critical_user_.reduction.var)2904// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2905// CHECK1: .omp.reduction.default:2906// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP7]])2907// CHECK1-NEXT: ret void2908//2909//2910// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.22.omp.reduction.reduction_func2911// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7]] {2912// CHECK1-NEXT: entry:2913// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82914// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82915// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82916// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82917// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82918// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82919// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02920// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82921// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02922// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82923// CHECK1-NEXT: call void @.omp_combiner..24(ptr noundef [[TMP7]], ptr noundef [[TMP5]])2924// CHECK1-NEXT: ret void2925//2926//2927// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..242928// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {2929// CHECK1-NEXT: entry:2930// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82931// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82932// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82933// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82934// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 82935// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 82936// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP2]], align 42937// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 17, [[TMP4]]2938// CHECK1-NEXT: store i32 [[MUL]], ptr [[TMP3]], align 42939// CHECK1-NEXT: ret void2940//2941//2942// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.252943// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(504) [[ARR:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[VEC:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[T_VAR:%.*]], ptr noundef nonnull align 4 dereferenceable(24) [[S_ARR:%.*]], ptr noundef nonnull align 4 dereferenceable(12) [[VAR:%.*]]) #[[ATTR1]] {2944// CHECK1-NEXT: entry:2945// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82946// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82947// CHECK1-NEXT: [[ARR_ADDR:%.*]] = alloca ptr, align 82948// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 82949// CHECK1-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 82950// CHECK1-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 82951// CHECK1-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 82952// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 82953// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82954// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42955// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 42956// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42957// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42958// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42959// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42960// CHECK1-NEXT: [[ARR4:%.*]] = alloca [40 x %struct.S], align 162961// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42962// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82963// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82964// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82965// CHECK1-NEXT: store ptr [[ARR]], ptr [[ARR_ADDR]], align 82966// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 82967// CHECK1-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 82968// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 82969// CHECK1-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 82970// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[ARR_ADDR]], align 82971// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VEC_ADDR]], align 82972// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 82973// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 82974// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[VAR_ADDR]], align 82975// CHECK1-NEXT: store ptr [[TMP4]], ptr [[TMP]], align 82976// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 82977// CHECK1-NEXT: store ptr [[TMP5]], ptr [[_TMP1]], align 82978// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42979// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 42980// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42981// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42982// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [42 x %struct.S], ptr [[TMP0]], i64 0, i64 12983// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [42 x %struct.S], ptr [[TMP0]], i64 0, i64 402984// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [40 x %struct.S], ptr [[ARR4]], i32 0, i32 02985// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[ARRAY_BEGIN]], i64 402986// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP6]]2987// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]2988// CHECK1: omp.arrayinit.body:2989// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[ARRAYIDX]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]2990// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT6:%.*]], [[OMP_ARRAYINIT_BODY]] ]2991// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 42992// CHECK1-NEXT: [[ADD_PTR5:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 42993// CHECK1-NEXT: call void @.omp_initializer..27(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR5]])2994// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12995// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT6]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12996// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT6]], [[TMP6]]2997// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]2998// CHECK1: omp.arrayinit.done:2999// CHECK1-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i643000// CHECK1-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i643001// CHECK1-NEXT: [[TMP9:%.*]] = sub i64 [[TMP7]], [[TMP8]]3002// CHECK1-NEXT: [[TMP10:%.*]] = sdiv exact i64 [[TMP9]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)3003// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARR4]], i64 [[TMP10]]3004// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83005// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 43006// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP13]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3007// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43008// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP14]], 13009// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3010// CHECK1: cond.true:3011// CHECK1-NEXT: br label [[COND_END:%.*]]3012// CHECK1: cond.false:3013// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43014// CHECK1-NEXT: br label [[COND_END]]3015// CHECK1: cond.end:3016// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]3017// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43018// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43019// CHECK1-NEXT: store i32 [[TMP16]], ptr [[DOTOMP_IV]], align 43020// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3021// CHECK1: omp.inner.for.cond:3022// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43023// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43024// CHECK1-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]3025// CHECK1-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]3026// CHECK1: omp.inner.for.cond.cleanup:3027// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]3028// CHECK1: omp.inner.for.body:3029// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43030// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP19]], 13031// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3032// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 43033// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP2]], align 43034// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[I]], align 43035// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i643036// CHECK1-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP1]], i64 0, i64 [[IDXPROM]]3037// CHECK1-NEXT: store i32 [[TMP20]], ptr [[ARRAYIDX8]], align 43038// CHECK1-NEXT: [[TMP22:%.*]] = load ptr, ptr [[_TMP1]], align 83039// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[I]], align 43040// CHECK1-NEXT: [[IDXPROM9:%.*]] = sext i32 [[TMP23]] to i643041// CHECK1-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[TMP3]], i64 0, i64 [[IDXPROM9]]3042// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN1SIiEaSERKS0_(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYIDX10]], ptr noundef nonnull align 4 dereferenceable(12) [[TMP22]])3043// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3044// CHECK1: omp.body.continue:3045// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3046// CHECK1: omp.inner.for.inc:3047// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43048// CHECK1-NEXT: [[ADD11:%.*]] = add nsw i32 [[TMP24]], 13049// CHECK1-NEXT: store i32 [[ADD11]], ptr [[DOTOMP_IV]], align 43050// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]3051// CHECK1: omp.inner.for.end:3052// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3053// CHECK1: omp.loop.exit:3054// CHECK1-NEXT: [[TMP25:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83055// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 43056// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP26]])3057// CHECK1-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 03058// CHECK1-NEXT: store ptr [[ARR4]], ptr [[TMP27]], align 83059// CHECK1-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83060// CHECK1-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 43061// CHECK1-NEXT: [[TMP30:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB3]], i32 [[TMP29]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z5tmainIiLi42EET_v.omp_outlined.25.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)3062// CHECK1-NEXT: switch i32 [[TMP30]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [3063// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]3064// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]3065// CHECK1-NEXT: ]3066// CHECK1: .omp.reduction.case1:3067// CHECK1-NEXT: [[TMP31:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 403068// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP31]]3069// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE18:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]3070// CHECK1: omp.arraycpy.body:3071// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST12:%.*]] = phi ptr [ [[ARR4]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3072// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST13:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT16:%.*]], [[OMP_ARRAYCPY_BODY]] ]3073// CHECK1-NEXT: [[ADD_PTR14:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST13]], i64 43074// CHECK1-NEXT: [[ADD_PTR15:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST12]], i64 43075// CHECK1-NEXT: call void @.omp_combiner..26(ptr noundef [[ADD_PTR14]], ptr noundef [[ADD_PTR15]])3076// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT16]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST13]], i32 13077// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST12]], i32 13078// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE17:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT16]], [[TMP31]]3079// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE17]], label [[OMP_ARRAYCPY_DONE18]], label [[OMP_ARRAYCPY_BODY]]3080// CHECK1: omp.arraycpy.done18:3081// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.reduction.var)3082// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3083// CHECK1: .omp.reduction.case2:3084// CHECK1-NEXT: [[TMP32:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 403085// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY19:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP32]]3086// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY19]], label [[OMP_ARRAYCPY_DONE28:%.*]], label [[OMP_ARRAYCPY_BODY20:%.*]]3087// CHECK1: omp.arraycpy.body20:3088// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST21:%.*]] = phi ptr [ [[ARR4]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT26:%.*]], [[OMP_ARRAYCPY_BODY20]] ]3089// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST22:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT25:%.*]], [[OMP_ARRAYCPY_BODY20]] ]3090// CHECK1-NEXT: [[TMP33:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83091// CHECK1-NEXT: [[TMP34:%.*]] = load i32, ptr [[TMP33]], align 43092// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB1]], i32 [[TMP34]], ptr @.gomp_critical_user_.atomic_reduction.var)3093// CHECK1-NEXT: [[ADD_PTR23:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST22]], i64 43094// CHECK1-NEXT: [[ADD_PTR24:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST21]], i64 43095// CHECK1-NEXT: call void @.omp_combiner..26(ptr noundef [[ADD_PTR23]], ptr noundef [[ADD_PTR24]])3096// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB1]], i32 [[TMP34]], ptr @.gomp_critical_user_.atomic_reduction.var)3097// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT25]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST22]], i32 13098// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT26]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST21]], i32 13099// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE27:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT25]], [[TMP32]]3100// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE27]], label [[OMP_ARRAYCPY_DONE28]], label [[OMP_ARRAYCPY_BODY20]]3101// CHECK1: omp.arraycpy.done28:3102// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.reduction.var)3103// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3104// CHECK1: .omp.reduction.default:3105// CHECK1-NEXT: [[ARRAY_BEGIN29:%.*]] = getelementptr inbounds [40 x %struct.S], ptr [[ARR4]], i32 0, i32 03106// CHECK1-NEXT: [[TMP35:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN29]], i64 403107// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]3108// CHECK1: arraydestroy.body:3109// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP35]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]3110// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -13111// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]]3112// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN29]]3113// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE30:%.*]], label [[ARRAYDESTROY_BODY]]3114// CHECK1: arraydestroy.done30:3115// CHECK1-NEXT: [[TMP36:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83116// CHECK1-NEXT: [[TMP37:%.*]] = load i32, ptr [[TMP36]], align 43117// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP37]])3118// CHECK1-NEXT: ret void3119//3120//3121// CHECK1-LABEL: define {{[^@]+}}@.omp_combiner..263122// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {3123// CHECK1-NEXT: entry:3124// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83125// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83126// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83127// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83128// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 83129// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 83130// CHECK1-NEXT: call void @_Z8red_plusR6BaseS1RKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP3]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP2]])3131// CHECK1-NEXT: ret void3132//3133//3134// CHECK1-LABEL: define {{[^@]+}}@.omp_initializer..273135// CHECK1-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR2]] {3136// CHECK1-NEXT: entry:3137// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83138// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83139// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83140// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83141// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 83142// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 83143// CHECK1-NEXT: call void @_Z9init_plusR6BaseS1RKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP3]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP2]])3144// CHECK1-NEXT: ret void3145//3146//3147// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.25.omp.reduction.reduction_func3148// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR7]] {3149// CHECK1-NEXT: entry:3150// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83151// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83152// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83153// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83154// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 83155// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 83156// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 03157// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 83158// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 03159// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 83160// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP7]], i64 403161// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]3162// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE3:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]3163// CHECK1: omp.arraycpy.body:3164// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3165// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3166// CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i64 43167// CHECK1-NEXT: [[ADD_PTR2:%.*]] = getelementptr inbounds i8, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 43168// CHECK1-NEXT: call void @.omp_combiner..26(ptr noundef [[ADD_PTR]], ptr noundef [[ADD_PTR2]])3169// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 13170// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 13171// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]3172// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE3]], label [[OMP_ARRAYCPY_BODY]]3173// CHECK1: omp.arraycpy.done3:3174// CHECK1-NEXT: ret void3175//3176//3177// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ei3178// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3179// CHECK1-NEXT: entry:3180// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83181// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i32, align 43182// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83183// CHECK1-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 43184// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83185// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[THIS1]], i64 43186// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 23187// CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_ADDR]], align 43188// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double3189// CHECK1-NEXT: [[TMP2:%.*]] = load volatile double, ptr @g, align 83190// CHECK1-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP2]]3191// CHECK1-NEXT: [[CONV2:%.*]] = fptosi double [[ADD]] to i323192// CHECK1-NEXT: store i32 [[CONV2]], ptr [[F]], align 43193// CHECK1-NEXT: ret void3194//3195//3196// CHECK3-LABEL: define {{[^@]+}}@_Z4bazzv3197// CHECK3-SAME: () #[[ATTR0:[0-9]+]] {3198// CHECK3-NEXT: entry:3199// CHECK3-NEXT: [[S:%.*]] = alloca [[STRUCT_S:%.*]], align 43200// CHECK3-NEXT: [[TMP:%.*]] = alloca i32, align 43201// CHECK3-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43202// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 43203// CHECK3-NEXT: [[S1:%.*]] = alloca [[STRUCT_S]], align 43204// CHECK3-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[S]])3205// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_IV]], align 43206// CHECK3-NEXT: call void @.omp_initializer.(ptr noundef [[S1]], ptr noundef [[S]])3207// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3208// CHECK3: omp.inner.for.cond:3209// CHECK3-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2:![0-9]+]]3210// CHECK3-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 103211// CHECK3-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]3212// CHECK3: omp.inner.for.cond.cleanup:3213// CHECK3-NEXT: br label [[OMP_INNER_FOR_END:%.*]]3214// CHECK3: omp.inner.for.body:3215// CHECK3-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]3216// CHECK3-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], 13217// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3218// CHECK3-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP2]]3219// CHECK3-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3220// CHECK3: omp.body.continue:3221// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3222// CHECK3: omp.inner.for.inc:3223// CHECK3-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]3224// CHECK3-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP2]], 13225// CHECK3-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]3226// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]3227// CHECK3: omp.inner.for.end:3228// CHECK3-NEXT: store i32 10, ptr [[I]], align 43229// CHECK3-NEXT: call void @.omp_combiner.(ptr noundef [[S]], ptr noundef [[S1]])3230// CHECK3-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[S1]]) #[[ATTR6:[0-9]+]]3231// CHECK3-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[S]]) #[[ATTR6]]3232// CHECK3-NEXT: ret void3233//3234//3235// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ev3236// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3237// CHECK3-NEXT: entry:3238// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83239// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83240// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83241// CHECK3-NEXT: call void @_ZN1SIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]])3242// CHECK3-NEXT: ret void3243//3244//3245// CHECK3-LABEL: define {{[^@]+}}@.omp_combiner.3246// CHECK3-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR1:[0-9]+]] {3247// CHECK3-NEXT: entry:3248// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83249// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83250// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83251// CHECK3-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83252// CHECK3-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 83253// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 83254// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[TMP2]], i32 0, i32 23255// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[F]], align 43256// CHECK3-NEXT: [[MUL:%.*]] = mul nsw i32 17, [[TMP4]]3257// CHECK3-NEXT: [[F2:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[TMP3]], i32 0, i32 23258// CHECK3-NEXT: store i32 [[MUL]], ptr [[F2]], align 43259// CHECK3-NEXT: ret void3260//3261//3262// CHECK3-LABEL: define {{[^@]+}}@.omp_initializer.3263// CHECK3-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR1]] {3264// CHECK3-NEXT: entry:3265// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83266// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83267// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83268// CHECK3-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83269// CHECK3-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 83270// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 83271// CHECK3-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TMP3]])3272// CHECK3-NEXT: ret void3273//3274//3275// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIiED1Ev3276// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3277// CHECK3-NEXT: entry:3278// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83279// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83280// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83281// CHECK3-NEXT: call void @_ZN1SIiED2Ev(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]]) #[[ATTR6]]3282// CHECK3-NEXT: ret void3283//3284//3285// CHECK3-LABEL: define {{[^@]+}}@main3286// CHECK3-SAME: () #[[ATTR2:[0-9]+]] {3287// CHECK3-NEXT: entry:3288// CHECK3-NEXT: [[RETVAL:%.*]] = alloca i32, align 43289// CHECK3-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S_0:%.*]], align 43290// CHECK3-NEXT: [[T_VAR:%.*]] = alloca float, align 43291// CHECK3-NEXT: [[T_VAR1:%.*]] = alloca float, align 43292// CHECK3-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 43293// CHECK3-NEXT: [[S_ARR:%.*]] = alloca [4 x %struct.S.0], align 163294// CHECK3-NEXT: [[VAR:%.*]] = alloca ptr, align 83295// CHECK3-NEXT: [[VAR1:%.*]] = alloca [[STRUCT_S_0]], align 43296// CHECK3-NEXT: [[ARRS:%.*]] = alloca [10 x [4 x %struct.S.0]], align 163297// CHECK3-NEXT: [[VAR2:%.*]] = alloca ptr, align 83298// CHECK3-NEXT: [[VVAR2:%.*]] = alloca [5 x %struct.S.0], align 163299// CHECK3-NEXT: [[VAR3:%.*]] = alloca ptr, align 83300// CHECK3-NEXT: [[TMP:%.*]] = alloca ptr, align 83301// CHECK3-NEXT: [[_TMP10:%.*]] = alloca ptr, align 83302// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 43303// CHECK3-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 83304// CHECK3-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 83305// CHECK3-NEXT: [[I15:%.*]] = alloca i32, align 43306// CHECK3-NEXT: [[I26:%.*]] = alloca i32, align 43307// CHECK3-NEXT: [[I37:%.*]] = alloca i32, align 43308// CHECK3-NEXT: [[I44:%.*]] = alloca i32, align 43309// CHECK3-NEXT: [[_TMP51:%.*]] = alloca ptr, align 83310// CHECK3-NEXT: [[_TMP52:%.*]] = alloca ptr, align 83311// CHECK3-NEXT: [[I53:%.*]] = alloca i32, align 43312// CHECK3-NEXT: [[_TMP60:%.*]] = alloca ptr, align 83313// CHECK3-NEXT: [[_TMP61:%.*]] = alloca ptr, align 83314// CHECK3-NEXT: [[I62:%.*]] = alloca i32, align 43315// CHECK3-NEXT: store i32 0, ptr [[RETVAL]], align 43316// CHECK3-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TEST]])3317// CHECK3-NEXT: store float 0.000000e+00, ptr [[T_VAR]], align 43318// CHECK3-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const.main.vec, i64 8, i1 false)3319// CHECK3-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(12) [[S_ARR]], float noundef 1.000000e+00)3320// CHECK3-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 13321// CHECK3-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYINIT_ELEMENT]], float noundef 2.000000e+00)3322// CHECK3-NEXT: [[ARRAYINIT_ELEMENT1:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 23323// CHECK3-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYINIT_ELEMENT1]], float noundef 3.000000e+00)3324// CHECK3-NEXT: [[ARRAYINIT_ELEMENT2:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 33325// CHECK3-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYINIT_ELEMENT2]], float noundef 4.000000e+00)3326// CHECK3-NEXT: store ptr [[TEST]], ptr [[VAR]], align 83327// CHECK3-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR1]])3328// CHECK3-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [10 x [4 x %struct.S.0]], ptr [[ARRS]], i32 0, i32 0, i32 03329// CHECK3-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 403330// CHECK3-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]3331// CHECK3: arrayctor.loop:3332// CHECK3-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]3333// CHECK3-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYCTOR_CUR]])3334// CHECK3-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i64 13335// CHECK3-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]3336// CHECK3-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]3337// CHECK3: arrayctor.cont:3338// CHECK3-NEXT: [[CALL:%.*]] = call noundef ptr @_Z3foov()3339// CHECK3-NEXT: store ptr [[CALL]], ptr [[VAR2]], align 83340// CHECK3-NEXT: [[ARRAY_BEGIN3:%.*]] = getelementptr inbounds [5 x %struct.S.0], ptr [[VVAR2]], i32 0, i32 03341// CHECK3-NEXT: [[ARRAYCTOR_END4:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN3]], i64 53342// CHECK3-NEXT: br label [[ARRAYCTOR_LOOP5:%.*]]3343// CHECK3: arrayctor.loop5:3344// CHECK3-NEXT: [[ARRAYCTOR_CUR6:%.*]] = phi ptr [ [[ARRAY_BEGIN3]], [[ARRAYCTOR_CONT]] ], [ [[ARRAYCTOR_NEXT7:%.*]], [[ARRAYCTOR_LOOP5]] ]3345// CHECK3-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYCTOR_CUR6]])3346// CHECK3-NEXT: [[ARRAYCTOR_NEXT7]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR6]], i64 13347// CHECK3-NEXT: [[ARRAYCTOR_DONE8:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT7]], [[ARRAYCTOR_END4]]3348// CHECK3-NEXT: br i1 [[ARRAYCTOR_DONE8]], label [[ARRAYCTOR_CONT9:%.*]], label [[ARRAYCTOR_LOOP5]]3349// CHECK3: arrayctor.cont9:3350// CHECK3-NEXT: store ptr [[S_ARR]], ptr [[VAR3]], align 83351// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 83352// CHECK3-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 83353// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 83354// CHECK3-NEXT: store ptr [[TMP1]], ptr [[_TMP10]], align 83355// CHECK3-NEXT: store i32 0, ptr [[I]], align 43356// CHECK3-NEXT: br label [[FOR_COND:%.*]]3357// CHECK3: for.cond:3358// CHECK3-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 43359// CHECK3-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 23360// CHECK3-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]3361// CHECK3: for.body:3362// CHECK3-NEXT: [[TMP3:%.*]] = load float, ptr [[T_VAR]], align 43363// CHECK3-NEXT: [[CONV:%.*]] = fptosi float [[TMP3]] to i323364// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 43365// CHECK3-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i643366// CHECK3-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i64 0, i64 [[IDXPROM]]3367// CHECK3-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 43368// CHECK3-NEXT: [[TMP5:%.*]] = load ptr, ptr [[_TMP10]], align 83369// CHECK3-NEXT: [[TMP6:%.*]] = load i32, ptr [[I]], align 43370// CHECK3-NEXT: [[IDXPROM11:%.*]] = sext i32 [[TMP6]] to i643371// CHECK3-NEXT: [[ARRAYIDX12:%.*]] = getelementptr inbounds [4 x %struct.S.0], ptr [[S_ARR]], i64 0, i64 [[IDXPROM11]]3372// CHECK3-NEXT: [[CALL13:%.*]] = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN1SIfEaSERKS0_(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYIDX12]], ptr noundef nonnull align 4 dereferenceable(12) [[TMP5]])3373// CHECK3-NEXT: br label [[FOR_INC:%.*]]3374// CHECK3: for.inc:3375// CHECK3-NEXT: [[TMP7:%.*]] = load i32, ptr [[I]], align 43376// CHECK3-NEXT: [[INC:%.*]] = add nsw i32 [[TMP7]], 13377// CHECK3-NEXT: store i32 [[INC]], ptr [[I]], align 43378// CHECK3-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP6:![0-9]+]]3379// CHECK3: for.end:3380// CHECK3-NEXT: [[ARRAYIDX14:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i64 0, i64 13381// CHECK3-NEXT: [[TMP8:%.*]] = load i32, ptr [[ARRAYIDX14]], align 43382// CHECK3-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i643383// CHECK3-NEXT: [[TMP10:%.*]] = call ptr @llvm.stacksave.p0()3384// CHECK3-NEXT: store ptr [[TMP10]], ptr [[SAVED_STACK]], align 83385// CHECK3-NEXT: [[TMP11:%.*]] = mul nuw i64 10, [[TMP9]]3386// CHECK3-NEXT: [[VLA:%.*]] = alloca i32, i64 [[TMP11]], align 163387// CHECK3-NEXT: store i64 [[TMP9]], ptr [[__VLA_EXPR0]], align 83388// CHECK3-NEXT: store i32 0, ptr [[I15]], align 43389// CHECK3-NEXT: br label [[FOR_COND16:%.*]]3390// CHECK3: for.cond16:3391// CHECK3-NEXT: [[TMP12:%.*]] = load i32, ptr [[I15]], align 43392// CHECK3-NEXT: [[CMP17:%.*]] = icmp slt i32 [[TMP12]], 103393// CHECK3-NEXT: br i1 [[CMP17]], label [[FOR_BODY18:%.*]], label [[FOR_END25:%.*]]3394// CHECK3: for.body18:3395// CHECK3-NEXT: [[TMP13:%.*]] = mul nsw i64 1, [[TMP9]]3396// CHECK3-NEXT: [[ARRAYIDX19:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i64 [[TMP13]]3397// CHECK3-NEXT: [[TMP14:%.*]] = load i32, ptr [[I15]], align 43398// CHECK3-NEXT: [[IDXPROM20:%.*]] = sext i32 [[TMP14]] to i643399// CHECK3-NEXT: [[ARRAYIDX21:%.*]] = getelementptr inbounds i32, ptr [[ARRAYIDX19]], i64 [[IDXPROM20]]3400// CHECK3-NEXT: [[TMP15:%.*]] = load i32, ptr [[ARRAYIDX21]], align 43401// CHECK3-NEXT: [[INC22:%.*]] = add nsw i32 [[TMP15]], 13402// CHECK3-NEXT: store i32 [[INC22]], ptr [[ARRAYIDX21]], align 43403// CHECK3-NEXT: br label [[FOR_INC23:%.*]]3404// CHECK3: for.inc23:3405// CHECK3-NEXT: [[TMP16:%.*]] = load i32, ptr [[I15]], align 43406// CHECK3-NEXT: [[INC24:%.*]] = add nsw i32 [[TMP16]], 13407// CHECK3-NEXT: store i32 [[INC24]], ptr [[I15]], align 43408// CHECK3-NEXT: br label [[FOR_COND16]], !llvm.loop [[LOOP8:![0-9]+]]3409// CHECK3: for.end25:3410// CHECK3-NEXT: store i32 0, ptr [[I26]], align 43411// CHECK3-NEXT: br label [[FOR_COND27:%.*]]3412// CHECK3: for.cond27:3413// CHECK3-NEXT: [[TMP17:%.*]] = load i32, ptr [[I26]], align 43414// CHECK3-NEXT: [[CMP28:%.*]] = icmp slt i32 [[TMP17]], 103415// CHECK3-NEXT: br i1 [[CMP28]], label [[FOR_BODY29:%.*]], label [[FOR_END36:%.*]]3416// CHECK3: for.body29:3417// CHECK3-NEXT: [[TMP18:%.*]] = mul nsw i64 1, [[TMP9]]3418// CHECK3-NEXT: [[ARRAYIDX30:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i64 [[TMP18]]3419// CHECK3-NEXT: [[TMP19:%.*]] = load i32, ptr [[I26]], align 43420// CHECK3-NEXT: [[IDXPROM31:%.*]] = sext i32 [[TMP19]] to i643421// CHECK3-NEXT: [[ARRAYIDX32:%.*]] = getelementptr inbounds i32, ptr [[ARRAYIDX30]], i64 [[IDXPROM31]]3422// CHECK3-NEXT: [[TMP20:%.*]] = load i32, ptr [[ARRAYIDX32]], align 43423// CHECK3-NEXT: [[INC33:%.*]] = add nsw i32 [[TMP20]], 13424// CHECK3-NEXT: store i32 [[INC33]], ptr [[ARRAYIDX32]], align 43425// CHECK3-NEXT: br label [[FOR_INC34:%.*]]3426// CHECK3: for.inc34:3427// CHECK3-NEXT: [[TMP21:%.*]] = load i32, ptr [[I26]], align 43428// CHECK3-NEXT: [[INC35:%.*]] = add nsw i32 [[TMP21]], 13429// CHECK3-NEXT: store i32 [[INC35]], ptr [[I26]], align 43430// CHECK3-NEXT: br label [[FOR_COND27]], !llvm.loop [[LOOP9:![0-9]+]]3431// CHECK3: for.end36:3432// CHECK3-NEXT: store i32 0, ptr [[I37]], align 43433// CHECK3-NEXT: br label [[FOR_COND38:%.*]]3434// CHECK3: for.cond38:3435// CHECK3-NEXT: [[TMP22:%.*]] = load i32, ptr [[I37]], align 43436// CHECK3-NEXT: [[CMP39:%.*]] = icmp slt i32 [[TMP22]], 103437// CHECK3-NEXT: br i1 [[CMP39]], label [[FOR_BODY40:%.*]], label [[FOR_END43:%.*]]3438// CHECK3: for.body40:3439// CHECK3-NEXT: br label [[FOR_INC41:%.*]]3440// CHECK3: for.inc41:3441// CHECK3-NEXT: [[TMP23:%.*]] = load i32, ptr [[I37]], align 43442// CHECK3-NEXT: [[INC42:%.*]] = add nsw i32 [[TMP23]], 13443// CHECK3-NEXT: store i32 [[INC42]], ptr [[I37]], align 43444// CHECK3-NEXT: br label [[FOR_COND38]], !llvm.loop [[LOOP10:![0-9]+]]3445// CHECK3: for.end43:3446// CHECK3-NEXT: store i32 0, ptr [[I44]], align 43447// CHECK3-NEXT: br label [[FOR_COND45:%.*]]3448// CHECK3: for.cond45:3449// CHECK3-NEXT: [[TMP24:%.*]] = load i32, ptr [[I44]], align 43450// CHECK3-NEXT: [[CMP46:%.*]] = icmp slt i32 [[TMP24]], 103451// CHECK3-NEXT: br i1 [[CMP46]], label [[FOR_BODY47:%.*]], label [[FOR_END50:%.*]]3452// CHECK3: for.body47:3453// CHECK3-NEXT: br label [[FOR_INC48:%.*]]3454// CHECK3: for.inc48:3455// CHECK3-NEXT: [[TMP25:%.*]] = load i32, ptr [[I44]], align 43456// CHECK3-NEXT: [[INC49:%.*]] = add nsw i32 [[TMP25]], 13457// CHECK3-NEXT: store i32 [[INC49]], ptr [[I44]], align 43458// CHECK3-NEXT: br label [[FOR_COND45]], !llvm.loop [[LOOP11:![0-9]+]]3459// CHECK3: for.end50:3460// CHECK3-NEXT: [[TMP26:%.*]] = load ptr, ptr [[VAR3]], align 83461// CHECK3-NEXT: store ptr [[TMP26]], ptr [[_TMP51]], align 83462// CHECK3-NEXT: [[TMP27:%.*]] = load ptr, ptr [[_TMP51]], align 83463// CHECK3-NEXT: store ptr [[TMP27]], ptr [[_TMP52]], align 83464// CHECK3-NEXT: store i32 0, ptr [[I53]], align 43465// CHECK3-NEXT: br label [[FOR_COND54:%.*]]3466// CHECK3: for.cond54:3467// CHECK3-NEXT: [[TMP28:%.*]] = load i32, ptr [[I53]], align 43468// CHECK3-NEXT: [[CMP55:%.*]] = icmp slt i32 [[TMP28]], 103469// CHECK3-NEXT: br i1 [[CMP55]], label [[FOR_BODY56:%.*]], label [[FOR_END59:%.*]]3470// CHECK3: for.body56:3471// CHECK3-NEXT: br label [[FOR_INC57:%.*]]3472// CHECK3: for.inc57:3473// CHECK3-NEXT: [[TMP29:%.*]] = load i32, ptr [[I53]], align 43474// CHECK3-NEXT: [[INC58:%.*]] = add nsw i32 [[TMP29]], 13475// CHECK3-NEXT: store i32 [[INC58]], ptr [[I53]], align 43476// CHECK3-NEXT: br label [[FOR_COND54]], !llvm.loop [[LOOP12:![0-9]+]]3477// CHECK3: for.end59:3478// CHECK3-NEXT: [[TMP30:%.*]] = load ptr, ptr [[VAR3]], align 83479// CHECK3-NEXT: store ptr [[TMP30]], ptr [[_TMP60]], align 83480// CHECK3-NEXT: [[TMP31:%.*]] = load ptr, ptr [[_TMP60]], align 83481// CHECK3-NEXT: store ptr [[TMP31]], ptr [[_TMP61]], align 83482// CHECK3-NEXT: store i32 0, ptr [[I62]], align 43483// CHECK3-NEXT: br label [[FOR_COND63:%.*]]3484// CHECK3: for.cond63:3485// CHECK3-NEXT: [[TMP32:%.*]] = load i32, ptr [[I62]], align 43486// CHECK3-NEXT: [[CMP64:%.*]] = icmp slt i32 [[TMP32]], 103487// CHECK3-NEXT: br i1 [[CMP64]], label [[FOR_BODY65:%.*]], label [[FOR_END68:%.*]]3488// CHECK3: for.body65:3489// CHECK3-NEXT: br label [[FOR_INC66:%.*]]3490// CHECK3: for.inc66:3491// CHECK3-NEXT: [[TMP33:%.*]] = load i32, ptr [[I62]], align 43492// CHECK3-NEXT: [[INC67:%.*]] = add nsw i32 [[TMP33]], 13493// CHECK3-NEXT: store i32 [[INC67]], ptr [[I62]], align 43494// CHECK3-NEXT: br label [[FOR_COND63]], !llvm.loop [[LOOP13:![0-9]+]]3495// CHECK3: for.end68:3496// CHECK3-NEXT: [[CALL69:%.*]] = call noundef i32 @_Z5tmainIiLi42EET_v()3497// CHECK3-NEXT: store i32 [[CALL69]], ptr [[RETVAL]], align 43498// CHECK3-NEXT: [[TMP34:%.*]] = load ptr, ptr [[SAVED_STACK]], align 83499// CHECK3-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP34]])3500// CHECK3-NEXT: [[ARRAY_BEGIN70:%.*]] = getelementptr inbounds [5 x %struct.S.0], ptr [[VVAR2]], i32 0, i32 03501// CHECK3-NEXT: [[TMP35:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN70]], i64 53502// CHECK3-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]3503// CHECK3: arraydestroy.body:3504// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP35]], [[FOR_END68]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]3505// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -13506// CHECK3-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR6]]3507// CHECK3-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN70]]3508// CHECK3-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE71:%.*]], label [[ARRAYDESTROY_BODY]]3509// CHECK3: arraydestroy.done71:3510// CHECK3-NEXT: [[ARRAY_BEGIN72:%.*]] = getelementptr inbounds [10 x [4 x %struct.S.0]], ptr [[ARRS]], i32 0, i32 0, i32 03511// CHECK3-NEXT: [[TMP36:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN72]], i64 403512// CHECK3-NEXT: br label [[ARRAYDESTROY_BODY73:%.*]]3513// CHECK3: arraydestroy.body73:3514// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENTPAST74:%.*]] = phi ptr [ [[TMP36]], [[ARRAYDESTROY_DONE71]] ], [ [[ARRAYDESTROY_ELEMENT75:%.*]], [[ARRAYDESTROY_BODY73]] ]3515// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENT75]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST74]], i64 -13516// CHECK3-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT75]]) #[[ATTR6]]3517// CHECK3-NEXT: [[ARRAYDESTROY_DONE76:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT75]], [[ARRAY_BEGIN72]]3518// CHECK3-NEXT: br i1 [[ARRAYDESTROY_DONE76]], label [[ARRAYDESTROY_DONE77:%.*]], label [[ARRAYDESTROY_BODY73]]3519// CHECK3: arraydestroy.done77:3520// CHECK3-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR1]]) #[[ATTR6]]3521// CHECK3-NEXT: [[ARRAY_BEGIN78:%.*]] = getelementptr inbounds [4 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 03522// CHECK3-NEXT: [[TMP37:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN78]], i64 43523// CHECK3-NEXT: br label [[ARRAYDESTROY_BODY79:%.*]]3524// CHECK3: arraydestroy.body79:3525// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENTPAST80:%.*]] = phi ptr [ [[TMP37]], [[ARRAYDESTROY_DONE77]] ], [ [[ARRAYDESTROY_ELEMENT81:%.*]], [[ARRAYDESTROY_BODY79]] ]3526// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENT81]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST80]], i64 -13527// CHECK3-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT81]]) #[[ATTR6]]3528// CHECK3-NEXT: [[ARRAYDESTROY_DONE82:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT81]], [[ARRAY_BEGIN78]]3529// CHECK3-NEXT: br i1 [[ARRAYDESTROY_DONE82]], label [[ARRAYDESTROY_DONE83:%.*]], label [[ARRAYDESTROY_BODY79]]3530// CHECK3: arraydestroy.done83:3531// CHECK3-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TEST]]) #[[ATTR6]]3532// CHECK3-NEXT: [[TMP38:%.*]] = load i32, ptr [[RETVAL]], align 43533// CHECK3-NEXT: ret i32 [[TMP38]]3534//3535//3536// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ev3537// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3538// CHECK3-NEXT: entry:3539// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83540// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83541// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83542// CHECK3-NEXT: call void @_ZN1SIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]])3543// CHECK3-NEXT: ret void3544//3545//3546// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ef3547// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3548// CHECK3-NEXT: entry:3549// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83550// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float, align 43551// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83552// CHECK3-NEXT: store float [[A]], ptr [[A_ADDR]], align 43553// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83554// CHECK3-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 43555// CHECK3-NEXT: call void @_ZN1SIfEC2Ef(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]], float noundef [[TMP0]])3556// CHECK3-NEXT: ret void3557//3558//3559// CHECK3-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v3560// CHECK3-SAME: () #[[ATTR0]] {3561// CHECK3-NEXT: entry:3562// CHECK3-NEXT: [[RETVAL:%.*]] = alloca i32, align 43563// CHECK3-NEXT: [[T:%.*]] = alloca i32, align 43564// CHECK3-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S:%.*]], align 43565// CHECK3-NEXT: [[T_VAR:%.*]] = alloca i32, align 43566// CHECK3-NEXT: [[T_VAR1:%.*]] = alloca i32, align 43567// CHECK3-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 43568// CHECK3-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S], align 163569// CHECK3-NEXT: [[VAR:%.*]] = alloca ptr, align 83570// CHECK3-NEXT: [[VAR1:%.*]] = alloca [[STRUCT_S]], align 43571// CHECK3-NEXT: [[ARR:%.*]] = alloca [42 x %struct.S], align 163572// CHECK3-NEXT: [[TMP:%.*]] = alloca ptr, align 83573// CHECK3-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83574// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 43575// CHECK3-NEXT: [[_TMP4:%.*]] = alloca ptr, align 83576// CHECK3-NEXT: [[_TMP5:%.*]] = alloca ptr, align 83577// CHECK3-NEXT: [[I6:%.*]] = alloca i32, align 43578// CHECK3-NEXT: [[_TMP18:%.*]] = alloca ptr, align 83579// CHECK3-NEXT: [[_TMP19:%.*]] = alloca ptr, align 83580// CHECK3-NEXT: [[I20:%.*]] = alloca i32, align 43581// CHECK3-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TEST]])3582// CHECK3-NEXT: store i32 0, ptr [[T_VAR]], align 43583// CHECK3-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const._Z5tmainIiLi42EET_v.vec, i64 8, i1 false)3584// CHECK3-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(12) [[S_ARR]], i32 noundef 1)3585// CHECK3-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i64 13586// CHECK3-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYINIT_ELEMENT]], i32 noundef 2)3587// CHECK3-NEXT: store ptr [[TEST]], ptr [[VAR]], align 83588// CHECK3-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR1]])3589// CHECK3-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [42 x %struct.S], ptr [[ARR]], i32 0, i32 03590// CHECK3-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 423591// CHECK3-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]3592// CHECK3: arrayctor.loop:3593// CHECK3-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]3594// CHECK3-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYCTOR_CUR]])3595// CHECK3-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i64 13596// CHECK3-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]3597// CHECK3-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]3598// CHECK3: arrayctor.cont:3599// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 83600// CHECK3-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 83601// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 83602// CHECK3-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 83603// CHECK3-NEXT: store i32 0, ptr [[I]], align 43604// CHECK3-NEXT: br label [[FOR_COND:%.*]]3605// CHECK3: for.cond:3606// CHECK3-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 43607// CHECK3-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 23608// CHECK3-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]3609// CHECK3: for.body:3610// CHECK3-NEXT: [[TMP3:%.*]] = load i32, ptr [[T_VAR]], align 43611// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 43612// CHECK3-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i643613// CHECK3-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i64 0, i64 [[IDXPROM]]3614// CHECK3-NEXT: store i32 [[TMP3]], ptr [[ARRAYIDX]], align 43615// CHECK3-NEXT: [[TMP5:%.*]] = load ptr, ptr [[_TMP1]], align 83616// CHECK3-NEXT: [[TMP6:%.*]] = load i32, ptr [[I]], align 43617// CHECK3-NEXT: [[IDXPROM2:%.*]] = sext i32 [[TMP6]] to i643618// CHECK3-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i64 0, i64 [[IDXPROM2]]3619// CHECK3-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN1SIiEaSERKS0_(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYIDX3]], ptr noundef nonnull align 4 dereferenceable(12) [[TMP5]])3620// CHECK3-NEXT: br label [[FOR_INC:%.*]]3621// CHECK3: for.inc:3622// CHECK3-NEXT: [[TMP7:%.*]] = load i32, ptr [[I]], align 43623// CHECK3-NEXT: [[INC:%.*]] = add nsw i32 [[TMP7]], 13624// CHECK3-NEXT: store i32 [[INC]], ptr [[I]], align 43625// CHECK3-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP14:![0-9]+]]3626// CHECK3: for.end:3627// CHECK3-NEXT: [[TMP8:%.*]] = load ptr, ptr [[VAR]], align 83628// CHECK3-NEXT: store ptr [[TMP8]], ptr [[_TMP4]], align 83629// CHECK3-NEXT: [[TMP9:%.*]] = load ptr, ptr [[_TMP4]], align 83630// CHECK3-NEXT: store ptr [[TMP9]], ptr [[_TMP5]], align 83631// CHECK3-NEXT: store i32 0, ptr [[I6]], align 43632// CHECK3-NEXT: br label [[FOR_COND7:%.*]]3633// CHECK3: for.cond7:3634// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[I6]], align 43635// CHECK3-NEXT: [[CMP8:%.*]] = icmp slt i32 [[TMP10]], 23636// CHECK3-NEXT: br i1 [[CMP8]], label [[FOR_BODY9:%.*]], label [[FOR_END17:%.*]]3637// CHECK3: for.body9:3638// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[T_VAR]], align 43639// CHECK3-NEXT: [[TMP12:%.*]] = load i32, ptr [[I6]], align 43640// CHECK3-NEXT: [[IDXPROM10:%.*]] = sext i32 [[TMP12]] to i643641// CHECK3-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i64 0, i64 [[IDXPROM10]]3642// CHECK3-NEXT: store i32 [[TMP11]], ptr [[ARRAYIDX11]], align 43643// CHECK3-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP5]], align 83644// CHECK3-NEXT: [[TMP14:%.*]] = load i32, ptr [[I6]], align 43645// CHECK3-NEXT: [[IDXPROM12:%.*]] = sext i32 [[TMP14]] to i643646// CHECK3-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i64 0, i64 [[IDXPROM12]]3647// CHECK3-NEXT: [[CALL14:%.*]] = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN1SIiEaSERKS0_(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYIDX13]], ptr noundef nonnull align 4 dereferenceable(12) [[TMP13]])3648// CHECK3-NEXT: br label [[FOR_INC15:%.*]]3649// CHECK3: for.inc15:3650// CHECK3-NEXT: [[TMP15:%.*]] = load i32, ptr [[I6]], align 43651// CHECK3-NEXT: [[INC16:%.*]] = add nsw i32 [[TMP15]], 13652// CHECK3-NEXT: store i32 [[INC16]], ptr [[I6]], align 43653// CHECK3-NEXT: br label [[FOR_COND7]], !llvm.loop [[LOOP15:![0-9]+]]3654// CHECK3: for.end17:3655// CHECK3-NEXT: [[TMP16:%.*]] = load ptr, ptr [[VAR]], align 83656// CHECK3-NEXT: store ptr [[TMP16]], ptr [[_TMP18]], align 83657// CHECK3-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP18]], align 83658// CHECK3-NEXT: store ptr [[TMP17]], ptr [[_TMP19]], align 83659// CHECK3-NEXT: store i32 0, ptr [[I20]], align 43660// CHECK3-NEXT: br label [[FOR_COND21:%.*]]3661// CHECK3: for.cond21:3662// CHECK3-NEXT: [[TMP18:%.*]] = load i32, ptr [[I20]], align 43663// CHECK3-NEXT: [[CMP22:%.*]] = icmp slt i32 [[TMP18]], 23664// CHECK3-NEXT: br i1 [[CMP22]], label [[FOR_BODY23:%.*]], label [[FOR_END31:%.*]]3665// CHECK3: for.body23:3666// CHECK3-NEXT: [[TMP19:%.*]] = load i32, ptr [[T_VAR]], align 43667// CHECK3-NEXT: [[TMP20:%.*]] = load i32, ptr [[I20]], align 43668// CHECK3-NEXT: [[IDXPROM24:%.*]] = sext i32 [[TMP20]] to i643669// CHECK3-NEXT: [[ARRAYIDX25:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i64 0, i64 [[IDXPROM24]]3670// CHECK3-NEXT: store i32 [[TMP19]], ptr [[ARRAYIDX25]], align 43671// CHECK3-NEXT: [[TMP21:%.*]] = load ptr, ptr [[_TMP19]], align 83672// CHECK3-NEXT: [[TMP22:%.*]] = load i32, ptr [[I20]], align 43673// CHECK3-NEXT: [[IDXPROM26:%.*]] = sext i32 [[TMP22]] to i643674// CHECK3-NEXT: [[ARRAYIDX27:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i64 0, i64 [[IDXPROM26]]3675// CHECK3-NEXT: [[CALL28:%.*]] = call noundef nonnull align 4 dereferenceable(12) ptr @_ZN1SIiEaSERKS0_(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYIDX27]], ptr noundef nonnull align 4 dereferenceable(12) [[TMP21]])3676// CHECK3-NEXT: br label [[FOR_INC29:%.*]]3677// CHECK3: for.inc29:3678// CHECK3-NEXT: [[TMP23:%.*]] = load i32, ptr [[I20]], align 43679// CHECK3-NEXT: [[INC30:%.*]] = add nsw i32 [[TMP23]], 13680// CHECK3-NEXT: store i32 [[INC30]], ptr [[I20]], align 43681// CHECK3-NEXT: br label [[FOR_COND21]], !llvm.loop [[LOOP16:![0-9]+]]3682// CHECK3: for.end31:3683// CHECK3-NEXT: store i32 0, ptr [[RETVAL]], align 43684// CHECK3-NEXT: [[ARRAY_BEGIN32:%.*]] = getelementptr inbounds [42 x %struct.S], ptr [[ARR]], i32 0, i32 03685// CHECK3-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN32]], i64 423686// CHECK3-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]3687// CHECK3: arraydestroy.body:3688// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP24]], [[FOR_END31]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]3689// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -13690// CHECK3-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR6]]3691// CHECK3-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN32]]3692// CHECK3-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE33:%.*]], label [[ARRAYDESTROY_BODY]]3693// CHECK3: arraydestroy.done33:3694// CHECK3-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[VAR1]]) #[[ATTR6]]3695// CHECK3-NEXT: [[ARRAY_BEGIN34:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 03696// CHECK3-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN34]], i64 23697// CHECK3-NEXT: br label [[ARRAYDESTROY_BODY35:%.*]]3698// CHECK3: arraydestroy.body35:3699// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENTPAST36:%.*]] = phi ptr [ [[TMP25]], [[ARRAYDESTROY_DONE33]] ], [ [[ARRAYDESTROY_ELEMENT37:%.*]], [[ARRAYDESTROY_BODY35]] ]3700// CHECK3-NEXT: [[ARRAYDESTROY_ELEMENT37]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST36]], i64 -13701// CHECK3-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[ARRAYDESTROY_ELEMENT37]]) #[[ATTR6]]3702// CHECK3-NEXT: [[ARRAYDESTROY_DONE38:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT37]], [[ARRAY_BEGIN34]]3703// CHECK3-NEXT: br i1 [[ARRAYDESTROY_DONE38]], label [[ARRAYDESTROY_DONE39:%.*]], label [[ARRAYDESTROY_BODY35]]3704// CHECK3: arraydestroy.done39:3705// CHECK3-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(12) [[TEST]]) #[[ATTR6]]3706// CHECK3-NEXT: [[TMP26:%.*]] = load i32, ptr [[RETVAL]], align 43707// CHECK3-NEXT: ret i32 [[TMP26]]3708//3709//3710// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfED1Ev3711// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3712// CHECK3-NEXT: entry:3713// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83714// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83715// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83716// CHECK3-NEXT: call void @_ZN1SIfED2Ev(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]]) #[[ATTR6]]3717// CHECK3-NEXT: ret void3718//3719//3720// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ev3721// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3722// CHECK3-NEXT: entry:3723// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83724// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83725// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83726// CHECK3-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[THIS1]], i64 43727// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 23728// CHECK3-NEXT: [[TMP1:%.*]] = load volatile double, ptr @g, align 83729// CHECK3-NEXT: [[CONV:%.*]] = fptosi double [[TMP1]] to i323730// CHECK3-NEXT: store i32 [[CONV]], ptr [[F]], align 43731// CHECK3-NEXT: ret void3732//3733//3734// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIiED2Ev3735// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3736// CHECK3-NEXT: entry:3737// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83738// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83739// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83740// CHECK3-NEXT: ret void3741//3742//3743// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev3744// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3745// CHECK3-NEXT: entry:3746// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83747// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83748// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83749// CHECK3-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[THIS1]], i64 43750// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 23751// CHECK3-NEXT: [[TMP1:%.*]] = load volatile double, ptr @g, align 83752// CHECK3-NEXT: [[CONV:%.*]] = fptrunc double [[TMP1]] to float3753// CHECK3-NEXT: store float [[CONV]], ptr [[F]], align 43754// CHECK3-NEXT: ret void3755//3756//3757// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev3758// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3759// CHECK3-NEXT: entry:3760// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83761// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83762// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83763// CHECK3-NEXT: ret void3764//3765//3766// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef3767// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3768// CHECK3-NEXT: entry:3769// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83770// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca float, align 43771// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83772// CHECK3-NEXT: store float [[A]], ptr [[A_ADDR]], align 43773// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83774// CHECK3-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[THIS1]], i64 43775// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 23776// CHECK3-NEXT: [[TMP1:%.*]] = load float, ptr [[A_ADDR]], align 43777// CHECK3-NEXT: [[CONV:%.*]] = fpext float [[TMP1]] to double3778// CHECK3-NEXT: [[TMP2:%.*]] = load volatile double, ptr @g, align 83779// CHECK3-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP2]]3780// CHECK3-NEXT: [[CONV2:%.*]] = fptrunc double [[ADD]] to float3781// CHECK3-NEXT: store float [[CONV2]], ptr [[F]], align 43782// CHECK3-NEXT: ret void3783//3784//3785// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ei3786// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3787// CHECK3-NEXT: entry:3788// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83789// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca i32, align 43790// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83791// CHECK3-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 43792// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83793// CHECK3-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 43794// CHECK3-NEXT: call void @_ZN1SIiEC2Ei(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]], i32 noundef [[TMP0]])3795// CHECK3-NEXT: ret void3796//3797//3798// CHECK3-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ei3799// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR0]] align 2 {3800// CHECK3-NEXT: entry:3801// CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83802// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca i32, align 43803// CHECK3-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83804// CHECK3-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 43805// CHECK3-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83806// CHECK3-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[THIS1]], i64 43807// CHECK3-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 23808// CHECK3-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_ADDR]], align 43809// CHECK3-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP1]] to double3810// CHECK3-NEXT: [[TMP2:%.*]] = load volatile double, ptr @g, align 83811// CHECK3-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP2]]3812// CHECK3-NEXT: [[CONV2:%.*]] = fptosi double [[ADD]] to i323813// CHECK3-NEXT: store i32 [[CONV2]], ptr [[F]], align 43814// CHECK3-NEXT: ret void3815//3816