1830 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 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 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 g = 2;81 g1 = 2;82 svar = 4;83 sfvar = 8.0;84 85 }();86 }87 }();88 return 0;89 #else90 S<float> test;91 int t_var = 0;92 int vec[] = {1, 2};93 S<float> s_arr[] = {1, 2};94 S<float> &var = test;95 96 #pragma omp target97 #pragma omp teams distribute lastprivate(t_var, vec, s_arr, s_arr, var, var, svar)98 for (int i = 0; i < 2; ++i) {99 vec[i] = t_var;100 s_arr[i] = var;101 }102 int i;103 104 return tmain<int>();105 #endif106}107 108 109// skip loop variables110 111// copy from parameters to local address variables112 113// load content of local address variables114// the distribute loop115// assignment: vec[i] = t_var;116 117// assignment: s_arr[i] = var;118 119// lastprivates120 121 122// template tmain123 124 125 126// skip alloca of global_tid and bound_tid127// skip loop variables128 129// skip init of bound and global tid130// copy from parameters to local address variables131 132// load content of local address variables133// assignment: vec[i] = t_var;134 135// assignment: s_arr[i] = var;136 137// lastprivates138 139#endif140// CHECK1-LABEL: define {{[^@]+}}@main141// CHECK1-SAME: () #[[ATTR0:[0-9]+]] {142// CHECK1-NEXT: entry:143// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4144// CHECK1-NEXT: [[G:%.*]] = alloca double, align 8145// CHECK1-NEXT: [[G1:%.*]] = alloca ptr, align 8146// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 8147// CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 4148// CHECK1-NEXT: store ptr [[G]], ptr [[G1]], align 8149// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0150// CHECK1-NEXT: store ptr [[G]], ptr [[TMP0]], align 8151// CHECK1-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1152// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G1]], align 8153// CHECK1-NEXT: store ptr [[TMP2]], ptr [[TMP1]], align 8154// CHECK1-NEXT: call void @"_ZZ4mainENK3$_0clEv"(ptr noundef nonnull align 8 dereferenceable(16) [[REF_TMP]])155// CHECK1-NEXT: ret i32 0156//157//158// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67159// CHECK1-SAME: (i64 noundef [[G:%.*]], i64 noundef [[G1:%.*]], i64 noundef [[SVAR:%.*]], i64 noundef [[SFVAR:%.*]]) #[[ATTR2:[0-9]+]] {160// CHECK1-NEXT: entry:161// CHECK1-NEXT: [[G_ADDR:%.*]] = alloca i64, align 8162// CHECK1-NEXT: [[G1_ADDR:%.*]] = alloca i64, align 8163// CHECK1-NEXT: [[SVAR_ADDR:%.*]] = alloca i64, align 8164// CHECK1-NEXT: [[SFVAR_ADDR:%.*]] = alloca i64, align 8165// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8166// CHECK1-NEXT: store i64 [[G]], ptr [[G_ADDR]], align 8167// CHECK1-NEXT: store i64 [[G1]], ptr [[G1_ADDR]], align 8168// CHECK1-NEXT: store i64 [[SVAR]], ptr [[SVAR_ADDR]], align 8169// CHECK1-NEXT: store i64 [[SFVAR]], ptr [[SFVAR_ADDR]], align 8170// CHECK1-NEXT: store ptr [[G1_ADDR]], ptr [[TMP]], align 8171// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[TMP]], align 8172// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2:[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]])173// CHECK1-NEXT: ret void174//175//176// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined177// 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]] {178// CHECK1-NEXT: entry:179// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8180// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8181// CHECK1-NEXT: [[G_ADDR:%.*]] = alloca ptr, align 8182// CHECK1-NEXT: [[G1_ADDR:%.*]] = alloca ptr, align 8183// CHECK1-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 8184// CHECK1-NEXT: [[SFVAR_ADDR:%.*]] = alloca ptr, align 8185// CHECK1-NEXT: [[TMP:%.*]] = alloca ptr, align 8186// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4187// CHECK1-NEXT: [[_TMP1:%.*]] = alloca i32, align 4188// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4189// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4190// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4191// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4192// CHECK1-NEXT: [[G2:%.*]] = alloca double, align 8193// CHECK1-NEXT: [[G13:%.*]] = alloca double, align 8194// CHECK1-NEXT: [[_TMP4:%.*]] = alloca ptr, align 8195// CHECK1-NEXT: [[SVAR5:%.*]] = alloca i32, align 4196// CHECK1-NEXT: [[SFVAR6:%.*]] = alloca float, align 4197// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4198// CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8199// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8200// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8201// CHECK1-NEXT: store ptr [[G]], ptr [[G_ADDR]], align 8202// CHECK1-NEXT: store ptr [[G1]], ptr [[G1_ADDR]], align 8203// CHECK1-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 8204// CHECK1-NEXT: store ptr [[SFVAR]], ptr [[SFVAR_ADDR]], align 8205// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[G_ADDR]], align 8206// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[G1_ADDR]], align 8207// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 8208// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[SFVAR_ADDR]], align 8209// CHECK1-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 8210// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4211// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 4212// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4213// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4214// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 8215// CHECK1-NEXT: store ptr [[G13]], ptr [[_TMP4]], align 8216// CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8217// CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4218// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP6]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)219// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4220// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP7]], 1221// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]222// CHECK1: cond.true:223// CHECK1-NEXT: br label [[COND_END:%.*]]224// CHECK1: cond.false:225// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4226// CHECK1-NEXT: br label [[COND_END]]227// CHECK1: cond.end:228// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]229// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4230// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4231// CHECK1-NEXT: store i32 [[TMP9]], ptr [[DOTOMP_IV]], align 4232// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]233// CHECK1: omp.inner.for.cond:234// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4235// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4236// CHECK1-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]237// CHECK1-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]238// CHECK1: omp.inner.for.body:239// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4240// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP12]], 1241// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]242// CHECK1-NEXT: store i32 [[ADD]], ptr [[I]], align 4243// CHECK1-NEXT: store double 1.000000e+00, ptr [[G2]], align 8244// CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP4]], align 8245// CHECK1-NEXT: store volatile double 1.000000e+00, ptr [[TMP13]], align 8246// CHECK1-NEXT: store i32 3, ptr [[SVAR5]], align 4247// CHECK1-NEXT: store float 4.000000e+00, ptr [[SFVAR6]], align 4248// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0249// CHECK1-NEXT: store ptr [[G2]], ptr [[TMP14]], align 8250// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1251// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP4]], align 8252// CHECK1-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8253// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2254// CHECK1-NEXT: store ptr [[SVAR5]], ptr [[TMP17]], align 8255// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 3256// CHECK1-NEXT: store ptr [[SFVAR6]], ptr [[TMP18]], align 8257// CHECK1-NEXT: call void @"_ZZZ4mainENK3$_0clEvENKUlvE_clEv"(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])258// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]259// CHECK1: omp.body.continue:260// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]261// CHECK1: omp.inner.for.inc:262// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4263// CHECK1-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP19]], 1264// CHECK1-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4265// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]266// CHECK1: omp.inner.for.end:267// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]268// CHECK1: omp.loop.exit:269// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP6]])270// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4271// CHECK1-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0272// CHECK1-NEXT: br i1 [[TMP21]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]273// CHECK1: .omp.lastprivate.then:274// CHECK1-NEXT: [[TMP22:%.*]] = load double, ptr [[G2]], align 8275// CHECK1-NEXT: store volatile double [[TMP22]], ptr [[TMP0]], align 8276// CHECK1-NEXT: [[TMP23:%.*]] = load ptr, ptr [[_TMP4]], align 8277// CHECK1-NEXT: [[TMP24:%.*]] = load double, ptr [[TMP23]], align 8278// CHECK1-NEXT: store volatile double [[TMP24]], ptr [[TMP4]], align 8279// CHECK1-NEXT: [[TMP25:%.*]] = load i32, ptr [[SVAR5]], align 4280// CHECK1-NEXT: store i32 [[TMP25]], ptr [[TMP2]], align 4281// CHECK1-NEXT: [[TMP26:%.*]] = load float, ptr [[SFVAR6]], align 4282// CHECK1-NEXT: store float [[TMP26]], ptr [[TMP3]], align 4283// CHECK1-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]284// CHECK1: .omp.lastprivate.done:285// CHECK1-NEXT: ret void286//287//288// CHECK3-LABEL: define {{[^@]+}}@main289// CHECK3-SAME: () #[[ATTR0:[0-9]+]] {290// CHECK3-NEXT: entry:291// CHECK3-NEXT: [[RETVAL:%.*]] = alloca i32, align 4292// CHECK3-NEXT: [[G:%.*]] = alloca double, align 8293// CHECK3-NEXT: [[G1:%.*]] = alloca ptr, align 4294// CHECK3-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 4295// CHECK3-NEXT: store i32 0, ptr [[RETVAL]], align 4296// CHECK3-NEXT: store ptr [[G]], ptr [[G1]], align 4297// CHECK3-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 0298// CHECK3-NEXT: store ptr [[G]], ptr [[TMP0]], align 4299// CHECK3-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[CLASS_ANON]], ptr [[REF_TMP]], i32 0, i32 1300// CHECK3-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G1]], align 4301// CHECK3-NEXT: store ptr [[TMP2]], ptr [[TMP1]], align 4302// CHECK3-NEXT: call void @"_ZZ4mainENK3$_0clEv"(ptr noundef nonnull align 4 dereferenceable(8) [[REF_TMP]])303// CHECK3-NEXT: ret i32 0304//305//306// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67307// 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]+]] {308// CHECK3-NEXT: entry:309// CHECK3-NEXT: [[G_ADDR:%.*]] = alloca ptr, align 4310// CHECK3-NEXT: [[G1_ADDR:%.*]] = alloca ptr, align 4311// CHECK3-NEXT: [[SVAR_ADDR:%.*]] = alloca i32, align 4312// CHECK3-NEXT: [[SFVAR_ADDR:%.*]] = alloca i32, align 4313// CHECK3-NEXT: [[TMP:%.*]] = alloca ptr, align 4314// CHECK3-NEXT: [[G2:%.*]] = alloca double, align 8315// CHECK3-NEXT: [[G13:%.*]] = alloca double, align 8316// CHECK3-NEXT: [[_TMP4:%.*]] = alloca ptr, align 4317// CHECK3-NEXT: store ptr [[G]], ptr [[G_ADDR]], align 4318// CHECK3-NEXT: store ptr [[G1]], ptr [[G1_ADDR]], align 4319// CHECK3-NEXT: store i32 [[SVAR]], ptr [[SVAR_ADDR]], align 4320// CHECK3-NEXT: store i32 [[SFVAR]], ptr [[SFVAR_ADDR]], align 4321// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[G_ADDR]], align 4322// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[G1_ADDR]], align 4323// CHECK3-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 4324// CHECK3-NEXT: [[TMP2:%.*]] = load double, ptr [[TMP0]], align 8325// CHECK3-NEXT: store double [[TMP2]], ptr [[G2]], align 8326// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 4327// CHECK3-NEXT: [[TMP4:%.*]] = load double, ptr [[TMP3]], align 4328// CHECK3-NEXT: store double [[TMP4]], ptr [[G13]], align 8329// CHECK3-NEXT: store ptr [[G13]], ptr [[_TMP4]], align 4330// CHECK3-NEXT: [[TMP5:%.*]] = load ptr, ptr [[_TMP4]], align 4331// CHECK3-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2:[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]])332// CHECK3-NEXT: ret void333//334//335// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l67.omp_outlined336// 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]] {337// CHECK3-NEXT: entry:338// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4339// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4340// CHECK3-NEXT: [[G_ADDR:%.*]] = alloca ptr, align 4341// CHECK3-NEXT: [[G1_ADDR:%.*]] = alloca ptr, align 4342// CHECK3-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 4343// CHECK3-NEXT: [[SFVAR_ADDR:%.*]] = alloca ptr, align 4344// CHECK3-NEXT: [[TMP:%.*]] = alloca ptr, align 4345// CHECK3-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4346// CHECK3-NEXT: [[_TMP1:%.*]] = alloca i32, align 4347// CHECK3-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4348// CHECK3-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4349// CHECK3-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4350// CHECK3-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4351// CHECK3-NEXT: [[G2:%.*]] = alloca double, align 8352// CHECK3-NEXT: [[G13:%.*]] = alloca double, align 8353// CHECK3-NEXT: [[_TMP4:%.*]] = alloca ptr, align 4354// CHECK3-NEXT: [[SVAR5:%.*]] = alloca i32, align 4355// CHECK3-NEXT: [[SFVAR6:%.*]] = alloca float, align 4356// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 4357// CHECK3-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 4358// CHECK3-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4359// CHECK3-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4360// CHECK3-NEXT: store ptr [[G]], ptr [[G_ADDR]], align 4361// CHECK3-NEXT: store ptr [[G1]], ptr [[G1_ADDR]], align 4362// CHECK3-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 4363// CHECK3-NEXT: store ptr [[SFVAR]], ptr [[SFVAR_ADDR]], align 4364// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[G_ADDR]], align 4365// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[G1_ADDR]], align 4366// CHECK3-NEXT: [[TMP2:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 4367// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[SFVAR_ADDR]], align 4368// CHECK3-NEXT: store ptr [[TMP1]], ptr [[TMP]], align 4369// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4370// CHECK3-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 4371// CHECK3-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4372// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4373// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 4374// CHECK3-NEXT: store ptr [[G13]], ptr [[_TMP4]], align 4375// CHECK3-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4376// CHECK3-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4377// CHECK3-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP6]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)378// CHECK3-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4379// CHECK3-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP7]], 1380// CHECK3-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]381// CHECK3: cond.true:382// CHECK3-NEXT: br label [[COND_END:%.*]]383// CHECK3: cond.false:384// CHECK3-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4385// CHECK3-NEXT: br label [[COND_END]]386// CHECK3: cond.end:387// CHECK3-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]388// CHECK3-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4389// CHECK3-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4390// CHECK3-NEXT: store i32 [[TMP9]], ptr [[DOTOMP_IV]], align 4391// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]392// CHECK3: omp.inner.for.cond:393// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4394// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4395// CHECK3-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]396// CHECK3-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]397// CHECK3: omp.inner.for.body:398// CHECK3-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4399// CHECK3-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP12]], 1400// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]401// CHECK3-NEXT: store i32 [[ADD]], ptr [[I]], align 4402// CHECK3-NEXT: store double 1.000000e+00, ptr [[G2]], align 8403// CHECK3-NEXT: [[TMP13:%.*]] = load ptr, ptr [[_TMP4]], align 4404// CHECK3-NEXT: store volatile double 1.000000e+00, ptr [[TMP13]], align 4405// CHECK3-NEXT: store i32 3, ptr [[SVAR5]], align 4406// CHECK3-NEXT: store float 4.000000e+00, ptr [[SFVAR6]], align 4407// CHECK3-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0408// CHECK3-NEXT: store ptr [[G2]], ptr [[TMP14]], align 4409// CHECK3-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1410// CHECK3-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP4]], align 4411// CHECK3-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 4412// CHECK3-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2413// CHECK3-NEXT: store ptr [[SVAR5]], ptr [[TMP17]], align 4414// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 3415// CHECK3-NEXT: store ptr [[SFVAR6]], ptr [[TMP18]], align 4416// CHECK3-NEXT: call void @"_ZZZ4mainENK3$_0clEvENKUlvE_clEv"(ptr noundef nonnull align 4 dereferenceable(16) [[REF_TMP]])417// CHECK3-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]418// CHECK3: omp.body.continue:419// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]420// CHECK3: omp.inner.for.inc:421// CHECK3-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4422// CHECK3-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP19]], 1423// CHECK3-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4424// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]]425// CHECK3: omp.inner.for.end:426// CHECK3-NEXT: br label [[OMP_LOOP_EXIT:%.*]]427// CHECK3: omp.loop.exit:428// CHECK3-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP6]])429// CHECK3-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4430// CHECK3-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0431// CHECK3-NEXT: br i1 [[TMP21]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]432// CHECK3: .omp.lastprivate.then:433// CHECK3-NEXT: [[TMP22:%.*]] = load double, ptr [[G2]], align 8434// CHECK3-NEXT: store volatile double [[TMP22]], ptr [[TMP0]], align 8435// CHECK3-NEXT: [[TMP23:%.*]] = load ptr, ptr [[_TMP4]], align 4436// CHECK3-NEXT: [[TMP24:%.*]] = load double, ptr [[TMP23]], align 4437// CHECK3-NEXT: store volatile double [[TMP24]], ptr [[TMP4]], align 4438// CHECK3-NEXT: [[TMP25:%.*]] = load i32, ptr [[SVAR5]], align 4439// CHECK3-NEXT: store i32 [[TMP25]], ptr [[TMP2]], align 4440// CHECK3-NEXT: [[TMP26:%.*]] = load float, ptr [[SFVAR6]], align 4441// CHECK3-NEXT: store float [[TMP26]], ptr [[TMP3]], align 4442// CHECK3-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]443// CHECK3: .omp.lastprivate.done:444// CHECK3-NEXT: ret void445//446//447// CHECK9-LABEL: define {{[^@]+}}@main448// CHECK9-SAME: () #[[ATTR0:[0-9]+]] {449// CHECK9-NEXT: entry:450// CHECK9-NEXT: [[RETVAL:%.*]] = alloca i32, align 4451// CHECK9-NEXT: [[G:%.*]] = alloca double, align 8452// CHECK9-NEXT: [[G1:%.*]] = alloca ptr, align 8453// CHECK9-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S:%.*]], align 4454// CHECK9-NEXT: [[T_VAR:%.*]] = alloca i32, align 4455// CHECK9-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 4456// CHECK9-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S], align 4457// CHECK9-NEXT: [[VAR:%.*]] = alloca ptr, align 8458// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 8459// CHECK9-NEXT: [[T_VAR_CASTED:%.*]] = alloca i64, align 8460// CHECK9-NEXT: [[SVAR_CASTED:%.*]] = alloca i64, align 8461// CHECK9-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [5 x ptr], align 8462// CHECK9-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [5 x ptr], align 8463// CHECK9-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [5 x ptr], align 8464// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 4465// CHECK9-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8466// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 4467// CHECK9-NEXT: store i32 0, ptr [[RETVAL]], align 4468// CHECK9-NEXT: store ptr [[G]], ptr [[G1]], align 8469// CHECK9-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])470// CHECK9-NEXT: store i32 0, ptr [[T_VAR]], align 4471// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const.main.vec, i64 8, i1 false)472// CHECK9-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], float noundef 1.000000e+00)473// CHECK9-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i64 1474// CHECK9-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], float noundef 2.000000e+00)475// CHECK9-NEXT: store ptr [[TEST]], ptr [[VAR]], align 8476// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 8477// CHECK9-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 8478// CHECK9-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_VAR]], align 4479// CHECK9-NEXT: store i32 [[TMP1]], ptr [[T_VAR_CASTED]], align 4480// CHECK9-NEXT: [[TMP2:%.*]] = load i64, ptr [[T_VAR_CASTED]], align 8481// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8482// CHECK9-NEXT: [[TMP4:%.*]] = load i32, ptr @_ZZ4mainE4svar, align 4483// CHECK9-NEXT: store i32 [[TMP4]], ptr [[SVAR_CASTED]], align 4484// CHECK9-NEXT: [[TMP5:%.*]] = load i64, ptr [[SVAR_CASTED]], align 8485// CHECK9-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 8486// CHECK9-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP]], align 8487// CHECK9-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0488// CHECK9-NEXT: store i64 [[TMP2]], ptr [[TMP8]], align 8489// CHECK9-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0490// CHECK9-NEXT: store i64 [[TMP2]], ptr [[TMP9]], align 8491// CHECK9-NEXT: [[TMP10:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0492// CHECK9-NEXT: store ptr null, ptr [[TMP10]], align 8493// CHECK9-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1494// CHECK9-NEXT: store ptr [[VEC]], ptr [[TMP11]], align 8495// CHECK9-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 1496// CHECK9-NEXT: store ptr [[VEC]], ptr [[TMP12]], align 8497// CHECK9-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1498// CHECK9-NEXT: store ptr null, ptr [[TMP13]], align 8499// CHECK9-NEXT: [[TMP14:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2500// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[TMP14]], align 8501// CHECK9-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 2502// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[TMP15]], align 8503// CHECK9-NEXT: [[TMP16:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2504// CHECK9-NEXT: store ptr null, ptr [[TMP16]], align 8505// CHECK9-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3506// CHECK9-NEXT: store ptr [[TMP6]], ptr [[TMP17]], align 8507// CHECK9-NEXT: [[TMP18:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 3508// CHECK9-NEXT: store ptr [[TMP7]], ptr [[TMP18]], align 8509// CHECK9-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3510// CHECK9-NEXT: store ptr null, ptr [[TMP19]], align 8511// CHECK9-NEXT: [[TMP20:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4512// CHECK9-NEXT: store i64 [[TMP5]], ptr [[TMP20]], align 8513// CHECK9-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 4514// CHECK9-NEXT: store i64 [[TMP5]], ptr [[TMP21]], align 8515// CHECK9-NEXT: [[TMP22:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 4516// CHECK9-NEXT: store ptr null, ptr [[TMP22]], align 8517// CHECK9-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0518// CHECK9-NEXT: [[TMP24:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0519// CHECK9-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0520// CHECK9-NEXT: store i32 3, ptr [[TMP25]], align 4521// CHECK9-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1522// CHECK9-NEXT: store i32 5, ptr [[TMP26]], align 4523// CHECK9-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2524// CHECK9-NEXT: store ptr [[TMP23]], ptr [[TMP27]], align 8525// CHECK9-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3526// CHECK9-NEXT: store ptr [[TMP24]], ptr [[TMP28]], align 8527// CHECK9-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4528// CHECK9-NEXT: store ptr @.offload_sizes, ptr [[TMP29]], align 8529// CHECK9-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5530// CHECK9-NEXT: store ptr @.offload_maptypes, ptr [[TMP30]], align 8531// CHECK9-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6532// CHECK9-NEXT: store ptr null, ptr [[TMP31]], align 8533// CHECK9-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7534// CHECK9-NEXT: store ptr null, ptr [[TMP32]], align 8535// CHECK9-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8536// CHECK9-NEXT: store i64 2, ptr [[TMP33]], align 8537// CHECK9-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9538// CHECK9-NEXT: store i64 0, ptr [[TMP34]], align 8539// CHECK9-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10540// CHECK9-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP35]], align 4541// CHECK9-NEXT: [[TMP36:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11542// CHECK9-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP36]], align 4543// CHECK9-NEXT: [[TMP37:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12544// CHECK9-NEXT: store i32 0, ptr [[TMP37]], align 4545// CHECK9-NEXT: [[TMP38:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l96.region_id, ptr [[KERNEL_ARGS]])546// CHECK9-NEXT: [[TMP39:%.*]] = icmp ne i32 [[TMP38]], 0547// CHECK9-NEXT: br i1 [[TMP39]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]548// CHECK9: omp_offload.failed:549// CHECK9-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l96(i64 [[TMP2]], ptr [[VEC]], ptr [[S_ARR]], ptr [[TMP3]], i64 [[TMP5]]) #[[ATTR4:[0-9]+]]550// CHECK9-NEXT: br label [[OMP_OFFLOAD_CONT]]551// CHECK9: omp_offload.cont:552// CHECK9-NEXT: [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiET_v()553// CHECK9-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 4554// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 0555// CHECK9-NEXT: [[TMP40:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 2556// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]557// CHECK9: arraydestroy.body:558// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP40]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]559// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1560// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]561// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]562// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]563// CHECK9: arraydestroy.done2:564// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]565// CHECK9-NEXT: [[TMP41:%.*]] = load i32, ptr [[RETVAL]], align 4566// CHECK9-NEXT: ret i32 [[TMP41]]567//568//569// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ev570// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {571// CHECK9-NEXT: entry:572// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8573// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8574// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8575// CHECK9-NEXT: call void @_ZN1SIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])576// CHECK9-NEXT: ret void577//578//579// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ef580// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {581// CHECK9-NEXT: entry:582// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8583// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca float, align 4584// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8585// CHECK9-NEXT: store float [[A]], ptr [[A_ADDR]], align 4586// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8587// CHECK9-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4588// CHECK9-NEXT: call void @_ZN1SIfEC2Ef(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], float noundef [[TMP0]])589// CHECK9-NEXT: ret void590//591//592// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l96593// 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]+]] {594// CHECK9-NEXT: entry:595// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca i64, align 8596// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 8597// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 8598// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 8599// CHECK9-NEXT: [[SVAR_ADDR:%.*]] = alloca i64, align 8600// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 8601// CHECK9-NEXT: store i64 [[T_VAR]], ptr [[T_VAR_ADDR]], align 8602// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 8603// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 8604// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 8605// CHECK9-NEXT: store i64 [[SVAR]], ptr [[SVAR_ADDR]], align 8606// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 8607// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 8608// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR_ADDR]], align 8609// CHECK9-NEXT: store ptr [[TMP2]], ptr [[TMP]], align 8610// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8611// CHECK9-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 5, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l96.omp_outlined, ptr [[TMP0]], ptr [[T_VAR_ADDR]], ptr [[TMP1]], ptr [[TMP3]], ptr [[SVAR_ADDR]])612// CHECK9-NEXT: ret void613//614//615// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l96.omp_outlined616// 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]] {617// CHECK9-NEXT: entry:618// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8619// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8620// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 8621// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 8622// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 8623// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 8624// CHECK9-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 8625// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 8626// CHECK9-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4627// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 4628// CHECK9-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4629// CHECK9-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4630// CHECK9-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4631// CHECK9-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4632// CHECK9-NEXT: [[T_VAR2:%.*]] = alloca i32, align 4633// CHECK9-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 4634// CHECK9-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S], align 4635// CHECK9-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S:%.*]], align 4636// CHECK9-NEXT: [[_TMP6:%.*]] = alloca ptr, align 8637// CHECK9-NEXT: [[SVAR7:%.*]] = alloca i32, align 4638// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 4639// CHECK9-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8640// CHECK9-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8641// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 8642// CHECK9-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 8643// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 8644// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 8645// CHECK9-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 8646// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 8647// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 8648// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 8649// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 8650// CHECK9-NEXT: [[TMP4:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 8651// CHECK9-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 8652// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4653// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 4654// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4655// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4656// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 0657// CHECK9-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 2658// CHECK9-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]659// CHECK9: arrayctor.loop:660// CHECK9-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]661// CHECK9-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])662// CHECK9-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i64 1663// CHECK9-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]664// CHECK9-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]665// CHECK9: arrayctor.cont:666// CHECK9-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 8667// CHECK9-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])668// CHECK9-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 8669// CHECK9-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8670// CHECK9-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4671// CHECK9-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP7]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)672// CHECK9-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4673// CHECK9-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP8]], 1674// CHECK9-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]675// CHECK9: cond.true:676// CHECK9-NEXT: br label [[COND_END:%.*]]677// CHECK9: cond.false:678// CHECK9-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4679// CHECK9-NEXT: br label [[COND_END]]680// CHECK9: cond.end:681// CHECK9-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]682// CHECK9-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4683// CHECK9-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4684// CHECK9-NEXT: store i32 [[TMP10]], ptr [[DOTOMP_IV]], align 4685// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]686// CHECK9: omp.inner.for.cond:687// CHECK9-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4688// CHECK9-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4689// CHECK9-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]690// CHECK9-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]691// CHECK9: omp.inner.for.cond.cleanup:692// CHECK9-NEXT: br label [[OMP_INNER_FOR_END:%.*]]693// CHECK9: omp.inner.for.body:694// CHECK9-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4695// CHECK9-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 1696// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]697// CHECK9-NEXT: store i32 [[ADD]], ptr [[I]], align 4698// CHECK9-NEXT: [[TMP14:%.*]] = load i32, ptr [[T_VAR2]], align 4699// CHECK9-NEXT: [[TMP15:%.*]] = load i32, ptr [[I]], align 4700// CHECK9-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP15]] to i64701// CHECK9-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC3]], i64 0, i64 [[IDXPROM]]702// CHECK9-NEXT: store i32 [[TMP14]], ptr [[ARRAYIDX]], align 4703// CHECK9-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP6]], align 8704// CHECK9-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 4705// CHECK9-NEXT: [[IDXPROM9:%.*]] = sext i32 [[TMP17]] to i64706// CHECK9-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i64 0, i64 [[IDXPROM9]]707// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX10]], ptr align 4 [[TMP16]], i64 4, i1 false)708// CHECK9-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]709// CHECK9: omp.body.continue:710// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]711// CHECK9: omp.inner.for.inc:712// CHECK9-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4713// CHECK9-NEXT: [[ADD11:%.*]] = add nsw i32 [[TMP18]], 1714// CHECK9-NEXT: store i32 [[ADD11]], ptr [[DOTOMP_IV]], align 4715// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]716// CHECK9: omp.inner.for.end:717// CHECK9-NEXT: br label [[OMP_LOOP_EXIT:%.*]]718// CHECK9: omp.loop.exit:719// CHECK9-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8720// CHECK9-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 4721// CHECK9-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP20]])722// CHECK9-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4723// CHECK9-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0724// CHECK9-NEXT: br i1 [[TMP22]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]725// CHECK9: .omp.lastprivate.then:726// CHECK9-NEXT: [[TMP23:%.*]] = load i32, ptr [[T_VAR2]], align 4727// CHECK9-NEXT: store i32 [[TMP23]], ptr [[TMP1]], align 4728// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i64 8, i1 false)729// CHECK9-NEXT: [[ARRAY_BEGIN12:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[TMP2]], i32 0, i32 0730// CHECK9-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN12]], i64 2731// CHECK9-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN12]], [[TMP24]]732// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE13:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]733// CHECK9: omp.arraycpy.body:734// CHECK9-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]735// CHECK9-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN12]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]736// 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)737// CHECK9-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1738// CHECK9-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1739// CHECK9-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP24]]740// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE13]], label [[OMP_ARRAYCPY_BODY]]741// CHECK9: omp.arraycpy.done13:742// CHECK9-NEXT: [[TMP25:%.*]] = load ptr, ptr [[_TMP6]], align 8743// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP5]], ptr align 4 [[TMP25]], i64 4, i1 false)744// CHECK9-NEXT: [[TMP26:%.*]] = load i32, ptr [[SVAR7]], align 4745// CHECK9-NEXT: store i32 [[TMP26]], ptr [[TMP4]], align 4746// CHECK9-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]747// CHECK9: .omp.lastprivate.done:748// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]749// CHECK9-NEXT: [[ARRAY_BEGIN14:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 0750// CHECK9-NEXT: [[TMP27:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN14]], i64 2751// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]752// CHECK9: arraydestroy.body:753// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP27]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]754// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1755// CHECK9-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]756// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN14]]757// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE15:%.*]], label [[ARRAYDESTROY_BODY]]758// CHECK9: arraydestroy.done15:759// CHECK9-NEXT: ret void760//761//762// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfED1Ev763// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {764// CHECK9-NEXT: entry:765// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8766// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8767// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8768// CHECK9-NEXT: call void @_ZN1SIfED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]769// CHECK9-NEXT: ret void770//771//772// CHECK9-LABEL: define {{[^@]+}}@_Z5tmainIiET_v773// CHECK9-SAME: () #[[ATTR1]] comdat {774// CHECK9-NEXT: entry:775// CHECK9-NEXT: [[RETVAL:%.*]] = alloca i32, align 4776// CHECK9-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S_0:%.*]], align 4777// CHECK9-NEXT: [[T_VAR:%.*]] = alloca i32, align 4778// CHECK9-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 4779// CHECK9-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 4780// CHECK9-NEXT: [[VAR:%.*]] = alloca ptr, align 8781// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 8782// CHECK9-NEXT: [[T_VAR_CASTED:%.*]] = alloca i64, align 8783// CHECK9-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x ptr], align 8784// CHECK9-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x ptr], align 8785// CHECK9-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x ptr], align 8786// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 4787// CHECK9-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8788// CHECK9-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])789// CHECK9-NEXT: store i32 0, ptr [[T_VAR]], align 4790// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const._Z5tmainIiET_v.vec, i64 8, i1 false)791// CHECK9-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], i32 noundef signext 1)792// CHECK9-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 1793// CHECK9-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], i32 noundef signext 2)794// CHECK9-NEXT: store ptr [[TEST]], ptr [[VAR]], align 8795// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 8796// CHECK9-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 8797// CHECK9-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_VAR]], align 4798// CHECK9-NEXT: store i32 [[TMP1]], ptr [[T_VAR_CASTED]], align 4799// CHECK9-NEXT: [[TMP2:%.*]] = load i64, ptr [[T_VAR_CASTED]], align 8800// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8801// CHECK9-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 8802// CHECK9-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 8803// CHECK9-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0804// CHECK9-NEXT: store i64 [[TMP2]], ptr [[TMP6]], align 8805// CHECK9-NEXT: [[TMP7:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0806// CHECK9-NEXT: store i64 [[TMP2]], ptr [[TMP7]], align 8807// CHECK9-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0808// CHECK9-NEXT: store ptr null, ptr [[TMP8]], align 8809// CHECK9-NEXT: [[TMP9:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1810// CHECK9-NEXT: store ptr [[VEC]], ptr [[TMP9]], align 8811// CHECK9-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 1812// CHECK9-NEXT: store ptr [[VEC]], ptr [[TMP10]], align 8813// CHECK9-NEXT: [[TMP11:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1814// CHECK9-NEXT: store ptr null, ptr [[TMP11]], align 8815// CHECK9-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2816// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[TMP12]], align 8817// CHECK9-NEXT: [[TMP13:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 2818// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[TMP13]], align 8819// CHECK9-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2820// CHECK9-NEXT: store ptr null, ptr [[TMP14]], align 8821// CHECK9-NEXT: [[TMP15:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3822// CHECK9-NEXT: store ptr [[TMP4]], ptr [[TMP15]], align 8823// CHECK9-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 3824// CHECK9-NEXT: store ptr [[TMP5]], ptr [[TMP16]], align 8825// CHECK9-NEXT: [[TMP17:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3826// CHECK9-NEXT: store ptr null, ptr [[TMP17]], align 8827// CHECK9-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0828// CHECK9-NEXT: [[TMP19:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0829// CHECK9-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0830// CHECK9-NEXT: store i32 3, ptr [[TMP20]], align 4831// CHECK9-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1832// CHECK9-NEXT: store i32 4, ptr [[TMP21]], align 4833// CHECK9-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2834// CHECK9-NEXT: store ptr [[TMP18]], ptr [[TMP22]], align 8835// CHECK9-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3836// CHECK9-NEXT: store ptr [[TMP19]], ptr [[TMP23]], align 8837// CHECK9-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4838// CHECK9-NEXT: store ptr @.offload_sizes.1, ptr [[TMP24]], align 8839// CHECK9-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5840// CHECK9-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP25]], align 8841// CHECK9-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6842// CHECK9-NEXT: store ptr null, ptr [[TMP26]], align 8843// CHECK9-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7844// CHECK9-NEXT: store ptr null, ptr [[TMP27]], align 8845// CHECK9-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8846// CHECK9-NEXT: store i64 2, ptr [[TMP28]], align 8847// CHECK9-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9848// CHECK9-NEXT: store i64 0, ptr [[TMP29]], align 8849// CHECK9-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10850// CHECK9-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP30]], align 4851// CHECK9-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11852// CHECK9-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP31]], align 4853// CHECK9-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12854// CHECK9-NEXT: store i32 0, ptr [[TMP32]], align 4855// CHECK9-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.region_id, ptr [[KERNEL_ARGS]])856// CHECK9-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0857// CHECK9-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]858// CHECK9: omp_offload.failed:859// 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]]860// CHECK9-NEXT: br label [[OMP_OFFLOAD_CONT]]861// CHECK9: omp_offload.cont:862// CHECK9-NEXT: store i32 0, ptr [[RETVAL]], align 4863// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 0864// CHECK9-NEXT: [[TMP35:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 2865// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]866// CHECK9: arraydestroy.body:867// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP35]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]868// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1869// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]870// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]871// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]872// CHECK9: arraydestroy.done2:873// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]874// CHECK9-NEXT: [[TMP36:%.*]] = load i32, ptr [[RETVAL]], align 4875// CHECK9-NEXT: ret i32 [[TMP36]]876//877//878// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev879// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {880// CHECK9-NEXT: entry:881// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8882// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8883// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8884// CHECK9-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 0885// CHECK9-NEXT: store float 0.000000e+00, ptr [[F]], align 4886// CHECK9-NEXT: ret void887//888//889// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef890// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {891// CHECK9-NEXT: entry:892// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8893// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca float, align 4894// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8895// CHECK9-NEXT: store float [[A]], ptr [[A_ADDR]], align 4896// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8897// CHECK9-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 0898// CHECK9-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4899// CHECK9-NEXT: store float [[TMP0]], ptr [[F]], align 4900// CHECK9-NEXT: ret void901//902//903// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev904// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {905// CHECK9-NEXT: entry:906// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8907// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8908// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8909// CHECK9-NEXT: ret void910//911//912// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ev913// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {914// CHECK9-NEXT: entry:915// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8916// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8917// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8918// CHECK9-NEXT: call void @_ZN1SIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])919// CHECK9-NEXT: ret void920//921//922// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ei923// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef signext [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {924// CHECK9-NEXT: entry:925// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8926// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4927// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8928// CHECK9-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4929// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8930// CHECK9-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4931// CHECK9-NEXT: call void @_ZN1SIiEC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef signext [[TMP0]])932// CHECK9-NEXT: ret void933//934//935// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49936// 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]] {937// CHECK9-NEXT: entry:938// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca i64, align 8939// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 8940// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 8941// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 8942// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 8943// CHECK9-NEXT: store i64 [[T_VAR]], ptr [[T_VAR_ADDR]], align 8944// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 8945// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 8946// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 8947// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 8948// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 8949// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR_ADDR]], align 8950// CHECK9-NEXT: store ptr [[TMP2]], ptr [[TMP]], align 8951// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8952// CHECK9-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], 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]])953// CHECK9-NEXT: ret void954//955//956// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined957// 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]] {958// CHECK9-NEXT: entry:959// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8960// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8961// CHECK9-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 8962// CHECK9-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 8963// CHECK9-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 8964// CHECK9-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 8965// CHECK9-NEXT: [[TMP:%.*]] = alloca ptr, align 8966// CHECK9-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4967// CHECK9-NEXT: [[_TMP1:%.*]] = alloca i32, align 4968// CHECK9-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4969// CHECK9-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4970// CHECK9-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4971// CHECK9-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4972// CHECK9-NEXT: [[T_VAR2:%.*]] = alloca i32, align 4973// CHECK9-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 4974// CHECK9-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S.0], align 4975// CHECK9-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S_0:%.*]], align 4976// CHECK9-NEXT: [[_TMP6:%.*]] = alloca ptr, align 8977// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 4978// CHECK9-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8979// CHECK9-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8980// CHECK9-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 8981// CHECK9-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 8982// CHECK9-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 8983// CHECK9-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 8984// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 8985// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 8986// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 8987// CHECK9-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 8988// CHECK9-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 8989// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4990// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 4991// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4992// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4993// CHECK9-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 0994// CHECK9-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 2995// CHECK9-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]996// CHECK9: arrayctor.loop:997// CHECK9-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]998// CHECK9-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])999// CHECK9-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i64 11000// CHECK9-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1001// CHECK9-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1002// CHECK9: arrayctor.cont:1003// CHECK9-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 81004// CHECK9-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])1005// CHECK9-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 81006// CHECK9-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81007// CHECK9-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 41008// CHECK9-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP6]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1009// CHECK9-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41010// CHECK9-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP7]], 11011// CHECK9-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1012// CHECK9: cond.true:1013// CHECK9-NEXT: br label [[COND_END:%.*]]1014// CHECK9: cond.false:1015// CHECK9-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41016// CHECK9-NEXT: br label [[COND_END]]1017// CHECK9: cond.end:1018// CHECK9-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]1019// CHECK9-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41020// CHECK9-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41021// CHECK9-NEXT: store i32 [[TMP9]], ptr [[DOTOMP_IV]], align 41022// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1023// CHECK9: omp.inner.for.cond:1024// CHECK9-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41025// CHECK9-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41026// CHECK9-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]1027// CHECK9-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1028// CHECK9: omp.inner.for.cond.cleanup:1029// CHECK9-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1030// CHECK9: omp.inner.for.body:1031// CHECK9-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41032// CHECK9-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP12]], 11033// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1034// CHECK9-NEXT: store i32 [[ADD]], ptr [[I]], align 41035// CHECK9-NEXT: [[TMP13:%.*]] = load i32, ptr [[T_VAR2]], align 41036// CHECK9-NEXT: [[TMP14:%.*]] = load i32, ptr [[I]], align 41037// CHECK9-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i641038// CHECK9-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC3]], i64 0, i64 [[IDXPROM]]1039// CHECK9-NEXT: store i32 [[TMP13]], ptr [[ARRAYIDX]], align 41040// CHECK9-NEXT: [[TMP15:%.*]] = load ptr, ptr [[_TMP6]], align 81041// CHECK9-NEXT: [[TMP16:%.*]] = load i32, ptr [[I]], align 41042// CHECK9-NEXT: [[IDXPROM8:%.*]] = sext i32 [[TMP16]] to i641043// CHECK9-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i64 0, i64 [[IDXPROM8]]1044// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX9]], ptr align 4 [[TMP15]], i64 4, i1 false)1045// CHECK9-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1046// CHECK9: omp.body.continue:1047// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1048// CHECK9: omp.inner.for.inc:1049// CHECK9-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41050// CHECK9-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP17]], 11051// CHECK9-NEXT: store i32 [[ADD10]], ptr [[DOTOMP_IV]], align 41052// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]1053// CHECK9: omp.inner.for.end:1054// CHECK9-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1055// CHECK9: omp.loop.exit:1056// CHECK9-NEXT: [[TMP18:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81057// CHECK9-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP18]], align 41058// CHECK9-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP19]])1059// CHECK9-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41060// CHECK9-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 01061// CHECK9-NEXT: br i1 [[TMP21]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]1062// CHECK9: .omp.lastprivate.then:1063// CHECK9-NEXT: [[TMP22:%.*]] = load i32, ptr [[T_VAR2]], align 41064// CHECK9-NEXT: store i32 [[TMP22]], ptr [[TMP1]], align 41065// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i64 8, i1 false)1066// CHECK9-NEXT: [[ARRAY_BEGIN11:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[TMP2]], i32 0, i32 01067// CHECK9-NEXT: [[TMP23:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN11]], i64 21068// CHECK9-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN11]], [[TMP23]]1069// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE12:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1070// CHECK9: omp.arraycpy.body:1071// CHECK9-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1072// CHECK9-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN11]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1073// 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)1074// CHECK9-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11075// CHECK9-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11076// CHECK9-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP23]]1077// CHECK9-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE12]], label [[OMP_ARRAYCPY_BODY]]1078// CHECK9: omp.arraycpy.done12:1079// CHECK9-NEXT: [[TMP24:%.*]] = load ptr, ptr [[_TMP6]], align 81080// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[TMP4]], ptr align 4 [[TMP24]], i64 4, i1 false)1081// CHECK9-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]1082// CHECK9: .omp.lastprivate.done:1083// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]1084// CHECK9-NEXT: [[ARRAY_BEGIN13:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 01085// CHECK9-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN13]], i64 21086// CHECK9-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1087// CHECK9: arraydestroy.body:1088// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP25]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1089// CHECK9-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11090// CHECK9-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1091// CHECK9-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN13]]1092// CHECK9-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE14:%.*]], label [[ARRAYDESTROY_BODY]]1093// CHECK9: arraydestroy.done14:1094// CHECK9-NEXT: ret void1095//1096//1097// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiED1Ev1098// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1099// CHECK9-NEXT: entry:1100// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81101// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81102// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81103// CHECK9-NEXT: call void @_ZN1SIiED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]1104// CHECK9-NEXT: ret void1105//1106//1107// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ev1108// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1109// CHECK9-NEXT: entry:1110// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81111// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81112// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81113// CHECK9-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01114// CHECK9-NEXT: store i32 0, ptr [[F]], align 41115// CHECK9-NEXT: ret void1116//1117//1118// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ei1119// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef signext [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {1120// CHECK9-NEXT: entry:1121// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81122// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca i32, align 41123// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81124// CHECK9-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 41125// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81126// CHECK9-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01127// CHECK9-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 41128// CHECK9-NEXT: store i32 [[TMP0]], ptr [[F]], align 41129// CHECK9-NEXT: ret void1130//1131//1132// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiED2Ev1133// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1134// CHECK9-NEXT: entry:1135// CHECK9-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81136// CHECK9-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81137// CHECK9-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81138// CHECK9-NEXT: ret void1139//1140//1141// CHECK11-LABEL: define {{[^@]+}}@main1142// CHECK11-SAME: () #[[ATTR0:[0-9]+]] {1143// CHECK11-NEXT: entry:1144// CHECK11-NEXT: [[RETVAL:%.*]] = alloca i32, align 41145// CHECK11-NEXT: [[G:%.*]] = alloca double, align 81146// CHECK11-NEXT: [[G1:%.*]] = alloca ptr, align 41147// CHECK11-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S:%.*]], align 41148// CHECK11-NEXT: [[T_VAR:%.*]] = alloca i32, align 41149// CHECK11-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 41150// CHECK11-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S], align 41151// CHECK11-NEXT: [[VAR:%.*]] = alloca ptr, align 41152// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41153// CHECK11-NEXT: [[T_VAR_CASTED:%.*]] = alloca i32, align 41154// CHECK11-NEXT: [[SVAR_CASTED:%.*]] = alloca i32, align 41155// CHECK11-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [5 x ptr], align 41156// CHECK11-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [5 x ptr], align 41157// CHECK11-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [5 x ptr], align 41158// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 41159// CHECK11-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 81160// CHECK11-NEXT: [[I:%.*]] = alloca i32, align 41161// CHECK11-NEXT: store i32 0, ptr [[RETVAL]], align 41162// CHECK11-NEXT: store ptr [[G]], ptr [[G1]], align 41163// CHECK11-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])1164// CHECK11-NEXT: store i32 0, ptr [[T_VAR]], align 41165// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[VEC]], ptr align 4 @__const.main.vec, i32 8, i1 false)1166// CHECK11-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], float noundef 1.000000e+00)1167// CHECK11-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i32 11168// CHECK11-NEXT: call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], float noundef 2.000000e+00)1169// CHECK11-NEXT: store ptr [[TEST]], ptr [[VAR]], align 41170// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 41171// CHECK11-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 41172// CHECK11-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_VAR]], align 41173// CHECK11-NEXT: store i32 [[TMP1]], ptr [[T_VAR_CASTED]], align 41174// CHECK11-NEXT: [[TMP2:%.*]] = load i32, ptr [[T_VAR_CASTED]], align 41175// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 41176// CHECK11-NEXT: [[TMP4:%.*]] = load i32, ptr @_ZZ4mainE4svar, align 41177// CHECK11-NEXT: store i32 [[TMP4]], ptr [[SVAR_CASTED]], align 41178// CHECK11-NEXT: [[TMP5:%.*]] = load i32, ptr [[SVAR_CASTED]], align 41179// CHECK11-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP]], align 41180// CHECK11-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP]], align 41181// CHECK11-NEXT: [[TMP8:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01182// CHECK11-NEXT: store i32 [[TMP2]], ptr [[TMP8]], align 41183// CHECK11-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01184// CHECK11-NEXT: store i32 [[TMP2]], ptr [[TMP9]], align 41185// CHECK11-NEXT: [[TMP10:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 01186// CHECK11-NEXT: store ptr null, ptr [[TMP10]], align 41187// CHECK11-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 11188// CHECK11-NEXT: store ptr [[VEC]], ptr [[TMP11]], align 41189// CHECK11-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 11190// CHECK11-NEXT: store ptr [[VEC]], ptr [[TMP12]], align 41191// CHECK11-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 11192// CHECK11-NEXT: store ptr null, ptr [[TMP13]], align 41193// CHECK11-NEXT: [[TMP14:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 21194// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[TMP14]], align 41195// CHECK11-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 21196// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[TMP15]], align 41197// CHECK11-NEXT: [[TMP16:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 21198// CHECK11-NEXT: store ptr null, ptr [[TMP16]], align 41199// CHECK11-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 31200// CHECK11-NEXT: store ptr [[TMP6]], ptr [[TMP17]], align 41201// CHECK11-NEXT: [[TMP18:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 31202// CHECK11-NEXT: store ptr [[TMP7]], ptr [[TMP18]], align 41203// CHECK11-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 31204// CHECK11-NEXT: store ptr null, ptr [[TMP19]], align 41205// CHECK11-NEXT: [[TMP20:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 41206// CHECK11-NEXT: store i32 [[TMP5]], ptr [[TMP20]], align 41207// CHECK11-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 41208// CHECK11-NEXT: store i32 [[TMP5]], ptr [[TMP21]], align 41209// CHECK11-NEXT: [[TMP22:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 41210// CHECK11-NEXT: store ptr null, ptr [[TMP22]], align 41211// CHECK11-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01212// CHECK11-NEXT: [[TMP24:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01213// CHECK11-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 01214// CHECK11-NEXT: store i32 3, ptr [[TMP25]], align 41215// CHECK11-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11216// CHECK11-NEXT: store i32 5, ptr [[TMP26]], align 41217// CHECK11-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 21218// CHECK11-NEXT: store ptr [[TMP23]], ptr [[TMP27]], align 41219// CHECK11-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 31220// CHECK11-NEXT: store ptr [[TMP24]], ptr [[TMP28]], align 41221// CHECK11-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 41222// CHECK11-NEXT: store ptr @.offload_sizes, ptr [[TMP29]], align 41223// CHECK11-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 51224// CHECK11-NEXT: store ptr @.offload_maptypes, ptr [[TMP30]], align 41225// CHECK11-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 61226// CHECK11-NEXT: store ptr null, ptr [[TMP31]], align 41227// CHECK11-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 71228// CHECK11-NEXT: store ptr null, ptr [[TMP32]], align 41229// CHECK11-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 81230// CHECK11-NEXT: store i64 2, ptr [[TMP33]], align 81231// CHECK11-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 91232// CHECK11-NEXT: store i64 0, ptr [[TMP34]], align 81233// CHECK11-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 101234// CHECK11-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP35]], align 41235// CHECK11-NEXT: [[TMP36:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 111236// CHECK11-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP36]], align 41237// CHECK11-NEXT: [[TMP37:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 121238// CHECK11-NEXT: store i32 0, ptr [[TMP37]], align 41239// CHECK11-NEXT: [[TMP38:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l96.region_id, ptr [[KERNEL_ARGS]])1240// CHECK11-NEXT: [[TMP39:%.*]] = icmp ne i32 [[TMP38]], 01241// CHECK11-NEXT: br i1 [[TMP39]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]1242// CHECK11: omp_offload.failed:1243// CHECK11-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l96(i32 [[TMP2]], ptr [[VEC]], ptr [[S_ARR]], ptr [[TMP3]], i32 [[TMP5]]) #[[ATTR4:[0-9]+]]1244// CHECK11-NEXT: br label [[OMP_OFFLOAD_CONT]]1245// CHECK11: omp_offload.cont:1246// CHECK11-NEXT: [[CALL:%.*]] = call noundef i32 @_Z5tmainIiET_v()1247// CHECK11-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 41248// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 01249// CHECK11-NEXT: [[TMP40:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i32 21250// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1251// CHECK11: arraydestroy.body:1252// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP40]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1253// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11254// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1255// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]1256// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]1257// CHECK11: arraydestroy.done2:1258// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]1259// CHECK11-NEXT: [[TMP41:%.*]] = load i32, ptr [[RETVAL]], align 41260// CHECK11-NEXT: ret i32 [[TMP41]]1261//1262//1263// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ev1264// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {1265// CHECK11-NEXT: entry:1266// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41267// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41268// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41269// CHECK11-NEXT: call void @_ZN1SIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])1270// CHECK11-NEXT: ret void1271//1272//1273// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ef1274// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1275// CHECK11-NEXT: entry:1276// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41277// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca float, align 41278// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41279// CHECK11-NEXT: store float [[A]], ptr [[A_ADDR]], align 41280// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41281// CHECK11-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 41282// CHECK11-NEXT: call void @_ZN1SIfEC2Ef(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], float noundef [[TMP0]])1283// CHECK11-NEXT: ret void1284//1285//1286// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l961287// 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]+]] {1288// CHECK11-NEXT: entry:1289// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca i32, align 41290// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 41291// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 41292// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 41293// CHECK11-NEXT: [[SVAR_ADDR:%.*]] = alloca i32, align 41294// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41295// CHECK11-NEXT: store i32 [[T_VAR]], ptr [[T_VAR_ADDR]], align 41296// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 41297// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 41298// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 41299// CHECK11-NEXT: store i32 [[SVAR]], ptr [[SVAR_ADDR]], align 41300// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 41301// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 41302// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR_ADDR]], align 41303// CHECK11-NEXT: store ptr [[TMP2]], ptr [[TMP]], align 41304// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 41305// CHECK11-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 5, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l96.omp_outlined, ptr [[TMP0]], ptr [[T_VAR_ADDR]], ptr [[TMP1]], ptr [[TMP3]], ptr [[SVAR_ADDR]])1306// CHECK11-NEXT: ret void1307//1308//1309// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l96.omp_outlined1310// 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]] {1311// CHECK11-NEXT: entry:1312// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41313// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41314// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 41315// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 41316// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 41317// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 41318// CHECK11-NEXT: [[SVAR_ADDR:%.*]] = alloca ptr, align 41319// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41320// CHECK11-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41321// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 41322// CHECK11-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41323// CHECK11-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41324// CHECK11-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41325// CHECK11-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41326// CHECK11-NEXT: [[T_VAR2:%.*]] = alloca i32, align 41327// CHECK11-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 41328// CHECK11-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S], align 41329// CHECK11-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S:%.*]], align 41330// CHECK11-NEXT: [[_TMP6:%.*]] = alloca ptr, align 41331// CHECK11-NEXT: [[SVAR7:%.*]] = alloca i32, align 41332// CHECK11-NEXT: [[I:%.*]] = alloca i32, align 41333// CHECK11-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41334// CHECK11-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41335// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 41336// CHECK11-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 41337// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 41338// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 41339// CHECK11-NEXT: store ptr [[SVAR]], ptr [[SVAR_ADDR]], align 41340// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 41341// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 41342// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 41343// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 41344// CHECK11-NEXT: [[TMP4:%.*]] = load ptr, ptr [[SVAR_ADDR]], align 41345// CHECK11-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 41346// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41347// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 41348// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41349// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41350// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 01351// CHECK11-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i32 21352// CHECK11-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]1353// CHECK11: arrayctor.loop:1354// CHECK11-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1355// CHECK11-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1356// CHECK11-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i32 11357// CHECK11-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1358// CHECK11-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1359// CHECK11: arrayctor.cont:1360// CHECK11-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 41361// CHECK11-NEXT: call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])1362// CHECK11-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 41363// CHECK11-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41364// CHECK11-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 41365// CHECK11-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP7]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1366// CHECK11-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41367// CHECK11-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP8]], 11368// CHECK11-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1369// CHECK11: cond.true:1370// CHECK11-NEXT: br label [[COND_END:%.*]]1371// CHECK11: cond.false:1372// CHECK11-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41373// CHECK11-NEXT: br label [[COND_END]]1374// CHECK11: cond.end:1375// CHECK11-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]1376// CHECK11-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41377// CHECK11-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41378// CHECK11-NEXT: store i32 [[TMP10]], ptr [[DOTOMP_IV]], align 41379// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1380// CHECK11: omp.inner.for.cond:1381// CHECK11-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41382// CHECK11-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41383// CHECK11-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]1384// CHECK11-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1385// CHECK11: omp.inner.for.cond.cleanup:1386// CHECK11-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1387// CHECK11: omp.inner.for.body:1388// CHECK11-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41389// CHECK11-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 11390// CHECK11-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1391// CHECK11-NEXT: store i32 [[ADD]], ptr [[I]], align 41392// CHECK11-NEXT: [[TMP14:%.*]] = load i32, ptr [[T_VAR2]], align 41393// CHECK11-NEXT: [[TMP15:%.*]] = load i32, ptr [[I]], align 41394// CHECK11-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC3]], i32 0, i32 [[TMP15]]1395// CHECK11-NEXT: store i32 [[TMP14]], ptr [[ARRAYIDX]], align 41396// CHECK11-NEXT: [[TMP16:%.*]] = load ptr, ptr [[_TMP6]], align 41397// CHECK11-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 41398// CHECK11-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 [[TMP17]]1399// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[ARRAYIDX9]], ptr align 4 [[TMP16]], i32 4, i1 false)1400// CHECK11-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1401// CHECK11: omp.body.continue:1402// CHECK11-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1403// CHECK11: omp.inner.for.inc:1404// CHECK11-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41405// CHECK11-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP18]], 11406// CHECK11-NEXT: store i32 [[ADD10]], ptr [[DOTOMP_IV]], align 41407// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND]]1408// CHECK11: omp.inner.for.end:1409// CHECK11-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1410// CHECK11: omp.loop.exit:1411// CHECK11-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41412// CHECK11-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 41413// CHECK11-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP20]])1414// CHECK11-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41415// CHECK11-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 01416// CHECK11-NEXT: br i1 [[TMP22]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]1417// CHECK11: .omp.lastprivate.then:1418// CHECK11-NEXT: [[TMP23:%.*]] = load i32, ptr [[T_VAR2]], align 41419// CHECK11-NEXT: store i32 [[TMP23]], ptr [[TMP1]], align 41420// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i32 8, i1 false)1421// CHECK11-NEXT: [[ARRAY_BEGIN11:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[TMP2]], i32 0, i32 01422// CHECK11-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN11]], i32 21423// CHECK11-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN11]], [[TMP24]]1424// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE12:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1425// CHECK11: omp.arraycpy.body:1426// CHECK11-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1427// CHECK11-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN11]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1428// 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)1429// CHECK11-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11430// CHECK11-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11431// CHECK11-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP24]]1432// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE12]], label [[OMP_ARRAYCPY_BODY]]1433// CHECK11: omp.arraycpy.done12:1434// CHECK11-NEXT: [[TMP25:%.*]] = load ptr, ptr [[_TMP6]], align 41435// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP5]], ptr align 4 [[TMP25]], i32 4, i1 false)1436// CHECK11-NEXT: [[TMP26:%.*]] = load i32, ptr [[SVAR7]], align 41437// CHECK11-NEXT: store i32 [[TMP26]], ptr [[TMP4]], align 41438// CHECK11-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]1439// CHECK11: .omp.lastprivate.done:1440// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]1441// CHECK11-NEXT: [[ARRAY_BEGIN13:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR4]], i32 0, i32 01442// CHECK11-NEXT: [[TMP27:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN13]], i32 21443// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1444// CHECK11: arraydestroy.body:1445// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP27]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1446// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11447// CHECK11-NEXT: call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1448// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN13]]1449// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE14:%.*]], label [[ARRAYDESTROY_BODY]]1450// CHECK11: arraydestroy.done14:1451// CHECK11-NEXT: ret void1452//1453//1454// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfED1Ev1455// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1456// CHECK11-NEXT: entry:1457// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41458// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41459// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41460// CHECK11-NEXT: call void @_ZN1SIfED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]1461// CHECK11-NEXT: ret void1462//1463//1464// CHECK11-LABEL: define {{[^@]+}}@_Z5tmainIiET_v1465// CHECK11-SAME: () #[[ATTR1]] comdat {1466// CHECK11-NEXT: entry:1467// CHECK11-NEXT: [[RETVAL:%.*]] = alloca i32, align 41468// CHECK11-NEXT: [[TEST:%.*]] = alloca [[STRUCT_S_0:%.*]], align 41469// CHECK11-NEXT: [[T_VAR:%.*]] = alloca i32, align 41470// CHECK11-NEXT: [[VEC:%.*]] = alloca [2 x i32], align 41471// CHECK11-NEXT: [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 41472// CHECK11-NEXT: [[VAR:%.*]] = alloca ptr, align 41473// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41474// CHECK11-NEXT: [[T_VAR_CASTED:%.*]] = alloca i32, align 41475// CHECK11-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x ptr], align 41476// CHECK11-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x ptr], align 41477// CHECK11-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x ptr], align 41478// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 41479// CHECK11-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 81480// CHECK11-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])1481// CHECK11-NEXT: store i32 0, ptr [[T_VAR]], align 41482// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[VEC]], ptr align 4 @__const._Z5tmainIiET_v.vec, i32 8, i1 false)1483// CHECK11-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], i32 noundef 1)1484// CHECK11-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i32 11485// CHECK11-NEXT: call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], i32 noundef 2)1486// CHECK11-NEXT: store ptr [[TEST]], ptr [[VAR]], align 41487// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VAR]], align 41488// CHECK11-NEXT: store ptr [[TMP0]], ptr [[TMP]], align 41489// CHECK11-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_VAR]], align 41490// CHECK11-NEXT: store i32 [[TMP1]], ptr [[T_VAR_CASTED]], align 41491// CHECK11-NEXT: [[TMP2:%.*]] = load i32, ptr [[T_VAR_CASTED]], align 41492// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 41493// CHECK11-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 41494// CHECK11-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP]], align 41495// CHECK11-NEXT: [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01496// CHECK11-NEXT: store i32 [[TMP2]], ptr [[TMP6]], align 41497// CHECK11-NEXT: [[TMP7:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01498// CHECK11-NEXT: store i32 [[TMP2]], ptr [[TMP7]], align 41499// CHECK11-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 01500// CHECK11-NEXT: store ptr null, ptr [[TMP8]], align 41501// CHECK11-NEXT: [[TMP9:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 11502// CHECK11-NEXT: store ptr [[VEC]], ptr [[TMP9]], align 41503// CHECK11-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 11504// CHECK11-NEXT: store ptr [[VEC]], ptr [[TMP10]], align 41505// CHECK11-NEXT: [[TMP11:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 11506// CHECK11-NEXT: store ptr null, ptr [[TMP11]], align 41507// CHECK11-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 21508// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[TMP12]], align 41509// CHECK11-NEXT: [[TMP13:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 21510// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[TMP13]], align 41511// CHECK11-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 21512// CHECK11-NEXT: store ptr null, ptr [[TMP14]], align 41513// CHECK11-NEXT: [[TMP15:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 31514// CHECK11-NEXT: store ptr [[TMP4]], ptr [[TMP15]], align 41515// CHECK11-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 31516// CHECK11-NEXT: store ptr [[TMP5]], ptr [[TMP16]], align 41517// CHECK11-NEXT: [[TMP17:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 31518// CHECK11-NEXT: store ptr null, ptr [[TMP17]], align 41519// CHECK11-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01520// CHECK11-NEXT: [[TMP19:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01521// CHECK11-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 01522// CHECK11-NEXT: store i32 3, ptr [[TMP20]], align 41523// CHECK11-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11524// CHECK11-NEXT: store i32 4, ptr [[TMP21]], align 41525// CHECK11-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 21526// CHECK11-NEXT: store ptr [[TMP18]], ptr [[TMP22]], align 41527// CHECK11-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 31528// CHECK11-NEXT: store ptr [[TMP19]], ptr [[TMP23]], align 41529// CHECK11-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 41530// CHECK11-NEXT: store ptr @.offload_sizes.1, ptr [[TMP24]], align 41531// CHECK11-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 51532// CHECK11-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP25]], align 41533// CHECK11-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 61534// CHECK11-NEXT: store ptr null, ptr [[TMP26]], align 41535// CHECK11-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 71536// CHECK11-NEXT: store ptr null, ptr [[TMP27]], align 41537// CHECK11-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 81538// CHECK11-NEXT: store i64 2, ptr [[TMP28]], align 81539// CHECK11-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 91540// CHECK11-NEXT: store i64 0, ptr [[TMP29]], align 81541// CHECK11-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 101542// CHECK11-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP30]], align 41543// CHECK11-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 111544// CHECK11-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP31]], align 41545// CHECK11-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 121546// CHECK11-NEXT: store i32 0, ptr [[TMP32]], align 41547// CHECK11-NEXT: [[TMP33:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.region_id, ptr [[KERNEL_ARGS]])1548// CHECK11-NEXT: [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 01549// CHECK11-NEXT: br i1 [[TMP34]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]1550// CHECK11: omp_offload.failed:1551// 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]]1552// CHECK11-NEXT: br label [[OMP_OFFLOAD_CONT]]1553// CHECK11: omp_offload.cont:1554// CHECK11-NEXT: store i32 0, ptr [[RETVAL]], align 41555// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01556// CHECK11-NEXT: [[TMP35:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i32 21557// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1558// CHECK11: arraydestroy.body:1559// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP35]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1560// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11561// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1562// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]1563// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]1564// CHECK11: arraydestroy.done2:1565// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]1566// CHECK11-NEXT: [[TMP36:%.*]] = load i32, ptr [[RETVAL]], align 41567// CHECK11-NEXT: ret i32 [[TMP36]]1568//1569//1570// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev1571// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1572// CHECK11-NEXT: entry:1573// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41574// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41575// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41576// CHECK11-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 01577// CHECK11-NEXT: store float 0.000000e+00, ptr [[F]], align 41578// CHECK11-NEXT: ret void1579//1580//1581// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef1582// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1583// CHECK11-NEXT: entry:1584// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41585// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca float, align 41586// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41587// CHECK11-NEXT: store float [[A]], ptr [[A_ADDR]], align 41588// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41589// CHECK11-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 01590// CHECK11-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 41591// CHECK11-NEXT: store float [[TMP0]], ptr [[F]], align 41592// CHECK11-NEXT: ret void1593//1594//1595// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev1596// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1597// CHECK11-NEXT: entry:1598// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41599// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41600// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41601// CHECK11-NEXT: ret void1602//1603//1604// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ev1605// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1606// CHECK11-NEXT: entry:1607// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41608// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41609// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41610// CHECK11-NEXT: call void @_ZN1SIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])1611// CHECK11-NEXT: ret void1612//1613//1614// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ei1615// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1616// CHECK11-NEXT: entry:1617// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41618// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca i32, align 41619// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41620// CHECK11-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 41621// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41622// CHECK11-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 41623// CHECK11-NEXT: call void @_ZN1SIiEC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]])1624// CHECK11-NEXT: ret void1625//1626//1627// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l491628// 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]] {1629// CHECK11-NEXT: entry:1630// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca i32, align 41631// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 41632// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 41633// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 41634// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41635// CHECK11-NEXT: store i32 [[T_VAR]], ptr [[T_VAR_ADDR]], align 41636// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 41637// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 41638// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 41639// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 41640// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 41641// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VAR_ADDR]], align 41642// CHECK11-NEXT: store ptr [[TMP2]], ptr [[TMP]], align 41643// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 41644// CHECK11-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], 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]])1645// CHECK11-NEXT: ret void1646//1647//1648// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined1649// 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]] {1650// CHECK11-NEXT: entry:1651// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41652// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41653// CHECK11-NEXT: [[VEC_ADDR:%.*]] = alloca ptr, align 41654// CHECK11-NEXT: [[T_VAR_ADDR:%.*]] = alloca ptr, align 41655// CHECK11-NEXT: [[S_ARR_ADDR:%.*]] = alloca ptr, align 41656// CHECK11-NEXT: [[VAR_ADDR:%.*]] = alloca ptr, align 41657// CHECK11-NEXT: [[TMP:%.*]] = alloca ptr, align 41658// CHECK11-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41659// CHECK11-NEXT: [[_TMP1:%.*]] = alloca i32, align 41660// CHECK11-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41661// CHECK11-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41662// CHECK11-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41663// CHECK11-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41664// CHECK11-NEXT: [[T_VAR2:%.*]] = alloca i32, align 41665// CHECK11-NEXT: [[VEC3:%.*]] = alloca [2 x i32], align 41666// CHECK11-NEXT: [[S_ARR4:%.*]] = alloca [2 x %struct.S.0], align 41667// CHECK11-NEXT: [[VAR5:%.*]] = alloca [[STRUCT_S_0:%.*]], align 41668// CHECK11-NEXT: [[_TMP6:%.*]] = alloca ptr, align 41669// CHECK11-NEXT: [[I:%.*]] = alloca i32, align 41670// CHECK11-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41671// CHECK11-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41672// CHECK11-NEXT: store ptr [[VEC]], ptr [[VEC_ADDR]], align 41673// CHECK11-NEXT: store ptr [[T_VAR]], ptr [[T_VAR_ADDR]], align 41674// CHECK11-NEXT: store ptr [[S_ARR]], ptr [[S_ARR_ADDR]], align 41675// CHECK11-NEXT: store ptr [[VAR]], ptr [[VAR_ADDR]], align 41676// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[VEC_ADDR]], align 41677// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[T_VAR_ADDR]], align 41678// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[S_ARR_ADDR]], align 41679// CHECK11-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VAR_ADDR]], align 41680// CHECK11-NEXT: store ptr [[TMP3]], ptr [[TMP]], align 41681// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41682// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_UB]], align 41683// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41684// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41685// CHECK11-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 01686// CHECK11-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i32 21687// CHECK11-NEXT: br label [[ARRAYCTOR_LOOP:%.*]]1688// CHECK11: arrayctor.loop:1689// CHECK11-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1690// CHECK11-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1691// CHECK11-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i32 11692// CHECK11-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1693// CHECK11-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1694// CHECK11: arrayctor.cont:1695// CHECK11-NEXT: [[TMP4:%.*]] = load ptr, ptr [[TMP]], align 41696// CHECK11-NEXT: call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]])1697// CHECK11-NEXT: store ptr [[VAR5]], ptr [[_TMP6]], align 41698// CHECK11-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41699// CHECK11-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 41700// CHECK11-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP6]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1701// CHECK11-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41702// CHECK11-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP7]], 11703// CHECK11-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1704// CHECK11: cond.true:1705// CHECK11-NEXT: br label [[COND_END:%.*]]1706// CHECK11: cond.false:1707// CHECK11-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41708// CHECK11-NEXT: br label [[COND_END]]1709// CHECK11: cond.end:1710// CHECK11-NEXT: [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP8]], [[COND_FALSE]] ]1711// CHECK11-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41712// CHECK11-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41713// CHECK11-NEXT: store i32 [[TMP9]], ptr [[DOTOMP_IV]], align 41714// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1715// CHECK11: omp.inner.for.cond:1716// CHECK11-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41717// CHECK11-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41718// CHECK11-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]1719// CHECK11-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1720// CHECK11: omp.inner.for.cond.cleanup:1721// CHECK11-NEXT: br label [[OMP_INNER_FOR_END:%.*]]1722// CHECK11: omp.inner.for.body:1723// CHECK11-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41724// CHECK11-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP12]], 11725// CHECK11-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1726// CHECK11-NEXT: store i32 [[ADD]], ptr [[I]], align 41727// CHECK11-NEXT: [[TMP13:%.*]] = load i32, ptr [[T_VAR2]], align 41728// CHECK11-NEXT: [[TMP14:%.*]] = load i32, ptr [[I]], align 41729// CHECK11-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC3]], i32 0, i32 [[TMP14]]1730// CHECK11-NEXT: store i32 [[TMP13]], ptr [[ARRAYIDX]], align 41731// CHECK11-NEXT: [[TMP15:%.*]] = load ptr, ptr [[_TMP6]], align 41732// CHECK11-NEXT: [[TMP16:%.*]] = load i32, ptr [[I]], align 41733// CHECK11-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 [[TMP16]]1734// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[ARRAYIDX8]], ptr align 4 [[TMP15]], i32 4, i1 false)1735// CHECK11-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1736// CHECK11: omp.body.continue:1737// CHECK11-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1738// CHECK11: omp.inner.for.inc:1739// CHECK11-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41740// CHECK11-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP17]], 11741// CHECK11-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 41742// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND]]1743// CHECK11: omp.inner.for.end:1744// CHECK11-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1745// CHECK11: omp.loop.exit:1746// CHECK11-NEXT: [[TMP18:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41747// CHECK11-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP18]], align 41748// CHECK11-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP19]])1749// CHECK11-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41750// CHECK11-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 01751// CHECK11-NEXT: br i1 [[TMP21]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]1752// CHECK11: .omp.lastprivate.then:1753// CHECK11-NEXT: [[TMP22:%.*]] = load i32, ptr [[T_VAR2]], align 41754// CHECK11-NEXT: store i32 [[TMP22]], ptr [[TMP1]], align 41755// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP0]], ptr align 4 [[VEC3]], i32 8, i1 false)1756// CHECK11-NEXT: [[ARRAY_BEGIN10:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[TMP2]], i32 0, i32 01757// CHECK11-NEXT: [[TMP23:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN10]], i32 21758// CHECK11-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN10]], [[TMP23]]1759// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE11:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]1760// CHECK11: omp.arraycpy.body:1761// CHECK11-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[S_ARR4]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1762// CHECK11-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN10]], [[DOTOMP_LASTPRIVATE_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]1763// 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)1764// CHECK11-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 11765// CHECK11-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S_0]], ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 11766// CHECK11-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP23]]1767// CHECK11-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE11]], label [[OMP_ARRAYCPY_BODY]]1768// CHECK11: omp.arraycpy.done11:1769// CHECK11-NEXT: [[TMP24:%.*]] = load ptr, ptr [[_TMP6]], align 41770// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP4]], ptr align 4 [[TMP24]], i32 4, i1 false)1771// CHECK11-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]1772// CHECK11: .omp.lastprivate.done:1773// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR5]]) #[[ATTR4]]1774// CHECK11-NEXT: [[ARRAY_BEGIN12:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR4]], i32 0, i32 01775// CHECK11-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN12]], i32 21776// CHECK11-NEXT: br label [[ARRAYDESTROY_BODY:%.*]]1777// CHECK11: arraydestroy.body:1778// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP25]], [[DOTOMP_LASTPRIVATE_DONE]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1779// CHECK11-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11780// CHECK11-NEXT: call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1781// CHECK11-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN12]]1782// CHECK11-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE13:%.*]], label [[ARRAYDESTROY_BODY]]1783// CHECK11: arraydestroy.done13:1784// CHECK11-NEXT: ret void1785//1786//1787// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiED1Ev1788// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1789// CHECK11-NEXT: entry:1790// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41791// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41792// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41793// CHECK11-NEXT: call void @_ZN1SIiED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]1794// CHECK11-NEXT: ret void1795//1796//1797// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ev1798// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1799// CHECK11-NEXT: entry:1800// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41801// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41802// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41803// CHECK11-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01804// CHECK11-NEXT: store i32 0, ptr [[F]], align 41805// CHECK11-NEXT: ret void1806//1807//1808// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ei1809// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1810// CHECK11-NEXT: entry:1811// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41812// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca i32, align 41813// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41814// CHECK11-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 41815// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41816// CHECK11-NEXT: [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01817// CHECK11-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 41818// CHECK11-NEXT: store i32 [[TMP0]], ptr [[F]], align 41819// CHECK11-NEXT: ret void1820//1821//1822// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiED2Ev1823// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1824// CHECK11-NEXT: entry:1825// CHECK11-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 41826// CHECK11-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 41827// CHECK11-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41828// CHECK11-NEXT: ret void1829//1830