2650 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _2// RUN: %clang_cc1 -DLAMBDA -verify -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK13// RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s -Wno-openmp-mapping4// RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK15// RUN: %clang_cc1 -DLAMBDA -verify -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK36// RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s -Wno-openmp-mapping7// RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK38 9// RUN: %clang_cc1 -DLAMBDA -verify -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -Wno-openmp-mapping | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"10// RUN: %clang_cc1 -DLAMBDA -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s -Wno-openmp-mapping11// RUN: %clang_cc1 -DLAMBDA -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -Wno-openmp-mapping | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"12// RUN: %clang_cc1 -DLAMBDA -verify -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - -Wno-openmp-mapping | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"13// RUN: %clang_cc1 -DLAMBDA -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s -Wno-openmp-mapping14// RUN: %clang_cc1 -DLAMBDA -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -Wno-openmp-mapping | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"15 16// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK917// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s -Wno-openmp-mapping18// RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK919// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK1120// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s -Wno-openmp-mapping21// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK1122 23// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -Wno-openmp-mapping | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"24// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s -Wno-openmp-mapping25// RUN: %clang_cc1 -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -Wno-openmp-mapping | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"26// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - -Wno-openmp-mapping | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"27// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s -Wno-openmp-mapping28// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - -Wno-openmp-mapping | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"29// expected-no-diagnostics30#ifndef HEADER31#define HEADER32 33template <class T>34struct S {35 T f;36 S(T a) : f(a) {}37 S() : f() {}38 operator T() { return T(); }39 ~S() {}40};41 42template <typename T>43T tmain() {44 S<T> test;45 T t_var = T();46 T vec[] = {1, 2};47 S<T> s_arr[] = {1, 2};48 S<T> &var = test;49 #pragma omp target50 #pragma omp teams distribute parallel for lastprivate(t_var, vec, s_arr, s_arr, var, var)51 for (int i = 0; i < 2; ++i) {52 vec[i] = t_var;53 s_arr[i] = var;54 }55 return T();56}57 58int main() {59 static int svar;60 volatile double g;61 volatile double &g1 = g;62 63 #ifdef LAMBDA64 [&]() {65 static float sfvar;66 67 #pragma omp target68 #pragma omp teams distribute parallel for lastprivate(g, g1, svar, sfvar)69 for (int i = 0; i < 2; ++i) {70 // loop variables71 72 // init private variables73 g = 1;74 g1 = 1;75 svar = 3;76 sfvar = 4.0;77 78 79 80 81 // loop variables82 83 // init private variables84 85 86 87 88 89 [&]() {90 g = 2;91 g1 = 2;92 svar = 4;93 sfvar = 8.0;94 95 }();96 }97 }();98 return 0;99 #else100 S<float> test;101 int t_var = 0;102 int vec[] = {1, 2};103 S<float> s_arr[] = {1, 2};104 S<float> &var = test;105 106 #pragma omp target107 #pragma omp teams distribute parallel for lastprivate(t_var, vec, s_arr, s_arr, var, var, svar)108 for (int i = 0; i < 2; ++i) {109 vec[i] = t_var;110 s_arr[i] = var;111 }112 int i;113 114 return tmain<int>();115 #endif116}117 118 119// skip loop variables120 121// copy from parameters to local address variables122 123// load content of local address variables124// the distribute loop125 126// lastprivates127 128 129// gbl and bound tid vars, prev lb and ub vars130// skip loop variables131 132// copy from parameters to local address variables133 134// load content of local address variables135// the distribute loop136 137// assignment: vec[i] = t_var;138 139// assignment: s_arr[i] = var;140 141 142// lastprivates143 144 145// template tmain146 147 148// skip alloca of global_tid and bound_tid149// skip loop variables150 151// skip init of bound and global tid152// copy from parameters to local address variables153 154// load content of local address variables155 156 157// lastprivates158 159 160// skip alloca of global_tid and bound_tid, and prev lb and ub vars161// skip loop variables162 163// skip init of bound and global tid164// copy from parameters to local address variables165 166// load content of local address variables167 168 169// assignment: vec[i] = t_var;170 171// assignment: s_arr[i] = var;172 173 174// lastprivates175 176 177#endif178// CHECK1-LABEL: define {{[^@]+}}@main179// CHECK1-SAME: () #[[ATTR0:[0-9]+]] {180// CHECK1-NEXT: entry:181// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4182// CHECK1-NEXT: [[G:%.*]] = alloca double, align 8183// CHECK1-NEXT: [[G1:%.*]] = alloca ptr, align 8184// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 8185// CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 4186// CHECK1-NEXT: store ptr [[G]], ptr [[G1]], align 8187// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0188// CHECK1-NEXT: store ptr [[G]], ptr [[TMP0]], align 8189// CHECK1-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1190// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G1]], align 8191// CHECK1-NEXT: store ptr [[TMP2]], ptr [[TMP1]], align 8192// CHECK1-NEXT: call void @"_ZZ4mainENK3$_0clEv"(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]])193// CHECK1-NEXT: ret i32 0194//195//196// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67197// CHECK1-SAME: (i64 noundef [[G:%.*]], i64 noundef [[G1:%.*]], i64 noundef [[SVAR:%.*]], i64 noundef [[SFVAR:%.*]]) #[[ATTR2:[0-9]+]] {198// CHECK1-NEXT: entry:199// CHECK1-NEXT: [[G_ADDR:%.*]] = alloca i64, align 8200// CHECK1-NEXT: [[G1_ADDR:%.*]] = alloca i64, align 8201// CHECK1-NEXT: [[SVAR_ADDR:%.*]] = alloca i64, align 8202// CHECK1-NEXT: [[SFVAR_ADDR:%.*]] = alloca i64, align 8203// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8204// CHECK1-NEXT: store i64 [[G]], ptr [[G_ADDR]], align 8205// CHECK1-NEXT: store i64 [[G1]], ptr [[G1_ADDR]], align 8206// CHECK1-NEXT: store i64 [[SVAR]], ptr [[SVAR_ADDR]], align 8207// CHECK1-NEXT: store i64 [[SFVAR]], ptr [[SFVAR_ADDR]], align 8208// CHECK1-NEXT: store ptr [[G1_ADDR]], ptr [[TMP]], align 8209// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[TMP]], align 8210// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3:[0-9]+]], i32 4, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined, ptr [[G_ADDR]], ptr [[TMP0]], ptr [[SVAR_ADDR]], ptr [[SFVAR_ADDR]])211// CHECK1-NEXT: ret void212//213//214// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined215// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[G:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[G1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SVAR:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SFVAR:%.*]]) #[[ATTR2]] {216// CHECK1-NEXT: entry:217// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8218// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8219// CHECK1-NEXT: [[G_ADDR:%.*]] = alloca ptr, align 8220// CHECK1-NEXT: [[G1_ADDR:%.*]] = alloca ptr, align 8221// CHECK1-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 8222// CHECK1-NEXT: [[SFVAR_ADDR:%.*]] = alloca ptr, align 8223// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8224// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4225// CHECK1-NEXT: [[_TMP1:%.*]] = alloca i32, align 4226// CHECK1-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4227// CHECK1-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4228// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4229// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4230// CHECK1-NEXT: [[G2:%.*]] = alloca double, align 8231// CHECK1-NEXT: [[G13:%.*]] = alloca double, align 8232// CHECK1-NEXT: [[_TMP4:%.*]] = alloca ptr, align 8233// CHECK1-NEXT: [[SVAR5:%.*]] = alloca i32, align 4234// CHECK1-NEXT: [[SFVAR6:%.*]] = alloca float, align 4235// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4236// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8237// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8238// CHECK1-NEXT: store ptr [[G]], ptr [[G_ADDR]], align 8239// CHECK1-NEXT: store ptr [[G1]], ptr [[G1_ADDR]], align 8240// CHECK1-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 8241// CHECK1-NEXT: store ptr [[SFVAR]], ptr [[SFVAR_ADDR]], align 8242// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[G_ADDR]], align 8243// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[G1_ADDR]], align 8244// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 8245// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[SFVAR_ADDR]], align 8246// CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 8247// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 4248// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_COMB_UB]], align 4249// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4250// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4251// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 8252// CHECK1-NEXT: store ptr [[G13]], ptr [[_TMP4]], align 8253// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8254// CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4255// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP6]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)256// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4257// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP7]], 1258// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]259// CHECK1: cond.true:260// CHECK1-NEXT: br label [[COND_END:%.*]]261// CHECK1: cond.false:262// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4263// CHECK1-NEXT: br label [[COND_END]]264// CHECK1: cond.end:265// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]266// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4267// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4268// CHECK1-NEXT: store i32 [[TMP9]], ptr [[DOTOMP_IV]], align 4269// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]270// CHECK1: omp.inner.for.cond:271// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4272// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4273// CHECK1-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]274// CHECK1-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]275// CHECK1: omp.inner.for.body:276// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4277// CHECK1-NEXT: [[TMP13:%.*]] = zext i32 [[TMP12]] to i64278// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4279// CHECK1-NEXT: [[TMP15:%.*]] = zext i32 [[TMP14]] to i64280// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP4]], align 8281// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 6, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined.omp_outlined, i64 [[TMP13]], i64 [[TMP15]], ptr [[G2]], ptr [[TMP16]], ptr [[SVAR5]], ptr [[SFVAR6]])282// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]283// CHECK1: omp.inner.for.inc:284// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4285// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4286// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]287// CHECK1-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4288// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]289// CHECK1: omp.inner.for.end:290// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]291// CHECK1: omp.loop.exit:292// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP6]])293// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4294// CHECK1-NEXT: [[TMP20:%.*]] = icmp ne i32 [[TMP19]], 0295// CHECK1-NEXT: br i1 [[TMP20]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]296// CHECK1: .omp.lastprivate.then:297// CHECK1-NEXT: [[TMP21:%.*]] = load double, ptr [[G2]], align 8298// CHECK1-NEXT: store volatile double [[TMP21]], ptr [[TMP0]], align 8299// CHECK1-NEXT: [[TMP22:%.*]] = load ptr, ptr [[_TMP4]], align 8300// CHECK1-NEXT: [[TMP23:%.*]] = load double, ptr [[TMP22]], align 8301// CHECK1-NEXT: store volatile double [[TMP23]], ptr [[TMP4]], align 8302// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[SVAR5]], align 4303// CHECK1-NEXT: store i32 [[TMP24]], ptr [[TMP2]], align 4304// CHECK1-NEXT: [[TMP25:%.*]] = load float, ptr [[SFVAR6]], align 4305// CHECK1-NEXT: store float [[TMP25]], ptr [[TMP3]], align 4306// CHECK1-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]307// CHECK1: .omp.lastprivate.done:308// CHECK1-NEXT: ret void309//310//311// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined.omp_outlined312// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[G:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[G1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SVAR:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SFVAR:%.*]]) #[[ATTR2]] {313// CHECK1-NEXT: entry:314// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8315// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8316// CHECK1-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8317// CHECK1-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8318// CHECK1-NEXT: [[G_ADDR:%.*]] = alloca ptr, align 8319// CHECK1-NEXT: [[G1_ADDR:%.*]] = alloca ptr, align 8320// CHECK1-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 8321// CHECK1-NEXT: [[SFVAR_ADDR:%.*]] = alloca ptr, align 8322// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8323// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4324// CHECK1-NEXT: [[_TMP1:%.*]] = alloca i32, align 4325// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4326// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4327// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4328// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4329// CHECK1-NEXT: [[G3:%.*]] = alloca double, align 8330// CHECK1-NEXT: [[G14:%.*]] = alloca double, align 8331// CHECK1-NEXT: [[_TMP5:%.*]] = alloca ptr, align 8332// CHECK1-NEXT: [[SVAR6:%.*]] = alloca i32, align 4333// CHECK1-NEXT: [[SFVAR7:%.*]] = alloca float, align 4334// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4335// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8336// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8337// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8338// CHECK1-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 8339// CHECK1-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 8340// CHECK1-NEXT: store ptr [[G]], ptr [[G_ADDR]], align 8341// CHECK1-NEXT: store ptr [[G1]], ptr [[G1_ADDR]], align 8342// CHECK1-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 8343// CHECK1-NEXT: store ptr [[SFVAR]], ptr [[SFVAR_ADDR]], align 8344// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[G_ADDR]], align 8345// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[G1_ADDR]], align 8346// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 8347// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[SFVAR_ADDR]], align 8348// CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 8349// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4350// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 4351// CHECK1-NEXT: [[TMP4:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 8352// CHECK1-NEXT: [[CONV:%.*]] = trunc i64 [[TMP4]] to i32353// CHECK1-NEXT: [[TMP5:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8354// CHECK1-NEXT: [[CONV2:%.*]] = trunc i64 [[TMP5]] to i32355// CHECK1-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 4356// CHECK1-NEXT: store i32 [[CONV2]], ptr [[DOTOMP_UB]], align 4357// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4358// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4359// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 8360// CHECK1-NEXT: store ptr [[G14]], ptr [[_TMP5]], align 8361// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8362// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4363// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)364// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4365// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP9]], 1366// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]367// CHECK1: cond.true:368// CHECK1-NEXT: br label [[COND_END:%.*]]369// CHECK1: cond.false:370// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4371// CHECK1-NEXT: br label [[COND_END]]372// CHECK1: cond.end:373// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP10]], [[COND_FALSE]] ]374// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4375// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4376// CHECK1-NEXT: store i32 [[TMP11]], ptr [[DOTOMP_IV]], align 4377// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]378// CHECK1: omp.inner.for.cond:379// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4380// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4381// CHECK1-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]382// CHECK1-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]383// CHECK1: omp.inner.for.body:384// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4385// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP14]], 1386// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]387// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 4388// CHECK1-NEXT: store double 1.000000e+00, ptr [[G3]], align 8389// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[_TMP5]], align 8390// CHECK1-NEXT: store volatile double 1.000000e+00, ptr [[TMP15]], align 8391// CHECK1-NEXT: store i32 3, ptr [[SVAR6]], align 4392// CHECK1-NEXT: store float 4.000000e+00, ptr [[SFVAR7]], align 4393// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0394// CHECK1-NEXT: store ptr [[G3]], ptr [[TMP16]], align 8395// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1396// CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[_TMP5]], align 8397// CHECK1-NEXT: store ptr [[TMP18]], ptr [[TMP17]], align 8398// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2399// CHECK1-NEXT: store ptr [[SVAR6]], ptr [[TMP19]], align 8400// CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 3401// CHECK1-NEXT: store ptr [[SFVAR7]], ptr [[TMP20]], align 8402// CHECK1-NEXT: call void @"_ZZZ4mainENK3$_0clEvENKUlvE_clEv"(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])403// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]404// CHECK1: omp.body.continue:405// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]406// CHECK1: omp.inner.for.inc:407// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4408// CHECK1-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP21]], 1409// CHECK1-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 4410// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]411// CHECK1: omp.inner.for.end:412// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]413// CHECK1: omp.loop.exit:414// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP8]])415// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4416// CHECK1-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0417// CHECK1-NEXT: br i1 [[TMP23]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]418// CHECK1: .omp.lastprivate.then:419// CHECK1-NEXT: [[TMP24:%.*]] = load double, ptr [[G3]], align 8420// CHECK1-NEXT: store volatile double [[TMP24]], ptr [[TMP0]], align 8421// CHECK1-NEXT: [[TMP25:%.*]] = load ptr, ptr [[_TMP5]], align 8422// CHECK1-NEXT: [[TMP26:%.*]] = load double, ptr [[TMP25]], align 8423// CHECK1-NEXT: store volatile double [[TMP26]], ptr [[TMP6]], align 8424// CHECK1-NEXT: [[TMP27:%.*]] = load i32, ptr [[SVAR6]], align 4425// CHECK1-NEXT: store i32 [[TMP27]], ptr [[TMP2]], align 4426// CHECK1-NEXT: [[TMP28:%.*]] = load float, ptr [[SFVAR7]], align 4427// CHECK1-NEXT: store float [[TMP28]], ptr [[TMP3]], align 4428// CHECK1-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]429// CHECK1: .omp.lastprivate.done:430// CHECK1-NEXT: ret void431//432//433// CHECK3-LABEL: define {{[^@]+}}@main434// CHECK3-SAME: () #[[ATTR0:[0-9]+]] {435// CHECK3-NEXT: entry:436// CHECK3-NEXT: [[RETVAL:%.*]] = alloca i32, align 4437// CHECK3-NEXT: [[G:%.*]] = alloca double, align 8438// CHECK3-NEXT: [[G1:%.*]] = alloca ptr, align 4439// CHECK3-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 4440// CHECK3-NEXT: store i32 0, ptr [[RETVAL]], align 4441// CHECK3-NEXT: store ptr [[G]], ptr [[G1]], align 4442// CHECK3-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0443// CHECK3-NEXT: store ptr [[G]], ptr [[TMP0]], align 4444// CHECK3-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1445// CHECK3-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G1]], align 4446// CHECK3-NEXT: store ptr [[TMP2]], ptr [[TMP1]], align 4447// CHECK3-NEXT: call void @"_ZZ4mainENK3$_0clEv"(ptr noundef nonnull align 4 dereferenceable(8) [[REF_TMP]])448// CHECK3-NEXT: ret i32 0449//450//451// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67452// CHECK3-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[G:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[G1:%.*]], i32 noundef [[SVAR:%.*]], i32 noundef [[SFVAR:%.*]]) #[[ATTR2:[0-9]+]] {453// CHECK3-NEXT: entry:454// CHECK3-NEXT: [[G_ADDR:%.*]] = alloca ptr, align 4455// CHECK3-NEXT: [[G1_ADDR:%.*]] = alloca ptr, align 4456// CHECK3-NEXT: [[SVAR_ADDR:%.*]] = alloca i32, align 4457// CHECK3-NEXT: [[SFVAR_ADDR:%.*]] = alloca i32, align 4458// CHECK3-NEXT: [[TMP:%.*]] = alloca ptr, align 4459// CHECK3-NEXT: [[G2:%.*]] = alloca double, align 8460// CHECK3-NEXT: [[G13:%.*]] = alloca double, align 8461// CHECK3-NEXT: [[_TMP4:%.*]] = alloca ptr, align 4462// CHECK3-NEXT: store ptr [[G]], ptr [[G_ADDR]], align 4463// CHECK3-NEXT: store ptr [[G1]], ptr [[G1_ADDR]], align 4464// CHECK3-NEXT: store i32 [[SVAR]], ptr [[SVAR_ADDR]], align 4465// CHECK3-NEXT: store i32 [[SFVAR]], ptr [[SFVAR_ADDR]], align 4466// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[G_ADDR]], align 4467// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[G1_ADDR]], align 4468// CHECK3-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 4469// CHECK3-NEXT: [[TMP2:%.*]] = load double, ptr [[TMP0]], align 8470// CHECK3-NEXT: store double [[TMP2]], ptr [[G2]], align 8471// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 4472// CHECK3-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 4473// CHECK3-NEXT: store double [[TMP4]], ptr [[G13]], align 8474// CHECK3-NEXT: store ptr [[G13]], ptr [[_TMP4]], align 4475// CHECK3-NEXT: [[TMP5:%.*]] = load ptr, ptr [[_TMP4]], align 4476// CHECK3-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3:[0-9]+]], i32 4, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined, ptr [[G2]], ptr [[TMP5]], ptr [[SVAR_ADDR]], ptr [[SFVAR_ADDR]])477// CHECK3-NEXT: ret void478//479//480// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined481// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[G:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[G1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SVAR:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SFVAR:%.*]]) #[[ATTR2]] {482// CHECK3-NEXT: entry:483// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4484// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4485// CHECK3-NEXT: [[G_ADDR:%.*]] = alloca ptr, align 4486// CHECK3-NEXT: [[G1_ADDR:%.*]] = alloca ptr, align 4487// CHECK3-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 4488// CHECK3-NEXT: [[SFVAR_ADDR:%.*]] = alloca ptr, align 4489// CHECK3-NEXT: [[TMP:%.*]] = alloca ptr, align 4490// CHECK3-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4491// CHECK3-NEXT: [[_TMP1:%.*]] = alloca i32, align 4492// CHECK3-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4493// CHECK3-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4494// CHECK3-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4495// CHECK3-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4496// CHECK3-NEXT: [[G2:%.*]] = alloca double, align 8497// CHECK3-NEXT: [[G13:%.*]] = alloca double, align 8498// CHECK3-NEXT: [[_TMP4:%.*]] = alloca ptr, align 4499// CHECK3-NEXT: [[SVAR5:%.*]] = alloca i32, align 4500// CHECK3-NEXT: [[SFVAR6:%.*]] = alloca float, align 4501// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 4502// CHECK3-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4503// CHECK3-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4504// CHECK3-NEXT: store ptr [[G]], ptr [[G_ADDR]], align 4505// CHECK3-NEXT: store ptr [[G1]], ptr [[G1_ADDR]], align 4506// CHECK3-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 4507// CHECK3-NEXT: store ptr [[SFVAR]], ptr [[SFVAR_ADDR]], align 4508// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[G_ADDR]], align 4509// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[G1_ADDR]], align 4510// CHECK3-NEXT: [[TMP2:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 4511// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[SFVAR_ADDR]], align 4512// CHECK3-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 4513// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 4514// CHECK3-NEXT: store i32 1, ptr [[DOTOMP_COMB_UB]], align 4515// CHECK3-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4516// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4517// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 4518// CHECK3-NEXT: store ptr [[G13]], ptr [[_TMP4]], align 4519// CHECK3-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4520// CHECK3-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4521// CHECK3-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP6]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)522// CHECK3-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4523// CHECK3-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP7]], 1524// CHECK3-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]525// CHECK3: cond.true:526// CHECK3-NEXT: br label [[COND_END:%.*]]527// CHECK3: cond.false:528// CHECK3-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4529// CHECK3-NEXT: br label [[COND_END]]530// CHECK3: cond.end:531// CHECK3-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]532// CHECK3-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4533// CHECK3-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4534// CHECK3-NEXT: store i32 [[TMP9]], ptr [[DOTOMP_IV]], align 4535// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]536// CHECK3: omp.inner.for.cond:537// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4538// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4539// CHECK3-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]540// CHECK3-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]541// CHECK3: omp.inner.for.body:542// CHECK3-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4543// CHECK3-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4544// CHECK3-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP4]], align 4545// CHECK3-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 6, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined.omp_outlined, i32 [[TMP12]], i32 [[TMP13]], ptr [[G2]], ptr [[TMP14]], ptr [[SVAR5]], ptr [[SFVAR6]])546// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]547// CHECK3: omp.inner.for.inc:548// CHECK3-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4549// CHECK3-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4550// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP15]], [[TMP16]]551// CHECK3-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4552// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]]553// CHECK3: omp.inner.for.end:554// CHECK3-NEXT: br label [[OMP_LOOP_EXIT:%.*]]555// CHECK3: omp.loop.exit:556// CHECK3-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP6]])557// CHECK3-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4558// CHECK3-NEXT: [[TMP18:%.*]] = icmp ne i32 [[TMP17]], 0559// CHECK3-NEXT: br i1 [[TMP18]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]560// CHECK3: .omp.lastprivate.then:561// CHECK3-NEXT: [[TMP19:%.*]] = load double, ptr [[G2]], align 8562// CHECK3-NEXT: store volatile double [[TMP19]], ptr [[TMP0]], align 8563// CHECK3-NEXT: [[TMP20:%.*]] = load ptr, ptr [[_TMP4]], align 4564// CHECK3-NEXT: [[TMP21:%.*]] = load double, ptr [[TMP20]], align 4565// CHECK3-NEXT: store volatile double [[TMP21]], ptr [[TMP4]], align 4566// CHECK3-NEXT: [[TMP22:%.*]] = load i32, ptr [[SVAR5]], align 4567// CHECK3-NEXT: store i32 [[TMP22]], ptr [[TMP2]], align 4568// CHECK3-NEXT: [[TMP23:%.*]] = load float, ptr [[SFVAR6]], align 4569// CHECK3-NEXT: store float [[TMP23]], ptr [[TMP3]], align 4570// CHECK3-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]571// CHECK3: .omp.lastprivate.done:572// CHECK3-NEXT: ret void573//574//575// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined.omp_outlined576// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[G:%.*]], ptr noundef nonnull align 4 dereferenceable(8) [[G1:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SVAR:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SFVAR:%.*]]) #[[ATTR2]] {577// CHECK3-NEXT: entry:578// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4579// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4580// CHECK3-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4581// CHECK3-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4582// CHECK3-NEXT: [[G_ADDR:%.*]] = alloca ptr, align 4583// CHECK3-NEXT: [[G1_ADDR:%.*]] = alloca ptr, align 4584// CHECK3-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 4585// CHECK3-NEXT: [[SFVAR_ADDR:%.*]] = alloca ptr, align 4586// CHECK3-NEXT: [[TMP:%.*]] = alloca ptr, align 4587// CHECK3-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4588// CHECK3-NEXT: [[_TMP1:%.*]] = alloca i32, align 4589// CHECK3-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4590// CHECK3-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4591// CHECK3-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4592// CHECK3-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4593// CHECK3-NEXT: [[G2:%.*]] = alloca double, align 8594// CHECK3-NEXT: [[G13:%.*]] = alloca double, align 8595// CHECK3-NEXT: [[_TMP4:%.*]] = alloca ptr, align 4596// CHECK3-NEXT: [[SVAR5:%.*]] = alloca i32, align 4597// CHECK3-NEXT: [[SFVAR6:%.*]] = alloca float, align 4598// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 4599// CHECK3-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 4600// CHECK3-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4601// CHECK3-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4602// CHECK3-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 4603// CHECK3-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 4604// CHECK3-NEXT: store ptr [[G]], ptr [[G_ADDR]], align 4605// CHECK3-NEXT: store ptr [[G1]], ptr [[G1_ADDR]], align 4606// CHECK3-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 4607// CHECK3-NEXT: store ptr [[SFVAR]], ptr [[SFVAR_ADDR]], align 4608// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[G_ADDR]], align 4609// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[G1_ADDR]], align 4610// CHECK3-NEXT: [[TMP2:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 4611// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[SFVAR_ADDR]], align 4612// CHECK3-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 4613// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4614// CHECK3-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 4615// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 4616// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 4617// CHECK3-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_LB]], align 4618// CHECK3-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_UB]], align 4619// CHECK3-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4620// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4621// CHECK3-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 4622// CHECK3-NEXT: store ptr [[G13]], ptr [[_TMP4]], align 4623// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4624// CHECK3-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4625// CHECK3-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)626// CHECK3-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4627// CHECK3-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP9]], 1628// CHECK3-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]629// CHECK3: cond.true:630// CHECK3-NEXT: br label [[COND_END:%.*]]631// CHECK3: cond.false:632// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4633// CHECK3-NEXT: br label [[COND_END]]634// CHECK3: cond.end:635// CHECK3-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP10]], [[COND_FALSE]] ]636// CHECK3-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4637// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4638// CHECK3-NEXT: store i32 [[TMP11]], ptr [[DOTOMP_IV]], align 4639// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]640// CHECK3: omp.inner.for.cond:641// CHECK3-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4642// CHECK3-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4643// CHECK3-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]644// CHECK3-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]645// CHECK3: omp.inner.for.body:646// CHECK3-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4647// CHECK3-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP14]], 1648// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]649// CHECK3-NEXT: store i32 [[ADD]], ptr [[I]], align 4650// CHECK3-NEXT: store double 1.000000e+00, ptr [[G2]], align 8651// CHECK3-NEXT: [[TMP15:%.*]] = load ptr, ptr [[_TMP4]], align 4652// CHECK3-NEXT: store volatile double 1.000000e+00, ptr [[TMP15]], align 4653// CHECK3-NEXT: store i32 3, ptr [[SVAR5]], align 4654// CHECK3-NEXT: store float 4.000000e+00, ptr [[SFVAR6]], align 4655// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0656// CHECK3-NEXT: store ptr [[G2]], ptr [[TMP16]], align 4657// CHECK3-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1658// CHECK3-NEXT: [[TMP18:%.*]] = load ptr, ptr [[_TMP4]], align 4659// CHECK3-NEXT: store ptr [[TMP18]], ptr [[TMP17]], align 4660// CHECK3-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2661// CHECK3-NEXT: store ptr [[SVAR5]], ptr [[TMP19]], align 4662// CHECK3-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 3663// CHECK3-NEXT: store ptr [[SFVAR6]], ptr [[TMP20]], align 4664// CHECK3-NEXT: call void @"_ZZZ4mainENK3$_0clEvENKUlvE_clEv"(ptr noundef nonnull align 4 dereferenceable(16) [[REF_TMP]])665// CHECK3-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]666// CHECK3: omp.body.continue:667// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]668// CHECK3: omp.inner.for.inc:669// CHECK3-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4670// CHECK3-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP21]], 1671// CHECK3-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4672// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]]673// CHECK3: omp.inner.for.end:674// CHECK3-NEXT: br label [[OMP_LOOP_EXIT:%.*]]675// CHECK3: omp.loop.exit:676// CHECK3-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP8]])677// CHECK3-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4678// CHECK3-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0679// CHECK3-NEXT: br i1 [[TMP23]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]680// CHECK3: .omp.lastprivate.then:681// CHECK3-NEXT: [[TMP24:%.*]] = load double, ptr [[G2]], align 8682// CHECK3-NEXT: store volatile double [[TMP24]], ptr [[TMP0]], align 8683// CHECK3-NEXT: [[TMP25:%.*]] = load ptr, ptr [[_TMP4]], align 4684// CHECK3-NEXT: [[TMP26:%.*]] = load double, ptr [[TMP25]], align 4685// CHECK3-NEXT: store volatile double [[TMP26]], ptr [[TMP6]], align 4686// CHECK3-NEXT: [[TMP27:%.*]] = load i32, ptr [[SVAR5]], align 4687// CHECK3-NEXT: store i32 [[TMP27]], ptr [[TMP2]], align 4688// CHECK3-NEXT: [[TMP28:%.*]] = load float, ptr [[SFVAR6]], align 4689// CHECK3-NEXT: store float [[TMP28]], ptr [[TMP3]], align 4690// CHECK3-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]691// CHECK3: .omp.lastprivate.done:692// CHECK3-NEXT: ret void693//694//695// CHECK9-LABEL: define {{[^@]+}}@main696// CHECK9-SAME: () #[[ATTR0:[0-9]+]] {697// CHECK9-NEXT: entry:698// CHECK9-NEXT: [[RETVAL:%.*]] = alloca i32, align 4699// CHECK9-NEXT: [[G:%.*]] = alloca double, align 8700// CHECK9-NEXT: [[G1:%.*]] = alloca ptr, align 8701// CHECK9-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S:%.*]], align 4702// CHECK9-NEXT: [[T_VAR:%.*]] = alloca i32, align 4703// CHECK9-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 4704// CHECK9-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S], align 4705// CHECK9-NEXT: [[VAR:%.*]] = alloca ptr, align 8706// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 8707// CHECK9-NEXT: [[T_VAR_CASTED:%.*]] = alloca i64, align 8708// CHECK9-NEXT: [[SVAR_CASTED:%.*]] = alloca i64, align 8709// CHECK9-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [5 x ptr], align 8710// CHECK9-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [5 x ptr], align 8711// CHECK9-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [5 x ptr], align 8712// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 4713// CHECK9-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8714// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 4715// CHECK9-NEXT: store i32 0, ptr [[RETVAL]], align 4716// CHECK9-NEXT: store ptr [[G]], ptr [[G1]], align 8717// CHECK9-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])718// CHECK9-NEXT: store i32 0, ptr [[T_VAR]], align 4719// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const.main.vec, i64 8, i1 false)720// CHECK9-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], float noundef 1.000000e+00)721// CHECK9-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i64 1722// CHECK9-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], float noundef 2.000000e+00)723// CHECK9-NEXT: store ptr [[TEST]], ptr [[VAR]], align 8724// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 8725// CHECK9-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 8726// CHECK9-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_VAR]], align 4727// CHECK9-NEXT: store i32 [[TMP1]], ptr [[T_VAR_CASTED]], align 4728// CHECK9-NEXT: [[TMP2:%.*]] = load i64, ptr [[T_VAR_CASTED]], align 8729// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8730// CHECK9-NEXT: [[TMP4:%.*]] = load i32, ptr @_ZZ4mainE4svar, align 4731// CHECK9-NEXT: store i32 [[TMP4]], ptr [[SVAR_CASTED]], align 4732// CHECK9-NEXT: [[TMP5:%.*]] = load i64, ptr [[SVAR_CASTED]], align 8733// CHECK9-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 8734// CHECK9-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP]], align 8735// CHECK9-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0736// CHECK9-NEXT: store i64 [[TMP2]], ptr [[TMP8]], align 8737// CHECK9-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0738// CHECK9-NEXT: store i64 [[TMP2]], ptr [[TMP9]], align 8739// CHECK9-NEXT: [[TMP10:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0740// CHECK9-NEXT: store ptr null, ptr [[TMP10]], align 8741// CHECK9-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1742// CHECK9-NEXT: store ptr [[VEC]], ptr [[TMP11]], align 8743// CHECK9-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 1744// CHECK9-NEXT: store ptr [[VEC]], ptr [[TMP12]], align 8745// CHECK9-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1746// CHECK9-NEXT: store ptr null, ptr [[TMP13]], align 8747// CHECK9-NEXT: [[TMP14:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2748// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[TMP14]], align 8749// CHECK9-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 2750// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[TMP15]], align 8751// CHECK9-NEXT: [[TMP16:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2752// CHECK9-NEXT: store ptr null, ptr [[TMP16]], align 8753// CHECK9-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3754// CHECK9-NEXT: store ptr [[TMP6]], ptr [[TMP17]], align 8755// CHECK9-NEXT: [[TMP18:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 3756// CHECK9-NEXT: store ptr [[TMP7]], ptr [[TMP18]], align 8757// CHECK9-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3758// CHECK9-NEXT: store ptr null, ptr [[TMP19]], align 8759// CHECK9-NEXT: [[TMP20:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4760// CHECK9-NEXT: store i64 [[TMP5]], ptr [[TMP20]], align 8761// CHECK9-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 4762// CHECK9-NEXT: store i64 [[TMP5]], ptr [[TMP21]], align 8763// CHECK9-NEXT: [[TMP22:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 4764// CHECK9-NEXT: store ptr null, ptr [[TMP22]], align 8765// CHECK9-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0766// CHECK9-NEXT: [[TMP24:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0767// CHECK9-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0768// CHECK9-NEXT: store i32 3, ptr [[TMP25]], align 4769// CHECK9-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1770// CHECK9-NEXT: store i32 5, ptr [[TMP26]], align 4771// CHECK9-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2772// CHECK9-NEXT: store ptr [[TMP23]], ptr [[TMP27]], align 8773// CHECK9-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3774// CHECK9-NEXT: store ptr [[TMP24]], ptr [[TMP28]], align 8775// CHECK9-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4776// CHECK9-NEXT: store ptr @.offload_sizes, ptr [[TMP29]], align 8777// CHECK9-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5778// CHECK9-NEXT: store ptr @.offload_maptypes, ptr [[TMP30]], align 8779// CHECK9-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6780// CHECK9-NEXT: store ptr null, ptr [[TMP31]], align 8781// CHECK9-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7782// CHECK9-NEXT: store ptr null, ptr [[TMP32]], align 8783// CHECK9-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8784// CHECK9-NEXT: store i64 2, ptr [[TMP33]], align 8785// CHECK9-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9786// CHECK9-NEXT: store i64 0, ptr [[TMP34]], align 8787// CHECK9-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10788// CHECK9-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP35]], align 4789// CHECK9-NEXT: [[TMP36:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11790// CHECK9-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP36]], align 4791// CHECK9-NEXT: [[TMP37:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12792// CHECK9-NEXT: store i32 0, ptr [[TMP37]], align 4793// CHECK9-NEXT: [[TMP38:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB3:[0-9]+]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.region_id, ptr [[KERNEL_ARGS]])794// CHECK9-NEXT: [[TMP39:%.*]] = icmp ne i32 [[TMP38]], 0795// CHECK9-NEXT: br i1 [[TMP39]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]796// CHECK9: omp_offload.failed:797// CHECK9-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106(i64 [[TMP2]], ptr [[VEC]], ptr [[S_ARR]], ptr [[TMP3]], i64 [[TMP5]]) #[[ATTR4:[0-9]+]]798// CHECK9-NEXT: br label [[OMP_OFFLOAD_CONT]]799// CHECK9: omp_offload.cont:800// CHECK9-NEXT: [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiET_v()801// CHECK9-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 4802// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 0803// CHECK9-NEXT: [[TMP40:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 2804// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]805// CHECK9: arraydestroy.body:806// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP40]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]807// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1808// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]809// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]810// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]811// CHECK9: arraydestroy.done2:812// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]813// CHECK9-NEXT: [[TMP41:%.*]] = load i32, ptr [[RETVAL]], align 4814// CHECK9-NEXT: ret i32 [[TMP41]]815//816//817// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ev818// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {819// CHECK9-NEXT: entry:820// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8821// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8822// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8823// CHECK9-NEXT: call void @_ZN1SIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])824// CHECK9-NEXT: ret void825//826//827// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ef828// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {829// CHECK9-NEXT: entry:830// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8831// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca float, align 4832// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8833// CHECK9-NEXT: store float [[A]], ptr [[A_ADDR]], align 4834// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8835// CHECK9-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4836// CHECK9-NEXT: call void @_ZN1SIfEC2Ef(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], float noundef [[TMP0]])837// CHECK9-NEXT: ret void838//839//840// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106841// CHECK9-SAME: (i64 noundef [[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:%.*]], i64 noundef [[SVAR:%.*]]) #[[ATTR3:[0-9]+]] {842// CHECK9-NEXT: entry:843// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca i64, align 8844// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 8845// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 8846// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 8847// CHECK9-NEXT: [[SVAR_ADDR:%.*]] = alloca i64, align 8848// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 8849// CHECK9-NEXT: store i64 [[T_VAR]], ptr [[T_VAR_ADDR]], align 8850// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 8851// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 8852// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 8853// CHECK9-NEXT: store i64 [[SVAR]], ptr [[SVAR_ADDR]], align 8854// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 8855// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 8856// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR_ADDR]], align 8857// CHECK9-NEXT: store ptr [[TMP2]], ptr [[TMP]], align 8858// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8859// CHECK9-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3]], i32 5, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.omp_outlined, ptr [[TMP0]], ptr [[T_VAR_ADDR]], ptr [[TMP1]], ptr [[TMP3]], ptr [[SVAR_ADDR]])860// CHECK9-NEXT: ret void861//862//863// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.omp_outlined864// CHECK9-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], 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:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SVAR:%.*]]) #[[ATTR3]] {865// CHECK9-NEXT: entry:866// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8867// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8868// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 8869// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 8870// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 8871// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 8872// CHECK9-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 8873// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 8874// CHECK9-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4875// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 4876// CHECK9-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4877// CHECK9-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4878// CHECK9-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4879// CHECK9-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4880// CHECK9-NEXT: [[T_VAR2:%.*]] = alloca i32, align 4881// CHECK9-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 4882// CHECK9-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S], align 4883// CHECK9-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S:%.*]], align 4884// CHECK9-NEXT: [[_TMP6:%.*]] = alloca ptr, align 8885// CHECK9-NEXT: [[SVAR7:%.*]] = alloca i32, align 4886// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 4887// CHECK9-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8888// CHECK9-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8889// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 8890// CHECK9-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 8891// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 8892// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 8893// CHECK9-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 8894// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 8895// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 8896// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 8897// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 8898// CHECK9-NEXT: [[TMP4:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 8899// CHECK9-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 8900// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 4901// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_COMB_UB]], align 4902// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4903// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4904// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 0905// CHECK9-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 2906// CHECK9-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]907// CHECK9: arrayctor.loop:908// CHECK9-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]909// CHECK9-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])910// CHECK9-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i64 1911// CHECK9-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]912// CHECK9-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]913// CHECK9: arrayctor.cont:914// CHECK9-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 8915// CHECK9-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])916// CHECK9-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 8917// CHECK9-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8918// CHECK9-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4919// CHECK9-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP7]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)920// CHECK9-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4921// CHECK9-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP8]], 1922// CHECK9-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]923// CHECK9: cond.true:924// CHECK9-NEXT: br label [[COND_END:%.*]]925// CHECK9: cond.false:926// CHECK9-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4927// CHECK9-NEXT: br label [[COND_END]]928// CHECK9: cond.end:929// CHECK9-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]930// CHECK9-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4931// CHECK9-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4932// CHECK9-NEXT: store i32 [[TMP10]], ptr [[DOTOMP_IV]], align 4933// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]934// CHECK9: omp.inner.for.cond:935// CHECK9-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4936// CHECK9-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4937// CHECK9-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]938// CHECK9-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]939// CHECK9: omp.inner.for.cond.cleanup:940// CHECK9-NEXT: br label [[OMP_INNER_FOR_END:%.*]]941// CHECK9: omp.inner.for.body:942// CHECK9-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4943// CHECK9-NEXT: [[TMP14:%.*]] = zext i32 [[TMP13]] to i64944// CHECK9-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4945// CHECK9-NEXT: [[TMP16:%.*]] = zext i32 [[TMP15]] to i64946// CHECK9-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP6]], align 8947// CHECK9-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 7, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.omp_outlined.omp_outlined, i64 [[TMP14]], i64 [[TMP16]], ptr [[VEC3]], ptr [[T_VAR2]], ptr [[S_ARR4]], ptr [[TMP17]], ptr [[SVAR7]])948// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]949// CHECK9: omp.inner.for.inc:950// CHECK9-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4951// CHECK9-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4952// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]953// CHECK9-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4954// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]955// CHECK9: omp.inner.for.end:956// CHECK9-NEXT: br label [[OMP_LOOP_EXIT:%.*]]957// CHECK9: omp.loop.exit:958// CHECK9-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8959// CHECK9-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4960// CHECK9-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])961// CHECK9-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4962// CHECK9-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0963// CHECK9-NEXT: br i1 [[TMP23]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]964// CHECK9: .omp.lastprivate.then:965// CHECK9-NEXT: [[TMP24:%.*]] = load i32, ptr [[T_VAR2]], align 4966// CHECK9-NEXT: store i32 [[TMP24]], ptr [[TMP1]], align 4967// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i64 8, i1 false)968// CHECK9-NEXT: [[ARRAY_BEGIN9:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[TMP2]], i32 0, i32 0969// CHECK9-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN9]], i64 2970// CHECK9-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN9]], [[TMP25]]971// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE10:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]972// CHECK9: omp.arraycpy.body:973// CHECK9-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]974// CHECK9-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN9]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]975// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 4, i1 false)976// CHECK9-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1977// CHECK9-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1978// CHECK9-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]]979// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_BODY]]980// CHECK9: omp.arraycpy.done10:981// CHECK9-NEXT: [[TMP26:%.*]] = load ptr, ptr [[_TMP6]], align 8982// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP5]], ptr align 4 [[TMP26]], i64 4, i1 false)983// CHECK9-NEXT: [[TMP27:%.*]] = load i32, ptr [[SVAR7]], align 4984// CHECK9-NEXT: store i32 [[TMP27]], ptr [[TMP4]], align 4985// CHECK9-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]986// CHECK9: .omp.lastprivate.done:987// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]988// CHECK9-NEXT: [[ARRAY_BEGIN11:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 0989// CHECK9-NEXT: [[TMP28:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN11]], i64 2990// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]991// CHECK9: arraydestroy.body:992// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP28]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]993// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1994// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]995// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN11]]996// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE12:%.*]], label [[ARRAYDESTROY_BODY]]997// CHECK9: arraydestroy.done12:998// CHECK9-NEXT: ret void999//1000//1001// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.omp_outlined.omp_outlined1002// CHECK9-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], 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:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SVAR:%.*]]) #[[ATTR3]] {1003// CHECK9-NEXT: entry:1004// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81005// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81006// CHECK9-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 81007// CHECK9-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 81008// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 81009// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 81010// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 81011// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 81012// CHECK9-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 81013// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 81014// CHECK9-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41015// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 41016// CHECK9-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41017// CHECK9-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41018// CHECK9-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41019// CHECK9-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41020// CHECK9-NEXT: [[T_VAR3:%.*]] = alloca i32, align 41021// CHECK9-NEXT: [[VEC4:%.*]] = alloca [2 x i32], align 41022// CHECK9-NEXT: [[S_ARR5:%.*]] = alloca [2 x %struct.S], align 41023// CHECK9-NEXT: [[VAR6:%.*]] = alloca [[STRUCT_S:%.*]], align 41024// CHECK9-NEXT: [[_TMP7:%.*]] = alloca ptr, align 81025// CHECK9-NEXT: [[SVAR8:%.*]] = alloca i32, align 41026// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 41027// CHECK9-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81028// CHECK9-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81029// CHECK9-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 81030// CHECK9-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 81031// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 81032// CHECK9-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 81033// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 81034// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 81035// CHECK9-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 81036// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 81037// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 81038// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 81039// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 81040// CHECK9-NEXT: [[TMP4:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 81041// CHECK9-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 81042// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41043// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 41044// CHECK9-NEXT: [[TMP5:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 81045// CHECK9-NEXT: [[CONV:%.*]] = trunc i64 [[TMP5]] to i321046// CHECK9-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 81047// CHECK9-NEXT: [[CONV2:%.*]] = trunc i64 [[TMP6]] to i321048// CHECK9-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 41049// CHECK9-NEXT: store i32 [[CONV2]], ptr [[DOTOMP_UB]], align 41050// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41051// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41052// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR5]], i32 0, i32 01053// CHECK9-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 21054// CHECK9-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]1055// CHECK9: arrayctor.loop:1056// CHECK9-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1057// CHECK9-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1058// CHECK9-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i64 11059// CHECK9-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1060// CHECK9-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1061// CHECK9: arrayctor.cont:1062// CHECK9-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP]], align 81063// CHECK9-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR6]])1064// CHECK9-NEXT: store ptr [[VAR6]], ptr [[_TMP7]], align 81065// CHECK9-NEXT: [[TMP8:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81066// CHECK9-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 41067// CHECK9-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP9]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1068// CHECK9-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41069// CHECK9-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP10]], 11070// CHECK9-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1071// CHECK9: cond.true:1072// CHECK9-NEXT: br label [[COND_END:%.*]]1073// CHECK9: cond.false:1074// CHECK9-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41075// CHECK9-NEXT: br label [[COND_END]]1076// CHECK9: cond.end:1077// CHECK9-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]1078// CHECK9-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41079// CHECK9-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41080// CHECK9-NEXT: store i32 [[TMP12]], ptr [[DOTOMP_IV]], align 41081// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1082// CHECK9: omp.inner.for.cond:1083// CHECK9-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41084// CHECK9-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41085// CHECK9-NEXT: [[CMP9:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]1086// CHECK9-NEXT: br i1 [[CMP9]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1087// CHECK9: omp.inner.for.cond.cleanup:1088// CHECK9-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1089// CHECK9: omp.inner.for.body:1090// CHECK9-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41091// CHECK9-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 11092// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1093// CHECK9-NEXT: store i32 [[ADD]], ptr [[I]], align 41094// CHECK9-NEXT: [[TMP16:%.*]] = load i32, ptr [[T_VAR3]], align 41095// CHECK9-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 41096// CHECK9-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP17]] to i641097// CHECK9-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC4]], i64 0, i64 [[IDXPROM]]1098// CHECK9-NEXT: store i32 [[TMP16]], ptr [[ARRAYIDX]], align 41099// CHECK9-NEXT: [[TMP18:%.*]] = load ptr, ptr [[_TMP7]], align 81100// CHECK9-NEXT: [[TMP19:%.*]] = load i32, ptr [[I]], align 41101// CHECK9-NEXT: [[IDXPROM10:%.*]] = sext i32 [[TMP19]] to i641102// CHECK9-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR5]], i64 0, i64 [[IDXPROM10]]1103// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX11]], ptr align 4 [[TMP18]], i64 4, i1 false)1104// CHECK9-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1105// CHECK9: omp.body.continue:1106// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1107// CHECK9: omp.inner.for.inc:1108// CHECK9-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41109// CHECK9-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP20]], 11110// CHECK9-NEXT: store i32 [[ADD12]], ptr [[DOTOMP_IV]], align 41111// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]1112// CHECK9: omp.inner.for.end:1113// CHECK9-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1114// CHECK9: omp.loop.exit:1115// CHECK9-NEXT: [[TMP21:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81116// CHECK9-NEXT: [[TMP22:%.*]] = load i32, ptr [[TMP21]], align 41117// CHECK9-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP22]])1118// CHECK9-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41119// CHECK9-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 01120// CHECK9-NEXT: br i1 [[TMP24]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]1121// CHECK9: .omp.lastprivate.then:1122// CHECK9-NEXT: [[TMP25:%.*]] = load i32, ptr [[T_VAR3]], align 41123// CHECK9-NEXT: store i32 [[TMP25]], ptr [[TMP1]], align 41124// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP0]], ptr align 4 [[VEC4]], i64 8, i1 false)1125// CHECK9-NEXT: [[ARRAY_BEGIN13:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[TMP2]], i32 0, i32 01126// CHECK9-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN13]], i64 21127// CHECK9-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN13]], [[TMP26]]1128// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE14:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1129// CHECK9: omp.arraycpy.body:1130// CHECK9-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR5]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1131// CHECK9-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN13]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1132// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 4, i1 false)1133// CHECK9-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11134// CHECK9-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11135// CHECK9-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP26]]1136// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE14]], label [[OMP_ARRAYCPY_BODY]]1137// CHECK9: omp.arraycpy.done14:1138// CHECK9-NEXT: [[TMP27:%.*]] = load ptr, ptr [[_TMP7]], align 81139// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP7]], ptr align 4 [[TMP27]], i64 4, i1 false)1140// CHECK9-NEXT: [[TMP28:%.*]] = load i32, ptr [[SVAR8]], align 41141// CHECK9-NEXT: store i32 [[TMP28]], ptr [[TMP4]], align 41142// CHECK9-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]1143// CHECK9: .omp.lastprivate.done:1144// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR6]]) #[[ATTR4]]1145// CHECK9-NEXT: [[ARRAY_BEGIN15:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR5]], i32 0, i32 01146// CHECK9-NEXT: [[TMP29:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN15]], i64 21147// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1148// CHECK9: arraydestroy.body:1149// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP29]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1150// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11151// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1152// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN15]]1153// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE16:%.*]], label [[ARRAYDESTROY_BODY]]1154// CHECK9: arraydestroy.done16:1155// CHECK9-NEXT: ret void1156//1157//1158// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfED1Ev1159// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1160// CHECK9-NEXT: entry:1161// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81162// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81163// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81164// CHECK9-NEXT: call void @_ZN1SIfED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]1165// CHECK9-NEXT: ret void1166//1167//1168// CHECK9-LABEL: define {{[^@]+}}@_Z5tmainIiET_v1169// CHECK9-SAME: () #[[ATTR1]] comdat {1170// CHECK9-NEXT: entry:1171// CHECK9-NEXT: [[RETVAL:%.*]] = alloca i32, align 41172// CHECK9-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S_0:%.*]], align 41173// CHECK9-NEXT: [[T_VAR:%.*]] = alloca i32, align 41174// CHECK9-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 41175// CHECK9-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 41176// CHECK9-NEXT: [[VAR:%.*]] = alloca ptr, align 81177// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 81178// CHECK9-NEXT: [[T_VAR_CASTED:%.*]] = alloca i64, align 81179// CHECK9-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x ptr], align 81180// CHECK9-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x ptr], align 81181// CHECK9-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x ptr], align 81182// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 41183// CHECK9-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 81184// CHECK9-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])1185// CHECK9-NEXT: store i32 0, ptr [[T_VAR]], align 41186// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const._Z5tmainIiET_v.vec, i64 8, i1 false)1187// CHECK9-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], i32 noundef signext 1)1188// CHECK9-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 11189// CHECK9-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], i32 noundef signext 2)1190// CHECK9-NEXT: store ptr [[TEST]], ptr [[VAR]], align 81191// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 81192// CHECK9-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 81193// CHECK9-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_VAR]], align 41194// CHECK9-NEXT: store i32 [[TMP1]], ptr [[T_VAR_CASTED]], align 41195// CHECK9-NEXT: [[TMP2:%.*]] = load i64, ptr [[T_VAR_CASTED]], align 81196// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 81197// CHECK9-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 81198// CHECK9-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 81199// CHECK9-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01200// CHECK9-NEXT: store i64 [[TMP2]], ptr [[TMP6]], align 81201// CHECK9-NEXT: [[TMP7:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01202// CHECK9-NEXT: store i64 [[TMP2]], ptr [[TMP7]], align 81203// CHECK9-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 01204// CHECK9-NEXT: store ptr null, ptr [[TMP8]], align 81205// CHECK9-NEXT: [[TMP9:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 11206// CHECK9-NEXT: store ptr [[VEC]], ptr [[TMP9]], align 81207// CHECK9-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 11208// CHECK9-NEXT: store ptr [[VEC]], ptr [[TMP10]], align 81209// CHECK9-NEXT: [[TMP11:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 11210// CHECK9-NEXT: store ptr null, ptr [[TMP11]], align 81211// CHECK9-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 21212// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[TMP12]], align 81213// CHECK9-NEXT: [[TMP13:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 21214// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[TMP13]], align 81215// CHECK9-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 21216// CHECK9-NEXT: store ptr null, ptr [[TMP14]], align 81217// CHECK9-NEXT: [[TMP15:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 31218// CHECK9-NEXT: store ptr [[TMP4]], ptr [[TMP15]], align 81219// CHECK9-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 31220// CHECK9-NEXT: store ptr [[TMP5]], ptr [[TMP16]], align 81221// CHECK9-NEXT: [[TMP17:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 31222// CHECK9-NEXT: store ptr null, ptr [[TMP17]], align 81223// CHECK9-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01224// CHECK9-NEXT: [[TMP19:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01225// CHECK9-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 01226// CHECK9-NEXT: store i32 3, ptr [[TMP20]], align 41227// CHECK9-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11228// CHECK9-NEXT: store i32 4, ptr [[TMP21]], align 41229// CHECK9-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 21230// CHECK9-NEXT: store ptr [[TMP18]], ptr [[TMP22]], align 81231// CHECK9-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 31232// CHECK9-NEXT: store ptr [[TMP19]], ptr [[TMP23]], align 81233// CHECK9-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 41234// CHECK9-NEXT: store ptr @.offload_sizes.1, ptr [[TMP24]], align 81235// CHECK9-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 51236// CHECK9-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP25]], align 81237// CHECK9-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 61238// CHECK9-NEXT: store ptr null, ptr [[TMP26]], align 81239// CHECK9-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 71240// CHECK9-NEXT: store ptr null, ptr [[TMP27]], align 81241// CHECK9-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 81242// CHECK9-NEXT: store i64 2, ptr [[TMP28]], align 81243// CHECK9-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 91244// CHECK9-NEXT: store i64 0, ptr [[TMP29]], align 81245// CHECK9-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 101246// CHECK9-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP30]], align 41247// CHECK9-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 111248// CHECK9-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP31]], align 41249// CHECK9-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 121250// CHECK9-NEXT: store i32 0, ptr [[TMP32]], align 41251// CHECK9-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB3]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.region_id, ptr [[KERNEL_ARGS]])1252// CHECK9-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 01253// CHECK9-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]1254// CHECK9: omp_offload.failed:1255// CHECK9-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49(i64 [[TMP2]], ptr [[VEC]], ptr [[S_ARR]], ptr [[TMP3]]) #[[ATTR4]]1256// CHECK9-NEXT: br label [[OMP_OFFLOAD_CONT]]1257// CHECK9: omp_offload.cont:1258// CHECK9-NEXT: store i32 0, ptr [[RETVAL]], align 41259// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01260// CHECK9-NEXT: [[TMP35:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 21261// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1262// CHECK9: arraydestroy.body:1263// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP35]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1264// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11265// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1266// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]1267// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]1268// CHECK9: arraydestroy.done2:1269// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]1270// CHECK9-NEXT: [[TMP36:%.*]] = load i32, ptr [[RETVAL]], align 41271// CHECK9-NEXT: ret i32 [[TMP36]]1272//1273//1274// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev1275// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1276// CHECK9-NEXT: entry:1277// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81278// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81279// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81280// CHECK9-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 01281// CHECK9-NEXT: store float 0.000000e+00, ptr [[F]], align 41282// CHECK9-NEXT: ret void1283//1284//1285// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef1286// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {1287// CHECK9-NEXT: entry:1288// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81289// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca float, align 41290// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81291// CHECK9-NEXT: store float [[A]], ptr [[A_ADDR]], align 41292// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81293// CHECK9-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 01294// CHECK9-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 41295// CHECK9-NEXT: store float [[TMP0]], ptr [[F]], align 41296// CHECK9-NEXT: ret void1297//1298//1299// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev1300// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1301// CHECK9-NEXT: entry:1302// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81303// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81304// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81305// CHECK9-NEXT: ret void1306//1307//1308// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ev1309// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1310// CHECK9-NEXT: entry:1311// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81312// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81313// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81314// CHECK9-NEXT: call void @_ZN1SIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])1315// CHECK9-NEXT: ret void1316//1317//1318// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ei1319// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef signext [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {1320// CHECK9-NEXT: entry:1321// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81322// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i32, align 41323// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81324// CHECK9-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 41325// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81326// CHECK9-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 41327// CHECK9-NEXT: call void @_ZN1SIiEC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef signext [[TMP0]])1328// CHECK9-NEXT: ret void1329//1330//1331// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l491332// CHECK9-SAME: (i64 noundef [[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:%.*]]) #[[ATTR3]] {1333// CHECK9-NEXT: entry:1334// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca i64, align 81335// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 81336// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 81337// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 81338// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 81339// CHECK9-NEXT: store i64 [[T_VAR]], ptr [[T_VAR_ADDR]], align 81340// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 81341// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 81342// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 81343// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 81344// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 81345// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR_ADDR]], align 81346// CHECK9-NEXT: store ptr [[TMP2]], ptr [[TMP]], align 81347// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 81348// CHECK9-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3]], i32 4, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined, ptr [[TMP0]], ptr [[T_VAR_ADDR]], ptr [[TMP1]], ptr [[TMP3]])1349// CHECK9-NEXT: ret void1350//1351//1352// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined1353// CHECK9-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], 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:%.*]]) #[[ATTR3]] {1354// CHECK9-NEXT: entry:1355// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81356// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81357// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 81358// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 81359// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 81360// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 81361// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 81362// CHECK9-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41363// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 41364// CHECK9-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 41365// CHECK9-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 41366// CHECK9-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41367// CHECK9-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41368// CHECK9-NEXT: [[T_VAR2:%.*]] = alloca i32, align 41369// CHECK9-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 41370// CHECK9-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S.0], align 41371// CHECK9-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S_0:%.*]], align 41372// CHECK9-NEXT: [[_TMP6:%.*]] = alloca ptr, align 81373// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 41374// CHECK9-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81375// CHECK9-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81376// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 81377// CHECK9-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 81378// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 81379// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 81380// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 81381// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 81382// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 81383// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 81384// CHECK9-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 81385// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 41386// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_COMB_UB]], align 41387// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41388// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41389// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 01390// CHECK9-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 21391// CHECK9-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]1392// CHECK9: arrayctor.loop:1393// CHECK9-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1394// CHECK9-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1395// CHECK9-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i64 11396// CHECK9-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1397// CHECK9-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1398// CHECK9: arrayctor.cont:1399// CHECK9-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 81400// CHECK9-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])1401// CHECK9-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 81402// CHECK9-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81403// CHECK9-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 41404// CHECK9-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP6]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1405// CHECK9-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41406// CHECK9-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP7]], 11407// CHECK9-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1408// CHECK9: cond.true:1409// CHECK9-NEXT: br label [[COND_END:%.*]]1410// CHECK9: cond.false:1411// CHECK9-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41412// CHECK9-NEXT: br label [[COND_END]]1413// CHECK9: cond.end:1414// CHECK9-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]1415// CHECK9-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41416// CHECK9-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41417// CHECK9-NEXT: store i32 [[TMP9]], ptr [[DOTOMP_IV]], align 41418// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1419// CHECK9: omp.inner.for.cond:1420// CHECK9-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41421// CHECK9-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41422// CHECK9-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]1423// CHECK9-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1424// CHECK9: omp.inner.for.cond.cleanup:1425// CHECK9-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1426// CHECK9: omp.inner.for.body:1427// CHECK9-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41428// CHECK9-NEXT: [[TMP13:%.*]] = zext i32 [[TMP12]] to i641429// CHECK9-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41430// CHECK9-NEXT: [[TMP15:%.*]] = zext i32 [[TMP14]] to i641431// CHECK9-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP6]], align 81432// CHECK9-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 6, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined.omp_outlined, i64 [[TMP13]], i64 [[TMP15]], ptr [[VEC3]], ptr [[T_VAR2]], ptr [[S_ARR4]], ptr [[TMP16]])1433// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1434// CHECK9: omp.inner.for.inc:1435// CHECK9-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41436// CHECK9-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 41437// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]1438// CHECK9-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 41439// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]1440// CHECK9: omp.inner.for.end:1441// CHECK9-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1442// CHECK9: omp.loop.exit:1443// CHECK9-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81444// CHECK9-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 41445// CHECK9-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP20]])1446// CHECK9-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41447// CHECK9-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 01448// CHECK9-NEXT: br i1 [[TMP22]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]1449// CHECK9: .omp.lastprivate.then:1450// CHECK9-NEXT: [[TMP23:%.*]] = load i32, ptr [[T_VAR2]], align 41451// CHECK9-NEXT: store i32 [[TMP23]], ptr [[TMP1]], align 41452// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i64 8, i1 false)1453// CHECK9-NEXT: [[ARRAY_BEGIN8:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[TMP2]], i32 0, i32 01454// CHECK9-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN8]], i64 21455// CHECK9-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN8]], [[TMP24]]1456// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE9:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1457// CHECK9: omp.arraycpy.body:1458// CHECK9-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1459// CHECK9-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN8]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1460// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 4, i1 false)1461// CHECK9-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11462// CHECK9-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11463// CHECK9-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP24]]1464// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE9]], label [[OMP_ARRAYCPY_BODY]]1465// CHECK9: omp.arraycpy.done9:1466// CHECK9-NEXT: [[TMP25:%.*]] = load ptr, ptr [[_TMP6]], align 81467// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP4]], ptr align 4 [[TMP25]], i64 4, i1 false)1468// CHECK9-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]1469// CHECK9: .omp.lastprivate.done:1470// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]1471// CHECK9-NEXT: [[ARRAY_BEGIN10:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 01472// CHECK9-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN10]], i64 21473// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1474// CHECK9: arraydestroy.body:1475// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP26]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1476// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11477// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1478// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN10]]1479// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE11:%.*]], label [[ARRAYDESTROY_BODY]]1480// CHECK9: arraydestroy.done11:1481// CHECK9-NEXT: ret void1482//1483//1484// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined.omp_outlined1485// CHECK9-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], 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:%.*]]) #[[ATTR3]] {1486// CHECK9-NEXT: entry:1487// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81488// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81489// CHECK9-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 81490// CHECK9-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 81491// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 81492// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 81493// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 81494// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 81495// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 81496// CHECK9-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41497// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 41498// CHECK9-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41499// CHECK9-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41500// CHECK9-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41501// CHECK9-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41502// CHECK9-NEXT: [[T_VAR3:%.*]] = alloca i32, align 41503// CHECK9-NEXT: [[VEC4:%.*]] = alloca [2 x i32], align 41504// CHECK9-NEXT: [[S_ARR5:%.*]] = alloca [2 x %struct.S.0], align 41505// CHECK9-NEXT: [[VAR6:%.*]] = alloca [[STRUCT_S_0:%.*]], align 41506// CHECK9-NEXT: [[_TMP7:%.*]] = alloca ptr, align 81507// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 41508// CHECK9-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81509// CHECK9-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81510// CHECK9-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 81511// CHECK9-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 81512// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 81513// CHECK9-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 81514// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 81515// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 81516// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 81517// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 81518// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 81519// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 81520// CHECK9-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 81521// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41522// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 41523// CHECK9-NEXT: [[TMP4:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 81524// CHECK9-NEXT: [[CONV:%.*]] = trunc i64 [[TMP4]] to i321525// CHECK9-NEXT: [[TMP5:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 81526// CHECK9-NEXT: [[CONV2:%.*]] = trunc i64 [[TMP5]] to i321527// CHECK9-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 41528// CHECK9-NEXT: store i32 [[CONV2]], ptr [[DOTOMP_UB]], align 41529// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41530// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41531// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR5]], i32 0, i32 01532// CHECK9-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 21533// CHECK9-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]1534// CHECK9: arrayctor.loop:1535// CHECK9-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1536// CHECK9-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1537// CHECK9-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i64 11538// CHECK9-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1539// CHECK9-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1540// CHECK9: arrayctor.cont:1541// CHECK9-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 81542// CHECK9-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR6]])1543// CHECK9-NEXT: store ptr [[VAR6]], ptr [[_TMP7]], align 81544// CHECK9-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81545// CHECK9-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41546// CHECK9-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1547// CHECK9-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41548// CHECK9-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP9]], 11549// CHECK9-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1550// CHECK9: cond.true:1551// CHECK9-NEXT: br label [[COND_END:%.*]]1552// CHECK9: cond.false:1553// CHECK9-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41554// CHECK9-NEXT: br label [[COND_END]]1555// CHECK9: cond.end:1556// CHECK9-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP10]], [[COND_FALSE]] ]1557// CHECK9-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41558// CHECK9-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41559// CHECK9-NEXT: store i32 [[TMP11]], ptr [[DOTOMP_IV]], align 41560// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1561// CHECK9: omp.inner.for.cond:1562// CHECK9-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41563// CHECK9-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41564// CHECK9-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]1565// CHECK9-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1566// CHECK9: omp.inner.for.cond.cleanup:1567// CHECK9-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1568// CHECK9: omp.inner.for.body:1569// CHECK9-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41570// CHECK9-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP14]], 11571// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1572// CHECK9-NEXT: store i32 [[ADD]], ptr [[I]], align 41573// CHECK9-NEXT: [[TMP15:%.*]] = load i32, ptr [[T_VAR3]], align 41574// CHECK9-NEXT: [[TMP16:%.*]] = load i32, ptr [[I]], align 41575// CHECK9-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP16]] to i641576// CHECK9-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC4]], i64 0, i64 [[IDXPROM]]1577// CHECK9-NEXT: store i32 [[TMP15]], ptr [[ARRAYIDX]], align 41578// CHECK9-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP7]], align 81579// CHECK9-NEXT: [[TMP18:%.*]] = load i32, ptr [[I]], align 41580// CHECK9-NEXT: [[IDXPROM9:%.*]] = sext i32 [[TMP18]] to i641581// CHECK9-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR5]], i64 0, i64 [[IDXPROM9]]1582// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX10]], ptr align 4 [[TMP17]], i64 4, i1 false)1583// CHECK9-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1584// CHECK9: omp.body.continue:1585// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1586// CHECK9: omp.inner.for.inc:1587// CHECK9-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41588// CHECK9-NEXT: [[ADD11:%.*]] = add nsw i32 [[TMP19]], 11589// CHECK9-NEXT: store i32 [[ADD11]], ptr [[DOTOMP_IV]], align 41590// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]1591// CHECK9: omp.inner.for.end:1592// CHECK9-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1593// CHECK9: omp.loop.exit:1594// CHECK9-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81595// CHECK9-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41596// CHECK9-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP21]])1597// CHECK9-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41598// CHECK9-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 01599// CHECK9-NEXT: br i1 [[TMP23]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]1600// CHECK9: .omp.lastprivate.then:1601// CHECK9-NEXT: [[TMP24:%.*]] = load i32, ptr [[T_VAR3]], align 41602// CHECK9-NEXT: store i32 [[TMP24]], ptr [[TMP1]], align 41603// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP0]], ptr align 4 [[VEC4]], i64 8, i1 false)1604// CHECK9-NEXT: [[ARRAY_BEGIN12:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[TMP2]], i32 0, i32 01605// CHECK9-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN12]], i64 21606// CHECK9-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN12]], [[TMP25]]1607// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE13:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1608// CHECK9: omp.arraycpy.body:1609// CHECK9-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR5]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1610// CHECK9-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN12]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1611// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[OMP_ARRAYCPY_SRCELEMENTPAST]], i64 4, i1 false)1612// CHECK9-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11613// CHECK9-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11614// CHECK9-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]]1615// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE13]], label [[OMP_ARRAYCPY_BODY]]1616// CHECK9: omp.arraycpy.done13:1617// CHECK9-NEXT: [[TMP26:%.*]] = load ptr, ptr [[_TMP7]], align 81618// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP6]], ptr align 4 [[TMP26]], i64 4, i1 false)1619// CHECK9-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]1620// CHECK9: .omp.lastprivate.done:1621// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR6]]) #[[ATTR4]]1622// CHECK9-NEXT: [[ARRAY_BEGIN14:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR5]], i32 0, i32 01623// CHECK9-NEXT: [[TMP27:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN14]], i64 21624// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1625// CHECK9: arraydestroy.body:1626// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP27]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1627// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11628// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1629// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN14]]1630// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE15:%.*]], label [[ARRAYDESTROY_BODY]]1631// CHECK9: arraydestroy.done15:1632// CHECK9-NEXT: ret void1633//1634//1635// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiED1Ev1636// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1637// CHECK9-NEXT: entry:1638// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81639// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81640// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81641// CHECK9-NEXT: call void @_ZN1SIiED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]1642// CHECK9-NEXT: ret void1643//1644//1645// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ev1646// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1647// CHECK9-NEXT: entry:1648// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81649// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81650// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81651// CHECK9-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01652// CHECK9-NEXT: store i32 0, ptr [[F]], align 41653// CHECK9-NEXT: ret void1654//1655//1656// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ei1657// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef signext [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {1658// CHECK9-NEXT: entry:1659// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81660// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i32, align 41661// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81662// CHECK9-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 41663// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81664// CHECK9-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01665// CHECK9-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 41666// CHECK9-NEXT: store i32 [[TMP0]], ptr [[F]], align 41667// CHECK9-NEXT: ret void1668//1669//1670// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiED2Ev1671// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1672// CHECK9-NEXT: entry:1673// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81674// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81675// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81676// CHECK9-NEXT: ret void1677//1678//1679// CHECK11-LABEL: define {{[^@]+}}@main1680// CHECK11-SAME: () #[[ATTR0:[0-9]+]] {1681// CHECK11-NEXT: entry:1682// CHECK11-NEXT: [[RETVAL:%.*]] = alloca i32, align 41683// CHECK11-NEXT: [[G:%.*]] = alloca double, align 81684// CHECK11-NEXT: [[G1:%.*]] = alloca ptr, align 41685// CHECK11-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S:%.*]], align 41686// CHECK11-NEXT: [[T_VAR:%.*]] = alloca i32, align 41687// CHECK11-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 41688// CHECK11-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S], align 41689// CHECK11-NEXT: [[VAR:%.*]] = alloca ptr, align 41690// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41691// CHECK11-NEXT: [[T_VAR_CASTED:%.*]] = alloca i32, align 41692// CHECK11-NEXT: [[SVAR_CASTED:%.*]] = alloca i32, align 41693// CHECK11-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [5 x ptr], align 41694// CHECK11-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [5 x ptr], align 41695// CHECK11-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [5 x ptr], align 41696// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 41697// CHECK11-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 81698// CHECK11-NEXT: [[I:%.*]] = alloca i32, align 41699// CHECK11-NEXT: store i32 0, ptr [[RETVAL]], align 41700// CHECK11-NEXT: store ptr [[G]], ptr [[G1]], align 41701// CHECK11-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])1702// CHECK11-NEXT: store i32 0, ptr [[T_VAR]], align 41703// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[VEC]], ptr align 4 @__const.main.vec, i32 8, i1 false)1704// CHECK11-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], float noundef 1.000000e+00)1705// CHECK11-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i32 11706// CHECK11-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], float noundef 2.000000e+00)1707// CHECK11-NEXT: store ptr [[TEST]], ptr [[VAR]], align 41708// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 41709// CHECK11-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 41710// CHECK11-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_VAR]], align 41711// CHECK11-NEXT: store i32 [[TMP1]], ptr [[T_VAR_CASTED]], align 41712// CHECK11-NEXT: [[TMP2:%.*]] = load i32, ptr [[T_VAR_CASTED]], align 41713// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 41714// CHECK11-NEXT: [[TMP4:%.*]] = load i32, ptr @_ZZ4mainE4svar, align 41715// CHECK11-NEXT: store i32 [[TMP4]], ptr [[SVAR_CASTED]], align 41716// CHECK11-NEXT: [[TMP5:%.*]] = load i32, ptr [[SVAR_CASTED]], align 41717// CHECK11-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 41718// CHECK11-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP]], align 41719// CHECK11-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01720// CHECK11-NEXT: store i32 [[TMP2]], ptr [[TMP8]], align 41721// CHECK11-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01722// CHECK11-NEXT: store i32 [[TMP2]], ptr [[TMP9]], align 41723// CHECK11-NEXT: [[TMP10:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 01724// CHECK11-NEXT: store ptr null, ptr [[TMP10]], align 41725// CHECK11-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 11726// CHECK11-NEXT: store ptr [[VEC]], ptr [[TMP11]], align 41727// CHECK11-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 11728// CHECK11-NEXT: store ptr [[VEC]], ptr [[TMP12]], align 41729// CHECK11-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 11730// CHECK11-NEXT: store ptr null, ptr [[TMP13]], align 41731// CHECK11-NEXT: [[TMP14:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 21732// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[TMP14]], align 41733// CHECK11-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 21734// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[TMP15]], align 41735// CHECK11-NEXT: [[TMP16:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 21736// CHECK11-NEXT: store ptr null, ptr [[TMP16]], align 41737// CHECK11-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 31738// CHECK11-NEXT: store ptr [[TMP6]], ptr [[TMP17]], align 41739// CHECK11-NEXT: [[TMP18:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 31740// CHECK11-NEXT: store ptr [[TMP7]], ptr [[TMP18]], align 41741// CHECK11-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 31742// CHECK11-NEXT: store ptr null, ptr [[TMP19]], align 41743// CHECK11-NEXT: [[TMP20:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 41744// CHECK11-NEXT: store i32 [[TMP5]], ptr [[TMP20]], align 41745// CHECK11-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 41746// CHECK11-NEXT: store i32 [[TMP5]], ptr [[TMP21]], align 41747// CHECK11-NEXT: [[TMP22:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 41748// CHECK11-NEXT: store ptr null, ptr [[TMP22]], align 41749// CHECK11-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01750// CHECK11-NEXT: [[TMP24:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01751// CHECK11-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 01752// CHECK11-NEXT: store i32 3, ptr [[TMP25]], align 41753// CHECK11-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11754// CHECK11-NEXT: store i32 5, ptr [[TMP26]], align 41755// CHECK11-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 21756// CHECK11-NEXT: store ptr [[TMP23]], ptr [[TMP27]], align 41757// CHECK11-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 31758// CHECK11-NEXT: store ptr [[TMP24]], ptr [[TMP28]], align 41759// CHECK11-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 41760// CHECK11-NEXT: store ptr @.offload_sizes, ptr [[TMP29]], align 41761// CHECK11-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 51762// CHECK11-NEXT: store ptr @.offload_maptypes, ptr [[TMP30]], align 41763// CHECK11-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 61764// CHECK11-NEXT: store ptr null, ptr [[TMP31]], align 41765// CHECK11-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 71766// CHECK11-NEXT: store ptr null, ptr [[TMP32]], align 41767// CHECK11-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 81768// CHECK11-NEXT: store i64 2, ptr [[TMP33]], align 81769// CHECK11-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 91770// CHECK11-NEXT: store i64 0, ptr [[TMP34]], align 81771// CHECK11-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 101772// CHECK11-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP35]], align 41773// CHECK11-NEXT: [[TMP36:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 111774// CHECK11-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP36]], align 41775// CHECK11-NEXT: [[TMP37:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 121776// CHECK11-NEXT: store i32 0, ptr [[TMP37]], align 41777// CHECK11-NEXT: [[TMP38:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB3:[0-9]+]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.region_id, ptr [[KERNEL_ARGS]])1778// CHECK11-NEXT: [[TMP39:%.*]] = icmp ne i32 [[TMP38]], 01779// CHECK11-NEXT: br i1 [[TMP39]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]1780// CHECK11: omp_offload.failed:1781// CHECK11-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106(i32 [[TMP2]], ptr [[VEC]], ptr [[S_ARR]], ptr [[TMP3]], i32 [[TMP5]]) #[[ATTR4:[0-9]+]]1782// CHECK11-NEXT: br label [[OMP_OFFLOAD_CONT]]1783// CHECK11: omp_offload.cont:1784// CHECK11-NEXT: [[CALL:%.*]] = call noundef i32 @_Z5tmainIiET_v()1785// CHECK11-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 41786// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 01787// CHECK11-NEXT: [[TMP40:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i32 21788// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1789// CHECK11: arraydestroy.body:1790// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP40]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1791// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11792// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1793// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]1794// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]1795// CHECK11: arraydestroy.done2:1796// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]1797// CHECK11-NEXT: [[TMP41:%.*]] = load i32, ptr [[RETVAL]], align 41798// CHECK11-NEXT: ret i32 [[TMP41]]1799//1800//1801// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ev1802// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {1803// CHECK11-NEXT: entry:1804// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41805// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41806// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41807// CHECK11-NEXT: call void @_ZN1SIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])1808// CHECK11-NEXT: ret void1809//1810//1811// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ef1812// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1813// CHECK11-NEXT: entry:1814// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41815// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca float, align 41816// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41817// CHECK11-NEXT: store float [[A]], ptr [[A_ADDR]], align 41818// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41819// CHECK11-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 41820// CHECK11-NEXT: call void @_ZN1SIfEC2Ef(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], float noundef [[TMP0]])1821// CHECK11-NEXT: ret void1822//1823//1824// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l1061825// CHECK11-SAME: (i32 noundef [[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:%.*]], i32 noundef [[SVAR:%.*]]) #[[ATTR3:[0-9]+]] {1826// CHECK11-NEXT: entry:1827// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca i32, align 41828// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 41829// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 41830// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 41831// CHECK11-NEXT: [[SVAR_ADDR:%.*]] = alloca i32, align 41832// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41833// CHECK11-NEXT: store i32 [[T_VAR]], ptr [[T_VAR_ADDR]], align 41834// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 41835// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 41836// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 41837// CHECK11-NEXT: store i32 [[SVAR]], ptr [[SVAR_ADDR]], align 41838// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 41839// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 41840// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR_ADDR]], align 41841// CHECK11-NEXT: store ptr [[TMP2]], ptr [[TMP]], align 41842// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 41843// CHECK11-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3]], i32 5, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.omp_outlined, ptr [[TMP0]], ptr [[T_VAR_ADDR]], ptr [[TMP1]], ptr [[TMP3]], ptr [[SVAR_ADDR]])1844// CHECK11-NEXT: ret void1845//1846//1847// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.omp_outlined1848// CHECK11-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], 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:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SVAR:%.*]]) #[[ATTR3]] {1849// CHECK11-NEXT: entry:1850// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41851// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41852// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 41853// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 41854// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 41855// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 41856// CHECK11-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 41857// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41858// CHECK11-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41859// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 41860// CHECK11-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 41861// CHECK11-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 41862// CHECK11-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41863// CHECK11-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41864// CHECK11-NEXT: [[T_VAR2:%.*]] = alloca i32, align 41865// CHECK11-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 41866// CHECK11-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S], align 41867// CHECK11-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S:%.*]], align 41868// CHECK11-NEXT: [[_TMP6:%.*]] = alloca ptr, align 41869// CHECK11-NEXT: [[SVAR7:%.*]] = alloca i32, align 41870// CHECK11-NEXT: [[I:%.*]] = alloca i32, align 41871// CHECK11-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41872// CHECK11-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41873// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 41874// CHECK11-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 41875// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 41876// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 41877// CHECK11-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 41878// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 41879// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 41880// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 41881// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 41882// CHECK11-NEXT: [[TMP4:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 41883// CHECK11-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 41884// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 41885// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_COMB_UB]], align 41886// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41887// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41888// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 01889// CHECK11-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i32 21890// CHECK11-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]1891// CHECK11: arrayctor.loop:1892// CHECK11-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1893// CHECK11-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1894// CHECK11-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i32 11895// CHECK11-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1896// CHECK11-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1897// CHECK11: arrayctor.cont:1898// CHECK11-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 41899// CHECK11-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])1900// CHECK11-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 41901// CHECK11-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41902// CHECK11-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 41903// CHECK11-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP7]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1904// CHECK11-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41905// CHECK11-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP8]], 11906// CHECK11-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1907// CHECK11: cond.true:1908// CHECK11-NEXT: br label [[COND_END:%.*]]1909// CHECK11: cond.false:1910// CHECK11-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41911// CHECK11-NEXT: br label [[COND_END]]1912// CHECK11: cond.end:1913// CHECK11-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]1914// CHECK11-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41915// CHECK11-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41916// CHECK11-NEXT: store i32 [[TMP10]], ptr [[DOTOMP_IV]], align 41917// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1918// CHECK11: omp.inner.for.cond:1919// CHECK11-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41920// CHECK11-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41921// CHECK11-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]1922// CHECK11-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1923// CHECK11: omp.inner.for.cond.cleanup:1924// CHECK11-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1925// CHECK11: omp.inner.for.body:1926// CHECK11-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41927// CHECK11-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41928// CHECK11-NEXT: [[TMP15:%.*]] = load ptr, ptr [[_TMP6]], align 41929// CHECK11-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 7, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.omp_outlined.omp_outlined, i32 [[TMP13]], i32 [[TMP14]], ptr [[VEC3]], ptr [[T_VAR2]], ptr [[S_ARR4]], ptr [[TMP15]], ptr [[SVAR7]])1930// CHECK11-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1931// CHECK11: omp.inner.for.inc:1932// CHECK11-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41933// CHECK11-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 41934// CHECK11-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]1935// CHECK11-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 41936// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND]]1937// CHECK11: omp.inner.for.end:1938// CHECK11-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1939// CHECK11: omp.loop.exit:1940// CHECK11-NEXT: [[TMP18:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41941// CHECK11-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP18]], align 41942// CHECK11-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP19]])1943// CHECK11-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41944// CHECK11-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 01945// CHECK11-NEXT: br i1 [[TMP21]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]1946// CHECK11: .omp.lastprivate.then:1947// CHECK11-NEXT: [[TMP22:%.*]] = load i32, ptr [[T_VAR2]], align 41948// CHECK11-NEXT: store i32 [[TMP22]], ptr [[TMP1]], align 41949// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i32 8, i1 false)1950// CHECK11-NEXT: [[ARRAY_BEGIN9:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[TMP2]], i32 0, i32 01951// CHECK11-NEXT: [[TMP23:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN9]], i32 21952// CHECK11-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN9]], [[TMP23]]1953// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE10:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1954// CHECK11: omp.arraycpy.body:1955// CHECK11-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1956// CHECK11-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN9]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1957// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 4, i1 false)1958// CHECK11-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11959// CHECK11-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11960// CHECK11-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP23]]1961// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE10]], label [[OMP_ARRAYCPY_BODY]]1962// CHECK11: omp.arraycpy.done10:1963// CHECK11-NEXT: [[TMP24:%.*]] = load ptr, ptr [[_TMP6]], align 41964// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP5]], ptr align 4 [[TMP24]], i32 4, i1 false)1965// CHECK11-NEXT: [[TMP25:%.*]] = load i32, ptr [[SVAR7]], align 41966// CHECK11-NEXT: store i32 [[TMP25]], ptr [[TMP4]], align 41967// CHECK11-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]1968// CHECK11: .omp.lastprivate.done:1969// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]1970// CHECK11-NEXT: [[ARRAY_BEGIN11:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 01971// CHECK11-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN11]], i32 21972// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1973// CHECK11: arraydestroy.body:1974// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP26]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1975// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11976// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1977// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN11]]1978// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE12:%.*]], label [[ARRAYDESTROY_BODY]]1979// CHECK11: arraydestroy.done12:1980// CHECK11-NEXT: ret void1981//1982//1983// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l106.omp_outlined.omp_outlined1984// CHECK11-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], 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:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SVAR:%.*]]) #[[ATTR3]] {1985// CHECK11-NEXT: entry:1986// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41987// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41988// CHECK11-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 41989// CHECK11-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 41990// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 41991// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 41992// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 41993// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 41994// CHECK11-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 41995// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41996// CHECK11-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41997// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 41998// CHECK11-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41999// CHECK11-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42000// CHECK11-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42001// CHECK11-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42002// CHECK11-NEXT: [[T_VAR2:%.*]] = alloca i32, align 42003// CHECK11-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 42004// CHECK11-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S], align 42005// CHECK11-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S:%.*]], align 42006// CHECK11-NEXT: [[_TMP6:%.*]] = alloca ptr, align 42007// CHECK11-NEXT: [[SVAR7:%.*]] = alloca i32, align 42008// CHECK11-NEXT: [[I:%.*]] = alloca i32, align 42009// CHECK11-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 42010// CHECK11-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 42011// CHECK11-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 42012// CHECK11-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 42013// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 42014// CHECK11-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 42015// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 42016// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 42017// CHECK11-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 42018// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 42019// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 42020// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 42021// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 42022// CHECK11-NEXT: [[TMP4:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 42023// CHECK11-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 42024// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42025// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 42026// CHECK11-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 42027// CHECK11-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 42028// CHECK11-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_LB]], align 42029// CHECK11-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 42030// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42031// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42032// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 02033// CHECK11-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i32 22034// CHECK11-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]2035// CHECK11: arrayctor.loop:2036// CHECK11-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]2037// CHECK11-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])2038// CHECK11-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i32 12039// CHECK11-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]2040// CHECK11-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]2041// CHECK11: arrayctor.cont:2042// CHECK11-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP]], align 42043// CHECK11-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])2044// CHECK11-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 42045// CHECK11-NEXT: [[TMP8:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 42046// CHECK11-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 42047// CHECK11-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP9]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2048// CHECK11-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42049// CHECK11-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP10]], 12050// CHECK11-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2051// CHECK11: cond.true:2052// CHECK11-NEXT: br label [[COND_END:%.*]]2053// CHECK11: cond.false:2054// CHECK11-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42055// CHECK11-NEXT: br label [[COND_END]]2056// CHECK11: cond.end:2057// CHECK11-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]2058// CHECK11-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42059// CHECK11-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42060// CHECK11-NEXT: store i32 [[TMP12]], ptr [[DOTOMP_IV]], align 42061// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2062// CHECK11: omp.inner.for.cond:2063// CHECK11-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42064// CHECK11-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42065// CHECK11-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]2066// CHECK11-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2067// CHECK11: omp.inner.for.cond.cleanup:2068// CHECK11-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2069// CHECK11: omp.inner.for.body:2070// CHECK11-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42071// CHECK11-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 12072// CHECK11-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2073// CHECK11-NEXT: store i32 [[ADD]], ptr [[I]], align 42074// CHECK11-NEXT: [[TMP16:%.*]] = load i32, ptr [[T_VAR2]], align 42075// CHECK11-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 42076// CHECK11-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC3]], i32 0, i32 [[TMP17]]2077// CHECK11-NEXT: store i32 [[TMP16]], ptr [[ARRAYIDX]], align 42078// CHECK11-NEXT: [[TMP18:%.*]] = load ptr, ptr [[_TMP6]], align 42079// CHECK11-NEXT: [[TMP19:%.*]] = load i32, ptr [[I]], align 42080// CHECK11-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 [[TMP19]]2081// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[ARRAYIDX9]], ptr align 4 [[TMP18]], i32 4, i1 false)2082// CHECK11-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2083// CHECK11: omp.body.continue:2084// CHECK11-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2085// CHECK11: omp.inner.for.inc:2086// CHECK11-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42087// CHECK11-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP20]], 12088// CHECK11-NEXT: store i32 [[ADD10]], ptr [[DOTOMP_IV]], align 42089// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND]]2090// CHECK11: omp.inner.for.end:2091// CHECK11-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2092// CHECK11: omp.loop.exit:2093// CHECK11-NEXT: [[TMP21:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 42094// CHECK11-NEXT: [[TMP22:%.*]] = load i32, ptr [[TMP21]], align 42095// CHECK11-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP22]])2096// CHECK11-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 42097// CHECK11-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 02098// CHECK11-NEXT: br i1 [[TMP24]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]2099// CHECK11: .omp.lastprivate.then:2100// CHECK11-NEXT: [[TMP25:%.*]] = load i32, ptr [[T_VAR2]], align 42101// CHECK11-NEXT: store i32 [[TMP25]], ptr [[TMP1]], align 42102// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i32 8, i1 false)2103// CHECK11-NEXT: [[ARRAY_BEGIN11:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[TMP2]], i32 0, i32 02104// CHECK11-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN11]], i32 22105// CHECK11-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN11]], [[TMP26]]2106// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE12:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2107// CHECK11: omp.arraycpy.body:2108// CHECK11-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2109// CHECK11-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN11]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2110// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 4, i1 false)2111// CHECK11-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12112// CHECK11-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12113// CHECK11-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP26]]2114// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE12]], label [[OMP_ARRAYCPY_BODY]]2115// CHECK11: omp.arraycpy.done12:2116// CHECK11-NEXT: [[TMP27:%.*]] = load ptr, ptr [[_TMP6]], align 42117// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP7]], ptr align 4 [[TMP27]], i32 4, i1 false)2118// CHECK11-NEXT: [[TMP28:%.*]] = load i32, ptr [[SVAR7]], align 42119// CHECK11-NEXT: store i32 [[TMP28]], ptr [[TMP4]], align 42120// CHECK11-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]2121// CHECK11: .omp.lastprivate.done:2122// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]2123// CHECK11-NEXT: [[ARRAY_BEGIN13:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 02124// CHECK11-NEXT: [[TMP29:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN13]], i32 22125// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2126// CHECK11: arraydestroy.body:2127// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP29]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2128// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -12129// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]2130// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN13]]2131// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE14:%.*]], label [[ARRAYDESTROY_BODY]]2132// CHECK11: arraydestroy.done14:2133// CHECK11-NEXT: ret void2134//2135//2136// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfED1Ev2137// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2138// CHECK11-NEXT: entry:2139// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42140// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42141// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42142// CHECK11-NEXT: call void @_ZN1SIfED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]2143// CHECK11-NEXT: ret void2144//2145//2146// CHECK11-LABEL: define {{[^@]+}}@_Z5tmainIiET_v2147// CHECK11-SAME: () #[[ATTR1]] comdat {2148// CHECK11-NEXT: entry:2149// CHECK11-NEXT: [[RETVAL:%.*]] = alloca i32, align 42150// CHECK11-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S_0:%.*]], align 42151// CHECK11-NEXT: [[T_VAR:%.*]] = alloca i32, align 42152// CHECK11-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 42153// CHECK11-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 42154// CHECK11-NEXT: [[VAR:%.*]] = alloca ptr, align 42155// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 42156// CHECK11-NEXT: [[T_VAR_CASTED:%.*]] = alloca i32, align 42157// CHECK11-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x ptr], align 42158// CHECK11-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x ptr], align 42159// CHECK11-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x ptr], align 42160// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 42161// CHECK11-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 82162// CHECK11-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])2163// CHECK11-NEXT: store i32 0, ptr [[T_VAR]], align 42164// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[VEC]], ptr align 4 @__const._Z5tmainIiET_v.vec, i32 8, i1 false)2165// CHECK11-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], i32 noundef 1)2166// CHECK11-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i32 12167// CHECK11-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], i32 noundef 2)2168// CHECK11-NEXT: store ptr [[TEST]], ptr [[VAR]], align 42169// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 42170// CHECK11-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 42171// CHECK11-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_VAR]], align 42172// CHECK11-NEXT: store i32 [[TMP1]], ptr [[T_VAR_CASTED]], align 42173// CHECK11-NEXT: [[TMP2:%.*]] = load i32, ptr [[T_VAR_CASTED]], align 42174// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 42175// CHECK11-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 42176// CHECK11-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 42177// CHECK11-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 02178// CHECK11-NEXT: store i32 [[TMP2]], ptr [[TMP6]], align 42179// CHECK11-NEXT: [[TMP7:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 02180// CHECK11-NEXT: store i32 [[TMP2]], ptr [[TMP7]], align 42181// CHECK11-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 02182// CHECK11-NEXT: store ptr null, ptr [[TMP8]], align 42183// CHECK11-NEXT: [[TMP9:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 12184// CHECK11-NEXT: store ptr [[VEC]], ptr [[TMP9]], align 42185// CHECK11-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 12186// CHECK11-NEXT: store ptr [[VEC]], ptr [[TMP10]], align 42187// CHECK11-NEXT: [[TMP11:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 12188// CHECK11-NEXT: store ptr null, ptr [[TMP11]], align 42189// CHECK11-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 22190// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[TMP12]], align 42191// CHECK11-NEXT: [[TMP13:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 22192// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[TMP13]], align 42193// CHECK11-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 22194// CHECK11-NEXT: store ptr null, ptr [[TMP14]], align 42195// CHECK11-NEXT: [[TMP15:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 32196// CHECK11-NEXT: store ptr [[TMP4]], ptr [[TMP15]], align 42197// CHECK11-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 32198// CHECK11-NEXT: store ptr [[TMP5]], ptr [[TMP16]], align 42199// CHECK11-NEXT: [[TMP17:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 32200// CHECK11-NEXT: store ptr null, ptr [[TMP17]], align 42201// CHECK11-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 02202// CHECK11-NEXT: [[TMP19:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 02203// CHECK11-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 02204// CHECK11-NEXT: store i32 3, ptr [[TMP20]], align 42205// CHECK11-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12206// CHECK11-NEXT: store i32 4, ptr [[TMP21]], align 42207// CHECK11-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 22208// CHECK11-NEXT: store ptr [[TMP18]], ptr [[TMP22]], align 42209// CHECK11-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 32210// CHECK11-NEXT: store ptr [[TMP19]], ptr [[TMP23]], align 42211// CHECK11-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 42212// CHECK11-NEXT: store ptr @.offload_sizes.1, ptr [[TMP24]], align 42213// CHECK11-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 52214// CHECK11-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP25]], align 42215// CHECK11-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 62216// CHECK11-NEXT: store ptr null, ptr [[TMP26]], align 42217// CHECK11-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 72218// CHECK11-NEXT: store ptr null, ptr [[TMP27]], align 42219// CHECK11-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 82220// CHECK11-NEXT: store i64 2, ptr [[TMP28]], align 82221// CHECK11-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 92222// CHECK11-NEXT: store i64 0, ptr [[TMP29]], align 82223// CHECK11-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 102224// CHECK11-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP30]], align 42225// CHECK11-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 112226// CHECK11-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP31]], align 42227// CHECK11-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 122228// CHECK11-NEXT: store i32 0, ptr [[TMP32]], align 42229// CHECK11-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB3]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.region_id, ptr [[KERNEL_ARGS]])2230// CHECK11-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 02231// CHECK11-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]2232// CHECK11: omp_offload.failed:2233// CHECK11-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49(i32 [[TMP2]], ptr [[VEC]], ptr [[S_ARR]], ptr [[TMP3]]) #[[ATTR4]]2234// CHECK11-NEXT: br label [[OMP_OFFLOAD_CONT]]2235// CHECK11: omp_offload.cont:2236// CHECK11-NEXT: store i32 0, ptr [[RETVAL]], align 42237// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 02238// CHECK11-NEXT: [[TMP35:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i32 22239// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2240// CHECK11: arraydestroy.body:2241// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP35]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2242// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -12243// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]2244// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]2245// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]2246// CHECK11: arraydestroy.done2:2247// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]2248// CHECK11-NEXT: [[TMP36:%.*]] = load i32, ptr [[RETVAL]], align 42249// CHECK11-NEXT: ret i32 [[TMP36]]2250//2251//2252// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev2253// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2254// CHECK11-NEXT: entry:2255// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42256// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42257// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42258// CHECK11-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 02259// CHECK11-NEXT: store float 0.000000e+00, ptr [[F]], align 42260// CHECK11-NEXT: ret void2261//2262//2263// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef2264// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2265// CHECK11-NEXT: entry:2266// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42267// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca float, align 42268// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42269// CHECK11-NEXT: store float [[A]], ptr [[A_ADDR]], align 42270// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42271// CHECK11-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 02272// CHECK11-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 42273// CHECK11-NEXT: store float [[TMP0]], ptr [[F]], align 42274// CHECK11-NEXT: ret void2275//2276//2277// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev2278// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2279// CHECK11-NEXT: entry:2280// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42281// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42282// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42283// CHECK11-NEXT: ret void2284//2285//2286// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ev2287// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2288// CHECK11-NEXT: entry:2289// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42290// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42291// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42292// CHECK11-NEXT: call void @_ZN1SIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])2293// CHECK11-NEXT: ret void2294//2295//2296// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ei2297// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2298// CHECK11-NEXT: entry:2299// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42300// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca i32, align 42301// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42302// CHECK11-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 42303// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42304// CHECK11-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 42305// CHECK11-NEXT: call void @_ZN1SIiEC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]])2306// CHECK11-NEXT: ret void2307//2308//2309// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l492310// CHECK11-SAME: (i32 noundef [[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:%.*]]) #[[ATTR3]] {2311// CHECK11-NEXT: entry:2312// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca i32, align 42313// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 42314// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 42315// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 42316// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 42317// CHECK11-NEXT: store i32 [[T_VAR]], ptr [[T_VAR_ADDR]], align 42318// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 42319// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 42320// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 42321// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 42322// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 42323// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR_ADDR]], align 42324// CHECK11-NEXT: store ptr [[TMP2]], ptr [[TMP]], align 42325// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 42326// CHECK11-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3]], i32 4, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined, ptr [[TMP0]], ptr [[T_VAR_ADDR]], ptr [[TMP1]], ptr [[TMP3]])2327// CHECK11-NEXT: ret void2328//2329//2330// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined2331// CHECK11-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], 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:%.*]]) #[[ATTR3]] {2332// CHECK11-NEXT: entry:2333// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 42334// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 42335// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 42336// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 42337// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 42338// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 42339// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 42340// CHECK11-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42341// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 42342// CHECK11-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 42343// CHECK11-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 42344// CHECK11-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42345// CHECK11-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42346// CHECK11-NEXT: [[T_VAR2:%.*]] = alloca i32, align 42347// CHECK11-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 42348// CHECK11-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S.0], align 42349// CHECK11-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S_0:%.*]], align 42350// CHECK11-NEXT: [[_TMP6:%.*]] = alloca ptr, align 42351// CHECK11-NEXT: [[I:%.*]] = alloca i32, align 42352// CHECK11-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 42353// CHECK11-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 42354// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 42355// CHECK11-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 42356// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 42357// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 42358// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 42359// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 42360// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 42361// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 42362// CHECK11-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 42363// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 42364// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_COMB_UB]], align 42365// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42366// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42367// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 02368// CHECK11-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i32 22369// CHECK11-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]2370// CHECK11: arrayctor.loop:2371// CHECK11-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]2372// CHECK11-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])2373// CHECK11-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i32 12374// CHECK11-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]2375// CHECK11-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]2376// CHECK11: arrayctor.cont:2377// CHECK11-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 42378// CHECK11-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])2379// CHECK11-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 42380// CHECK11-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 42381// CHECK11-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 42382// CHECK11-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP6]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2383// CHECK11-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42384// CHECK11-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP7]], 12385// CHECK11-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2386// CHECK11: cond.true:2387// CHECK11-NEXT: br label [[COND_END:%.*]]2388// CHECK11: cond.false:2389// CHECK11-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42390// CHECK11-NEXT: br label [[COND_END]]2391// CHECK11: cond.end:2392// CHECK11-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]2393// CHECK11-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 42394// CHECK11-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42395// CHECK11-NEXT: store i32 [[TMP9]], ptr [[DOTOMP_IV]], align 42396// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2397// CHECK11: omp.inner.for.cond:2398// CHECK11-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42399// CHECK11-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42400// CHECK11-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]2401// CHECK11-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2402// CHECK11: omp.inner.for.cond.cleanup:2403// CHECK11-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2404// CHECK11: omp.inner.for.body:2405// CHECK11-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42406// CHECK11-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42407// CHECK11-NEXT: [[TMP14:%.*]] = load ptr, ptr [[_TMP6]], align 42408// CHECK11-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 6, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined.omp_outlined, i32 [[TMP12]], i32 [[TMP13]], ptr [[VEC3]], ptr [[T_VAR2]], ptr [[S_ARR4]], ptr [[TMP14]])2409// CHECK11-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2410// CHECK11: omp.inner.for.inc:2411// CHECK11-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42412// CHECK11-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42413// CHECK11-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP15]], [[TMP16]]2414// CHECK11-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 42415// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND]]2416// CHECK11: omp.inner.for.end:2417// CHECK11-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2418// CHECK11: omp.loop.exit:2419// CHECK11-NEXT: [[TMP17:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 42420// CHECK11-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 42421// CHECK11-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP18]])2422// CHECK11-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 42423// CHECK11-NEXT: [[TMP20:%.*]] = icmp ne i32 [[TMP19]], 02424// CHECK11-NEXT: br i1 [[TMP20]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]2425// CHECK11: .omp.lastprivate.then:2426// CHECK11-NEXT: [[TMP21:%.*]] = load i32, ptr [[T_VAR2]], align 42427// CHECK11-NEXT: store i32 [[TMP21]], ptr [[TMP1]], align 42428// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i32 8, i1 false)2429// CHECK11-NEXT: [[ARRAY_BEGIN8:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[TMP2]], i32 0, i32 02430// CHECK11-NEXT: [[TMP22:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN8]], i32 22431// CHECK11-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN8]], [[TMP22]]2432// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE9:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2433// CHECK11: omp.arraycpy.body:2434// CHECK11-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2435// CHECK11-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN8]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2436// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 4, i1 false)2437// CHECK11-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12438// CHECK11-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12439// CHECK11-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP22]]2440// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE9]], label [[OMP_ARRAYCPY_BODY]]2441// CHECK11: omp.arraycpy.done9:2442// CHECK11-NEXT: [[TMP23:%.*]] = load ptr, ptr [[_TMP6]], align 42443// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP4]], ptr align 4 [[TMP23]], i32 4, i1 false)2444// CHECK11-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]2445// CHECK11: .omp.lastprivate.done:2446// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]2447// CHECK11-NEXT: [[ARRAY_BEGIN10:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 02448// CHECK11-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN10]], i32 22449// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2450// CHECK11: arraydestroy.body:2451// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP24]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2452// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -12453// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]2454// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN10]]2455// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE11:%.*]], label [[ARRAYDESTROY_BODY]]2456// CHECK11: arraydestroy.done11:2457// CHECK11-NEXT: ret void2458//2459//2460// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined.omp_outlined2461// CHECK11-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], 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:%.*]]) #[[ATTR3]] {2462// CHECK11-NEXT: entry:2463// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 42464// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 42465// CHECK11-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 42466// CHECK11-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 42467// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 42468// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 42469// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 42470// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 42471// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 42472// CHECK11-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42473// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 42474// CHECK11-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42475// CHECK11-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42476// CHECK11-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42477// CHECK11-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42478// CHECK11-NEXT: [[T_VAR2:%.*]] = alloca i32, align 42479// CHECK11-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 42480// CHECK11-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S.0], align 42481// CHECK11-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S_0:%.*]], align 42482// CHECK11-NEXT: [[_TMP6:%.*]] = alloca ptr, align 42483// CHECK11-NEXT: [[I:%.*]] = alloca i32, align 42484// CHECK11-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 42485// CHECK11-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 42486// CHECK11-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 42487// CHECK11-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 42488// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 42489// CHECK11-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 42490// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 42491// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 42492// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 42493// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 42494// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 42495// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 42496// CHECK11-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 42497// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42498// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 42499// CHECK11-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 42500// CHECK11-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 42501// CHECK11-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_LB]], align 42502// CHECK11-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_UB]], align 42503// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42504// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42505// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 02506// CHECK11-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i32 22507// CHECK11-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]2508// CHECK11: arrayctor.loop:2509// CHECK11-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]2510// CHECK11-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])2511// CHECK11-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i32 12512// CHECK11-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]2513// CHECK11-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]2514// CHECK11: arrayctor.cont:2515// CHECK11-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 42516// CHECK11-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])2517// CHECK11-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 42518// CHECK11-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 42519// CHECK11-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 42520// CHECK11-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2521// CHECK11-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42522// CHECK11-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP9]], 12523// CHECK11-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2524// CHECK11: cond.true:2525// CHECK11-NEXT: br label [[COND_END:%.*]]2526// CHECK11: cond.false:2527// CHECK11-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42528// CHECK11-NEXT: br label [[COND_END]]2529// CHECK11: cond.end:2530// CHECK11-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP10]], [[COND_FALSE]] ]2531// CHECK11-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42532// CHECK11-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42533// CHECK11-NEXT: store i32 [[TMP11]], ptr [[DOTOMP_IV]], align 42534// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2535// CHECK11: omp.inner.for.cond:2536// CHECK11-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42537// CHECK11-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42538// CHECK11-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]]2539// CHECK11-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]2540// CHECK11: omp.inner.for.cond.cleanup:2541// CHECK11-NEXT: br label [[OMP_INNER_FOR_END:%.*]]2542// CHECK11: omp.inner.for.body:2543// CHECK11-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42544// CHECK11-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP14]], 12545// CHECK11-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2546// CHECK11-NEXT: store i32 [[ADD]], ptr [[I]], align 42547// CHECK11-NEXT: [[TMP15:%.*]] = load i32, ptr [[T_VAR2]], align 42548// CHECK11-NEXT: [[TMP16:%.*]] = load i32, ptr [[I]], align 42549// CHECK11-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC3]], i32 0, i32 [[TMP16]]2550// CHECK11-NEXT: store i32 [[TMP15]], ptr [[ARRAYIDX]], align 42551// CHECK11-NEXT: [[TMP17:%.*]] = load ptr, ptr [[_TMP6]], align 42552// CHECK11-NEXT: [[TMP18:%.*]] = load i32, ptr [[I]], align 42553// CHECK11-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 [[TMP18]]2554// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[ARRAYIDX8]], ptr align 4 [[TMP17]], i32 4, i1 false)2555// CHECK11-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2556// CHECK11: omp.body.continue:2557// CHECK11-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2558// CHECK11: omp.inner.for.inc:2559// CHECK11-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42560// CHECK11-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP19]], 12561// CHECK11-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 42562// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND]]2563// CHECK11: omp.inner.for.end:2564// CHECK11-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2565// CHECK11: omp.loop.exit:2566// CHECK11-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 42567// CHECK11-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 42568// CHECK11-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP21]])2569// CHECK11-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 42570// CHECK11-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 02571// CHECK11-NEXT: br i1 [[TMP23]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]2572// CHECK11: .omp.lastprivate.then:2573// CHECK11-NEXT: [[TMP24:%.*]] = load i32, ptr [[T_VAR2]], align 42574// CHECK11-NEXT: store i32 [[TMP24]], ptr [[TMP1]], align 42575// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i32 8, i1 false)2576// CHECK11-NEXT: [[ARRAY_BEGIN10:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[TMP2]], i32 0, i32 02577// CHECK11-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN10]], i32 22578// CHECK11-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN10]], [[TMP25]]2579// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE11:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]2580// CHECK11: omp.arraycpy.body:2581// CHECK11-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2582// CHECK11-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN10]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]2583// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[OMP_ARRAYCPY_DESTELEMENTPAST]], ptr align 4 [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 4, i1 false)2584// CHECK11-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 12585// CHECK11-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 12586// CHECK11-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP25]]2587// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE11]], label [[OMP_ARRAYCPY_BODY]]2588// CHECK11: omp.arraycpy.done11:2589// CHECK11-NEXT: [[TMP26:%.*]] = load ptr, ptr [[_TMP6]], align 42590// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP6]], ptr align 4 [[TMP26]], i32 4, i1 false)2591// CHECK11-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]2592// CHECK11: .omp.lastprivate.done:2593// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]2594// CHECK11-NEXT: [[ARRAY_BEGIN12:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 02595// CHECK11-NEXT: [[TMP27:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN12]], i32 22596// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]2597// CHECK11: arraydestroy.body:2598// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP27]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]2599// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -12600// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]2601// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN12]]2602// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE13:%.*]], label [[ARRAYDESTROY_BODY]]2603// CHECK11: arraydestroy.done13:2604// CHECK11-NEXT: ret void2605//2606//2607// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiED1Ev2608// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2609// CHECK11-NEXT: entry:2610// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42611// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42612// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42613// CHECK11-NEXT: call void @_ZN1SIiED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]2614// CHECK11-NEXT: ret void2615//2616//2617// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ev2618// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2619// CHECK11-NEXT: entry:2620// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42621// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42622// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42623// CHECK11-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 02624// CHECK11-NEXT: store i32 0, ptr [[F]], align 42625// CHECK11-NEXT: ret void2626//2627//2628// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ei2629// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2630// CHECK11-NEXT: entry:2631// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42632// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca i32, align 42633// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42634// CHECK11-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 42635// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42636// CHECK11-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 02637// CHECK11-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 42638// CHECK11-NEXT: store i32 [[TMP0]], ptr [[F]], align 42639// CHECK11-NEXT: ret void2640//2641//2642// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiED2Ev2643// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {2644// CHECK11-NEXT: entry:2645// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42646// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42647// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42648// CHECK11-NEXT: ret void2649//2650