4418 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --check-globals --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _ --global-value-regex ".gomp_critical_user[a-zA-Z_.]+"2// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %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 -allow-deprecated-dag-overlap %s --check-prefix=CHECK15// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -x c++ -std=c++11 -DLAMBDA -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix=CHECK36// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -x c++ -fblocks -DBLOCKS -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix=CHECK47 8// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"9// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s10// 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 --implicit-check-not="{{__kmpc|__tgt}}"11// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -std=c++11 -DLAMBDA -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"12// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -fblocks -DBLOCKS -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"13// expected-no-diagnostics14#ifndef HEADER15#define HEADER16 17volatile double g, g_orig;18volatile double &g1 = g_orig;19 20template <class T>21struct S {22 T f;23 S(T a) : f(a + g) {}24 S() : f(g) {}25 operator T() { return T(); }26 S &operator&(const S &) { return *this; }27 ~S() {}28};29 30template <typename T, int length>31T tmain() {32 T t;33 S<T> test;34 T t_var = T(), t_var1;35 T vec[] = {1, 2};36 S<T> s_arr[] = {1, 2};37 S<T> &var = test;38 S<T> var1;39 S<T> arr[length];40#pragma omp parallel41#pragma omp for reduction(+:t_var) reduction(&:var) reduction(&& : var1) reduction(min: t_var1) nowait42 for (int i = 0; i < 2; ++i) {43 vec[i] = t_var;44 s_arr[i] = var;45 }46#pragma omp parallel47#pragma omp for reduction(&& : t_var)48 for (int i = 0; i < 2; ++i) {49 vec[i] = t_var;50 s_arr[i] = var;51 }52#pragma omp parallel53#pragma omp for reduction(+ : arr[1:length-2])54 for (int i = 0; i < 2; ++i) {55 vec[i] = t_var;56 s_arr[i] = var;57 }58 return T();59}60 61extern S<float> **foo();62int g_arr[10];63 64void reductionArrayElement() {65#pragma omp parallel66#pragma omp for reduction(+:g_arr[1])67 for (int i = 0; i < 10; i++) {68 g_arr[1] += i;69 }70}71 72int main() {73#ifdef LAMBDA74 [&]() {75#pragma omp parallel76#pragma omp for reduction(+:g, g1)77 for (int i = 0; i < 2; ++i) {78 79 // Reduction list for runtime.80 81 g = 1;82 g1 = 1;83 84 [&]() {85 g = 2;86 g1 = 2;87 }();88 }89 }();90 return 0;91#elif defined(BLOCKS)92 ^{93#pragma omp parallel94#pragma omp for reduction(-:g, g1)95 for (int i = 0; i < 2; ++i) {96 97 // Reduction list for runtime.98 99 g = 1;100 g1 = 1;101 102 ^{103 g = 2;104 g1 = 2;105 }();106 }107 }();108 return 0;109#else110 S<float> test;111 float t_var = 0, t_var1;112 int vec[] = {1, 2};113 S<float> s_arr[] = {1, 2, 3, 4};114 S<float> &var = test;115 S<float> var1, arrs[10][4];116 S<float> **var2 = foo();117 S<float> vvar2[5];118 S<float> (&var3)[4] = s_arr;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 // arr is a VLA, but the array section has constant length so we can generate a constant sized array!134#pragma omp parallel135#pragma omp for reduction(+:arr[1][0:2])136 for (int i = 0; i < 10; ++i)137 ++arr[1][i];138#pragma omp parallel139#pragma omp for reduction(& : var2[0 : 5][1 : 6])140 for (int i = 0; i < 10; ++i)141 ;142#pragma omp parallel143#pragma omp for reduction(& : var2[1][1 : 6])144 for (int i = 0; i < 10; ++i)145 ;146#pragma omp parallel147#pragma omp for reduction(& : var2[1 : 1][1 : 6])148 for (int i = 0; i < 10; ++i)149 ;150#pragma omp parallel151#pragma omp for reduction(& : var2[1 : 1][1])152 for (int i = 0; i < 10; ++i)153 ;154#pragma omp parallel155#pragma omp for reduction(& : vvar2[0 : 5])156 for (int i = 0; i < 10; ++i)157 ;158#pragma omp parallel159#pragma omp for reduction(& : var3[1 : 2])160 for (int i = 0; i < 10; ++i)161 ;162#pragma omp parallel163#pragma omp for reduction(& : var3[ : 2])164 for (int i = 0; i < 10; ++i)165 ;166 // TODO: The compiler should also be able to generate a constant sized array in this case!167#pragma omp parallel168#pragma omp for reduction(& : var3[2 : ])169 for (int i = 0; i < 10; ++i)170 ;171#pragma omp parallel172#pragma omp for reduction(& : var3)173 for (int i = 0; i < 10; ++i)174 ;175 reductionArrayElement();176 return tmain<int, 42>();177#endif178}179 180 181// Reduction list for runtime.182 183 184 185// For + reduction operation initial value of private variable is 0.186 187 188// For & reduction operation initial value of private variable is ones in all bits.189 190// For && reduction operation initial value of private variable is 1.0.191 192// For min reduction operation initial value of private variable is largest repesentable value.193 194 195// Skip checks for internal operations.196 197// ptr RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};198 199 200// res = __kmpc_reduce(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);201 202 203// switch(res)204 205// case 1:206// t_var += t_var_reduction;207 208// var = var.operator &(var_reduction);209 210// var1 = var1.operator &&(var1_reduction);211 212// t_var1 = min(t_var1, t_var1_reduction);213 214// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);215 216// break;217 218// case 2:219// t_var += t_var_reduction;220 221// var = var.operator &(var_reduction);222 223// var1 = var1.operator &&(var1_reduction);224 225// t_var1 = min(t_var1, t_var1_reduction);226 227// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);228 229// break;230 231 232// void reduce_func(ptr lhs[<n>], ptr rhs[<n>]) {233// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);234// ...235// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],236// *(Type<n>-1*)rhs[<n>-1]);237// }238// t_var_lhs = (ptr)lhs[0];239// t_var_rhs = (ptr)rhs[0];240 241// var_lhs = (Sptr)lhs[1];242// var_rhs = (Sptr)rhs[1];243 244// var1_lhs = (Sptr)lhs[2];245// var1_rhs = (Sptr)rhs[2];246 247// t_var1_lhs = (ptr)lhs[3];248// t_var1_rhs = (ptr)rhs[3];249 250// t_var_lhs += t_var_rhs;251 252// var_lhs = var_lhs.operator &(var_rhs);253 254// var1_lhs = var1_lhs.operator &&(var1_rhs);255 256// t_var1_lhs = min(t_var1_lhs, t_var1_rhs);257 258 259// Reduction list for runtime.260 261 262 263// Check initialization of private copy.264 265 266// Check initialization of private copy.267 268// Skip checks for internal operations.269 270// ptr RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};271 272 273// res = __kmpc_reduce(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);274 275 276// switch(res)277 278// case 1:279 280// arr[:] += arr_reduction[:];281 282// arrs[:] = var.operator &(arrs_reduction[:]);283 284// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);285 286// break;287 288// case 2:289 290// arr[:] += arr_reduction[:];291 292// arrs[:] = var.operator &(arrs_reduction[:]);293 294// break;295 296// Check destruction of private copy.297 298 299// void reduce_func(ptr lhs[<n>], ptr rhs[<n>]) {300// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);301// ...302// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],303// *(Type<n>-1*)rhs[<n>-1]);304// }305// arr_rhs = (int*)rhs[0];306// arr_lhs = (int*)lhs[0];307 308// arr_size = (size_t)lhs[1];309 310// arrs_rhs = (Sptr)rhs[2];311// arrs_lhs = (Sptr)lhs[2];312 313// arrs_size = (size_t)lhs[3];314 315// arr_lhs[:] += arr_rhs[:];316 317// arrs_lhs = arrs_lhs.operator &(arrs_rhs);318 319 320 321 322// Reduction list for runtime.323 324 325 326// Check initialization of private copy.327 328// Check initialization of private copy.329 330// Skip checks for internal operations.331 332// ptr RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};333 334 335// res = __kmpc_reduce(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);336 337 338// switch(res)339 340// case 1:341 342// arr[:] += arr_reduction[:];343 344// arrs[:] = var.operator &(arrs_reduction[:]);345 346// __kmpc_end_reduce(<loc>, <gtid>, &<lock>);347 348// break;349 350// case 2:351 352// arr[:] += arr_reduction[:];353 354// arrs[:] = var.operator &(arrs_reduction[:]);355 356// break;357 358// Check destruction of private copy.359 360 361// void reduce_func(ptr lhs[<n>], ptr rhs[<n>]) {362// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);363// ...364// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],365// *(Type<n>-1*)rhs[<n>-1]);366// }367// arr_rhs = (int*)rhs[0];368// arr_lhs = (int*)lhs[0];369 370// arr_size = (size_t)lhs[1];371 372// arrs_rhs = (Sptr)rhs[2];373// arrs_lhs = (Sptr)lhs[2];374 375// arr_lhs[:] += arr_rhs[:];376 377// arrs_lhs = arrs_lhs.operator &(arrs_rhs);378 379 380 381 382// Reduction list for runtime.383 384 385 386 387 388 389 390// Reduction list for runtime.391 392 393 394 395 396// Reduction list for runtime.397 398 399 400 401 402 403// Reduction list for runtime.404 405 406 407 408 409 410// Reduction list for runtime.411 412 413 414 415 416 417// Reduction list for runtime.418 419 420 421 422 423// Reduction list for runtime.424 425 426 427 428 429 430 431 432 433// Reduction list for runtime.434 435 436 437 438 439 440 441 442 443// Reduction list for runtime.444 445 446 447 448 449 450 451// Reduction list for runtime.452 453 454 455 456 457// Not interested in this one:458 459// Reduction list for runtime.460 461 462 463// For + reduction operation initial value of private variable is 0.464 465// For & reduction operation initial value of private variable is ones in all bits.466 467// For && reduction operation initial value of private variable is 1.0.468 469// For min reduction operation initial value of private variable is largest repesentable value.470 471// Skip checks for internal operations.472 473// ptr RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};474 475 476// res = __kmpc_reduce_nowait(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);477 478 479// switch(res)480 481// case 1:482// t_var += t_var_reduction;483 484// var = var.operator &(var_reduction);485 486// var1 = var1.operator &&(var1_reduction);487 488// t_var1 = min(t_var1, t_var1_reduction);489 490// __kmpc_end_reduce_nowait(<loc>, <gtid>, &<lock>);491 492// break;493 494// case 2:495// t_var += t_var_reduction;496 497// var = var.operator &(var_reduction);498 499// var1 = var1.operator &&(var1_reduction);500 501// t_var1 = min(t_var1, t_var1_reduction);502 503// break;504 505// void reduce_func(ptr lhs[<n>], ptr rhs[<n>]) {506// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);507// ...508// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],509// *(Type<n>-1*)rhs[<n>-1]);510// }511// t_var_lhs = (iptr)lhs[0];512// t_var_rhs = (iptr)rhs[0];513 514// var_lhs = (Sptr)lhs[1];515// var_rhs = (Sptr)rhs[1];516 517// var1_lhs = (Sptr)lhs[2];518// var1_rhs = (Sptr)rhs[2];519 520// t_var1_lhs = (iptr)lhs[3];521// t_var1_rhs = (iptr)rhs[3];522 523// t_var_lhs += t_var_rhs;524 525// var_lhs = var_lhs.operator &(var_rhs);526 527// var1_lhs = var1_lhs.operator &&(var1_rhs);528 529// t_var1_lhs = min(t_var1_lhs, t_var1_rhs);530 531 532 533// Reduction list for runtime.534 535 536 537 538#endif539//.540// CHECK1: @.gomp_critical_user_.reduction.var = common global [8 x i32] zeroinitializer, align 8541// CHECK1: @.gomp_critical_user_.atomic_reduction.var = common global [8 x i32] zeroinitializer, align 8542//.543// CHECK3: @.gomp_critical_user_.reduction.var = common global [8 x i32] zeroinitializer, align 8544//.545// CHECK4: @.gomp_critical_user_.reduction.var = common global [8 x i32] zeroinitializer, align 8546//.547 548// CHECK1-LABEL: define {{.*}}reductionArrayElement{{.*}}.omp_outlined{{.*}}549// CHECK1-NEXT: entry:550// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8551// CHECK1: [[G_ARR:%.*]] = alloca i32, align 4552// CHECK1: [[TMP0:%.*]] = sdiv exact i64 sub (i64 ptrtoint (ptr @g_arr to i64){{.*}}553// CHECK1-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[G_ARR:%.*]], i64 [[TMP0]]554// CHECK1: omp.inner.for.body:555// CHECK1: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[TMP1]], i64 0, i64 1556// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX]], align 4557// CHECK1-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]],{{.+}}558// CHECK1-NEXT: store i32 [[ADD2]], ptr [[ARRAYIDX]], align 4559// CHECK1: omp.loop.exit:560// CHECK1-NEXT: call void {{.*}}__kmpc_for_static_fini{{.+}}561// CHECK1: {{.*}}call i32 {{.*}}__kmpc_reduce{{.+}}562// CHECK1: omp.reduction.default:563// CHECK1-NEXT: call void @__kmpc_barrier{{.+}}564// CHECK1-NEXT: ret void565//566 567// CHECK1-LABEL: define {{[^@]+}}@main568// CHECK1-SAME: () #[[ATTR0:[0-9]+]] {569// CHECK1-NEXT: entry:570// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4571// CHECK1-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S:%.*]], align 4572// CHECK1-NEXT: [[T_VAR:%.*]] = alloca float, align 4573// CHECK1-NEXT: [[T_VAR1:%.*]] = alloca float, align 4574// CHECK1-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 4575// CHECK1-NEXT: [[S_ARR:%.*]] = alloca [4 x %struct.S], align 16576// CHECK1-NEXT: [[VAR:%.*]] = alloca ptr, align 8577// CHECK1-NEXT: [[VAR1:%.*]] = alloca [[STRUCT_S]], align 4578// CHECK1-NEXT: [[ARRS:%.*]] = alloca [10 x [4 x %struct.S]], align 16579// CHECK1-NEXT: [[VAR2:%.*]] = alloca ptr, align 8580// CHECK1-NEXT: [[VVAR2:%.*]] = alloca [5 x %struct.S], align 16581// CHECK1-NEXT: [[VAR3:%.*]] = alloca ptr, align 8582// CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 8583// CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8584// CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 4585// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])586// CHECK1-NEXT: store float 0.000000e+00, ptr [[T_VAR]], align 4587// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const.main.vec, i64 8, i1 false)588// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], float noundef 1.000000e+00)589// CHECK1-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i64 1590// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], float noundef 2.000000e+00)591// CHECK1-NEXT: [[ARRAYINIT_ELEMENT1:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i64 2592// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT1]], float noundef 3.000000e+00)593// CHECK1-NEXT: [[ARRAYINIT_ELEMENT2:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i64 3594// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT2]], float noundef 4.000000e+00)595// CHECK1-NEXT: store ptr [[TEST]], ptr [[VAR]], align 8596// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR1]])597// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [10 x [4 x %struct.S]], ptr [[ARRS]], i32 0, i32 0, i32 0598// CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 40599// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]600// CHECK1: arrayctor.loop:601// CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]602// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])603// CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i64 1604// CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]605// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]606// CHECK1: arrayctor.cont:607// CHECK1-NEXT: [[CALL:%.*]] = call noundef ptr @_Z3foov()608// CHECK1-NEXT: store ptr [[CALL]], ptr [[VAR2]], align 8609// CHECK1-NEXT: [[ARRAY_BEGIN3:%.*]] = getelementptr inbounds [5 x %struct.S], ptr [[VVAR2]], i32 0, i32 0610// CHECK1-NEXT: [[ARRAYCTOR_END4:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN3]], i64 5611// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP5:%.*]]612// CHECK1: arrayctor.loop5:613// CHECK1-NEXT: [[ARRAYCTOR_CUR6:%.*]] = phi ptr [ [[ARRAY_BEGIN3]], [[ARRAYCTOR_CONT]] ], [ [[ARRAYCTOR_NEXT7:%.*]], [[ARRAYCTOR_LOOP5]] ]614// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR6]])615// CHECK1-NEXT: [[ARRAYCTOR_NEXT7]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR6]], i64 1616// CHECK1-NEXT: [[ARRAYCTOR_DONE8:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT7]], [[ARRAYCTOR_END4]]617// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE8]], label [[ARRAYCTOR_CONT9:%.*]], label [[ARRAYCTOR_LOOP5]]618// CHECK1: arrayctor.cont9:619// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[VAR3]], align 8620// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 8621// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3:[0-9]+]], i32 6, ptr @main.omp_outlined, ptr [[T_VAR]], ptr [[TMP0]], ptr [[VAR1]], ptr [[T_VAR1]], ptr [[VEC]], ptr [[S_ARR]])622// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i64 0, i64 1623// CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4624// CHECK1-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64625// CHECK1-NEXT: [[TMP3:%.*]] = call ptr @llvm.stacksave.p0()626// CHECK1-NEXT: store ptr [[TMP3]], ptr [[SAVED_STACK]], align 8627// CHECK1-NEXT: [[TMP4:%.*]] = mul nuw i64 10, [[TMP2]]628// CHECK1-NEXT: [[VLA:%.*]] = alloca i32, i64 [[TMP4]], align 16629// CHECK1-NEXT: store i64 [[TMP2]], ptr [[__VLA_EXPR0]], align 8630// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 5, ptr @main.omp_outlined.1, i64 10, i64 [[TMP2]], ptr [[VLA]], ptr [[VEC]], ptr [[ARRS]])631// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 4, ptr @main.omp_outlined.2, i64 10, i64 [[TMP2]], ptr [[VLA]], ptr [[ARRS]])632// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @main.omp_outlined.3, i64 10, i64 [[TMP2]], ptr [[VLA]])633// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.4, ptr [[VAR2]])634// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.5, ptr [[VAR2]])635// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.6, ptr [[VAR2]])636// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.7, ptr [[VAR2]])637// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.8, ptr [[VVAR2]])638// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[VAR3]], align 8639// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.9, ptr [[TMP5]])640// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[VAR3]], align 8641// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.10, ptr [[TMP6]])642// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[VAR3]], align 8643// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.11, ptr [[TMP7]])644// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[VAR3]], align 8645// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined.12, ptr [[TMP8]])646// CHECK1-NEXT: call void {{.*}}reductionArrayElement{{.*}}647// CHECK1-NEXT: [[CALL10:%.*]] = call noundef i32 @_Z5tmainIiLi42EET_v()648// CHECK1-NEXT: store i32 [[CALL10]], ptr [[RETVAL]], align 4649// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[SAVED_STACK]], align 8650// CHECK1-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP9]])651// CHECK1-NEXT: [[ARRAY_BEGIN11:%.*]] = getelementptr inbounds [5 x %struct.S], ptr [[VVAR2]], i32 0, i32 0652// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN11]], i64 5653// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]654// CHECK1: arraydestroy.body:655// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP10]], [[ARRAYCTOR_CONT9]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]656// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1657// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5:[0-9]+]]658// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN11]]659// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE12:%.*]], label [[ARRAYDESTROY_BODY]]660// CHECK1: arraydestroy.done12:661// CHECK1-NEXT: [[ARRAY_BEGIN13:%.*]] = getelementptr inbounds [10 x [4 x %struct.S]], ptr [[ARRS]], i32 0, i32 0, i32 0662// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN13]], i64 40663// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY14:%.*]]664// CHECK1: arraydestroy.body14:665// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST15:%.*]] = phi ptr [ [[TMP11]], [[ARRAYDESTROY_DONE12]] ], [ [[ARRAYDESTROY_ELEMENT16:%.*]], [[ARRAYDESTROY_BODY14]] ]666// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT16]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST15]], i64 -1667// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT16]]) #[[ATTR5]]668// CHECK1-NEXT: [[ARRAYDESTROY_DONE17:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT16]], [[ARRAY_BEGIN13]]669// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE17]], label [[ARRAYDESTROY_DONE18:%.*]], label [[ARRAYDESTROY_BODY14]]670// CHECK1: arraydestroy.done18:671// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR1]]) #[[ATTR5]]672// CHECK1-NEXT: [[ARRAY_BEGIN19:%.*]] = getelementptr inbounds [4 x %struct.S], ptr [[S_ARR]], i32 0, i32 0673// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN19]], i64 4674// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY20:%.*]]675// CHECK1: arraydestroy.body20:676// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST21:%.*]] = phi ptr [ [[TMP12]], [[ARRAYDESTROY_DONE18]] ], [ [[ARRAYDESTROY_ELEMENT22:%.*]], [[ARRAYDESTROY_BODY20]] ]677// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT22]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST21]], i64 -1678// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT22]]) #[[ATTR5]]679// CHECK1-NEXT: [[ARRAYDESTROY_DONE23:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT22]], [[ARRAY_BEGIN19]]680// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE23]], label [[ARRAYDESTROY_DONE24:%.*]], label [[ARRAYDESTROY_BODY20]]681// CHECK1: arraydestroy.done24:682// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR5]]683// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[RETVAL]], align 4684// CHECK1-NEXT: ret i32 [[TMP13]]685//686//687// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ev688// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 {689// CHECK1-NEXT: entry:690// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8691// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8692// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8693// CHECK1-NEXT: call void @_ZN1SIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])694// CHECK1-NEXT: ret void695//696//697// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ef698// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {699// CHECK1-NEXT: entry:700// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8701// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 4702// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8703// CHECK1-NEXT: store float [[A]], ptr [[A_ADDR]], align 4704// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8705// CHECK1-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4706// CHECK1-NEXT: call void @_ZN1SIfEC2Ef(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], float noundef [[TMP0]])707// CHECK1-NEXT: ret void708//709//710// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined711// 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(4) [[VAR:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[T_VAR1:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[VEC:%.*]], ptr noundef nonnull align 4 dereferenceable(16) [[S_ARR:%.*]]) #[[ATTR4:[0-9]+]] {712// CHECK1-NEXT: entry:713// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8714// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8715// CHECK1-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 8716// CHECK1-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 8717// CHECK1-NEXT: [[VAR1_ADDR:%.*]] = alloca ptr, align 8718// CHECK1-NEXT: [[T_VAR1_ADDR:%.*]] = alloca ptr, align 8719// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 8720// CHECK1-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 8721// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8722// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 8723// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4724// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 4725// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4726// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4727// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4728// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4729// CHECK1-NEXT: [[T_VAR3:%.*]] = alloca float, align 4730// CHECK1-NEXT: [[VAR4:%.*]] = alloca [[STRUCT_S:%.*]], align 4731// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 8732// CHECK1-NEXT: [[VAR16:%.*]] = alloca [[STRUCT_S]], align 4733// CHECK1-NEXT: [[T_VAR17:%.*]] = alloca float, align 4734// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4735// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [4 x ptr], align 8736// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_S]], align 4737// CHECK1-NEXT: [[REF_TMP23:%.*]] = alloca [[STRUCT_S]], align 4738// CHECK1-NEXT: [[ATOMIC_TEMP:%.*]] = alloca float, align 4739// CHECK1-NEXT: [[_TMP31:%.*]] = alloca float, align 4740// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8741// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8742// CHECK1-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 8743// CHECK1-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 8744// CHECK1-NEXT: store ptr [[VAR1]], ptr [[VAR1_ADDR]], align 8745// CHECK1-NEXT: store ptr [[T_VAR1]], ptr [[T_VAR1_ADDR]], align 8746// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 8747// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 8748// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 8749// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VAR_ADDR]], align 8750// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR1_ADDR]], align 8751// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[T_VAR1_ADDR]], align 8752// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[VEC_ADDR]], align 8753// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 8754// CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 8755// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 8756// CHECK1-NEXT: store ptr [[TMP6]], ptr [[_TMP1]], align 8757// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4758// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 4759// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4760// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4761// CHECK1-NEXT: store float 0.000000e+00, ptr [[T_VAR3]], align 4762// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP1]], align 8763// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR4]])764// CHECK1-NEXT: store ptr [[VAR4]], ptr [[_TMP5]], align 8765// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR16]])766// CHECK1-NEXT: store float 0x47EFFFFFE0000000, ptr [[T_VAR17]], align 4767// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8768// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 4769// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP9]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)770// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4771// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP10]], 1772// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]773// CHECK1: cond.true:774// CHECK1-NEXT: br label [[COND_END:%.*]]775// CHECK1: cond.false:776// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4777// CHECK1-NEXT: br label [[COND_END]]778// CHECK1: cond.end:779// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]780// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4781// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4782// CHECK1-NEXT: store i32 [[TMP12]], ptr [[DOTOMP_IV]], align 4783// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]784// CHECK1: omp.inner.for.cond:785// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4786// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4787// CHECK1-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]788// CHECK1-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]789// CHECK1: omp.inner.for.cond.cleanup:790// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]791// CHECK1: omp.inner.for.body:792// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4793// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1794// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]795// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 4796// CHECK1-NEXT: [[TMP16:%.*]] = load float, ptr [[T_VAR3]], align 4797// CHECK1-NEXT: [[CONV:%.*]] = fptosi float [[TMP16]] to i32798// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 4799// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP17]] to i64800// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP4]], i64 0, i64 [[IDXPROM]]801// CHECK1-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4802// CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[_TMP5]], align 8803// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[I]], align 4804// CHECK1-NEXT: [[IDXPROM9:%.*]] = sext i32 [[TMP19]] to i64805// CHECK1-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds [4 x %struct.S], ptr [[TMP5]], i64 0, i64 [[IDXPROM9]]806// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX10]], ptr align 4 [[TMP18]], i64 4, i1 false)807// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]808// CHECK1: omp.body.continue:809// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]810// CHECK1: omp.inner.for.inc:811// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4812// CHECK1-NEXT: [[ADD11:%.*]] = add nsw i32 [[TMP20]], 1813// CHECK1-NEXT: store i32 [[ADD11]], ptr [[DOTOMP_IV]], align 4814// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]815// CHECK1: omp.inner.for.end:816// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]817// CHECK1: omp.loop.exit:818// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP9]])819// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0820// CHECK1-NEXT: store ptr [[T_VAR3]], ptr [[TMP21]], align 8821// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 1822// CHECK1-NEXT: store ptr [[VAR4]], ptr [[TMP22]], align 8823// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 2824// CHECK1-NEXT: store ptr [[VAR16]], ptr [[TMP23]], align 8825// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 3826// CHECK1-NEXT: store ptr [[T_VAR17]], ptr [[TMP24]], align 8827// CHECK1-NEXT: [[TMP25:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2:[0-9]+]], i32 [[TMP9]], i32 4, i64 32, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)828// CHECK1-NEXT: switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [829// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]830// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]831// CHECK1-NEXT: ]832// CHECK1: .omp.reduction.case1:833// CHECK1-NEXT: [[TMP26:%.*]] = load float, ptr [[TMP0]], align 4834// CHECK1-NEXT: [[TMP27:%.*]] = load float, ptr [[T_VAR3]], align 4835// CHECK1-NEXT: [[ADD12:%.*]] = fadd float [[TMP26]], [[TMP27]]836// CHECK1-NEXT: store float [[ADD12]], ptr [[TMP0]], align 4837// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP7]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR4]])838// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP7]], ptr align 4 [[CALL]], i64 4, i1 false)839// CHECK1-NEXT: [[CALL13:%.*]] = call noundef float @_ZN1SIfEcvfEv(ptr noundef nonnull align 4 dereferenceable(4) [[TMP2]])840// CHECK1-NEXT: [[TOBOOL:%.*]] = fcmp une float [[CALL13]], 0.000000e+00841// CHECK1-NEXT: br i1 [[TOBOOL]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]842// CHECK1: land.rhs:843// CHECK1-NEXT: [[CALL14:%.*]] = call noundef float @_ZN1SIfEcvfEv(ptr noundef nonnull align 4 dereferenceable(4) [[VAR16]])844// CHECK1-NEXT: [[TOBOOL15:%.*]] = fcmp une float [[CALL14]], 0.000000e+00845// CHECK1-NEXT: br label [[LAND_END]]846// CHECK1: land.end:847// CHECK1-NEXT: [[TMP28:%.*]] = phi i1 [ false, [[DOTOMP_REDUCTION_CASE1]] ], [ [[TOBOOL15]], [[LAND_RHS]] ]848// CHECK1-NEXT: [[CONV16:%.*]] = uitofp i1 [[TMP28]] to float849// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]], float noundef [[CONV16]])850// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP2]], ptr align 4 [[REF_TMP]], i64 4, i1 false)851// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]]) #[[ATTR5]]852// CHECK1-NEXT: [[TMP29:%.*]] = load float, ptr [[TMP3]], align 4853// CHECK1-NEXT: [[TMP30:%.*]] = load float, ptr [[T_VAR17]], align 4854// CHECK1-NEXT: [[CMP17:%.*]] = fcmp olt float [[TMP29]], [[TMP30]]855// CHECK1-NEXT: br i1 [[CMP17]], label [[COND_TRUE18:%.*]], label [[COND_FALSE19:%.*]]856// CHECK1: cond.true18:857// CHECK1-NEXT: [[TMP31:%.*]] = load float, ptr [[TMP3]], align 4858// CHECK1-NEXT: br label [[COND_END20:%.*]]859// CHECK1: cond.false19:860// CHECK1-NEXT: [[TMP32:%.*]] = load float, ptr [[T_VAR17]], align 4861// CHECK1-NEXT: br label [[COND_END20]]862// CHECK1: cond.end20:863// CHECK1-NEXT: [[COND21:%.*]] = phi float [ [[TMP31]], [[COND_TRUE18]] ], [ [[TMP32]], [[COND_FALSE19]] ]864// CHECK1-NEXT: store float [[COND21]], ptr [[TMP3]], align 4865// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP9]], ptr @.gomp_critical_user_.reduction.var)866// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]867// CHECK1: .omp.reduction.case2:868// CHECK1-NEXT: [[TMP33:%.*]] = load float, ptr [[T_VAR3]], align 4869// CHECK1-NEXT: [[TMP34:%.*]] = atomicrmw fadd ptr [[TMP0]], float [[TMP33]] monotonic, align 4870// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)871// CHECK1-NEXT: [[CALL22:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP7]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR4]])872// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP7]], ptr align 4 [[CALL22]], i64 4, i1 false)873// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)874// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)875// CHECK1-NEXT: [[CALL24:%.*]] = call noundef float @_ZN1SIfEcvfEv(ptr noundef nonnull align 4 dereferenceable(4) [[TMP2]])876// CHECK1-NEXT: [[TOBOOL25:%.*]] = fcmp une float [[CALL24]], 0.000000e+00877// CHECK1-NEXT: br i1 [[TOBOOL25]], label [[LAND_RHS26:%.*]], label [[LAND_END29:%.*]]878// CHECK1: land.rhs26:879// CHECK1-NEXT: [[CALL27:%.*]] = call noundef float @_ZN1SIfEcvfEv(ptr noundef nonnull align 4 dereferenceable(4) [[VAR16]])880// CHECK1-NEXT: [[TOBOOL28:%.*]] = fcmp une float [[CALL27]], 0.000000e+00881// CHECK1-NEXT: br label [[LAND_END29]]882// CHECK1: land.end29:883// CHECK1-NEXT: [[TMP35:%.*]] = phi i1 [ false, [[DOTOMP_REDUCTION_CASE2]] ], [ [[TOBOOL28]], [[LAND_RHS26]] ]884// CHECK1-NEXT: [[CONV30:%.*]] = uitofp i1 [[TMP35]] to float885// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP23]], float noundef [[CONV30]])886// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP2]], ptr align 4 [[REF_TMP23]], i64 4, i1 false)887// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP23]]) #[[ATTR5]]888// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)889// CHECK1-NEXT: [[TMP36:%.*]] = load float, ptr [[T_VAR17]], align 4890// CHECK1-NEXT: [[ATOMIC_LOAD:%.*]] = load atomic i32, ptr [[TMP3]] monotonic, align 4891// CHECK1-NEXT: br label [[ATOMIC_CONT:%.*]]892// CHECK1: atomic_cont:893// CHECK1-NEXT: [[TMP37:%.*]] = phi i32 [ [[ATOMIC_LOAD]], [[LAND_END29]] ], [ [[TMP45:%.*]], [[COND_END35:%.*]] ]894// CHECK1-NEXT: [[TMP38:%.*]] = bitcast i32 [[TMP37]] to float895// CHECK1-NEXT: store float [[TMP38]], ptr [[_TMP31]], align 4896// CHECK1-NEXT: [[TMP39:%.*]] = load float, ptr [[_TMP31]], align 4897// CHECK1-NEXT: [[TMP40:%.*]] = load float, ptr [[T_VAR17]], align 4898// CHECK1-NEXT: [[CMP32:%.*]] = fcmp olt float [[TMP39]], [[TMP40]]899// CHECK1-NEXT: br i1 [[CMP32]], label [[COND_TRUE33:%.*]], label [[COND_FALSE34:%.*]]900// CHECK1: cond.true33:901// CHECK1-NEXT: [[TMP41:%.*]] = load float, ptr [[_TMP31]], align 4902// CHECK1-NEXT: br label [[COND_END35]]903// CHECK1: cond.false34:904// CHECK1-NEXT: [[TMP42:%.*]] = load float, ptr [[T_VAR17]], align 4905// CHECK1-NEXT: br label [[COND_END35]]906// CHECK1: cond.end35:907// CHECK1-NEXT: [[COND36:%.*]] = phi float [ [[TMP41]], [[COND_TRUE33]] ], [ [[TMP42]], [[COND_FALSE34]] ]908// CHECK1-NEXT: store float [[COND36]], ptr [[ATOMIC_TEMP]], align 4909// CHECK1-NEXT: [[TMP43:%.*]] = load i32, ptr [[ATOMIC_TEMP]], align 4910// CHECK1-NEXT: [[TMP44:%.*]] = cmpxchg ptr [[TMP3]], i32 [[TMP37]], i32 [[TMP43]] monotonic monotonic, align 4911// CHECK1-NEXT: [[TMP45]] = extractvalue { i32, i1 } [[TMP44]], 0912// CHECK1-NEXT: [[TMP46:%.*]] = extractvalue { i32, i1 } [[TMP44]], 1913// CHECK1-NEXT: br i1 [[TMP46]], label [[ATOMIC_EXIT:%.*]], label [[ATOMIC_CONT]]914// CHECK1: atomic_exit:915// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP9]], ptr @.gomp_critical_user_.reduction.var)916// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]917// CHECK1: .omp.reduction.default:918// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR16]]) #[[ATTR5]]919// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR4]]) #[[ATTR5]]920// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4:[0-9]+]], i32 [[TMP9]])921// CHECK1-NEXT: ret void922//923//924// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.omp.reduction.reduction_func925// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6:[0-9]+]] {926// CHECK1-NEXT: entry:927// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8928// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8929// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_S:%.*]], align 4930// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8931// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8932// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8933// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8934// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 0935// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8936// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 0937// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8938// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 1939// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 8940// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 1941// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 8942// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 2943// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 8944// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 2945// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 8946// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 3947// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8948// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 3949// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 8950// CHECK1-NEXT: [[TMP20:%.*]] = load float, ptr [[TMP7]], align 4951// CHECK1-NEXT: [[TMP21:%.*]] = load float, ptr [[TMP5]], align 4952// CHECK1-NEXT: [[ADD:%.*]] = fadd float [[TMP20]], [[TMP21]]953// CHECK1-NEXT: store float [[ADD]], ptr [[TMP7]], align 4954// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP11]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP9]])955// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP11]], ptr align 4 [[CALL]], i64 4, i1 false)956// CHECK1-NEXT: [[CALL2:%.*]] = call noundef float @_ZN1SIfEcvfEv(ptr noundef nonnull align 4 dereferenceable(4) [[TMP15]])957// CHECK1-NEXT: [[TOBOOL:%.*]] = fcmp une float [[CALL2]], 0.000000e+00958// CHECK1-NEXT: br i1 [[TOBOOL]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]959// CHECK1: land.rhs:960// CHECK1-NEXT: [[CALL3:%.*]] = call noundef float @_ZN1SIfEcvfEv(ptr noundef nonnull align 4 dereferenceable(4) [[TMP13]])961// CHECK1-NEXT: [[TOBOOL4:%.*]] = fcmp une float [[CALL3]], 0.000000e+00962// CHECK1-NEXT: br label [[LAND_END]]963// CHECK1: land.end:964// CHECK1-NEXT: [[TMP22:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[TOBOOL4]], [[LAND_RHS]] ]965// CHECK1-NEXT: [[CONV:%.*]] = uitofp i1 [[TMP22]] to float966// CHECK1-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]], float noundef [[CONV]])967// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP15]], ptr align 4 [[REF_TMP]], i64 4, i1 false)968// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]]) #[[ATTR5]]969// CHECK1-NEXT: [[TMP23:%.*]] = load float, ptr [[TMP19]], align 4970// CHECK1-NEXT: [[TMP24:%.*]] = load float, ptr [[TMP17]], align 4971// CHECK1-NEXT: [[CMP:%.*]] = fcmp olt float [[TMP23]], [[TMP24]]972// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]973// CHECK1: cond.true:974// CHECK1-NEXT: [[TMP25:%.*]] = load float, ptr [[TMP19]], align 4975// CHECK1-NEXT: br label [[COND_END:%.*]]976// CHECK1: cond.false:977// CHECK1-NEXT: [[TMP26:%.*]] = load float, ptr [[TMP17]], align 4978// CHECK1-NEXT: br label [[COND_END]]979// CHECK1: cond.end:980// CHECK1-NEXT: [[COND:%.*]] = phi float [ [[TMP25]], [[COND_TRUE]] ], [ [[TMP26]], [[COND_FALSE]] ]981// CHECK1-NEXT: store float [[COND]], ptr [[TMP19]], align 4982// CHECK1-NEXT: ret void983//984//985// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEanERKS0_986// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR1]] align 2 {987// CHECK1-NEXT: entry:988// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8989// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8990// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8991// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8992// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8993// CHECK1-NEXT: ret ptr [[THIS1]]994//995//996// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEcvfEv997// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) #[[ATTR1]] align 2 {998// CHECK1-NEXT: entry:999// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81000// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81001// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81002// CHECK1-NEXT: ret float 0.000000e+001003//1004//1005// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED1Ev1006// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {1007// CHECK1-NEXT: entry:1008// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81009// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81010// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81011// CHECK1-NEXT: call void @_ZN1SIfED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR5]]1012// CHECK1-NEXT: ret void1013//1014//1015// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.11016// 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(160) [[ARRS:%.*]]) #[[ATTR4]] {1017// CHECK1-NEXT: entry:1018// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81019// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81020// CHECK1-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 81021// CHECK1-NEXT: [[VLA_ADDR2:%.*]] = alloca i64, align 81022// CHECK1-NEXT: [[ARR_ADDR:%.*]] = alloca ptr, align 81023// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 81024// CHECK1-NEXT: [[ARRS_ADDR:%.*]] = alloca ptr, align 81025// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41026// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 41027// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41028// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41029// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41030// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41031// CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 81032// CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 81033// CHECK1-NEXT: [[__VLA_EXPR1:%.*]] = alloca i64, align 81034// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 41035// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [4 x ptr], align 81036// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81037// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81038// CHECK1-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 81039// CHECK1-NEXT: store i64 [[VLA1]], ptr [[VLA_ADDR2]], align 81040// CHECK1-NEXT: store ptr [[ARR]], ptr [[ARR_ADDR]], align 81041// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 81042// CHECK1-NEXT: store ptr [[ARRS]], ptr [[ARRS_ADDR]], align 81043// CHECK1-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR]], align 81044// CHECK1-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR2]], align 81045// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARR_ADDR]], align 81046// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VEC_ADDR]], align 81047// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[ARRS_ADDR]], align 81048// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41049// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41050// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41051// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41052// CHECK1-NEXT: [[TMP5:%.*]] = mul nsw i64 1, [[TMP1]]1053// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[TMP5]]1054// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw i32, ptr [[ARRAYIDX]], i64 01055// CHECK1-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP3]], i64 0, i64 11056// CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX4]], align 41057// CHECK1-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i641058// CHECK1-NEXT: [[LB_ADD_LEN:%.*]] = add nsw i64 -1, [[TMP7]]1059// CHECK1-NEXT: [[TMP8:%.*]] = mul nsw i64 1, [[TMP1]]1060// CHECK1-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[TMP8]]1061// CHECK1-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds nuw i32, ptr [[ARRAYIDX5]], i64 [[LB_ADD_LEN]]1062// CHECK1-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[ARRAYIDX6]] to i641063// CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[ARRAYIDX3]] to i641064// CHECK1-NEXT: [[TMP11:%.*]] = sub i64 [[TMP9]], [[TMP10]]1065// CHECK1-NEXT: [[TMP12:%.*]] = sdiv exact i64 [[TMP11]], ptrtoint (ptr getelementptr (i32, ptr null, i32 1) to i64)1066// CHECK1-NEXT: [[TMP13:%.*]] = add nuw i64 [[TMP12]], 11067// CHECK1-NEXT: [[TMP14:%.*]] = mul nuw i64 [[TMP13]], ptrtoint (ptr getelementptr (i32, ptr null, i32 1) to i64)1068// CHECK1-NEXT: [[TMP15:%.*]] = call ptr @llvm.stacksave.p0()1069// CHECK1-NEXT: store ptr [[TMP15]], ptr [[SAVED_STACK]], align 81070// CHECK1-NEXT: [[VLA7:%.*]] = alloca i32, i64 [[TMP13]], align 161071// CHECK1-NEXT: store i64 [[TMP13]], ptr [[__VLA_EXPR0]], align 81072// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[VLA7]], i64 [[TMP13]]1073// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[VLA7]], [[TMP16]]1074// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]1075// CHECK1: omp.arrayinit.body:1076// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[VLA7]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]1077// CHECK1-NEXT: store i32 0, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 41078// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11079// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP16]]1080// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]1081// CHECK1: omp.arrayinit.done:1082// CHECK1-NEXT: [[TMP17:%.*]] = ptrtoint ptr [[TMP2]] to i641083// CHECK1-NEXT: [[TMP18:%.*]] = ptrtoint ptr [[ARRAYIDX3]] to i641084// CHECK1-NEXT: [[TMP19:%.*]] = sub i64 [[TMP17]], [[TMP18]]1085// CHECK1-NEXT: [[TMP20:%.*]] = sdiv exact i64 [[TMP19]], ptrtoint (ptr getelementptr (i32, ptr null, i32 1) to i64)1086// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr i32, ptr [[VLA7]], i64 [[TMP20]]1087// CHECK1-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds nuw [10 x [4 x %struct.S]], ptr [[TMP4]], i64 0, i64 11088// CHECK1-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x %struct.S], ptr [[ARRAYIDX8]], i64 0, i64 01089// CHECK1-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[ARRAYDECAY]], i64 11090// CHECK1-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP3]], i64 0, i64 11091// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[ARRAYIDX10]], align 41092// CHECK1-NEXT: [[TMP23:%.*]] = sext i32 [[TMP22]] to i641093// CHECK1-NEXT: [[LB_ADD_LEN11:%.*]] = add nsw i64 0, [[TMP23]]1094// CHECK1-NEXT: [[ARRAYIDX12:%.*]] = getelementptr inbounds nuw [10 x [4 x %struct.S]], ptr [[TMP4]], i64 0, i64 [[LB_ADD_LEN11]]1095// CHECK1-NEXT: [[ARRAYDECAY13:%.*]] = getelementptr inbounds [4 x %struct.S], ptr [[ARRAYIDX12]], i64 0, i64 01096// CHECK1-NEXT: [[ARRAYIDX14:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[ARRAYDECAY13]], i64 21097// CHECK1-NEXT: [[TMP24:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i641098// CHECK1-NEXT: [[TMP25:%.*]] = ptrtoint ptr [[ARRAYIDX9]] to i641099// CHECK1-NEXT: [[TMP26:%.*]] = sub i64 [[TMP24]], [[TMP25]]1100// CHECK1-NEXT: [[TMP27:%.*]] = sdiv exact i64 [[TMP26]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)1101// CHECK1-NEXT: [[TMP28:%.*]] = add nuw i64 [[TMP27]], 11102// CHECK1-NEXT: [[TMP29:%.*]] = mul nuw i64 [[TMP28]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)1103// CHECK1-NEXT: [[VLA15:%.*]] = alloca [[STRUCT_S]], i64 [[TMP28]], align 161104// CHECK1-NEXT: store i64 [[TMP28]], ptr [[__VLA_EXPR1]], align 81105// CHECK1-NEXT: [[TMP30:%.*]] = getelementptr [[STRUCT_S]], ptr [[VLA15]], i64 [[TMP28]]1106// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY16:%.*]] = icmp eq ptr [[VLA15]], [[TMP30]]1107// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY16]], label [[OMP_ARRAYINIT_DONE21:%.*]], label [[OMP_ARRAYINIT_BODY17:%.*]]1108// CHECK1: omp.arrayinit.body17:1109// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST18:%.*]] = phi ptr [ [[VLA15]], [[OMP_ARRAYINIT_DONE]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT19:%.*]], [[OMP_ARRAYINIT_BODY17]] ]1110// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST18]])1111// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT19]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST18]], i32 11112// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE20:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT19]], [[TMP30]]1113// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE20]], label [[OMP_ARRAYINIT_DONE21]], label [[OMP_ARRAYINIT_BODY17]]1114// CHECK1: omp.arrayinit.done21:1115// CHECK1-NEXT: [[TMP31:%.*]] = ptrtoint ptr [[TMP4]] to i641116// CHECK1-NEXT: [[TMP32:%.*]] = ptrtoint ptr [[ARRAYIDX9]] to i641117// CHECK1-NEXT: [[TMP33:%.*]] = sub i64 [[TMP31]], [[TMP32]]1118// CHECK1-NEXT: [[TMP34:%.*]] = sdiv exact i64 [[TMP33]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)1119// CHECK1-NEXT: [[TMP35:%.*]] = getelementptr [[STRUCT_S]], ptr [[VLA15]], i64 [[TMP34]]1120// CHECK1-NEXT: [[TMP36:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81121// CHECK1-NEXT: [[TMP37:%.*]] = load i32, ptr [[TMP36]], align 41122// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP37]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1123// CHECK1-NEXT: [[TMP38:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41124// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP38]], 91125// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1126// CHECK1: cond.true:1127// CHECK1-NEXT: br label [[COND_END:%.*]]1128// CHECK1: cond.false:1129// CHECK1-NEXT: [[TMP39:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41130// CHECK1-NEXT: br label [[COND_END]]1131// CHECK1: cond.end:1132// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP39]], [[COND_FALSE]] ]1133// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41134// CHECK1-NEXT: [[TMP40:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41135// CHECK1-NEXT: store i32 [[TMP40]], ptr [[DOTOMP_IV]], align 41136// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1137// CHECK1: omp.inner.for.cond:1138// CHECK1-NEXT: [[TMP41:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41139// CHECK1-NEXT: [[TMP42:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41140// CHECK1-NEXT: [[CMP22:%.*]] = icmp sle i32 [[TMP41]], [[TMP42]]1141// CHECK1-NEXT: br i1 [[CMP22]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1142// CHECK1: omp.inner.for.cond.cleanup:1143// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1144// CHECK1: omp.inner.for.body:1145// CHECK1-NEXT: [[TMP43:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41146// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP43]], 11147// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1148// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 41149// CHECK1-NEXT: [[TMP44:%.*]] = mul nsw i64 1, [[TMP1]]1150// CHECK1-NEXT: [[ARRAYIDX23:%.*]] = getelementptr inbounds i32, ptr [[TMP21]], i64 [[TMP44]]1151// CHECK1-NEXT: [[TMP45:%.*]] = load i32, ptr [[I]], align 41152// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP45]] to i641153// CHECK1-NEXT: [[ARRAYIDX24:%.*]] = getelementptr inbounds i32, ptr [[ARRAYIDX23]], i64 [[IDXPROM]]1154// CHECK1-NEXT: [[TMP46:%.*]] = load i32, ptr [[ARRAYIDX24]], align 41155// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP46]], 11156// CHECK1-NEXT: store i32 [[INC]], ptr [[ARRAYIDX24]], align 41157// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1158// CHECK1: omp.body.continue:1159// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1160// CHECK1: omp.inner.for.inc:1161// CHECK1-NEXT: [[TMP47:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41162// CHECK1-NEXT: [[ADD25:%.*]] = add nsw i32 [[TMP47]], 11163// CHECK1-NEXT: store i32 [[ADD25]], ptr [[DOTOMP_IV]], align 41164// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]1165// CHECK1: omp.inner.for.end:1166// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1167// CHECK1: omp.loop.exit:1168// CHECK1-NEXT: [[TMP48:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81169// CHECK1-NEXT: [[TMP49:%.*]] = load i32, ptr [[TMP48]], align 41170// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP49]])1171// CHECK1-NEXT: [[TMP50:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01172// CHECK1-NEXT: store ptr [[VLA7]], ptr [[TMP50]], align 81173// CHECK1-NEXT: [[TMP51:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 11174// CHECK1-NEXT: [[TMP52:%.*]] = inttoptr i64 [[TMP13]] to ptr1175// CHECK1-NEXT: store ptr [[TMP52]], ptr [[TMP51]], align 81176// CHECK1-NEXT: [[TMP53:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 21177// CHECK1-NEXT: store ptr [[VLA15]], ptr [[TMP53]], align 81178// CHECK1-NEXT: [[TMP54:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 31179// CHECK1-NEXT: [[TMP55:%.*]] = inttoptr i64 [[TMP28]] to ptr1180// CHECK1-NEXT: store ptr [[TMP55]], ptr [[TMP54]], align 81181// CHECK1-NEXT: [[TMP56:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81182// CHECK1-NEXT: [[TMP57:%.*]] = load i32, ptr [[TMP56]], align 41183// CHECK1-NEXT: [[TMP58:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP57]], i32 2, i64 32, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.1.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1184// CHECK1-NEXT: switch i32 [[TMP58]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1185// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1186// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1187// CHECK1-NEXT: ]1188// CHECK1: .omp.reduction.case1:1189// CHECK1-NEXT: [[TMP59:%.*]] = getelementptr i32, ptr [[ARRAYIDX3]], i64 [[TMP13]]1190// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX3]], [[TMP59]]1191// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE30:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1192// CHECK1: omp.arraycpy.body:1193// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VLA7]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1194// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST26:%.*]] = phi ptr [ [[ARRAYIDX3]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT28:%.*]], [[OMP_ARRAYCPY_BODY]] ]1195// CHECK1-NEXT: [[TMP60:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST26]], align 41196// CHECK1-NEXT: [[TMP61:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 41197// CHECK1-NEXT: [[ADD27:%.*]] = add nsw i32 [[TMP60]], [[TMP61]]1198// CHECK1-NEXT: store i32 [[ADD27]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST26]], align 41199// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT28]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST26]], i32 11200// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11201// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE29:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT28]], [[TMP59]]1202// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE29]], label [[OMP_ARRAYCPY_DONE30]], label [[OMP_ARRAYCPY_BODY]]1203// CHECK1: omp.arraycpy.done30:1204// CHECK1-NEXT: [[TMP62:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX9]], i64 [[TMP28]]1205// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY31:%.*]] = icmp eq ptr [[ARRAYIDX9]], [[TMP62]]1206// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY31]], label [[OMP_ARRAYCPY_DONE38:%.*]], label [[OMP_ARRAYCPY_BODY32:%.*]]1207// CHECK1: omp.arraycpy.body32:1208// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST33:%.*]] = phi ptr [ [[VLA15]], [[OMP_ARRAYCPY_DONE30]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT36:%.*]], [[OMP_ARRAYCPY_BODY32]] ]1209// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST34:%.*]] = phi ptr [ [[ARRAYIDX9]], [[OMP_ARRAYCPY_DONE30]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT35:%.*]], [[OMP_ARRAYCPY_BODY32]] ]1210// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST34]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST33]])1211// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST34]], ptr align 4 [[CALL]], i64 4, i1 false)1212// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT35]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST34]], i32 11213// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT36]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST33]], i32 11214// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE37:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT35]], [[TMP62]]1215// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE37]], label [[OMP_ARRAYCPY_DONE38]], label [[OMP_ARRAYCPY_BODY32]]1216// CHECK1: omp.arraycpy.done38:1217// CHECK1-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP57]], ptr @.gomp_critical_user_.reduction.var)1218// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1219// CHECK1: .omp.reduction.case2:1220// CHECK1-NEXT: [[TMP63:%.*]] = getelementptr i32, ptr [[ARRAYIDX3]], i64 [[TMP13]]1221// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY39:%.*]] = icmp eq ptr [[ARRAYIDX3]], [[TMP63]]1222// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY39]], label [[OMP_ARRAYCPY_DONE46:%.*]], label [[OMP_ARRAYCPY_BODY40:%.*]]1223// CHECK1: omp.arraycpy.body40:1224// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST41:%.*]] = phi ptr [ [[VLA7]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT44:%.*]], [[OMP_ARRAYCPY_BODY40]] ]1225// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST42:%.*]] = phi ptr [ [[ARRAYIDX3]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT43:%.*]], [[OMP_ARRAYCPY_BODY40]] ]1226// CHECK1-NEXT: [[TMP64:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST41]], align 41227// CHECK1-NEXT: [[TMP65:%.*]] = atomicrmw add ptr [[OMP_ARRAYCPY_DESTELEMENTPAST42]], i32 [[TMP64]] monotonic, align 41228// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT43]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST42]], i32 11229// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT44]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST41]], i32 11230// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE45:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT43]], [[TMP63]]1231// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE45]], label [[OMP_ARRAYCPY_DONE46]], label [[OMP_ARRAYCPY_BODY40]]1232// CHECK1: omp.arraycpy.done46:1233// CHECK1-NEXT: [[TMP66:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX9]], i64 [[TMP28]]1234// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY47:%.*]] = icmp eq ptr [[ARRAYIDX9]], [[TMP66]]1235// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY47]], label [[OMP_ARRAYCPY_DONE55:%.*]], label [[OMP_ARRAYCPY_BODY48:%.*]]1236// CHECK1: omp.arraycpy.body48:1237// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST49:%.*]] = phi ptr [ [[VLA15]], [[OMP_ARRAYCPY_DONE46]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT53:%.*]], [[OMP_ARRAYCPY_BODY48]] ]1238// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST50:%.*]] = phi ptr [ [[ARRAYIDX9]], [[OMP_ARRAYCPY_DONE46]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT52:%.*]], [[OMP_ARRAYCPY_BODY48]] ]1239// CHECK1-NEXT: [[TMP67:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81240// CHECK1-NEXT: [[TMP68:%.*]] = load i32, ptr [[TMP67]], align 41241// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP68]], ptr @.gomp_critical_user_.atomic_reduction.var)1242// CHECK1-NEXT: [[CALL51:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST50]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST49]])1243// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST50]], ptr align 4 [[CALL51]], i64 4, i1 false)1244// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP68]], ptr @.gomp_critical_user_.atomic_reduction.var)1245// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT52]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST50]], i32 11246// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT53]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST49]], i32 11247// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE54:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT52]], [[TMP66]]1248// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE54]], label [[OMP_ARRAYCPY_DONE55]], label [[OMP_ARRAYCPY_BODY48]]1249// CHECK1: omp.arraycpy.done55:1250// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1251// CHECK1: .omp.reduction.default:1252// CHECK1-NEXT: [[TMP69:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[VLA15]], i64 [[TMP28]]1253// CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr [[VLA15]], [[TMP69]]1254// CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE56:%.*]], label [[ARRAYDESTROY_BODY:%.*]]1255// CHECK1: arraydestroy.body:1256// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP69]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1257// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11258// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]1259// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[VLA15]]1260// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE56]], label [[ARRAYDESTROY_BODY]]1261// CHECK1: arraydestroy.done56:1262// CHECK1-NEXT: [[TMP70:%.*]] = load ptr, ptr [[SAVED_STACK]], align 81263// CHECK1-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP70]])1264// CHECK1-NEXT: ret void1265//1266//1267// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.1.omp.reduction.reduction_func1268// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {1269// CHECK1-NEXT: entry:1270// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81271// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81272// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81273// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81274// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81275// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81276// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 01277// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81278// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 01279// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81280// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 11281// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 81282// CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP9]] to i641283// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 21284// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 81285// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 21286// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 81287// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 31288// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[TMP15]], align 81289// CHECK1-NEXT: [[TMP17:%.*]] = ptrtoint ptr [[TMP16]] to i641290// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr i32, ptr [[TMP7]], i64 [[TMP10]]1291// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP18]]1292// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1293// CHECK1: omp.arraycpy.body:1294// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1295// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1296// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 41297// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 41298// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]1299// CHECK1-NEXT: store i32 [[ADD]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 41300// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11301// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11302// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP18]]1303// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]1304// CHECK1: omp.arraycpy.done2:1305// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP14]], i64 [[TMP17]]1306// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY3:%.*]] = icmp eq ptr [[TMP14]], [[TMP21]]1307// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY3]], label [[OMP_ARRAYCPY_DONE10:%.*]], label [[OMP_ARRAYCPY_BODY4:%.*]]1308// CHECK1: omp.arraycpy.body4:1309// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST5:%.*]] = phi ptr [ [[TMP12]], [[OMP_ARRAYCPY_DONE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT8:%.*]], [[OMP_ARRAYCPY_BODY4]] ]1310// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST6:%.*]] = phi ptr [ [[TMP14]], [[OMP_ARRAYCPY_DONE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT7:%.*]], [[OMP_ARRAYCPY_BODY4]] ]1311// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST6]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST5]])1312// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST6]], ptr align 4 [[CALL]], i64 4, i1 false)1313// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT7]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST6]], i32 11314// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT8]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST5]], i32 11315// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE9:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT7]], [[TMP21]]1316// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE9]], label [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_BODY4]]1317// CHECK1: omp.arraycpy.done10:1318// CHECK1-NEXT: ret void1319//1320//1321// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.21322// 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(160) [[ARRS:%.*]]) #[[ATTR4]] {1323// CHECK1-NEXT: entry:1324// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81325// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81326// CHECK1-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 81327// CHECK1-NEXT: [[VLA_ADDR2:%.*]] = alloca i64, align 81328// CHECK1-NEXT: [[ARR_ADDR:%.*]] = alloca ptr, align 81329// CHECK1-NEXT: [[ARRS_ADDR:%.*]] = alloca ptr, align 81330// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41331// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 41332// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41333// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41334// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41335// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41336// CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 81337// CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 81338// CHECK1-NEXT: [[ARRS4:%.*]] = alloca [10 x [4 x %struct.S]], align 161339// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 41340// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [3 x ptr], align 81341// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81342// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81343// CHECK1-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 81344// CHECK1-NEXT: store i64 [[VLA1]], ptr [[VLA_ADDR2]], align 81345// CHECK1-NEXT: store ptr [[ARR]], ptr [[ARR_ADDR]], align 81346// CHECK1-NEXT: store ptr [[ARRS]], ptr [[ARRS_ADDR]], align 81347// CHECK1-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR]], align 81348// CHECK1-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR2]], align 81349// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARR_ADDR]], align 81350// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[ARRS_ADDR]], align 81351// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41352// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41353// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41354// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41355// CHECK1-NEXT: [[TMP4:%.*]] = mul nuw i64 [[TMP0]], [[TMP1]]1356// CHECK1-NEXT: [[TMP5:%.*]] = mul nuw i64 [[TMP4]], 41357// CHECK1-NEXT: [[TMP6:%.*]] = udiv exact i64 [[TMP5]], ptrtoint (ptr getelementptr (i32, ptr null, i32 1) to i64)1358// CHECK1-NEXT: [[TMP7:%.*]] = call ptr @llvm.stacksave.p0()1359// CHECK1-NEXT: store ptr [[TMP7]], ptr [[SAVED_STACK]], align 81360// CHECK1-NEXT: [[VLA3:%.*]] = alloca i32, i64 [[TMP6]], align 161361// CHECK1-NEXT: store i64 [[TMP6]], ptr [[__VLA_EXPR0]], align 81362// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr i32, ptr [[VLA3]], i64 [[TMP6]]1363// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[VLA3]], [[TMP8]]1364// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]1365// CHECK1: omp.arrayinit.body:1366// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[VLA3]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]1367// CHECK1-NEXT: store i32 0, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 41368// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11369// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]1370// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]1371// CHECK1: omp.arrayinit.done:1372// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [10 x [4 x %struct.S]], ptr [[ARRS4]], i32 0, i32 0, i32 01373// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[ARRAY_BEGIN]], i64 401374// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY5:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP9]]1375// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY5]], label [[OMP_ARRAYINIT_DONE10:%.*]], label [[OMP_ARRAYINIT_BODY6:%.*]]1376// CHECK1: omp.arrayinit.body6:1377// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST7:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[OMP_ARRAYINIT_DONE]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT8:%.*]], [[OMP_ARRAYINIT_BODY6]] ]1378// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST7]])1379// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT8]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST7]], i32 11380// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE9:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT8]], [[TMP9]]1381// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE9]], label [[OMP_ARRAYINIT_DONE10]], label [[OMP_ARRAYINIT_BODY6]]1382// CHECK1: omp.arrayinit.done10:1383// CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81384// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP10]], align 41385// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP11]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1386// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41387// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP12]], 91388// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1389// CHECK1: cond.true:1390// CHECK1-NEXT: br label [[COND_END:%.*]]1391// CHECK1: cond.false:1392// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41393// CHECK1-NEXT: br label [[COND_END]]1394// CHECK1: cond.end:1395// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP13]], [[COND_FALSE]] ]1396// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41397// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41398// CHECK1-NEXT: store i32 [[TMP14]], ptr [[DOTOMP_IV]], align 41399// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1400// CHECK1: omp.inner.for.cond:1401// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41402// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41403// CHECK1-NEXT: [[CMP11:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]1404// CHECK1-NEXT: br i1 [[CMP11]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1405// CHECK1: omp.inner.for.cond.cleanup:1406// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1407// CHECK1: omp.inner.for.body:1408// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41409// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP17]], 11410// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1411// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 41412// CHECK1-NEXT: [[TMP18:%.*]] = mul nsw i64 1, [[TMP1]]1413// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA3]], i64 [[TMP18]]1414// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[I]], align 41415// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP19]] to i641416// CHECK1-NEXT: [[ARRAYIDX12:%.*]] = getelementptr inbounds i32, ptr [[ARRAYIDX]], i64 [[IDXPROM]]1417// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[ARRAYIDX12]], align 41418// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP20]], 11419// CHECK1-NEXT: store i32 [[INC]], ptr [[ARRAYIDX12]], align 41420// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1421// CHECK1: omp.body.continue:1422// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1423// CHECK1: omp.inner.for.inc:1424// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41425// CHECK1-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP21]], 11426// CHECK1-NEXT: store i32 [[ADD13]], ptr [[DOTOMP_IV]], align 41427// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]1428// CHECK1: omp.inner.for.end:1429// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1430// CHECK1: omp.loop.exit:1431// CHECK1-NEXT: [[TMP22:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81432// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 41433// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP23]])1434// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01435// CHECK1-NEXT: store ptr [[VLA3]], ptr [[TMP24]], align 81436// CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 11437// CHECK1-NEXT: [[TMP26:%.*]] = inttoptr i64 [[TMP6]] to ptr1438// CHECK1-NEXT: store ptr [[TMP26]], ptr [[TMP25]], align 81439// CHECK1-NEXT: [[TMP27:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 21440// CHECK1-NEXT: store ptr [[ARRS4]], ptr [[TMP27]], align 81441// CHECK1-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81442// CHECK1-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 41443// CHECK1-NEXT: [[TMP30:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP29]], i32 2, i64 24, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.2.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1444// CHECK1-NEXT: switch i32 [[TMP30]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1445// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1446// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1447// CHECK1-NEXT: ]1448// CHECK1: .omp.reduction.case1:1449// CHECK1-NEXT: [[TMP31:%.*]] = getelementptr i32, ptr [[TMP2]], i64 [[TMP6]]1450// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP2]], [[TMP31]]1451// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE18:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1452// CHECK1: omp.arraycpy.body:1453// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VLA3]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1454// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST14:%.*]] = phi ptr [ [[TMP2]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT16:%.*]], [[OMP_ARRAYCPY_BODY]] ]1455// CHECK1-NEXT: [[TMP32:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], align 41456// CHECK1-NEXT: [[TMP33:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 41457// CHECK1-NEXT: [[ADD15:%.*]] = add nsw i32 [[TMP32]], [[TMP33]]1458// CHECK1-NEXT: store i32 [[ADD15]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], align 41459// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT16]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], i32 11460// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11461// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE17:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT16]], [[TMP31]]1462// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE17]], label [[OMP_ARRAYCPY_DONE18]], label [[OMP_ARRAYCPY_BODY]]1463// CHECK1: omp.arraycpy.done18:1464// CHECK1-NEXT: [[TMP34:%.*]] = getelementptr [[STRUCT_S]], ptr [[TMP3]], i64 401465// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY19:%.*]] = icmp eq ptr [[TMP3]], [[TMP34]]1466// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY19]], label [[OMP_ARRAYCPY_DONE26:%.*]], label [[OMP_ARRAYCPY_BODY20:%.*]]1467// CHECK1: omp.arraycpy.body20:1468// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST21:%.*]] = phi ptr [ [[ARRS4]], [[OMP_ARRAYCPY_DONE18]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT24:%.*]], [[OMP_ARRAYCPY_BODY20]] ]1469// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST22:%.*]] = phi ptr [ [[TMP3]], [[OMP_ARRAYCPY_DONE18]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT23:%.*]], [[OMP_ARRAYCPY_BODY20]] ]1470// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST22]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST21]])1471// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST22]], ptr align 4 [[CALL]], i64 4, i1 false)1472// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT23]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST22]], i32 11473// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT24]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST21]], i32 11474// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE25:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT23]], [[TMP34]]1475// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE25]], label [[OMP_ARRAYCPY_DONE26]], label [[OMP_ARRAYCPY_BODY20]]1476// CHECK1: omp.arraycpy.done26:1477// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP29]], ptr @.gomp_critical_user_.reduction.var)1478// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1479// CHECK1: .omp.reduction.case2:1480// CHECK1-NEXT: [[TMP35:%.*]] = getelementptr i32, ptr [[TMP2]], i64 [[TMP6]]1481// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY27:%.*]] = icmp eq ptr [[TMP2]], [[TMP35]]1482// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY27]], label [[OMP_ARRAYCPY_DONE34:%.*]], label [[OMP_ARRAYCPY_BODY28:%.*]]1483// CHECK1: omp.arraycpy.body28:1484// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST29:%.*]] = phi ptr [ [[VLA3]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT32:%.*]], [[OMP_ARRAYCPY_BODY28]] ]1485// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST30:%.*]] = phi ptr [ [[TMP2]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT31:%.*]], [[OMP_ARRAYCPY_BODY28]] ]1486// CHECK1-NEXT: [[TMP36:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST29]], align 41487// CHECK1-NEXT: [[TMP37:%.*]] = atomicrmw add ptr [[OMP_ARRAYCPY_DESTELEMENTPAST30]], i32 [[TMP36]] monotonic, align 41488// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT31]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST30]], i32 11489// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT32]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST29]], i32 11490// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE33:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT31]], [[TMP35]]1491// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE33]], label [[OMP_ARRAYCPY_DONE34]], label [[OMP_ARRAYCPY_BODY28]]1492// CHECK1: omp.arraycpy.done34:1493// CHECK1-NEXT: [[TMP38:%.*]] = getelementptr [[STRUCT_S]], ptr [[TMP3]], i64 401494// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY35:%.*]] = icmp eq ptr [[TMP3]], [[TMP38]]1495// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY35]], label [[OMP_ARRAYCPY_DONE43:%.*]], label [[OMP_ARRAYCPY_BODY36:%.*]]1496// CHECK1: omp.arraycpy.body36:1497// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST37:%.*]] = phi ptr [ [[ARRS4]], [[OMP_ARRAYCPY_DONE34]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT41:%.*]], [[OMP_ARRAYCPY_BODY36]] ]1498// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST38:%.*]] = phi ptr [ [[TMP3]], [[OMP_ARRAYCPY_DONE34]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT40:%.*]], [[OMP_ARRAYCPY_BODY36]] ]1499// CHECK1-NEXT: [[TMP39:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81500// CHECK1-NEXT: [[TMP40:%.*]] = load i32, ptr [[TMP39]], align 41501// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP40]], ptr @.gomp_critical_user_.atomic_reduction.var)1502// CHECK1-NEXT: [[CALL39:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST38]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST37]])1503// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST38]], ptr align 4 [[CALL39]], i64 4, i1 false)1504// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP40]], ptr @.gomp_critical_user_.atomic_reduction.var)1505// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT40]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST38]], i32 11506// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT41]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST37]], i32 11507// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE42:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT40]], [[TMP38]]1508// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE42]], label [[OMP_ARRAYCPY_DONE43]], label [[OMP_ARRAYCPY_BODY36]]1509// CHECK1: omp.arraycpy.done43:1510// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP29]], ptr @.gomp_critical_user_.reduction.var)1511// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1512// CHECK1: .omp.reduction.default:1513// CHECK1-NEXT: [[ARRAY_BEGIN44:%.*]] = getelementptr inbounds [10 x [4 x %struct.S]], ptr [[ARRS4]], i32 0, i32 0, i32 01514// CHECK1-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN44]], i64 401515// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1516// CHECK1: arraydestroy.body:1517// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP41]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1518// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11519// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]1520// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN44]]1521// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE45:%.*]], label [[ARRAYDESTROY_BODY]]1522// CHECK1: arraydestroy.done45:1523// CHECK1-NEXT: [[TMP42:%.*]] = load ptr, ptr [[SAVED_STACK]], align 81524// CHECK1-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP42]])1525// CHECK1-NEXT: [[TMP43:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81526// CHECK1-NEXT: [[TMP44:%.*]] = load i32, ptr [[TMP43]], align 41527// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP44]])1528// CHECK1-NEXT: ret void1529//1530//1531// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.2.omp.reduction.reduction_func1532// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {1533// CHECK1-NEXT: entry:1534// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81535// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81536// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81537// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81538// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81539// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81540// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 01541// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81542// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 01543// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81544// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 11545// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 81546// CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP9]] to i641547// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP3]], i64 0, i64 21548// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 81549// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[TMP2]], i64 0, i64 21550// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 81551// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr i32, ptr [[TMP7]], i64 [[TMP10]]1552// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP15]]1553// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1554// CHECK1: omp.arraycpy.body:1555// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1556// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1557// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 41558// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 41559// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]1560// CHECK1-NEXT: store i32 [[ADD]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 41561// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11562// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11563// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP15]]1564// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]1565// CHECK1: omp.arraycpy.done2:1566// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP14]], i64 401567// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY3:%.*]] = icmp eq ptr [[TMP14]], [[TMP18]]1568// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY3]], label [[OMP_ARRAYCPY_DONE10:%.*]], label [[OMP_ARRAYCPY_BODY4:%.*]]1569// CHECK1: omp.arraycpy.body4:1570// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST5:%.*]] = phi ptr [ [[TMP12]], [[OMP_ARRAYCPY_DONE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT8:%.*]], [[OMP_ARRAYCPY_BODY4]] ]1571// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST6:%.*]] = phi ptr [ [[TMP14]], [[OMP_ARRAYCPY_DONE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT7:%.*]], [[OMP_ARRAYCPY_BODY4]] ]1572// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST6]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST5]])1573// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST6]], ptr align 4 [[CALL]], i64 4, i1 false)1574// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT7]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST6]], i32 11575// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT8]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST5]], i32 11576// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE9:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT7]], [[TMP18]]1577// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE9]], label [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_BODY4]]1578// CHECK1: omp.arraycpy.done10:1579// CHECK1-NEXT: ret void1580//1581//1582// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.31583// 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:%.*]]) #[[ATTR4]] {1584// CHECK1-NEXT: entry:1585// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81586// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81587// CHECK1-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 81588// CHECK1-NEXT: [[VLA_ADDR2:%.*]] = alloca i64, align 81589// CHECK1-NEXT: [[ARR_ADDR:%.*]] = alloca ptr, align 81590// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41591// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 41592// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41593// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41594// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41595// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41596// CHECK1-NEXT: [[ARR6:%.*]] = alloca [1 x [2 x i32]], align 41597// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 41598// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81599// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81600// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81601// CHECK1-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 81602// CHECK1-NEXT: store i64 [[VLA1]], ptr [[VLA_ADDR2]], align 81603// CHECK1-NEXT: store ptr [[ARR]], ptr [[ARR_ADDR]], align 81604// CHECK1-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR]], align 81605// CHECK1-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR2]], align 81606// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARR_ADDR]], align 81607// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41608// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41609// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41610// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41611// CHECK1-NEXT: [[TMP3:%.*]] = mul nsw i64 1, [[TMP1]]1612// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[TMP3]]1613// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw i32, ptr [[ARRAYIDX]], i64 01614// CHECK1-NEXT: [[TMP4:%.*]] = mul nsw i64 1, [[TMP1]]1615// CHECK1-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[TMP4]]1616// CHECK1-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds nuw i32, ptr [[ARRAYIDX4]], i64 11617// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [1 x [2 x i32]], ptr [[ARR6]], i32 0, i32 0, i32 01618// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr i32, ptr [[ARRAY_BEGIN]], i64 21619// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP5]]1620// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]1621// CHECK1: omp.arrayinit.body:1622// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]1623// CHECK1-NEXT: store i32 0, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 41624// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11625// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP5]]1626// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]1627// CHECK1: omp.arrayinit.done:1628// CHECK1-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP2]] to i641629// CHECK1-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[ARRAYIDX3]] to i641630// CHECK1-NEXT: [[TMP8:%.*]] = sub i64 [[TMP6]], [[TMP7]]1631// CHECK1-NEXT: [[TMP9:%.*]] = sdiv exact i64 [[TMP8]], ptrtoint (ptr getelementptr (i32, ptr null, i32 1) to i64)1632// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr i32, ptr [[ARR6]], i64 [[TMP9]]1633// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81634// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 41635// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP12]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1636// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41637// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP13]], 91638// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1639// CHECK1: cond.true:1640// CHECK1-NEXT: br label [[COND_END:%.*]]1641// CHECK1: cond.false:1642// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41643// CHECK1-NEXT: br label [[COND_END]]1644// CHECK1: cond.end:1645// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]1646// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41647// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41648// CHECK1-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_IV]], align 41649// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1650// CHECK1: omp.inner.for.cond:1651// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41652// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41653// CHECK1-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]1654// CHECK1-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1655// CHECK1: omp.inner.for.body:1656// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41657// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP18]], 11658// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1659// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 41660// CHECK1-NEXT: [[TMP19:%.*]] = mul nsw i64 1, [[TMP1]]1661// CHECK1-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, ptr [[TMP10]], i64 [[TMP19]]1662// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[I]], align 41663// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP20]] to i641664// CHECK1-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i32, ptr [[ARRAYIDX8]], i64 [[IDXPROM]]1665// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[ARRAYIDX9]], align 41666// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP21]], 11667// CHECK1-NEXT: store i32 [[INC]], ptr [[ARRAYIDX9]], align 41668// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1669// CHECK1: omp.body.continue:1670// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1671// CHECK1: omp.inner.for.inc:1672// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41673// CHECK1-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP22]], 11674// CHECK1-NEXT: store i32 [[ADD10]], ptr [[DOTOMP_IV]], align 41675// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]1676// CHECK1: omp.inner.for.end:1677// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1678// CHECK1: omp.loop.exit:1679// CHECK1-NEXT: [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81680// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 41681// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP24]])1682// CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01683// CHECK1-NEXT: store ptr [[ARR6]], ptr [[TMP25]], align 81684// CHECK1-NEXT: [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81685// CHECK1-NEXT: [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 41686// CHECK1-NEXT: [[TMP28:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP27]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.3.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1687// CHECK1-NEXT: switch i32 [[TMP28]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1688// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1689// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1690// CHECK1-NEXT: ]1691// CHECK1: .omp.reduction.case1:1692// CHECK1-NEXT: [[TMP29:%.*]] = getelementptr i32, ptr [[ARRAYIDX3]], i64 21693// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX3]], [[TMP29]]1694// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE15:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1695// CHECK1: omp.arraycpy.body:1696// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[ARR6]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1697// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST11:%.*]] = phi ptr [ [[ARRAYIDX3]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT13:%.*]], [[OMP_ARRAYCPY_BODY]] ]1698// CHECK1-NEXT: [[TMP30:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST11]], align 41699// CHECK1-NEXT: [[TMP31:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 41700// CHECK1-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP30]], [[TMP31]]1701// CHECK1-NEXT: store i32 [[ADD12]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST11]], align 41702// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT13]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST11]], i32 11703// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11704// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE14:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT13]], [[TMP29]]1705// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE14]], label [[OMP_ARRAYCPY_DONE15]], label [[OMP_ARRAYCPY_BODY]]1706// CHECK1: omp.arraycpy.done15:1707// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP27]], ptr @.gomp_critical_user_.reduction.var)1708// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1709// CHECK1: .omp.reduction.case2:1710// CHECK1-NEXT: [[TMP32:%.*]] = getelementptr i32, ptr [[ARRAYIDX3]], i64 21711// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY16:%.*]] = icmp eq ptr [[ARRAYIDX3]], [[TMP32]]1712// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY16]], label [[OMP_ARRAYCPY_DONE23:%.*]], label [[OMP_ARRAYCPY_BODY17:%.*]]1713// CHECK1: omp.arraycpy.body17:1714// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST18:%.*]] = phi ptr [ [[ARR6]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT21:%.*]], [[OMP_ARRAYCPY_BODY17]] ]1715// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST19:%.*]] = phi ptr [ [[ARRAYIDX3]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT20:%.*]], [[OMP_ARRAYCPY_BODY17]] ]1716// CHECK1-NEXT: [[TMP33:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST18]], align 41717// CHECK1-NEXT: [[TMP34:%.*]] = atomicrmw add ptr [[OMP_ARRAYCPY_DESTELEMENTPAST19]], i32 [[TMP33]] monotonic, align 41718// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT20]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST19]], i32 11719// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT21]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST18]], i32 11720// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE22:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT20]], [[TMP32]]1721// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE22]], label [[OMP_ARRAYCPY_DONE23]], label [[OMP_ARRAYCPY_BODY17]]1722// CHECK1: omp.arraycpy.done23:1723// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP27]], ptr @.gomp_critical_user_.reduction.var)1724// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1725// CHECK1: .omp.reduction.default:1726// CHECK1-NEXT: [[TMP35:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81727// CHECK1-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 41728// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP36]])1729// CHECK1-NEXT: ret void1730//1731//1732// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.3.omp.reduction.reduction_func1733// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {1734// CHECK1-NEXT: entry:1735// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81736// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81737// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81738// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81739// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81740// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81741// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01742// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81743// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01744// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81745// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr i32, ptr [[TMP7]], i64 21746// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]1747// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1748// CHECK1: omp.arraycpy.body:1749// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1750// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1751// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 41752// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 41753// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]1754// CHECK1-NEXT: store i32 [[ADD]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 41755// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11756// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11757// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]1758// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]1759// CHECK1: omp.arraycpy.done2:1760// CHECK1-NEXT: ret void1761//1762//1763// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.41764// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[VAR2:%.*]]) #[[ATTR4]] {1765// CHECK1-NEXT: entry:1766// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81767// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81768// CHECK1-NEXT: [[VAR2_ADDR:%.*]] = alloca ptr, align 81769// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41770// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 41771// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41772// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41773// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41774// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41775// CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 81776// CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 81777// CHECK1-NEXT: [[_TMP4:%.*]] = alloca ptr, align 81778// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 81779// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 41780// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 81781// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81782// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81783// CHECK1-NEXT: store ptr [[VAR2]], ptr [[VAR2_ADDR]], align 81784// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR2_ADDR]], align 81785// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41786// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41787// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41788// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41789// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 81790// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw ptr, ptr [[TMP1]], i64 01791// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARRAYIDX]], align 81792// CHECK1-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[TMP2]], i64 11793// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP0]], align 81794// CHECK1-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds nuw ptr, ptr [[TMP3]], i64 41795// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[ARRAYIDX2]], align 81796// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[TMP4]], i64 61797// CHECK1-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[ARRAYIDX3]] to i641798// CHECK1-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[ARRAYIDX1]] to i641799// CHECK1-NEXT: [[TMP7:%.*]] = sub i64 [[TMP5]], [[TMP6]]1800// CHECK1-NEXT: [[TMP8:%.*]] = sdiv exact i64 [[TMP7]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)1801// CHECK1-NEXT: [[TMP9:%.*]] = add nuw i64 [[TMP8]], 11802// CHECK1-NEXT: [[TMP10:%.*]] = mul nuw i64 [[TMP9]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)1803// CHECK1-NEXT: [[TMP11:%.*]] = call ptr @llvm.stacksave.p0()1804// CHECK1-NEXT: store ptr [[TMP11]], ptr [[SAVED_STACK]], align 81805// CHECK1-NEXT: [[VLA:%.*]] = alloca [[STRUCT_S]], i64 [[TMP9]], align 161806// CHECK1-NEXT: store i64 [[TMP9]], ptr [[__VLA_EXPR0]], align 81807// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr [[STRUCT_S]], ptr [[VLA]], i64 [[TMP9]]1808// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[VLA]], [[TMP12]]1809// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]1810// CHECK1: omp.arrayinit.body:1811// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[VLA]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]1812// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])1813// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11814// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP12]]1815// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]1816// CHECK1: omp.arrayinit.done:1817// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP0]], align 81818// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 81819// CHECK1-NEXT: [[TMP15:%.*]] = ptrtoint ptr [[TMP14]] to i641820// CHECK1-NEXT: [[TMP16:%.*]] = ptrtoint ptr [[ARRAYIDX1]] to i641821// CHECK1-NEXT: [[TMP17:%.*]] = sub i64 [[TMP15]], [[TMP16]]1822// CHECK1-NEXT: [[TMP18:%.*]] = sdiv exact i64 [[TMP17]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)1823// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr [[STRUCT_S]], ptr [[VLA]], i64 [[TMP18]]1824// CHECK1-NEXT: store ptr [[_TMP5]], ptr [[_TMP4]], align 81825// CHECK1-NEXT: store ptr [[TMP19]], ptr [[_TMP5]], align 81826// CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81827// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41828// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP21]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1829// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41830// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP22]], 91831// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1832// CHECK1: cond.true:1833// CHECK1-NEXT: br label [[COND_END:%.*]]1834// CHECK1: cond.false:1835// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41836// CHECK1-NEXT: br label [[COND_END]]1837// CHECK1: cond.end:1838// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP23]], [[COND_FALSE]] ]1839// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41840// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41841// CHECK1-NEXT: store i32 [[TMP24]], ptr [[DOTOMP_IV]], align 41842// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1843// CHECK1: omp.inner.for.cond:1844// CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41845// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41846// CHECK1-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP25]], [[TMP26]]1847// CHECK1-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1848// CHECK1: omp.inner.for.cond.cleanup:1849// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1850// CHECK1: omp.inner.for.body:1851// CHECK1-NEXT: [[TMP27:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41852// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP27]], 11853// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1854// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 41855// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1856// CHECK1: omp.body.continue:1857// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1858// CHECK1: omp.inner.for.inc:1859// CHECK1-NEXT: [[TMP28:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41860// CHECK1-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP28]], 11861// CHECK1-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 41862// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]1863// CHECK1: omp.inner.for.end:1864// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1865// CHECK1: omp.loop.exit:1866// CHECK1-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81867// CHECK1-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 41868// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP30]])1869// CHECK1-NEXT: [[TMP31:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01870// CHECK1-NEXT: store ptr [[VLA]], ptr [[TMP31]], align 81871// CHECK1-NEXT: [[TMP32:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 11872// CHECK1-NEXT: [[TMP33:%.*]] = inttoptr i64 [[TMP9]] to ptr1873// CHECK1-NEXT: store ptr [[TMP33]], ptr [[TMP32]], align 81874// CHECK1-NEXT: [[TMP34:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81875// CHECK1-NEXT: [[TMP35:%.*]] = load i32, ptr [[TMP34]], align 41876// CHECK1-NEXT: [[TMP36:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP35]], i32 1, i64 16, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.4.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1877// CHECK1-NEXT: switch i32 [[TMP36]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1878// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1879// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1880// CHECK1-NEXT: ]1881// CHECK1: .omp.reduction.case1:1882// CHECK1-NEXT: [[TMP37:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX1]], i64 [[TMP9]]1883// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX1]], [[TMP37]]1884// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE11:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1885// CHECK1: omp.arraycpy.body:1886// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VLA]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1887// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST8:%.*]] = phi ptr [ [[ARRAYIDX1]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT9:%.*]], [[OMP_ARRAYCPY_BODY]] ]1888// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST8]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])1889// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST8]], ptr align 4 [[CALL]], i64 4, i1 false)1890// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT9]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST8]], i32 11891// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11892// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE10:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT9]], [[TMP37]]1893// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_DONE11]], label [[OMP_ARRAYCPY_BODY]]1894// CHECK1: omp.arraycpy.done11:1895// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP35]], ptr @.gomp_critical_user_.reduction.var)1896// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1897// CHECK1: .omp.reduction.case2:1898// CHECK1-NEXT: [[TMP38:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX1]], i64 [[TMP9]]1899// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY12:%.*]] = icmp eq ptr [[ARRAYIDX1]], [[TMP38]]1900// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY12]], label [[OMP_ARRAYCPY_DONE20:%.*]], label [[OMP_ARRAYCPY_BODY13:%.*]]1901// CHECK1: omp.arraycpy.body13:1902// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST14:%.*]] = phi ptr [ [[VLA]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT18:%.*]], [[OMP_ARRAYCPY_BODY13]] ]1903// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST15:%.*]] = phi ptr [ [[ARRAYIDX1]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT17:%.*]], [[OMP_ARRAYCPY_BODY13]] ]1904// CHECK1-NEXT: [[TMP39:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81905// CHECK1-NEXT: [[TMP40:%.*]] = load i32, ptr [[TMP39]], align 41906// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP40]], ptr @.gomp_critical_user_.atomic_reduction.var)1907// CHECK1-NEXT: [[CALL16:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST15]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST14]])1908// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST15]], ptr align 4 [[CALL16]], i64 4, i1 false)1909// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP40]], ptr @.gomp_critical_user_.atomic_reduction.var)1910// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT17]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST15]], i32 11911// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT18]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST14]], i32 11912// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE19:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT17]], [[TMP38]]1913// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE19]], label [[OMP_ARRAYCPY_DONE20]], label [[OMP_ARRAYCPY_BODY13]]1914// CHECK1: omp.arraycpy.done20:1915// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP35]], ptr @.gomp_critical_user_.reduction.var)1916// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]1917// CHECK1: .omp.reduction.default:1918// CHECK1-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[VLA]], i64 [[TMP9]]1919// CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr [[VLA]], [[TMP41]]1920// CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE21:%.*]], label [[ARRAYDESTROY_BODY:%.*]]1921// CHECK1: arraydestroy.body:1922// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP41]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1923// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11924// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]1925// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[VLA]]1926// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE21]], label [[ARRAYDESTROY_BODY]]1927// CHECK1: arraydestroy.done21:1928// CHECK1-NEXT: [[TMP42:%.*]] = load ptr, ptr [[SAVED_STACK]], align 81929// CHECK1-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP42]])1930// CHECK1-NEXT: [[TMP43:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81931// CHECK1-NEXT: [[TMP44:%.*]] = load i32, ptr [[TMP43]], align 41932// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP44]])1933// CHECK1-NEXT: ret void1934//1935//1936// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.4.omp.reduction.reduction_func1937// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {1938// CHECK1-NEXT: entry:1939// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81940// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 81941// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81942// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 81943// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81944// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81945// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 01946// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81947// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 01948// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81949// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 11950// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 81951// CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP9]] to i641952// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP7]], i64 [[TMP10]]1953// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP11]]1954// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1955// CHECK1: omp.arraycpy.body:1956// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1957// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1958// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])1959// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[CALL]], i64 4, i1 false)1960// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11961// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11962// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP11]]1963// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]1964// CHECK1: omp.arraycpy.done2:1965// CHECK1-NEXT: ret void1966//1967//1968// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.51969// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[VAR2:%.*]]) #[[ATTR4]] {1970// CHECK1-NEXT: entry:1971// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81972// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81973// CHECK1-NEXT: [[VAR2_ADDR:%.*]] = alloca ptr, align 81974// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41975// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 41976// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41977// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41978// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41979// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41980// CHECK1-NEXT: [[VAR24:%.*]] = alloca [1 x [6 x %struct.S]], align 161981// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 81982// CHECK1-NEXT: [[_TMP6:%.*]] = alloca ptr, align 81983// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 41984// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81985// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81986// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81987// CHECK1-NEXT: store ptr [[VAR2]], ptr [[VAR2_ADDR]], align 81988// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR2_ADDR]], align 81989// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41990// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41991// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41992// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41993// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 81994// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[TMP1]], i64 11995// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARRAYIDX]], align 81996// CHECK1-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[TMP2]], i64 11997// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP0]], align 81998// CHECK1-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds ptr, ptr [[TMP3]], i64 11999// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[ARRAYIDX2]], align 82000// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[TMP4]], i64 62001// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [1 x [6 x %struct.S]], ptr [[VAR24]], i32 0, i32 0, i32 02002// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 62003// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP5]]2004// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]2005// CHECK1: omp.arrayinit.body:2006// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]2007// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])2008// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12009// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP5]]2010// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]2011// CHECK1: omp.arrayinit.done:2012// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP0]], align 82013// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82014// CHECK1-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP7]] to i642015// CHECK1-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[ARRAYIDX1]] to i642016// CHECK1-NEXT: [[TMP10:%.*]] = sub i64 [[TMP8]], [[TMP9]]2017// CHECK1-NEXT: [[TMP11:%.*]] = sdiv exact i64 [[TMP10]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)2018// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr [[STRUCT_S]], ptr [[VAR24]], i64 [[TMP11]]2019// CHECK1-NEXT: store ptr [[_TMP6]], ptr [[_TMP5]], align 82020// CHECK1-NEXT: store ptr [[TMP12]], ptr [[_TMP6]], align 82021// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82022// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 42023// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP14]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2024// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42025// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP15]], 92026// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2027// CHECK1: cond.true:2028// CHECK1-NEXT: br label [[COND_END:%.*]]2029// CHECK1: cond.false:2030// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42031// CHECK1-NEXT: br label [[COND_END]]2032// CHECK1: cond.end:2033// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP16]], [[COND_FALSE]] ]2034// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42035// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42036// CHECK1-NEXT: store i32 [[TMP17]], ptr [[DOTOMP_IV]], align 42037// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2038// CHECK1: omp.inner.for.cond:2039// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42040// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42041// CHECK1-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]2042// CHECK1-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2043// CHECK1: omp.inner.for.cond.cleanup:2044// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2045// CHECK1: omp.inner.for.body:2046// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42047// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP20]], 12048// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2049// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42050// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2051// CHECK1: omp.body.continue:2052// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2053// CHECK1: omp.inner.for.inc:2054// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42055// CHECK1-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP21]], 12056// CHECK1-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 42057// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2058// CHECK1: omp.inner.for.end:2059// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2060// CHECK1: omp.loop.exit:2061// CHECK1-NEXT: [[TMP22:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82062// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 42063// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP23]])2064// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02065// CHECK1-NEXT: store ptr [[VAR24]], ptr [[TMP24]], align 82066// CHECK1-NEXT: [[TMP25:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82067// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 42068// CHECK1-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP26]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.5.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2069// CHECK1-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2070// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2071// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2072// CHECK1-NEXT: ]2073// CHECK1: .omp.reduction.case1:2074// CHECK1-NEXT: [[TMP28:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX1]], i64 62075// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX1]], [[TMP28]]2076// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE12:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2077// CHECK1: omp.arraycpy.body:2078// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VAR24]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2079// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST9:%.*]] = phi ptr [ [[ARRAYIDX1]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT10:%.*]], [[OMP_ARRAYCPY_BODY]] ]2080// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST9]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2081// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST9]], ptr align 4 [[CALL]], i64 4, i1 false)2082// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT10]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST9]], i32 12083// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12084// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE11:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT10]], [[TMP28]]2085// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE11]], label [[OMP_ARRAYCPY_DONE12]], label [[OMP_ARRAYCPY_BODY]]2086// CHECK1: omp.arraycpy.done12:2087// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP26]], ptr @.gomp_critical_user_.reduction.var)2088// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2089// CHECK1: .omp.reduction.case2:2090// CHECK1-NEXT: [[TMP29:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX1]], i64 62091// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY13:%.*]] = icmp eq ptr [[ARRAYIDX1]], [[TMP29]]2092// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY13]], label [[OMP_ARRAYCPY_DONE21:%.*]], label [[OMP_ARRAYCPY_BODY14:%.*]]2093// CHECK1: omp.arraycpy.body14:2094// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST15:%.*]] = phi ptr [ [[VAR24]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT19:%.*]], [[OMP_ARRAYCPY_BODY14]] ]2095// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST16:%.*]] = phi ptr [ [[ARRAYIDX1]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT18:%.*]], [[OMP_ARRAYCPY_BODY14]] ]2096// CHECK1-NEXT: [[TMP30:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82097// CHECK1-NEXT: [[TMP31:%.*]] = load i32, ptr [[TMP30]], align 42098// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP31]], ptr @.gomp_critical_user_.atomic_reduction.var)2099// CHECK1-NEXT: [[CALL17:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST16]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST15]])2100// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST16]], ptr align 4 [[CALL17]], i64 4, i1 false)2101// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP31]], ptr @.gomp_critical_user_.atomic_reduction.var)2102// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT18]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST16]], i32 12103// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT19]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST15]], i32 12104// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE20:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT18]], [[TMP29]]2105// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE20]], label [[OMP_ARRAYCPY_DONE21]], label [[OMP_ARRAYCPY_BODY14]]2106// CHECK1: omp.arraycpy.done21:2107// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP26]], ptr @.gomp_critical_user_.reduction.var)2108// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2109// CHECK1: .omp.reduction.default:2110// CHECK1-NEXT: [[ARRAY_BEGIN22:%.*]] = getelementptr inbounds [1 x [6 x %struct.S]], ptr [[VAR24]], i32 0, i32 0, i32 02111// CHECK1-NEXT: [[TMP32:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN22]], i64 62112// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2113// CHECK1: arraydestroy.body:2114// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP32]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2115// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12116// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]2117// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN22]]2118// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE23:%.*]], label [[ARRAYDESTROY_BODY]]2119// CHECK1: arraydestroy.done23:2120// CHECK1-NEXT: [[TMP33:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82121// CHECK1-NEXT: [[TMP34:%.*]] = load i32, ptr [[TMP33]], align 42122// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP34]])2123// CHECK1-NEXT: ret void2124//2125//2126// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.5.omp.reduction.reduction_func2127// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {2128// CHECK1-NEXT: entry:2129// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82130// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82131// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82132// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82133// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82134// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82135// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02136// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82137// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02138// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82139// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP7]], i64 62140// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]2141// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2142// CHECK1: omp.arraycpy.body:2143// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2144// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2145// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2146// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[CALL]], i64 4, i1 false)2147// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12148// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12149// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]2150// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]2151// CHECK1: omp.arraycpy.done2:2152// CHECK1-NEXT: ret void2153//2154//2155// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.62156// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[VAR2:%.*]]) #[[ATTR4]] {2157// CHECK1-NEXT: entry:2158// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82159// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82160// CHECK1-NEXT: [[VAR2_ADDR:%.*]] = alloca ptr, align 82161// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42162// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 42163// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42164// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42165// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42166// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42167// CHECK1-NEXT: [[VAR24:%.*]] = alloca [1 x [6 x %struct.S]], align 162168// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 82169// CHECK1-NEXT: [[_TMP6:%.*]] = alloca ptr, align 82170// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42171// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82172// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82173// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82174// CHECK1-NEXT: store ptr [[VAR2]], ptr [[VAR2_ADDR]], align 82175// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR2_ADDR]], align 82176// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42177// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42178// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42179// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42180// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 82181// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw ptr, ptr [[TMP1]], i64 12182// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARRAYIDX]], align 82183// CHECK1-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[TMP2]], i64 12184// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP0]], align 82185// CHECK1-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds nuw ptr, ptr [[TMP3]], i64 12186// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[ARRAYIDX2]], align 82187// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[TMP4]], i64 62188// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [1 x [6 x %struct.S]], ptr [[VAR24]], i32 0, i32 0, i32 02189// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 62190// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP5]]2191// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]2192// CHECK1: omp.arrayinit.body:2193// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]2194// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])2195// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12196// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP5]]2197// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]2198// CHECK1: omp.arrayinit.done:2199// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP0]], align 82200// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82201// CHECK1-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP7]] to i642202// CHECK1-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[ARRAYIDX1]] to i642203// CHECK1-NEXT: [[TMP10:%.*]] = sub i64 [[TMP8]], [[TMP9]]2204// CHECK1-NEXT: [[TMP11:%.*]] = sdiv exact i64 [[TMP10]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)2205// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr [[STRUCT_S]], ptr [[VAR24]], i64 [[TMP11]]2206// CHECK1-NEXT: store ptr [[_TMP6]], ptr [[_TMP5]], align 82207// CHECK1-NEXT: store ptr [[TMP12]], ptr [[_TMP6]], align 82208// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82209// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 42210// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP14]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2211// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42212// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP15]], 92213// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2214// CHECK1: cond.true:2215// CHECK1-NEXT: br label [[COND_END:%.*]]2216// CHECK1: cond.false:2217// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42218// CHECK1-NEXT: br label [[COND_END]]2219// CHECK1: cond.end:2220// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP16]], [[COND_FALSE]] ]2221// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42222// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42223// CHECK1-NEXT: store i32 [[TMP17]], ptr [[DOTOMP_IV]], align 42224// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2225// CHECK1: omp.inner.for.cond:2226// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42227// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42228// CHECK1-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]2229// CHECK1-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2230// CHECK1: omp.inner.for.cond.cleanup:2231// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2232// CHECK1: omp.inner.for.body:2233// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42234// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP20]], 12235// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2236// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42237// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2238// CHECK1: omp.body.continue:2239// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2240// CHECK1: omp.inner.for.inc:2241// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42242// CHECK1-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP21]], 12243// CHECK1-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 42244// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2245// CHECK1: omp.inner.for.end:2246// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2247// CHECK1: omp.loop.exit:2248// CHECK1-NEXT: [[TMP22:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82249// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 42250// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP23]])2251// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02252// CHECK1-NEXT: store ptr [[VAR24]], ptr [[TMP24]], align 82253// CHECK1-NEXT: [[TMP25:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82254// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 42255// CHECK1-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP26]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.6.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2256// CHECK1-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2257// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2258// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2259// CHECK1-NEXT: ]2260// CHECK1: .omp.reduction.case1:2261// CHECK1-NEXT: [[TMP28:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX1]], i64 62262// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX1]], [[TMP28]]2263// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE12:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2264// CHECK1: omp.arraycpy.body:2265// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VAR24]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2266// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST9:%.*]] = phi ptr [ [[ARRAYIDX1]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT10:%.*]], [[OMP_ARRAYCPY_BODY]] ]2267// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST9]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2268// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST9]], ptr align 4 [[CALL]], i64 4, i1 false)2269// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT10]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST9]], i32 12270// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12271// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE11:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT10]], [[TMP28]]2272// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE11]], label [[OMP_ARRAYCPY_DONE12]], label [[OMP_ARRAYCPY_BODY]]2273// CHECK1: omp.arraycpy.done12:2274// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP26]], ptr @.gomp_critical_user_.reduction.var)2275// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2276// CHECK1: .omp.reduction.case2:2277// CHECK1-NEXT: [[TMP29:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX1]], i64 62278// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY13:%.*]] = icmp eq ptr [[ARRAYIDX1]], [[TMP29]]2279// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY13]], label [[OMP_ARRAYCPY_DONE21:%.*]], label [[OMP_ARRAYCPY_BODY14:%.*]]2280// CHECK1: omp.arraycpy.body14:2281// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST15:%.*]] = phi ptr [ [[VAR24]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT19:%.*]], [[OMP_ARRAYCPY_BODY14]] ]2282// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST16:%.*]] = phi ptr [ [[ARRAYIDX1]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT18:%.*]], [[OMP_ARRAYCPY_BODY14]] ]2283// CHECK1-NEXT: [[TMP30:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82284// CHECK1-NEXT: [[TMP31:%.*]] = load i32, ptr [[TMP30]], align 42285// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP31]], ptr @.gomp_critical_user_.atomic_reduction.var)2286// CHECK1-NEXT: [[CALL17:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST16]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST15]])2287// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST16]], ptr align 4 [[CALL17]], i64 4, i1 false)2288// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP31]], ptr @.gomp_critical_user_.atomic_reduction.var)2289// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT18]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST16]], i32 12290// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT19]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST15]], i32 12291// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE20:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT18]], [[TMP29]]2292// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE20]], label [[OMP_ARRAYCPY_DONE21]], label [[OMP_ARRAYCPY_BODY14]]2293// CHECK1: omp.arraycpy.done21:2294// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP26]], ptr @.gomp_critical_user_.reduction.var)2295// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2296// CHECK1: .omp.reduction.default:2297// CHECK1-NEXT: [[ARRAY_BEGIN22:%.*]] = getelementptr inbounds [1 x [6 x %struct.S]], ptr [[VAR24]], i32 0, i32 0, i32 02298// CHECK1-NEXT: [[TMP32:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN22]], i64 62299// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2300// CHECK1: arraydestroy.body:2301// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP32]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2302// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12303// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]2304// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN22]]2305// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE23:%.*]], label [[ARRAYDESTROY_BODY]]2306// CHECK1: arraydestroy.done23:2307// CHECK1-NEXT: [[TMP33:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82308// CHECK1-NEXT: [[TMP34:%.*]] = load i32, ptr [[TMP33]], align 42309// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP34]])2310// CHECK1-NEXT: ret void2311//2312//2313// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.6.omp.reduction.reduction_func2314// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {2315// CHECK1-NEXT: entry:2316// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82317// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82318// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82319// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82320// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82321// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82322// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02323// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82324// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02325// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82326// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP7]], i64 62327// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]2328// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2329// CHECK1: omp.arraycpy.body:2330// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2331// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2332// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2333// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[CALL]], i64 4, i1 false)2334// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12335// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12336// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]2337// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]2338// CHECK1: omp.arraycpy.done2:2339// CHECK1-NEXT: ret void2340//2341//2342// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.72343// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[VAR2:%.*]]) #[[ATTR4]] {2344// CHECK1-NEXT: entry:2345// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82346// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82347// CHECK1-NEXT: [[VAR2_ADDR:%.*]] = alloca ptr, align 82348// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42349// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 42350// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42351// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42352// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42353// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42354// CHECK1-NEXT: [[VAR24:%.*]] = alloca [[STRUCT_S:%.*]], align 42355// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 82356// CHECK1-NEXT: [[_TMP6:%.*]] = alloca ptr, align 82357// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42358// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82359// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82360// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82361// CHECK1-NEXT: store ptr [[VAR2]], ptr [[VAR2_ADDR]], align 82362// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR2_ADDR]], align 82363// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42364// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42365// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42366// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42367// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP0]], align 82368// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw ptr, ptr [[TMP1]], i64 12369// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARRAYIDX]], align 82370// CHECK1-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[TMP2]], i64 12371// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP0]], align 82372// CHECK1-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds nuw ptr, ptr [[TMP3]], i64 12373// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[ARRAYIDX2]], align 82374// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[TMP4]], i64 12375// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR24]])2376// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP0]], align 82377// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP5]], align 82378// CHECK1-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP6]] to i642379// CHECK1-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[ARRAYIDX1]] to i642380// CHECK1-NEXT: [[TMP9:%.*]] = sub i64 [[TMP7]], [[TMP8]]2381// CHECK1-NEXT: [[TMP10:%.*]] = sdiv exact i64 [[TMP9]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)2382// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr [[STRUCT_S]], ptr [[VAR24]], i64 [[TMP10]]2383// CHECK1-NEXT: store ptr [[_TMP6]], ptr [[_TMP5]], align 82384// CHECK1-NEXT: store ptr [[TMP11]], ptr [[_TMP6]], align 82385// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82386// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 42387// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP13]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2388// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42389// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP14]], 92390// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2391// CHECK1: cond.true:2392// CHECK1-NEXT: br label [[COND_END:%.*]]2393// CHECK1: cond.false:2394// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42395// CHECK1-NEXT: br label [[COND_END]]2396// CHECK1: cond.end:2397// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]2398// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42399// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42400// CHECK1-NEXT: store i32 [[TMP16]], ptr [[DOTOMP_IV]], align 42401// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2402// CHECK1: omp.inner.for.cond:2403// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42404// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42405// CHECK1-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]2406// CHECK1-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2407// CHECK1: omp.inner.for.cond.cleanup:2408// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2409// CHECK1: omp.inner.for.body:2410// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42411// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP19]], 12412// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2413// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42414// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2415// CHECK1: omp.body.continue:2416// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2417// CHECK1: omp.inner.for.inc:2418// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42419// CHECK1-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP20]], 12420// CHECK1-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 42421// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2422// CHECK1: omp.inner.for.end:2423// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2424// CHECK1: omp.loop.exit:2425// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP13]])2426// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02427// CHECK1-NEXT: store ptr [[VAR24]], ptr [[TMP21]], align 82428// CHECK1-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP13]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.7.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2429// CHECK1-NEXT: switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2430// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2431// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2432// CHECK1-NEXT: ]2433// CHECK1: .omp.reduction.case1:2434// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYIDX1]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR24]])2435// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX1]], ptr align 4 [[CALL]], i64 4, i1 false)2436// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP13]], ptr @.gomp_critical_user_.reduction.var)2437// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2438// CHECK1: .omp.reduction.case2:2439// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP13]], ptr @.gomp_critical_user_.atomic_reduction.var)2440// CHECK1-NEXT: [[CALL9:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYIDX1]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR24]])2441// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX1]], ptr align 4 [[CALL9]], i64 4, i1 false)2442// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP13]], ptr @.gomp_critical_user_.atomic_reduction.var)2443// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP13]], ptr @.gomp_critical_user_.reduction.var)2444// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2445// CHECK1: .omp.reduction.default:2446// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR24]]) #[[ATTR5]]2447// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP13]])2448// CHECK1-NEXT: ret void2449//2450//2451// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.7.omp.reduction.reduction_func2452// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {2453// CHECK1-NEXT: entry:2454// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82455// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82456// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82457// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82458// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82459// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82460// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02461// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82462// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02463// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82464// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP7]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP5]])2465// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP7]], ptr align 4 [[CALL]], i64 4, i1 false)2466// CHECK1-NEXT: ret void2467//2468//2469// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.82470// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(20) [[VVAR2:%.*]]) #[[ATTR4]] {2471// CHECK1-NEXT: entry:2472// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82473// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82474// CHECK1-NEXT: [[VVAR2_ADDR:%.*]] = alloca ptr, align 82475// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42476// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 42477// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42478// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42479// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42480// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42481// CHECK1-NEXT: [[VVAR22:%.*]] = alloca [5 x %struct.S], align 162482// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42483// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82484// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82485// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82486// CHECK1-NEXT: store ptr [[VVAR2]], ptr [[VVAR2_ADDR]], align 82487// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VVAR2_ADDR]], align 82488// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42489// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42490// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42491// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42492// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [5 x %struct.S], ptr [[TMP0]], i64 0, i64 02493// CHECK1-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw [5 x %struct.S], ptr [[TMP0]], i64 0, i64 42494// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S], ptr [[VVAR22]], i32 0, i32 02495// CHECK1-NEXT: [[TMP1:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[ARRAY_BEGIN]], i64 52496// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP1]]2497// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]2498// CHECK1: omp.arrayinit.body:2499// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]2500// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])2501// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12502// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP1]]2503// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]2504// CHECK1: omp.arrayinit.done:2505// CHECK1-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[TMP0]] to i642506// CHECK1-NEXT: [[TMP3:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i642507// CHECK1-NEXT: [[TMP4:%.*]] = sub i64 [[TMP2]], [[TMP3]]2508// CHECK1-NEXT: [[TMP5:%.*]] = sdiv exact i64 [[TMP4]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)2509// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr [[STRUCT_S]], ptr [[VVAR22]], i64 [[TMP5]]2510// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82511// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 42512// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2513// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42514// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP9]], 92515// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2516// CHECK1: cond.true:2517// CHECK1-NEXT: br label [[COND_END:%.*]]2518// CHECK1: cond.false:2519// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42520// CHECK1-NEXT: br label [[COND_END]]2521// CHECK1: cond.end:2522// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP10]], [[COND_FALSE]] ]2523// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42524// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42525// CHECK1-NEXT: store i32 [[TMP11]], ptr [[DOTOMP_IV]], align 42526// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2527// CHECK1: omp.inner.for.cond:2528// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42529// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42530// CHECK1-NEXT: [[CMP3:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]2531// CHECK1-NEXT: br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2532// CHECK1: omp.inner.for.cond.cleanup:2533// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2534// CHECK1: omp.inner.for.body:2535// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42536// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP14]], 12537// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2538// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42539// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2540// CHECK1: omp.body.continue:2541// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2542// CHECK1: omp.inner.for.inc:2543// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42544// CHECK1-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP15]], 12545// CHECK1-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_IV]], align 42546// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2547// CHECK1: omp.inner.for.end:2548// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2549// CHECK1: omp.loop.exit:2550// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82551// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 42552// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP17]])2553// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02554// CHECK1-NEXT: store ptr [[VVAR22]], ptr [[TMP18]], align 82555// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82556// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 42557// CHECK1-NEXT: [[TMP21:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP20]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.8.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2558// CHECK1-NEXT: switch i32 [[TMP21]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2559// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2560// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2561// CHECK1-NEXT: ]2562// CHECK1: .omp.reduction.case1:2563// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 52564// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP22]]2565// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE8:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2566// CHECK1: omp.arraycpy.body:2567// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VVAR22]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2568// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST5:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT6:%.*]], [[OMP_ARRAYCPY_BODY]] ]2569// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST5]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2570// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST5]], ptr align 4 [[CALL]], i64 4, i1 false)2571// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT6]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST5]], i32 12572// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12573// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE7:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT6]], [[TMP22]]2574// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE7]], label [[OMP_ARRAYCPY_DONE8]], label [[OMP_ARRAYCPY_BODY]]2575// CHECK1: omp.arraycpy.done8:2576// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP20]], ptr @.gomp_critical_user_.reduction.var)2577// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2578// CHECK1: .omp.reduction.case2:2579// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 52580// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY9:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP23]]2581// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY9]], label [[OMP_ARRAYCPY_DONE17:%.*]], label [[OMP_ARRAYCPY_BODY10:%.*]]2582// CHECK1: omp.arraycpy.body10:2583// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST11:%.*]] = phi ptr [ [[VVAR22]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT15:%.*]], [[OMP_ARRAYCPY_BODY10]] ]2584// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST12:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT14:%.*]], [[OMP_ARRAYCPY_BODY10]] ]2585// CHECK1-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82586// CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 42587// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP25]], ptr @.gomp_critical_user_.atomic_reduction.var)2588// CHECK1-NEXT: [[CALL13:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST12]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST11]])2589// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST12]], ptr align 4 [[CALL13]], i64 4, i1 false)2590// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP25]], ptr @.gomp_critical_user_.atomic_reduction.var)2591// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT14]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST12]], i32 12592// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT15]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST11]], i32 12593// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE16:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT14]], [[TMP23]]2594// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE16]], label [[OMP_ARRAYCPY_DONE17]], label [[OMP_ARRAYCPY_BODY10]]2595// CHECK1: omp.arraycpy.done17:2596// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP20]], ptr @.gomp_critical_user_.reduction.var)2597// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2598// CHECK1: .omp.reduction.default:2599// CHECK1-NEXT: [[ARRAY_BEGIN18:%.*]] = getelementptr inbounds [5 x %struct.S], ptr [[VVAR22]], i32 0, i32 02600// CHECK1-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN18]], i64 52601// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2602// CHECK1: arraydestroy.body:2603// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP26]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2604// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12605// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]2606// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN18]]2607// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE19:%.*]], label [[ARRAYDESTROY_BODY]]2608// CHECK1: arraydestroy.done19:2609// CHECK1-NEXT: [[TMP27:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82610// CHECK1-NEXT: [[TMP28:%.*]] = load i32, ptr [[TMP27]], align 42611// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP28]])2612// CHECK1-NEXT: ret void2613//2614//2615// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.8.omp.reduction.reduction_func2616// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {2617// CHECK1-NEXT: entry:2618// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82619// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82620// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82621// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82622// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82623// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82624// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02625// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82626// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02627// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82628// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP7]], i64 52629// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]2630// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2631// CHECK1: omp.arraycpy.body:2632// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2633// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2634// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2635// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[CALL]], i64 4, i1 false)2636// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12637// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12638// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]2639// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]2640// CHECK1: omp.arraycpy.done2:2641// CHECK1-NEXT: ret void2642//2643//2644// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.92645// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(16) [[VAR3:%.*]]) #[[ATTR4]] {2646// CHECK1-NEXT: entry:2647// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82648// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82649// CHECK1-NEXT: [[VAR3_ADDR:%.*]] = alloca ptr, align 82650// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 82651// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82652// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42653// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 42654// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42655// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42656// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42657// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42658// CHECK1-NEXT: [[VAR34:%.*]] = alloca [2 x %struct.S], align 42659// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 82660// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42661// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82662// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82663// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82664// CHECK1-NEXT: store ptr [[VAR3]], ptr [[VAR3_ADDR]], align 82665// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR3_ADDR]], align 82666// CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 82667// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 82668// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 82669// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42670// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42671// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42672// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42673// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 82674// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [4 x %struct.S], ptr [[TMP2]], i64 0, i64 12675// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[_TMP1]], align 82676// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [4 x %struct.S], ptr [[TMP3]], i64 0, i64 22677// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[VAR34]], i32 0, i32 02678// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[ARRAY_BEGIN]], i64 22679// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP4]]2680// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]2681// CHECK1: omp.arrayinit.body:2682// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]2683// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])2684// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12685// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP4]]2686// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]2687// CHECK1: omp.arrayinit.done:2688// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[_TMP1]], align 82689// CHECK1-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP5]] to i642690// CHECK1-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i642691// CHECK1-NEXT: [[TMP8:%.*]] = sub i64 [[TMP6]], [[TMP7]]2692// CHECK1-NEXT: [[TMP9:%.*]] = sdiv exact i64 [[TMP8]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)2693// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr [[STRUCT_S]], ptr [[VAR34]], i64 [[TMP9]]2694// CHECK1-NEXT: store ptr [[TMP10]], ptr [[_TMP5]], align 82695// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82696// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 42697// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP12]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2698// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42699// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP13]], 92700// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2701// CHECK1: cond.true:2702// CHECK1-NEXT: br label [[COND_END:%.*]]2703// CHECK1: cond.false:2704// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42705// CHECK1-NEXT: br label [[COND_END]]2706// CHECK1: cond.end:2707// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]2708// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42709// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42710// CHECK1-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_IV]], align 42711// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2712// CHECK1: omp.inner.for.cond:2713// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42714// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42715// CHECK1-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]2716// CHECK1-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2717// CHECK1: omp.inner.for.cond.cleanup:2718// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2719// CHECK1: omp.inner.for.body:2720// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42721// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP18]], 12722// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2723// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42724// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2725// CHECK1: omp.body.continue:2726// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2727// CHECK1: omp.inner.for.inc:2728// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42729// CHECK1-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP19]], 12730// CHECK1-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 42731// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2732// CHECK1: omp.inner.for.end:2733// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2734// CHECK1: omp.loop.exit:2735// CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82736// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 42737// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])2738// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02739// CHECK1-NEXT: store ptr [[VAR34]], ptr [[TMP22]], align 82740// CHECK1-NEXT: [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82741// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 42742// CHECK1-NEXT: [[TMP25:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.9.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2743// CHECK1-NEXT: switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2744// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2745// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2746// CHECK1-NEXT: ]2747// CHECK1: .omp.reduction.case1:2748// CHECK1-NEXT: [[TMP26:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 22749// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP26]]2750// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE11:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2751// CHECK1: omp.arraycpy.body:2752// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VAR34]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2753// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST8:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT9:%.*]], [[OMP_ARRAYCPY_BODY]] ]2754// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST8]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2755// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST8]], ptr align 4 [[CALL]], i64 4, i1 false)2756// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT9]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST8]], i32 12757// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12758// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE10:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT9]], [[TMP26]]2759// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_DONE11]], label [[OMP_ARRAYCPY_BODY]]2760// CHECK1: omp.arraycpy.done11:2761// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)2762// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2763// CHECK1: .omp.reduction.case2:2764// CHECK1-NEXT: [[TMP27:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 22765// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY12:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP27]]2766// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY12]], label [[OMP_ARRAYCPY_DONE20:%.*]], label [[OMP_ARRAYCPY_BODY13:%.*]]2767// CHECK1: omp.arraycpy.body13:2768// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST14:%.*]] = phi ptr [ [[VAR34]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT18:%.*]], [[OMP_ARRAYCPY_BODY13]] ]2769// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST15:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT17:%.*]], [[OMP_ARRAYCPY_BODY13]] ]2770// CHECK1-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82771// CHECK1-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 42772// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)2773// CHECK1-NEXT: [[CALL16:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST15]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST14]])2774// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST15]], ptr align 4 [[CALL16]], i64 4, i1 false)2775// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)2776// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT17]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST15]], i32 12777// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT18]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST14]], i32 12778// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE19:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT17]], [[TMP27]]2779// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE19]], label [[OMP_ARRAYCPY_DONE20]], label [[OMP_ARRAYCPY_BODY13]]2780// CHECK1: omp.arraycpy.done20:2781// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)2782// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2783// CHECK1: .omp.reduction.default:2784// CHECK1-NEXT: [[ARRAY_BEGIN21:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[VAR34]], i32 0, i32 02785// CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN21]], i64 22786// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2787// CHECK1: arraydestroy.body:2788// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP30]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2789// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12790// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]2791// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN21]]2792// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE22:%.*]], label [[ARRAYDESTROY_BODY]]2793// CHECK1: arraydestroy.done22:2794// CHECK1-NEXT: [[TMP31:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82795// CHECK1-NEXT: [[TMP32:%.*]] = load i32, ptr [[TMP31]], align 42796// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP32]])2797// CHECK1-NEXT: ret void2798//2799//2800// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.9.omp.reduction.reduction_func2801// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {2802// CHECK1-NEXT: entry:2803// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82804// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82805// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82806// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82807// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82808// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82809// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02810// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82811// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02812// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82813// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP7]], i64 22814// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]2815// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2816// CHECK1: omp.arraycpy.body:2817// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2818// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2819// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2820// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[CALL]], i64 4, i1 false)2821// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12822// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12823// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]2824// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]2825// CHECK1: omp.arraycpy.done2:2826// CHECK1-NEXT: ret void2827//2828//2829// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.102830// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(16) [[VAR3:%.*]]) #[[ATTR4]] {2831// CHECK1-NEXT: entry:2832// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82833// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82834// CHECK1-NEXT: [[VAR3_ADDR:%.*]] = alloca ptr, align 82835// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 82836// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 82837// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42838// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 42839// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42840// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42841// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42842// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42843// CHECK1-NEXT: [[VAR34:%.*]] = alloca [2 x %struct.S], align 42844// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 82845// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 42846// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82847// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82848// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82849// CHECK1-NEXT: store ptr [[VAR3]], ptr [[VAR3_ADDR]], align 82850// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR3_ADDR]], align 82851// CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 82852// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 82853// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 82854// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42855// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42856// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42857// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42858// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 82859// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [4 x %struct.S], ptr [[TMP2]], i64 0, i64 02860// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[_TMP1]], align 82861// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [4 x %struct.S], ptr [[TMP3]], i64 0, i64 12862// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[VAR34]], i32 0, i32 02863// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[ARRAY_BEGIN]], i64 22864// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP4]]2865// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]2866// CHECK1: omp.arrayinit.body:2867// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]2868// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])2869// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12870// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP4]]2871// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]2872// CHECK1: omp.arrayinit.done:2873// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[_TMP1]], align 82874// CHECK1-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP5]] to i642875// CHECK1-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i642876// CHECK1-NEXT: [[TMP8:%.*]] = sub i64 [[TMP6]], [[TMP7]]2877// CHECK1-NEXT: [[TMP9:%.*]] = sdiv exact i64 [[TMP8]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)2878// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr [[STRUCT_S]], ptr [[VAR34]], i64 [[TMP9]]2879// CHECK1-NEXT: store ptr [[TMP10]], ptr [[_TMP5]], align 82880// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82881// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 42882// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP12]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2883// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42884// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP13]], 92885// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2886// CHECK1: cond.true:2887// CHECK1-NEXT: br label [[COND_END:%.*]]2888// CHECK1: cond.false:2889// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42890// CHECK1-NEXT: br label [[COND_END]]2891// CHECK1: cond.end:2892// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]2893// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42894// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42895// CHECK1-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_IV]], align 42896// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2897// CHECK1: omp.inner.for.cond:2898// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42899// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42900// CHECK1-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]2901// CHECK1-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2902// CHECK1: omp.inner.for.cond.cleanup:2903// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2904// CHECK1: omp.inner.for.body:2905// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42906// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP18]], 12907// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2908// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 42909// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2910// CHECK1: omp.body.continue:2911// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2912// CHECK1: omp.inner.for.inc:2913// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42914// CHECK1-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP19]], 12915// CHECK1-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 42916// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]2917// CHECK1: omp.inner.for.end:2918// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2919// CHECK1: omp.loop.exit:2920// CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82921// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 42922// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])2923// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02924// CHECK1-NEXT: store ptr [[VAR34]], ptr [[TMP22]], align 82925// CHECK1-NEXT: [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82926// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 42927// CHECK1-NEXT: [[TMP25:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.10.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2928// CHECK1-NEXT: switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2929// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2930// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2931// CHECK1-NEXT: ]2932// CHECK1: .omp.reduction.case1:2933// CHECK1-NEXT: [[TMP26:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 22934// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP26]]2935// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE11:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2936// CHECK1: omp.arraycpy.body:2937// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VAR34]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2938// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST8:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT9:%.*]], [[OMP_ARRAYCPY_BODY]] ]2939// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST8]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])2940// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST8]], ptr align 4 [[CALL]], i64 4, i1 false)2941// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT9]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST8]], i32 12942// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12943// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE10:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT9]], [[TMP26]]2944// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_DONE11]], label [[OMP_ARRAYCPY_BODY]]2945// CHECK1: omp.arraycpy.done11:2946// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)2947// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2948// CHECK1: .omp.reduction.case2:2949// CHECK1-NEXT: [[TMP27:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 22950// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY12:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP27]]2951// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY12]], label [[OMP_ARRAYCPY_DONE20:%.*]], label [[OMP_ARRAYCPY_BODY13:%.*]]2952// CHECK1: omp.arraycpy.body13:2953// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST14:%.*]] = phi ptr [ [[VAR34]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT18:%.*]], [[OMP_ARRAYCPY_BODY13]] ]2954// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST15:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT17:%.*]], [[OMP_ARRAYCPY_BODY13]] ]2955// CHECK1-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82956// CHECK1-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 42957// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)2958// CHECK1-NEXT: [[CALL16:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST15]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST14]])2959// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST15]], ptr align 4 [[CALL16]], i64 4, i1 false)2960// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)2961// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT17]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST15]], i32 12962// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT18]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST14]], i32 12963// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE19:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT17]], [[TMP27]]2964// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE19]], label [[OMP_ARRAYCPY_DONE20]], label [[OMP_ARRAYCPY_BODY13]]2965// CHECK1: omp.arraycpy.done20:2966// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)2967// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]2968// CHECK1: .omp.reduction.default:2969// CHECK1-NEXT: [[ARRAY_BEGIN21:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[VAR34]], i32 0, i32 02970// CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN21]], i64 22971// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2972// CHECK1: arraydestroy.body:2973// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP30]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2974// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -12975// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]2976// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN21]]2977// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE22:%.*]], label [[ARRAYDESTROY_BODY]]2978// CHECK1: arraydestroy.done22:2979// CHECK1-NEXT: [[TMP31:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82980// CHECK1-NEXT: [[TMP32:%.*]] = load i32, ptr [[TMP31]], align 42981// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP32]])2982// CHECK1-NEXT: ret void2983//2984//2985// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.10.omp.reduction.reduction_func2986// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {2987// CHECK1-NEXT: entry:2988// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 82989// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 82990// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 82991// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 82992// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82993// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82994// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02995// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82996// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02997// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82998// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP7]], i64 22999// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]3000// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]3001// CHECK1: omp.arraycpy.body:3002// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3003// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3004// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])3005// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[CALL]], i64 4, i1 false)3006// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 13007// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 13008// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]3009// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]3010// CHECK1: omp.arraycpy.done2:3011// CHECK1-NEXT: ret void3012//3013//3014// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.113015// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(16) [[VAR3:%.*]]) #[[ATTR4]] {3016// CHECK1-NEXT: entry:3017// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83018// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83019// CHECK1-NEXT: [[VAR3_ADDR:%.*]] = alloca ptr, align 83020// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 83021// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83022// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43023// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 43024// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43025// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43026// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43027// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43028// CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 83029// CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 83030// CHECK1-NEXT: [[_TMP4:%.*]] = alloca ptr, align 83031// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 43032// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 83033// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83034// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83035// CHECK1-NEXT: store ptr [[VAR3]], ptr [[VAR3_ADDR]], align 83036// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR3_ADDR]], align 83037// CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 83038// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 83039// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 83040// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43041// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 43042// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43043// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43044// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 83045// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [4 x %struct.S], ptr [[TMP2]], i64 0, i64 23046// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[_TMP1]], align 83047// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [4 x %struct.S], ptr [[TMP3]], i64 0, i64 33048// CHECK1-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[ARRAYIDX3]] to i643049// CHECK1-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i643050// CHECK1-NEXT: [[TMP6:%.*]] = sub i64 [[TMP4]], [[TMP5]]3051// CHECK1-NEXT: [[TMP7:%.*]] = sdiv exact i64 [[TMP6]], ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr null, i32 1) to i64)3052// CHECK1-NEXT: [[TMP8:%.*]] = add nuw i64 [[TMP7]], 13053// CHECK1-NEXT: [[TMP9:%.*]] = mul nuw i64 [[TMP8]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)3054// CHECK1-NEXT: [[TMP10:%.*]] = call ptr @llvm.stacksave.p0()3055// CHECK1-NEXT: store ptr [[TMP10]], ptr [[SAVED_STACK]], align 83056// CHECK1-NEXT: [[VLA:%.*]] = alloca [[STRUCT_S]], i64 [[TMP8]], align 163057// CHECK1-NEXT: store i64 [[TMP8]], ptr [[__VLA_EXPR0]], align 83058// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr [[STRUCT_S]], ptr [[VLA]], i64 [[TMP8]]3059// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[VLA]], [[TMP11]]3060// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]3061// CHECK1: omp.arrayinit.body:3062// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[VLA]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]3063// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])3064// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 13065// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP11]]3066// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]3067// CHECK1: omp.arrayinit.done:3068// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP1]], align 83069// CHECK1-NEXT: [[TMP13:%.*]] = ptrtoint ptr [[TMP12]] to i643070// CHECK1-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i643071// CHECK1-NEXT: [[TMP15:%.*]] = sub i64 [[TMP13]], [[TMP14]]3072// CHECK1-NEXT: [[TMP16:%.*]] = sdiv exact i64 [[TMP15]], ptrtoint (ptr getelementptr ([[STRUCT_S]], ptr null, i32 1) to i64)3073// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr [[STRUCT_S]], ptr [[VLA]], i64 [[TMP16]]3074// CHECK1-NEXT: store ptr [[TMP17]], ptr [[_TMP4]], align 83075// CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83076// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP18]], align 43077// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP19]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3078// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43079// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP20]], 93080// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3081// CHECK1: cond.true:3082// CHECK1-NEXT: br label [[COND_END:%.*]]3083// CHECK1: cond.false:3084// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43085// CHECK1-NEXT: br label [[COND_END]]3086// CHECK1: cond.end:3087// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP21]], [[COND_FALSE]] ]3088// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43089// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43090// CHECK1-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 43091// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3092// CHECK1: omp.inner.for.cond:3093// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43094// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43095// CHECK1-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP23]], [[TMP24]]3096// CHECK1-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]3097// CHECK1: omp.inner.for.cond.cleanup:3098// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]3099// CHECK1: omp.inner.for.body:3100// CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43101// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP25]], 13102// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3103// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 43104// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3105// CHECK1: omp.body.continue:3106// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3107// CHECK1: omp.inner.for.inc:3108// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43109// CHECK1-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP26]], 13110// CHECK1-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 43111// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]3112// CHECK1: omp.inner.for.end:3113// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3114// CHECK1: omp.loop.exit:3115// CHECK1-NEXT: [[TMP27:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83116// CHECK1-NEXT: [[TMP28:%.*]] = load i32, ptr [[TMP27]], align 43117// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP28]])3118// CHECK1-NEXT: [[TMP29:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 03119// CHECK1-NEXT: store ptr [[VLA]], ptr [[TMP29]], align 83120// CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 13121// CHECK1-NEXT: [[TMP31:%.*]] = inttoptr i64 [[TMP8]] to ptr3122// CHECK1-NEXT: store ptr [[TMP31]], ptr [[TMP30]], align 83123// CHECK1-NEXT: [[TMP32:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83124// CHECK1-NEXT: [[TMP33:%.*]] = load i32, ptr [[TMP32]], align 43125// CHECK1-NEXT: [[TMP34:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP33]], i32 1, i64 16, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.11.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)3126// CHECK1-NEXT: switch i32 [[TMP34]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [3127// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]3128// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]3129// CHECK1-NEXT: ]3130// CHECK1: .omp.reduction.case1:3131// CHECK1-NEXT: [[TMP35:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 [[TMP8]]3132// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP35]]3133// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE10:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]3134// CHECK1: omp.arraycpy.body:3135// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VLA]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3136// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST7:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT8:%.*]], [[OMP_ARRAYCPY_BODY]] ]3137// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST7]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])3138// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST7]], ptr align 4 [[CALL]], i64 4, i1 false)3139// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT8]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST7]], i32 13140// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 13141// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE9:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT8]], [[TMP35]]3142// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE9]], label [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_BODY]]3143// CHECK1: omp.arraycpy.done10:3144// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP33]], ptr @.gomp_critical_user_.reduction.var)3145// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3146// CHECK1: .omp.reduction.case2:3147// CHECK1-NEXT: [[TMP36:%.*]] = getelementptr [[STRUCT_S]], ptr [[ARRAYIDX]], i64 [[TMP8]]3148// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY11:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP36]]3149// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY11]], label [[OMP_ARRAYCPY_DONE19:%.*]], label [[OMP_ARRAYCPY_BODY12:%.*]]3150// CHECK1: omp.arraycpy.body12:3151// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST13:%.*]] = phi ptr [ [[VLA]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT17:%.*]], [[OMP_ARRAYCPY_BODY12]] ]3152// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST14:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT16:%.*]], [[OMP_ARRAYCPY_BODY12]] ]3153// CHECK1-NEXT: [[TMP37:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83154// CHECK1-NEXT: [[TMP38:%.*]] = load i32, ptr [[TMP37]], align 43155// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP38]], ptr @.gomp_critical_user_.atomic_reduction.var)3156// CHECK1-NEXT: [[CALL15:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST14]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST13]])3157// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST14]], ptr align 4 [[CALL15]], i64 4, i1 false)3158// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP38]], ptr @.gomp_critical_user_.atomic_reduction.var)3159// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT16]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], i32 13160// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT17]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST13]], i32 13161// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE18:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT16]], [[TMP36]]3162// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE18]], label [[OMP_ARRAYCPY_DONE19]], label [[OMP_ARRAYCPY_BODY12]]3163// CHECK1: omp.arraycpy.done19:3164// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP33]], ptr @.gomp_critical_user_.reduction.var)3165// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3166// CHECK1: .omp.reduction.default:3167// CHECK1-NEXT: [[TMP39:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[VLA]], i64 [[TMP8]]3168// CHECK1-NEXT: [[ARRAYDESTROY_ISEMPTY:%.*]] = icmp eq ptr [[VLA]], [[TMP39]]3169// CHECK1-NEXT: br i1 [[ARRAYDESTROY_ISEMPTY]], label [[ARRAYDESTROY_DONE20:%.*]], label [[ARRAYDESTROY_BODY:%.*]]3170// CHECK1: arraydestroy.body:3171// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP39]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]3172// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -13173// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]3174// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[VLA]]3175// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE20]], label [[ARRAYDESTROY_BODY]]3176// CHECK1: arraydestroy.done20:3177// CHECK1-NEXT: [[TMP40:%.*]] = load ptr, ptr [[SAVED_STACK]], align 83178// CHECK1-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP40]])3179// CHECK1-NEXT: [[TMP41:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83180// CHECK1-NEXT: [[TMP42:%.*]] = load i32, ptr [[TMP41]], align 43181// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP42]])3182// CHECK1-NEXT: ret void3183//3184//3185// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.11.omp.reduction.reduction_func3186// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {3187// CHECK1-NEXT: entry:3188// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83189// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83190// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83191// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83192// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 83193// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 83194// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 03195// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 83196// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 03197// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 83198// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 13199// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 83200// CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP9]] to i643201// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP7]], i64 [[TMP10]]3202// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP11]]3203// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]3204// CHECK1: omp.arraycpy.body:3205// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3206// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3207// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])3208// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[CALL]], i64 4, i1 false)3209// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 13210// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 13211// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP11]]3212// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]3213// CHECK1: omp.arraycpy.done2:3214// CHECK1-NEXT: ret void3215//3216//3217// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.123218// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(16) [[VAR3:%.*]]) #[[ATTR4]] {3219// CHECK1-NEXT: entry:3220// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83221// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83222// CHECK1-NEXT: [[VAR3_ADDR:%.*]] = alloca ptr, align 83223// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 83224// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83225// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43226// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 43227// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43228// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43229// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43230// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43231// CHECK1-NEXT: [[VAR33:%.*]] = alloca [4 x %struct.S], align 163232// CHECK1-NEXT: [[_TMP4:%.*]] = alloca ptr, align 83233// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 43234// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 83235// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83236// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83237// CHECK1-NEXT: store ptr [[VAR3]], ptr [[VAR3_ADDR]], align 83238// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR3_ADDR]], align 83239// CHECK1-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 83240// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 83241// CHECK1-NEXT: store ptr [[TMP1]], ptr [[_TMP1]], align 83242// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43243// CHECK1-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 43244// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43245// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43246// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[_TMP1]], align 83247// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [4 x %struct.S], ptr [[VAR33]], i32 0, i32 03248// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[ARRAY_BEGIN]], i64 43249// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP3]]3250// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]3251// CHECK1: omp.arrayinit.body:3252// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]3253// CHECK1-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])3254// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 13255// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP3]]3256// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]3257// CHECK1: omp.arrayinit.done:3258// CHECK1-NEXT: store ptr [[VAR33]], ptr [[_TMP4]], align 83259// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83260// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 43261// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3262// CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43263// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP6]], 93264// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3265// CHECK1: cond.true:3266// CHECK1-NEXT: br label [[COND_END:%.*]]3267// CHECK1: cond.false:3268// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43269// CHECK1-NEXT: br label [[COND_END]]3270// CHECK1: cond.end:3271// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]3272// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43273// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43274// CHECK1-NEXT: store i32 [[TMP8]], ptr [[DOTOMP_IV]], align 43275// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3276// CHECK1: omp.inner.for.cond:3277// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43278// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43279// CHECK1-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]3280// CHECK1-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]3281// CHECK1: omp.inner.for.cond.cleanup:3282// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]3283// CHECK1: omp.inner.for.body:3284// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43285// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP11]], 13286// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3287// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 43288// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3289// CHECK1: omp.body.continue:3290// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3291// CHECK1: omp.inner.for.inc:3292// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43293// CHECK1-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP12]], 13294// CHECK1-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 43295// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]3296// CHECK1: omp.inner.for.end:3297// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3298// CHECK1: omp.loop.exit:3299// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83300// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 43301// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP14]])3302// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 03303// CHECK1-NEXT: store ptr [[VAR33]], ptr [[TMP15]], align 83304// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83305// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 43306// CHECK1-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP17]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.12.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)3307// CHECK1-NEXT: switch i32 [[TMP18]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [3308// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]3309// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]3310// CHECK1-NEXT: ]3311// CHECK1: .omp.reduction.case1:3312// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr [[STRUCT_S]], ptr [[TMP2]], i64 43313// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP2]], [[TMP19]]3314// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE10:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]3315// CHECK1: omp.arraycpy.body:3316// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[VAR33]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3317// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST7:%.*]] = phi ptr [ [[TMP2]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT8:%.*]], [[OMP_ARRAYCPY_BODY]] ]3318// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST7]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])3319// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST7]], ptr align 4 [[CALL]], i64 4, i1 false)3320// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT8]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST7]], i32 13321// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 13322// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE9:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT8]], [[TMP19]]3323// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE9]], label [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_BODY]]3324// CHECK1: omp.arraycpy.done10:3325// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP17]], ptr @.gomp_critical_user_.reduction.var)3326// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3327// CHECK1: .omp.reduction.case2:3328// CHECK1-NEXT: [[TMP20:%.*]] = getelementptr [[STRUCT_S]], ptr [[TMP2]], i64 43329// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY11:%.*]] = icmp eq ptr [[TMP2]], [[TMP20]]3330// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY11]], label [[OMP_ARRAYCPY_DONE19:%.*]], label [[OMP_ARRAYCPY_BODY12:%.*]]3331// CHECK1: omp.arraycpy.body12:3332// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST13:%.*]] = phi ptr [ [[VAR33]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT17:%.*]], [[OMP_ARRAYCPY_BODY12]] ]3333// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST14:%.*]] = phi ptr [ [[TMP2]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT16:%.*]], [[OMP_ARRAYCPY_BODY12]] ]3334// CHECK1-NEXT: [[TMP21:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83335// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[TMP21]], align 43336// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP22]], ptr @.gomp_critical_user_.atomic_reduction.var)3337// CHECK1-NEXT: [[CALL15:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST14]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST13]])3338// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST14]], ptr align 4 [[CALL15]], i64 4, i1 false)3339// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP22]], ptr @.gomp_critical_user_.atomic_reduction.var)3340// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT16]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], i32 13341// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT17]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST13]], i32 13342// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE18:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT16]], [[TMP20]]3343// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE18]], label [[OMP_ARRAYCPY_DONE19]], label [[OMP_ARRAYCPY_BODY12]]3344// CHECK1: omp.arraycpy.done19:3345// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP17]], ptr @.gomp_critical_user_.reduction.var)3346// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3347// CHECK1: .omp.reduction.default:3348// CHECK1-NEXT: [[ARRAY_BEGIN20:%.*]] = getelementptr inbounds [4 x %struct.S], ptr [[VAR33]], i32 0, i32 03349// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN20]], i64 43350// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]3351// CHECK1: arraydestroy.body:3352// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP23]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]3353// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -13354// CHECK1-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]3355// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN20]]3356// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE21:%.*]], label [[ARRAYDESTROY_BODY]]3357// CHECK1: arraydestroy.done21:3358// CHECK1-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83359// CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 43360// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP25]])3361// CHECK1-NEXT: ret void3362//3363//3364// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.12.omp.reduction.reduction_func3365// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {3366// CHECK1-NEXT: entry:3367// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83368// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83369// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83370// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83371// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 83372// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 83373// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 03374// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 83375// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 03376// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 83377// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S:%.*]], ptr [[TMP7]], i64 43378// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]3379// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]3380// CHECK1: omp.arraycpy.body:3381// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3382// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]3383// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIfEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])3384// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[CALL]], i64 4, i1 false)3385// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 13386// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 13387// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]3388// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]3389// CHECK1: omp.arraycpy.done2:3390// CHECK1-NEXT: ret void3391//3392//3393// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v3394// CHECK1-SAME: () #[[ATTR1]] {3395// CHECK1-NEXT: entry:3396// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 43397// CHECK1-NEXT: [[T:%.*]] = alloca i32, align 43398// CHECK1-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S_0:%.*]], align 43399// CHECK1-NEXT: [[T_VAR:%.*]] = alloca i32, align 43400// CHECK1-NEXT: [[T_VAR1:%.*]] = alloca i32, align 43401// CHECK1-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 43402// CHECK1-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 43403// CHECK1-NEXT: [[VAR:%.*]] = alloca ptr, align 83404// CHECK1-NEXT: [[VAR1:%.*]] = alloca [[STRUCT_S_0]], align 43405// CHECK1-NEXT: [[ARR:%.*]] = alloca [42 x %struct.S.0], align 163406// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])3407// CHECK1-NEXT: store i32 0, ptr [[T_VAR]], align 43408// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const._Z5tmainIiLi42EET_v.vec, i64 8, i1 false)3409// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], i32 noundef 1)3410// CHECK1-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 13411// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], i32 noundef 2)3412// CHECK1-NEXT: store ptr [[TEST]], ptr [[VAR]], align 83413// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR1]])3414// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [42 x %struct.S.0], ptr [[ARR]], i32 0, i32 03415// CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 423416// CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]3417// CHECK1: arrayctor.loop:3418// CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]3419// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])3420// CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i64 13421// CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]3422// CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]3423// CHECK1: arrayctor.cont:3424// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 83425// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 6, ptr @_Z5tmainIiLi42EET_v.omp_outlined, ptr [[T_VAR]], ptr [[TMP0]], ptr [[VAR1]], ptr [[T_VAR1]], ptr [[VEC]], ptr [[S_ARR]])3426// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VAR]], align 83427// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 4, ptr @_Z5tmainIiLi42EET_v.omp_outlined.13, ptr [[T_VAR]], ptr [[VEC]], ptr [[S_ARR]], ptr [[TMP1]])3428// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR]], align 83429// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 5, ptr @_Z5tmainIiLi42EET_v.omp_outlined.14, ptr [[ARR]], ptr [[VEC]], ptr [[T_VAR]], ptr [[S_ARR]], ptr [[TMP2]])3430// CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 43431// CHECK1-NEXT: [[ARRAY_BEGIN1:%.*]] = getelementptr inbounds [42 x %struct.S.0], ptr [[ARR]], i32 0, i32 03432// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN1]], i64 423433// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]3434// CHECK1: arraydestroy.body:3435// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP3]], [[ARRAYCTOR_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]3436// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -13437// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]3438// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN1]]3439// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]3440// CHECK1: arraydestroy.done2:3441// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR1]]) #[[ATTR5]]3442// CHECK1-NEXT: [[ARRAY_BEGIN3:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 03443// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN3]], i64 23444// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY4:%.*]]3445// CHECK1: arraydestroy.body4:3446// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST5:%.*]] = phi ptr [ [[TMP4]], [[ARRAYDESTROY_DONE2]] ], [ [[ARRAYDESTROY_ELEMENT6:%.*]], [[ARRAYDESTROY_BODY4]] ]3447// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT6]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST5]], i64 -13448// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT6]]) #[[ATTR5]]3449// CHECK1-NEXT: [[ARRAYDESTROY_DONE7:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT6]], [[ARRAY_BEGIN3]]3450// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE7]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY4]]3451// CHECK1: arraydestroy.done8:3452// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR5]]3453// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[RETVAL]], align 43454// CHECK1-NEXT: ret i32 [[TMP5]]3455//3456//3457// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev3458// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {3459// CHECK1-NEXT: entry:3460// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83461// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83462// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83463// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 03464// CHECK1-NEXT: [[TMP0:%.*]] = load volatile double, ptr @g, align 83465// CHECK1-NEXT: [[CONV:%.*]] = fptrunc double [[TMP0]] to float3466// CHECK1-NEXT: store float [[CONV]], ptr [[F]], align 43467// CHECK1-NEXT: ret void3468//3469//3470// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef3471// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {3472// CHECK1-NEXT: entry:3473// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83474// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca float, align 43475// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83476// CHECK1-NEXT: store float [[A]], ptr [[A_ADDR]], align 43477// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83478// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 03479// CHECK1-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 43480// CHECK1-NEXT: [[CONV:%.*]] = fpext float [[TMP0]] to double3481// CHECK1-NEXT: [[TMP1:%.*]] = load volatile double, ptr @g, align 83482// CHECK1-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP1]]3483// CHECK1-NEXT: [[CONV2:%.*]] = fptrunc double [[ADD]] to float3484// CHECK1-NEXT: store float [[CONV2]], ptr [[F]], align 43485// CHECK1-NEXT: ret void3486//3487//3488// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev3489// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {3490// CHECK1-NEXT: entry:3491// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83492// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83493// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83494// CHECK1-NEXT: ret void3495//3496//3497// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ev3498// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {3499// CHECK1-NEXT: entry:3500// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83501// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83502// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83503// CHECK1-NEXT: call void @_ZN1SIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])3504// CHECK1-NEXT: ret void3505//3506//3507// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ei3508// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {3509// CHECK1-NEXT: entry:3510// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83511// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i32, align 43512// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83513// CHECK1-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 43514// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83515// CHECK1-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 43516// CHECK1-NEXT: call void @_ZN1SIiEC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]])3517// CHECK1-NEXT: ret void3518//3519//3520// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined3521// 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(4) [[VAR:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[T_VAR1:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[VEC:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[S_ARR:%.*]]) #[[ATTR4]] {3522// CHECK1-NEXT: entry:3523// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83524// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83525// CHECK1-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 83526// CHECK1-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 83527// CHECK1-NEXT: [[VAR1_ADDR:%.*]] = alloca ptr, align 83528// CHECK1-NEXT: [[T_VAR1_ADDR:%.*]] = alloca ptr, align 83529// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 83530// CHECK1-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 83531// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 83532// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83533// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43534// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 43535// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43536// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43537// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43538// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43539// CHECK1-NEXT: [[T_VAR3:%.*]] = alloca i32, align 43540// CHECK1-NEXT: [[VAR4:%.*]] = alloca [[STRUCT_S_0:%.*]], align 43541// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 83542// CHECK1-NEXT: [[VAR16:%.*]] = alloca [[STRUCT_S_0]], align 43543// CHECK1-NEXT: [[T_VAR17:%.*]] = alloca i32, align 43544// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 43545// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [4 x ptr], align 83546// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_S_0]], align 43547// CHECK1-NEXT: [[REF_TMP22:%.*]] = alloca [[STRUCT_S_0]], align 43548// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83549// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83550// CHECK1-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 83551// CHECK1-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 83552// CHECK1-NEXT: store ptr [[VAR1]], ptr [[VAR1_ADDR]], align 83553// CHECK1-NEXT: store ptr [[T_VAR1]], ptr [[T_VAR1_ADDR]], align 83554// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 83555// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 83556// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 83557// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VAR_ADDR]], align 83558// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR1_ADDR]], align 83559// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[T_VAR1_ADDR]], align 83560// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[VEC_ADDR]], align 83561// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 83562// CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 83563// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 83564// CHECK1-NEXT: store ptr [[TMP6]], ptr [[_TMP1]], align 83565// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43566// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 43567// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43568// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43569// CHECK1-NEXT: store i32 0, ptr [[T_VAR3]], align 43570// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[_TMP1]], align 83571// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR4]])3572// CHECK1-NEXT: store ptr [[VAR4]], ptr [[_TMP5]], align 83573// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR16]])3574// CHECK1-NEXT: store i32 2147483647, ptr [[T_VAR17]], align 43575// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83576// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 43577// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP9]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3578// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43579// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP10]], 13580// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3581// CHECK1: cond.true:3582// CHECK1-NEXT: br label [[COND_END:%.*]]3583// CHECK1: cond.false:3584// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43585// CHECK1-NEXT: br label [[COND_END]]3586// CHECK1: cond.end:3587// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]3588// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43589// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43590// CHECK1-NEXT: store i32 [[TMP12]], ptr [[DOTOMP_IV]], align 43591// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3592// CHECK1: omp.inner.for.cond:3593// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43594// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43595// CHECK1-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]3596// CHECK1-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]3597// CHECK1: omp.inner.for.cond.cleanup:3598// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]3599// CHECK1: omp.inner.for.body:3600// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43601// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 13602// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3603// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 43604// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[T_VAR3]], align 43605// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 43606// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP17]] to i643607// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP4]], i64 0, i64 [[IDXPROM]]3608// CHECK1-NEXT: store i32 [[TMP16]], ptr [[ARRAYIDX]], align 43609// CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[_TMP5]], align 83610// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[I]], align 43611// CHECK1-NEXT: [[IDXPROM9:%.*]] = sext i32 [[TMP19]] to i643612// CHECK1-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[TMP5]], i64 0, i64 [[IDXPROM9]]3613// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX10]], ptr align 4 [[TMP18]], i64 4, i1 false)3614// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3615// CHECK1: omp.body.continue:3616// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3617// CHECK1: omp.inner.for.inc:3618// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43619// CHECK1-NEXT: [[ADD11:%.*]] = add nsw i32 [[TMP20]], 13620// CHECK1-NEXT: store i32 [[ADD11]], ptr [[DOTOMP_IV]], align 43621// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]3622// CHECK1: omp.inner.for.end:3623// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3624// CHECK1: omp.loop.exit:3625// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP9]])3626// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 03627// CHECK1-NEXT: store ptr [[T_VAR3]], ptr [[TMP21]], align 83628// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 13629// CHECK1-NEXT: store ptr [[VAR4]], ptr [[TMP22]], align 83630// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 23631// CHECK1-NEXT: store ptr [[VAR16]], ptr [[TMP23]], align 83632// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 33633// CHECK1-NEXT: store ptr [[T_VAR17]], ptr [[TMP24]], align 83634// CHECK1-NEXT: [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], 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)3635// CHECK1-NEXT: switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [3636// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]3637// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]3638// CHECK1-NEXT: ]3639// CHECK1: .omp.reduction.case1:3640// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP0]], align 43641// CHECK1-NEXT: [[TMP27:%.*]] = load i32, ptr [[T_VAR3]], align 43642// CHECK1-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP26]], [[TMP27]]3643// CHECK1-NEXT: store i32 [[ADD12]], ptr [[TMP0]], align 43644// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIiEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP7]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR4]])3645// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP7]], ptr align 4 [[CALL]], i64 4, i1 false)3646// CHECK1-NEXT: [[CALL13:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[TMP2]])3647// CHECK1-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[CALL13]], 03648// CHECK1-NEXT: br i1 [[TOBOOL]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]3649// CHECK1: land.rhs:3650// CHECK1-NEXT: [[CALL14:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[VAR16]])3651// CHECK1-NEXT: [[TOBOOL15:%.*]] = icmp ne i32 [[CALL14]], 03652// CHECK1-NEXT: br label [[LAND_END]]3653// CHECK1: land.end:3654// CHECK1-NEXT: [[TMP28:%.*]] = phi i1 [ false, [[DOTOMP_REDUCTION_CASE1]] ], [ [[TOBOOL15]], [[LAND_RHS]] ]3655// CHECK1-NEXT: [[CONV:%.*]] = zext i1 [[TMP28]] to i323656// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]], i32 noundef [[CONV]])3657// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP2]], ptr align 4 [[REF_TMP]], i64 4, i1 false)3658// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]]) #[[ATTR5]]3659// CHECK1-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP3]], align 43660// CHECK1-NEXT: [[TMP30:%.*]] = load i32, ptr [[T_VAR17]], align 43661// CHECK1-NEXT: [[CMP16:%.*]] = icmp slt i32 [[TMP29]], [[TMP30]]3662// CHECK1-NEXT: br i1 [[CMP16]], label [[COND_TRUE17:%.*]], label [[COND_FALSE18:%.*]]3663// CHECK1: cond.true17:3664// CHECK1-NEXT: [[TMP31:%.*]] = load i32, ptr [[TMP3]], align 43665// CHECK1-NEXT: br label [[COND_END19:%.*]]3666// CHECK1: cond.false18:3667// CHECK1-NEXT: [[TMP32:%.*]] = load i32, ptr [[T_VAR17]], align 43668// CHECK1-NEXT: br label [[COND_END19]]3669// CHECK1: cond.end19:3670// CHECK1-NEXT: [[COND20:%.*]] = phi i32 [ [[TMP31]], [[COND_TRUE17]] ], [ [[TMP32]], [[COND_FALSE18]] ]3671// CHECK1-NEXT: store i32 [[COND20]], ptr [[TMP3]], align 43672// CHECK1-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP9]], ptr @.gomp_critical_user_.reduction.var)3673// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3674// CHECK1: .omp.reduction.case2:3675// CHECK1-NEXT: [[TMP33:%.*]] = load i32, ptr [[T_VAR3]], align 43676// CHECK1-NEXT: [[TMP34:%.*]] = atomicrmw add ptr [[TMP0]], i32 [[TMP33]] monotonic, align 43677// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)3678// CHECK1-NEXT: [[CALL21:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIiEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP7]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR4]])3679// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP7]], ptr align 4 [[CALL21]], i64 4, i1 false)3680// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)3681// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)3682// CHECK1-NEXT: [[CALL23:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[TMP2]])3683// CHECK1-NEXT: [[TOBOOL24:%.*]] = icmp ne i32 [[CALL23]], 03684// CHECK1-NEXT: br i1 [[TOBOOL24]], label [[LAND_RHS25:%.*]], label [[LAND_END28:%.*]]3685// CHECK1: land.rhs25:3686// CHECK1-NEXT: [[CALL26:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[VAR16]])3687// CHECK1-NEXT: [[TOBOOL27:%.*]] = icmp ne i32 [[CALL26]], 03688// CHECK1-NEXT: br label [[LAND_END28]]3689// CHECK1: land.end28:3690// CHECK1-NEXT: [[TMP35:%.*]] = phi i1 [ false, [[DOTOMP_REDUCTION_CASE2]] ], [ [[TOBOOL27]], [[LAND_RHS25]] ]3691// CHECK1-NEXT: [[CONV29:%.*]] = zext i1 [[TMP35]] to i323692// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP22]], i32 noundef [[CONV29]])3693// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP2]], ptr align 4 [[REF_TMP22]], i64 4, i1 false)3694// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP22]]) #[[ATTR5]]3695// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP9]], ptr @.gomp_critical_user_.atomic_reduction.var)3696// CHECK1-NEXT: [[TMP36:%.*]] = load i32, ptr [[T_VAR17]], align 43697// CHECK1-NEXT: [[TMP37:%.*]] = atomicrmw min ptr [[TMP3]], i32 [[TMP36]] monotonic, align 43698// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3699// CHECK1: .omp.reduction.default:3700// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR16]]) #[[ATTR5]]3701// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR4]]) #[[ATTR5]]3702// CHECK1-NEXT: ret void3703//3704//3705// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.omp.reduction.reduction_func3706// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {3707// CHECK1-NEXT: entry:3708// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83709// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83710// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_S_0:%.*]], align 43711// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83712// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83713// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 83714// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 83715// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 03716// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 83717// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 03718// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 83719// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 13720// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 83721// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 13722// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 83723// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 23724// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[TMP12]], align 83725// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 23726// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP14]], align 83727// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP3]], i64 0, i64 33728// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 83729// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[TMP2]], i64 0, i64 33730// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 83731// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP7]], align 43732// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP5]], align 43733// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]3734// CHECK1-NEXT: store i32 [[ADD]], ptr [[TMP7]], align 43735// CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN1SIiEanERKS0_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP11]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP9]])3736// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP11]], ptr align 4 [[CALL]], i64 4, i1 false)3737// CHECK1-NEXT: [[CALL2:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[TMP15]])3738// CHECK1-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[CALL2]], 03739// CHECK1-NEXT: br i1 [[TOBOOL]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]3740// CHECK1: land.rhs:3741// CHECK1-NEXT: [[CALL3:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[TMP13]])3742// CHECK1-NEXT: [[TOBOOL4:%.*]] = icmp ne i32 [[CALL3]], 03743// CHECK1-NEXT: br label [[LAND_END]]3744// CHECK1: land.end:3745// CHECK1-NEXT: [[TMP22:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[TOBOOL4]], [[LAND_RHS]] ]3746// CHECK1-NEXT: [[CONV:%.*]] = zext i1 [[TMP22]] to i323747// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]], i32 noundef [[CONV]])3748// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP15]], ptr align 4 [[REF_TMP]], i64 4, i1 false)3749// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]]) #[[ATTR5]]3750// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP19]], align 43751// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP17]], align 43752// CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP23]], [[TMP24]]3753// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3754// CHECK1: cond.true:3755// CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP19]], align 43756// CHECK1-NEXT: br label [[COND_END:%.*]]3757// CHECK1: cond.false:3758// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP17]], align 43759// CHECK1-NEXT: br label [[COND_END]]3760// CHECK1: cond.end:3761// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ [[TMP25]], [[COND_TRUE]] ], [ [[TMP26]], [[COND_FALSE]] ]3762// CHECK1-NEXT: store i32 [[COND]], ptr [[TMP19]], align 43763// CHECK1-NEXT: ret void3764//3765//3766// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEanERKS0_3767// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR1]] align 2 {3768// CHECK1-NEXT: entry:3769// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83770// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83771// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83772// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83773// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83774// CHECK1-NEXT: ret ptr [[THIS1]]3775//3776//3777// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEcviEv3778// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) #[[ATTR1]] align 2 {3779// CHECK1-NEXT: entry:3780// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83781// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83782// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83783// CHECK1-NEXT: ret i32 03784//3785//3786// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiED1Ev3787// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {3788// CHECK1-NEXT: entry:3789// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 83790// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 83791// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 83792// CHECK1-NEXT: call void @_ZN1SIiED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR5]]3793// CHECK1-NEXT: ret void3794//3795//3796// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.133797// 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(8) [[S_ARR:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR:%.*]]) #[[ATTR4]] {3798// CHECK1-NEXT: entry:3799// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83800// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83801// CHECK1-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 83802// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 83803// CHECK1-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 83804// CHECK1-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 83805// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 83806// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83807// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43808// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 43809// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43810// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43811// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43812// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43813// CHECK1-NEXT: [[T_VAR3:%.*]] = alloca i32, align 43814// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 43815// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 83816// CHECK1-NEXT: [[ATOMIC_TEMP:%.*]] = alloca i32, align 43817// CHECK1-NEXT: [[_TMP10:%.*]] = alloca i32, align 43818// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83819// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83820// CHECK1-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 83821// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 83822// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 83823// CHECK1-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 83824// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 83825// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VEC_ADDR]], align 83826// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 83827// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 83828// CHECK1-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 83829// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 83830// CHECK1-NEXT: store ptr [[TMP4]], ptr [[_TMP1]], align 83831// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43832// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 43833// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43834// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43835// CHECK1-NEXT: store i32 1, ptr [[T_VAR3]], align 43836// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83837// CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 43838// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP6]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3839// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43840// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP7]], 13841// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3842// CHECK1: cond.true:3843// CHECK1-NEXT: br label [[COND_END:%.*]]3844// CHECK1: cond.false:3845// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43846// CHECK1-NEXT: br label [[COND_END]]3847// CHECK1: cond.end:3848// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]3849// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43850// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43851// CHECK1-NEXT: store i32 [[TMP9]], ptr [[DOTOMP_IV]], align 43852// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3853// CHECK1: omp.inner.for.cond:3854// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43855// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43856// CHECK1-NEXT: [[CMP4:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]3857// CHECK1-NEXT: br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3858// CHECK1: omp.inner.for.body:3859// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43860// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP12]], 13861// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3862// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 43863// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[T_VAR3]], align 43864// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[I]], align 43865// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i643866// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP1]], i64 0, i64 [[IDXPROM]]3867// CHECK1-NEXT: store i32 [[TMP13]], ptr [[ARRAYIDX]], align 43868// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[_TMP1]], align 83869// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[I]], align 43870// CHECK1-NEXT: [[IDXPROM5:%.*]] = sext i32 [[TMP16]] to i643871// CHECK1-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[TMP2]], i64 0, i64 [[IDXPROM5]]3872// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX6]], ptr align 4 [[TMP15]], i64 4, i1 false)3873// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3874// CHECK1: omp.body.continue:3875// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3876// CHECK1: omp.inner.for.inc:3877// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43878// CHECK1-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP17]], 13879// CHECK1-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 43880// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]3881// CHECK1: omp.inner.for.end:3882// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3883// CHECK1: omp.loop.exit:3884// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP6]])3885// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 03886// CHECK1-NEXT: store ptr [[T_VAR3]], ptr [[TMP18]], align 83887// CHECK1-NEXT: [[TMP19:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP6]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z5tmainIiLi42EET_v.omp_outlined.13.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)3888// CHECK1-NEXT: switch i32 [[TMP19]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [3889// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]3890// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]3891// CHECK1-NEXT: ]3892// CHECK1: .omp.reduction.case1:3893// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP0]], align 43894// CHECK1-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP20]], 03895// CHECK1-NEXT: br i1 [[TOBOOL]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]3896// CHECK1: land.rhs:3897// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[T_VAR3]], align 43898// CHECK1-NEXT: [[TOBOOL8:%.*]] = icmp ne i32 [[TMP21]], 03899// CHECK1-NEXT: br label [[LAND_END]]3900// CHECK1: land.end:3901// CHECK1-NEXT: [[TMP22:%.*]] = phi i1 [ false, [[DOTOMP_REDUCTION_CASE1]] ], [ [[TOBOOL8]], [[LAND_RHS]] ]3902// CHECK1-NEXT: [[CONV:%.*]] = zext i1 [[TMP22]] to i323903// CHECK1-NEXT: store i32 [[CONV]], ptr [[TMP0]], align 43904// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP6]], ptr @.gomp_critical_user_.reduction.var)3905// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3906// CHECK1: .omp.reduction.case2:3907// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[T_VAR3]], align 43908// CHECK1-NEXT: [[TOBOOL9:%.*]] = icmp ne i32 [[TMP23]], 03909// CHECK1-NEXT: [[ATOMIC_LOAD:%.*]] = load atomic i32, ptr [[TMP0]] monotonic, align 43910// CHECK1-NEXT: br label [[ATOMIC_CONT:%.*]]3911// CHECK1: atomic_cont:3912// CHECK1-NEXT: [[TMP24:%.*]] = phi i32 [ [[ATOMIC_LOAD]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[TMP30:%.*]], [[LAND_END14:%.*]] ]3913// CHECK1-NEXT: store i32 [[TMP24]], ptr [[_TMP10]], align 43914// CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[_TMP10]], align 43915// CHECK1-NEXT: [[TOBOOL11:%.*]] = icmp ne i32 [[TMP25]], 03916// CHECK1-NEXT: br i1 [[TOBOOL11]], label [[LAND_RHS12:%.*]], label [[LAND_END14]]3917// CHECK1: land.rhs12:3918// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[T_VAR3]], align 43919// CHECK1-NEXT: [[TOBOOL13:%.*]] = icmp ne i32 [[TMP26]], 03920// CHECK1-NEXT: br label [[LAND_END14]]3921// CHECK1: land.end14:3922// CHECK1-NEXT: [[TMP27:%.*]] = phi i1 [ false, [[ATOMIC_CONT]] ], [ [[TOBOOL13]], [[LAND_RHS12]] ]3923// CHECK1-NEXT: [[CONV15:%.*]] = zext i1 [[TMP27]] to i323924// CHECK1-NEXT: store i32 [[CONV15]], ptr [[ATOMIC_TEMP]], align 43925// CHECK1-NEXT: [[TMP28:%.*]] = load i32, ptr [[ATOMIC_TEMP]], align 43926// CHECK1-NEXT: [[TMP29:%.*]] = cmpxchg ptr [[TMP0]], i32 [[TMP24]], i32 [[TMP28]] monotonic monotonic, align 43927// CHECK1-NEXT: [[TMP30]] = extractvalue { i32, i1 } [[TMP29]], 03928// CHECK1-NEXT: [[TMP31:%.*]] = extractvalue { i32, i1 } [[TMP29]], 13929// CHECK1-NEXT: br i1 [[TMP31]], label [[ATOMIC_EXIT:%.*]], label [[ATOMIC_CONT]]3930// CHECK1: atomic_exit:3931// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP6]], ptr @.gomp_critical_user_.reduction.var)3932// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]3933// CHECK1: .omp.reduction.default:3934// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP6]])3935// CHECK1-NEXT: ret void3936//3937//3938// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.13.omp.reduction.reduction_func3939// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {3940// CHECK1-NEXT: entry:3941// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 83942// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 83943// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 83944// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 83945// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 83946// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 83947// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 03948// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 83949// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 03950// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 83951// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 43952// CHECK1-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP8]], 03953// CHECK1-NEXT: br i1 [[TOBOOL]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]3954// CHECK1: land.rhs:3955// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 43956// CHECK1-NEXT: [[TOBOOL2:%.*]] = icmp ne i32 [[TMP9]], 03957// CHECK1-NEXT: br label [[LAND_END]]3958// CHECK1: land.end:3959// CHECK1-NEXT: [[TMP10:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[TOBOOL2]], [[LAND_RHS]] ]3960// CHECK1-NEXT: [[CONV:%.*]] = zext i1 [[TMP10]] to i323961// CHECK1-NEXT: store i32 [[CONV]], ptr [[TMP7]], align 43962// CHECK1-NEXT: ret void3963//3964//3965// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.143966// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(168) [[ARR:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[VEC:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[T_VAR:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[S_ARR:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[VAR:%.*]]) #[[ATTR4]] {3967// CHECK1-NEXT: entry:3968// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83969// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83970// CHECK1-NEXT: [[ARR_ADDR:%.*]] = alloca ptr, align 83971// CHECK1-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 83972// CHECK1-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 83973// CHECK1-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 83974// CHECK1-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 83975// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 83976// CHECK1-NEXT: [[_TMP1:%.*]] = alloca ptr, align 83977// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43978// CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 43979// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43980// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43981// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43982// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43983// CHECK1-NEXT: [[ARR4:%.*]] = alloca [40 x %struct.S.0], align 163984// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 43985// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 83986// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_S_0:%.*]], align 43987// CHECK1-NEXT: [[REF_TMP20:%.*]] = alloca [[STRUCT_S_0]], align 43988// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83989// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83990// CHECK1-NEXT: store ptr [[ARR]], ptr [[ARR_ADDR]], align 83991// CHECK1-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 83992// CHECK1-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 83993// CHECK1-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 83994// CHECK1-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 83995// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[ARR_ADDR]], align 83996// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VEC_ADDR]], align 83997// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 83998// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 83999// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[VAR_ADDR]], align 84000// CHECK1-NEXT: store ptr [[TMP4]], ptr [[TMP]], align 84001// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 84002// CHECK1-NEXT: store ptr [[TMP5]], ptr [[_TMP1]], align 84003// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44004// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 44005// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44006// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44007// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [42 x %struct.S.0], ptr [[TMP0]], i64 0, i64 14008// CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds nuw [42 x %struct.S.0], ptr [[TMP0]], i64 0, i64 404009// CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [40 x %struct.S.0], ptr [[ARR4]], i32 0, i32 04010// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 404011// CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP6]]4012// CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]4013// CHECK1: omp.arrayinit.body:4014// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]4015// CHECK1-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])4016// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 14017// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP6]]4018// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]4019// CHECK1: omp.arrayinit.done:4020// CHECK1-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i644021// CHECK1-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i644022// CHECK1-NEXT: [[TMP9:%.*]] = sub i64 [[TMP7]], [[TMP8]]4023// CHECK1-NEXT: [[TMP10:%.*]] = sdiv exact i64 [[TMP9]], ptrtoint (ptr getelementptr ([[STRUCT_S_0]], ptr null, i32 1) to i64)4024// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARR4]], i64 [[TMP10]]4025// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84026// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 44027// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP13]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)4028// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44029// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP14]], 14030// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4031// CHECK1: cond.true:4032// CHECK1-NEXT: br label [[COND_END:%.*]]4033// CHECK1: cond.false:4034// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44035// CHECK1-NEXT: br label [[COND_END]]4036// CHECK1: cond.end:4037// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]4038// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 44039// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44040// CHECK1-NEXT: store i32 [[TMP16]], ptr [[DOTOMP_IV]], align 44041// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4042// CHECK1: omp.inner.for.cond:4043// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44044// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44045// CHECK1-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]]4046// CHECK1-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]4047// CHECK1: omp.inner.for.cond.cleanup:4048// CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]]4049// CHECK1: omp.inner.for.body:4050// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44051// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP19]], 14052// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4053// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 44054// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP2]], align 44055// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[I]], align 44056// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP21]] to i644057// CHECK1-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds [2 x i32], ptr [[TMP1]], i64 0, i64 [[IDXPROM]]4058// CHECK1-NEXT: store i32 [[TMP20]], ptr [[ARRAYIDX6]], align 44059// CHECK1-NEXT: [[TMP22:%.*]] = load ptr, ptr [[_TMP1]], align 84060// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[I]], align 44061// CHECK1-NEXT: [[IDXPROM7:%.*]] = sext i32 [[TMP23]] to i644062// CHECK1-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[TMP3]], i64 0, i64 [[IDXPROM7]]4063// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX8]], ptr align 4 [[TMP22]], i64 4, i1 false)4064// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4065// CHECK1: omp.body.continue:4066// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4067// CHECK1: omp.inner.for.inc:4068// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44069// CHECK1-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP24]], 14070// CHECK1-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 44071// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]4072// CHECK1: omp.inner.for.end:4073// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4074// CHECK1: omp.loop.exit:4075// CHECK1-NEXT: [[TMP25:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84076// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 44077// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP26]])4078// CHECK1-NEXT: [[TMP27:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 04079// CHECK1-NEXT: store ptr [[ARR4]], ptr [[TMP27]], align 84080// CHECK1-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84081// CHECK1-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 44082// CHECK1-NEXT: [[TMP30:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP29]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z5tmainIiLi42EET_v.omp_outlined.14.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)4083// CHECK1-NEXT: switch i32 [[TMP30]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [4084// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]4085// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]4086// CHECK1-NEXT: ]4087// CHECK1: .omp.reduction.case1:4088// CHECK1-NEXT: [[TMP31:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX]], i64 404089// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP31]]4090// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE15:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]4091// CHECK1: omp.arraycpy.body:4092// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[ARR4]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]4093// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST10:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT13:%.*]], [[OMP_ARRAYCPY_BODY]] ]4094// CHECK1-NEXT: [[CALL:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST10]])4095// CHECK1-NEXT: [[CALL11:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])4096// CHECK1-NEXT: [[ADD12:%.*]] = add nsw i32 [[CALL]], [[CALL11]]4097// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]], i32 noundef [[ADD12]])4098// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST10]], ptr align 4 [[REF_TMP]], i64 4, i1 false)4099// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]]) #[[ATTR5]]4100// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT13]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST10]], i32 14101// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 14102// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE14:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT13]], [[TMP31]]4103// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE14]], label [[OMP_ARRAYCPY_DONE15]], label [[OMP_ARRAYCPY_BODY]]4104// CHECK1: omp.arraycpy.done15:4105// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP29]], ptr @.gomp_critical_user_.reduction.var)4106// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]4107// CHECK1: .omp.reduction.case2:4108// CHECK1-NEXT: [[TMP32:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[ARRAYIDX]], i64 404109// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY16:%.*]] = icmp eq ptr [[ARRAYIDX]], [[TMP32]]4110// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY16]], label [[OMP_ARRAYCPY_DONE27:%.*]], label [[OMP_ARRAYCPY_BODY17:%.*]]4111// CHECK1: omp.arraycpy.body17:4112// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST18:%.*]] = phi ptr [ [[ARR4]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT25:%.*]], [[OMP_ARRAYCPY_BODY17]] ]4113// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST19:%.*]] = phi ptr [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT24:%.*]], [[OMP_ARRAYCPY_BODY17]] ]4114// CHECK1-NEXT: [[TMP33:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84115// CHECK1-NEXT: [[TMP34:%.*]] = load i32, ptr [[TMP33]], align 44116// CHECK1-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP34]], ptr @.gomp_critical_user_.atomic_reduction.var)4117// CHECK1-NEXT: [[CALL21:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST19]])4118// CHECK1-NEXT: [[CALL22:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST18]])4119// CHECK1-NEXT: [[ADD23:%.*]] = add nsw i32 [[CALL21]], [[CALL22]]4120// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP20]], i32 noundef [[ADD23]])4121// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST19]], ptr align 4 [[REF_TMP20]], i64 4, i1 false)4122// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP20]]) #[[ATTR5]]4123// CHECK1-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP34]], ptr @.gomp_critical_user_.atomic_reduction.var)4124// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT24]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST19]], i32 14125// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT25]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST18]], i32 14126// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE26:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT24]], [[TMP32]]4127// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE26]], label [[OMP_ARRAYCPY_DONE27]], label [[OMP_ARRAYCPY_BODY17]]4128// CHECK1: omp.arraycpy.done27:4129// CHECK1-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP29]], ptr @.gomp_critical_user_.reduction.var)4130// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]4131// CHECK1: .omp.reduction.default:4132// CHECK1-NEXT: [[ARRAY_BEGIN28:%.*]] = getelementptr inbounds [40 x %struct.S.0], ptr [[ARR4]], i32 0, i32 04133// CHECK1-NEXT: [[TMP35:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN28]], i64 404134// CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]4135// CHECK1: arraydestroy.body:4136// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP35]], [[DOTOMP_REDUCTION_DEFAULT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]4137// CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -14138// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR5]]4139// CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN28]]4140// CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE29:%.*]], label [[ARRAYDESTROY_BODY]]4141// CHECK1: arraydestroy.done29:4142// CHECK1-NEXT: [[TMP36:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84143// CHECK1-NEXT: [[TMP37:%.*]] = load i32, ptr [[TMP36]], align 44144// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP37]])4145// CHECK1-NEXT: ret void4146//4147//4148// CHECK1-LABEL: define {{[^@]+}}@_Z5tmainIiLi42EET_v.omp_outlined.14.omp.reduction.reduction_func4149// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR6]] {4150// CHECK1-NEXT: entry:4151// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 84152// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 84153// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_S_0:%.*]], align 44154// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 84155// CHECK1-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 84156// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 84157// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 84158// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 04159// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 84160// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 04161// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 84162// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr [[STRUCT_S_0]], ptr [[TMP7]], i64 404163// CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]4164// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE3:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]4165// CHECK1: omp.arraycpy.body:4166// CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]4167// CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]4168// CHECK1-NEXT: [[CALL:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]])4169// CHECK1-NEXT: [[CALL2:%.*]] = call noundef i32 @_ZN1SIiEcviEv(ptr noundef nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]])4170// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL2]]4171// CHECK1-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]], i32 noundef [[ADD]])4172// CHECK1-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[REF_TMP]], i64 4, i1 false)4173// CHECK1-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]]) #[[ATTR5]]4174// CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 14175// CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 14176// CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]4177// CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE3]], label [[OMP_ARRAYCPY_BODY]]4178// CHECK1: omp.arraycpy.done3:4179// CHECK1-NEXT: ret void4180//4181//4182// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ev4183// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {4184// CHECK1-NEXT: entry:4185// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 84186// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 84187// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 84188// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 04189// CHECK1-NEXT: [[TMP0:%.*]] = load volatile double, ptr @g, align 84190// CHECK1-NEXT: [[CONV:%.*]] = fptosi double [[TMP0]] to i324191// CHECK1-NEXT: store i32 [[CONV]], ptr [[F]], align 44192// CHECK1-NEXT: ret void4193//4194//4195// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ei4196// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] align 2 {4197// CHECK1-NEXT: entry:4198// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 84199// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i32, align 44200// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 84201// CHECK1-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 44202// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 84203// CHECK1-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 04204// CHECK1-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 44205// CHECK1-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP0]] to double4206// CHECK1-NEXT: [[TMP1:%.*]] = load volatile double, ptr @g, align 84207// CHECK1-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP1]]4208// CHECK1-NEXT: [[CONV2:%.*]] = fptosi double [[ADD]] to i324209// CHECK1-NEXT: store i32 [[CONV2]], ptr [[F]], align 44210// CHECK1-NEXT: ret void4211//4212//4213// CHECK1-LABEL: define {{[^@]+}}@_ZN1SIiED2Ev4214// CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 {4215// CHECK1-NEXT: entry:4216// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 84217// CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 84218// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 84219// CHECK1-NEXT: ret void4220//4221//4222// CHECK3-LABEL: define {{[^@]+}}@main4223// CHECK3-SAME: () #[[ATTR0:[0-9]+]] {4224// CHECK3-NEXT: entry:4225// CHECK3-NEXT: [[RETVAL:%.*]] = alloca i32, align 44226// CHECK3-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 14227// CHECK3-NEXT: store i32 0, ptr [[RETVAL]], align 44228// CHECK3-NEXT: call void @"_ZZ4mainENK3$_0clEv"(ptr noundef nonnull align 1 dereferenceable(1) [[REF_TMP]])4229// CHECK3-NEXT: ret i32 04230//4231//4232// CHECK4-LABEL: define {{[^@]+}}@main4233// CHECK4-SAME: () #[[ATTR1:[0-9]+]] {4234// CHECK4-NEXT: entry:4235// CHECK4-NEXT: [[RETVAL:%.*]] = alloca i32, align 44236// CHECK4-NEXT: store i32 0, ptr [[RETVAL]], align 44237// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr getelementptr inbounds nuw ([[STRUCT___BLOCK_LITERAL_GENERIC:%.*]], ptr @__block_literal_global, i32 0, i32 3), align 84238// CHECK4-NEXT: call void [[TMP0]](ptr noundef @__block_literal_global)4239// CHECK4-NEXT: ret i32 04240//4241//4242// CHECK4-LABEL: define {{[^@]+}}@__main_block_invoke4243// CHECK4-SAME: (ptr noundef [[DOTBLOCK_DESCRIPTOR:%.*]]) #[[ATTR2:[0-9]+]] {4244// CHECK4-NEXT: entry:4245// CHECK4-NEXT: [[DOTBLOCK_DESCRIPTOR_ADDR:%.*]] = alloca ptr, align 84246// CHECK4-NEXT: [[BLOCK_ADDR:%.*]] = alloca ptr, align 84247// CHECK4-NEXT: store ptr [[DOTBLOCK_DESCRIPTOR]], ptr [[DOTBLOCK_DESCRIPTOR_ADDR]], align 84248// CHECK4-NEXT: store ptr [[DOTBLOCK_DESCRIPTOR]], ptr [[BLOCK_ADDR]], align 84249// CHECK4-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB4:[0-9]+]], i32 0, ptr @__main_block_invoke.omp_outlined)4250// CHECK4-NEXT: ret void4251//4252//4253// CHECK4-LABEL: define {{[^@]+}}@__main_block_invoke.omp_outlined4254// CHECK4-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR3:[0-9]+]] {4255// CHECK4-NEXT: entry:4256// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84257// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84258// CHECK4-NEXT: [[TMP:%.*]] = alloca ptr, align 84259// CHECK4-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44260// CHECK4-NEXT: [[_TMP1:%.*]] = alloca i32, align 44261// CHECK4-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44262// CHECK4-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44263// CHECK4-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44264// CHECK4-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44265// CHECK4-NEXT: [[G:%.*]] = alloca double, align 84266// CHECK4-NEXT: [[G1:%.*]] = alloca double, align 84267// CHECK4-NEXT: [[_TMP2:%.*]] = alloca ptr, align 84268// CHECK4-NEXT: [[I:%.*]] = alloca i32, align 44269// CHECK4-NEXT: [[BLOCK:%.*]] = alloca <{ ptr, i32, i32, ptr, ptr, double, ptr }>, align 84270// CHECK4-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 84271// CHECK4-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84272// CHECK4-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84273// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr @g1, align 84274// CHECK4-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 84275// CHECK4-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44276// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 44277// CHECK4-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44278// CHECK4-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44279// CHECK4-NEXT: store double 0.000000e+00, ptr [[G]], align 84280// CHECK4-NEXT: [[TMP1:%.*]] = load ptr, ptr @g1, align 84281// CHECK4-NEXT: store double 0.000000e+00, ptr [[G1]], align 84282// CHECK4-NEXT: store ptr [[G1]], ptr [[_TMP2]], align 84283// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84284// CHECK4-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 44285// CHECK4-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)4286// CHECK4-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44287// CHECK4-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 14288// CHECK4-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4289// CHECK4: cond.true:4290// CHECK4-NEXT: br label [[COND_END:%.*]]4291// CHECK4: cond.false:4292// CHECK4-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44293// CHECK4-NEXT: br label [[COND_END]]4294// CHECK4: cond.end:4295// CHECK4-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]4296// CHECK4-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 44297// CHECK4-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44298// CHECK4-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 44299// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4300// CHECK4: omp.inner.for.cond:4301// CHECK4-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44302// CHECK4-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44303// CHECK4-NEXT: [[CMP3:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]4304// CHECK4-NEXT: br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4305// CHECK4: omp.inner.for.body:4306// CHECK4-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44307// CHECK4-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 14308// CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4309// CHECK4-NEXT: store i32 [[ADD]], ptr [[I]], align 44310// CHECK4-NEXT: store double 1.000000e+00, ptr [[G]], align 84311// CHECK4-NEXT: [[TMP10:%.*]] = load ptr, ptr [[_TMP2]], align 84312// CHECK4-NEXT: store volatile double 1.000000e+00, ptr [[TMP10]], align 84313// CHECK4-NEXT: [[BLOCK_ISA:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, double, ptr }>, ptr [[BLOCK]], i32 0, i32 04314// CHECK4-NEXT: store ptr @_NSConcreteStackBlock, ptr [[BLOCK_ISA]], align 84315// CHECK4-NEXT: [[BLOCK_FLAGS:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, double, ptr }>, ptr [[BLOCK]], i32 0, i32 14316// CHECK4-NEXT: store i32 1073741824, ptr [[BLOCK_FLAGS]], align 84317// CHECK4-NEXT: [[BLOCK_RESERVED:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, double, ptr }>, ptr [[BLOCK]], i32 0, i32 24318// CHECK4-NEXT: store i32 0, ptr [[BLOCK_RESERVED]], align 44319// CHECK4-NEXT: [[BLOCK_INVOKE:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, double, ptr }>, ptr [[BLOCK]], i32 0, i32 34320// CHECK4-NEXT: store ptr @g1_block_invoke, ptr [[BLOCK_INVOKE]], align 84321// CHECK4-NEXT: [[BLOCK_DESCRIPTOR:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, double, ptr }>, ptr [[BLOCK]], i32 0, i32 44322// CHECK4-NEXT: store ptr @__block_descriptor_tmp.1, ptr [[BLOCK_DESCRIPTOR]], align 84323// CHECK4-NEXT: [[BLOCK_CAPTURED:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, double, ptr }>, ptr [[BLOCK]], i32 0, i32 54324// CHECK4-NEXT: [[TMP11:%.*]] = load volatile double, ptr [[G]], align 84325// CHECK4-NEXT: store volatile double [[TMP11]], ptr [[BLOCK_CAPTURED]], align 84326// CHECK4-NEXT: [[BLOCK_CAPTURED4:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, double, ptr }>, ptr [[BLOCK]], i32 0, i32 64327// CHECK4-NEXT: [[TMP12:%.*]] = load ptr, ptr [[_TMP2]], align 84328// CHECK4-NEXT: store ptr [[TMP12]], ptr [[BLOCK_CAPTURED4]], align 84329// CHECK4-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___BLOCK_LITERAL_GENERIC:%.*]], ptr [[BLOCK]], i32 0, i32 34330// CHECK4-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 84331// CHECK4-NEXT: call void [[TMP14]](ptr noundef [[BLOCK]])4332// CHECK4-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4333// CHECK4: omp.body.continue:4334// CHECK4-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4335// CHECK4: omp.inner.for.inc:4336// CHECK4-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44337// CHECK4-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP15]], 14338// CHECK4-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_IV]], align 44339// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND]]4340// CHECK4: omp.inner.for.end:4341// CHECK4-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4342// CHECK4: omp.loop.exit:4343// CHECK4-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP3]])4344// CHECK4-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 04345// CHECK4-NEXT: store ptr [[G]], ptr [[TMP16]], align 84346// CHECK4-NEXT: [[TMP17:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 14347// CHECK4-NEXT: store ptr [[G1]], ptr [[TMP17]], align 84348// CHECK4-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2:[0-9]+]], i32 [[TMP3]], i32 2, i64 16, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @__main_block_invoke.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)4349// CHECK4-NEXT: switch i32 [[TMP18]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [4350// CHECK4-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]4351// CHECK4-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]4352// CHECK4-NEXT: ]4353// CHECK4: .omp.reduction.case1:4354// CHECK4-NEXT: [[TMP19:%.*]] = load double, ptr @g, align 84355// CHECK4-NEXT: [[TMP20:%.*]] = load double, ptr [[G]], align 84356// CHECK4-NEXT: [[ADD6:%.*]] = fadd double [[TMP19]], [[TMP20]]4357// CHECK4-NEXT: store double [[ADD6]], ptr @g, align 84358// CHECK4-NEXT: [[TMP21:%.*]] = load double, ptr [[TMP1]], align 84359// CHECK4-NEXT: [[TMP22:%.*]] = load double, ptr [[G1]], align 84360// CHECK4-NEXT: [[ADD7:%.*]] = fadd double [[TMP21]], [[TMP22]]4361// CHECK4-NEXT: store double [[ADD7]], ptr [[TMP1]], align 84362// CHECK4-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP3]], ptr @.gomp_critical_user_.reduction.var)4363// CHECK4-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]4364// CHECK4: .omp.reduction.case2:4365// CHECK4-NEXT: [[TMP23:%.*]] = load double, ptr [[G]], align 84366// CHECK4-NEXT: [[TMP24:%.*]] = atomicrmw fadd ptr @g, double [[TMP23]] monotonic, align 84367// CHECK4-NEXT: [[TMP25:%.*]] = load double, ptr [[G1]], align 84368// CHECK4-NEXT: [[TMP26:%.*]] = atomicrmw fadd ptr [[TMP1]], double [[TMP25]] monotonic, align 84369// CHECK4-NEXT: call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP3]], ptr @.gomp_critical_user_.reduction.var)4370// CHECK4-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]4371// CHECK4: .omp.reduction.default:4372// CHECK4-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[TMP3]])4373// CHECK4-NEXT: ret void4374//4375//4376// CHECK4-LABEL: define {{[^@]+}}@g1_block_invoke4377// CHECK4-SAME: (ptr noundef [[DOTBLOCK_DESCRIPTOR:%.*]]) #[[ATTR2]] {4378// CHECK4-NEXT: entry:4379// CHECK4-NEXT: [[DOTBLOCK_DESCRIPTOR_ADDR:%.*]] = alloca ptr, align 84380// CHECK4-NEXT: [[BLOCK_ADDR:%.*]] = alloca ptr, align 84381// CHECK4-NEXT: store ptr [[DOTBLOCK_DESCRIPTOR]], ptr [[DOTBLOCK_DESCRIPTOR_ADDR]], align 84382// CHECK4-NEXT: store ptr [[DOTBLOCK_DESCRIPTOR]], ptr [[BLOCK_ADDR]], align 84383// CHECK4-NEXT: [[BLOCK_CAPTURE_ADDR:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, double, ptr }>, ptr [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 54384// CHECK4-NEXT: store double 2.000000e+00, ptr [[BLOCK_CAPTURE_ADDR]], align 84385// CHECK4-NEXT: [[BLOCK_CAPTURE_ADDR1:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, double, ptr }>, ptr [[DOTBLOCK_DESCRIPTOR]], i32 0, i32 64386// CHECK4-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BLOCK_CAPTURE_ADDR1]], align 84387// CHECK4-NEXT: store double 2.000000e+00, ptr [[TMP0]], align 84388// CHECK4-NEXT: ret void4389//4390//4391// CHECK4-LABEL: define {{[^@]+}}@__main_block_invoke.omp_outlined.omp.reduction.reduction_func4392// CHECK4-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR5:[0-9]+]] {4393// CHECK4-NEXT: entry:4394// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 84395// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 84396// CHECK4-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 84397// CHECK4-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 84398// CHECK4-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 84399// CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 84400// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 04401// CHECK4-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 84402// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 04403// CHECK4-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 84404// CHECK4-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 14405// CHECK4-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 84406// CHECK4-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP2]], i64 0, i64 14407// CHECK4-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 84408// CHECK4-NEXT: [[TMP12:%.*]] = load double, ptr [[TMP7]], align 84409// CHECK4-NEXT: [[TMP13:%.*]] = load double, ptr [[TMP5]], align 84410// CHECK4-NEXT: [[ADD:%.*]] = fadd double [[TMP12]], [[TMP13]]4411// CHECK4-NEXT: store double [[ADD]], ptr [[TMP7]], align 84412// CHECK4-NEXT: [[TMP14:%.*]] = load double, ptr [[TMP11]], align 84413// CHECK4-NEXT: [[TMP15:%.*]] = load double, ptr [[TMP9]], align 84414// CHECK4-NEXT: [[ADD2:%.*]] = fadd double [[TMP14]], [[TMP15]]4415// CHECK4-NEXT: store double [[ADD2]], ptr [[TMP11]], align 84416// CHECK4-NEXT: ret void4417//4418