brintos

brintos / llvm-project-archived public Read only

0
0
Text · 124.7 KiB · b4bc232 Raw
1903 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 - | 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 %s4// 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 - | 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 - | 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 %s7// 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 - | 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 - | 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 %s11// 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 - | 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 - | 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 %s14// 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 - | 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 - | 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 %s18// 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 - | 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 - | 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 %s21// 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 - | 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 - | 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 %s25// 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 - | 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 - | 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 %s28// 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 - | 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 teams51  #pragma omp distribute parallel for private(t_var, vec, s_arr, s_arr, var, var)52  for (int i = 0; i < 2; ++i) {53    vec[i] = t_var;54    s_arr[i] = var;55  }56  return T();57}58 59int main() {60  static int svar;61  volatile double g;62  volatile double &g1 = g;63 64  #ifdef LAMBDA65  [&]() {66    static float sfvar;67 68    #pragma omp target69    #pragma omp teams70    #pragma omp distribute parallel for private(g, g1, svar, sfvar)71    for (int i = 0; i < 2; ++i) {72 73 74      g = 1;75      g1 = 1;76      svar = 3;77      sfvar = 4.0;78      [&]() {79	g = 2;80	g1 = 2;81	svar = 4;82	sfvar = 8.0;83 84      }();85    }86  }();87  return 0;88  #else89  S<float> test;90  int t_var = 0;91  int vec[] = {1, 2};92  S<float> s_arr[] = {1, 2};93  S<float> &var = test;94 95  #pragma omp target96  #pragma omp teams97  #pragma omp distribute parallel for private(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  return tmain<int>();103  #endif104}105 106 107 108// this is the ctor loop109 110// call destructors: var..111 112// ..and s_arr113 114 115// By OpenMP specifications, private applies to both distribute and parallel for.116// However, the support for 'private' of 'parallel' is only used when 'parallel'117// is found alone. Therefore we only have one 'private' support for 'parallel for'118// in combination119// this is the ctor loop120 121// call destructors: var..122 123// ..and s_arr124 125 126// template tmain with S_INT_TY127 128 129 130// this is the ctor loop131 132// call destructors: var..133 134// ..and s_arr135 136 137#endif138// CHECK1-LABEL: define {{[^@]+}}@main139// CHECK1-SAME: () #[[ATTR0:[0-9]+]] {140// CHECK1-NEXT:  entry:141// CHECK1-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4142// CHECK1-NEXT:    [[G:%.*]] = alloca double, align 8143// CHECK1-NEXT:    [[G1:%.*]] = alloca ptr, align 8144// CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 1145// CHECK1-NEXT:    store i32 0, ptr [[RETVAL]], align 4146// CHECK1-NEXT:    store ptr [[G]], ptr [[G1]], align 8147// CHECK1-NEXT:    call void @"_ZZ4mainENK3$_0clEv"(ptr noundef nonnull align 1 dereferenceable(1) [[REF_TMP]])148// CHECK1-NEXT:    ret i32 0149//150//151// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68152// CHECK1-SAME: () #[[ATTR2:[0-9]+]] {153// CHECK1-NEXT:  entry:154// CHECK1-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3:[0-9]+]], i32 0, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68.omp_outlined)155// CHECK1-NEXT:    ret void156//157//158// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68.omp_outlined159// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR2]] {160// CHECK1-NEXT:  entry:161// CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8162// CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8163// CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4164// CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4165// CHECK1-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8166// CHECK1-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4167// CHECK1-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4168// CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4169// CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4170// CHECK1-NEXT:    [[G:%.*]] = alloca double, align 8171// CHECK1-NEXT:    [[G1:%.*]] = alloca double, align 8172// CHECK1-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 8173// CHECK1-NEXT:    [[SVAR:%.*]] = alloca i32, align 4174// CHECK1-NEXT:    [[SFVAR:%.*]] = alloca float, align 4175// CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4176// CHECK1-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8177// CHECK1-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8178// CHECK1-NEXT:    store ptr undef, ptr [[_TMP1]], align 8179// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_COMB_LB]], align 4180// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_COMB_UB]], align 4181// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4182// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4183// CHECK1-NEXT:    store ptr [[G1]], ptr [[_TMP2]], align 8184// CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8185// CHECK1-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4186// CHECK1-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP1]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)187// CHECK1-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4188// CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 1189// CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]190// CHECK1:       cond.true:191// CHECK1-NEXT:    br label [[COND_END:%.*]]192// CHECK1:       cond.false:193// CHECK1-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4194// CHECK1-NEXT:    br label [[COND_END]]195// CHECK1:       cond.end:196// CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]197// CHECK1-NEXT:    store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4198// CHECK1-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4199// CHECK1-NEXT:    store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4200// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]201// CHECK1:       omp.inner.for.cond:202// CHECK1-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4203// CHECK1-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4204// CHECK1-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]205// CHECK1-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]206// CHECK1:       omp.inner.for.body:207// CHECK1-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4208// CHECK1-NEXT:    [[TMP8:%.*]] = zext i32 [[TMP7]] to i64209// CHECK1-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4210// CHECK1-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP9]] to i64211// CHECK1-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68.omp_outlined.omp_outlined, i64 [[TMP8]], i64 [[TMP10]])212// CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]213// CHECK1:       omp.inner.for.inc:214// CHECK1-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4215// CHECK1-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4216// CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]217// CHECK1-NEXT:    store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4218// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]219// CHECK1:       omp.inner.for.end:220// CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]221// CHECK1:       omp.loop.exit:222// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])223// CHECK1-NEXT:    ret void224//225//226// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68.omp_outlined.omp_outlined227// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR2]] {228// CHECK1-NEXT:  entry:229// CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8230// CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8231// CHECK1-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8232// CHECK1-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8233// CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4234// CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4235// CHECK1-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8236// CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4237// CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4238// CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4239// CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4240// CHECK1-NEXT:    [[G:%.*]] = alloca double, align 8241// CHECK1-NEXT:    [[G1:%.*]] = alloca double, align 8242// CHECK1-NEXT:    [[_TMP3:%.*]] = alloca ptr, align 8243// CHECK1-NEXT:    [[SVAR:%.*]] = alloca i32, align 4244// CHECK1-NEXT:    [[SFVAR:%.*]] = alloca float, align 4245// CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4246// CHECK1-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 8247// CHECK1-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8248// CHECK1-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8249// CHECK1-NEXT:    store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 8250// CHECK1-NEXT:    store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 8251// CHECK1-NEXT:    store ptr undef, ptr [[_TMP1]], align 8252// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4253// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_UB]], align 4254// CHECK1-NEXT:    [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 8255// CHECK1-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP0]] to i32256// CHECK1-NEXT:    [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8257// CHECK1-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP1]] to i32258// CHECK1-NEXT:    store i32 [[CONV]], ptr [[DOTOMP_LB]], align 4259// CHECK1-NEXT:    store i32 [[CONV2]], ptr [[DOTOMP_UB]], align 4260// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4261// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4262// CHECK1-NEXT:    store ptr [[G1]], ptr [[_TMP3]], align 8263// CHECK1-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8264// CHECK1-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4265// CHECK1-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)266// CHECK1-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4267// CHECK1-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 1268// CHECK1-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]269// CHECK1:       cond.true:270// CHECK1-NEXT:    br label [[COND_END:%.*]]271// CHECK1:       cond.false:272// CHECK1-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4273// CHECK1-NEXT:    br label [[COND_END]]274// CHECK1:       cond.end:275// CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]276// CHECK1-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4277// CHECK1-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4278// CHECK1-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 4279// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]280// CHECK1:       omp.inner.for.cond:281// CHECK1-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4282// CHECK1-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4283// CHECK1-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]284// CHECK1-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]285// CHECK1:       omp.inner.for.body:286// CHECK1-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4287// CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP9]], 1288// CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]289// CHECK1-NEXT:    store i32 [[ADD]], ptr [[I]], align 4290// CHECK1-NEXT:    store double 1.000000e+00, ptr [[G]], align 8291// CHECK1-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[_TMP3]], align 8292// CHECK1-NEXT:    store volatile double 1.000000e+00, ptr [[TMP10]], align 8293// CHECK1-NEXT:    store i32 3, ptr [[SVAR]], align 4294// CHECK1-NEXT:    store float 4.000000e+00, ptr [[SFVAR]], align 4295// CHECK1-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0296// CHECK1-NEXT:    store ptr [[G]], ptr [[TMP11]], align 8297// CHECK1-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1298// CHECK1-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[_TMP3]], align 8299// CHECK1-NEXT:    store ptr [[TMP13]], ptr [[TMP12]], align 8300// CHECK1-NEXT:    [[TMP14:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2301// CHECK1-NEXT:    store ptr [[SVAR]], ptr [[TMP14]], align 8302// CHECK1-NEXT:    [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 3303// CHECK1-NEXT:    store ptr [[SFVAR]], ptr [[TMP15]], align 8304// CHECK1-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE_clEv"(ptr noundef nonnull align 8 dereferenceable(32) [[REF_TMP]])305// CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]306// CHECK1:       omp.body.continue:307// CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]308// CHECK1:       omp.inner.for.inc:309// CHECK1-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4310// CHECK1-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP16]], 1311// CHECK1-NEXT:    store i32 [[ADD5]], ptr [[DOTOMP_IV]], align 4312// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]313// CHECK1:       omp.inner.for.end:314// CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]315// CHECK1:       omp.loop.exit:316// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP3]])317// CHECK1-NEXT:    ret void318//319//320// CHECK3-LABEL: define {{[^@]+}}@main321// CHECK3-SAME: () #[[ATTR0:[0-9]+]] {322// CHECK3-NEXT:  entry:323// CHECK3-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4324// CHECK3-NEXT:    [[G:%.*]] = alloca double, align 8325// CHECK3-NEXT:    [[G1:%.*]] = alloca ptr, align 4326// CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 1327// CHECK3-NEXT:    store i32 0, ptr [[RETVAL]], align 4328// CHECK3-NEXT:    store ptr [[G]], ptr [[G1]], align 4329// CHECK3-NEXT:    call void @"_ZZ4mainENK3$_0clEv"(ptr noundef nonnull align 1 dereferenceable(1) [[REF_TMP]])330// CHECK3-NEXT:    ret i32 0331//332//333// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68334// CHECK3-SAME: () #[[ATTR2:[0-9]+]] {335// CHECK3-NEXT:  entry:336// CHECK3-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3:[0-9]+]], i32 0, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68.omp_outlined)337// CHECK3-NEXT:    ret void338//339//340// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68.omp_outlined341// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR2]] {342// CHECK3-NEXT:  entry:343// CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4344// CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4345// CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4346// CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4347// CHECK3-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 4348// CHECK3-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4349// CHECK3-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4350// CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4351// CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4352// CHECK3-NEXT:    [[G:%.*]] = alloca double, align 8353// CHECK3-NEXT:    [[G1:%.*]] = alloca double, align 8354// CHECK3-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 4355// CHECK3-NEXT:    [[SVAR:%.*]] = alloca i32, align 4356// CHECK3-NEXT:    [[SFVAR:%.*]] = alloca float, align 4357// CHECK3-NEXT:    [[I:%.*]] = alloca i32, 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 undef, ptr [[_TMP1]], align 4361// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_COMB_LB]], align 4362// CHECK3-NEXT:    store i32 1, ptr [[DOTOMP_COMB_UB]], align 4363// CHECK3-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4364// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4365// CHECK3-NEXT:    store ptr [[G1]], ptr [[_TMP2]], align 4366// CHECK3-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4367// CHECK3-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4368// CHECK3-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP1]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)369// CHECK3-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4370// CHECK3-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 1371// CHECK3-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]372// CHECK3:       cond.true:373// CHECK3-NEXT:    br label [[COND_END:%.*]]374// CHECK3:       cond.false:375// CHECK3-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4376// CHECK3-NEXT:    br label [[COND_END]]377// CHECK3:       cond.end:378// CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]379// CHECK3-NEXT:    store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4380// CHECK3-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4381// CHECK3-NEXT:    store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4382// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]383// CHECK3:       omp.inner.for.cond:384// CHECK3-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4385// CHECK3-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4386// CHECK3-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]387// CHECK3-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]388// CHECK3:       omp.inner.for.body:389// CHECK3-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4390// CHECK3-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4391// CHECK3-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68.omp_outlined.omp_outlined, i32 [[TMP7]], i32 [[TMP8]])392// CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]393// CHECK3:       omp.inner.for.inc:394// CHECK3-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4395// CHECK3-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4396// CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]397// CHECK3-NEXT:    store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4398// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]399// CHECK3:       omp.inner.for.end:400// CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]401// CHECK3:       omp.loop.exit:402// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])403// CHECK3-NEXT:    ret void404//405//406// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l68.omp_outlined.omp_outlined407// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR2]] {408// CHECK3-NEXT:  entry:409// CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4410// CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4411// CHECK3-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4412// CHECK3-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4413// CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4414// CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4415// CHECK3-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 4416// CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4417// CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4418// CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4419// CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4420// CHECK3-NEXT:    [[G:%.*]] = alloca double, align 8421// CHECK3-NEXT:    [[G1:%.*]] = alloca double, align 8422// CHECK3-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 4423// CHECK3-NEXT:    [[SVAR:%.*]] = alloca i32, align 4424// CHECK3-NEXT:    [[SFVAR:%.*]] = alloca float, align 4425// CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4426// CHECK3-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_ANON_0:%.*]], align 4427// CHECK3-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4428// CHECK3-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4429// CHECK3-NEXT:    store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 4430// CHECK3-NEXT:    store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 4431// CHECK3-NEXT:    store ptr undef, ptr [[_TMP1]], align 4432// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4433// CHECK3-NEXT:    store i32 1, ptr [[DOTOMP_UB]], align 4434// CHECK3-NEXT:    [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 4435// CHECK3-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 4436// CHECK3-NEXT:    store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 4437// CHECK3-NEXT:    store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 4438// CHECK3-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4439// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4440// CHECK3-NEXT:    store ptr [[G1]], ptr [[_TMP2]], align 4441// CHECK3-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4442// CHECK3-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4443// CHECK3-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)444// CHECK3-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4445// CHECK3-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 1446// CHECK3-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]447// CHECK3:       cond.true:448// CHECK3-NEXT:    br label [[COND_END:%.*]]449// CHECK3:       cond.false:450// CHECK3-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4451// CHECK3-NEXT:    br label [[COND_END]]452// CHECK3:       cond.end:453// CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]454// CHECK3-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4455// CHECK3-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4456// CHECK3-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 4457// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]458// CHECK3:       omp.inner.for.cond:459// CHECK3-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4460// CHECK3-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4461// CHECK3-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]462// CHECK3-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]463// CHECK3:       omp.inner.for.body:464// CHECK3-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4465// CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP9]], 1466// CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]467// CHECK3-NEXT:    store i32 [[ADD]], ptr [[I]], align 4468// CHECK3-NEXT:    store double 1.000000e+00, ptr [[G]], align 8469// CHECK3-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[_TMP2]], align 4470// CHECK3-NEXT:    store volatile double 1.000000e+00, ptr [[TMP10]], align 4471// CHECK3-NEXT:    store i32 3, ptr [[SVAR]], align 4472// CHECK3-NEXT:    store float 4.000000e+00, ptr [[SFVAR]], align 4473// CHECK3-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 0474// CHECK3-NEXT:    store ptr [[G]], ptr [[TMP11]], align 4475// CHECK3-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 1476// CHECK3-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[_TMP2]], align 4477// CHECK3-NEXT:    store ptr [[TMP13]], ptr [[TMP12]], align 4478// CHECK3-NEXT:    [[TMP14:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 2479// CHECK3-NEXT:    store ptr [[SVAR]], ptr [[TMP14]], align 4480// CHECK3-NEXT:    [[TMP15:%.*]] = getelementptr inbounds nuw [[CLASS_ANON_0]], ptr [[REF_TMP]], i32 0, i32 3481// CHECK3-NEXT:    store ptr [[SFVAR]], ptr [[TMP15]], align 4482// CHECK3-NEXT:    call void @"_ZZZ4mainENK3$_0clEvENKUlvE_clEv"(ptr noundef nonnull align 4 dereferenceable(16) [[REF_TMP]])483// CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]484// CHECK3:       omp.body.continue:485// CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]486// CHECK3:       omp.inner.for.inc:487// CHECK3-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4488// CHECK3-NEXT:    [[ADD4:%.*]] = add nsw i32 [[TMP16]], 1489// CHECK3-NEXT:    store i32 [[ADD4]], ptr [[DOTOMP_IV]], align 4490// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]491// CHECK3:       omp.inner.for.end:492// CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]493// CHECK3:       omp.loop.exit:494// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP3]])495// CHECK3-NEXT:    ret void496//497//498// CHECK9-LABEL: define {{[^@]+}}@main499// CHECK9-SAME: () #[[ATTR0:[0-9]+]] {500// CHECK9-NEXT:  entry:501// CHECK9-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4502// CHECK9-NEXT:    [[G:%.*]] = alloca double, align 8503// CHECK9-NEXT:    [[G1:%.*]] = alloca ptr, align 8504// CHECK9-NEXT:    [[TEST:%.*]] = alloca [[STRUCT_S:%.*]], align 4505// CHECK9-NEXT:    [[T_VAR:%.*]] = alloca i32, align 4506// CHECK9-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 4507// CHECK9-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S], align 4508// CHECK9-NEXT:    [[VAR:%.*]] = alloca ptr, align 8509// CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4510// CHECK9-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8511// CHECK9-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8512// CHECK9-NEXT:    store i32 0, ptr [[RETVAL]], align 4513// CHECK9-NEXT:    store ptr [[G]], ptr [[G1]], align 8514// CHECK9-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])515// CHECK9-NEXT:    store i32 0, ptr [[T_VAR]], align 4516// CHECK9-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const.main.vec, i64 8, i1 false)517// CHECK9-NEXT:    call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], float noundef 1.000000e+00)518// CHECK9-NEXT:    [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i64 1519// CHECK9-NEXT:    call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], float noundef 2.000000e+00)520// CHECK9-NEXT:    store ptr [[TEST]], ptr [[VAR]], align 8521// CHECK9-NEXT:    store ptr undef, ptr [[_TMP1]], align 8522// CHECK9-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0523// CHECK9-NEXT:    store i32 3, ptr [[TMP0]], align 4524// CHECK9-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1525// CHECK9-NEXT:    store i32 0, ptr [[TMP1]], align 4526// CHECK9-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2527// CHECK9-NEXT:    store ptr null, ptr [[TMP2]], align 8528// CHECK9-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3529// CHECK9-NEXT:    store ptr null, ptr [[TMP3]], align 8530// CHECK9-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4531// CHECK9-NEXT:    store ptr null, ptr [[TMP4]], align 8532// CHECK9-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5533// CHECK9-NEXT:    store ptr null, ptr [[TMP5]], align 8534// CHECK9-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6535// CHECK9-NEXT:    store ptr null, ptr [[TMP6]], align 8536// CHECK9-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7537// CHECK9-NEXT:    store ptr null, ptr [[TMP7]], align 8538// CHECK9-NEXT:    [[TMP8:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8539// CHECK9-NEXT:    store i64 2, ptr [[TMP8]], align 8540// CHECK9-NEXT:    [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9541// CHECK9-NEXT:    store i64 0, ptr [[TMP9]], align 8542// CHECK9-NEXT:    [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10543// CHECK9-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP10]], align 4544// CHECK9-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11545// CHECK9-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP11]], align 4546// CHECK9-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12547// CHECK9-NEXT:    store i32 0, ptr [[TMP12]], align 4548// CHECK9-NEXT:    [[TMP13:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB3:[0-9]+]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.region_id, ptr [[KERNEL_ARGS]])549// CHECK9-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0550// CHECK9-NEXT:    br i1 [[TMP14]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]551// CHECK9:       omp_offload.failed:552// CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95() #[[ATTR4:[0-9]+]]553// CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT]]554// CHECK9:       omp_offload.cont:555// CHECK9-NEXT:    [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiET_v()556// CHECK9-NEXT:    store i32 [[CALL]], ptr [[RETVAL]], align 4557// CHECK9-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 0558// CHECK9-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 2559// CHECK9-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]560// CHECK9:       arraydestroy.body:561// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP15]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]562// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1563// CHECK9-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]564// CHECK9-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]565// CHECK9-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]566// CHECK9:       arraydestroy.done2:567// CHECK9-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]568// CHECK9-NEXT:    [[TMP16:%.*]] = load i32, ptr [[RETVAL]], align 4569// CHECK9-NEXT:    ret i32 [[TMP16]]570//571//572// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ev573// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {574// CHECK9-NEXT:  entry:575// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8576// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8577// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8578// CHECK9-NEXT:    call void @_ZN1SIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])579// CHECK9-NEXT:    ret void580//581//582// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ef583// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {584// CHECK9-NEXT:  entry:585// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8586// CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4587// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8588// CHECK9-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4589// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8590// CHECK9-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4591// CHECK9-NEXT:    call void @_ZN1SIfEC2Ef(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], float noundef [[TMP0]])592// CHECK9-NEXT:    ret void593//594//595// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95596// CHECK9-SAME: () #[[ATTR3:[0-9]+]] {597// CHECK9-NEXT:  entry:598// CHECK9-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3]], i32 0, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.omp_outlined)599// CHECK9-NEXT:    ret void600//601//602// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.omp_outlined603// CHECK9-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR3]] {604// CHECK9-NEXT:  entry:605// CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8606// CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8607// CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4608// CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4609// CHECK9-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8610// CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4611// CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4612// CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4613// CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4614// CHECK9-NEXT:    [[T_VAR:%.*]] = alloca i32, align 4615// CHECK9-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 4616// CHECK9-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S], align 4617// CHECK9-NEXT:    [[VAR:%.*]] = alloca [[STRUCT_S:%.*]], align 4618// CHECK9-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 8619// CHECK9-NEXT:    [[SVAR:%.*]] = alloca i32, align 4620// CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4621// CHECK9-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8622// CHECK9-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8623// CHECK9-NEXT:    store ptr undef, ptr [[_TMP1]], align 8624// CHECK9-NEXT:    store i32 0, ptr [[DOTOMP_COMB_LB]], align 4625// CHECK9-NEXT:    store i32 1, ptr [[DOTOMP_COMB_UB]], align 4626// CHECK9-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4627// CHECK9-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4628// CHECK9-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 0629// CHECK9-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 2630// CHECK9-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]631// CHECK9:       arrayctor.loop:632// CHECK9-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]633// CHECK9-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])634// CHECK9-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i64 1635// CHECK9-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]636// CHECK9-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]637// CHECK9:       arrayctor.cont:638// CHECK9-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]])639// CHECK9-NEXT:    store ptr [[VAR]], ptr [[_TMP2]], align 8640// CHECK9-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8641// CHECK9-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4642// CHECK9-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP1]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)643// CHECK9-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4644// CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 1645// CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]646// CHECK9:       cond.true:647// CHECK9-NEXT:    br label [[COND_END:%.*]]648// CHECK9:       cond.false:649// CHECK9-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4650// CHECK9-NEXT:    br label [[COND_END]]651// CHECK9:       cond.end:652// CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]653// CHECK9-NEXT:    store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4654// CHECK9-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4655// CHECK9-NEXT:    store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4656// CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]657// CHECK9:       omp.inner.for.cond:658// CHECK9-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4659// CHECK9-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4660// CHECK9-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]661// CHECK9-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]662// CHECK9:       omp.inner.for.cond.cleanup:663// CHECK9-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]664// CHECK9:       omp.inner.for.body:665// CHECK9-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4666// CHECK9-NEXT:    [[TMP8:%.*]] = zext i32 [[TMP7]] to i64667// CHECK9-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4668// CHECK9-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP9]] to i64669// CHECK9-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.omp_outlined.omp_outlined, i64 [[TMP8]], i64 [[TMP10]])670// CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]671// CHECK9:       omp.inner.for.inc:672// CHECK9-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4673// CHECK9-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4674// CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]675// CHECK9-NEXT:    store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4676// CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]677// CHECK9:       omp.inner.for.end:678// CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]679// CHECK9:       omp.loop.exit:680// CHECK9-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8681// CHECK9-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4682// CHECK9-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP14]])683// CHECK9-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]]) #[[ATTR4]]684// CHECK9-NEXT:    [[ARRAY_BEGIN4:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 0685// CHECK9-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN4]], i64 2686// CHECK9-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]687// CHECK9:       arraydestroy.body:688// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP15]], [[OMP_LOOP_EXIT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]689// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1690// CHECK9-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]691// CHECK9-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN4]]692// CHECK9-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE5:%.*]], label [[ARRAYDESTROY_BODY]]693// CHECK9:       arraydestroy.done5:694// CHECK9-NEXT:    ret void695//696//697// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.omp_outlined.omp_outlined698// CHECK9-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR3]] {699// CHECK9-NEXT:  entry:700// CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8701// CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8702// CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8703// CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8704// CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4705// CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4706// CHECK9-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8707// CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4708// CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4709// CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4710// CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4711// CHECK9-NEXT:    [[T_VAR:%.*]] = alloca i32, align 4712// CHECK9-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 4713// CHECK9-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S], align 4714// CHECK9-NEXT:    [[VAR:%.*]] = alloca [[STRUCT_S:%.*]], align 4715// CHECK9-NEXT:    [[_TMP3:%.*]] = alloca ptr, align 8716// CHECK9-NEXT:    [[SVAR:%.*]] = alloca i32, align 4717// CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4718// CHECK9-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8719// CHECK9-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8720// CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 8721// CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 8722// CHECK9-NEXT:    store ptr undef, ptr [[_TMP1]], align 8723// CHECK9-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4724// CHECK9-NEXT:    store i32 1, ptr [[DOTOMP_UB]], align 4725// CHECK9-NEXT:    [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 8726// CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP0]] to i32727// CHECK9-NEXT:    [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8728// CHECK9-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP1]] to i32729// CHECK9-NEXT:    store i32 [[CONV]], ptr [[DOTOMP_LB]], align 4730// CHECK9-NEXT:    store i32 [[CONV2]], ptr [[DOTOMP_UB]], align 4731// CHECK9-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4732// CHECK9-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4733// CHECK9-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 0734// CHECK9-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i64 2735// CHECK9-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]736// CHECK9:       arrayctor.loop:737// CHECK9-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]738// CHECK9-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])739// CHECK9-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i64 1740// CHECK9-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]741// CHECK9-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]742// CHECK9:       arrayctor.cont:743// CHECK9-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]])744// CHECK9-NEXT:    store ptr [[VAR]], ptr [[_TMP3]], align 8745// CHECK9-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8746// CHECK9-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4747// CHECK9-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)748// CHECK9-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4749// CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 1750// CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]751// CHECK9:       cond.true:752// CHECK9-NEXT:    br label [[COND_END:%.*]]753// CHECK9:       cond.false:754// CHECK9-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4755// CHECK9-NEXT:    br label [[COND_END]]756// CHECK9:       cond.end:757// CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]758// CHECK9-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4759// CHECK9-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4760// CHECK9-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 4761// CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]762// CHECK9:       omp.inner.for.cond:763// CHECK9-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4764// CHECK9-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4765// CHECK9-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]766// CHECK9-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]767// CHECK9:       omp.inner.for.cond.cleanup:768// CHECK9-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]769// CHECK9:       omp.inner.for.body:770// CHECK9-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4771// CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP9]], 1772// CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]773// CHECK9-NEXT:    store i32 [[ADD]], ptr [[I]], align 4774// CHECK9-NEXT:    [[TMP10:%.*]] = load i32, ptr [[T_VAR]], align 4775// CHECK9-NEXT:    [[TMP11:%.*]] = load i32, ptr [[I]], align 4776// CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i64777// CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i64 0, i64 [[IDXPROM]]778// CHECK9-NEXT:    store i32 [[TMP10]], ptr [[ARRAYIDX]], align 4779// CHECK9-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 8780// CHECK9-NEXT:    [[TMP13:%.*]] = load i32, ptr [[I]], align 4781// CHECK9-NEXT:    [[IDXPROM5:%.*]] = sext i32 [[TMP13]] to i64782// CHECK9-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i64 0, i64 [[IDXPROM5]]783// CHECK9-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX6]], ptr align 4 [[TMP12]], i64 4, i1 false)784// CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]785// CHECK9:       omp.body.continue:786// CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]787// CHECK9:       omp.inner.for.inc:788// CHECK9-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4789// CHECK9-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP14]], 1790// CHECK9-NEXT:    store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 4791// CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]792// CHECK9:       omp.inner.for.end:793// CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]794// CHECK9:       omp.loop.exit:795// CHECK9-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8796// CHECK9-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 4797// CHECK9-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP16]])798// CHECK9-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]]) #[[ATTR4]]799// CHECK9-NEXT:    [[ARRAY_BEGIN8:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 0800// CHECK9-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN8]], i64 2801// CHECK9-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]802// CHECK9:       arraydestroy.body:803// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP17]], [[OMP_LOOP_EXIT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]804// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1805// CHECK9-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]806// CHECK9-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN8]]807// CHECK9-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE9:%.*]], label [[ARRAYDESTROY_BODY]]808// CHECK9:       arraydestroy.done9:809// CHECK9-NEXT:    ret void810//811//812// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfED1Ev813// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {814// CHECK9-NEXT:  entry:815// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8816// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8817// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8818// CHECK9-NEXT:    call void @_ZN1SIfED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]819// CHECK9-NEXT:    ret void820//821//822// CHECK9-LABEL: define {{[^@]+}}@_Z5tmainIiET_v823// CHECK9-SAME: () #[[ATTR1]] comdat {824// CHECK9-NEXT:  entry:825// CHECK9-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4826// CHECK9-NEXT:    [[TEST:%.*]] = alloca [[STRUCT_S_0:%.*]], align 4827// CHECK9-NEXT:    [[T_VAR:%.*]] = alloca i32, align 4828// CHECK9-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 4829// CHECK9-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 4830// CHECK9-NEXT:    [[VAR:%.*]] = alloca ptr, align 8831// CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4832// CHECK9-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8833// CHECK9-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8834// CHECK9-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])835// CHECK9-NEXT:    store i32 0, ptr [[T_VAR]], align 4836// CHECK9-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VEC]], ptr align 4 @__const._Z5tmainIiET_v.vec, i64 8, i1 false)837// CHECK9-NEXT:    call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], i32 noundef signext 1)838// CHECK9-NEXT:    [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i64 1839// CHECK9-NEXT:    call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], i32 noundef signext 2)840// CHECK9-NEXT:    store ptr [[TEST]], ptr [[VAR]], align 8841// CHECK9-NEXT:    store ptr undef, ptr [[_TMP1]], align 8842// CHECK9-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0843// CHECK9-NEXT:    store i32 3, ptr [[TMP0]], align 4844// CHECK9-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1845// CHECK9-NEXT:    store i32 0, ptr [[TMP1]], align 4846// CHECK9-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2847// CHECK9-NEXT:    store ptr null, ptr [[TMP2]], align 8848// CHECK9-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3849// CHECK9-NEXT:    store ptr null, ptr [[TMP3]], align 8850// CHECK9-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4851// CHECK9-NEXT:    store ptr null, ptr [[TMP4]], align 8852// CHECK9-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5853// CHECK9-NEXT:    store ptr null, ptr [[TMP5]], align 8854// CHECK9-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6855// CHECK9-NEXT:    store ptr null, ptr [[TMP6]], align 8856// CHECK9-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7857// CHECK9-NEXT:    store ptr null, ptr [[TMP7]], align 8858// CHECK9-NEXT:    [[TMP8:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8859// CHECK9-NEXT:    store i64 2, ptr [[TMP8]], align 8860// CHECK9-NEXT:    [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9861// CHECK9-NEXT:    store i64 0, ptr [[TMP9]], align 8862// CHECK9-NEXT:    [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10863// CHECK9-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP10]], align 4864// CHECK9-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11865// CHECK9-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP11]], align 4866// CHECK9-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12867// CHECK9-NEXT:    store i32 0, ptr [[TMP12]], align 4868// CHECK9-NEXT:    [[TMP13:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB3]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.region_id, ptr [[KERNEL_ARGS]])869// CHECK9-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0870// CHECK9-NEXT:    br i1 [[TMP14]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]871// CHECK9:       omp_offload.failed:872// CHECK9-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49() #[[ATTR4]]873// CHECK9-NEXT:    br label [[OMP_OFFLOAD_CONT]]874// CHECK9:       omp_offload.cont:875// CHECK9-NEXT:    store i32 0, ptr [[RETVAL]], align 4876// CHECK9-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 0877// CHECK9-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 2878// CHECK9-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]879// CHECK9:       arraydestroy.body:880// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP15]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]881// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -1882// CHECK9-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]883// CHECK9-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]884// CHECK9-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]885// CHECK9:       arraydestroy.done2:886// CHECK9-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]887// CHECK9-NEXT:    [[TMP16:%.*]] = load i32, ptr [[RETVAL]], align 4888// CHECK9-NEXT:    ret i32 [[TMP16]]889//890//891// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev892// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {893// CHECK9-NEXT:  entry:894// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8895// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8896// 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:    store float 0.000000e+00, ptr [[F]], align 4899// CHECK9-NEXT:    ret void900//901//902// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef903// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {904// CHECK9-NEXT:  entry:905// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8906// CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4907// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8908// CHECK9-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4909// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8910// CHECK9-NEXT:    [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 0911// CHECK9-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4912// CHECK9-NEXT:    store float [[TMP0]], ptr [[F]], align 4913// CHECK9-NEXT:    ret void914//915//916// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev917// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {918// CHECK9-NEXT:  entry:919// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8920// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8921// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8922// CHECK9-NEXT:    ret void923//924//925// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ev926// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {927// CHECK9-NEXT:  entry:928// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8929// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8930// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8931// CHECK9-NEXT:    call void @_ZN1SIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])932// CHECK9-NEXT:    ret void933//934//935// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ei936// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef signext [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {937// CHECK9-NEXT:  entry:938// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8939// CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4940// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8941// CHECK9-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4942// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8943// CHECK9-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4944// CHECK9-NEXT:    call void @_ZN1SIiEC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef signext [[TMP0]])945// CHECK9-NEXT:    ret void946//947//948// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49949// CHECK9-SAME: () #[[ATTR3]] {950// CHECK9-NEXT:  entry:951// CHECK9-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3]], i32 0, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined)952// CHECK9-NEXT:    ret void953//954//955// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined956// CHECK9-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR3]] {957// CHECK9-NEXT:  entry:958// CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8959// CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8960// CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4961// CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 4962// CHECK9-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8963// CHECK9-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4964// CHECK9-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4965// CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4966// CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4967// CHECK9-NEXT:    [[T_VAR:%.*]] = alloca i32, align 4968// CHECK9-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 4969// CHECK9-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 4970// CHECK9-NEXT:    [[VAR:%.*]] = alloca [[STRUCT_S_0:%.*]], align 4971// CHECK9-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 8972// CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 4973// CHECK9-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8974// CHECK9-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8975// CHECK9-NEXT:    store ptr undef, ptr [[_TMP1]], align 8976// CHECK9-NEXT:    store i32 0, ptr [[DOTOMP_COMB_LB]], align 4977// CHECK9-NEXT:    store i32 1, ptr [[DOTOMP_COMB_UB]], align 4978// CHECK9-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4979// CHECK9-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4980// CHECK9-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 0981// CHECK9-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 2982// CHECK9-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]983// CHECK9:       arrayctor.loop:984// CHECK9-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]985// CHECK9-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])986// CHECK9-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i64 1987// CHECK9-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]988// CHECK9-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]989// CHECK9:       arrayctor.cont:990// CHECK9-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]])991// CHECK9-NEXT:    store ptr [[VAR]], ptr [[_TMP2]], align 8992// CHECK9-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8993// CHECK9-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4994// CHECK9-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)995// CHECK9-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4996// CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 1997// CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]998// CHECK9:       cond.true:999// CHECK9-NEXT:    br label [[COND_END:%.*]]1000// CHECK9:       cond.false:1001// CHECK9-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41002// CHECK9-NEXT:    br label [[COND_END]]1003// CHECK9:       cond.end:1004// CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]1005// CHECK9-NEXT:    store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41006// CHECK9-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41007// CHECK9-NEXT:    store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 41008// CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1009// CHECK9:       omp.inner.for.cond:1010// CHECK9-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41011// CHECK9-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41012// CHECK9-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]1013// CHECK9-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1014// CHECK9:       omp.inner.for.cond.cleanup:1015// CHECK9-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]1016// CHECK9:       omp.inner.for.body:1017// CHECK9-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41018// CHECK9-NEXT:    [[TMP8:%.*]] = zext i32 [[TMP7]] to i641019// CHECK9-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41020// CHECK9-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP9]] to i641021// CHECK9-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined.omp_outlined, i64 [[TMP8]], i64 [[TMP10]])1022// CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1023// CHECK9:       omp.inner.for.inc:1024// CHECK9-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41025// CHECK9-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 41026// CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]1027// CHECK9-NEXT:    store i32 [[ADD]], ptr [[DOTOMP_IV]], align 41028// CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]1029// CHECK9:       omp.inner.for.end:1030// CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1031// CHECK9:       omp.loop.exit:1032// CHECK9-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81033// CHECK9-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 41034// CHECK9-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP14]])1035// CHECK9-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]]) #[[ATTR4]]1036// CHECK9-NEXT:    [[ARRAY_BEGIN4:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01037// CHECK9-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN4]], i64 21038// CHECK9-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]1039// CHECK9:       arraydestroy.body:1040// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP15]], [[OMP_LOOP_EXIT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1041// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11042// CHECK9-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1043// CHECK9-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN4]]1044// CHECK9-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE5:%.*]], label [[ARRAYDESTROY_BODY]]1045// CHECK9:       arraydestroy.done5:1046// CHECK9-NEXT:    ret void1047//1048//1049// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined.omp_outlined1050// CHECK9-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR3]] {1051// CHECK9-NEXT:  entry:1052// CHECK9-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81053// CHECK9-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81054// CHECK9-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 81055// CHECK9-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 81056// CHECK9-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41057// CHECK9-NEXT:    [[TMP:%.*]] = alloca i32, align 41058// CHECK9-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 81059// CHECK9-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41060// CHECK9-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41061// CHECK9-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41062// CHECK9-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41063// CHECK9-NEXT:    [[T_VAR:%.*]] = alloca i32, align 41064// CHECK9-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 41065// CHECK9-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 41066// CHECK9-NEXT:    [[VAR:%.*]] = alloca [[STRUCT_S_0:%.*]], align 41067// CHECK9-NEXT:    [[_TMP3:%.*]] = alloca ptr, align 81068// CHECK9-NEXT:    [[I:%.*]] = alloca i32, align 41069// CHECK9-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81070// CHECK9-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81071// CHECK9-NEXT:    store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 81072// CHECK9-NEXT:    store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 81073// CHECK9-NEXT:    store ptr undef, ptr [[_TMP1]], align 81074// CHECK9-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41075// CHECK9-NEXT:    store i32 1, ptr [[DOTOMP_UB]], align 41076// CHECK9-NEXT:    [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 81077// CHECK9-NEXT:    [[CONV:%.*]] = trunc i64 [[TMP0]] to i321078// CHECK9-NEXT:    [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 81079// CHECK9-NEXT:    [[CONV2:%.*]] = trunc i64 [[TMP1]] to i321080// CHECK9-NEXT:    store i32 [[CONV]], ptr [[DOTOMP_LB]], align 41081// CHECK9-NEXT:    store i32 [[CONV2]], ptr [[DOTOMP_UB]], align 41082// CHECK9-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41083// CHECK9-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41084// CHECK9-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01085// CHECK9-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i64 21086// CHECK9-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]1087// CHECK9:       arrayctor.loop:1088// CHECK9-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1089// CHECK9-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1090// CHECK9-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i64 11091// CHECK9-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1092// CHECK9-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1093// CHECK9:       arrayctor.cont:1094// CHECK9-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]])1095// CHECK9-NEXT:    store ptr [[VAR]], ptr [[_TMP3]], align 81096// CHECK9-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81097// CHECK9-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 41098// CHECK9-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1099// CHECK9-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41100// CHECK9-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 11101// CHECK9-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1102// CHECK9:       cond.true:1103// CHECK9-NEXT:    br label [[COND_END:%.*]]1104// CHECK9:       cond.false:1105// CHECK9-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41106// CHECK9-NEXT:    br label [[COND_END]]1107// CHECK9:       cond.end:1108// CHECK9-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]1109// CHECK9-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41110// CHECK9-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41111// CHECK9-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 41112// CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1113// CHECK9:       omp.inner.for.cond:1114// CHECK9-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41115// CHECK9-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41116// CHECK9-NEXT:    [[CMP4:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]1117// CHECK9-NEXT:    br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1118// CHECK9:       omp.inner.for.cond.cleanup:1119// CHECK9-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]1120// CHECK9:       omp.inner.for.body:1121// CHECK9-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41122// CHECK9-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP9]], 11123// CHECK9-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]1124// CHECK9-NEXT:    store i32 [[ADD]], ptr [[I]], align 41125// CHECK9-NEXT:    [[TMP10:%.*]] = load i32, ptr [[T_VAR]], align 41126// CHECK9-NEXT:    [[TMP11:%.*]] = load i32, ptr [[I]], align 41127// CHECK9-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i641128// CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i64 0, i64 [[IDXPROM]]1129// CHECK9-NEXT:    store i32 [[TMP10]], ptr [[ARRAYIDX]], align 41130// CHECK9-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[_TMP3]], align 81131// CHECK9-NEXT:    [[TMP13:%.*]] = load i32, ptr [[I]], align 41132// CHECK9-NEXT:    [[IDXPROM5:%.*]] = sext i32 [[TMP13]] to i641133// CHECK9-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i64 0, i64 [[IDXPROM5]]1134// CHECK9-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX6]], ptr align 4 [[TMP12]], i64 4, i1 false)1135// CHECK9-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1136// CHECK9:       omp.body.continue:1137// CHECK9-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1138// CHECK9:       omp.inner.for.inc:1139// CHECK9-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41140// CHECK9-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP14]], 11141// CHECK9-NEXT:    store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 41142// CHECK9-NEXT:    br label [[OMP_INNER_FOR_COND]]1143// CHECK9:       omp.inner.for.end:1144// CHECK9-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1145// CHECK9:       omp.loop.exit:1146// CHECK9-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81147// CHECK9-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 41148// CHECK9-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP16]])1149// CHECK9-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]]) #[[ATTR4]]1150// CHECK9-NEXT:    [[ARRAY_BEGIN8:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01151// CHECK9-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN8]], i64 21152// CHECK9-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]1153// CHECK9:       arraydestroy.body:1154// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP17]], [[OMP_LOOP_EXIT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1155// CHECK9-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i64 -11156// CHECK9-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1157// CHECK9-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN8]]1158// CHECK9-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE9:%.*]], label [[ARRAYDESTROY_BODY]]1159// CHECK9:       arraydestroy.done9:1160// CHECK9-NEXT:    ret void1161//1162//1163// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiED1Ev1164// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1165// CHECK9-NEXT:  entry:1166// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 81167// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 81168// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81169// CHECK9-NEXT:    call void @_ZN1SIiED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]1170// CHECK9-NEXT:    ret void1171//1172//1173// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ev1174// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1175// CHECK9-NEXT:  entry:1176// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 81177// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 81178// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81179// CHECK9-NEXT:    [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01180// CHECK9-NEXT:    store i32 0, ptr [[F]], align 41181// CHECK9-NEXT:    ret void1182//1183//1184// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ei1185// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef signext [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat {1186// CHECK9-NEXT:  entry:1187// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 81188// CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 41189// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 81190// CHECK9-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 41191// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81192// CHECK9-NEXT:    [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01193// CHECK9-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 41194// CHECK9-NEXT:    store i32 [[TMP0]], ptr [[F]], align 41195// CHECK9-NEXT:    ret void1196//1197//1198// CHECK9-LABEL: define {{[^@]+}}@_ZN1SIiED2Ev1199// CHECK9-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {1200// CHECK9-NEXT:  entry:1201// CHECK9-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 81202// CHECK9-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 81203// CHECK9-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81204// CHECK9-NEXT:    ret void1205//1206//1207// CHECK11-LABEL: define {{[^@]+}}@main1208// CHECK11-SAME: () #[[ATTR0:[0-9]+]] {1209// CHECK11-NEXT:  entry:1210// CHECK11-NEXT:    [[RETVAL:%.*]] = alloca i32, align 41211// CHECK11-NEXT:    [[G:%.*]] = alloca double, align 81212// CHECK11-NEXT:    [[G1:%.*]] = alloca ptr, align 41213// CHECK11-NEXT:    [[TEST:%.*]] = alloca [[STRUCT_S:%.*]], align 41214// CHECK11-NEXT:    [[T_VAR:%.*]] = alloca i32, align 41215// CHECK11-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 41216// CHECK11-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S], align 41217// CHECK11-NEXT:    [[VAR:%.*]] = alloca ptr, align 41218// CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 41219// CHECK11-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 41220// CHECK11-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 81221// CHECK11-NEXT:    store i32 0, ptr [[RETVAL]], align 41222// CHECK11-NEXT:    store ptr [[G]], ptr [[G1]], align 41223// CHECK11-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])1224// CHECK11-NEXT:    store i32 0, ptr [[T_VAR]], align 41225// CHECK11-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[VEC]], ptr align 4 @__const.main.vec, i32 8, i1 false)1226// CHECK11-NEXT:    call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], float noundef 1.000000e+00)1227// CHECK11-NEXT:    [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S_ARR]], i32 11228// CHECK11-NEXT:    call void @_ZN1SIfEC1Ef(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], float noundef 2.000000e+00)1229// CHECK11-NEXT:    store ptr [[TEST]], ptr [[VAR]], align 41230// CHECK11-NEXT:    store ptr undef, ptr [[_TMP1]], align 41231// CHECK11-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 01232// CHECK11-NEXT:    store i32 3, ptr [[TMP0]], align 41233// CHECK11-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11234// CHECK11-NEXT:    store i32 0, ptr [[TMP1]], align 41235// CHECK11-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 21236// CHECK11-NEXT:    store ptr null, ptr [[TMP2]], align 41237// CHECK11-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 31238// CHECK11-NEXT:    store ptr null, ptr [[TMP3]], align 41239// CHECK11-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 41240// CHECK11-NEXT:    store ptr null, ptr [[TMP4]], align 41241// CHECK11-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 51242// CHECK11-NEXT:    store ptr null, ptr [[TMP5]], align 41243// CHECK11-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 61244// CHECK11-NEXT:    store ptr null, ptr [[TMP6]], align 41245// CHECK11-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 71246// CHECK11-NEXT:    store ptr null, ptr [[TMP7]], align 41247// CHECK11-NEXT:    [[TMP8:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 81248// CHECK11-NEXT:    store i64 2, ptr [[TMP8]], align 81249// CHECK11-NEXT:    [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 91250// CHECK11-NEXT:    store i64 0, ptr [[TMP9]], align 81251// CHECK11-NEXT:    [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 101252// CHECK11-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP10]], align 41253// CHECK11-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 111254// CHECK11-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP11]], align 41255// CHECK11-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 121256// CHECK11-NEXT:    store i32 0, ptr [[TMP12]], align 41257// CHECK11-NEXT:    [[TMP13:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB3:[0-9]+]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.region_id, ptr [[KERNEL_ARGS]])1258// CHECK11-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 01259// CHECK11-NEXT:    br i1 [[TMP14]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]1260// CHECK11:       omp_offload.failed:1261// CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95() #[[ATTR4:[0-9]+]]1262// CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT]]1263// CHECK11:       omp_offload.cont:1264// CHECK11-NEXT:    [[CALL:%.*]] = call noundef i32 @_Z5tmainIiET_v()1265// CHECK11-NEXT:    store i32 [[CALL]], ptr [[RETVAL]], align 41266// CHECK11-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 01267// CHECK11-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i32 21268// CHECK11-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]1269// CHECK11:       arraydestroy.body:1270// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP15]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1271// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11272// CHECK11-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1273// CHECK11-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]1274// CHECK11-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]1275// CHECK11:       arraydestroy.done2:1276// CHECK11-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]1277// CHECK11-NEXT:    [[TMP16:%.*]] = load i32, ptr [[RETVAL]], align 41278// CHECK11-NEXT:    ret i32 [[TMP16]]1279//1280//1281// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ev1282// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {1283// CHECK11-NEXT:  entry:1284// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41285// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41286// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41287// CHECK11-NEXT:    call void @_ZN1SIfEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])1288// CHECK11-NEXT:    ret void1289//1290//1291// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC1Ef1292// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1293// CHECK11-NEXT:  entry:1294// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41295// CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca float, align 41296// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41297// CHECK11-NEXT:    store float [[A]], ptr [[A_ADDR]], align 41298// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41299// CHECK11-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 41300// CHECK11-NEXT:    call void @_ZN1SIfEC2Ef(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], float noundef [[TMP0]])1301// CHECK11-NEXT:    ret void1302//1303//1304// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l951305// CHECK11-SAME: () #[[ATTR3:[0-9]+]] {1306// CHECK11-NEXT:  entry:1307// CHECK11-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3]], i32 0, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.omp_outlined)1308// CHECK11-NEXT:    ret void1309//1310//1311// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.omp_outlined1312// CHECK11-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR3]] {1313// CHECK11-NEXT:  entry:1314// CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41315// CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41316// CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41317// CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 41318// CHECK11-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 41319// CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 41320// CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 41321// CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41322// CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41323// CHECK11-NEXT:    [[T_VAR:%.*]] = alloca i32, align 41324// CHECK11-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 41325// CHECK11-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S], align 41326// CHECK11-NEXT:    [[VAR:%.*]] = alloca [[STRUCT_S:%.*]], align 41327// CHECK11-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 41328// CHECK11-NEXT:    [[SVAR:%.*]] = alloca i32, align 41329// CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 41330// CHECK11-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41331// CHECK11-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41332// CHECK11-NEXT:    store ptr undef, ptr [[_TMP1]], align 41333// CHECK11-NEXT:    store i32 0, ptr [[DOTOMP_COMB_LB]], align 41334// CHECK11-NEXT:    store i32 1, ptr [[DOTOMP_COMB_UB]], align 41335// CHECK11-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41336// CHECK11-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41337// CHECK11-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 01338// CHECK11-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i32 21339// CHECK11-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]1340// CHECK11:       arrayctor.loop:1341// CHECK11-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1342// CHECK11-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1343// CHECK11-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i32 11344// CHECK11-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1345// CHECK11-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1346// CHECK11:       arrayctor.cont:1347// CHECK11-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]])1348// CHECK11-NEXT:    store ptr [[VAR]], ptr [[_TMP2]], align 41349// CHECK11-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41350// CHECK11-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 41351// CHECK11-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP1]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1352// CHECK11-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41353// CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 11354// CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1355// CHECK11:       cond.true:1356// CHECK11-NEXT:    br label [[COND_END:%.*]]1357// CHECK11:       cond.false:1358// CHECK11-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41359// CHECK11-NEXT:    br label [[COND_END]]1360// CHECK11:       cond.end:1361// CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]1362// CHECK11-NEXT:    store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41363// CHECK11-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41364// CHECK11-NEXT:    store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 41365// CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1366// CHECK11:       omp.inner.for.cond:1367// CHECK11-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41368// CHECK11-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41369// CHECK11-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]1370// CHECK11-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1371// CHECK11:       omp.inner.for.cond.cleanup:1372// CHECK11-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]1373// CHECK11:       omp.inner.for.body:1374// CHECK11-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41375// CHECK11-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41376// CHECK11-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.omp_outlined.omp_outlined, i32 [[TMP7]], i32 [[TMP8]])1377// CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1378// CHECK11:       omp.inner.for.inc:1379// CHECK11-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41380// CHECK11-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 41381// CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]1382// CHECK11-NEXT:    store i32 [[ADD]], ptr [[DOTOMP_IV]], align 41383// CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]1384// CHECK11:       omp.inner.for.end:1385// CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1386// CHECK11:       omp.loop.exit:1387// CHECK11-NEXT:    [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41388// CHECK11-NEXT:    [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 41389// CHECK11-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP12]])1390// CHECK11-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]]) #[[ATTR4]]1391// CHECK11-NEXT:    [[ARRAY_BEGIN4:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 01392// CHECK11-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN4]], i32 21393// CHECK11-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]1394// CHECK11:       arraydestroy.body:1395// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP13]], [[OMP_LOOP_EXIT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1396// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11397// CHECK11-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1398// CHECK11-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN4]]1399// CHECK11-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE5:%.*]], label [[ARRAYDESTROY_BODY]]1400// CHECK11:       arraydestroy.done5:1401// CHECK11-NEXT:    ret void1402//1403//1404// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l95.omp_outlined.omp_outlined1405// CHECK11-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR3]] {1406// CHECK11-NEXT:  entry:1407// CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41408// CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41409// CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 41410// CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 41411// CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41412// CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 41413// CHECK11-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 41414// CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41415// CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41416// CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41417// CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41418// CHECK11-NEXT:    [[T_VAR:%.*]] = alloca i32, align 41419// CHECK11-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 41420// CHECK11-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S], align 41421// CHECK11-NEXT:    [[VAR:%.*]] = alloca [[STRUCT_S:%.*]], align 41422// CHECK11-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 41423// CHECK11-NEXT:    [[SVAR:%.*]] = alloca i32, align 41424// CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 41425// CHECK11-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41426// CHECK11-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41427// CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 41428// CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 41429// CHECK11-NEXT:    store ptr undef, ptr [[_TMP1]], align 41430// CHECK11-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41431// CHECK11-NEXT:    store i32 1, ptr [[DOTOMP_UB]], align 41432// CHECK11-NEXT:    [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 41433// CHECK11-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 41434// CHECK11-NEXT:    store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 41435// CHECK11-NEXT:    store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 41436// CHECK11-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41437// CHECK11-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41438// CHECK11-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 01439// CHECK11-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN]], i32 21440// CHECK11-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]1441// CHECK11:       arrayctor.loop:1442// CHECK11-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1443// CHECK11-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1444// CHECK11-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYCTOR_CUR]], i32 11445// CHECK11-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1446// CHECK11-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1447// CHECK11:       arrayctor.cont:1448// CHECK11-NEXT:    call void @_ZN1SIfEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]])1449// CHECK11-NEXT:    store ptr [[VAR]], ptr [[_TMP2]], align 41450// CHECK11-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41451// CHECK11-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 41452// CHECK11-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1453// CHECK11-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41454// CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 11455// CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1456// CHECK11:       cond.true:1457// CHECK11-NEXT:    br label [[COND_END:%.*]]1458// CHECK11:       cond.false:1459// CHECK11-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41460// CHECK11-NEXT:    br label [[COND_END]]1461// CHECK11:       cond.end:1462// CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]1463// CHECK11-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41464// CHECK11-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41465// CHECK11-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 41466// CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1467// CHECK11:       omp.inner.for.cond:1468// CHECK11-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41469// CHECK11-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41470// CHECK11-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]1471// CHECK11-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1472// CHECK11:       omp.inner.for.cond.cleanup:1473// CHECK11-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]1474// CHECK11:       omp.inner.for.body:1475// CHECK11-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41476// CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP9]], 11477// CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]1478// CHECK11-NEXT:    store i32 [[ADD]], ptr [[I]], align 41479// CHECK11-NEXT:    [[TMP10:%.*]] = load i32, ptr [[T_VAR]], align 41480// CHECK11-NEXT:    [[TMP11:%.*]] = load i32, ptr [[I]], align 41481// CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i32 0, i32 [[TMP11]]1482// CHECK11-NEXT:    store i32 [[TMP10]], ptr [[ARRAYIDX]], align 41483// CHECK11-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[_TMP2]], align 41484// CHECK11-NEXT:    [[TMP13:%.*]] = load i32, ptr [[I]], align 41485// CHECK11-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 [[TMP13]]1486// CHECK11-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[ARRAYIDX4]], ptr align 4 [[TMP12]], i32 4, i1 false)1487// CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1488// CHECK11:       omp.body.continue:1489// CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1490// CHECK11:       omp.inner.for.inc:1491// CHECK11-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41492// CHECK11-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP14]], 11493// CHECK11-NEXT:    store i32 [[ADD5]], ptr [[DOTOMP_IV]], align 41494// CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]1495// CHECK11:       omp.inner.for.end:1496// CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1497// CHECK11:       omp.loop.exit:1498// CHECK11-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41499// CHECK11-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 41500// CHECK11-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP16]])1501// CHECK11-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]]) #[[ATTR4]]1502// CHECK11-NEXT:    [[ARRAY_BEGIN6:%.*]] = getelementptr inbounds [2 x %struct.S], ptr [[S_ARR]], i32 0, i32 01503// CHECK11-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAY_BEGIN6]], i32 21504// CHECK11-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]1505// CHECK11:       arraydestroy.body:1506// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP17]], [[OMP_LOOP_EXIT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1507// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11508// CHECK11-NEXT:    call void @_ZN1SIfED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1509// CHECK11-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN6]]1510// CHECK11-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE7:%.*]], label [[ARRAYDESTROY_BODY]]1511// CHECK11:       arraydestroy.done7:1512// CHECK11-NEXT:    ret void1513//1514//1515// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfED1Ev1516// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1517// CHECK11-NEXT:  entry:1518// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41519// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41520// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41521// CHECK11-NEXT:    call void @_ZN1SIfED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]1522// CHECK11-NEXT:    ret void1523//1524//1525// CHECK11-LABEL: define {{[^@]+}}@_Z5tmainIiET_v1526// CHECK11-SAME: () #[[ATTR1]] comdat {1527// CHECK11-NEXT:  entry:1528// CHECK11-NEXT:    [[RETVAL:%.*]] = alloca i32, align 41529// CHECK11-NEXT:    [[TEST:%.*]] = alloca [[STRUCT_S_0:%.*]], align 41530// CHECK11-NEXT:    [[T_VAR:%.*]] = alloca i32, align 41531// CHECK11-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 41532// CHECK11-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 41533// CHECK11-NEXT:    [[VAR:%.*]] = alloca ptr, align 41534// CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 41535// CHECK11-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 41536// CHECK11-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 81537// CHECK11-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]])1538// CHECK11-NEXT:    store i32 0, ptr [[T_VAR]], align 41539// CHECK11-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[VEC]], ptr align 4 @__const._Z5tmainIiET_v.vec, i32 8, i1 false)1540// CHECK11-NEXT:    call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[S_ARR]], i32 noundef 1)1541// CHECK11-NEXT:    [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[S_ARR]], i32 11542// CHECK11-NEXT:    call void @_ZN1SIiEC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYINIT_ELEMENT]], i32 noundef 2)1543// CHECK11-NEXT:    store ptr [[TEST]], ptr [[VAR]], align 41544// CHECK11-NEXT:    store ptr undef, ptr [[_TMP1]], align 41545// CHECK11-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 01546// CHECK11-NEXT:    store i32 3, ptr [[TMP0]], align 41547// CHECK11-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11548// CHECK11-NEXT:    store i32 0, ptr [[TMP1]], align 41549// CHECK11-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 21550// CHECK11-NEXT:    store ptr null, ptr [[TMP2]], align 41551// CHECK11-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 31552// CHECK11-NEXT:    store ptr null, ptr [[TMP3]], align 41553// CHECK11-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 41554// CHECK11-NEXT:    store ptr null, ptr [[TMP4]], align 41555// CHECK11-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 51556// CHECK11-NEXT:    store ptr null, ptr [[TMP5]], align 41557// CHECK11-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 61558// CHECK11-NEXT:    store ptr null, ptr [[TMP6]], align 41559// CHECK11-NEXT:    [[TMP7:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 71560// CHECK11-NEXT:    store ptr null, ptr [[TMP7]], align 41561// CHECK11-NEXT:    [[TMP8:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 81562// CHECK11-NEXT:    store i64 2, ptr [[TMP8]], align 81563// CHECK11-NEXT:    [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 91564// CHECK11-NEXT:    store i64 0, ptr [[TMP9]], align 81565// CHECK11-NEXT:    [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 101566// CHECK11-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP10]], align 41567// CHECK11-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 111568// CHECK11-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP11]], align 41569// CHECK11-NEXT:    [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 121570// CHECK11-NEXT:    store i32 0, ptr [[TMP12]], align 41571// CHECK11-NEXT:    [[TMP13:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB3]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.region_id, ptr [[KERNEL_ARGS]])1572// CHECK11-NEXT:    [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 01573// CHECK11-NEXT:    br i1 [[TMP14]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]1574// CHECK11:       omp_offload.failed:1575// CHECK11-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49() #[[ATTR4]]1576// CHECK11-NEXT:    br label [[OMP_OFFLOAD_CONT]]1577// CHECK11:       omp_offload.cont:1578// CHECK11-NEXT:    store i32 0, ptr [[RETVAL]], align 41579// CHECK11-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01580// CHECK11-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i32 21581// CHECK11-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]1582// CHECK11:       arraydestroy.body:1583// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP15]], [[OMP_OFFLOAD_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1584// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11585// CHECK11-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1586// CHECK11-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]]1587// CHECK11-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE2:%.*]], label [[ARRAYDESTROY_BODY]]1588// CHECK11:       arraydestroy.done2:1589// CHECK11-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[TEST]]) #[[ATTR4]]1590// CHECK11-NEXT:    [[TMP16:%.*]] = load i32, ptr [[RETVAL]], align 41591// CHECK11-NEXT:    ret i32 [[TMP16]]1592//1593//1594// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ev1595// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1596// CHECK11-NEXT:  entry:1597// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41598// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41599// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41600// CHECK11-NEXT:    [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 01601// CHECK11-NEXT:    store float 0.000000e+00, ptr [[F]], align 41602// CHECK11-NEXT:    ret void1603//1604//1605// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfEC2Ef1606// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], float noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1607// CHECK11-NEXT:  entry:1608// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41609// CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca float, align 41610// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41611// CHECK11-NEXT:    store float [[A]], ptr [[A_ADDR]], align 41612// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41613// CHECK11-NEXT:    [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 01614// CHECK11-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 41615// CHECK11-NEXT:    store float [[TMP0]], ptr [[F]], align 41616// CHECK11-NEXT:    ret void1617//1618//1619// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIfED2Ev1620// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1621// CHECK11-NEXT:  entry:1622// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41623// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41624// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41625// CHECK11-NEXT:    ret void1626//1627//1628// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ev1629// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1630// CHECK11-NEXT:  entry:1631// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41632// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41633// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41634// CHECK11-NEXT:    call void @_ZN1SIiEC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]])1635// CHECK11-NEXT:    ret void1636//1637//1638// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC1Ei1639// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1640// CHECK11-NEXT:  entry:1641// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41642// CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 41643// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41644// CHECK11-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 41645// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41646// CHECK11-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 41647// CHECK11-NEXT:    call void @_ZN1SIiEC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]])1648// CHECK11-NEXT:    ret void1649//1650//1651// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l491652// CHECK11-SAME: () #[[ATTR3]] {1653// CHECK11-NEXT:  entry:1654// CHECK11-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3]], i32 0, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined)1655// CHECK11-NEXT:    ret void1656//1657//1658// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined1659// CHECK11-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR3]] {1660// CHECK11-NEXT:  entry:1661// CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41662// CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41663// CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41664// CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 41665// CHECK11-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 41666// CHECK11-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 41667// CHECK11-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 41668// CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41669// CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41670// CHECK11-NEXT:    [[T_VAR:%.*]] = alloca i32, align 41671// CHECK11-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 41672// CHECK11-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 41673// CHECK11-NEXT:    [[VAR:%.*]] = alloca [[STRUCT_S_0:%.*]], align 41674// CHECK11-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 41675// CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 41676// CHECK11-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41677// CHECK11-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41678// CHECK11-NEXT:    store ptr undef, ptr [[_TMP1]], align 41679// CHECK11-NEXT:    store i32 0, ptr [[DOTOMP_COMB_LB]], align 41680// CHECK11-NEXT:    store i32 1, ptr [[DOTOMP_COMB_UB]], align 41681// CHECK11-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41682// CHECK11-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41683// CHECK11-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01684// CHECK11-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i32 21685// CHECK11-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]1686// CHECK11:       arrayctor.loop:1687// CHECK11-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1688// CHECK11-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1689// CHECK11-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i32 11690// CHECK11-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1691// CHECK11-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1692// CHECK11:       arrayctor.cont:1693// CHECK11-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]])1694// CHECK11-NEXT:    store ptr [[VAR]], ptr [[_TMP2]], align 41695// CHECK11-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41696// CHECK11-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 41697// CHECK11-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1698// CHECK11-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41699// CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 11700// CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1701// CHECK11:       cond.true:1702// CHECK11-NEXT:    br label [[COND_END:%.*]]1703// CHECK11:       cond.false:1704// CHECK11-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41705// CHECK11-NEXT:    br label [[COND_END]]1706// CHECK11:       cond.end:1707// CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]1708// CHECK11-NEXT:    store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41709// CHECK11-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41710// CHECK11-NEXT:    store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 41711// CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1712// CHECK11:       omp.inner.for.cond:1713// CHECK11-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41714// CHECK11-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41715// CHECK11-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]1716// CHECK11-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1717// CHECK11:       omp.inner.for.cond.cleanup:1718// CHECK11-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]1719// CHECK11:       omp.inner.for.body:1720// CHECK11-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41721// CHECK11-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41722// CHECK11-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined.omp_outlined, i32 [[TMP7]], i32 [[TMP8]])1723// CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1724// CHECK11:       omp.inner.for.inc:1725// CHECK11-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41726// CHECK11-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 41727// CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]1728// CHECK11-NEXT:    store i32 [[ADD]], ptr [[DOTOMP_IV]], align 41729// CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]1730// CHECK11:       omp.inner.for.end:1731// CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1732// CHECK11:       omp.loop.exit:1733// CHECK11-NEXT:    [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41734// CHECK11-NEXT:    [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 41735// CHECK11-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP12]])1736// CHECK11-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]]) #[[ATTR4]]1737// CHECK11-NEXT:    [[ARRAY_BEGIN4:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01738// CHECK11-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN4]], i32 21739// CHECK11-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]1740// CHECK11:       arraydestroy.body:1741// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP13]], [[OMP_LOOP_EXIT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1742// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11743// CHECK11-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1744// CHECK11-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN4]]1745// CHECK11-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE5:%.*]], label [[ARRAYDESTROY_BODY]]1746// CHECK11:       arraydestroy.done5:1747// CHECK11-NEXT:    ret void1748//1749//1750// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiET_v_l49.omp_outlined.omp_outlined1751// CHECK11-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR3]] {1752// CHECK11-NEXT:  entry:1753// CHECK11-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41754// CHECK11-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41755// CHECK11-NEXT:    [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 41756// CHECK11-NEXT:    [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 41757// CHECK11-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41758// CHECK11-NEXT:    [[TMP:%.*]] = alloca i32, align 41759// CHECK11-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 41760// CHECK11-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41761// CHECK11-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41762// CHECK11-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41763// CHECK11-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41764// CHECK11-NEXT:    [[T_VAR:%.*]] = alloca i32, align 41765// CHECK11-NEXT:    [[VEC:%.*]] = alloca [2 x i32], align 41766// CHECK11-NEXT:    [[S_ARR:%.*]] = alloca [2 x %struct.S.0], align 41767// CHECK11-NEXT:    [[VAR:%.*]] = alloca [[STRUCT_S_0:%.*]], align 41768// CHECK11-NEXT:    [[_TMP2:%.*]] = alloca ptr, align 41769// CHECK11-NEXT:    [[I:%.*]] = alloca i32, align 41770// CHECK11-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41771// CHECK11-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41772// CHECK11-NEXT:    store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 41773// CHECK11-NEXT:    store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 41774// CHECK11-NEXT:    store ptr undef, ptr [[_TMP1]], align 41775// CHECK11-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41776// CHECK11-NEXT:    store i32 1, ptr [[DOTOMP_UB]], align 41777// CHECK11-NEXT:    [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 41778// CHECK11-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 41779// CHECK11-NEXT:    store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 41780// CHECK11-NEXT:    store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 41781// CHECK11-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41782// CHECK11-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41783// CHECK11-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01784// CHECK11-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN]], i32 21785// CHECK11-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]1786// CHECK11:       arrayctor.loop:1787// CHECK11-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]1788// CHECK11-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]])1789// CHECK11-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYCTOR_CUR]], i32 11790// CHECK11-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]1791// CHECK11-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]1792// CHECK11:       arrayctor.cont:1793// CHECK11-NEXT:    call void @_ZN1SIiEC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]])1794// CHECK11-NEXT:    store ptr [[VAR]], ptr [[_TMP2]], align 41795// CHECK11-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41796// CHECK11-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 41797// CHECK11-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB2]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1798// CHECK11-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41799// CHECK11-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 11800// CHECK11-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1801// CHECK11:       cond.true:1802// CHECK11-NEXT:    br label [[COND_END:%.*]]1803// CHECK11:       cond.false:1804// CHECK11-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41805// CHECK11-NEXT:    br label [[COND_END]]1806// CHECK11:       cond.end:1807// CHECK11-NEXT:    [[COND:%.*]] = phi i32 [ 1, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]1808// CHECK11-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41809// CHECK11-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41810// CHECK11-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 41811// CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1812// CHECK11:       omp.inner.for.cond:1813// CHECK11-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41814// CHECK11-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41815// CHECK11-NEXT:    [[CMP3:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]1816// CHECK11-NEXT:    br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]1817// CHECK11:       omp.inner.for.cond.cleanup:1818// CHECK11-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]1819// CHECK11:       omp.inner.for.body:1820// CHECK11-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41821// CHECK11-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP9]], 11822// CHECK11-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]1823// CHECK11-NEXT:    store i32 [[ADD]], ptr [[I]], align 41824// CHECK11-NEXT:    [[TMP10:%.*]] = load i32, ptr [[T_VAR]], align 41825// CHECK11-NEXT:    [[TMP11:%.*]] = load i32, ptr [[I]], align 41826// CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[VEC]], i32 0, i32 [[TMP11]]1827// CHECK11-NEXT:    store i32 [[TMP10]], ptr [[ARRAYIDX]], align 41828// CHECK11-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[_TMP2]], align 41829// CHECK11-NEXT:    [[TMP13:%.*]] = load i32, ptr [[I]], align 41830// CHECK11-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 [[TMP13]]1831// CHECK11-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[ARRAYIDX4]], ptr align 4 [[TMP12]], i32 4, i1 false)1832// CHECK11-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1833// CHECK11:       omp.body.continue:1834// CHECK11-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1835// CHECK11:       omp.inner.for.inc:1836// CHECK11-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41837// CHECK11-NEXT:    [[ADD5:%.*]] = add nsw i32 [[TMP14]], 11838// CHECK11-NEXT:    store i32 [[ADD5]], ptr [[DOTOMP_IV]], align 41839// CHECK11-NEXT:    br label [[OMP_INNER_FOR_COND]]1840// CHECK11:       omp.inner.for.end:1841// CHECK11-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1842// CHECK11:       omp.loop.exit:1843// CHECK11-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41844// CHECK11-NEXT:    [[TMP16:%.*]] = load i32, ptr [[TMP15]], align 41845// CHECK11-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[TMP16]])1846// CHECK11-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[VAR]]) #[[ATTR4]]1847// CHECK11-NEXT:    [[ARRAY_BEGIN6:%.*]] = getelementptr inbounds [2 x %struct.S.0], ptr [[S_ARR]], i32 0, i32 01848// CHECK11-NEXT:    [[TMP17:%.*]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAY_BEGIN6]], i32 21849// CHECK11-NEXT:    br label [[ARRAYDESTROY_BODY:%.*]]1850// CHECK11:       arraydestroy.body:1851// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi ptr [ [[TMP17]], [[OMP_LOOP_EXIT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ]1852// CHECK11-NEXT:    [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S_0]], ptr [[ARRAYDESTROY_ELEMENTPAST]], i32 -11853// CHECK11-NEXT:    call void @_ZN1SIiED1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR4]]1854// CHECK11-NEXT:    [[ARRAYDESTROY_DONE:%.*]] = icmp eq ptr [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN6]]1855// CHECK11-NEXT:    br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE7:%.*]], label [[ARRAYDESTROY_BODY]]1856// CHECK11:       arraydestroy.done7:1857// CHECK11-NEXT:    ret void1858//1859//1860// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiED1Ev1861// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1862// CHECK11-NEXT:  entry:1863// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41864// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41865// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41866// CHECK11-NEXT:    call void @_ZN1SIiED2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR4]]1867// CHECK11-NEXT:    ret void1868//1869//1870// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ev1871// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1872// CHECK11-NEXT:  entry:1873// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41874// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41875// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41876// CHECK11-NEXT:    [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01877// CHECK11-NEXT:    store i32 0, ptr [[F]], align 41878// CHECK11-NEXT:    ret void1879//1880//1881// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiEC2Ei1882// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[A:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1883// CHECK11-NEXT:  entry:1884// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41885// CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 41886// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41887// CHECK11-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 41888// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41889// CHECK11-NEXT:    [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_S_0:%.*]], ptr [[THIS1]], i32 0, i32 01890// CHECK11-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 41891// CHECK11-NEXT:    store i32 [[TMP0]], ptr [[F]], align 41892// CHECK11-NEXT:    ret void1893//1894//1895// CHECK11-LABEL: define {{[^@]+}}@_ZN1SIiED2Ev1896// CHECK11-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {1897// CHECK11-NEXT:  entry:1898// CHECK11-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 41899// CHECK11-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 41900// CHECK11-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 41901// CHECK11-NEXT:    ret void1902//1903